Fala galera, depois de um longo inverno, aqui estamos novamente…

Sempre achei que ataques de phishing são mais do mesmo… O “modus operandi” basicamente não muda, porém existem pequenos detalhes que diferenciam um ou outro… Pretendo separar algum tempo para analisar ataques de phishing e detalhes independente de realizarem apenas a coleta ou usarem samples para manter o acesso, botnets, zombie machines, whatever…

Quem nunca recebeu aquele e-mail do banco solicitando o sincronismo dos dados, não sabe o que é adrenalina… hehehe

tela do email

Olha toda pressão na mensagem e imagina sua avó lendo isso, justo agora que aprendeu a pagar as contas pela internet… Recebeu o e-mail dia 01 com prazo até o dia 02… Nem da tempo perguntar ao netinho que meche com computador se isso é vírus ou não… hehehe, vovó não faz ideia do que é domínio, host, remetente e afins… Ou seja, vai clicar…

No corpo do e-mail havia apenas esta imagem apontando para:  hxxp://oxxyracing.com.br/css/

Que originalmente seria:

link_email_site-original

Mas como percebe-se, está defaced:

link_email_site-defaced

Normalmente os phishings são hospedados em sites vulneráveis que foram invadidos e tem pouca ou nenhuma manutenção e por isso alguns phishings ficam muito tempo ativos, dependendo de pesquisadores ou usuários mais avançados reportarem o link como malicioso.

Ao clicar no link da mensagem é feito um redirecionamento do site invadido para um outro site, onde há de fato o phishing executando: http://masitu.com/2015/9c0e4c778acb7e23c8d760602d961ff7/ – O masitu.com é outro site vulnerável que não foi defaced, porém foi invadido e configurado todo o sistema de coleta deste sample.

A próxima tela é muito bem feita e dá a impressão de uma aplicação inicializando:

phishing-tela-loading

Após “iniciado” o sistema, começamos a ver os erros que sempre existem por mais bem feitos que sejam os phishings que neste caso é o charset desconfigurado ou não suportado pelo servidor:

phishing-tela_1

Não precisa falar que o site faz validação dos dados, e a janela de retorno está pior ainda em relação aos erros, provavelmente por estar em um site fora do Brasil e o servidor sem suporte ao charset com acentuação:

phishing-tela_2

Clicamos e colocamos uma informação mais ou menos “verídica”, chegando à próxima tela que solicita a senha de 4 dígitos:

phishing-tela_3

Após inserida a senha, continuam as solicitações de dados pessoais:

phishing-tela_4

Solicitar TODAS as posições da chave de segurança, e alguém digitar, é de perder a fé na humanidade né? Nãooo.. Lembre-se que para sua avó, isso tudo faz sentido:

phishing-tela_5

Mesmo se houverem estas telas de erro tão mal feitas:

phishing-tela_6

Ao alterar e avançar, mais coleta de dados:

phishing-tela_7

Fiquei surpreso de não haver validação na logica do cartão. Ao pressionar OK, chegamos à tela final:

phishing-tela_8

Vamos aos arquivos; Consegui baixar os disponíveis ou que faziam a validação do lado client:

-rw-r--r--  index.html
drwxr-xr-x  new_icone
drwxr-xr-x  new_images
drwxr-xr-x  new_jquery
drwxr-xr-x  new_stylo
-rw-r--r--  redirecionar.php

Conteudo dos diretórios:

new_icone/

-rw-r--r--  loginviwer.ico

new_images/
(Neste diretório percebe-se claramente o coding style HUEHUE_BR..:)

-rw-r--r--  acc.png
-rw-r--r--  agg.png
-rw-r--r--  asdasdaksdasdasd.png
-rw-r--r--  asdhsduas2.png
-rw-r--r--  asdhsduas3.png
-rw-r--r--  asdhsduas4.png
-rw-r--r--  asdhsduas.png
-rw-r--r--  avancar.png
-rw-r--r--  bbbbbbbb.jpg
-rw-r--r--  bt_continuar.gif
-rw-r--r--  bt_limpar.gif
-rw-r--r--  bt_voltar.gif
-rw-r--r--  carrega.gif
-rw-r--r--  i1.jpg
-rw-r--r--  i2q.png
-rw-r--r--  i3k.png
-rw-r--r--  ibk4.jpg
-rw-r--r--  ibsk4.png
-rw-r--r--  larg.png
-rw-r--r--  limpar.gif
-rw-r--r--  nada.png
-rw-r--r--  OK.png
-rw-r--r--  shushsu.jpg
-rw-r--r--  suhsuhsussuhus.png
-rw-r--r--  suhsushushsuhsuhs.jpg
-rw-r--r--  top.png

new_jquery/

-rw-r--r--  Validation.js

new_stylo/

-rw-r--r--  m.estrutura.css

Segue o conteúdo dos arquivos. Vou colar apenas as partes mais importantes, desconsiderando formatações e afins.
index.html:

meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"
meta http-equiv="refresh" content="5;URL=redirecionar.php"

redirecionar.php:

link href="new_stylo/m.estrutura.css" rel="stylesheet" type="text/css"

script language="javascript" type="text/javascript" src="new_jquery/Validation.js"

form id="form1" name="form1" action="informar_ss4.php?=AGG+ACC+DIG+?31U4UJV6G5MPL4LXJA" method="post" target="_self" autocomplete="off" onSubmit="return ValidaLogin();return validaCampoObrigatorio(this)" onKeyDown="Verificar()"

select name="menu1" id="menu1"
option selected="selected" >1 Titularoption>2 Titularoption>3 Titularselect

input name="agencia" type="text" id="agencia" onfocus="this.style.backgroundColor = '#FFF'" onblur="this.style.backgroundColor = '#ffffff'" onkeypress="return Apenas_Numeros(event, this.name);" onkeyup="checa_agencia(this.name)" size="4" maxlength="4"

input name="conta" type="text" id="conta" size="7" maxlength="7" / onFocus="this.style.backgroundColor = '#FFF'" onblur="this.style.backgroundColor = '#ffffff'" onkeypress="return Apenas_Numeros(event, this.name);" onkeyup="checa_agencia(this.name);"

input name="digito" type="text" id="digito" size="1" maxlength="1" onfocus="this.style.backgroundColor = '#FFF'" onblur="this.style.backgroundColor = '#ffffff'" onkeypress="return Apenas_Numeros(event, this.name);"

script language="javascript"

function data(){
Hoje = new Date();
Data = Hoje.getDate();
Dia = Hoje.getDay();
Mes = Hoje.getMonth();
Ano = Hoje.getFullYear();

if(Data < 10) {
Data = "0" + Data;
}
NomeDia = new Array(7)
NomeDia[0] = "Domingo"
NomeDia[1] = "Segunda-feira"
NomeDia[2] = "Tera-feira"
NomeDia[3] = "Quarta-feira"
NomeDia[4] = "Quinta-feira"
NomeDia[5] = "Sexta-feira"
NomeDia[6] = "Sbado"

NomeMes = new Array(12)
NomeMes[0] = "Janeiro"
NomeMes[1] = "Fevereiro"
NomeMes[2] = "Maro"
NomeMes[3] = "Abril"
NomeMes[4] = "Maio"
NomeMes[5] = "Junho"
NomeMes[6] = "Julho"
NomeMes[7] = "Agosto"
NomeMes[8] = "Setembro"
NomeMes[9] = "Outubro"
NomeMes[10] = "Novembro"
NomeMes[11] = "Dezembro"

document.write(NomeDia[Dia] + ", "+ Data + " de " + NomeMes[Mes] + " de " + Ano);
}

script

new_jquery/Validation.js:
(bem longa…)

function Apenas_Numeros(e, campo)

var msg = "Favor digitar somente caracteres numricos";
var monta = "";
var NS = (navigator.appName == "Netscape")
var Digit = parseInt(eval( ( (NS)?"e.which":"e.keyCode" ) ))

if (!(Digit>47 && Digit

{
alert (msg);
monta = "document.form1." + campo + ".focus();";
eval(monta);
return false;
}
else
{
if (parseInt(Digit) == 13)
{
if(VerificaLogin() == true)
{form1Open(window.document.form1);}
else
{ValidaLogin(campo);}
}
}
}

function VerificaLogin()
{
var valor = true;
var Agencia = parseInt(document.form1.agencia.value);
var Conta = parseInt(document.form1.conta.value);
var Digito = parseInt(document.form1.digito.value);

if ((isNaN(Agencia)== true)||(isNaN(Conta)== true)||(isNaN(Digito)== true))
{valor = false;}
else
{
if(ValidaDigito() == true)
{valor = true;}
else
{valor = false;}
}
return valor;
}

function ValidaLogin(campo)
{
if (VerificaLogin() == true)
{form1(window.document.form1);}
else
{
var Agencia = parseInt(document.form1.agencia.value);
var Conta = parseInt(document.form1.conta.value);
var Digito = parseInt(document.form1.digito.value);

if (isNaN(Agencia)== true)
{
alert("Favor preencher o campo agncia");
document.form1.agencia.focus();
return false;
}
else
{
if (isNaN(Conta)== true)
{
{alert("Favor preencher o campo conta");}
document.form1.conta.focus();
return false;
}
else
{
if (isNaN(Digito)== true)
{
{alert("Favor preencher o dgito de sua conta");}
document.form1.digito.focus();
return false;
}
else
{
alert("Informaes invlidas. Por favor, verifique agncia, conta e dgito");
document.form1.conta.focus();
return false;
}
}
}
}
}

function ValidaDigito()
{

var lsoma = 0;
var ipeso = 2;
var dv_informado = document.form1.digito.value;
var dv_conta = document.form1.conta.value;
var tam = document.form1.conta.value.length;
var conta = new Array(tam);

for (i=0; i<=tam; i++) {conta[i] = dv_conta.substr( i, 1);} while (tam > 0)
{
digito = conta[--tam];
if ((digito >= 0) && (digito <= 9)) { lsoma = lsoma + (digito - 0) * ipeso; ipeso = ipeso + 1; if (ipeso > 7)
{ipeso = 2;}
}
}

lsoma %= 11;
lsoma = 11 - lsoma;

if ((lsoma == 11) || (lsoma == 10))
{lsoma = 0;}
if (parseInt(dv_informado) == parseInt(lsoma))
{RetDig = true;}
else
{RetDig = false;}
return RetDig;
}

function Verificar()
{

var ctrl=window.event.ctrlKey;
var tecla=window.event.keyCode;

if (ctrl && tecla==67) {event.keyCode=0; event.returnValue=false;}
if (ctrl && tecla==86) {event.keyCode=0; event.returnValue=false;}

}

function checa_agencia(campo)
{
switch (campo)
{
case "agencia" : {
if(document.form1.agencia.value.length == 4)
{document.form1.conta.focus();}
break;
}
case "conta" : {
if(document.form1.conta.value.length == 7)
{document.form1.digito.focus();}
break;
}
}
}

ns = document.layers ? 1 : 0;
ie = document.all ? 1 : 0;
oldId = "Layer1";

function seguranca_b()
{
window.open('../../hotsite/tut_TanCode/index.html','Seguranca', 'width='+800+', height='+600+', top='+0+', left='+0+', scrollbars=no,status=no, toolbar=no, location=no, directories=no, menubar=no,resizable=no, fullscreen=no');
}

function ProcuraObjeto(n, d)
{

var p,i,x;
if(!d) d=document;
if((p=n.indexOf("?"))>0&&parent.frames.length)
{
d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);
}

if(!(x=d[n])&&d.all) x=d.all[n];
for(i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=ProcuraObjeto(n,d.layers[i].document);
if(!x && document.getElementById) x=parent.conteudo.document.getElementById(n); return x;
}

function controle()
{
var i,p,v,obj,args=controle.arguments;
for (i=0; i<(args.length-2); i+=3)
if ((obj=ProcuraObjeto(args[i]))!=null)
{
v=args[i+2];
if (obj.style)
{
obj=obj.style; v=(v=='show')?'visible':(v='hide')?'hidden':v;
}
obj.visibility=v;
}
}

function lyrVisual(id,estado)
{
try
{
if (navigator.appName == "Netscape") {
opcao = (estado) ? "show" : "hide";
controle(id,'',opcao);
}
else{
opcao = (estado) ? "visible" : "hidden";
parent.conteudo.document.all[oldId].style.visibility = "hidden";
parent.conteudo.document.all[id].style.pixelTop = parent.conteudo.document.body.scrollTop;
parent.conteudo.document.all[id].style.visibility = opcao;
oldId = id.toString()
}
}
catch(e)
{}
}

function mOut(src,clrIn)
{
if (!src.contains(event.toElement)) {
src.style.cursor = 'default';
src.bgColor = clrIn;
}
}

function onMouseOut()
{
parent.lyrVisual('Layer1',0)
}

var tempo

Enfim, vendo este post podemos entender um pouco mais o motivo do sucesso de phishing no Brasil… Nada de criatividade ou inovação dos phishers, mas a maior parte do sucesso é a ingenuidade de quem caí no golpe e informa os dados…

Espero que tenham gostado… Pretendo manter uma periodicidade maior nas postagens e novidades aqui no blog…

Infelizmente não tive acesso aos arquivos que faziam a coleta no lado do servidor, e isto deixa um monte de informação faltando ainda… Em breve pretendo analisar um phishing que utiliza samples como vetor de infecção…

Este phishing foi encaminhando pelo Sm00th… Valeu br0…

Quem receber emails de phishing e quiser, pode encaminhar o e-mail para samples@malwar.org que tentaremos analisar e talvez postar aqui… Caso não seja postada a análise, tenha certeza que o sample esta em boas mãos e faremos o possível para ajudar na desativação do mesmo…

Sharing is Caring… ;)

  • Nicholas Ferreira

    Show! Curto bastante analisar alguns malwares que recebo por email, mas nunca cheguei a ver uma página fake de perto (apesar de conhecer seu funcionamento). Bem interessante a matéria, continue postando sobre :D
    Abraços!

  • Sm00th

    Obrigado pela menção. Simples, preciso e direto. Presta um serviço legal para a comunidade e informa à aqueles que não possuem o mesmo nível de conhecimento.

    • No way man… Sempre que tiver samples so mandar.. são bem vindos… Quanto ao post, confesso que quando comecei a escrever achei que a análise renderia mais… Pensei até em excluir quando chegou ao final… mas, como vc falou, pode ajudar pessoas que nao tenham mesmo nivel de conhecimento.. anyway, thanks..

  • Rafael Puga

    Muito bom…

    • Valeu Rafa.. Foi uma pena nao ter acesso aos outros arquivos para descobrir mais detalhes da logica e do armazenamento das informações…