Vulnerabilidad en OpenSMTPD que permite la ejecución remota de código con privilegios de root

En el servidor de correo desarrollado por el proyecto OpenBSD Abrir SMTPD identificado vulnerabilidad crítica (CVE-2020-7247), que le permite ejecutar comandos de shell de forma remota en el servidor con derechos de usuario root. La vulnerabilidad fue identificada durante una nueva auditoría realizada por Qualys Security (auditoría anterior de OpenSMTPD se llevo a cabo en 2015, y la nueva vulnerabilidad está presente desde mayo de 2018). Problema eliminado en la versión OpenSMTPD 6.6.2. Se recomienda a todos los usuarios que instalen inmediatamente la actualización (para OpenBSD, el parche se puede instalar mediante syspatch).

Se proponen dos opciones de ataque. La primera opción funciona en la configuración predeterminada de OpenSMTPD (aceptando solicitudes solo desde localhost) y le permite explotar el problema localmente, cuando el atacante puede acceder a la interfaz de red local (loopback) en el servidor (por ejemplo, en sistemas de alojamiento). . La segunda opción ocurre cuando OpenSMTPD está configurado para recibir solicitudes de red externa (un servidor de correo que acepta correo de terceros). Los investigadores han preparado un prototipo de exploit que funciona con éxito tanto con la versión OpenSMTPD incluida en OpenBSD 6.6 como con una versión portátil para otros sistemas operativos (realizada en Debian Testing).

El problema se debe a un error en la función smtp_mailaddr(), que se llama para verificar la exactitud de los valores en los campos “MAIL FROM” y “RCPT TO” que definen el remitente/destinatario y se pasan durante la conexión. con el servidor de correo. Para verificar la parte de la dirección de correo electrónico que viene antes del símbolo "@", se llama a la función smtp_mailaddr()
valid_localpart(), que acepta (MAILADDR_ALLOWED) los caracteres "!#$%&'*/?^`{|}~+-=_", como lo requiere RFC 5322.

En este caso, el escape directo de la cadena se realiza en la función mda_expand_token(), que reemplaza solo los caracteres “!#$%&'*?`{|}~” (MAILADDR_ESCAPE). Posteriormente, la línea preparada en mda_expand_token() se utiliza al llamar al agente de entrega (MDA) usando el comando 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' . En caso de colocar cartas a mbox vía /bin/sh, se lanza la línea “/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}”, donde se escribe el valor “% {mbox.from}” incluye datos de escape del parámetro "MAIL FROM".

La esencia de la vulnerabilidad es que smtp_mailaddr() tiene un error lógico, por lo que, si se envía un dominio vacío al correo electrónico, la función devuelve un código de verificación exitoso, incluso si la parte de la dirección antes de "@" contiene caracteres no válidos. . Además, al preparar una cadena, la función mda_expand_token() no escapa de todos los caracteres especiales posibles del shell, sino solo de los caracteres especiales permitidos en la dirección de correo electrónico. Así, para ejecutar su comando, basta con utilizar el símbolo “;” en la parte local del correo electrónico. y espacio, que no están incluidos en el conjunto MAILADDR_ESCAPE y no tienen escape. Por ejemplo:

$nc 127.0.0.1 25

HELO profesor.falken
CORREO DE:<;sleep 66;>
RCPT A:
DATOS
.
DEJAR

Después de esta sesión, OpenSMTPD, cuando se entrega a mbox, ejecutará el comando a través del shell

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

Al mismo tiempo, las posibilidades de ataque están limitadas por el hecho de que la parte local de la dirección no puede exceder los 64 caracteres y los caracteres especiales '$' y '|' se reemplazan por ":" al escapar. Para evitar esta limitación, utilizamos el hecho de que el cuerpo de la carta se transmite después de ejecutar /usr/libexec/mail.local a través del flujo de entrada, es decir Al manipular la dirección, solo puede iniciar el intérprete del comando sh y usar el cuerpo de la carta como un conjunto de instrucciones. Dado que los encabezados SMTP del servicio se indican al principio de la carta, se sugiere utilizar el comando de lectura en un bucle para omitirlos. Un exploit funcional se parece a esto:

$nc 192.168.56.143 25

HELO profesor.falken
CORREO DE:<;para i en 0 1 2 3 4 5 6 7 8 9 abcd;leer r;hecho;sh;salir 0;>
RCPT PARA:[email protected]>
DATOS
#0
#1
...
#d
para yo en WOPR; hacer
echo -n "($i) " && identificación || romper
hecho > /root/x."`id -u`.""$$"
.
DEJAR

Fuente: opennet.ru

Añadir un comentario