[QuickNote] Descriptografando a configuração C2 do Warzone RAT
[QuickNote] Descriptografando a configuração C2 do Warzone RAT
Publicado: 25 de março de 2023 em Meus tutoriais , [QuickNote] Descriptografando a configuração C2 do Warzone RATTags: IDA , Malware Analysis , RAT , ReverseEngineering , WarzoneRAT
1. Introdução
Warzone RATé um tipo de malware capaz de se infiltrar no computador da vítima e fornecer aos invasores acesso remoto e controle sobre o sistema. O malware ganhou notoriedade por seus recursos avançados e capacidade de evitar a detecção, tornando-se uma séria ameaça à segurança do computador.
O Warzone RAT normalmente se espalha por e-mails de phishing ou outras técnicas de engenharia social, nas quais os invasores induzem as vítimas a baixar e instalar o malware em seus sistemas. Depois que o malware é instalado, ele pode executar uma variedade de ações maliciosas, incluindo roubo de senhas, captura de tela e registro de teclas digitadas. Ele também pode baixar e executar malware adicional, dando aos invasores ainda mais controle sobre o sistema da vítima.
Um dos principais recursos do Warzone RAT é sua capacidade de criptografar seus dados de configuração, tornando difícil para os especialistas em segurança analisar e entender como o malware opera.Atualmente, existem duas variantes do malware em circulação, cada uma usando um método diferente para decodificar sua configuração. A primeira variante usa criptografia RC4 padrão, enquanto a segunda variante usa uma versão modificada do RC4. Essa modificação torna ainda mais desafiador descriptografar e analisar os dados de configuração do malware.
2. Análise
Sample1: 00930cccd81e184577b1ffeebf08ee6a32dd0ef416435f551c64d2bcb61d46cf (use RC4 padrão)
Sample2: 61f8bf26e80b6d6a7126d6732b072223dfc94203bb7ae07f493aad93de5fa342 (use RC4 modificado)
No Warzone RAT, as informações de configuração são armazenadas na .bss
seção PE do código do malware. A .bss
seção é normalmente usada para armazenar dados não inicializados. O formato da configuração é o seguinte: [Key length] [RC4 key] [Encrypted data]
. Abaixo está uma ilustração da configuração armazenada na .bss
seção em ambos os exemplos.
As etapas para executar o processo de recuperação de informações e cópia de dados do.bss
seção para a memória são os mesmos em ambas as amostras. O pseudo-código é mostrado abaixo:
O pseudocódigo em função wzr_decrypt_config
em ambas as amostras é o mesmo, o que envolve extrair a chave RC4 e os dados criptografados e, em seguida, usar o RC4 para descriptografar a configuração. A diferença está na função wzr_perform_rc4
.
A função wzr_perform_rc4
no exemplo 1 usa RC4 padrão para descriptografar a configuração. Seu pseudocódigo é mostrado abaixo:
Assim, podemos facilmente usar o CyberChef para executar a decodificação de configuração ou escrever um script Python para automatizar amostras semelhantes.
O pseudocódigo para a função wzr_perform_rc4
no exemplo 2, conforme mostrado abaixo. Antes da descriptografia, ele aloca uma matriz de 250 bytes, preenchida com valores zero. Em seguida, copia o extraídorc4_key
nesta matriz. Finalmente, ele chama a wzr_rc4_crypt
função, que usa oRC4 modificadoalgoritmo para descriptografar a configuração.
O pseudocódigo completo dowzr_rc4_crypt
função é a seguinte:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | void __thiscall wzr_rc4_crypt(wzr_rc4_data *rc4_info, _BYTE *data) { idx = 0; if ( rc4_info->rc4Sbox ) { if ( rc4_info->rc4_key_250b ) { rc4_info->counter2 = 0; LOBYTE(i) = 0; rc4_info->counter1 = 0; do { rc4_info->rc4Sbox[i] = rc4_info->counter1; i = rc4_info->counter1 + 1; rc4_info->counter1 = i; } while ( i < 256 ); rc4_info->counter1 = 0; for ( i = 0; i < 256; rc4_info->counter1 = i ) { rc4Sbox = rc4_info->rc4Sbox; rc4_info->counter2 += rc4Sbox[i] + rc4_info->rc4_key_250b[i % 250]; rc4Sbox[i] ^= rc4Sbox[rc4_info->counter2]; // swap values rc4_info->rc4Sbox[LOBYTE(rc4_info->counter2)] ^= rc4_info->rc4Sbox[LOBYTE(rc4_info->counter1)]; rc4_info->rc4Sbox[LOBYTE(rc4_info->counter1)] ^= rc4_info->rc4Sbox[LOBYTE(rc4_info->counter2)]; i = rc4_info->counter1 + 1; } rc4_info->counter1 = 0; rc4_info->counter2 = 0; // Decrypt data if ( rc4_info->data_length ) { j = 0; do { rc4_info->counter1 = j + 1; rc4Sbox = rc4_info->rc4Sbox; k = (j + 1); rc4Sbox_value1 = rc4Sbox[k]; rc4_info->counter2 += rc4Sbox_value1; rc4Sbox_value1_ = rc4Sbox_value1; rc4Sbox_value2 = rc4Sbox[rc4_info->counter2]; rc4Sbox[k] = rc4Sbox_value2; rc4_info->rc4Sbox[LOBYTE(rc4_info->counter2)] = rc4Sbox_value1; rc4Sbox_ = rc4_info->rc4Sbox; data[idx] ^= rc4Sbox_[(rc4_info->counter2 + rc4Sbox_value2)] ^ (rc4Sbox_[(rc4Sbox_value2 + rc4Sbox_value1_)] + rc4Sbox_[(rc4Sbox_[((0x20 * rc4_info->counter2) ^ (rc4_info->counter1 >> 3))] + rc4Sbox_[((0x20 * rc4_info->counter1) ^ (rc4_info->counter2 >> 3))]) ^ 0xAA]); j = ++rc4_info->counter1; ++idx; } while ( idx < rc4_info->data_length ); } } } } |
Com o pseudocódigo acima, podemos reescrever o código de decodificação em Python da seguinte maneira. Este é o código que escrevi e você pode escrevê-lo à sua maneira, desde que execute a tarefa corretamente.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | def SIGNEXT(x, b): m = ( 1 << (b - 1 )) x = x & (( 1 << b) - 1 ) return ((x ^ m) - m) # This routine is responsible for decrypting the stored C2. def rc4_customized_decryptor(data, key): idx = 0 counter1 = 0 counter2 = 0 # Initialize RC4 S-box rc4Sbox = list ( range ( 256 )) # Modify RC4 S-box for i in range ( 256 ): counter2 + = (rc4Sbox[i] + key[i % 250 ]) counter2 = counter2 & 0x000000FF rc4Sbox[i] ^ = rc4Sbox[counter2] rc4Sbox[counter2 & 0xFF ] ^ = rc4Sbox[counter1 & 0xFF ] rc4Sbox[counter1 & 0xFF ] ^ = rc4Sbox[counter2 & 0xFF ] counter1 = i + 1 # Decrypt data counter1 = 0 counter2 = 0 j = 0 decrypted = [] while (idx < len (data)): counter1 = j + 1 k = (j + 1 ) rc4Sbox_value1 = rc4Sbox[k] counter2 + = (SIGNEXT(rc4Sbox_value1, 8 ) & 0xFFFFFFFF ) rc4Sbox_value1_ = (SIGNEXT(rc4Sbox_value1, 8 ) & 0xFFFFFFFF ) rc4Sbox_value2 = rc4Sbox[counter2 & 0x000000FF ] rc4Sbox[k] = rc4Sbox_value2 rc4Sbox[(counter2 & 0x000000FF )] = rc4Sbox_value1 tmp1 = rc4Sbox[(( 0x20 * counter1) ^ (counter2 >> 3 )) & 0x000000FF ] tmp2 = rc4Sbox[(( 0x20 * counter2) ^ (counter1 >> 3 )) & 0x000000FF ] tmp3 = rc4Sbox[((tmp1 + tmp2) & 0x000000FF ) ^ 0xAA ] tmp4 = rc4Sbox[(rc4Sbox_value2 + rc4Sbox_value1_) & 0x000000FF ] tmp5 = (tmp3 + tmp4) & 0x000000FF tmp6 = rc4Sbox[(counter2 + rc4Sbox_value2) & 0x000000FF ] decrypted.append(data[idx] ^ (tmp5 ^ tmp6)) counter1 + = 1 j = counter1 idx + = 1 return bytes(decrypted) |
Abaixo estão os resultados do uso de um script Python para extrair a configuração do Warzone RAT dos exemplos usados no artigo.
3. Fim
O artigo gostaria de concluir aqui. Espero que ele forneça informações úteis para você durante o processo de análise do malware Warzone RAT. Para se proteger contra o Warzone RAT e outros tipos de malware, os usuários devem tomar precauções, como ser cautelosos ao abrir anexos de e-mail, usar senhas fortes e manter o software atualizado. Também é importante usar um software antivírus e mantê-lo atualizado regularmente. Ao seguir essas etapas, os usuários podem ajudar a se proteger contra a ameaça do Warzone RAT e outros tipos de malware.
4. Referências
https://research.openanalysis.net/warzone/malware/config/2021/05/31/warzone_rat_config.html
https://exploitreversing.files.wordpress.com/2022/11/mas_6-1.pdf
Comentários
Postar um comentário