Dobësi në OpenSMTPD që lejon ekzekutimin e kodit në distancë si rrënjë

Në serverin e postës të zhvilluar nga projekti OpenBSD OpenSMTPD identifikuar cenueshmëria kritike (CVE-2020-7247), i cili ju lejon të ekzekutoni në distancë komandat e guaskës në server me të drejta të përdoruesit rrënjë. Dobësia u identifikua gjatë një rishikimi të kryer nga Qualys Security (auditimi i mëparshëm OpenSMTPD u mbajt në vitin 2015, dhe cenueshmëria e re ka qenë e pranishme që nga maji 2018). Problem eliminohet në versionin OpenSMTPD 6.6.2. Të gjithë përdoruesit rekomandohen të instalojnë menjëherë përditësimin (për OpenBSD, patch-i mund të instalohet përmes syspatch).

Dy opsione sulmi janë propozuar. Opsioni i parë funksionon në konfigurimin e paracaktuar OpenSMTPD (pranimi i kërkesave vetëm nga localhost) dhe ju lejon të shfrytëzoni problemin në nivel lokal, kur sulmuesi është në gjendje të hyjë në ndërfaqen e rrjetit lokal (loopback) në server (për shembull, në sistemet pritëse) . Opsioni i dytë ndodh kur OpenSMTPD është konfiguruar për të marrë kërkesa të jashtme të rrjetit (një server poste që pranon postë të palëve të treta). Studiuesit kanë përgatitur një prototip të një shfrytëzimi që funksionon me sukses si me versionin OpenSMTPD të përfshirë në OpenBSD 6.6 ashtu edhe me një version portativ për sisteme të tjera operative (i kryer në Debian Testing).

Problemi shkaktohet nga një gabim në funksionin smtp_mailaddr(), i cili thirret për të kontrolluar korrektësinë e vlerave në fushat "MAIL FROM" dhe "RCPT TO" që përcaktojnë dërguesin/marrësin dhe kalohen gjatë lidhjes. me serverin e postës. Për të kontrolluar pjesën e adresës së emailit që vjen përpara simbolit “@”, thirret funksioni smtp_mailaddr()
valid_localpart(), i cili pranon (MAILADDR_ALLOWED) karakteret "!#$%&'*/?^`{|}~+-=_", siç kërkohet nga RFC 5322.

Në këtë rast, ikja e drejtpërdrejtë e vargut kryhet në funksionin mda_expand_token(), i cili zëvendëson vetëm karakteret “!#$%&'*?`{|}~” (MAILADDR_ESCAPE). Më pas, linja e përgatitur në mda_expand_token() përdoret kur thirret agjenti i dorëzimit (MDA) duke përdorur komandën 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' Në rast të vendosjes së shkronjave në mbox nëpërmjet /bin/sh, hapet rreshti "/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}", ku vlera "% {mbox.from}” përfshin të dhëna të ikura nga parametri "MAIL FROM".

Thelbi i cenueshmërisë është se smtp_mailaddr() ka një gabim logjik, për shkak të të cilit, nëse një domen bosh dërgohet në email, funksioni kthen një kod verifikimi të suksesshëm, edhe nëse pjesa e adresës përpara "@" përmban karaktere të pavlefshme. . Më tej, gjatë përgatitjes së një vargu, funksioni mda_expand_token() nuk u shmanget të gjithë karaktereve të mundshëm të guaskës, por vetëm karaktereve speciale të lejuara në adresën e emailit. Kështu, për të ekzekutuar komandën tuaj, mjafton të përdorni simbolin ";" në pjesën lokale të emailit. dhe hapësirë, të cilat nuk janë të përfshira në grupin MAILADDR_ESCAPE dhe nuk janë shmangur. Për shembull:

$nc 127.0.0.1 25

HELO profesor.falken
POSTE NGA:<;gjumë 66;>
RCPT PER:
TË DHËNAT
.
NDËRPRITET

Pas këtij sesioni, OpenSMTPD, kur dorëzohet në mbox, do të nisë komandën përmes guaskës

/usr/libexec/mail.local -f ;sleep 66; rrënjë

Në të njëjtën kohë, mundësitë e sulmit janë të kufizuara nga fakti se pjesa lokale e adresës nuk mund të kalojë 64 karaktere, dhe karakteret speciale '$' dhe '|' zëvendësohen me ":" kur ikin. Për të anashkaluar këtë kufizim, ne përdorim faktin që trupi i letrës transmetohet pas ekzekutimit të /usr/libexec/mail.local përmes rrjedhës hyrëse, d.m.th. Duke manipuluar adresën, mund të lëshoni vetëm interpretuesin e komandës sh dhe të përdorni trupin e shkronjës si një grup udhëzimesh. Meqenëse titujt e shërbimit SMTP tregohen në fillim të shkronjës, sugjerohet të përdorni komandën e leximit në një lak për t'i kapërcyer ato. Një shfrytëzim pune duket diçka si kjo:

$nc 192.168.56.143 25

HELO profesor.falken
POSTE NGA:<;për i në 0 1 2 3 4 5 6 7 8 9 abcd; lexo r;krye;sh;dal 0;>
RCPT PER:[email mbrojtur]>
TË DHËNAT
#0
#1
...
#d
për i në WOPR; bëj
echo -n "($i) " && id || thyej
bërë > /root/x."`id -u`.""$$"
.
NDËRPRITET

Burimi: opennet.ru

Shto një koment