Estranho malware que se esconde no Registro

Esta semana eu me deparei com um malware usando uma técnica da qual eu sequer tinha ouvido falar. Encontrei na máquina do cliente uma dezena de arquivos com um conteúdo similar a este:

Você consegue entender só de olhar esse código o que ele está fazendo? Eu lamento dizer que eu não consegui, porque a partir da linha seguinte ao FOR eu não fazia a mínima idéia do que se passava, mesmo depois de ler o código umas dez vezes. Eu tive que consultar a chave do Registro que ele tentou obfuscar nos primeiros comandos SET (HKCU\Software\Microsoft) para entender que o que esses últimos comandos fazem é montar um script em uma única linha a partir do conteúdo maliciosamente armazenado lá e lido linha por linha pelo comando FOR. Script esse que é executado no final.

O real código do malware estava escondido no Registro, ligeiramente obfuscado. Só consegui entender que parecia se tratar de um script Powershell.

Eu enviei uma amostra do .bat para o Virustotal e nenhum dos 58+ mecanismos antivírus lá pôde detectar o código como malicioso, o que não me surpreendeu. Um humano é capaz de detectar porque pelo nome, localização e conteúdo do .bat fica evidente que o propósito é malicioso, mesmo que você leia 10 vezes o que está escrito e não consiga decifrar o que ele faz. Mas para uma máquina o código realmente deve parecer inofensivo.

Como nenhum antivírus pôde me dar uma pista do que se tratava (e o AVAST estava em execução nessa máquina) e eu não sabia como mandar uma amostra do código oculto no Registro, eu me limitei a apagar o código no Registro e todos os arquivos suspeitos que encontrei criados ou modificados desde a data que eu deduzi para a infecção.

Eu fui então checar o quanto esconder malware no Registro é comum e para minha surpresa desde 2014 existem até modos de fazer isso sem criar nenhum arquivo para chamar atenção. Eu suponho que todos esses métodos usem exploits que já foram eliminados por atualizações do Windows ou são facilmente localizados por antivírus porque senão eu já teria conhecimento dessa praga há muito mais tempo.

O malware também cria outro tipo de .bat, mas como esse é detectado pelo Avira (o único dos mecanismos do Virustotal que o reconhece) eu não posso publicá-lo aqui como texto na integra ou meu blog será marcado como malicioso então vou transcrever uma versão ligeiramente re-obfuscada dele:

 

Você consegue entender o que raios isso faz? Tirando o fato de que não executa se o o Aplicativo Itaú não estiver instalado na máquina e montar uma looonga linha de código obfuscado, não faço a menor idéia, mas o Avira chama de TR/PowerShell.Gen

5 comentários
  • jonni - 20 Comentários

    ja tinha visto, mas não com script powershell

  • Vinicius - 1 Comentário

    Nunca vi nada parecido, mas gostei do desafio…

    Primeiro ele cria uma var que eh um vetor de caracteres chamado UznjZq com o valor:

    GXCMJeQujkUKpbDEfSz5drPWIHl09o62qTNOa7Rv4wV83mBnyixAhYtFZgsL1c

    Depois ele monta o script ‘sistema’ utilizando índices para cada caractere no vetor. %UznjZq:~49,1% seria a substring de 1 char a partir da posição 49, ou seja, ‘i’.

    Traduzindo o começo, temos:

    iex(New-Object

    onde iex parece ser ‘Invoke-Expression’ , uma forma de executar comandos.

  • Ivan Neves - 2 Comentários

    Com relação ao primeiro script, aqui vai meu entendimento/colaboração:

    Até a linha 6 é tranquilo, onde é criado a variável de ambiente uclu3ixhy e é atualizada nas linhas 4, 5 e 6, tendo como valor final a string “HKCU\Software\Microsoft”, depois daí realmente fica nebuloso (kkkk), mas vamos lá:

    É criado a variável de ambiente di5bupl2q sem valor, que terá seu valor definido dentro do laço FOR.

    No laço FOR é executado o comando “REG QUERY %uclu3ixhy%”, (que nesse caso o comando explicito é: REG QUERY HKCU\Software\Microsoft), que tem a finalidade de retornar todas as subchaves da chave “HKCU\Software\Microsoft”.

    O parâmetro usebackq é para envolver entre aspas o nome da subchave, com a finalidade de pegar o nome completo dela, mesmo que tenha espaços em branco no nome.

    O parâmetro tokens=1,2* faz um split (divide) do nome da subchave encontrada, utilizando os espaços em branco para dividir, e armazena cada parte em variáveis temporárias %1 %2, e por causa do asterisco “*”, será criado, se necessário, as variáveis %3, %4 e assim sucessivamente, conforme a quantidade de espaços em branco

    ***O comando Set hvliceagt=%%11 armazenará o valor da 11ª parte na variável hvliceagt.

    O comando IF “!hvliceagt:~0,10!”==”w2g6w2cmf-“ testa se os 10 primeiros caracteres da variável hvliceagt é igual a string “w2g6w2cmf-“, e caso seja igual, o valor da variável di5bupl2q (que foi criada na linha 7 antes do FOR) irá receber o valor dela mesma (que está em banco), mais o valor da 3ª parte da subchave encontrada (Set di5bupl2q=!di5bupl2q!%%3)
    E na última linha o conteúdo da variável di5bupl2q (que eu não faço ideia do que seja) é executado.

    ***Aqui tem uma curiosidade interessante: caso a subchave encontrada não tenha 11 partes, será armazenado o valor da 1ª parte, concatenada com o número 1
    Ex.: subchave encontrada: “HKCU\Software\Microsoft\Active Setup”
    Valor que será armazenado na variável hvliceagt: “HKCU\Software\Microsoft\Active1”

Deixe um comentário para Jefferson Cancelar resposta

Você pode usar estas tags HTML

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

  

  

  

:) :( ;) O_o B) :lol: :huh: :S :D :-P 8-O :yahoo: :rtfm: :dashhead1: :clapping: more »