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
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:
Mas como percebe-se, está 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:
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:
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:
Clicamos e colocamos uma informação mais ou menos “verídica”, chegando à próxima tela que solicita a senha de 4 dígitos:
Após inserida a senha, continuam as solicitações de dados pessoais:
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:
Mesmo se houverem estas telas de erro tão mal feitas:
Ao alterar e avançar, mais coleta de dados:
Fiquei surpreso de não haver validação na logica do cartão. Ao pressionar OK, chegamos à tela final:
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… ;)