segunda-feira, 8 de novembro de 2010

Another look at bradesco3.exe part3

Introdução

O objetivo desta última parte na análise com o bradesco3.exe é olhar o código, como agora o malware foi "descompactado" é possível verificar o código de uma forma mais fácil. Verificando o código do malware é a melhor forma de ter certeza que a regra criada para detectá-lo foi realmente bem escrita, pois, dependendo do ambiente em que o malware está sendo executado pode não estar executando certas ações. Como este malware é relativamente simples, o que interessa nessa análise de código é descobrir se de alguma forma a URL é randômica ou estática, para que possamos possivelmente melhorar ou encontrar alguma falha na regra do snort criada para detectar a atividade de rede deste malware como mostrado neste post.

Analisando o código


Embora o mais comum seja utilizar um disassembler como o IDAPro, o OllyDBG me serviu para analisar este simples malware, além do que utilizei mais debugging do que realmente ler o código por completo. Além disso, optei por não utilizar um disassembler para Delphi.

Logo no inicio, endereco 0x00472874, vi uma string que já valeu o trabalho fazer o unpack do arquivo:



Deve ser algum stilo Restart de programar. Não faz sentido algom o uso desta string "EUATETEAMEIMASVOCENAOVALENADAMESMO".

Indo ao que interessa (URL), olhando as strings disponíveis após "descompactar" o malware, percebi que a URL e os parâmetros não estão em texto puro, provavelmente sendo gerados na execução. Entretanto, encontrei a string "http" em 0x0046F5B0 e colocando um breakpoint neste endereço percebi que a stack já tinha todos os parâmetros da URL.

00DEFF44 |00B096B8 ASCII "http://www.shanhaiichiba.com/banner_inc.php"
00DEFF48 |00B425B8 ASCII "PAL"
00DEFF4C |00B3AC08 ASCII "A6CECFCDC5BD"
00DEFF50 |00B09778 ASCII "&NOME="
00DEFF54 |00B493D8 ASCII "PWD"
00DEFF58 |00B3A828 ASCII "C4C1C4CFD3BD"
00DEFF5C |00B09738 ASCII "DADOS="
00DEFF64 |00B28358 ASCII "T=C&DADOS=PWD&NOME=PAL"

Portanto, em alguma função acima do endereço 0x0046F5B0, foi extraído a URL e os parâmetros, se observarmos "DADOS=" e "C4C1C4CFD3BD", 'D' = "C4", assim como 'A' = "C1" e 'O' = "CF", pois em "&NOME=" e "A6CECFCDC5BD" "CF" está na terceira posição assim como a letra "O".
Provavelmente, estes dois utilizam as mesmas funções para extrair os parâmetros da URL.
O início da função onde está 0x46F5B0 é o 0x0046F524 e colocando um breakpoint neste endereço, notei que esta função é chamada por 0x0046F721 e 0x0046F88E.



Ao verificar a função onde se encontra 0x0046F721 e percorrer a mesma a partir do início 0x0046F67C, notei que esta é a função responsável por extrair os parâmetros da URL:

"T=C&" hard-coded em:
0046F6AC PUSH bradesco.0046F7D8 ; ASCII "T=C&"

0046F6B9 CALL bradesco.0040658C

Retorno: EAX=00B3A828 ASCII "C4C1C4CFD3BD"

0046F6C4 CALL bradesco.0046DF34

Retorno: 00B09738 ASCII "DADOS="

0046F6CF MOV EAX,DWORD PTR DS:[EBX+48]
0x00B41D38 fixo "PWD"
0046F6D2 CALL bradesco.0046F1C4
Retorno: EBP-18 ASCII "PWD"

0046F6E2 CALL bradesco.0040658C
Retorno: 00B3AC08 ASCII "A6CECFCDC5BD"
0046F6ED CALL bradesco.0046DF34
Retorno: 00B09778 ASCII "&NOME="

0046F6FACALL bradesco.0046F988
Retorno: 00B425B8 ASCII "PAL"

0046F70A CALL bradesco.00404CCC
Retorno: 00B28358 ASCII "T=C&DADOS=PWD&NOME=PAL"

0046F712 MOV EAX,DWORD PTR DS:[4748FC]
DS:[004748FC]=0046F454
0046F454: ASCII "E8F4F4F0BAAFAFF7F7F7AEF3E8E1EEE8E1E9E9E3E8E9E2E1AEE3EFEDAFE2E1EEEEE5F2DFE9EEE3AEF0E8F0" 0046F717 CALL bradesco.0046DF34
Resultado: 00B096B8 ASCII "http://www.shanhaiichiba.com/banner_inc.php"

Embora a URL não esteja disponível em texto puro, ela não se modifica, hard-coded em 0x0046F454. Na função 0x0046F988, é utilizada a função GetComputerNameA para obter o hostname:
0046F9AC CALL 'JMP.&kernel32.GetComputerNameA ; \GetComputerNameA

Ajustando a regra

A atual regra para este malware é a seguinte:
alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:"Bradesco Malware Communication Detected (plugin.exe)"; flow:established; uricontent:"&DADOS=";http_client_body;content:"&NOME=";http_client_body; sid:100000000;rev:1; )

Basicamente, checamos a URI por &DADOS= e &NOME=. Porém, é possível que outras aplicações utilizem &NOME= e &DADOS= na URL, e conforme análise acima podemos também confirmar que a URL em sí e T=C& são fixos, o ideal da URL é adicionar na blacklist de um proxy, portanto apenas adicionando T=C& na regra pode ajudar a diminuir os possívels falsos-positivos.

alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:"Bradesco Malware Communication Detected (plugin.exe)"; flow:established; uricontent:"T=C&DADOS=PWD&NOME=";http_client_body; sid:100000000;rev:1; )

Conclusão

Na prática, dificilmente um malware como este levaria a esta análise, porém serviu apenas para demonstrar a importância de verificar o código, pois, embora não tenha detectado alguma atividade diferente da já analisada, foi possível atualizar a regra, diminuindo possíveis falsos positivos.