Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
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é.

FluxContactConfidentialité© 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
GitHub
11116il y a 1 moisPas 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 →
v-pun215/tourmaline

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

Je suis récemment tombé sur un logiciel malveillant astucieusement conçu qui se nomme « Tourmaline ».

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.

L'exploitation et le déchiffrement de ce logiciel malveillant ont pris une grande partie de mon temps de préparation en mathématiques !

Lisez l'article de blog !

À DES FINS ÉDUCATIVES ET DE RECHERCHE UNIQUEMENT
Tous les échantillons sont fournis à des fins d'analyse de logiciels malveillants et de recherche défensive. Ne les exécutez pas en dehors d'un environnement isolé (sandbox) et déconnecté du 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 de navigateur 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) conçu 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 des tâches chiffré avec 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

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 malware 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 de 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 : La version standard innoextract 1.9 ne peut pas extraire ce binaire — elle 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

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 — Verrouillage temporel anti-sandbox (contournement O(1))

Le loader (main.py) utilise un compte à rebours de 99,999,999 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é :

full_key = struct.pack('>I', _n) + bytes.fromhex('2b0cffe07b06ac25793b3f00cfaa2dd5881c2d6378165247539dbbdaeb')

Puisque 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 :

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 centrale du backdoor

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 malware appelle un contrat intelligent Ethereum sur le réseau de test Sepolia pour récupérer l'adresse IP active du C2. Cela signifie que l'attaquant peut modifier l'IP du C2 à tout moment en mettant à jour le contrat — la perturbation traditionnelle du C2 basée sur des listes de blocage d'IP est donc inefficace.

Contract : 0x2d7a04cca0c34005f58393f30ac725e25f19e5f5
Selector : 0xeb9fd6fe
Network  : Ethereum Sepolia (chainId 11155111)
RPC      : https://ethereum-sepolia-rpc.publicnode.com
Result   : ChaCha20-encrypted blob containing current C2 IP
Télécharger l’outil