फोर्टीगेट SSL-VPN की सोने की खान। CVE-2024-21762 और CVE-2023-27997। 79 कार्यशील एक्सप्लॉइट क्लाइंट। 53 हार्डवेयर SKU। 55 फोर्टीओएस बिल्ड।
शोध संग्रह। जैसा मिला वैसा ही पुनर्प्राप्त किया गया। मैंने ये फ़ाइलें नहीं लिखीं।
जारी किया गया: 1 सितंबर 2026
यह रिपॉज़िटरी ऑर्केस्ट्रेटर, दूसरे-चरण के पेलोड, और ऑपरेटर लिसनर है जो प्रति-SKU FortiGate SSL-VPN एक्सप्लॉइट कैटलॉग के ऊपर बैठते हैं। विस्तृत कहानी, गणना, और हंटिंग नोट्स Abraxas Labs पर श्रृंखला The SSL-VPN pot of gold में हैं।
इस सामग्री को किसी भी होस्ट के विरुद्ध न चलाएं जब तक कि आपके पास इस रिपॉज़िटरी को होस्ट करने वाले पक्ष और लक्षित सिस्टम के मालिक दोनों से स्पष्ट लिखित अनुमति न हो। संबंधित CVE इस रिलीज़ से पहले सार्वजनिक और पैच किए गए थे। यह ट्री शोध, पहचान और ऐतिहासिक विश्लेषण के लिए है।
मुझे जंगल में एक निजी FortiGate SSL-VPN किट मिली। पहली ड्रॉप कार्यशील क्लाइंट्स की एक निर्देशिका थी: exp/exp_60E-v6.4.7.py और exp/exp_1000D-v7.4.0.py जैसे नाम। प्रत्येक फ़ाइल एक प्रति-SKU, प्रति-FortiOS मेमोरी-करप्शन क्लाइंट है। दो सार्वजनिक n-days, हार्डवेयर और फ़र्मवेयर में पुनः-स्टैम्प किए गए, जब तक फ़ोल्डर एक पार्ट्स कैटलॉग जैसा नहीं दिखने लगा।
सोना ऑफ़सेट मैट्रिक्स है, कोई नया बग नहीं। वह तर्क श्रृंखला के Phase 0 में है। Phase 1 दो प्रिमिटिव्स को व्यवहार के रूप में कवर करता है। Phase 2 खोजने योग्य SKU / ट्रेन / CPU मैप है। Phase 3 हंटिंग है।
यह रिपॉज़िटरी उसी किट का बाकी हिस्सा है, कोई दूसरा एक्सप्लॉइट परिवार नहीं।
exp/ प्रोग्राम वे प्रति-इमेज क्लाइंट हैं जिनका श्रृंखला में पहले ही वर्णन किया जा चुका है।shellcode/ फ़ाइलें लॉन्चर, इम्प्लांट फ़ेच, और कॉन्फ़िग-चोरी लिसनर हैं जिन्हें वे क्लाइंट कॉल करने के लिए लिखे गए थे।exp_*.py फ़ाइलों में कभी इम्प्लांट नहीं था। वे केवल (1) "शेलकोड सर्वर" से रॉ बाइट्स खींचना या (2) GET /s.js और eval करना जानते थे। वे लापता टुकड़े यहाँ हैं।प्रिमिटिव्स:
| परिवार | CVE | Fortinet सलाह | सार्वजनिक रंग |
|---|---|---|---|
| A | CVE-2024-21762 | FG-IR-24-015 | Assetnote — Two Bytes is Plenty |
| B | CVE-2023-27997 | FG-IR-23-097 | Lexfo — XORtigate, Bishop Fox |
दोनों CISA के Known Exploited Vulnerabilities कैटलॉग में हैं। poc.py किसी भी CVE को लागू नहीं करता। यह पहले से वर्गीकृत दो परिवारों का चयन और रैप करता है (chunked-write 21762; enc= हीप ओवरफ्लो 27997)।
.
├── poc.py # pocsuite3 लॉन्चर / फ़िंगरप्रिंट / प्रोसेस मैनेजर
├── s.js # Node दूसरा चरण (कॉन्फ़िग चोर)
├── send_cmd.py # स्टेगर पथ के लिए कॉलबैक हैंडलर
├── init.sh # ऑपरेटर वर्कस्टेशन पैकेज इंस्टॉल
├── requirements.txt # pwntools
├── exp/
│ └── exp_<SKU>-v<FortiOS>.py
└── shellcode/
├── shellcode_server.py # लंबाई-उपसर्ग ब्लॉब पंप
├── shellcode_arm # ~2.0 MB रॉ दूसरा चरण
└── shellcode_amd64 # ~2.7 MB रॉ दूसरा चरण
exp/index.html और shellcode/index.html सामान्य Python http.server डायरेक्टरी लिस्टिंग हैं। वे केवल दिखाते हैं कि यह ट्री किसी समय वेब रूट के रूप में होस्ट किया गया था।
exp/ की यह प्रति पहले का कैटलॉग है और इसमें चार अतिरिक्त क्लाइंट हैं: exp_30E-v6.2.4.py, exp_30E-v6.2.12.py, exp_30E-v6.2.14.py, exp_40F-v7.0.5.py।
poc.py ऑर्केस्ट्रेटर (pocsuite3)
│
├─ फ़िंगरप्रिंट पोर्टल ─────── VERSION_LIBS (हैश → SKU + FortiOS)
├─ फ़ाइल चुनें ──────────────── exp/exp_<SKU>-v<ver>.py
│
├─ यदि क्लाइंट "स्टेगर" प्रकार का है (Family A ARM / कुछ amd64)
│ shellcode/shellcode_server.py शुरू करें
│ shellcode/shellcode_arm या shellcode_amd64 पढ़ता है
│ send_cmd.py शुरू करें (कॉलबैक की प्रतीक्षा करें)
│ :9999 पर कॉन्फ़िग रिसीवर शुरू करें
│ चयनित exp_*.py चलाएं
│
└─ यदि क्लाइंट "Node /s.js" प्रकार का है (अधिकांश Family B + कई Family A)
HTTP पर s.js परोसें
:9999 पर कॉन्फ़िग रिसीवर शुरू करें
चयनित exp_*.py चलाएं
→ फ़ायरवॉल GET /s.js → eval → एक्सफ़िल
एक पंक्ति में पाइपलाइन: पहचानें → ऑफ़सेट फ़ाइल चुनें → sslvpnd को करप्ट करें → इम्प्लांट खींचें → /data/config/*.gz एक्सफ़िल करें → ऑपरेटर पक्ष पर संग्रह करें।
वह अंतिम चरण ही मुद्दा है। एक हिट फ़ायरवॉल पर ही sslvpnd में अप्रमाणित कोड निष्पादन है — TLS टर्मिनेटर, रूटिंग पॉलिसी, VPN सत्र, अक्सर LDAP/RADIUS बाइंडिंग। FortiOS एक उपयोगी /bin/sh प्रदान नहीं करता। सार्वजनिक शोध और यह किट दोनों एक आंतरिक कमांड हेल्पर और/या /bin/node के माध्यम से जाते हैं, जो FortiOS वास्तव में शिप करता है। एक पुष्ट हिट को नेटवर्क एज का समझौता मानें, न कि एक क्रैश हुआ डेमॉन। देखें What a hit means।
poc.py — लॉन्चरऑपरेटर फ्रंट एंड (pocsuite3 POCBase)। यह CVE-2024-21762 या CVE-2023-27997 को लागू नहीं करता।
https://<target>/remote/login?lang=en प्राप्त करता है (फ़ॉलबैक GB2312)।/sslvpn/js/login.js?q=<md5> से कैश-बस्टर हैश खींचता है।VERSION_LIBS (182 hash,SKU,version पंक्तियाँ) में देखता है। वह तालिका ही कारण है कि किट ऑपरेटर द्वारा SKU नाम दिए बिना 50+ उपकरणों में चयन कर सकती है। मैट्रिक्स के समान SKU, SNMP या प्रबंधन API के बजाय एक सार्वजनिक SSL-VPN संसाधन हैश द्वारा संचालित।exp/exp_<SKU>-v<version>.py को हल करता है।s.js शामिल है → प्रकार 2 (Node लोडर)Shellcode Server का उल्लेख है → प्रकार 1 (स्टेगर); फिर स्क्रिप्ट में arm बनाम amd64 देखता हैexp_*.py को होस्ट/पोर्ट/कॉलबैक तर्कों के साथ Popen करता है।