“Decoding” de malware na unha
Há alguns meses fiz um blogpost para a Trend Micro onde expliquei um processo de ofuscação em um malware e recebi um feedback bem legal da comunidade de segurança. Hoje quando estava pesquisando alguns ataques que estavam ocorrendo em tempo real descobri uma CC que estava com cerca de 8800 máquinas infectadas e infelizmente não tirei print na hora sendo que posteriormente o atacante (ou não) apagou a fila. Atualmente está com apenas 1295 registros de ataque.
Particularmente acho muito divertido entender como um algoritmo de ofuscação é criado por um atacante e sempre que posso estou tentando entende-los. Hoje irei explicar como foi o processo de quebra do encode encontrado no malware responsável pelas infecções acima.
Iremos brincar com a linguagem VB, muito comum entre as ameaças no underground brasileiro.
Imagem de parte do código do malware escrito em Visual Basic.
O atacante tentou ofuscar algumas strings guardadas em variáveis utilizando duas funções sendo elas: Shiriuuxx e andromedaxx. (Nome divertidos, não ?)
sCrf = shiriuuxx(andromedaxx(“›œ@•c¥@Ú@Þ@ßÓË“¬çË@Ù×@Æ”))
Um exemplo para entendermos melhor. Tradução: binary_getter/1.0 (User Agent)
Um outro ponto que me chamou atenção foi a variável “sAv” que ao meu ver deve ser utilizada para modificações do hash do arquivo com o intuito de bypassar alguns AV do mercado.
Mas como funcionam essas funções ?
O funcionamento do algoritmo é bem simples, coloquei comentado na imagem abaixo.
O processo basicamente é:
1 – Retirar os “@” das strings
2 – Selecionar um caractere de uma string. Ex: “A” é transformado em decimal assumindo o valor de 65.
3 – Selecionar o primeiro caractere da variável “key” (knd43uj) e tranforma-lo em em decimal. k = 107
4 – Diminuir o 65 do 107 e usar a função chr para transformar o número em char.
CÓDIGO:
Function andromedaxx(Str) -> ‘Começo da função onde é passado o argumento “STR” que serão as strings como: Ý£@Úcc@¦á@ØÐÈ@ª@b¬@›œ•@k@a@£™@ž”f@b@¤@¤Û@â@Øœ
str = Replace(str,”@”,””) -> ‘Processo de Replace onde é substituido todos os arroba “@” por nada, pegando o exemplo acima ficaria: Ý£Úcc¦áØÐȪb¬›œ•ka£™ž”fb¤¤ÛâØœ
‘str = Replace(str,”%”,””) -> ‘Comentário do criado do malware
andromedaxx = str -> Andromedaxx recebe o STR
End Function -> Final da função
Function shiriuuxx(str) -> ‘Começo da função com o mesmo argumento
Dim scumaru, lenKey, KeyPos, LenStr, x, Newstr, y1, y2 -> ‘Declaração de variáveis que serão utilizadas.
Newstr = “” -> ‘Variável vazia para controle posterior da concatenação das letras
lenKey = Len(key) -> ‘Consulta tamanho da variável Key = 7. key = “knd43uj”
KeyPos = 1 -> ‘Declaração de variável para controle de posição na key.
LenStr = Len(Str) -> ‘Consulta tamanho da string a ser desofuscada. Ex: sRolex = shiriuuxx(andromedaxx(“×ÛØœaØ”)) = 6
str=StrReverse(str) -> ‘Reverter a string para confundir quem está analisando. Ou seja, uma string que seria: ×ÛØœaØ passa a ser ØaœØÛ×
For x = LenStr To 1 Step -1 -> ‘Faz um “for” ao contrário, começando do × e depois Û e assim por diante.
y1 = asc(Mid(str,x,1)) -> ‘Pega a última letra da string e converte para decimal.
y2 = Asc(Mid(key,KeyPos,1)) -> ‘Pega a primeira letra da key e converte para decimal.
Newstr = Newstr & chr(y1 – y2) -> ‘Subtrai a ultima letra em decimal da string com a primeira letra em decimal da chave e concatena na variável Newstr (Que anteriormente não tinha nada.)
KeyPos = KeyPos+1 -> ‘Adiciona 1 ao KeyPos para controle da chave
If KeyPos > lenKey Then KeyPos = 1 -> ‘Se a posição da key for maior que o tamanho da key, é resetada a variável para continuar o processo.
Next -> ‘Termina o Loop
Newstr=StrReverse(Newstr) -> ‘Faz o reverso do resultado salvo em Newstr
scumaru = Newstr -> ‘Scumaru recebe Newstr
shiriuuxx = scumaru -> ‘shiriuuxx recebe scumaru
End Function -> Fim da função
É claro que no meio do caminho houve várias pegadinhas para solucionar e isso transformou o desafio em algo realmente divertido.
Meu amigo Pr0teus entrou na brincadeira e codou um script em python para desofuscar o código. Eu codei um em C mas por falta de tempo está com alguns bugs, quem resolver eu posto o nome e código aqui. Pode me enviar por e-mail: igrrincon{14,69 quilogramas}gmail{dot}com
Code em C para desofuscar: https://github.com/m4dw0lf/Scripts/blob/master/MalwareCdesofuscator.c
Code em Python para desofuscar: https://github.com/m4dw0lf/Scripts/blob/master/MalwarePythonDesofuscator.py
Greetz pro meu brother DMR (Ygor) que deu um help no C.
Aparentemente a campanha de malware começou em setembro por volta do dia 16. No malwr.com tem uma sample com code parecido.
Informações do arquivo analisado:
Anexo_Imagem4772.vbs – B6CD6F53B9CD3A52F8E8356EFDCE1C84
Download do PE (Greetz Robertux):
Possíveis variantes:
f60cf9502abe159ee20dc515285869fa
6ae4a668a52ecff8eb4c7add5f13d0e8
adb87419a321999daa96896c1c1fb568
88a22014f2e83fa244f6dc6dc30a23da
150b1305d59394dd6d48dd126a10e7c0
Talvez em um futuro próximo eu mostre a análise que fiz dos PE baixados pelo VB Downloader.
Espero que tenham gostado.
Igor Rincon – a.k.a M4dwolf