Hack_ing

Wordpress 5.1 RCE(Remote Code Execution)

Ate1es 2021. 7. 8. 19:41

Wordpress는 PHP기반의 오픈소스 CMS이다. 세계적으로 웹 제작 시 많이 사용하고 있는 오픈소스입니다.

하지만 굉장히 많은 취약점들이 나오고 있는데, 5.1 버전에서 나왔던 RCE 취약점을 재현하고 분석하려 합니다.

 

진단 환경 구축

도구명 버전
XMAPP 5.6
wordpress 5.1-alpha-44280

로컬에서 쉽게 재현하기 위해 XMAPP을 사용했고, 취약점 재현을 위해 wordpress 5.1 버전을 사용했습니다.

 

취약점 개요

우선 코드 실행이 가능한 이미지 파일을 업로드하여 강제로 include 시켜 서버상에서 코드를 실행하게 하는 취약점입니다. RCE를 위해서 Patg Traversal과 LFI 취약점을 이용했습니다.

 

 

step 1. 사전 준비로 PHP 코드가 삽입된 이미지 파일을 준비해야 하는데, 

https://github.com/dlegs/php-jpeg-injector에 php코드를 삽입해주는 파이썬 스크립트가 있습니다.

이걸 이용해서 악성 이미지 파일을 만들겠습니다.

php-jpeg-injector 실행 명령

 

위와 같이 매직넘버에 php코드가 삽입된 악성 이미지인 infected_mal.jpg를 만들었습니다.

 

step 2. 사전에 생성해둔 글쓰기 기능만 존재하는 attacker 계정으로 접속

 

미리 생성해둔 일반 글쓰기 권한 계정으로 로그인

로그인 후 , 이미지를 업로드하는 곳에 업로드를 하는데 이미지 편집 기능이 있습니다. 이 이미지 편집 기능을 Burp Suite로 Intercept 해보면

wordpress 의 이미지 편집 기능의 파라미터들

위와 같이 다양한 meta data가 전송되고 있음을 확인할 수 있습니다. 이곳의 파라미터에 우리가 원하는 메타데이터의 값을 조작할 수 있습니다.

_wp_attached_file 메타데이터 조작

마지막 구문에 &meta_input[_wp_attached_file]=2021/07/infected_mal.jpg#/../../../../themes/twentynineteen/infected.php

를 추가해서 이미지 업로드 경로를 조작합니다.

phpmyadmin으로 확인한 조작된 값

step 3. 워드프레스의 crop-image 기능을 이용해서 악성 이미지 파일을 조작된 경로로 복사

 

아까와 같이 Burp Suite로 파라미터를 조작한다.

 

아까와 마찬가지로 이미지 편집 기능의 action 변수 crop-image로 바꿔 이미지 복사 코드가 동작되도록 하고, 나머지 필요한 파라미터들을 채워서 패킷을 보냈습니다.

 

조작된 경로로 복사된 이미지 파일

 

서버의 디렉터리를 직접 확인해보면 복사된 악성 이미지 파일을 확인할 수 있습니다.

 

step 4. 일반 이미지 파일을 하나 생성하면서 _wp_page_template 메타 데이터를 조작해 해당 이미지 링크를 클릭할 때 악성 이미지가 동작하게 만들기

 

 

새로운 이미지 파일을 업로드한 후 이전 단계와 같이 편집 기능에서 Burp Suite를 사용해 메타 데이터를 조작하겠습니다.

 

이번엔

&meta_input[_wp_page_template]=cropped-infected.jpg

를 삽입해 페이지가 template 될 때 전에 조작된 경로로 복사된 악성 이미지 파일이 include 되도록 했습니다.

 

조작된 메타 데이터가 DB에 저장됨

 

step 5. 위의 고양이 위에 고유 주소로 되어있는 링크를 클릭하면 악성 이미지 파일이 로드되면서 코드가 실행됩니다.

 

BUT 문제점 발생 -- 서버에서 crop-image를 실행할 때 복사된 이미지에 무슨 일이 일어나는지, 삽입된 코드가 사라집니다.. 그래서 여러 번 반복해서 안 사라지는 이미지를 찾아야 할 것 같습니다... 또르르....

 

간단한 취약점 분석 (feat. Source Code)

 

1. /wp-admin/include/post.php 파일의 edit_post 함수와 그 안에 있는 update_post_meta 함수를 통해 meta data를 바꿀 수 있었습니다.

 

2. 이미지 크롭 [ 이미지 복사 ] 

/wp-admin/include/image.php 에서 _load_image_to_edit_path() 라는 함수는 먼저 복사할 이미지를 찾습니다.

이 함수의 특징이 공격에 이용되는데, 로컬에서 먼저 복사할 이미지를 찾은 뒤 없다면 URL로 찾는다는 것입니다.

이 함수의 원리를 이용하여, 아까 조작한 경로의 #을 사용한다.

예를 들어 이 함수가 동작하면 로컬에 있는 파일을 먼저 찾지만 C:\wordpress\~~~~~\test.jpg#test#에 의해서 

파일을 찾지 못하고 URL로 넘어간다.

 

http://url/wp-admin/contents/upload/test.jpg#test 에서는 #test가 무시되기 때문에 파일이 존재하는 것으로 판단한다.

 

이렇게 존재하는 것으로 판단되면 그다음은 crop-image 함수를 실행합니다. 근데 이 함수에서 경로에 대한 필터링이 없습니다.

 

따라서 # 이후에 ../ 특수문자가 들어가서 상위 디렉터리로 이동해서 파일을 복사하게 됩니다. 

 

이렇게 되면 공격자가 원하는 위치에 악성 파일을 복사하여 실행 가능한 환경을 만들 수 있기 때문에 취약하다고 할 수 있습니다.

 

대응방안 - 코드 수정

 

현재 워드 프레스 깃허브에서 확인해본 결과 post data에 대해서 _wp_get_allowed_postdata() 라는 필터링 함수가 추가되었습니다.

 

 

 

참고문헌 - 보안프로젝트 : Wordpress 5.1-alpha-44280 Remote Code Execution