U mail serveru koji je razvio OpenBSD projekat
Predlažu se dvije opcije napada. Prva opcija radi u zadanoj OpenSMTPD konfiguraciji (prihvatanje zahtjeva samo od lokalnog hosta) i omogućava vam da lokalno iskoristite problem, kada napadač može pristupiti sučelju lokalne mreže (loopback) na serveru (na primjer, na hosting sistemima) . Druga opcija se javlja kada je OpenSMTPD konfigurisan za primanje spoljnih mrežnih zahteva (poštanski server koji prihvata poštu treće strane). Istraživači su pripremili prototip eksploatacije koji uspješno radi i s verzijom OpenSMTPD uključenom u OpenBSD 6.6 i s prijenosnom verzijom za druge operativne sustave (provedeno u Debian testiranju).
Problem je uzrokovan greškom u funkciji smtp_mailaddr() koja je pozvana da provjeri ispravnost vrijednosti u poljima “MAIL FROM” i “RCPT TO” koja definiraju pošiljaoca/primatelja i prosljeđuju se tokom veze sa mail serverom. Da biste provjerili dio adrese e-pošte koji se nalazi prije simbola “@”, poziva se funkcija smtp_mailaddr()
valid_localpart(), koji prihvata (MAILADDR_ALLOWED) znakove "!#$%&'*/?^`{|}~+-=_", kako to zahtijeva RFC 5322.
U ovom slučaju, direktno izbjegavanje niza se izvodi u funkciji mda_expand_token(), koja zamjenjuje samo znakove “!#$%&’*?`{|}~” (MAILADDR_ESCAPE). Nakon toga, linija pripremljena u mda_expand_token() se koristi pri pozivanju agenta za isporuku (MDA) koristeći naredbu 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' .U slučaju postavljanja slova u mbox preko /bin/sh, pokreće se red “/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}” gdje je vrijednost “% {mbox.from}” uključuje izbačene podatke iz parametra "MAIL FROM".
Suština ranjivosti je u tome da smtp_mailaddr() ima logičku grešku, zbog koje, ako se na e-mail pošalje prazan domen, funkcija vraća uspješan verifikacioni kod, čak i ako dio adrese prije “@” sadrži nevažeće znakove . Nadalje, kada priprema string, funkcija mda_expand_token() ne izbjegava sve moguće specijalne znakove ljuske, već samo specijalne znakove dozvoljene u adresi e-pošte. Dakle, da biste pokrenuli svoju naredbu, dovoljno je koristiti simbol “;” u lokalnom dijelu e-pošte. i razmak, koji nisu uključeni u skup MAILADDR_ESCAPE i nisu uklonjeni. Na primjer:
$nc 127.0.0.1 25
HELO professor.falken
POŠTA OD:
RCPT TO:
PODACI
.
PRESTANI
Nakon ove sesije, OpenSMTPD, kada se isporuči u mbox, će pokrenuti naredbu kroz shell
/usr/libexec/mail.local -f ;sleep 66; root
Istovremeno, mogućnosti napada su ograničene činjenicom da lokalni dio adrese ne može biti duži od 64 znaka, a specijalni znakovi ‘$’ i ‘|’ se zamjenjuju sa “:” prilikom escape-a. Da bismo zaobišli ovo ograničenje, koristimo činjenicu da se tijelo pisma prenosi nakon pokretanja /usr/libexec/mail.local kroz ulazni tok, tj. Manipulisanjem adresom, možete samo pokrenuti interpreter komande sh i koristiti tijelo slova kao skup instrukcija. Budući da su zaglavlja SMTP servisa naznačena na početku slova, predlaže se korištenje naredbe za čitanje u petlji da biste ih preskočili. Radni exploit izgleda otprilike ovako:
$nc 192.168.56.143 25
HELO professor.falken
POŠTA OD:
RCPT DO:<[email zaštićen]>
PODACI
#0
#1
...
#d
za i u W O P R; uradi
echo -n "($i) " && id || break
gotovo > /root/x."`id -u`.""$$"
.
PRESTANI
izvor: opennet.ru