BumbleCrypt
Um Crypter inspirado no Bumblebee
Contexto
O BumbleCrypt é inspirado no crypter do Bumblebee. No caso do Bumblebee, a DLL principal do Bumblebee é carregada na memória e executada da seguinte forma:
- Descriptografa e grava o payload na Heap
- Faz hook em três NtApi's - NtOpenFile, NtCreateSection e NtMapViewOfSection
- Chama LoadLibraryW("gdiplus.dll"), o que aciona os hooks inline, pois as três APIs acima são usadas por LoadLibrary() para carregar qualquer biblioteca.
- Os hooks inline e o próprio LoadLibrary então carregam a DLL principal do Bumblebee no lugar de "gdiplus.dll"
- Por fim, o controle é transferido para a função exportada "SetPath" da DLL principal do Bumblebee
Funcionamento do BumbleCrypt
Ao analisar o crypter do BumbleBee, percebi que a DLL descriptografada poderia ser carregada com apenas um hook inline em "NtMapViewOfSection" em vez de três hooks inline usados no Crypter do Bumblebee.
Como resultado, o "BumbleCrypt" foi desenvolvido.
O BumbleCrypt:
-
O BumbleCrypt primeiro carrega um recurso criptografado da seção .rsrc e então descriptografa o payload final da DLL: res criptografada -> decode Base64 -> descriptografia Rc4 -> descriptografia xor
-
O Crypter utiliza a Heap para armazenar o payload da DLL descriptografada, assim como o crypter do Bumblebee
-
Quando o payload final é descriptografado, o BumbleCrypt faz hook na NtApi "NtMapViewOfSection", que é usada para mapear uma visão da seção no espaço de endereçamento virtual.
-
Em seguida, o BumbleCrypt chama LoadLibraryW("msimg32.dll"). Agora vamos entender como o hook inline é acionado:
- O LoadLibraryW() primeiro chama NtOpenFile para obter o handle do módulo passado como argumento
- Em seguida, cria um objeto de seção com o handle do módulo usando NtCreateSection
- Agora, uma vez que a seção foi criada, o LoadLibrary chama NtMapViewOfSection para mapear a visão de uma seção na memória
- Aqui nosso hook em NtMapViewOfSection é acionado, onde a função proxy executa as seguintes ações:
- Primeiro, remove o hook de NtMapViewOfSection
- Cria uma seção do tamanho necessário usando NtCreateSection()
- Em seguida, mapeia a visão da seção criada no espaço de endereçamento virtual usando NtMapViewOfSection (com o hook removido anteriormente)
- Por fim, mapeia manualmente a DLL final previamente descriptografada no endereço base da seção mapeada em memória e então retorna NTSTATUS_SUCCESS para o LoadLibraryW e sai da função proxy
- O LoadLibraryW então recebe o NTSTATUS_SUCCESS como resposta ao NtMapViewOfSection e o endereço base da seção mapeada em memória onde a DLL maliciosa descriptografada está na memória. Além disso, o LoadLibrary carrega a DLL de acordo com os valores de retorno; o resultado é que o msimg32.dll pode ser visto nos módulos carregados, mas aponta para o payload descriptografado. Em seguida, o Crypter transfere o controle para a DLL descriptografada executando a função exportada "CallPath".
-
Agora, se observarmos a captura de tela dos módulos carregados do BumbleCrypt, podemos ver que ela contém o "msimg32.dll", mas o endereço base aponta para o Payload Malicioso Descriptografado.
Captura de tela


PoC - BumbleCrypter

Muito obrigado! Espero que tenham gostado =D Tchau.
Você pode entrar em contato comigo no Twitter se tiver comentários ou feedback
Twitter: https://twitter.com/knight0x07
Nota
Apenas para fins educacionais. É um projeto pessoal de fim de semana =)