Vulnerabilitat a OpenSMTPD que permet l'execució remota de codi amb privilegis root

Al servidor de correu desenvolupat pel projecte OpenBSD OpenSMTPD identificat vulnerabilitat crítica (CVE-2020-7247), que us permet executar ordres de l'intèrpret d'ordres de manera remota al servidor amb drets d'usuari root. La vulnerabilitat es va identificar durant una reauditoria realitzada per Qualys Security (auditoria prèvia d'OpenSMTPD es va dur a terme el 2015, i la nova vulnerabilitat és present des del maig del 2018). Problema eliminat a la versió 6.6.2 d'OpenSMTPD. Es recomana a tots els usuaris que instal·lin immediatament l'actualització (per a OpenBSD, el pedaç es pot instal·lar mitjançant syspatch).

Es proposen dues opcions d'atac. La primera opció funciona amb la configuració predeterminada d'OpenSMTPD (acceptant sol·licituds només de localhost) i permet explotar el problema localment, quan l'atacant pot accedir a la interfície de xarxa local (loopback) al servidor (per exemple, en sistemes d'allotjament). . La segona opció es produeix quan OpenSMTPD està configurat per rebre sol·licituds de xarxa externa (un servidor de correu que accepta correu de tercers). Els investigadors han preparat un prototip d'explotació que funciona amb èxit tant amb la versió OpenSMTPD inclosa a OpenBSD 6.6 com amb una versió portàtil per a altres sistemes operatius (realitzada a Debian Testing).

El problema és causat per un error a la funció smtp_mailaddr(), que es crida per comprovar la correcció dels valors dels camps "MAIL FROM" i "RCPT TO" que defineixen el remitent/destinatari i que es transmeten durant la connexió. amb el servidor de correu. Per comprovar la part de l'adreça de correu electrònic que ve abans del símbol “@”, s'anomena la funció smtp_mailaddr()
valid_localpart(), que accepta (MAILADDR_ALLOWED) els caràcters "!#$%&'*/?^`{|}~+-=_", tal com requereix RFC 5322.

En aquest cas, l'escapament directe de la cadena es realitza a la funció mda_expand_token(), que substitueix només els caràcters “!#$%&'*?`{|}~” (MAILADDR_ESCAPE). Posteriorment, la línia preparada a mda_expand_token() s'utilitza quan es crida a l'agent de lliurament (MDA) mitjançant l'ordre 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' En cas de col·locar cartes a mbox mitjançant /bin/sh, s'obre la línia “/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}”, on el valor “% {mbox.from}" inclou dades escapades del paràmetre "MAIL FROM".

L'essència de la vulnerabilitat és que smtp_mailaddr() té un error lògic, pel qual, si s'envia un domini buit al correu electrònic, la funció retorna un codi de verificació correcte, fins i tot si la part de l'adreça abans de "@" conté caràcters no vàlids. . A més, quan es prepara una cadena, la funció mda_expand_token() no escapa de tots els caràcters especials de l'intèrpret d'ordres possibles, sinó només els caràcters especials permesos a l'adreça de correu electrònic. Per tant, per executar la vostra comanda, n'hi ha prou amb utilitzar el símbol ";" a la part local del correu electrònic. i espai, que no s'inclouen al conjunt MAILADDR_ESCAPE i no s'escapa. Per exemple:

$nc 127.0.0.1 25

HOLA professor.falken
CORREU DE:<;sleep 66;>
RCPT A:
DATA
.
QUIT

Després d'aquesta sessió, OpenSMTPD, quan es lliura a mbox, llançarà l'ordre a través del shell

/usr/libexec/mail.local -f ;sleep 66; arrel

Al mateix temps, les possibilitats d'atac estan limitades pel fet que la part local de l'adreça no pot superar els 64 caràcters, i els caràcters especials '$' i '|' es substitueixen per ":" en escapar. Per evitar aquesta limitació, utilitzem el fet que el cos de la carta es transmet després d'executar /usr/libexec/mail.local a través del flux d'entrada, és a dir. En manipular l'adreça, només podeu iniciar l'intèrpret d'ordres sh i utilitzar el cos de la lletra com a conjunt d'instruccions. Com que les capçaleres SMTP del servei s'indiquen al principi de la carta, es recomana utilitzar l'ordre de lectura en un bucle per saltar-les. Un exploit que funcioni s'assembla a això:

$nc 192.168.56.143 25

HOLA professor.falken
CORREU DE:<;per i a 0 1 2 3 4 5 6 7 8 9 abcd;llegir r;fe;sh;sortir 0;>
RCPT A:[protegit per correu electrònic]>
DATA
#0
#1
...
#d
per i a WOPR; fer
echo -n "($i)" && id || trencar
fet > /root/x."`id -u`.""$$"
.
QUIT

Font: opennet.ru

Afegeix comentari