macOS .Net Applications Injection
Este es un resumen del post https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/. ¡Consultalo para más detalles!
Depuración de .NET Core
Estableciendo una Sesión de Depuración
El manejo de la comunicación entre el depurador y el depurado en .NET es gestionado por dbgtransportsession.cpp. Este componente establece dos named pipes por proceso .NET como se ve en dbgtransportsession.cpp#L127, que son iniciados a través de twowaypipe.cpp#L27. Estos pipes tienen los sufijos -in
y -out
.
Al visitar el directorio $TMPDIR
del usuario, se pueden encontrar FIFOs de depuración disponibles para depurar aplicaciones .Net.
DbgTransportSession::TransportWorker es responsable de gestionar la comunicación desde un depurador. Para iniciar una nueva sesión de depuración, un depurador debe enviar un mensaje a través del pipe out
comenzando con una estructura MessageHeader
, detallada en el código fuente de .NET:
Para solicitar una nueva sesión, esta estructura se completa de la siguiente manera, estableciendo el tipo de mensaje en MT_SessionRequest
y la versión del protocolo en la versión actual:
Este encabezado se envía al objetivo utilizando la llamada al sistema write
, seguido por la estructura sessionRequestData
que contiene un GUID para la sesión:
Una operación de lectura en la tubería out
confirma el éxito o fracaso del establecimiento de la sesión de depuración:
Leyendo la memoria
Una vez que se establece una sesión de depuración, la memoria se puede leer utilizando el tipo de mensaje MT_ReadMemory
. La función readMemory está detallada, realizando los pasos necesarios para enviar una solicitud de lectura y recuperar la respuesta:
El concepto de prueba completo (POC) está disponible aquí.
Escribiendo en la memoria
De manera similar, la memoria puede ser escrita utilizando la función writeMemory
. El proceso implica establecer el tipo de mensaje en MT_WriteMemory
, especificar la dirección y longitud de los datos, y luego enviar los datos:
El POC asociado está disponible aquí.
Ejecución de código en .NET Core
Para ejecutar código, es necesario identificar una región de memoria con permisos rwx, lo cual se puede hacer utilizando vmmap -pages:
Encontrar un lugar para sobrescribir un puntero de función es necesario, y en .NET Core, esto se puede hacer apuntando a la Tabla de Funciones Dinámicas (DFT). Esta tabla, detallada en jithelpers.h
, es utilizada por el tiempo de ejecución para funciones auxiliares de compilación JIT.
Para sistemas x64, la caza de firmas se puede utilizar para encontrar una referencia al símbolo _hlpDynamicFuncTable
en libcorclr.dll
.
La función de depuración MT_GetDCB
proporciona información útil, incluida la dirección de una función auxiliar, m_helperRemoteStartAddr
, que indica la ubicación de libcorclr.dll
en la memoria del proceso. Esta dirección se utiliza luego para iniciar la búsqueda de la DFT y sobrescribir un puntero de función con la dirección del shellcode.
El código POC completo para la inyección en PowerShell es accesible aquí.
Referencias
Última actualización