Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
Tourmaline — Notes de rétro-ingénierie, code source désobfusqué, IOCs et règles YARA pour le RAT Python Tourmaline ClickFix, couvrant son tunnel DNS et son C2 dead-drop blockchain. | Kitploit
Outils/GitHubGitHub/v-pun215/tourmaline
Gestion des Indicateurs de Compromission (IOC)Rétro-ingénierieAnalyse de MalwareCriminalistique NumériqueCryptographieCommandement et ContrôleRenseignement sur les MenacesApprentissage et ÉducationRéponse aux IncidentsAnalyse DNS
GitHubv-pun215/tourmaline
410il y a 1 jourPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →

Tourmaline

Notes de rétro-ingénierie, code source désobfusqué, IOCs et règles YARA pour le RAT Python Tourmaline ClickFix, couvrant son tunnel DNS et son C2 dead-drop blockchain.

Voir le dépôt
Partager

Tourmaline

J'ai récemment découvert un logiciel malveillant astucieusement conçu qui se fait appeler « Torumaline ».

Ce README a été très aimablement rédigé par Claude, car j'étais extrêmement occupé par mes examens au moment de la création de ce dépôt.

Exploiter et déchiffrer ce logiciel malveillant m'a pris une grande partie de mon temps de préparation aux mathématiques !

Lisez le billet de blog !

À DES FINS ÉDUCATIVES ET DE RECHERCHE UNIQUEMENT
Tous les échantillons sont fournis pour l'analyse de logiciels malveillants et la recherche défensive. Ne les exécutez pas en dehors d'un environnement isolé et sans réseau.


Aperçu

Tourmaline (Tourmaline.exe) est un infostealer/backdoor Windows sophistiqué à plusieurs étapes, distribué via une campagne ClickFix — une fausse fenêtre contextuelle Cloudflare « Vérifiez que vous êtes humain » qui incite les utilisateurs à exécuter manuellement une commande ou un installateur malveillant.

Le binaire est un installateur Inno Setup 6.7.0 (Révision 2, offsets 64 bits) construit sur mesure, qui embarque un runtime Python 3.11 complet et deux étapes de payload Python obfusqué. Il établit une backdoor persistante avec :

  • Tunneling DNS C2 sur le port UDP 53 (se faisant passer pour des requêtes microsoft.com)
  • Dead-drop sur la blockchain Ethereum pour la distribution des IP C2 (testnet Sepolia)
  • Canal d'exécution de tâches chiffré en ChaCha20
  • Commandes signées ECDSA pour empêcher le sinkholing
  • Verrou temporel anti-sandbox (compte à rebours de 100 M d'itérations, contournable en O(1))

  • Structure du dépôt

    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
    

    Vecteur d'infection

    Le logiciel malveillant est distribué via ClickFix — une technique d'ingénierie sociale dans laquelle un site web compromis ou contrôlé par l'attaquant superpose une fausse page CAPTCHA Cloudflare ou de vérification du navigateur. La superposition demande à la victime de :

    1. Appuyer sur Win+R
    2. Coller une commande (copiée dans le presse-papiers par le JavaScript de la page)
    3. Appuyer sur Entrée

    La commande collée télécharge et exécute silencieusement Tourmaline.exe. L'installateur s'exécute avec /VERYSILENT /SUPPRESSMSGBOXES /NORESTART.


    Format binaire

    PropriétéValeur
    Nom du fichierTourmaline.exe
    Taille11 341 339 octets (~10,8 Mo)
    MD5b74ac808dea2de31caf024310694ef0c
    SHA256c9b390b3b7148f549df86503858d52e030b2b5e78fed0bc525ded5927f9265d6
    FormatInno Setup 6.7.0 Unicode (Révision 2, offsets 64 bits)
    Type PEPE 32 bits, 11 sections
    Taille de l'overlay10 447 387 octets
    Offset magique Inno0xD9864 (890 148 octets)
    Nom de l'applicationTourmaline
    Version de l'application2.63.519
    GUID de l'application{2C25872D-85FC-44C7-9B16-844E39E50A44}
    Chemin d'installation{commonappdata}\Tourmaline
    Runtime embarquéPython 3.11 (embed complet)
    Fichiers de payload36 fichiers dans un flux LZMA2 solide

    Remarque : Le innoextract 1.9 standard ne peut pas extraire ce binaire — il ne prend en charge que la Révision 1. La Révision 2 utilise des offsets 64 bits et nécessite un parsing personnalisé (voir src/decrypt_payload.py).


    Flux d'exécution

    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
    

    Étape 1 — Verrou temporel anti-sandbox (contournement en O(1))

    Le loader (main.py) utilise un compte à rebours de 99 999 999 à 0 pour trouver la clé de déchiffrement XOR. Sur une machine réelle, cela se termine en quelques secondes (car _n commence haut et la vraie valeur est proche de 14 511 188). Dans un sandbox avec une limite de temps courte, la boucle ne se termine jamais.

    Structure de la clé :

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

    Comme nous connaissons les 16 premiers octets du texte en clair (g1 = lambda l6, ), nous pouvons récupérer _n instantanément via une attaque XOR à texte en clair connu :

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

    Utilisez src/decrypt_payload.py pour reproduire cela.


    Étape 2 — Architecture de la backdoor principale

    Configuration (codée en dur)

    ParamètreValeur
    IP C2158.94.211.185
    Port C253 (UDP)
    ProtocoleTunnel DNS-over-UDP personnalisé
    Domaine usurpémicrosoft.com
    Clé ChaCha2036f555c87f71581f57d83576c88193fdc00a0173f741a3e198e2d7abdc9cda59
    Contrat blockchain0x2d7a04cca0c34005f58393f30ac725e25f19e5f5 (Sepolia)
    Clé publique ECDSAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEt17l3rGHHR9sYdHEvV8S+JRRCUHQQveSadlGk04xM/8WClDf/67Tyritt2+T18SY8n0xv1TKKl0AgnNFuboEEQ==
    Nom du serviceSystemService / TourmalineUpdate
    MutexGlobal\Tourmaline_<MachineGuid-hash>

    Dead-drop blockchain (résilience du C2)

    Le logiciel malveillant appelle un contrat intelligent Ethereum sur le testnet Sepolia pour récupérer l'adresse IP C2 active. Cela signifie que l'attaquant peut changer l'IP C2 à tout moment en mettant à jour le contrat — la perturbation traditionnelle du C2 par liste de blocage d'IP est inefficace.

    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
    

    Les données renvoyées sont déchiffrées avec la clé ChaCha20 codée en dur pour révéler l'adresse C2 active. Au moment de l'analyse, celle-ci correspondait à 158.94.211.185 (vérifié via un appel RPC en direct).

    Tunnel DNS (communication C2)

    Tout le trafic C2 est envoyé sous forme de requêtes DNS UDP brutes directement vers l'IP C2 sur le port 53. Les requêtes sont structurées comme <encoded_data>.microsoft.com, contournant le filtrage basé sur DNS et apparaissant comme de la télémétrie Windows légitime.

    • Implémentation personnalisée : n'utilise pas socket.getaddrinfo de Python ni aucune bibliothèque DNS
    • Obfuscation de l'opcode : chaque paquet a un octet XOR aléatoire appliqué au champ opcode DNS
    • Encodage : les données de tâche sont encodées en base dans le format de label DNS

    Moteur d'exécution de tâches

    La backdoor implémente un moteur exec() Python arbitraire. Les tâches sont :

    1. Récupérées depuis le C2 via le tunnel DNS
    2. Déchiffrées en ChaCha20
    3. Vérifiées par signature ECDSA (empêche l'injection par sinkhole)
    4. exec() dans un espace de noms persistant avec capture de sortie
    5. Les résultats sont renvoyés au C2

    Types de tâches pris en charge : exec Python, upload/download de fichiers, commande shell, auto-mise à jour.


    Indicateurs de compromission (IOC)

    Réseau

    TypeValeur
    IP C2158.94.211.185
    Port C253/UDP
    Domaine usurpé*.microsoft.com (UDP personnalisé, pas un vrai DNS)
    RPC Ethereumhttps://ethereum-sepolia-rpc.publicnode.com
    Contrat intelligent0x2d7a04cca0c34005f58393f30ac725e25f19e5f5

    Hachages de fichiers

    FichierSHA256
    Tourmaline.exec9b390b3b7148f549df86503858d52e030b2b5e78fed0bc525ded5927f9265d6
    Tourmaline.exe (MD5)b74ac808dea2de31caf024310694ef0c

    Registre / Persistance

    CléValeur
    HKLM\SOFTWARE\Microsoft\Cryptography\MachineGuidLu pour l'empreinte de la victime
    %APPDATA%\Tourmaline\Répertoire d'installation
    Planificateur de tâchesTourmalineUpdate
    Nom d'affichage du serviceHardware monitoring service
    MutexGlobal\Tourmaline_<hash>

    Règles YARA

    Voir iocs/rules.yar pour les règles de détection couvrant :

    • Constantes du loader de l'étape 1 (suffixe de clé XOR, octets de texte en clair connus)
    • Chaînes codées en dur de l'étape 2 (IP C2, adresse du contrat, clé ChaCha20)

    Remédiation / Nettoyage

    Si ce logiciel malveillant a été exécuté sur une machine :

    1. Isolez immédiatement — déconnectez du réseau
    2. Tuez les processus : taskkill /F /IM pythonw.exe
    3. Supprimez le répertoire d'installation : %APPDATA%\Tourmaline\ ou %COMMONAPPDATA%\Tourmaline\
    4. Supprimez la persistance :
      • Planificateur de tâches : supprimez TourmalineUpdate
      • Vérifiez HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run pour Tourmaline ou SystemService
    5. Bloquez au pare-feu : 158.94.211.185:53/UDP ; bloquez tout UDP/53 sortant inattendu
    6. Bloquez le RPC Ethereum au niveau du proxy : ethereum-sepolia-rpc.publicnode.com
    7. Réimagez — en raison de la capacité d'exécution Python arbitraire, un réimageage complet est fortement recommandé

    Reproduction de l'analyse

    Prérequis

    root@kitploit:~
    pip install pyOpenSSL cryptography
    

    Déchiffrer le payload de l'étape 2

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

    Extraire l'échantillon de logiciel malveillant

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

    Divulgation

    ChampValeur
    Date de découverteSeptembre 2026
    ChercheurVihaan Pundir (v-pun215)
    Vecteur de distributionFaux CAPTCHA Cloudflare ClickFix
    ClassificationBackdoor / C2 par tunnel DNS / Dead-drop blockchain
    PlateformeWindows (64 bits)

    Licence

    Voir LICENSE. Ce dépôt est destiné à des fins éducatives et de recherche défensive uniquement.

    Télécharger l’outil