Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
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
Triple_fetch — Este es un exploit para CVE-2017-7047, funciona en 10.3.2 y versiones anteriores. | Kitploit
Herramientas/GitHubGitHub/q1f3/triple_fetch
Escalada de PrivilegiosSeguridad iOSExplotaciónDepuradoresPost-ExplotaciónSeguridad MóvilHerramienta de Acceso RemotoDesarrollo de PayloadsExplotación de Binarios
GitHubq1f3/triple_fetch

Triple_fetch

Este es un exploit para CVE-2017-7047, funciona en 10.3.2 y versiones anteriores.

2hace 9 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
Ver Repositorio

triple_fetch - ianbeer [https://bugs.chromium.org/p/project-zero/issues/detail?id=1247]

Este es un exploit para CVE-2017-7047, un error lógico en libxpc que permitía a remitentes de mensajes maliciosos enviar objetos xpc_data que estaban respaldados por memoria compartida. Los consumidores de mensajes xpc no parecían esperar que los búferes de respaldo de los objetos xpc_data pudieran ser modificados por el remitente mientras son procesados por el receptor.

Este proyecto explota CVE-2017-7047 para construir un stub de debugserver remoto lldb de prueba de concepto capaz de adjuntarse a y permitir la depuración remota de todos los procesos de espacio de usuario en iOS.

Esta es una visión general de alto nivel del exploit, un análisis en profundidad podría seguir en una fecha posterior. Por ahora, consulte el código para más detalles :)

Parte I

El exploit ataca a NSXPC, una implementación de Llamada a Procedimiento Remoto Objective-C utilizada por muchos servicios de iOS (1). Un mensaje NSXPC consiste en un objeto serializado bplist16 dentro de un objeto xpc_data serializado en xpc dentro de un mensaje mach.

Entre otras cosas, el objeto bplist16 contiene una cadena de codificación de tipos de Objective-C (2) que será analizada por la función ___NSMS1 en CoreFoundation. Esta función no espera que el contenido de la cadena que está analizando cambie y este exploit usa eso para construir una primitiva de desbordamiento de montón explotando el hecho de que una cierta parte de la cadena se obtendrá de la memoria tres veces. Al alternar entre tres valores diferentes y cuidadosamente elegidos, podemos desbordar un tamaño de asignación de montón elegido con bytes arbitrarios.

minibplist16.c contiene una implementación mínima de la serialización bplist y una discusión de cómo funciona.

El mensaje xpc externo contiene el arreglo del montón (heap groom). Utiliza una implementación personalizada del protocolo de serialización XPC para preparar el montón creando diccionarios xpc con claves en conflicto para construir primitivas de asignación y liberación. El mensaje xpc externo también contiene un rociado de montón (heap spray) (usando múltiples copias de un objeto de memoria compartida para mantener bajo el uso de memoria) y un rociado de nombres de derechos de envío de puertos mach.

El desbordamiento apunta el puntero isa Class de un objeto Objective-C a un objeto falso rociado en el montón, de modo que cuando se llama a un método en ese objeto falso, la pila se pivota a una pequeña pila ROP. La ROP fuerza bruta a través de los nombres de derechos de envío de puertos mach rociados intentando enviar el derecho de envío del objetivo a su propio puerto de tarea a cada uno de los nombres de derechos de envío rociados candidatos. El exploit escucha en todos los puertos rociados y si el exploit tiene éxito recibe un derecho de envío al puerto de tarea del objetivo, momento en el que tiene control total sobre la tarea objetivo.

Interludio

El exploit ataca al servicio com.apple.CoreAuthentication.daemon alojado por el demonio coreauthd que se ejecuta como root. Se puede acceder a este servicio desde la sandbox de la aplicación. Un poco de experimentación después de que inicialmente logré que el exploit funcionara reveló que desde el contexto de coreauthd, la API processor_set_tasks puede obtener derechos de envío a los puertos de tarea de todos los procesos de espacio de usuario que se ejecutan en el dispositivo. Esto ha sido conocimiento público desde al menos 2012, y la historia está cubierta en profundidad por el prominente investigador de internos de iOS Jonathan Levin en su sitio (3). El código que Levin subió en 2015 aún funciona hoy en día: no requiere un dispositivo con jailbreak, solo root en un dispositivo estándar.

Parte II

El objetivo principal del depurador que quería construir con este exploit era poder adjuntarse a un proceso arbitrario, establecer puntos de interrupción e inspeccionar y alterar el estado de registros y memoria cuando se alcanzan. En lugar de implementar el protocolo remoto de gdb o lldb desde cero decidí hacer los cambios necesarios en el proyecto lldb debugserver y luego usar el exploit para ejecutarlo.

En lugar de usar puntos de interrupción por software que requieren deshabilitar o eludir la firma de código, el debugserver está parcheado para usar exclusivamente puntos de interrupción por hardware. ARM64 tiene 16 registros de puntos de interrupción por hardware, lo que significa que solo puedes tener un máximo de 16 puntos de interrupción activos.

El soporte prototipo para puntos de interrupción por hardware ARM existía en el código de lldb debugserver pero requería algo de pirateo para que funcionara. Por ejemplo, tuve que agregar código que parchea el puntero de función pthread_introspection_hook en el debugee para que siempre falle, de modo que pueda detectar la creación de nuevos hilos y propagar el estado de los puntos de interrupción por hardware a los hilos recién creados y continuar como si nunca hubiera fallado.

También he parcheado el código de attach y continue para suspender y reanudar directamente la tarea a través del puerto de tarea en lugar de usar ptrace y señales.

Consejos de compilación

Todo debería funcionar para todos los dispositivos iOS que ejecuten 10.0 a 10.3.2 inclusive. He probado en:

iPhone 7 + 10.3.2 iPod Touch + 10.1.1 iPad Mini 2 + 10.2

He incluido un binario debugserver precompilado que sugiero que uses, pero el parche para el debugserver de lldb también está incluido en debugserver.diff.

Compilar el debugserver no es demasiado difícil. Estaba trabajando con las siguientes revisiones de git: lldb: 0db640c4cd1ec4e4c2580336fa5f53be029c5bc7 llvm: ec48fd127774a4b67c72ea7c3057b5c964375e77 clang: b6e778e0bfa2fc32f8821c6b33762f5cb6724659

aplica el debugserver.diff proporcionado.

Para la compilación necesitas cmake (reciente) y ninja; puedes obtenerlos desde el código fuente o binarios desde tu gestor de paquetes de Mac favorito.

(4) tiene una guía sobre cómo configurar una compilación normal de llvm en MacOS que puede ser útil.

Necesitarás enlazar simbólicamente un montón de archivos de encabezado en tu SDK de iOS, al menos:

xpc/ launchd.h libproc.h sys/proc_info.h sys/kern_control.h net/route.h mach/mach_vm.h mach/shared_region.h sys/ptrace.h crt_externs.h

la siguiente invocación de cmake debería darte todas las pistas que necesitas:

cmake -G "Ninja" -DCMAKE_OSX_ARCHITECTURES="armv7;armv7s;arm64" -DCMAKE_TOOLCHAIN_FILE=../cmake/platforms/iOS.cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_BUILD_RUNTIME=Off -DLLVM_INCLUDE_TESTS=Off -DLLVM_INCLUDE_EXAMPLES=Off -DLLVM_ENABLE_BACKTRACES=Off ../

ninja debugserver

Luego necesitarás firmar o fakesignar el binario debugserver y reemplazar el que está en el proyecto xcode proporcionado.

Firma de código

El proyecto del exploit por defecto instalará una versión mejorada del hook amfid de mach_portal (esta vez con soporte funcional para archivos fat y sin offsets hardcodeados :) )

Si solo quieres depurar cosas, deberías poder firmar el binario debugserver con tu propio certificado y deshabilitar el hook amfid.

Si usas el hook amfid, ten en cuenta que la aplicación en la que se ejecuta aún está sujeta a límites de ejecución de código en segundo plano. La aplicación solicita más tiempo mediante beginBackgroundTaskWithName.

Uso:

Conecta tu host y el iDevice objetivo a la misma red inalámbrica y anota la dirección IP del iDevice.

Compila y ejecuta la aplicación del exploit. Recomiendo hacerlo dentro de xcode, pero funcionará de forma independiente.

Espera un poco. Si no funciona después de un par de minutos, reinicia el dispositivo por completo, espera un poco y luego inténtalo de nuevo.

Si funciona, debería imprimir “patched debugserver listening on port 1234”

Si haces clic en el botón “get process listing”, deberías ver la salida de ps

(es más fácil ver la salida si usas xcode, pero el exploit también mostrará la salida)

Busca el proceso objetivo que te interesa depurar y anota su pid.

en el host, ejecuta lldb desde la línea de comandos: $ lldb (lldb)

configura la plataforma a ios remote: (lldb) platform select remote-ios

conecta al stub de debugserver: (lldb) process connect connect://192.168.0.172:1234

(donde 192.168.0.172 es la dirección IP del iDevice)

adjúntate al proceso que te interesa: (lldb) attach 55

...espera un poco, debugserver se está ejecutando en modo verbose...

Process 55 stopped

Executable module set to "/usr/libexec/backboardd".

estás adjuntado :)

establece un punto de interrupción: (lldb) break set --name malloc Breakpoint 1: 4 locations.

continúa:

(lldb) c Process 55 resuming Process 55 stopped

  • thread #11, stop reason = breakpoint 1.3 frame #0: 0x00000001936161e0 libsystem_malloc.dylibmalloc libsystem_malloc.dylibmalloc: -> 0x1936161e0 <+0>: stp x20, x19, [sp, #-0x20]! 0x1936161e4 <+4>: stp x29, x30, [sp, #0x10] 0x1936161e8 <+8>: add x29, sp, #0x10 ; =0x10

obtén un backtrace:

(lldb) bt

  • thread #11, stop reason = breakpoint 1.3
  • frame #0: 0x00000001936161e0 libsystem_malloc.dylibmalloc frame #1: 0x0000000100099648 backboardd_mh_execute_header + 71240 frame #2: 0x00000001945bf218 CoreFoundation__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 56 frame #3: 0x00000001945be9cc CoreFoundation__CFRunLoopDoSource1 + 436 frame #4: 0x00000001945bc4b0 CoreFoundation__CFRunLoopRun + 1840 frame #5: 0x00000001944ea2b8 CoreFoundationCFRunLoopRunSpecific + 444 frame #6: 0x0000000194537b44 CoreFoundationCFRunLoopRun + 112 frame #7: 0x00000001000a5ba8 backboardd_mh_execute_header + 121768 frame #8: 0x00000001000a5bec backboardd_mh_execute_header + 121836 frame #9: 0x00000001936a5850 libsystem_pthread.dylib_pthread_body + 240 frame #10: 0x00000001936a5760 libsystem_pthread.dylib_pthread_start + 284 frame #11: 0x00000001936a2d94 libsystem_pthread.dylibthread_start + 4

Solución de problemas:

Instala la última versión de XCode (desarrollado y probado con 8.3.3) Si la conexión de lldb falla, asegúrate de tener instalado el SDK para la versión de iOS objetivo

Advertencias:

  • solo puedes establecer puntos de interrupción en 16 direcciones
  • detach aún no funciona
  • attach solo funciona por pid
  • solo objetivos de 64 bits
  • puedes obtener el puerto de tarea para launchd y leer/escribir memoria, pero attach se cuelga por el momento
  • si estás usando el hook amfid, ¡no podrás depurar amfid!

Espero solucionar estos problemas, pero estoy muy ocupado en este momento, ¡lo siento!

Ejecutando otros PoCs:

Si colocas un binario en la carpeta pocs de este proyecto, puedes hacer que el exploit lo ejecute seleccionándolo en la interfaz de usuario en el dispositivo y haciendo clic en "exec bundle binary".

Aún se ejecutará dentro de la sandbox de la aplicación, pero si la aplicación tiene un símbolo llamado privileged_task_port, se le otorgará un derecho de envío al puerto de tarea de launchd. La carpeta triple_fetch_sdk contiene un proyecto de ejemplo que muestra cómo usar esto para construir PoCs, por ejemplo, para desencadenar comportamientos en procesos interesantes que luego puedes depurar usando el debugserver.

También contiene las APIs remote call/ports/files/memory que te permiten llamar fácilmente a funciones en otros procesos y mover descriptores de archivos, puertos mach y memoria.

(1) [https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html] (2) [https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html] (3) [http://newosxbook.com/articles/PST2.html] (4) [https://gist.github.com/thlorenz/a068c202f2487ec13809]

Este proyecto contiene código (debugserver.diff) y un binario (debugserver) basados en lldb que están sujetos a la siguiente licencia:

University of Illinois/NCSA Open Source License

Copyright (c) 2010 Apple Inc. All rights reserved.

Developed by:

LLDB Team

http://lldb.llvm.org/

Por la presente se otorga permiso, de forma gratuita, a cualquier persona que obtenga una copia de este software y los archivos de documentación asociados (el "Software"), para tratar con el Software sin restricción, incluidos, entre otros, los derechos de usar, copiar, modificar, fusionar, publicar, distribuir, sublicenciar y/o vender copias del Software, y para permitir a las personas a quienes se les proporcione el Software que lo hagan, sujeto a las siguientes condiciones:

  • Las redistribuciones del código fuente deben conservar el aviso de copyright anterior, esta lista de condiciones y las siguientes renuncias.

  • Las redistribuciones en forma binaria deben reproducir el aviso de copyright anterior, esta lista de condiciones y las siguientes renuncias en la documentación y/u otros materiales proporcionados con la distribución.

  • Ni los nombres del equipo LLDB, los titulares de derechos de autor, ni los nombres de sus colaboradores pueden usarse para respaldar o promocionar productos derivados de este Software sin permiso previo por escrito específico.

EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA, INCLUYENDO PERO NO LIMITADO A LAS GARANTÍAS DE COMERCIABILIDAD, IDONEIDAD PARA UN PROPÓSITO PARTICULAR Y NO INFRACCIÓN. EN NINGÚN CASO LOS COLABORADORES O TITULARES DE DERECHOS DE AUTOR SERÁN RESPONSABLES DE CUALQUIER RECLAMO, DAÑOS U OTRA RESPONSABILIDAD, YA SEA EN UNA ACCIÓN CONTRACTUAL, EXTRACONTRACTUAL O DE OTRO TIPO, QUE SURJA DE, FUERA O EN CONEXIÓN CON EL SOFTWARE O EL USO U OTRAS NEGOCIACIONES CON EL SOFTWARE.

Descargar herramienta