
Kali365 - نسخة EvilTokens
خادم تصيد برمز الجهاز لمحاكاة الخصم. يلتقط رموز OAuth لمايكروسوفت 365 عبر تدفق ترخيص الجهاز. مستوحى من GraphSpy.
تحذير — الاستخدام المصرح به فقط. هذه الأداة مخصصة لمختبرِي الاختراق وفرق الأحمر الذين يعملون تحت تصريح كتابي صريح. قد يؤدي سوء الاستخدام إلى انتهاك قوانين الاحتيال الحاسوبي.
microsoft.com/devicelogin.خلفية Python (منفذ واحد لكل حملة) + واجهة nginx أمامية + تخزين SQLite.
main_server.py ← نقطة دخول موحدة (شغّل هذا)
db.py ← طبقة تخزين SQLite
html_enroll.py ← باني صفحة تسجيل الضحية
html_search.py ← باني صفحة بحث ما بعد المصادقة للضحية
css_shared.py ← 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='' لتعطيل الإدارة التلقائية لـ nginx.docker compose up --build
المنافذ المكشوفة بواسطة Docker:
| المنفذ | الغرض |
|---|---|
80 | nginx — حركة مرور الضحية القائمة على النطاق |
3000 | Python — واجهة المشغل + وصول مباشر للضحية |
http://localhost:3000/http://localhost:3000/apphttp://<campaign-domain>/ (تُوجه عبر nginx على المنفذ 80)يتم تخزين الرموز الملتقطة والسجلات في وحدات تخزين 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 إلى POST /relay/checkin على اللوحة الرئيسية، مع المصادقة باستخدام 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 يعمل بشكل صحيح.
الوصول:
| الرابط | الغرض |
|---|---|
http://localhost:8082/ | صفحة تسجيل ضحية الترحيل |
http://localhost:3000/app/nodes | عرض المشغل لعُقد الترحيل المسجلة |
الترحيل فقط (لوحة عن بعد):
cd php-relay
# عيّن MAIN_SERVER_URL إلى رابط اللوحة العامة في .env
docker compose up --build
openssl rand -hex 32RELAY_SECRET=<secret> في EasyTokens/.env (تلتقطه اللوحة الرئيسية عبر docker-compose.yml)php-relay/.envجدولان في قاعدة بيانات SQLite:
tokens — كل رمز وصول/تحديث تم التقاطه (UPN، رمز الوصول، رمز التحديث، رمز الهوية، النطاق، المصدر، طابع وقت الالتقاط)device_codes — الحملات التي بدأها المشغل (رمز المستخدم، رمز الجهاز، رابط التحقق، الحالة، معرّف الرمز المرتبط، المنفذ، النطاق)MIT — حقوق النشر (c) 2026 Casey Smith
| الطريقة | المسار | الجمهور | الوصف |
|---|
GET | / | الضحية | صفحة تسجيل رمز الجهاز (تصميم Dunder Mifflin) |
POST | /poll | الضحية (JS) | استقصاء نقطة نهاية الرموز في مايكروسوفت؛ تخزين الرمز عند النجاح |
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 | أمر shell لإعادة تحميل nginx بعد تغيير الإعدادات؛ اضبط على '' لتعطيل |
RELAY_SECRET | (غير مضبوط) | سر مشترك لمصادقة عقدة الترحيل. أنشئ باستخدام openssl rand -hex 32. يجب أن يتطابق مع RELAY_SECRET في php-relay/.env. اترك غير مضبوط لتعطيل دعم الترحيل. |
| المتغير | الافتراضي | الوصف |
|---|
MAIN_SERVER_URL | http://easytokens:3000 | رابط اللوحة الرئيسية الذي يمكن الوصول إليه من داخل حاوية الترحيل |
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 |
| رابط رمز الجهاز | https://login.microsoftonline.com/common/oauth2/devicecode |
| رابط الرمز المميز | https://login.microsoftonline.com/Common/oauth2/token |