Kwesbaarheid in OpenSMTPD wat eksterne kode-uitvoering met wortelregte toelaat

In die posbediener wat deur die OpenBSD-projek ontwikkel is Maak SMTPD oop geïdentifiseer kritieke kwesbaarheid (CVE-2020-7247), wat jou toelaat om dopopdragte op afstand uit te voer op die bediener met wortelgebruikersregte. Die kwesbaarheid is geïdentifiseer tydens 'n heroudit wat deur Qualys Security uitgevoer is (vorige OpenSMTPD-oudit gehou in 2015, en die nuwe kwesbaarheid is sedert Mei 2018 teenwoordig). Probleem uitgeskakel in OpenSMTPD 6.6.2 vrystelling. Alle gebruikers word aanbeveel om onmiddellik die opdatering te installeer (vir OpenBSD kan die pleister via syspatch geïnstalleer word).

Twee aanvalopsies word voorgestel. Die eerste opsie werk in die verstek OpenSMTPD-konfigurasie (aanvaar slegs versoeke van localhost) en laat jou toe om die probleem plaaslik te ontgin, wanneer die aanvaller toegang tot die plaaslike netwerk-koppelvlak (loopback) op die bediener kan verkry (byvoorbeeld op gasheerstelsels) . Die tweede opsie vind plaas wanneer OpenSMTPD gekonfigureer is om eksterne netwerkversoeke te ontvang ('n posbediener wat derdeparty-pos aanvaar). Navorsers het 'n prototipe van 'n ontginning voorberei wat suksesvol werk met beide die OpenSMTPD-weergawe wat in OpenBSD 6.6 ingesluit is en met 'n draagbare weergawe vir ander bedryfstelsels (wat in Debian-toetsing uitgevoer word).

Die probleem word veroorsaak deur 'n fout in die smtp_mailaddr() funksie, wat geroep word om die korrektheid van die waardes in die "MAIL FROM" en "RCPT TO" velde te kontroleer wat die sender/ontvanger definieer en tydens die verbinding deurgegee word. met die posbediener. Om die deel van die e-posadres wat voor die “@”-simbool kom, na te gaan, word die smtp_mailaddr()-funksie genoem
valid_localpart(), wat die karakters "!#$%&'*/?^`{|}~+-=_" as geldig beskou (MAILADDR_ALLOWED), soos vereis deur RFC 5322.

In hierdie geval word direkte ontsnapping van die string uitgevoer in die mda_expand_token() funksie, wat slegs die karakters "!#$%&'*?`{|}~" (MAILADDR_ESCAPE) vervang. Vervolgens word die reël wat in mda_expand_token() voorberei is, gebruik wanneer die afleweringsagent (MDA) gebel word met die opdrag 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' In die geval van die plasing van letters na mbox via /bin/sh, word die reël "/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}" geloods, waar die waarde "% {mbox.from}” sluit ontsnapte data van die "MAIL FROM"-parameter in.

Die essensie van die kwesbaarheid is dat smtp_mailaddr() 'n logiese fout het, as gevolg waarvan, indien 'n leë domein na e-pos gestuur word, die funksie 'n suksesvolle verifikasiekode terugstuur, selfs al bevat die deel van die adres voor "@" ongeldige karakters . Verder, wanneer 'n string voorberei word, ontsnap die mda_expand_token() funksie nie alle moontlike dop spesiale karakters nie, maar slegs spesiale karakters wat in die e-posadres toegelaat word. Dus, om u opdrag uit te voer, is dit genoeg om die ";"-simbool in die plaaslike deel van die e-pos te gebruik. en spasie, wat nie by die MAILADDR_ESCAPE-stel ingesluit is nie en nie ontsnap word nie. Byvoorbeeld:

$nc 127.0.0.1 25

HELO professor.falken
MAIL VAN:
RCPT AAN:
DATA
.
HOU

Na hierdie sessie sal OpenSMTPD, wanneer dit by mbox afgelewer word, die opdrag deur die dop begin

/usr/libexec/mail.local -f ;slaap 66; wortel

Terselfdertyd word die aanvalsmoontlikhede beperk deur die feit dat die plaaslike deel van die adres nie 64 karakters kan oorskry nie, en die spesiale karakters '$' en '|' word met ":" vervang wanneer dit ontsnap. Om hierdie beperking te omseil, gebruik ons ​​die feit dat die liggaam van die brief versend word nadat /usr/libexec/mail.local deur die invoerstroom, d.w.s. Deur die adres te manipuleer, kan jy net die sh-opdragtolk begin en die liggaam van die brief as 'n stel instruksies gebruik. Aangesien diens SMTP-opskrifte aan die begin van die brief aangedui word, word dit voorgestel om die leesopdrag in 'n lus te gebruik om dit oor te slaan. 'n Werkende uitbuiting lyk so:

$nc 192.168.56.143 25

HELO professor.falken
MAIL VANAF:
RCPT AAN:<[e-pos beskerm]>
DATA
#0
#1
...
#d
want i in W O P R; doen
echo -n "($i) " && id || breek
klaar > /root/x."`id -u`.""$$"
.
HOU

Bron: opennet.ru

Voeg 'n opmerking