Ranljivost v OpenSMTPD, ki omogoča oddaljeno izvajanje kode kot root

V poštnem strežniku, ki ga je razvil projekt OpenBSD OpenSMTPD ugotovljeno kritična ranljivost (CVE-2020-7247), ki vam omogoča oddaljeno izvajanje lupinskih ukazov na strežniku s pravicami korenskega uporabnika. Ranljivost je bila odkrita med ponovno revizijo, ki jo je izvedel Qualys Security (prejšnja revizija OpenSMTPD je potekala leta 2015, nova ranljivost pa je prisotna od maja 2018). Težava odpraviti v izdaji OpenSMTPD 6.6.2. Vsem uporabnikom svetujemo, da nujno namestijo posodobitev (za OpenBSD je popravek mogoče namestiti prek syspatch-a).

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

Dodaj komentar