Ranjivost u OpenSMTPD-u koja dopušta daljinsko izvršavanje koda s root privilegijama

U poslužitelju e-pošte razvijenom u okviru projekta OpenBSD OpenSMTPD identificiran kritična ranjivost (CVE-2020-7247), koji vam omogućuje daljinsko izvršavanje naredbi ljuske na poslužitelju s root korisničkim pravima. Ranjivost je identificirana tijekom ponovne revizije koju je proveo Qualys Security (prethodna revizija OpenSMTPD je provedeno 2015., a nova ranjivost prisutna je od svibnja 2018.). Problem eliminiran u izdanju OpenSMTPD 6.6.2. Svim korisnicima se preporučuje da odmah instaliraju ažuriranje (za OpenBSD, zakrpa se može instalirati putem syspatch-a).

Predlažu se dvije opcije napada. Prva opcija radi u zadanoj OpenSMTPD konfiguraciji (prihvaća zahtjeve samo s lokalnog hosta) i omogućuje vam da lokalno iskoristite problem, kada napadač može pristupiti sučelju lokalne mreže (loopback) na poslužitelju (na primjer, na hosting sustavima) . Druga se opcija pojavljuje kada je OpenSMTPD konfiguriran za primanje vanjskih mrežnih zahtjeva (poslužitelj pošte koji prihvaća poštu treće strane). Istraživači su pripremili prototip eksploatacije koji uspješno radi i s OpenSMTPD verzijom uključenom u OpenBSD 6.6 i s prijenosnom verzijom za druge operativne sustave (provedeno u Debian Testiranju).

Problem je uzrokovan pogreškom u funkciji smtp_mailaddr(), koja se poziva da provjeri ispravnost vrijednosti u poljima "MAIL FROM" i "RCPT TO" koja definiraju pošiljatelja/primatelja i prosljeđuju se tijekom veze s poslužiteljem pošte. Za provjeru dijela adrese e-pošte koji dolazi prije simbola “@”, poziva se funkcija smtp_mailaddr().
valid_localpart(), koji prihvaća (MAILADDR_ALLOWED) znakove "!#$%&'*/?^`{|}~+-=_", kao što zahtijeva RFC 5322.

U ovom slučaju, izravno izbjegavanje niza izvodi se u funkciji mda_expand_token(), koja zamjenjuje samo znakove “!#$%&'*?`{|}~” (MAILADDR_ESCAPE). Nakon toga, linija pripremljena u mda_expand_token() koristi se prilikom pozivanja agenta za dostavu (MDA) pomoću naredbe 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' U slučaju postavljanja slova u mbox preko /bin/sh, pokreće se linija “/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}” gdje je vrijednost “% {mbox.from}” uključuje izbjegnute podatke iz parametra "MAIL FROM".

Suština ranjivosti je da smtp_mailaddr() ima logičku pogrešku, zbog koje, ako se prazna domena pošalje na e-poštu, funkcija vraća uspješan kod za provjeru, čak i ako dio adrese prije “@” sadrži nevažeće znakove . Nadalje, prilikom pripreme niza, funkcija mda_expand_token() ne izbjegava sve moguće posebne znakove ljuske, već samo posebne znakove dopuštene u adresi e-pošte. Dakle, za pokretanje vaše naredbe dovoljno je koristiti simbol “;” u lokalnom dijelu e-maila. i razmak, koji nisu uključeni u skup MAILADDR_ESCAPE i nisu izbjegnuti. Na primjer:

$nc 127.0.0.1 25

ZDRAVO profesore.falken
POŠTA OD:<;sleep 66;>
RCPT ZA:
PODACI
.
Quit

Nakon ove sesije, OpenSMTPD, kada se isporuči mboxu, pokrenut će naredbu kroz ljusku

/usr/libexec/mail.local -f ;spavanje 66; korijen

Istovremeno, mogućnosti napada ograničene su činjenicom da lokalni dio adrese ne smije premašiti 64 znaka, a posebni znakovi '$' i '|' zamjenjuju se s ":" prilikom izbjegavanja. Da bismo zaobišli ovo ograničenje, koristimo se činjenicom da se tijelo pisma prenosi nakon pokretanja /usr/libexec/mail.local kroz ulazni tok, tj. Manipuliranjem adrese možete pokrenuti samo tumač naredbe sh i koristiti tijelo slova kao skup uputa. Budući da su SMTP zaglavlja usluge navedena na početku pisma, preporučuje se korištenje naredbe read u petlji za njihovo preskakanje. Radni exploit izgleda otprilike ovako:

$nc 192.168.56.143 25

ZDRAVO profesore.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štićena]>
PODACI
#0
#1
...
#d
za i u WOPR; čini
echo -n "($i) " && id || pauza
gotovo > /root/x."`id -u`.""$$"
.
Quit

Izvor: opennet.ru

Dodajte komentar