Aquí es donde publicaré análisis de exploits públicos, o algunos de mis exploits 1day.
[ Análisis de exploits públicos ]
Personalmente creo que la mejor forma de aprender un exploit público es entenderlo línea por línea hasta comprenderlo al máximo. Publicaré algunos de estos exploits (excesivamente comentados ;) ) con la esperanza de que otros puedan aprender de ellos, y como un intento de devolver algo a la comunidad. También con fines de documentación, porque este tipo de cosas se van desvaneciendo de mi cabeza con el tiempo.
Este exploit sobrescribe un puntero a objeto en otro objeto. Utiliza un ataque ret2dir para hacer que el puntero corrupto apunte a una dirección fija predecible en el kernel que contiene la carga útil del exploit. Esta técnica de exploit evita PXN y PAN.
Este exploit borra 16 bytes de un objeto global útil, que se encuentra en una dirección fija del kernel.
Un puntero a objeto corrupto dentro del objeto global hace referencia a la carga útil del exploit desde userland. Este tipo de ataque no funcionará en dispositivos/kernels con PAN (o emulación de PAN).
extra_recipe
Mi intento de entender el jailbreak extra_recipe
Estaba especialmente interesado en la parte del bypass de kpp. Aunque había un par de diapositivas sobre el tema de las que podía obtener una imagen vaga del bypass, realmente quería profundizar en los detalles finos y ver qué está sucediendo realmente dentro del código
También quería entender los ingredientes finales para un jailbreak (instalar Cydia, etc.)
yalu102 (ViewController.m)
Comenté la parte relevante al bug real y cómo se explotaba.
La razón por la que investigué yalu102 en lugar del exploit original es porque la técnica de port-feng-shui parecía más limpia y directa de entender.
El análisis se detiene justo antes del bypass de kpp
Utiliza técnicas asombrosas para partir de primitivas realmente débiles, construir un AAR más fuerte y, finalmente, construir un task port completo. La magia de los puertos detrás del código del exploit es increíble. Todo esto con un desbordamiento de montón de 8 bytes NULL. Absolutamente alucinante.
He garabateado algunas ideas ingenuas para mejorar la fiabilidad. Espero que alguien publique una versión más fiable del exploit en el futuro. :)
Un enorme agradecimiento a kudima(@begger_dd) por el writeup tan claro, conciso y completamente anotado! :)
El writeup explica el bug de confusión de tipos en JIT, algunas limitaciones en las conversiones de boxing/unboxing (que podrían introducir falta de fiabilidad), y un recorrido detallado de cómo se construyen las primitivas AAR/AAW tempranas/tardías. También ofrece información sobre los cambios en las técnicas de explotación después de la reciente ronda de mitigaciones (index masking, envenenamiento del almacenamiento subyacente de ArrayBuffer, algunos cambios en el mecanismo del JIT W^X, cambios en la estructura de JSObject, etc.)
jsc_ConcatMemcpy_infoleak
Esta es una versión comentada del exploit de infoleak de WebKit de kudima (corregido el 2018.8.27).
Se origina a partir de una corrección incompleta de uno de los bugs reportados por lokihardt. El parche del informe de lokihardt corregía la primitiva de confusión de tipos Double -> Object, pero no la corregía en el otro sentido; Object -> Double.
Rocía el heap de webkit con butterflies que contienen un solo objeto y un marcador, y luego dispara el bug de concat y llena una gran porción de varios arrays de doubles con datos no inicializados del heap. Itera a través de los arrays de doubles no inicializados producidos por el concat defectuoso hasta encontrar la dirección del objeto previamente rociado, y la filtra.
Gracias de nuevo a kudima(@begger_dd) por el buen exploit y writeup! :)
[ 1Day ]
CVE-2017-2547
Un día miré el exploit de singi después de que se presentara en Zer0con 2018, y decidí mejorarlo.
Esta es una versión independiente del exploit, antes de integrarlo en pwnjs.
Las mejoras incluyen
Mayor fiabilidad (funciona perfectamente después de extensas sesiones de navegación con memoria contaminada)
Eliminados todos los offsets hardcodeados para hacerlo compatible con varias versiones de navegador
Usada una técnica de explotación diferente (la técnica estándar de desalineación)
Finalmente lo integré en el framework pwnjs creando un prototipo de webkit
Hice el código mucho más legible y añadí muchos comentarios
Agradecimientos especiales
qwertyoruiop y Samuel Grob por el increíble artículo de phrack y los exploits públicos
Brian Pak y Andrew Wesie por el genial framework pwnjs