In die posbediener wat deur die OpenBSD-projek ontwikkel is
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