
Um sistema de entrega de payloads que incorpora payloads no arquivo de ícone de um executável!

Blenny é uma ferramenta de ofuscação de payload de prova de conceito para Windows que oculta dados de payload executáveis dentro do ícone do executável. O nome é uma referência ao blênio-dente-de-sabre, que imita o comportamento e a aparência de peixes limpadores para predar peixes desavisados.
Não me lembro exatamente como a história se passa, mas um hacker chamado retr0id (@DavidBuchanan314) levantou a ideia de ocultar um payload dentro do ícone de um executável. Devido a várias peculiaridades dos arquivos PNG — e como arquivos de ícone do Windows podem conter dados PNG — percebi que poderia implementar essa ideia com bastante facilidade; só precisaria de um pouco de esforço. Criei a biblioteca Facade — uma biblioteca com o propósito específico de gerar payloads em arquivos PNG — para exatamente esse fim.
O resultado final é um arquivo de payload compacto e um sistema de build que pode ser usado para personalizar um payload básico de dropper/executor para Windows.
O Blenny utiliza a biblioteca Facade para criar payloads a partir de arquivos de ícone. Portanto, ao obter o repositório, o submódulo (e seus submódulos) precisa ser inicializado:
$ git clone https://github.com/frank2/blenny.git
$ cd blenny
$ git submodule update --init --recursive
Isso deve ser tudo o que você precisa para inicializar o repositório para compilar.
Este projeto foi literalmente projetado pensando no CMake. Portanto, antes de compilar este projeto, é requisito absoluto que você obtenha e instale o CMake. Provavelmente não funcionará de outra forma (a menos que você esteja realmente dedicado a definir manualmente todas as definições do CMake por conta própria). Você também precisará de uma cópia do Visual Studio para compilar o projeto.
Este projeto faz uso de inúmeras variáveis do CMake para configurar o processo de build. Para obter um payload básico de demonstração, no qual um adorável amigo ovelha pousará na sua área de trabalho, execute o seguinte no diretório principal do projeto:
$ mkdir build
$ cd build
$ cmake -D BLENNY_ZTEXT_PAYLOAD=ON ../
$ cmake --build ./ --config Release
$ ./Release/blenny.exe
Por padrão, isso extrai um executável chamado blenny.exe do ícone do executável para o diretório temporário do usuário atual e, em seguida, o executa. O payload padrão é o DesktopPet de @AdrianoTiger, uma reconstrução dedicada do clássico esheep.exe dos anos 90.
Todas as variáveis que fazem isso acontecer são personalizáveis! Uma variável de payload (BLENNY_TRAILING_PAYLOAD, BLENNY_TEXT_PAYLOAD, BLENNY_ZTEXT_PAYLOAD ou BLENNY_STEGO_PAYLOAD) deve ser definida. Isso controla como o payload é eventualmente inserido no ícone. Consulte a biblioteca Facade para obter detalhes sobre essas técnicas. Por exemplo, para usar seu próprio payload, faça o seguinte:
$ cmake -D BLENNY_PAYLOAD_FILE="path/to/your/payload.exe" -D BLENNY_ZTEXT_PAYLOAD=ON ../
$ cmake --build ./ --config Release
Aqui está uma tabela com todas as opções de configuração que você pode definir, seus valores padrão e o que elas fazem.
| Flag | Tipo | Valor padrão | Finalidade |
|---|
| BLENNY_PAYLOAD_FILE | String | "${PROJECT_SOURCE_DIR}/res/defaultpayload.exe" | O payload a ser incorporado no arquivo de ícone. Nota: como a técnica de execução final é ShellExecuteA, este pode ser qualquer arquivo que possa ser iniciado pelo Explorer, como um script em lote! |
| BLENNY_ICON_FILE | String | "${PROJECT_SOURCE_DIR}/res/defaulticon.ico" | O ícone a ser usado para o executável e no qual o payload será incorporado. Nota: nem todos os ícones funcionarão! É necessária uma seção PNG no arquivo de ícone. Verifique os dados do ícone de destino em um editor hexadecimal para ver se uma imagem PNG está incluída! |
| BLENNY_TRAILING_PAYLOAD | Boolean | OFF | Habilita um payload de dados anexados no final do arquivo PNG do ícone. |
| BLENNY_TEXT_PAYLOAD | Boolean | OFF | Habilita um payload na seção tEXt do arquivo PNG do ícone. |
| BLENNY_ZTEXT_PAYLOAD | Boolean | OFF | Habilita um payload na seção zTXt do arquivo PNG do ícone, que é um payload tEXt compactado. |
| BLENNY_STEGO_PAYLOAD | Boolean | OFF | Habilita um payload esteganográfico no arquivo PNG do ícone. Nota: devido ao tamanho de imagem da maioria dos ícones ser limitado a 256x256, nem todos os payloads caberão nesta opção! |
| BLENNY_PAYLOAD_KEYWORD | String | "blenny" | Para payloads text/ztext, define a palavra-chave que rotula os dados do payload. |
| BLENNY_ADMIN | Boolean | OFF | Habilita a palavra-chave runas para executar o payload como administrador. |
| BLENNY_PATH | String | "%TEMP%" | O caminho para armazenar o payload antes da execução. As variáveis de ambiente são expandidas no momento da execução. |
| BLENNY_FILENAME | String | "blenny" | O nome de arquivo a ser atribuído ao payload após a extração. |
| BLENNY_RANDOM_FILENAME | Boolean | OFF | Habilita a geração de um nome de arquivo aleatório para o payload após a extração. |
| BLENNY_RANDOM_FILENAME_LENGTH | Integer | 8 | Ajusta o comprimento do nome de arquivo aleatório. |
| BLENNY_RANDOM_FILENAME_RANDOM_LENGTH | Boolean | OFF | Atribui um comprimento aleatório ao nome de arquivo após a extração. |
| BLENNY_PAYLOAD_ARGS | String | "" | Os argumentos a serem passados ao arquivo de payload na execução. |
| BLENNY_FILE_ATTRIBUTES | Integer | 0x80 (também conhecido como FILE_ATTRIBUTE_NORMAL) | Os atributos de arquivo a serem atribuídos ao arquivo no momento da criação. |
| BLENNY_CMD_SHOW | Integer | 5 (também conhecido como SW_SHOW) | A disposição visual do arquivo de payload na execução. Outro exemplo é SW_HIDE, que é 0. |