
Prueba de concepto, herramienta y análisis técnico profundo de Process Herpaderping. Process Herpaderping sortea los productos de seguridad ocultando las intenciones de un proceso.
Process Herpaderping es un método para ocultar las intenciones de un proceso
modificando el contenido en disco después de que la imagen haya sido mapeada. Esto
resulta en un comportamiento curioso por parte de los productos de seguridad y del propio sistema operativo.


Generalmente, un producto de seguridad actúa sobre la creación de procesos registrando un callback en el kernel de Windows (PsSetCreateProcessNotifyRoutineEx). En ese momento, un producto de seguridad puede inspeccionar el archivo que se usó para mapear el ejecutable y determinar si este proceso debe permitirse ejecutar. Este callback del kernel se invoca cuando se inserta el hilo inicial, no cuando se crea el objeto del proceso.
Debido a esto, un actor puede crear y mapear un proceso, modificar el contenido del
archivo y luego crear el hilo inicial. Un producto que realice la inspección en el
callback de creación vería el contenido modificado. Además, algunos productos
utilizan un enfoque de escaneo en escritura que consiste en monitorear las escrituras en archivos.
Una optimización común aquí es registrar que el archivo ha sido escrito y
diferir la inspección real hasta que ocurra IRP_MJ_CLEANUP
(por ejemplo, cuando se cierra el identificador del archivo). Por lo tanto, un actor que
utilice un flujo de trabajo escribir -> mapear -> modificar -> ejecutar -> cerrar
sorteará el escaneo en escritura que se basa únicamente en la inspección en
IRP_MJ_CLEANUP.
Para abusar de esta convención, primero escribimos un binario en un archivo destino en disco. Luego, mapeamos una imagen del archivo destino y se la proporcionamos al sistema operativo para que la use en la creación del proceso. El sistema operativo amablemente mapea el binario original por nosotros. Usando el identificador de archivo existente, y antes de crear el hilo inicial, modificamos el contenido del archivo destino para ocultar o falsear el archivo que respalda la imagen. Algún tiempo después, creamos el hilo inicial para comenzar la ejecución del binario original. Finalmente, cerraremos el identificador del archivo destino. Recorramos esto paso a paso:
NtCreateProcessEx).NtCreateThreadEx).
@startuml
hide empty description
[*] --> CreateFile
CreateFile --> FileHandle
FileHandle --> Write
FileHandle --> NtCreateSection
Write -[hidden]-> NtCreateSection
NtCreateSection --> SectionHandle
SectionHandle --> NtCreateProcessEx
FileHandle --> Modify
NtCreateProcessEx -[hidden]-> Modify
NtCreateProcessEx --> NtCreateThreadEx
Modify -[hidden]-> NtCreateThreadEx
NtCreateThreadEx --> [*]
FileHandle --> CloseFile
NtCreateThreadEx -[hidden]-> CloseFile
NtCreateThreadEx --> PspCallProcessNotifyRoutines
PspCallProcessNotifyRoutines -[hidden]-> [*]
CloseFile --> IRP_MJ_CLEANUP
IRP_MJ_CLEANUP -[hidden]-> [*]
PspCallProcessNotifyRoutines --> Inspect
PspCallProcessNotifyRoutines -[hidden]-> CloseFile
IRP_MJ_CLEANUP --> Inspect
Inspect -[hidden]-> [*]
CreateFile : Create target file, keep handle open.
Write : Write source payload into target file.
Modify : Obscure the file on disk.
NtCreateSection : Create section using file handle.
NtCreateProcessEx : Image section for process is mapped and cached in file object.
NtCreateThreadEx : The cached section is used.
NtCreateThreadEx : Process notify routines fire in kernel.
Inspect : The contents on disk do not match what was executed.
Inspect : Inspection of the file at this point will result in incorrect attribution.
@enduml
Verá en la demostración a continuación que se utiliza CMD.exe como destino de ejecución.
La primera ejecución sobrescribe los bytes en disco con un patrón. La segunda ejecución sobrescribe
CMD.exe con ProcessHacker.exe. La herramienta Herpaderping arregla el binario para
que se parezca lo más posible a ProcessHacker.exe, incluso conservando la firma
original. Observe las múltiples ejecuciones del mismo binario y cómo el proceso
se ve para el usuario en comparación con lo que hay en el archivo en disco.


Hemos observado el comportamiento y parte de esto puede ser sorprendente. Intentemos explicar este comportamiento.
Al diseñar productos para asegurar plataformas Windows, muchos ingenieros en este campo (yo incluido) han caído en nociones preconcebidas con respecto a cómo el sistema operativo manejará los datos. En este escenario, algunos podrían esperar que el archivo en disco permanezca "bloqueado" cuando se crea el proceso. No se puede eliminar el archivo. No se puede escribir en él. Pero se puede renombrar. Como se ve aquí, bajo las condiciones adecuadas, de hecho se puede escribir en él. Permanezcan vigilantes sobre sus suposiciones, cuéstionenlas siempre e investiguen.
La motivación para esta investigación surgió al descubrir cómo realizar análisis cuando se escribe un archivo. Con antecedentes previos investigando el Hollowing de procesos y el Doppelganging, había teorizado que esto podría ser posible. El objetivo es proporcionar una mejor seguridad. No se puede crear una mejor cerradura sin antes comprender cómo romper la antigua.
Herpaderping es similar a Hollowing y Doppelganging, sin embargo, hay algunas diferencias clave:
Process Hollowing implica modificar la sección mapeada antes de que comience la ejecución,
lo que abstractamente se ve así: mapear -> modificar sección -> ejecutar. Este flujo de trabajo
hace que el flujo de ejecución previsto del proceso hollowed (vaciado) diverja hacia
código no previsto. Doppelganging podría considerarse una forma de Hollowing.
Sin embargo, Hollowing, en mi opinión, está más cerca de la inyección en el sentido de que
generalmente implica una escritura explícita en el código ya mapeado. Esto difiere
de Herpaderping donde no hay secciones modificadas.
Process Doppelganging está más cerca de Herpaderping. Doppelganging abusa de
operaciones de archivos transaccionados y generalmente implica estos pasos:
transaccionar -> escribir -> mapear -> revertir -> ejecutar.
En este flujo de trabajo, el sistema operativo creará la sección de imagen y tendrá en cuenta las
transacciones, por lo que la sección de imagen en caché termina siendo lo que se escribió en la
transacción. El sistema operativo ha parcheado esta técnica. Bueno, parchearon el bloqueo que causaba.
Quizás consideran esto un uso "legal" de una transacción. Afortunadamente, Windows
Defender detecta la técnica Doppelganging. Doppelganging difiere de
Herpaderping en que Herpaderping no depende de operaciones de archivos transaccionados.
Y Defender no detecta Herpaderping.
Para referencia, las técnicas generalizadas:
| Tipo | Técnica |
|---|---|
| Hollowing | mapear -> modificar sección -> ejecutar |
| Doppelganging | transaccionar -> escribir -> mapear -> revertir -> ejecutar |
| Herpaderping | escribir -> mapear -> modificar -> ejecutar -> cerrar |
Podemos ver las diferencias expuestas aquí. Si bien Herpaderping es posiblemente más ruidoso que Doppelganging, en el sentido de que los bits maliciosos sí llegan al disco, hemos visto que los productos de seguridad siguen siendo incapaces de detectar Herpaderping.
No hay una solución clara aquí. Parece razonable que evitar que una sección de imagen sea mapeada/almacenada en caché cuando hay acceso de escritura al archivo debería cerrar la brecha. Sin embargo, eso puede o no ser una solución práctica.
Otra opción podría ser vaciar los cambios realizados al archivo a través de la sección
de imagen en caché si aún no se ha mapeado en un proceso. Sin embargo, dado que el
mapeo en el nuevo proceso ocurre en NtCreateProcess, probablemente esa no sea una
solución viable.
Desde el punto de vista de la detección, no hay una buena manera de identificar los bits
reales que se mapearon; la inspección en IRP_MJ_CLEANUP o
en un callback registrado en
PsSetCreateProcessNotifyRoutineEx
resulta en una atribución incorrecta ya que los bits en disco han sido cambiados;
habría que reconstruir el archivo a partir de la sección que se creó. Vale la pena
señalar aquí que hay un nuevo callback en Windows 10 que se puede registrar:
PsSetCreateProcessNotifyRoutineEx2;
sin embargo, este sufre el mismo problema que el callback anterior: se
invoca cuando se ejecuta el hilo inicial, no cuando se crea el objeto del proceso.
Microsoft agregó
PsSetCreateThreadNotifyRoutineEx, el cual
se invoca cuando se inserta el hilo inicial si se registra con
PsCreateThreadNotifyNonSystem, a diferencia de
cuando está a punto de comenzar la ejecución (como hacía el callback anterior). Extender
PSCREATEPROCESSNOTIFYTYPE para que se invoque
cuando se crea el objeto del proceso tampoco ayudará; hemos visto en la
sección Profundizando que el objeto de la sección de imagen se
almacena en caché en la llamada a NtCreateSection, no
en NtCreateProcess.
No podemos identificar fácilmente qué se ejecutó. Nos queda intentar detectar el comportamiento explotador por parte del actor; dejo el descubrimiento de los indicadores de comportamiento como ejercicio para el lector.
A continuación se muestra una lista de productos y sistemas operativos Windows que han sido probados a fecha de (31/8/2020). Las pruebas se realizaron con un binario malicioso conocido.
Esta vulnerabilidad fue divulgada al Microsoft Security Response Center (MSRC) el 17/7/2020 y se abrió un caso por MSRC el 22/7/2020. MSRC concluyó su investigación el 25/8/2020 y determinó que los hallazgos son válidos pero no cumplen con su criterio para un servicio inmediato. En este momento, su caso está cerrado, sin resolución, y marcado para revisión futura, sin un cronograma.
No estamos de acuerdo con la gravedad de este error; esto fue comunicado a MSRC el 27/8/2020.
Este repositorio contiene una herramienta para ejercitar el método Herpaderping de ofuscación de procesos. El uso es el siguiente:
Process Herpaderping Tool - Copyright (c) Johnny Shaw
ProcessHerpaderping.exe SourceFile TargetFile [ReplacedWith] [Options...]
Usage:
SourceFile Source file to execute.
TargetFile Target file to execute the source from.
ReplacedWith File to replace the target with. Optional,
default overwrites the binary with a pattern.
-h,--help Prints tool usage.
-d,--do-not-wait Does not wait for spawned process to exit,
default waits.
-l,--logging-mask number Specifies the logging mask, defaults to full
logging.
0x1 Successes
0x2 Informational
0x4 Warnings
0x8 Errors
0x10 Contextual
-q,--quiet Runs quietly, overrides logging mask, no title.
-r,--random-obfuscation Uses random bytes rather than a pattern for
file obfuscation.
-e,--exclusive Target file is created with exclusive access and
the handle is held open as long as possible.
Without this option the handle has full share
access and is closed as soon as possible.
-u,--do-not-flush-file Does not flush file after overwrite.
-c,--close-file-early Closes file before thread creation (before the
process notify callback fires in the kernel).
Not valid with "--exclusive" option.
-k,--kill Terminates the spawned process regardless of
success or failure, this is useful in some
automation environments. Forces "--do-not-wait
option.
El repositorio utiliza submódulos; después de clonar, asegúrese de inicializar y actualizar los submódulos. Los archivos de proyecto están orientados a Visual Studio 2019.
git clone https://github.com/jxy-s/herpaderping.git
cd .\herpaderping\
git submodule update --init --recursive
MSBuild .\herpaderping.sln
Los siguientes se utilizan sin modificaciones. Créditos a sus autores.
| Sistema Operativo | Versión | Vulnerable |
|---|
| Windows 7 Enterprise x86 | 6.1.7601 | Sí |
| Windows 10 Pro x64 | 10.0.18363.900 | Sí |
| Windows 10 Pro Insider Preview x64 | 10.0.20170.1000 | Sí |
| Windows 10 Pro Insider Preview x64 | 10.0.20201.1000 | Sí |
| Producto de Seguridad | Versión | Vulnerable |
|---|
| Windows Defender AntiMalware Client | 4.18.2006.10 | Sí |
| Windows Defender Engine | 1.1.17200.2 | Sí |
| Windows Defender Antivirus | 1.319.1127.0 | Sí |
| Windows Defender Antispyware | 1.319.1127.0 | Sí |
| Windows Defender AntiMalware Client | 4.18.2007.6 | Sí |
| Windows Defender Engine | 1.1.17300.2 | Sí |
| Windows Defender Antivirus | 1.319.1676.0 | Sí |
| Windows Defender Antispyware | 1.319.1676.0 | Sí |
| Windows Defender AntiMalware Client | 4.18.2007.8 | Sí |
| Windows Defender Engine | 1.1.17400.5 | Sí |
| Windows Defender Antivirus | 1.323.267.0 | Sí |
| Windows Defender Antispyware | 1.323.267.0 | Sí |