Uma vez mais, e tal como aconteceu com a vaga de phishing do banco BPI no passado dia 17 de dezembro de 2019, o SI-LAB analisou todos os detalhes por trás desta nova campanha do NETFLIX.
Alerta: Autores da campanha de phishing do BPI lançam nova campanha desta vez atingindo o NETFLIX
O SI-LAB teve acesso ao bundle que os agente de ameças utilizam para alavancar este tipo de campanhas e onde foi possível identificar algumas semelhanças com a vaga de phishing do BPI.
Inicialmente notou-se que o agente de ameaças realizaram o lançamento da SMS potencialmente através da mesma origem do BPI, e a prova disso é o identificador do remetente “BPINet“. Esse descuido por parte dos criminosos permitiu desvendar que a campanha se tratava de um esquema malicioso, e gerou de imediato um alerta de preocupação por parte das vítimas que haviam recebido as mensagens.
Figura 1: SMS recebida pelas vítimas da campanha agrupando a mensagem do NETFLIX com a mensagem do BPI.
O SI-LAB procurou investigar alguma correlação dentro deste contexto, e identificou que 37 das vítimas que recebeu as mensagens do BPI também recebeu as mensagens desta nova campanha do NETFLIX.
Não foram obtidos números totais sobre o volume de utilizadores afetados por esta campanha, no entanto, este indicador apresenta um claro sinal sobre a origem do grupo que despoletou ambos os ataques (BPI e NETFLIX).
Em detalhe, a estrutura base da campanha do NETFLIX é a seguinte.
Figura 2: Ficheiros base da campanha do NETFLIX.
Os ficheiros index.php e geoplugin.class.php são as primeiras páginas a serem invocadas quando uma nova vítima acede ao servidor. Aqui são obtidos alguns detalhes iniciais sobre a vítima.
Em seguida, é despoletada a página “index3.php“, que possui alguns trechos de código que permitem bloquear acessos através de determinados hosts. Aqui é também realizada a copia das landing pages da diretoria “origem” para a nova diretoria única por vítima.
A diretoria “origem” possui todos os fichieros das landing pages da campanha. Esta diretoria é copiada para uma diretoria com nome aleatório no servidor baseado no hash MD5 de um número random. A vítima é depois direcionada para as landing pages dessa nova diretoria.
Para cada nova vítima, uma nova diretoria com as respetivas landing pages são geradas. Com este mecanismo, o agente de ameaças procuram evitar deteções com base em tráfego e sua correlação.
Finalmente, é invocado o ficheiro “atualizar.php” que é responsável por salvaguardar os detalhes da vítima na diretoria “dados“.
Ficheiro index.php (inicial)
Esta é a primeira página a interagir com a vítima. Como pode ser observado na Figura 3, inicialmente são obtidos detalhes sobre o tipo de navegador Web/dispositivo utilizado para aceder ao serviço. Este tipo de informações são geralmente utilizadas para encaminhar a vítima para diferentes landing pages consoante o tipo de dispositivo – web ou mobile.
No entanto, neste caso em específico, o agente de ameaças não efetuou essa distinção apesar de o código fonte para esse teste permanecer hardcoded nas páginas que suportam a campanha.
Figura 3: Código fonte da página index.php onde são obtidos alguns detalhes sobre a vítima.
Entre as linhas de código 26 e 37 podemos observar o tipo de informações obtidos, nomeadamente:
- Endereço de IP da vítima;
- Cidade;
- Região; e
- País.
Um detalhe a destacar está presente na linha 40.
#if($geoplugin->countryName=='Brazil') { fwrite($novoarquivo,$d ." - ".$ip." - ".$browser." - ".$browser_version." - ".$geoplugin->city." - ".$geoplugin->region." - ".$geoplugin->countryName."\r\n"); fclose($novoarquivo); }
Inicialmente as informações eram escritas num no ficheiro dados.txt presente na raiz do servidor caso o país de origem da vítima fosse “Brazil” (#if($geoplugin->countryName==’Brazil’)).
Esta condição foi comentada pelo agente de ameça, porque neste momento, o objetivo da campanha seria atingir alvos portugueses.
Outro destalhe interessante é o default time zone “America/Sao_Paulo“, o mesmo identificado na campanha do BPI (linha 33 da Figura 3).
No final, a vítima é enviada para a página “acesso.class.php”.
Pagina acesso.class.php
Nesta página são realizadas validações relativas ao dispositivo de onde a vítima está a aceder ao servidor da campanha maliciosa. No entanto, na validação (linhas de código 4 e 5), a vítima é direcionada para a mesma página (index3.php). À primeira vista, o agente de ameaças descartou realizar qualquer distinção entre dispositivo de acesso, p.ex., web ou mobile.
Figura 4: Código fonte da página acesso.class.php.
Como pode ser observado na Figura 5 abaixo, estão disponíveis duas páginas identicas chamadas index2 e index3.
Figura 5: Estrutura raiz da campanha destacando os ficheiros index2 e index3.
O ficheiro ~index.php não é utilizado durante toda a campanha. Já os ficheiros index2 e index3 são muito similares, e apenas têm uma modificação entre si.
Qual a diferença entre o ficheiro index2.php e index3.php?
Figura 6: Diferenças entre o ficheiro index2 e index3.
Mais uma prova que a campanha foi adaptada de uma campanha BR. Como observado, o target está bem definido.
A campanha apenas executa se o endereço de IP de origem da vítima fizer parte do range de IPs portugueses. Caso contrário, uma mensagem com erro 404 é apresentada.
Página index3.php
Inicialmente é validado se quem acede à página o está a fazer de alguma origem relacionada com os hostnames indicados abaixo (blacklist by hostname e by IP). Caso isso aconteça, a página apresentará um erro “404 Not Found</h1>The page that you have requested could not be found.”.
Figura 7: Código fonte da págian index3.php com código de blacklist by IP e by hostname.
Também é vísivel a variável PHP na linha de código 29. Aqui é validada indiscutivelmente a origem da vítima. Se o acesso for realizado através de um endereço de IP portugues, a campanha prossegue. Caso contrário, é apresentada uma mensagem com erro 404.
A restante lógica desta págia é responsável por gerar um valor random entre 0 e 1000000000 que dá origem a uma hash do tipo MD5 que será o nome atribuído a uma nova diretoria criada no servidor que irá contem os ficheiros da landing page da campanha (linhas 34 e 35).
$random = rand(0,100000000000); $dst = substr(md5($random), 0, 1000000000); ---Output---- e2934f988b633c79610c3894e52ff796 7f04cc5809ab17e403f5b55d944e8017 9ffc3fc0603068d0c00609940df26864 1aee3116240d70d7c289432fbcdbbfc7 aafbb4aef4fedc2b303456dced7ee48f (...)
Figura 8: Página index3.php – geração de valor random para a criação das landing pages com base no acesso da vítima.
Na linha de código 37 é possível observar a geração do userID, ($uid). Esse valor é uma hash MD5 baseada no seu endereço de IP origem e servirá para identificar a vítima durante os acessos às diferentes páginas da campanha.
Entre as linhas 42-57 está disponível a função responsável por copiar todos os ficheiros base da landing page da diretoria origem para uma pasta destino e única por vítima. De notar que essa diretoria é mais tarde eliminada depois de a vítima concluir todo o ciclo.
Figura 9: Ficheiros base e diretoria “origem” com os ficheiros da landing page da campanha.
Por fim, linha 62 da Figura 8, a vítima é então direcioanda para essa diretoria onde acede à landing page de login do NETFLIX.
Nova diretoria criada por acesso (vítima) e ficheiros da landing page
Os ficheiros disponíveis nesas nova diretoria, única por vítima, são os seguintes.
Figura 10: Ficheiros da landing page disponíveis na nova diretoria única por vítima.
De notar que os ficheiros “index-terminal.php” e “confirmacao-terminar.php” não são utilizados. São versões incompletas dos ficheiros “index.php” e “confirmacao.php” (de uma tentativa inicial de aprimoramento).
Landing page: index.php
Pode ver-se na URL da landing page os detalhes que foram enunciados. A hash MD5 identificando a diretoria da vítima, e a variável “session” com a hash MD5 gerada a partir do endereço de IP da vítima e utilizada como identificador durante o acesso a todas as páginas.
Nesta página de autenticação, são obtidos os detalhes de acesso ao NETFLIX, nomeadamente:
- endereço de email de acesso; e
- palavra-passe.
Figura 11: Landing page de login.
É posível validar no código fonte da página (index.php) que após a vítima clicar em “Entrar”, a vítima é direcioanda até à página “get_pay.php“. Os detalhes (email e palavra-passe) são enviados através do método GET para a página seguinte (get_pay.php).
Figura 12: Trecho de código da landing page (index.php).
No entanto os dados recolhidos (email e palavra-passe) são descartados e não são salvaguardados pelo agente de ameça. Não são utilizados de forma alguma na página get_pay.php para realizar qualquer tipo de operação.
Página get_pay.php
Nesta nova página são solicitados à vítma novos detalhes:
- Nome Completo;
- Cartão de Cidadão;
- Data de Nascimento;
- Número do Cartão;
- Data de validada e código de segurança.
Figura 13: Detalhes adicionais são solicitados na página “get_pay.php”.
Como é possível observar através do código desta página (Figura 14), inicialmente é validado se todos os registos são introduzidos corretamente pela vítima – a função javascript “check_cadastro();” efetua esse processo.
Em seguida, os detalhes são transferidos para a próxima página (confirmacao.php) através do método POST.
Figura 14: A funcao check_cadastro() valida se todos os campos são preenchidos corretamente.
Página confirmacao.php
Esta representa a última landing page da campanha. Aqui são solicitados detalhes extra: número de telemóvel e senha do cartão.
Figura 15: Detalhes adicionais solicitados pela página confirmacao.php.
Analisando o código fonte desta página em específico, é possível observar que os dados obtidos via POST da landing page anterior são agora guardados em sessão.
Figura 16: Detalhes da vítima guardados em sessão PHP.
Em seguida, todos os detalhes da vítima recolhidos ao longo das landing page analisadas estão agora salvaguardados na sessão PHP.
A vítima ao prosseguir e confirmar a forma de pagamento (Figura 15), é direcionada para a página “atualizar.php” (Figura 17), que por sua vez, guarda os detalhes num ficheiro no servidor e direciona a vítima para a página legítima do NETFLIX brasil encerrando assim a campanha (Figura 18).
Figura 17: Formulário que direciona a vítima para a página “atualizar.php” disponível na raiz do servidor.
Página atualizar.php
Esta última página é responsável por obter os detalhes “nº de telemóvel” e “senha do cartão” introduzidos no formulário da página confirmacao.php pela vítima (Figura 15).
Figura 18: Página atualizar.php onde os detalhes da vítima são armazenados no servidor e é realizado o direcionamento da vítima para o serviço legítimo encerrando, aqui, a campanha de phishing.
Em seguida, é recolhido novamente o endereço de IP da vítima e user-agent, mas desta vez para os salvaguardar diretamente junto dos restantes detalhes num ficheiro de texto no servidor.
Como apresentado através da Figura 18, o ficheiro de texto é salvaguardado na diretoria “dados” com o prefixo “NET_ + nº_cartao_cidadao + .txt“.
$arquivo = 'dados/NET_' . $cpf. '.txt';
Nas linhas 41-49 está definida a função “delTree($pasta)” responsável por eliminar a diretoria única por vítima responsável por manter a landing page de phishing e criada quando a vítima acedeu ao servidor pela primeira vez (Figura 8).
Finalmente, e para manter o processo o mais real possível, o agente de ameça direciona as vítimas para a página oficial do NETFLIX brasil:
header('Location: https://www.netflix.com/br/logout');
Semelhanças entre a campanha do BPI e do NETFLIX
Embora não seja possível identificar o agente de ameças por detrás destas duas campanhas, é crucial manter o registo (tracking) das duas campanhas e atentar as suas semelhanças – uma mais valia para que em campanhas futuras desta natureza seja possível avaliar o seu grau de similaridade.
Do trabalho de investigação conduzido pelo SI-LAB, é importante corroborar o seguinte:
- Das 37 vítimas da campanha do BPI (dia 17 de dezembro 2019), as mesmas 37 vítimas também receberam a SMS do NETFLIX (dia 18 de dezembro de 2019), embora não seja possível indagar quanto ao número total de vítimas das duas campanhas.
- Ambas as SMS foram enviadas do mesmo dispositivo origem e com o mesmo cabeçalho (BPINet), sendo agrupadas nos dispositivos móveis das vítimas.
- As campanhas foram lançadas em dias consecutivos (dia 17 e 18 de dezembro).
- Ambas as vagas de ataque utilizam uma base br que é depois adaptada para a língua portuguesa nativa (pt).
- O detalhe do default time zone “America/Sao_Paulo” foi identificado em ambas as estruturas, indicando que a origem inicial destas campanhas foi o Brasil, e mais tarde adaptada para Portugal.
- Um sinal claro dessa adaptação foi identificado nas páginas index2 e index3 em que o agente de ameças definiu o target da campanha (Portugal) com base no endereço de IP origem.
- A estrutura de como os detalhes das vítimas são mantidos no servidor é muito similar (utilizando uma diretoria denominada “dados“).
Indicadores de Compromisso (IOCs)
hxxp://bit.ly/2tmvvwu hxxp://www.avisa-as.ir/sites/default/files/lerSMS.php hxxp://c83-253-170-71.bredband.comhem.se/ /get_pay.php?is_email= /confirmacao.php /dados/NET_ /atualizar.php
One Reply to “SI-LAB: Campanha do NETFLIX em detalhe e similaridades com a campanha do banco BPI”