V poštnem strežniku, ki ga je razvil projekt OpenBSD
Predlagani sta bili dve vrsti napada. Prva možnost deluje v privzeti konfiguraciji OpenSMTPD (prejemanje zahtev le od lokalnega gostitelja) in vam omogoča, da težavo izkoristite lokalno, ko lahko napadalec dostopa do lokalnega omrežnega vmesnika (povratna zanka) na strežniku (na primer v sistemih za gostovanje) . Druga možnost se prikaže, ko je OpenSMTPD konfiguriran za sprejemanje zunanjih omrežnih zahtev (poštni strežnik, ki sprejema pošto tretjih oseb). Raziskovalci so pripravili prototip izkoriščanja, ki uspešno deluje tako z različico OpenSMTPD iz OpenBSD 6.6 kot s prenosno različico za druge operacijske sisteme (izvedeno v Debian Testing).
Težavo povzroča napaka v funkciji smtp_mailaddr(), ki se kliče, da preveri pravilnost vrednosti v poljih "MAIL FROM" in "RCPT TO", ki določajo pošiljatelja / prejemnika in se prenašajo med povezavo. na poštni strežnik. Funkcija smtp_mailaddr() se kliče v smtp_mailaddr(), da preveri del e-poštnega naslova, ki je pred znakom "@".
valid_localpart(), ki upošteva znake "!#$%&'*/?^`{|}~+-=_" kot dovoljene (MAILADDR_ALLOWED), kot zahteva RFC 5322.
V tem primeru je niz neposredno ubežan v funkciji mda_expand_token(), ki nadomesti samo znake "!#$%&'*?`{|}~" (MAILADDR_ESCAPE). Poleg tega se niz, pripravljen v mda_expand_token(), uporablja pri klicu agenta za dostavo (MDA) z uporabo ukaza 'execle("/bin/sh", "/bin/sh", "-c", mda_command,…'. mail v mbox prek /bin/sh se zažene vrstica "/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}", kjer je vrednost "%{mbox.from}" vključuje ubežne podatke iz parametra "MAIL FROM".
Bistvo ranljivosti je v tem, da ima smtp_mailaddr() logično napako, zaradi katere v primeru posredovanja prazne domene e-pošti funkcija vrne uspešno verifikacijsko kodo, tudi če del naslova pred “@” vsebuje neveljavne znake. Poleg tega pri pripravi niza s funkcijo mda_expand_token() niso ubežni vsi možni posebni znaki lupine, ampak samo posebni znaki, dovoljeni v poštnem naslovu. Tako je za zagon vašega ukaza dovolj, da uporabite simbol ";" v lokalnem delu e-pošte. in presledek, ki nista v nizu MAILADDR_ESCAPE in nista ubežna. Na primer:
$nc 127.0.0.1 25
POZDRAVLJENI profesor.falken
POŠTA OD:<;sleep 66;>
RCPT ZA:
PODATKI
.
QUIT
Po tej seji bo OpenSMTPD, ko bo dostavljen v mbox, zagnal ukaz prek lupine
/usr/libexec/mail.local -f ;spanje 66; korenina
Hkrati so možnosti napada omejene z dejstvom, da lokalni del naslova ne sme presegati 64 znakov, ter posebnih znakov '$' in '|'. se pri uhajanju zamenjajo z ":". Da bi se izognili tej omejitvi, dejstvo, da se telo sporočila prenese po zagonu /usr/libexec/mail.local skozi vhodni tok, tj. z manipulacijo z naslovom lahko samo zaženete tolmač ukazov sh in uporabite telo črke kot nabor navodil. Ker so glave storitve SMTP podane na začetku pisma, je priporočljivo uporabiti klic ukaza za branje v zanki, da jih preskočite. Delovni exploit je videti nekako takole:
$nc 192.168.56.143 25
POZDRAVLJENI profesor.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 ZA:[e-pošta zaščitena]>
PODATKI
#0
#1
...
#d
za i v WOPR; narediti
echo -n "($i) " && id || odmor
končano > /root/x."`id -u`"."$$"
.
QUIT
Vir: opennet.ru