São muitos os vetores que podem ser aplicados ao uso do Email Spoofing. Uma pessoa mal intencionada pode utilizar deste artificio para mandar mensagens de cobrança com o email do banco, mandar mensagens para seus familiares e até mesmo tirar proveito de oportunidades empresariais falsificando e-mails de provedores de diretorias, supervisores e funcionários em geral afim de tirar vantagem ou prejudicar pessoas.
Hoje o alvo deste artigo são os servidores de hosts e hospedagens gratuitos, que, por meio da abertura para o público e das facilidades do acesso a serviços de sendmail, SMTP e transferências de zona, abrem espaço para atacantes mal intencionados que podem estar hospedando aplicações que se aproveitam da falta de autenticação do SMTP do servidor para alterar o escopo do emai,l e assim se aproveitar da assinatura do seu certificado para passar por filtros de SPAM e controle de fraudes.
Mas como funciona isso na prática?
1. Um atacante utilizando um espaço alocado em um servidor compartilhado de hospedagens gratuitas, hospeda uma aplicação, em tese, maliciosa que utiliza da função 'mail' do PHP ou SMTPlib do Python ou qualquer outra biblioteca ou função específica para montagem e envio de emails por protocólo SMTP. Essa aplicação tem o intuito de receber posts de inputs e com base em um controller, montar esses dados em um objeto com escopo de email. Escrevi essa PoC em PHP pois a maioria dos servidores de hospedagem gratuitas (que eu testei) possuem somente suporte para PHP, MySQL e etc, e me senti mais a vontade de construir os objetos com o CodeIgniter. Vejamos a função abaixo:
Construímos uma classe para fazer o envio dos E-mails. Esse processo é um processo normal para a construção de escopos de e-mail em qualquer ocasião. Pegamos alguns posts enviados para o controller e colocamos ele dentro de um array. Essa parte é realmente muito básica, utilizaremos essa função simplesmente para colocar os dados no Array e chamar outra função chamada 'send_spoofing()' passando esses dados como argumento. Essa função seá a responsável pelo envio em si.
Como podemos ver, criamos uma função responsável por construir um escopo de e-mail com os dados que recebemos do array. Setamos também o padrão 'utf-8' simplesmente por frescura de deixar tudo bonitinho e evitar de zoar os caracteres especiais quando a vitima receber a mensagem com um encode diferente do seu cliente de e-mail com '$utf = "Content-Type: text/plain;charset=UTF-8\n";' e em seguida construímos o header do e-mail com os dados que recebemos.
$headers = $utf . $from . $fromname . $sp . $lt . $fromemail . $gt;
É de extrema importância a atenção nesse detalhe, pois caso algo fuja do padrão do exemplo que segue o padrão MIMEText 1.0, o e-mail não será enviado ou será enviado com seus atributos desconfigurados, podendo levar o Subject da mensagem em seu corpo e vice e versa. Pra quem nunca viu, o padrão MIMEText depois de construído, monta os dados como segue o exemplo abaixo.
Content-Type: multipart/mixed; boundary="===============5711234466013666245=="
MIME-Version: 1.0
From: remetente@remetente.com
To: destino@destino.com
Subject: Assunto da Mensagem
--===============5711234466013666245==
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Q29ycG8gZGEgbWVuc2FnZW0=
--===============5711234466013666245==--
2. Por enquanto vimos duas funções bem tranquilas que não fogem nada do surreal. Você pode utilizar esse exemplo pra realizar envio de E-mails normalmente em seu provedor, não há nada de muito específico. Esse é o problema: Como passamos a ver no diagrama acima. Essa exploração se consiste em aproveitar a 'chave pública' que o servidor de hospedagem tem com o servidor de SMTP, ou a falta de autenticação entre os mesmos dependendo da ocasião, e sem precisar dessas credenciais, enviar diretamente para o mesmo processar com o escopo criado de antemão, utilizando na cara dura um 'From:' falsificado, aceitando qualquer servidor que colocarmos alí, como @microsoft, @apple, @gov, @* e etc. No caso, o que será enviado futuramente é um e-mail autenticado pelo certificado de autoridade do servidor, e o mesmo será assinado por ele, e não pelo e-mail destinatário que enviamos, é aí que o Spoofing irá funcionar.
3. Após a construção desse e-mail, ele é enviado e assinado pelo servidor de SMTP confiável dentro do cluster de hosting, e encaminhado para a vítima por meio do mesmo. Para exemplificar, criei uma aplicação maliciosa em um servidor de Host gratuito que não será possível revelar a identidade até que a empresa em questão responda meus e-mails autorizando, mas de qualquer forma, segue o exemplo efetuado entre e-mails criados somente para esse exemplo, sem prejudicar terceiros nem envolver qualquer outra corporação e prejudicar pessoas físicas ou jurídicas.
Abrindo o certificado da mensagem para analisarmos melhor, podemos identificar a origem exata do e-mail, incluindo assinatura, IP, hostname e servido, podendo até conseguir prevenir e mandar a assinatura para nosso spam mail. Porém, como não é uma prática comum entre os usuários abrirem certificados SMTP, podemos concluir que caso essa técnica seja aplicada, pode ser utilizada para realizar ataques de engenharia social, roubos de identidades e etc. Lembrando que não nos responsabilizamos pelo uso indevido do material apresentado aqui. Todo o conteúdo foi elaborado afim de criar conteúdo educativo para profissionais e estudantes de segurança da informação. Ao total, foram encontradas até o momento, 3 empresas que possuem essa 'facilidade' em aberta, duas delas gratuitas e uma não.Uma empresa foi notificada e não terá sua identidade exposta por enquanto. As outras serão contatadas nos próximos dias.
Update: 26/01/2016 - A empresa em questão foi notificada por e-mail com todas as informações necessárias para correção. As outras serão contatadas durante a semana. Vamos por enquanto chamá-las de x, y e z. A notificado por hora será a X
:)
Boa! ~~ sempre pensei em fazer um post sobre, mas preguiça mata.
ResponderExcluirAgora tenho referencia quando eu esquecer o código vlw hahahah
Bacana, bora testar :)
ResponderExcluir