Hey guys… Vamos lá para mais uma análise… Se não a gente perde o ritmo novamente… haha…

Desta vez temos um sample para analisar… Recebi um phishing se passando pelo Ministério Público Federal com uma intimação bem engraçada… desta vez o cara não teve tanta sagacidade na construção do e-mail…

Veja o texto integral da intimação(vou postar em plain-text caso alguem use o tradutor):

—–

Intimacao de n. 7743872. O MINISTERIO PUBLICO FEDERAL, no desempenho de suas atribuicoes institucionais, com fundamento nos artigos 229 e 241, inciso VI da constituicao Federal e artigo 61 , inciso VII da lei complementar n, 676, de 28 de Maio de 1998, INTIMA Vossa Senhoria a comparecer nessa procuradoria Regional da Republica —

Data do comparecimento 16/01/2014 (Sexta feira) as 9:00 AM

—–

Mesmo sem conhecer as técnicas e funcionamento de um phishing, um usuário “sem dedo nervoso”, leria esta mensagem e independente dos artigos da lei(quem os pesquisaria só por que recebeu um e-mail?) iria ver que não há o local da procuradoria regional e a data para comparecer é 16 de janeiro de 2014.. hahaha.. 14.. O cara passou totalmente batido nessa… Isso é muito comum acontecer na época de mudança de ano com a maioria das pessoas… normalmente só se acostumam com o novo ano em fevereiro ou março… agora sei que a galera que cria phishing/malware também passa pelo mesmo problema ou será que isso foi algum template usado ano passado e o cara não atualizou?

A tela do e-mail:

phishing-email-recebido

O link para baixar o arquivo era: hxxp://www.georepp.com.br/site/images/Ministeiro.php

O Georepp é uma empresa de geologia, consultoria e construção de poços artesianos, que está atualmente com o site fora, provavelmente para manutenção(talvez devido a invasão relacionada ao phishing):

tela-site-original

Destaques do cabeçalho são estas linhas que mostram a forma de envio do phishing:

Received: from 127.0.0.1  (EHLO s17333737.onlinehome-server.info) (82.165.171.231)
  by mta1236.mail.ne1.yahoo.com with SMTPS; Fri, 09 Jan 2015 00:20:17 +0000
Received: by s17333737.onlinehome-server.info (Postfix, from userid 10009)
	id 14C30AF7099A; Fri,  9 Jan 2015 01:20:10 +0100 (CET)
To: xxxxxx@yahoo.com.br
X-PHP-Originating-Script: 10009:meu.php

Verificamos pelo PEiD que o executável esta sem packer, e pelo RDG vimos que está sem packer no código:

tela_no-packer

Ao usarmos o ExeinfoPE vimos que trata-se de um AutoIt:

exeinfope

SHA1 deste AutoIT: 66f8073817ab9bf994096bdbb1ff884e45fa7de9

Usamos o Exe2Aut para extrair o sample que provavelmente também possui proteção de VM, pois não executou em meu ambiente. Quanto tentei executa-lo na VM recebi a seguinte mensagem:

vm_detected

Após ter acesso ao fonte do malware vi que isto estava relacionado à detecção de VM como visto abaixo. Antes da função de vm_detect havia um timer talvez para evasão de sandbox e logo após havia a função.

Timer:

Sleep(40000)

Detecção de VM:

Func _isvirtualmachine()
Local $owmiservice = ObjGet("winmgmts:\\localhost\root\cimv2")
Local $ocolitems = $owmiservice.execquery("Select * From Win32_ComputerSystemProduct", "WQL", 48)
If IsObj($ocolitems) Then
For $oobjectitem In $ocolitems
If StringRegExp($oobjectitem.name, "(?i)VirtualBox|VMWare|Virtual PC") Then
Return 1
EndIf
Next
EndIf
Return SetError(1, 0, 0)
EndFunc

If (_isvirtualmachine() = 1) Then
MsgBox(64, "Erro", "Não foi possível executar o aplicativo.")
Exit
EndIf

Removi tanto o timer quanto a detecção de vm e compilei novamente o script gerando um novo arquivo .exe e em seguida executei-o.

Abaixo segue o uso de SeDebugPrivilege em disco:

Func _winapi_openprocess($iaccess, $finherit, $iprocessid, $fdebugpriv = False)
Local $aresult = DllCall("kernel32.dll", "handle", "OpenProcess", "dword", $iaccess, "bool", $finherit, "dword", $iprocessid)
If @error Then Return SetError(@error, @extended, 0)
If $aresult[0] Then Return $aresult[0]
If NOT $fdebugpriv Then Return 0
Local $htoken = _security__openthreadtokenex(BitOR($token_adjust_privileges, $token_query))
If @error Then Return SetError(@error, @extended, 0)
_security__setprivilege($htoken, "SeDebugPrivilege", True)
Local $ierror = @error
Local $ilasterror = @extended
Local $iret = 0
If NOT @error Then
$aresult = DllCall("kernel32.dll", "handle", "OpenProcess", "dword", $iaccess, "bool", $finherit, "dword", $iprocessid)
$ierror = @error
$ilasterror = @extended
If $aresult[0] Then $iret = $aresult[0]
_security__setprivilege($htoken, "SeDebugPrivilege", False)
If @error Then
$ierror = @error
$ilasterror = @extended
EndIf
EndIf
_winapi_closehandle($htoken)
Return SetError($ierror, $ilasterror, $iret)
EndFunc

e em memória:

Func __mem_openprocess($iaccess, $finherit, $iprocessid, $fdebugpriv = False)
Local $aresult = DllCall("kernel32.dll", "handle", "OpenProcess", "dword", $iaccess, "bool", $finherit, "dword", $iprocessid)
If @error Then Return SetError(@error, @extended, 0)
If $aresult[0] Then Return $aresult[0]
If NOT $fdebugpriv Then Return 0
Local $htoken = _security__openthreadtokenex(BitOR($token_adjust_privileges, $token_query))
If @error Then Return SetError(@error, @extended, 0)
_security__setprivilege($htoken, "SeDebugPrivilege", True)
Local $ierror = @error
Local $ilasterror = @extended
Local $iret = 0
If NOT @error Then
$aresult = DllCall("kernel32.dll", "handle", "OpenProcess", "dword", $iaccess, "bool", $finherit, "dword", $iprocessid)
$ierror = @error
$ilasterror = @extended
If $aresult[0] Then $iret = $aresult[0]
_security__setprivilege($htoken, "SeDebugPrivilege", False)
If @error Then
$ierror = @error
$ilasterror = @extended
EndIf
EndIf
DllCall("kernel32.dll", "bool", "CloseHandle", "handle", $htoken)
Return SetError($ierror, $ilasterror, $iret)
EndFunc

O arquivo sem as proteções e com o escalonamento de privilégios, simplesmente age como loader, baixando e executando um novo arquivo:

br0_http

O AutoIT se conecta ao IP 177.85.103.104 e faz o download de um arquivo data.jpg que é simplesmente o novo executável, como visto em mais detalhes no wireshark tanto pelo magic number quanto por algumas seções do PE:

loading

SHA1 do sample baixado: 3a68ec8d95f9f1c0665fd3b419ca61ae56e7a35a

Após o download do novo arquivo, o mesmo é adicionado à inicialização do sistema e monitora o acesso da vitima a sites de banco. No exemplo abaixo vemos uma tentativa de conexão ao C&C:

abrir_banco

assuero@malwar ~ $ host 187.79.5.147
147.5.79.187.in-addr.arpa domain name pointer 187-79-5-147.user.veloxzone.com.br.

Ao acessar algum site de banco, vemos diversos outros acessos simultâneos a este IP que o .exe “loadeado” está se conectando e pelo GeoIP vemos a origem:

malware_intercepta

…… Depois de quase dois meses ……

Cá estamos nós continuando o post, durante o Carnaval(quando eu tive tempo)…

Ao retomar a análise vi algumas coisas que mudaram… O AutoIT não consegue se conectar ao servidor para baixar o sample, porém ao executarmos o sample previamente baixado vi que o executável estabelece conexões com sucesso:

RAT2

O mesmo sample esta se comunicando com um novo servidor C&C:

RAT1

No início da conexão, são enviadas para o atacante informações do sistema local e uma senha(fucker0202#@), provavelmente para acesso do/no C&C:

fucker

Agora também podemos visualizar a checagem do C&C feita pelo malware e os avisos enviados ao acessar bancos(no teste abaixo acessei o Bradesco, Banco do Brasil e Itaú):

RAT3

…… Um longo inverno depois, continuando ……

Abaixo vemos o RDG informando que o arquivo usa o Obsidium:

Porém o ExeinfoPE e o PEiD nos dão informações diferentes(pra variar, esses caras nunca falam a mesma coisa…):

exeinfope_imadwm

peid_imadwm

Sabendo que se trata de um Delphi sem packer, antes de usar o DeDe, rodei o ResourceHacker para ver as imagens e seções do PE, porém as únicas imagens visíveis em Cursor e icon, estavam respectivamente relacionadas com cursor do mouse e o ícone do app. Em RCData haviam varias seções idênticas(e relacionadas com diversos bancos além do Bradesco… No caso abaixo ITAU),  porem não foi possível visualizar as imagens. Veja que o inicio da imagem em Picture.Data:

reshack_imadwm

Para reconstruir esta imagem, provavelmente seria necessário criar um projeto em delphi…

Vamos pelo mais prático se o que queremos é visualizar as imagens basta abrir o DeDe carregar o arquivo e depois de visualizar os forms e tudo mais, exportar o projeto e abrir pelo delphi… Certo? Sim.. Certo… Mas não neste caso pois o DeDe não mostrou nem as imagens nem os forms, e quando exportei para o delphi, nada feito tb:

dedeForm_imadwm

No Delphi, ao abrir o projeto:

delphiForm_imadwm

Como recurso final antes de partir pra um editor hexa ou criar um projeto no delphi, resolvi testar o PE Explorer que funcionou. Agora que já estamos chegando ao fim desta analise, quem já leu até aqui, prepara o saco porque vai ter uma chuva de telas… e olha que só peguei uma tela de cada banco, pois haviam varias telas do mesmo banco e varias outras do mesmo banco porém outro segmento. Depois da telada, uma rápida reflexão sobre este phishing…

Banco do Brasil:

pexpl_bb

Bradesco:

pexpl_bradesc

Caixa Econômica:

pexpl_cef

HSBC:

pexpl_hsbc

ITAU:

pexpl_itauUni

Santander:

pexpl_santa

Estes últimos são mais raros, mas mesmo assim “os truta” não liberam…

SICOOB:

pexpl_sicoob

SICREDI:

pexpl_sicred

Banrisul:

pexpl_banrisul

Existe possibilidade de conexão remota e monitoramento da vitima… Abaixo a parte de acesso remoto do sample:

Inicialmente o AutoIT detecta o IP local:

Func _getip()
Local $areturn, $bread, $sread
$bread = InetRead("http://checkip.dyndns.org/")
$sread = BinaryToString($bread)
$areturn = StringRegExp($sread, "(?s)(?i)Current IP Address: (.*?)", 3)
If @error = 0 Then
Return $areturn[0]
EndIf
$bread = InetRead("http://automation.whatismyip.com/n09230945.asp")
$sread = BinaryToString($bread)
If @error Then
Return SetError(1, 0, -1)
EndIf
Return $sread
EndFunc

Que é usado nas telas abaixo para conexão com o C&C:

IDR_1

No ResHacker vemos a senha coletada anteriormente no Wireshark:

RH_pass

Na tela abaixo vemos uma parte do código do botão  “conectar”:

IDR_2

 

E para finalizar minha simples reflexão:

Ataque bem mais “eficiente” que o phishing apenas via web sem download de sample.

Neste caso existe aviso ao atacante e conexão remota além das telas para “coleta” dos dados serem bem parecidas com as telas originais facilitando que até mesmo usuários com perfil mais um pouco mais avançado acabem caindo no golpe.

Também achei interessante a detecção de VM e o uso do SeDebugPrivilege para escalonar privilégios…

Mas o que fiquei mais impressionado é que devido correrias do dia-dia fiquei mais de 2 meses sem executar o sample e  após 2 meses.. sim isso mesmo, DOIS MESES o C&C ainda estava ativo recebendo comunicação das vitimas… Olhando no VT, muitos dos principais fabricantes já detectavam os samples como maliciosos, porém o C&C ainda estava ativo e quem tivesse o sample já ativo com AV desatualizado ou algo do tipo, fica vulnerável? Os fabricantes fazem o trabalho deles adicionando detecção aos samples e replicando essas assinaturas aos produtos de proteção de borda… Porém pensando no usuários final… O que falta para o CERT conseguir fazer takedowns mais rápido? Boa vontade ou a burocracia aqui é demais? Enfim, com essa situação só me lembro de uma imagem:

end

Link para download dos arquivos analisados(senha: malwar)