OpenSMTPD haavatavus, mis võimaldab koodi kaugkäivitamist juurõigustega

OpenBSD projekti arendatud meiliserveris Ava SMTPD tuvastatud kriitiline haavatavus (CVE-2020-7247), mis võimaldab serveris juurkasutaja õigustega kaugkäske täita. Haavatavus tuvastati Qualys Security poolt läbi viidud kordusauditi käigus (eelmine OpenSMTPD audit viidi läbi aastal 2015 ja uus haavatavus on olnud alates 2018. aasta maist). Probleem kõrvaldatud OpenSMTPD 6.6.2 versioonis. Kõigil kasutajatel on soovitatav värskendus kohe installida (OpenBSD puhul saab paiga installida syspatchi kaudu).

Pakutakse välja kaks ründevarianti. Esimene võimalus töötab OpenSMTPD vaikekonfiguratsioonis (võtab vastu ainult kohaliku hosti päringuid) ja võimaldab teil probleemi kohapeal ära kasutada, kui ründajal on juurdepääs serveri kohalikule võrguliidesele (loopback) (näiteks hostimissüsteemides). . Teine võimalus ilmneb siis, kui OpenSMTPD on konfigureeritud välisvõrgu päringuid vastu võtma (meiliserver, mis võtab vastu kolmanda osapoole kirju). Teadlased on koostanud ärakasutamise prototüübi, mis töötab edukalt nii OpenBSD 6.6-s sisalduva OpenSMTPD versiooniga kui ka teistele operatsioonisüsteemidele mõeldud kaasaskantava versiooniga (viiakse läbi Debiani testimises).

Probleemi põhjustab tõrge funktsioonis smtp_mailaddr(), mida kutsutakse kontrollima väljadel „MAIL FROM” ja „RCPT TO” olevate väärtuste õigsust, mis määravad saatja/saaja ja edastatakse ühenduse ajal. meiliserveriga. E-posti aadressi selle osa kontrollimiseks, mis on enne sümbolit "@", kutsutakse funktsioon smtp_mailaddr()
valid_localpart(), mis peab märgid "!#$%&'*/?^`{|}~+-=_" kehtivateks (MAILADDR_ALLOWED), nagu nõuab RFC 5322.

Sel juhul toimub stringi otsene paokood funktsioonis mda_expand_token(), mis asendab ainult märgid “!#$%&'*?`{|}~” (MAILADDR_ESCAPE). Edaspidi kasutatakse edastusagendi (MDA) kutsumisel käsuga 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' käsuga mda_expand_token() koostatud rida. . Kui tähed paigutatakse mboxi läbi /bin/sh, käivitatakse rida "/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}", kus väärtus "% {mbox.from}” sisaldab parameetri „MAIL FROM” paoandmeid.

Haavatavuse olemus seisneb selles, et rakenduses smtp_mailaddr() on loogikaviga, mille tõttu tühja domeeni saatmisel meilile tagastab funktsioon eduka kinnituskoodi, isegi kui aadressi osa enne @-d sisaldab kehtetuid märke . Veelgi enam, stringi ettevalmistamisel ei väldi funktsioon mda_expand_token() kõiki võimalikke kesta erimärke, vaid ainult e-posti aadressis lubatud erimärke. Seega piisab käsu käivitamiseks e-kirja kohalikus osas sümboli ";" kasutamisest. ja tühik, mis ei sisaldu MAILADDR_ESCAPE komplektis ja mida ei kasutata. Näiteks:

$nc 127.0.0.1 25

HELO professor.falken
MAIL SAATJA:<;uni 66;>
RCPT TO:
DATA
.
VÄLJU

Pärast seda seanssi käivitab OpenSMTPD, kui see saadetakse mboxi, käsu kesta kaudu

/usr/libexec/mail.local -f ;unerežiim 66; juur

Samas piirab ründevõimalusi asjaolu, et aadressi kohalik osa ei tohi ületada 64 tähemärki ning erimärgid '$' ja '|' põgenemisel asendatakse ":"-ga. Sellest piirangust mööda hiilimiseks kasutame seda, et kirja põhiosa edastatakse pärast /usr/libexec/mail.local käivitamist sisendvoo kaudu, s.t. Aadressiga manipuleerides saate käivitada ainult käsu sh käsutõlgi ja kasutada kirja sisu juhiste kogumina. Kuna teenuse SMTP päised on märgitud kirja alguses, on nende vahelejätmiseks soovitatav kasutada tsüklina lugemiskäsku. Töötav eksploit näeb välja umbes selline:

$nc 192.168.56.143 25

HELO professor.falken
MAIL FROM:<;i jaoks 0 1 2 3 4 5 6 7 8 9 abcd;loe r;tehtud;sh;exit 0;>
RCPT TO:[meiliga kaitstud]>
DATA
#0
#1
...
#d
i jaoks WOPR-is; teha
echo -n "($i) " && id || murda
tehtud > /root/x."`id -u`.""$$"
.
VÄLJU

Allikas: opennet.ru

Lisa kommentaar