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 manera de aprender un exploit público es entendiéndolo línea por línea hasta que pueda comprender el exploit al máximo. Publicaré algunos de estos exploits (excesivamente comentados ;) ) para que, con suerte, otros puedan aprender de ellos, y como un intento de devolver algo a la comunidad. También con fines de documentación, porque estas cosas se desvanecen de mi cabeza a medida que pasa el tiempo.
Este exploit sobrescribe un puntero a objeto en otro objeto. Utiliza el 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 en el 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 error real y cómo fue explotado.
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
extra_recipe-master de xerub (jailbreak.c, unjail.m, patchfinder64.c, pte_stuff.h)
Salté aquí porque tenía un poco más de información sobre los diversos offsets numéricos.
Además, el patchfinder.c está intacto, a diferencia de yalu102 del que solo hay un archivo objeto.
La parte de cydia está algo incompleta, así que salto a la rama cydia después de kpp
extra_recipe-cydia de xerub (unjail.m)
Tratando de entender los ingredientes para un jailbreak después de tfp0 y la post-explotación
Utiliza técnicas asombrosas para comenzar desde 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 heap de 8 bytes NULL. Absolutamente alucinante.
He garabateado algunas ideas ingenuas para mejorar la fiabilidad. Esperemos que alguien publique una versión más fiable del exploit en el futuro. :)
¡Un enorme agradecimiento a kudima(@begger_dd) por el writeup muy claro y conciso, minuciosamente 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 proporciona información sobre los cambios en las técnicas de explotación después de la reciente ronda de mitigaciones(index masking, envenenamiento del backing store de ArrayBuffer, algunos cambios en el mecanismo de W^X JIT, 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 en 2018.8.27).
Se origina de un arreglo incompleto de uno de los bugs reportados por lokihardt. El parche del informe de lokihardt corrigió la primitiva de confusión de tipos Double -> Object, pero no la corrigió al revés; Object -> Double.
Rocía el heap de webkit con butterflies que contienen un solo objeto y un marcador, y más tarde activa el bug de concat y llena una gran porción de varios double arrays con datos de heap no inicializados. Itera a través de los double arrays no inicializados producidos por el concat con bug hasta que encuentra la dirección del objeto previamente rociado y la filtra.
Gracias de nuevo a kudima(@begger_dd) por el buen exploit y el writeup. :)
jsc_prop_enum_uaf
Esta es otra contribución de kudima. Es una versión comentada del exploit de ejecución remota de código en WebKit de kudima(corregido en este commit). Está corregido en iOS 12.1 y funciona hasta iOS 12.0.1.
El problema es que mientras se ejecuta código en bucles forin con baseline-jitted, se puede introducir código que libera el objeto StructureID que respalda el JSOBject y activa el recolector de basura, pero el recolector de basura no marca el miembro "JSPropertyNameEnumerator->m_cachedStructureID", y el objeto StructureID al que apunta "JSPropertyNameEnumerator->m_cachedStructureID" se libera durante la fase de barrido, lo que resulta en un puntero colgante.
Después de que el objeto StructureID se libera con GC, puedes introducir código que crea un nuevo objeto StructureID, que ocupa la ranura del "objeto StructureID" previamente liberado.
Al liberar el StructureID del objeto A, y luego hacer que el objeto B cree un nuevo StructureID que ocupe su lugar, es posible crear una situación de confusión de tipos porque "JSPropertyNameEnumerator->m_cachedInlineCapacity" se establece al tamaño de propiedad inline del objeto A, mientras que "JSPropertyNameEnumerator->m_cachedStructureID" apunta al nuevo objeto Structure ID que representa al objeto B. Esto hace que una verificación en 'op_get_direct_pname' pase y permite que el objeto B acceda a propiedades inline fuera de sus límites.
Esto puede ser abusado para construir primitivas más fuertes como AAR/AAW, y luego usarlo para ejecutar código arbitrario.
Gracias a kudima(@begger_dd) por el genial exploit y el writeup muy detallado. :)
[ 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 del navegador
Usé 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 agregué 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 increíble framework pwnjs!