Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
Tourmaline — Notas de ingeniería inversa, código fuente desofuscado, IOCs y reglas YARA para el RAT Python Tourmaline ClickFix, que abarca su túnel DNS y su C2 de dead-drop en blockchain. | Kitploit
Herramientas/GitHubGitHub/v-pun215/tourmaline
Gestión de Indicadores de Compromiso (IOC)Ingeniería InversaAnálisis de MalwareForensia DigitalCriptografíaComando y ControlInteligencia de AmenazasAprendizaje y EducaciónRespuesta a IncidentesAnálisis de DNS
GitHubv-pun215/tourmaline
410hace 1 díaAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →

Tourmaline

Notas de ingeniería inversa, código fuente desofuscado, IOCs y reglas YARA para el RAT Python Tourmaline ClickFix, que abarca su túnel DNS y su C2 de dead-drop en blockchain.

Ver Repositorio
Compartir

Tourmaline

Recientemente me topé con una pieza de malware ingeniosamente diseñada que se hace llamar "Torumaline".

Este README fue escrito muy amablemente por Claude, ya que estaba súper ocupado con exámenes en el momento del inicio de este repositorio.

¡Explotar y descifrar este malware me quitó una enorme cantidad de tiempo de preparación para matemáticas!

Lee el blogpost!

SOLO PARA PROPÓSITOS EDUCATIVOS Y DE INVESTIGACIÓN
Todas las muestras se proporcionan para análisis de malware e investigación defensiva. No las ejecutes fuera de un entorno aislado y sin conexión a la red.


Descripción general

Tourmaline (Tourmaline.exe) es un sofisticado infostealer/backdoor de Windows de múltiples etapas distribuido mediante una campaña ClickFix: una ventana emergente falsa de Cloudflare "Verify you are human" que engaña a los usuarios para que ejecuten manualmente un comando o instalador malicioso.

El binario es un instalador personalizado de Inno Setup 6.7.0 (Revision 2, offsets de 64 bits) que incluye un runtime completo de Python 3.11 y dos etapas de payload Python ofuscado. Establece un backdoor persistente con:

  • C2 mediante DNS tunneling sobre el puerto UDP 53 (disfrazado como consultas a microsoft.com)
  • Dead-drop en la blockchain de Ethereum para la distribución de IPs de C2 (testnet Sepolia)
  • Canal de ejecución de tareas cifrado con ChaCha20
  • Comandos firmados con ECDSA para evitar el sinkholing
  • Bloqueo temporal anti-sandbox (cuenta regresiva de 100M iteraciones, evitable en O(1))

  • Estructura del repositorio

    root@kitploit:~
    tourmaline/
    ├── README.md                  # This file
    ├── LICENSE                    # Research use license
    ├── .gitignore
    │
    ├── src/                       # Extracted & deobfuscated source code
    │   ├── stage1_loader.py       # Stage 1: Original obfuscated XOR time-lock loader (main.py)
    │   ├── stage2_backdoor.py     # Stage 2: Deobfuscated core backdoor (from QGBdu.dxf)
    │   └── decrypt_payload.py     # Utility: O(1) payload key recovery & decryption
    │
    ├── iocs/                      # Indicators of Compromise
    │   ├── indicators.json        # Structured IOC data (IPs, hashes, domains, registry)
    │   ├── indicators.csv         # Flat CSV for SIEM import
    │   └── rules.yar              # YARA detection rules
    │
    └── samples/                   # Malware samples (password-protected)
        ├── README.md              # Sample archive instructions
        ├── Tourmaline_sample.zip  # Password: infected - contains Tourmaline.exe
        └── QGBdu.dxf             # Raw encrypted Stage 2 payload blob
    

    Vector de infección

    El malware se distribuye mediante ClickFix, una técnica de ingeniería social en la que un sitio web comprometido o controlado por el atacante superpone un CAPTCHA falso de Cloudflare o una página de verificación del navegador. La superposición indica a la víctima que:

    1. Presione Win+R
    2. Pegue un comando (copiado al portapapeles por el JavaScript de la página)
    3. Presione Enter

    El comando pegado descarga y ejecuta silenciosamente Tourmaline.exe. El instalador se ejecuta con /VERYSILENT /SUPPRESSMSGBOXES /NORESTART.


    Formato del binario

    PropiedadValor
    Nombre del archivoTourmaline.exe
    Tamaño11,341,339 bytes (~10.8 MB)
    MD5b74ac808dea2de31caf024310694ef0c
    SHA256c9b390b3b7148f549df86503858d52e030b2b5e78fed0bc525ded5927f9265d6
    FormatoInno Setup 6.7.0 Unicode (Revision 2, offsets de 64 bits)
    Tipo de PEPE de 32 bits, 11 secciones
    Tamaño del overlay10,447,387 bytes
    Offset mágico de Inno0xD9864 (890,148 bytes)
    Nombre de la appTourmaline
    Versión de la app2.63.519
    GUID de la app{2C25872D-85FC-44C7-9B16-844E39E50A44}
    Ruta de instalación{commonappdata}\Tourmaline
    Runtime incluidoPython 3.11 (embed completo)
    Archivos de payload36 archivos en un flujo LZMA2 sólido

    Nota: El innoextract 1.9 estándar no puede extraer este binario; solo admite Revision 1. Revision 2 usa offsets de 64 bits y requiere un análisis personalizado (ver src/decrypt_payload.py).


    Flujo de ejecución

    root@kitploit:~
    Tourmaline.exe
    │
    ├─ Inno Setup installer runs silently
    │   ├─ Extracts Python 3.11 runtime to %APPDATA%\Tourmaline\
    │   ├─ Extracts main.py (Stage 1 loader)
    │   ├─ Extracts QGBdu.dxf (encrypted Stage 2 blob)
    │   ├─ Kills any existing pythonw.exe instances
    │   └─ Registers persistence (Task Scheduler / registry)
    │       └─ Name: "TourmalineUpdate" / "Hardware monitoring service"
    │
    ├─ Stage 1: main.py (XOR Time-Lock Loader)
    │   ├─ Counts _n from 99,999,999 → 0 (anti-sandbox delay ~hours on slow VMs)
    │   ├─ At each _n, constructs 33-byte XOR key: struct.pack('>I', _n) + hardcoded_suffix
    │   ├─ Tests key against known plaintext header of QGBdu.dxf
    │   └─ On match: decrypts QGBdu.dxf entirely and exec()s the result
    │       └─ O(1) bypass: known-plaintext attack on first 4 bytes (see below)
    │
    └─ Stage 2: QGBdu.dxf → Python backdoor
        ├─ Reads MachineGuid from HKLM\SOFTWARE\Microsoft\Cryptography
        ├─ Derives mutex Global\Tourmaline_<hash>
        ├─ Resolves C2 IP via Ethereum dead-drop (Sepolia testnet)
        ├─ Establishes DNS tunnel to C2
        └─ Poll-execute loop: fetches tasks, exec()s Python, returns output
    

    Etapa 1 — Bloqueo temporal anti-sandbox (evasión en O(1))

    El loader (main.py) usa una cuenta regresiva desde 99,999,999 para encontrar la clave de descifrado XOR. En una máquina real esto se completa en segundos (porque _n comienza alto y el valor verdadero está cerca de 14,511,188). En una sandbox con un límite de tiempo corto, el bucle nunca se completa.

    Estructura de la clave:

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

    Como conocemos los primeros 16 bytes del texto plano (g1 = lambda l6, ), podemos recuperar _n instantáneamente mediante un ataque XOR de texto plano conocido:

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

    Usa src/decrypt_payload.py para reproducir esto.


    Etapa 2 — Arquitectura del backdoor principal

    Configuración (hardcodeada)

    ParámetroValor
    IP de C2158.94.211.185
    Puerto de C253 (UDP)
    ProtocoloTúnel DNS-over-UDP personalizado
    Dominio suplantadomicrosoft.com
    Clave ChaCha2036f555c87f71581f57d83576c88193fdc00a0173f741a3e198e2d7abdc9cda59
    Contrato de blockchain0x2d7a04cca0c34005f58393f30ac725e25f19e5f5 (Sepolia)
    Clave pública ECDSAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEt17l3rGHHR9sYdHEvV8S+JRRCUHQQveSadlGk04xM/8WClDf/67Tyritt2+T18SY8n0xv1TKKl0AgnNFuboEEQ==
    Nombre del servicioSystemService / TourmalineUpdate
    MutexGlobal\Tourmaline_<MachineGuid-hash>

    Dead-drop en blockchain (resiliencia del C2)

    El malware llama a un contrato inteligente de Ethereum en la testnet Sepolia para recuperar la dirección IP activa del C2. Esto significa que el atacante puede cambiar la IP del C2 en cualquier momento actualizando el contrato; la interrupción tradicional del C2 basada en listas de bloqueo de IPs es ineficaz.

    root@kitploit:~
    Contract : 0x2d7a04cca0c34005f58393f30ac725e25f19e5f5
    Selector : 0xeb9fd6fe
    Network  : Ethereum Sepolia (chainId 11155111)
    RPC      : https://ethereum-sepolia-rpc.publicnode.com
    Result   : ChaCha20-encrypted blob containing current C2 IP
    

    Los datos devueltos se descifran con la clave ChaCha20 hardcodeada para revelar la dirección C2 activa. En el momento del análisis, esto resolvía a 158.94.211.185 (verificado mediante una llamada RPC en vivo).

    Túnel DNS (comunicación con el C2)

    Todo el tráfico del C2 se envía como consultas DNS UDP sin procesar directamente a la IP del C2 en el puerto 53. Las consultas se estructuran como <encoded_data>.microsoft.com, evadiendo el filtrado basado en DNS y pareciendo telemetría legítima de Windows.

    • Implementación personalizada: No usa socket.getaddrinfo de Python ni ninguna biblioteca DNS
    • Ofuscación del opcode: Cada paquete tiene un byte XOR aleatorio aplicado al campo opcode de DNS
    • Codificación: Los datos de las tareas se codifican en base y se convierten al formato de etiqueta DNS

    Motor de ejecución de tareas

    El backdoor implementa un motor de exec() de Python arbitrario. Las tareas son:

    1. Obtenidas del C2 mediante el túnel DNS
    2. Descifradas con ChaCha20
    3. Verificadas con firma ECDSA (evita la inyección de sinkhole)
    4. Ejecutadas con exec() en un espacio de nombres persistente con captura de salida
    5. Los resultados se devuelven al C2

    Tipos de tareas admitidos: exec de Python, carga/descarga de archivos, comando de shell, autoactualización.


    Indicadores de compromiso (IOCs)

    Red

    TipoValor
    IP de C2158.94.211.185
    Puerto de C253/UDP
    Dominio suplantado*.microsoft.com (UDP personalizado, no DNS real)
    RPC de Ethereumhttps://ethereum-sepolia-rpc.publicnode.com
    Contrato inteligente0x2d7a04cca0c34005f58393f30ac725e25f19e5f5

    Hashes de archivos

    ArchivoSHA256
    Tourmaline.exec9b390b3b7148f549df86503858d52e030b2b5e78fed0bc525ded5927f9265d6
    Tourmaline.exe (MD5)b74ac808dea2de31caf024310694ef0c

    Registro / Persistencia

    ClaveValor
    HKLM\SOFTWARE\Microsoft\Cryptography\MachineGuidSe lee para la identificación de la víctima
    %APPDATA%\Tourmaline\Directorio de instalación
    Task SchedulerTourmalineUpdate
    Nombre para mostrar del servicioHardware monitoring service
    MutexGlobal\Tourmaline_<hash>

    Reglas YARA

    Consulta iocs/rules.yar para ver las reglas de detección que cubren:

    • Constantes del loader de la Etapa 1 (sufijo de clave XOR, bytes de texto plano conocido)
    • Cadenas hardcodeadas de la Etapa 2 (IP de C2, dirección del contrato, clave ChaCha20)

    Remediación / Limpieza

    Si este malware se ha ejecutado en una máquina:

    1. Aísla inmediatamente: desconéctala de la red
    2. Mata los procesos: taskkill /F /IM pythonw.exe
    3. Elimina el directorio de instalación: %APPDATA%\Tourmaline\ o %COMMONAPPDATA%\Tourmaline\
    4. Elimina la persistencia:
      • Task Scheduler: elimina TourmalineUpdate
      • Revisa HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run en busca de Tourmaline o SystemService
    5. Bloquea en el firewall: 158.94.211.185:53/UDP; bloquea todo el tráfico UDP/53 saliente inesperado
    6. Bloquea el RPC de Ethereum en el proxy: ethereum-sepolia-rpc.publicnode.com
    7. Reinstala la imagen: debido a la capacidad de ejecución arbitraria de Python, se recomienda encarecidamente reinstalar la imagen por completo

    Reproducción del análisis

    Requisitos previos

    root@kitploit:~
    pip install pyOpenSSL cryptography
    

    Descifrar el payload de la Etapa 2

    root@kitploit:~
    # From the repo root:
    python3 src/decrypt_payload.py samples/QGBdu.dxf decrypted_stage2.py
    

    Extraer la muestra de malware

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

    Divulgación

    CampoValor
    Fecha de descubrimientoSeptiembre de 2026
    InvestigadorVihaan Pundir (v-pun215)
    Vector de distribuciónCAPTCHA falso de Cloudflare mediante ClickFix
    ClasificaciónBackdoor / C2 por túnel DNS / Dead-drop en blockchain
    PlataformaWindows (64 bits)

    Licencia

    Consulta LICENSE. Este repositorio es solo para propósitos educativos y de investigación defensiva.

    Descargar herramienta