Vulnerabilidade no OpenSMTPD que permite execução remota de código com privilégios de root

No servidor de email desenvolvido pelo projeto OpenBSD OpenSMTPD identificado vulnerabilidade crítica (CVE-2020-7247), que permite executar comandos shell remotamente no servidor com direitos de usuário root. A vulnerabilidade foi identificada durante uma nova auditoria conduzida pela Qualys Security (auditoria anterior do OpenSMTPD foi realizado em 2015, e a nova vulnerabilidade está presente desde maio de 2018). Problema eliminado na versão OpenSMTPD 6.6.2. Recomenda-se que todos os usuários instalem imediatamente a atualização (para OpenBSD, o patch pode ser instalado via syspatch).

Foram propostas duas variantes de ataque. A primeira variante funciona com a configuração padrão do OpenSMTPD (recebendo solicitações apenas do localhost) e permite a exploração local quando o atacante tem acesso à interface de rede local (loopback) no servidor (por exemplo, em sistemas de hospedagem). A segunda variante ocorre quando o OpenSMTPD está configurado para receber solicitações de rede externas (um servidor de e-mail que aceita e-mails de terceiros). Os pesquisadores prepararam um protótipo de exploit que funciona com sucesso tanto com a variante do OpenSMTPD incluída no OpenBSD 6.6 quanto com a versão portátil para outros sistemas operacionais (conduzido em Debian Testando).

O problema é causado por um erro na função smtp_mailaddr(), que é chamada para verificar a exatidão dos valores dos campos “MAIL FROM” e “RCPT TO” que definem o remetente/destinatário e são passados ​​durante a conexão com o servidor de correio. Para verificar a parte do endereço de e-mail que vem antes do símbolo “@”, a função smtp_mailaddr() é chamada
valid_localpart(), que aceita (MAILADDR_ALLOWED) os caracteres "!#$%&'*/?^`{|}~+-=_", conforme exigido pela RFC 5322.

Neste caso, o escape direto da string é realizado na função mda_expand_token(), que substitui apenas os caracteres “!#$%&'*?`{|}~” (MAILADDR_ESCAPE). Posteriormente, a linha preparada em mda_expand_token() é usada ao chamar o agente de entrega (MDA) usando o comando 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' . No caso de colocar letras no mbox via /bin/sh, é lançada a linha “/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}”, onde o valor “%”. {mbox.from}” inclui dados de escape do parâmetro “MAIL FROM”.

A essência da vulnerabilidade é que smtp_mailaddr() possui um erro lógico, devido ao qual, se um domínio vazio for enviado para o e-mail, a função retornará um código de verificação bem-sucedido, mesmo que a parte do endereço antes de “@” contenha caracteres inválidos . Além disso, ao preparar uma string, a função mda_expand_token() não escapa de todos os caracteres especiais possíveis do shell, mas apenas dos caracteres especiais permitidos no endereço de e-mail. Assim, para executar o seu comando, basta utilizar o símbolo “;” na parte local do email. e espaço, que não estão incluídos no conjunto MAILADDR_ESCAPE e não têm escape. Por exemplo:

$nc 127.0.0.1 25

HELO professor.falken
CORREIO DE:<;sleep 66;>
RCPT PARA:
DADOS
.
SAIR

Após esta sessão, o OpenSMTPD, quando entregue ao mbox, irá lançar o comando através do shell

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

Ao mesmo tempo, as possibilidades de ataque são limitadas pelo fato de que a parte local do endereço não pode exceder 64 caracteres e os caracteres especiais '$' e '|' são substituídos por ":" ao escapar. Para contornar essa limitação, usamos o fato de que o corpo da carta é transmitido após a execução de /usr/libexec/mail.local através do fluxo de entrada, ou seja, Ao manipular o endereço, você só pode iniciar o interpretador de comandos sh e usar o corpo da carta como um conjunto de instruções. Como os cabeçalhos SMTP do serviço são indicados no início da carta, sugere-se usar o comando read em loop para ignorá-los. Uma exploração funcional é mais ou menos assim:

$nc 192.168.56.143 25

HELO professor.falken
MAIL FROM:<;for i in 0 1 2 3 4 5 6 7 8 9 abcd;do read r;done;sh;exit 0;>
RCPT PARA:
DADOS
#0
#1
...
#d
para eu em WOPR; fazer
echo -n "($i) " && id || quebrar
feito > /root/x."`id -u`.""$$"
.
SAIR

Fonte: opennet.ru

Compre hospedagem confiável para sites com proteção DDoS, servidores VPS VDS 🔥 Compre hospedagem de sites confiável com proteção contra DDoS, servidores VPS/VDS | ProHoster