
Implementando Ghostly-Hollowing usando syscalls manipuladas para inyección remota de PE
[!NOTE] El repositorio original utilizaba anteriormente una licencia incorrecta que omitía la atribución al fundador de DeceptIQ, @Rad9800, cuyo repositorio TamperingSyscalls se publica bajo la Licencia MIT. Su trabajo ya estaba acreditado en el módulo del curso (Tampered Syscalls Via Hardware BreakPoints) y también se refleja en nuestra Página de Licencias de Terceros pública.
Al enterarnos de la omisión, corregimos de inmediato el repositorio original y contactamos con Rad el mismo día para disculparnos por el descuido. A pesar de nuestros mejores esfuerzos por corregir el error involuntario, no respondió y bloqueó cualquier comunicación posterior, y recibimos un aviso de retirada DMCA cinco meses después, lo que resultó en la eliminación del repositorio original.
Desafortunadamente, la escalada de mala fe nos dejó sin una vía práctica para resolver el asunto, por lo que hemos vuelto a subir el repositorio con la licencia y la atribución correctas.
Plan de estudios de Maldev Academy
Esta implementación utiliza dos técnicas tratadas en las actualizaciones recientes del curso de Maldev Academy:
Tampered Syscalls Via Hardware BreakPoints: Se utiliza para evadir hooks en modo usuario mientras se suplantan simultáneamente los argumentos del syscall invocado.
Ghostly Hollowing: Una técnica híbrida entre Process Hollowing y Process Ghosting.
Todos los syscalls invocados en la implementación se llaman a través de la macro TAMPER_SYSCALL. Esta macro llama a la función StoreTamperedSyscallParms para:
syscall dentro del stub del syscall NtQuerySecurityObject (es decir, el syscall señuelo) y establecer un breakpoint de hardware en esa dirección.Al llamar a la macro TAMPER_SYSCALL, TAMPER_SYSCALL suplantará los primeros cuatro argumentos del syscall invocado con valores NULL. Luego llamará al syscall NtQuerySecurityObject, activando el breakpoint instalado anteriormente.
Manejamos la excepción generada reemplazando el SSN del syscall señuelo (NtQuerySecurityObject) por el SSN del syscall realmente invocado (por ejemplo, el SSN de ZwAllocateVirtualMemory). Luego reemplazamos los argumentos suplantados por los reales. Estos pasos se ejecutan en la función VEH ExceptionHandlerCallbackRoutine.
Obtener el payload PE: La implementación obtiene el payload PE (mimikatz.exe) del disco. En una situación ideal, deberías cifrar el payload y almacenarlo en la sección de recursos.
Crear un archivo vacío en el disco: Se crea un archivo temporal (.tmp) en el directorio $env:TMP. Este archivo se sobrescribirá más tarde con el payload PE.
Crear una sección fantasma a partir del archivo temporal: Se crea una sección fantasma llamando a ZwCreateSection para crear una sección a partir del archivo .tmp pendiente de eliminación, cerrando el manejador del archivo y eliminando el archivo del disco.
Crear un proceso remoto: Usando la WinAPI CreateProcess, creamos un proceso remoto y mapeamos la sección fantasma en él.
Parchear el ImageBaseAddress: Parchear el elemento ImageBaseAddress de la estructura PEB para que apunte a la sección fantasma mapeada y ejecutar el punto de entrada del payload PE mediante secuestro de hilo.
Un enorme agradecimiento a hasherezade por publicar Ghostly Hollowing y todas sus demás interesantes técnicas de inyección.