Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
Tourmaline — Notas de engenharia reversa, código-fonte desofuscado, IOCs e regras YARA para o RAT Python Tourmaline ClickFix, abrangendo seu túnel DNS e C2 de dead-drop em blockchain. | Kitploit
Ferramentas/GitHubGitHub/v-pun215/tourmaline
Gerenciamento de Indicadores de Comprometimento (IOC)Engenharia ReversaAnálise de MalwareForensia DigitalCriptografiaComando e ControleInteligência de AmeaçasAprendizado e EducaçãoResposta a IncidentesAnálise de DNS
GitHubv-pun215/tourmaline
410há 1 diaAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →

Tourmaline

Notas de engenharia reversa, código-fonte desofuscado, IOCs e regras YARA para o RAT Python Tourmaline ClickFix, abrangendo seu túnel DNS e C2 de dead-drop em blockchain.

Ver Repositório
Compartilhar

Tourmaline

Recentemente me deparei com um malware habilmente projetado que se autodenomina "Torumaline".

Este README foi gentilmente escrito pelo Claude, pois eu estava extremamente ocupado com provas no momento da criação deste repositório.

Explorar e descriptografar este malware consumiu uma enorme parte do meu tempo de preparação para matemática!

Leia o post do blog!

APENAS PARA FINS EDUCACIONAIS E DE PESQUISA
Todas as amostras são fornecidas para análise de malware e pesquisa defensiva. Não execute fora de um ambiente isolado (sandbox) e sem conexão com a rede.


Visão Geral

Tourmaline (Tourmaline.exe) é um infostealer/backdoor sofisticado e multiestágio para Windows, distribuído por meio de uma campanha ClickFix — um popup falso de "Verifique se você é humano" do Cloudflare que engana os usuários para executarem manualmente um comando ou instalador malicioso.

O binário é um instalador customizado do Inno Setup 6.7.0 (Revisão 2, offsets de 64 bits) que inclui um runtime completo do Python 3.11 e dois estágios de payload Python ofuscado. Ele estabelece um backdoor persistente com:

  • C2 por DNS tunneling sobre a porta UDP 53 (disfarçado como consultas a microsoft.com)
  • Dead-drop em blockchain Ethereum para distribuição de IP do C2 (testnet Sepolia)
  • Canal de execução de tarefas criptografado com ChaCha20
  • Comandos assinados com para impedir sinkholing
ECDSA
  • Time-lock anti-sandbox (contagem regressiva de 100M iterações, contornável em O(1))

  • Estrutura do Repositório

    root@kitploit:~
    tourmaline/
    ├── README.md                  # Este arquivo
    ├── LICENSE                    # Licença de uso para pesquisa
    ├── .gitignore
    │
    ├── src/                       # Código-fonte extraído e desofuscado
    │   ├── stage1_loader.py       # Estágio 1: Loader original ofuscado com XOR time-lock (main.py)
    │   ├── stage2_backdoor.py     # Estágio 2: Backdoor principal desofuscado (de QGBdu.dxf)
    │   └── decrypt_payload.py     # Utilitário: Recuperação de chave O(1) e descriptografia do payload
    │
    ├── iocs/                      # Indicadores de Comprometimento
    │   ├── indicators.json        # Dados de IOC estruturados (IPs, hashes, domínios, registro)
    │   ├── indicators.csv         # CSV plano para importação em SIEM
    │   └── rules.yar              # Regras de detecção YARA
    │
    └── samples/                   # Amostras de malware (protegidas por senha)
        ├── README.md              # Instruções do arquivo de amostras
        ├── Tourmaline_sample.zip  # Senha: infected - contém Tourmaline.exe
        └── QGBdu.dxf             # Blob bruto criptografado do Estágio 2
    

    Vetor de Infecção

    O malware é distribuído via ClickFix — uma técnica de engenharia social em que um site comprometido ou controlado pelo atacante sobrepõe uma página falsa de CAPTCHA do Cloudflare ou de verificação do navegador. A sobreposição instrui a vítima a:

    1. Pressionar Win+R
    2. Colar um comando (copiado para a área de transferência pelo JavaScript da página)
    3. Pressionar Enter

    O comando colado baixa e executa silenciosamente Tourmaline.exe. O instalador é executado com /VERYSILENT /SUPPRESSMSGBOXES /NORESTART.


    Formato do Binário

    PropriedadeValor
    Nome do arquivoTourmaline.exe
    Tamanho11.341.339 bytes (~10,8 MB)
    MD5b74ac808dea2de31caf024310694ef0c
    SHA256c9b390b3b7148f549df86503858d52e030b2b5e78fed0bc525ded5927f9265d6
    FormatoInno Setup 6.7.0 Unicode (Revisão 2, offsets de 64 bits)
    Tipo PEPE de 32 bits, 11 seções
    Tamanho do overlay10.447.387 bytes
    Offset do magic do Inno0xD9864 (890.148 bytes)
    Nome do appTourmaline
    Versão do app2.63.519
    GUID do app{2C25872D-85FC-44C7-9B16-844E39E50A44}
    Caminho de instalação{commonappdata}\Tourmaline
    Runtime incluídoPython 3.11 (embed completo)
    Arquivos de payload36 arquivos em stream LZMA2 sólido

    Nota: O innoextract 1.9 padrão não consegue extrair este binário — ele só suporta a Revisão 1. A Revisão 2 usa offsets de 64 bits e requer parsing customizado (veja src/decrypt_payload.py).


    Fluxo de Execução

    root@kitploit:~
    Tourmaline.exe
    │
    ├─ Instalador Inno Setup é executado silenciosamente
    │   ├─ Extrai o runtime Python 3.11 para %APPDATA%\Tourmaline\
    │   ├─ Extrai main.py (loader do Estágio 1)
    │   ├─ Extrai QGBdu.dxf (blob criptografado do Estágio 2)
    │   ├─ Encerra quaisquer instâncias existentes de pythonw.exe
    │   └─ Registra persistência (Agendador de Tarefas / registro)
    │       └─ Nome: "TourmalineUpdate" / "Hardware monitoring service"
    │
    ├─ Estágio 1: main.py (Loader com XOR Time-Lock)
    │   ├─ Conta _n de 99.999.999 → 0 (atraso anti-sandbox de ~horas em VMs lentas)
    │   ├─ A cada _n, constrói chave XOR de 33 bytes: struct.pack('>I', _n) + sufixo_hardcoded
    │   ├─ Testa a chave contra o cabeçalho de texto claro conhecido de QGBdu.dxf
    │   └─ Em caso de correspondência: descriptografa QGBdu.dxf inteiramente e exec() o resultado
    │       └─ Bypass O(1): ataque de texto claro conhecido nos primeiros 4 bytes (veja abaixo)
    │
    └─ Estágio 2: QGBdu.dxf → Backdoor em Python
        ├─ Lê MachineGuid de HKLM\SOFTWARE\Microsoft\Cryptography
        ├─ Deriva o mutex Global\Tourmaline_<hash>
        ├─ Resolve o IP do C2 via dead-drop Ethereum (testnet Sepolia)
        ├─ Estabelece túnel DNS para o C2
        └─ Loop de poll-execute: busca tarefas, exec() Python, retorna saída
    

    Estágio 1 — Time-Lock Anti-Sandbox (Bypass O(1))

    O loader (main.py) usa uma contagem regressiva de 99.999.999 para encontrar a chave de descriptografia XOR. Em uma máquina real isso é concluído em segundos (porque _n começa alto e o valor verdadeiro está próximo de 14.511.188). Em um sandbox com limite de tempo curto, o loop nunca é concluído.

    Estrutura da chave:

    root@kitploit:~
    full_key = struct.pack('>I', _n) + bytes.fromhex('2b0cffe07b06ac25793b3f00cfaa2dd5881c2d6378165247539dbbdaeb')
    

    Como conhecemos os primeiros 16 bytes do texto claro (g1 = lambda l6, ), podemos recuperar _n instantaneamente via ataque XOR de texto claro conhecido:

    root@kitploit:~
    key_prefix = bytes(ciphertext[i] ^ known_plaintext[i] for i in range(4))
    # Resultado: key_prefix = 00dd6c54 → _n = 14,511,188
    

    Use src/decrypt_payload.py para reproduzir isso.


    Estágio 2 — Arquitetura do Backdoor Principal

    Configuração (Hardcoded)

    ParâmetroValor
    IP do C2158.94.211.185
    Porta do C253 (UDP)
    ProtocoloTúnel DNS-over-UDP customizado
    Domínio falsificadomicrosoft.com
    Chave ChaCha2036f555c87f71581f57d83576c88193fdc00a0173f741a3e198e2d7abdc9cda59
    Contrato blockchain0x2d7a04cca0c34005f58393f30ac725e25f19e5f5 (Sepolia)
    Chave pública ECDSAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEt17l3rGHHR9sYdHEvV8S+JRRCUHQQveSadlGk04xM/8WClDf/67Tyritt2+T18SY8n0xv1TKKl0AgnNFuboEEQ==
    Nome do serviçoSystemService / TourmalineUpdate
    MutexGlobal\Tourmaline_<MachineGuid-hash>

    Dead-Drop em Blockchain (Resiliência do C2)

    O malware chama um contrato inteligente Ethereum na testnet Sepolia para recuperar o endereço IP ativo do C2. Isso significa que o atacante pode alterar o IP do C2 a qualquer momento atualizando o contrato — a interrupção tradicional do C2 baseada em listas de bloqueio de IP é ineficaz.

    root@kitploit:~
    Contrato : 0x2d7a04cca0c34005f58393f30ac725e25f19e5f5
    Seletor  : 0xeb9fd6fe
    Rede     : Ethereum Sepolia (chainId 11155111)
    RPC      : https://ethereum-sepolia-rpc.publicnode.com
    Resultado: Blob criptografado com ChaCha20 contendo o IP atual do C2
    

    Os dados retornados são descriptografados com a chave ChaCha20 hardcoded para revelar o endereço ativo do C2. No momento da análise, isso resolvia para 158.94.211.185 (verificado via chamada RPC ao vivo).

    Túnel DNS (Comunicação com o C2)

    Todo o tráfego do C2 é enviado como consultas DNS UDP brutas diretamente para o IP do C2 na porta 53. As consultas são estruturadas como <encoded_data>.microsoft.com, contornando a filtragem baseada em DNS e parecendo telemetria legítima do Windows.

    • Implementação customizada: Não usa socket.getaddrinfo do Python nem qualquer biblioteca DNS
    • Ofuscação de opcode: Cada pacote tem um byte XOR aleatório aplicado ao campo de opcode do DNS
    • Codificação: Os dados da tarefa são codificados em base e convertidos para o formato de rótulo DNS

    Motor de Execução de Tarefas

    O backdoor implementa um motor de exec() Python arbitrário. As tarefas são:

    1. Buscadas do C2 via túnel DNS
    2. Descriptografadas com ChaCha20
    3. Verificadas por assinatura ECDSA (impede injeção de sinkhole)
    4. Executadas com exec() em um namespace persistente com captura de saída
    5. Resultados retornados ao C2

    Tipos de tarefa suportados: exec Python, upload/download de arquivo, comando shell, auto-atualização.


    Indicadores de Comprometimento (IOCs)

    Rede

    TipoValor
    IP do C2158.94.211.185
    Porta do C253/UDP
    Domínio falsificado*.microsoft.com (UDP customizado, não DNS real)
    RPC Ethereumhttps://ethereum-sepolia-rpc.publicnode.com
    Contrato Inteligente0x2d7a04cca0c34005f58393f30ac725e25f19e5f5

    Hashes de Arquivos

    ArquivoSHA256
    Tourmaline.exec9b390b3b7148f549df86503858d52e030b2b5e78fed0bc525ded5927f9265d6
    Tourmaline.exe (MD5)b74ac808dea2de31caf024310694ef0c

    Registro / Persistência

    ChaveValor
    HKLM\SOFTWARE\Microsoft\Cryptography\MachineGuidLido para fingerprinting da vítima
    %APPDATA%\Tourmaline\Diretório de instalação
    Agendador de TarefasTourmalineUpdate
    Nome de exibição do serviçoHardware monitoring service
    MutexGlobal\Tourmaline_<hash>

    Regras YARA

    Veja iocs/rules.yar para regras de detecção cobrindo:

    • Constantes do loader do Estágio 1 (sufixo da chave XOR, bytes de texto claro conhecido)
    • Strings hardcoded do Estágio 2 (IP do C2, endereço do contrato, chave ChaCha20)

    Remediação / Limpeza

    Se este malware foi executado em uma máquina:

    1. Isole imediatamente — desconecte da rede
    2. Encerre os processos: taskkill /F /IM pythonw.exe
    3. Remova o diretório de instalação: %APPDATA%\Tourmaline\ ou %COMMONAPPDATA%\Tourmaline\
    4. Remova a persistência:
      • Agendador de Tarefas: exclua TourmalineUpdate
      • Verifique HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run para Tourmaline ou SystemService
    5. Bloqueie no firewall: 158.94.211.185:53/UDP; bloqueie todo tráfego UDP/53 de saída inesperado
    6. Bloqueie o RPC Ethereum no proxy: ethereum-sepolia-rpc.publicnode.com
    7. Reinstale o sistema — devido à capacidade de execução arbitrária de Python, a reinstalação completa é fortemente recomendada

    Reproduzindo a Análise

    Pré-requisitos

    root@kitploit:~
    pip install pyOpenSSL cryptography
    

    Descriptografar o Payload do Estágio 2

    root@kitploit:~
    # A partir da raiz do repositório:
    python3 src/decrypt_payload.py samples/QGBdu.dxf decrypted_stage2.py
    

    Extrair a Amostra de Malware

    root@kitploit:~
    7z x -pinfected samples/Tourmaline_sample.zip
    

    Divulgação

    CampoValor
    Data da descobertaSetembro de 2026
    PesquisadorVihaan Pundir (v-pun215)
    Vetor de distribuiçãoClickFix falso CAPTCHA do Cloudflare
    ClassificaçãoBackdoor / C2 por Túnel DNS / Dead-Drop em Blockchain
    PlataformaWindows (64 bits)

    Licença

    Veja LICENSE. Este repositório é destinado apenas a fins educacionais e de pesquisa defensiva.

    Baixar ferramenta