Vulnerabilidade en OpenSMTPD que permite a execución remota de código como root

No servidor de correo desenvolvido polo proxecto OpenBSD OpenSMTPD identificado vulnerabilidade crítica (CVE-2020-7247), que lle permite executar comandos de shell de forma remota no servidor con dereitos de usuario root. A vulnerabilidade identificouse durante unha reauditoría realizada por Qualys Security (anterior auditoría de OpenSMTPD celebrouse en 2015, e a nova vulnerabilidade está presente desde maio de 2018). Problema eliminado na versión de OpenSMTPD 6.6.2. Recoméndase a todos os usuarios que instalen inmediatamente a actualización (para OpenBSD, o parche pódese instalar mediante syspatch).

Propóñense dúas opcións de ataque. A primeira opción funciona na configuración predeterminada de OpenSMTPD (aceptando solicitudes só de localhost) e permítelle explotar o problema localmente, cando o atacante pode acceder á interface de rede local (loopback) no servidor (por exemplo, nos sistemas de hospedaxe). . A segunda opción ocorre cando OpenSMTPD está configurado para recibir solicitudes de rede externas (un servidor de correo que acepta correo de terceiros). Os investigadores prepararon un prototipo dun exploit que funciona con éxito tanto coa versión OpenSMTPD incluída en OpenBSD 6.6 como cunha versión portátil para outros sistemas operativos (realizada en Debian Testing).

O problema é causado por un erro na función smtp_mailaddr(), que se chama para comprobar a corrección dos valores dos campos "MAIL FROM" e "RCPT TO" que definen o remitente/destinatario e que se pasan durante a conexión. co servidor de correo. Para comprobar a parte do enderezo de correo electrónico que está antes do símbolo “@”, chámase a función smtp_mailaddr()
valid_localpart(), que acepta (MAILADDR_ALLOWED) os caracteres "!#$%&'*/?^`{|}~+-=_", como esixe RFC 5322.

Neste caso, o escape directo da cadea realízase na función mda_expand_token(), que só substitúe os caracteres “!#$%&’*?`{|}~” (MAILADDR_ESCAPE). Posteriormente, a liña preparada en mda_expand_token() úsase cando se chama ao axente de entrega (MDA) mediante o comando 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' No caso de colocar cartas a mbox a través de /bin/sh, lánzase a liña “/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}”, onde o valor “% {mbox.from}” inclúe datos escapados do parámetro "MAIL FROM".

A esencia da vulnerabilidade é que smtp_mailaddr() ten un erro lóxico, polo que, se se envía un dominio baleiro ao correo electrónico, a función devolve un código de verificación exitoso, aínda que a parte do enderezo antes de "@" conteña caracteres non válidos. . Ademais, ao preparar unha cadea, a función mda_expand_token() non escapa de todos os caracteres especiais de shell posibles, senón só de caracteres especiais permitidos no enderezo de correo electrónico. Así, para executar o seu comando, abonda con usar o símbolo ";" na parte local do correo electrónico. e espazo, que non están incluídos no conxunto MAILADDR_ESCAPE e non se escapan. Por exemplo:

$nc 127.0.0.1 25

OLA profesor.falken
CORREO DE:
RCPT TO:
DATOS
.
QUIT

Despois desta sesión, OpenSMTPD, cando se entregue a mbox, lanzará o comando a través do shell

/usr/libexec/mail.local -f ;sleep 66; raíz

Ao mesmo tempo, as posibilidades de ataque están limitadas polo feito de que a parte local do enderezo non pode superar os 64 caracteres e os caracteres especiais ‘$’ e ‘|’ substitúense por “:” ao escapar. Para evitar esta limitación, usamos o feito de que o corpo da carta se transmite despois de executar /usr/libexec/mail.local a través do fluxo de entrada, é dicir. Ao manipular o enderezo, só pode iniciar o intérprete de comandos sh e usar o corpo da letra como un conxunto de instrucións. Dado que as cabeceiras SMTP do servizo indícanse ao comezo da carta, suxírese que use o comando read nun bucle para omitilas. Un exploit funcionando parece algo así:

$nc 192.168.56.143 25

OLA profesor.falken
CORREO DE:
RCPT A:<[protexido por correo electrónico]>
DATOS
#0
#1
...
#d
para i en W O P R; facer
echo -n "($i)" && id || romper
feito > /root/x."`id -u`.""$$"
.
QUIT

Fonte: opennet.ru

Engadir un comentario