
Controlador de Windows en modo kernel para la detección en tiempo real de técnicas de inyección de procesos, incluyendo inyección de shellcode, DLL e inyección reflectiva, con hookeo de syscalls y detección de anomalías.
FalconEye es un software de detección para endpoints Windows para inyecciones de procesos en tiempo real. Es un controlador en modo kernel que tiene como objetivo detectar inyecciones de procesos a medida que ocurren (tiempo real). Debido a que FalconEye se ejecuta en modo kernel, proporciona una defensa más sólida y confiable contra técnicas de inyección de procesos que intentan evadir varios hooks en modo usuario.
Puedes consultar nuestra presentación en 2021 Blackhat ASIA Arsenal y las diapositivas.
La tabla a continuación muestra el estado de implementación y la lógica de detección para las diversas técnicas de inyección de procesos. WPM significa WriteProcessMemory. Para probar la detección, se puede consultar la sección de referencias.
| Técnica | Estado | Detección | POC Utilizado |
|---|
| Atombombing | ✓ | Hook QueueUserAPC y buscar familia de funciones GlobalGetAtom | Pinjectra |
| Inyección mediante callback de instrumentación | ✓ | Detectar si se crea un nuevo hilo desde código flotante | https://github.com/antonioCoco/Mapping-Injection |
| Inyección de DLL reflectante | ✓ | Detectar si se crea un nuevo hilo desde código flotante y si se está escribiendo la cabecera PE en la víctima | MInjector |
| PROPagate | ✓ | Hook SetProp para obtener la dirección de la propiedad que se está escribiendo y correlacionar con las llamadas WPM anteriores para obtener la dirección del código flotante | Pinjectra |
| Vaciado de proceso | ✓ | Detectado mediante cabecera PE escrita en la memoria del proceso objetivo | MInjector |
| CreateRemoteThread con LoadLibrary | ✓ | Nuevo hilo con dirección de inicio apuntando a LoadLibrary. La versión de MInjector también escribe la ruta de la DLL usando WPM, lo cual también se detecta | MInjector, Pinjectra |
| CreateRemoteThread con MapViewOfFile | ✓ | Detectar si se crea un nuevo hilo desde código flotante | Pinjectra |
| Susponder-Inyectar-Reanudar | ✓ | Detectar si se crea un nuevo hilo desde código flotante (MInjector). Ruta de DLL escrita mediante WPM (MInjector). Detectar si se establece contexto en un hilo previamente suspendido (Pinjectra) | MInjector, Pinjectra |
| QueueUserAPC | ✓ | Ruta de DLL escrita mediante WPM | MInjector |
| QueueUserAPC con memset (Stackbombing) | ✓ | Hook QueueUserAPC y buscar memset | Pinjectra |
| SetWindowLong (Inyección en memoria de ventana extra) | ✓ | Hook SetWindowLong para obtener la dirección del puntero a función que se está escribiendo y correlacionar con las llamadas WPM anteriores para obtener la dirección del código flotante | Pinjectra |
| Desmapear + Sobrescribir | ✓ | Alertar si el proceso atacante está desmapeando ntdll de la víctima | Pinjectra |
| Kernel Ctrl Table | ✓ | Detectar si WPM está sobrescribiendo el campo KernelCallbackTable en el PEB de la víctima | https://github.com/odzhan/injection/blob/master/kct |
| USERDATA | ✓ | Verificar si la dirección objetivo de WPM está en el rango de conhost.exe. Si es así, comprobar si algún puntero a función relevante de conhost coincide con la dirección WPM almacenada previamente | https://github.com/odzhan/injection/blob/master/conhost |
| Ctrl-inject | ✓ | Detectar si el atacante realiza WPM en el rango de KernelBase.dll de la víctima | Pinjectra |
| ALPC Callback | ✓ | Extraer el pid de la víctima en llamadas NtConnectPort al puerto ALPC. Para el par atacante-víctima, verificar llamadas WPM anteriores y aplicar detección de código flotante | Pinjectra |
| WNF Callback | ✓ | WPM seguido de una llamada a UpdateWNFStateData | https://github.com/odzhan/injection/tree/master/wnf |
| SetWindowsHook | ✓ | Guardar las rutas de módulos registrados en el hook NtUserSetWindowsHookEx. Luego, cuando un módulo que coincide con esta ruta se carga en un proceso diferente, generar una alerta | MInjector |
| GhostWriting | ✓ | Detectar si se establece contexto (se llama a NtSetContextThread) en un hilo previamente suspendido | Pinjectra |
| Control de Servicio | ✓ | WPM sobrescribiendo el Service ID de un proceso (servicio) | https://github.com/odzhan/injection/tree/master/svcctrl |
| Inyección de shellcode | ✓ | Nuevo hilo iniciado desde código flotante. Ruta de DLL siendo escrita por WPM | MInjector |
| Mapeo de imagen | ✓ | Hilo iniciado desde código flotante. Cabecera PE siendo escrita por WPM. Ruta de DLL siendo escrita por WPM | MInjector |
| Reutilización de hilo | ✓ | Hilo iniciado desde código flotante. Ruta de DLL siendo escrita por WPM | MInjector |

NOTA: Nuestro enfoque ha sido la detección y no la creación de un motor de detección eficiente. Continuaremos estos esfuerzos después de la presentación de BlackHat.
.
├── src
│ ├── FalconEye ---------------------------# FalconEye espacio de usuario y kernel
│ └── libinfinityhook ---------------------# Implementación de hooks del kernel
├── 2021BHASIA_FalconEye.pdf
└── README.md
BCDEDIT /set nointegritychecks ONPavel Asinovsky. Sumergiéndose en la técnica no convencional de inyección de procesos de zberp, 2016
FalconEye está licenciado bajo la licencia de código abierto Apache 2.0.