
Tourmaline ClickFix Python RAT के लिए रिवर्स इंजीनियरिंग नोट्स, डीऑबफस्केटेड सोर्स, IOC, और YARA नियम, जो इसके DNS टनल और ब्लॉकचेन डेड-ड्रॉप C2 को कवर करते हैं।
मैं हाल ही में एक चतुराई से डिज़ाइन किए गए मैलवेयर पर पहुंचा जो खुद को "Torumaline" कहता है।
यह README बहुत दयालुता से Claude द्वारा लिखा गया है क्योंकि इस रिपॉजिटरी की शुरुआत के समय मैं परीक्षाओं में बहुत व्यस्त था।
इस मैलवेयर का शोषण और डिक्रिप्शन करने में मेरे गणित की तैयारी का एक बड़ा हिस्सा लग गया!
केवल शैक्षिक और शोध उद्देश्यों के लिए
सभी नमूने मैलवेयर विश्लेषण और रक्षात्मक शोध के लिए प्रदान किए गए हैं। सैंडबॉक्स्ड, एयर-गैप्ड वातावरण के बाहर निष्पादित न करें।
Tourmaline (Tourmaline.exe) एक परिष्कृत, बहु-चरणीय Windows इन्फोस्टीलर/बैकडोर है जो ClickFix अभियान के माध्यम से वितरित किया जाता है - एक नकली Cloudflare "Verify you are human" ब्राउज़र पॉपअप जो उपयोगकर्ताओं को धोखा देकर मैन्युअल रूप से एक दुर्भावनापूर्ण कमांड या इंस्टॉलर चलाने के लिए प्रेरित करता है।
यह बाइनरी एक कस्टम-निर्मित Inno Setup 6.7.0 (Revision 2, 64-bit offsets) इंस्टॉलर है जो एक पूर्ण Python 3.11 रनटाइम और दो चरणों वाले ऑब्फस्केटेड Python पेलोड को बंडल करता है। यह एक स्थायी बैकडोर स्थापित करता है जिसमें शामिल हैं:
microsoft.com क्वेरीज़ के रूप में छिपा हुआ)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
यह मैलवेयर ClickFix के माध्यम से वितरित किया जाता है - एक सोशल इंजीनियरिंग तकनीक जहां एक समझौता किया गया या हमलावर-नियंत्रित वेबसाइट एक नकली Cloudflare CAPTCHA या ब्राउज़र सत्यापन पृष्ठ को ओवरले करती है। ओवरले पीड़ित को निर्देश देता है:
Win+R दबाएंपेस्ट किया गया कमांड Tourmaline.exe को डाउनलोड और चुपचाप निष्पादित करता है। इंस्टॉलर /VERYSILENT /SUPPRESSMSGBOXES /NORESTART चलाता है।
नोट: स्टॉक
innoextract 1.9इस बाइनरी को एक्सट्रैक्ट नहीं कर सकता — यह केवल Revision 1 का समर्थन करता है। Revision 2 64-bit offsets का उपयोग करता है और कस्टम पार्सिंग की आवश्यकता होती है (देखेंsrc/decrypt_payload.py)।
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
लोडर (main.py) XOR डिक्रिप्शन कुंजी खोजने के लिए 99,999,999 से काउंटडाउन का उपयोग करता है। एक वास्तविक मशीन पर यह सेकंडों में पूरा हो जाता है (क्योंकि _n उच्च से शुरू होता है और वास्तविक मान 14,511,188 के करीब है)। कम समय सीमा वाले सैंडबॉक्स में, लूप कभी पूरा नहीं होता।
कुंजी संरचना:
full_key = struct.pack('>I', _n) + bytes.fromhex('2b0cffe07b06ac25793b3f00cfaa2dd5881c2d6378165247539dbbdaeb')
चूंकि हम प्लेनटेक्स्ट के पहले 16 बाइट्स (g1 = lambda l6, ) जानते हैं, हम known-plaintext XOR हमले के माध्यम से तुरंत _n पुनर्प्राप्त कर सकते हैं:
key_prefix = bytes(ciphertext[i] ^ known_plaintext[i] for i in range(4))
# Result: key_prefix = 00dd6c54 → _n = 14,511,188
इसे पुन: उत्पन्न करने के लिए src/decrypt_payload.py का उपयोग करें।
यह मैलवेयर सक्रिय C2 IP पता प्राप्त करने के लिए Sepolia testnet पर एक Ethereum स्मार्ट कॉन्ट्रैक्ट को कॉल करता है। इसका मतलब है कि हमलावर कॉन्ट्रैक्ट को अपडेट करके किसी भी समय C2 IP बदल सकता है — पारंपरिक IP ब्लॉकलिस्ट-आधारित C2 व्यवधान अप्रभावी है।
Contract : 0x2d7a04cca0c34005f58393f30ac725e25f19e5f5
Selector : 0xeb9fd6fe
Network : Ethereum Sepolia (chainId 11155111)
RPC : https://ethereum-sepolia-rpc.publicnode.com
Result : ChaCha20-encrypted blob containing current C2 IP
लौटाया गया डेटा लाइव C2 पता प्रकट करने के लिए हार्डकोडेड ChaCha20 कुंजी से डिक्रिप्ट किया जाता है। विश्लेषण के समय, यह 158.94.211.185 पर हल हुआ (लाइव RPC कॉल के माध्यम से सत्यापित)।
सभी C2 ट्रैफ़िक सीधे C2 IP पर पोर्ट 53 पर कच्ची UDP DNS क्वेरीज़ के रूप में भेजा जाता है। क्वेरीज़ <encoded_data>.microsoft.com के रूप में संरचित होती हैं, DNS-आधारित फ़िल्टरिंग को बायपास करती हैं और वैध Windows टेलीमेट्री के रूप में दिखाई देती हैं।
socket.getaddrinfo या किसी DNS लाइब्रेरी का उपयोग नहीं करताबैकडोर एक मनमाना Python exec() इंजन लागू करता है। टास्क हैं:
exec()'dसमर्थित टास्क प्रकार: Python exec, फ़ाइल अपलोड/डाउनलोड, शेल कमांड, स्व-अपडेट।
| File | SHA256 |
|---|---|
Tourmaline.exe | c9b390b3b7148f549df86503858d52e030b2b5e78fed0bc525ded5927f9265d6 |
Tourmaline.exe (MD5) | b74ac808dea2de31caf024310694ef0c |
पता लगाने के नियमों के लिए iocs/rules.yar देखें जो कवर करते हैं:
यदि यह मैलवेयर किसी मशीन पर निष्पादित किया गया है:
taskkill /F /IM pythonw.exe%APPDATA%\Tourmaline\ या %COMMONAPPDATA%\Tourmaline\TourmalineUpdate हटाएंHKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run में Tourmaline या SystemService की जांच करें158.94.211.185:53/UDP; सभी अप्रत्याशित आउटबाउंड UDP/53 ब्लॉक करेंethereum-sepolia-rpc.publicnode.compip install pyOpenSSL cryptography
# From the repo root:
python3 src/decrypt_payload.py samples/QGBdu.dxf decrypted_stage2.py
7z x -pinfected samples/Tourmaline_sample.zip
LICENSE देखें। यह रिपॉजिटरी केवल शैक्षिक और रक्षात्मक शोध उद्देश्यों के लिए है।
| Property | Value |
|---|
| File name | Tourmaline.exe |
| Size | 11,341,339 bytes (~10.8 MB) |
| MD5 | b74ac808dea2de31caf024310694ef0c |
| SHA256 | c9b390b3b7148f549df86503858d52e030b2b5e78fed0bc525ded5927f9265d6 |
| Format | Inno Setup 6.7.0 Unicode (Revision 2, 64-bit offsets) |
| PE type | 32-bit PE, 11 sections |
| Overlay size | 10,447,387 bytes |
| Inno magic offset | 0xD9864 (890,148 bytes) |
| App name | Tourmaline |
| App version | 2.63.519 |
| App GUID | {2C25872D-85FC-44C7-9B16-844E39E50A44} |
| Install path | {commonappdata}\Tourmaline |
| Bundled runtime | Python 3.11 (full embed) |
| Payload files | 36 files in solid LZMA2 stream |
| Parameter | Value |
|---|
| C2 IP | 158.94.211.185 |
| C2 Port | 53 (UDP) |
| Protocol | Custom DNS-over-UDP tunnel |
| Spoofed domain | microsoft.com |
| ChaCha20 key | 36f555c87f71581f57d83576c88193fdc00a0173f741a3e198e2d7abdc9cda59 |
| Blockchain contract | 0x2d7a04cca0c34005f58393f30ac725e25f19e5f5 (Sepolia) |
| ECDSA pubkey | MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEt17l3rGHHR9sYdHEvV8S+JRRCUHQQveSadlGk04xM/8WClDf/67Tyritt2+T18SY8n0xv1TKKl0AgnNFuboEEQ== |
| Service name | SystemService / TourmalineUpdate |
| Mutex | Global\Tourmaline_<MachineGuid-hash> |
| Type | Value |
|---|
| C2 IP | 158.94.211.185 |
| C2 Port | 53/UDP |
| Spoofed Domain | *.microsoft.com (custom UDP, not real DNS) |
| Ethereum RPC | https://ethereum-sepolia-rpc.publicnode.com |
| Smart Contract | 0x2d7a04cca0c34005f58393f30ac725e25f19e5f5 |
| Key | Value |
|---|
HKLM\SOFTWARE\Microsoft\Cryptography\MachineGuid | Read for victim fingerprinting |
%APPDATA%\Tourmaline\ | Installation directory |
| Task Scheduler | TourmalineUpdate |
| Service display name | Hardware monitoring service |
| Mutex | Global\Tourmaline_<hash> |
| Field | Value |
|---|
| Discovery date | September 2026 |
| Researcher | Vihaan Pundir (v-pun215) |
| Distribution vector | ClickFix fake Cloudflare CAPTCHA |
| Classification | Backdoor / DNS Tunnel C2 / Blockchain Dead-Drop |
| Platform | Windows (64-bit) |