
Driver in modalità kernel per Windows per il rilevamento in tempo reale di tecniche di iniezione di processi, inclusi shellcode, DLL e iniezione riflessiva, con hooking di syscall e rilevamento di anomalie.
FalconEye è un software di rilevamento endpoint Windows per iniezioni di processi in tempo reale. È un driver in modalità kernel che mira a intercettare le iniezioni di processi mentre avvengono (in tempo reale). Poiché FalconEye viene eseguito in modalità kernel, fornisce una difesa più forte e affidabile contro le tecniche di iniezione di processi che cercano di eludere vari hook in modalità utente.
Puoi consultare la nostra presentazione al 2021 Blackhat ASIA Arsenal e le slide.
La tabella seguente mostra lo stato di implementazione e la logica di rilevamento per le varie tecniche di iniezione di processi. WPM sta per WriteProcessMemory. Per testare il rilevamento, si può fare riferimento alla sezione dei riferimenti.
| Tecnica | Stato | Rilevamento | POC Utilizzato |
|---|---|---|---|
| Atombombing | ✓ | Hook di QueueUserAPC e ricerca delle funzioni della famiglia GlobalGetAtom | Pinjectra |
| Instrumentation callback injection | ✓ | Rileva se un nuovo thread viene creato da codice fluttuante | https://github.com/antonioCoco/Mapping-Injection |
| Reflective DLL Injection | ✓ | Rileva se un nuovo thread viene creato da codice fluttuante e se l'intestazione PE viene scritta nella vittima | MInjector |
| PROPagate | ✓ | Hook di SetProp per ottenere l'indirizzo della proprietà scritta e correlare con le precedenti chiamate WPM per ottenere l'indirizzo del codice fluttuante | Pinjectra |
| Process Hollowing | ✓ | Rilevato utilizzando l'intestazione PE scritta nella memoria del processo target | MInjector |
| CreateRemoteThread with LoadLibrary | ✓ | Nuovo thread con indirizzo di inizio che punta a LoadLibrary. La versione MInjector scrive anche il percorso della DLL tramite WPM, che viene anch'esso rilevato | MInjector, Pinjectra |
| CreateRemoteThread with MapViewOfFile | ✓ | Rileva se un nuovo thread viene creato da codice fluttuante | Pinjectra |
| Suspend-Inject-Resume | ✓ | Rileva se un nuovo thread viene creato da codice fluttuante (MInjector). Percorso DLL scritto tramite WPM (MInjector). Rileva se il contesto viene impostato su un thread precedentemente sospeso (Pinjectra) | MInjector, Pinjectra |
| QueueUserAPC | ✓ | Percorso DLL scritto tramite WPM | MInjector |
| QueueUserAPC with memset (Stackbombing) | ✓ | Hook di QueueUserAPC e ricerca di memset | Pinjectra |
| SetWindowLong (Extra window memory injection) | ✓ | Hook di SetWindowLong per ottenere l'indirizzo del puntatore a funzione scritto e correlare con le precedenti chiamate WPM per ottenere l'indirizzo del codice fluttuante | Pinjectra |
| Unmap + Overwrite | ✓ | Avviso se il processo attaccante sta smappando ntdll dalla vittima | Pinjectra |
| Kernel Ctrl Table | ✓ | Rileva se WPM sta sovrascrivendo il campo KernelCallbackTable nel PEB della vittima | https://github.com/odzhan/injection/blob/master/kct |

NOTA: Il nostro focus è stato il rilevamento e non la creazione di un motore di rilevamento performante. Continueremo questi sforzi oltre la presentazione al BlackHat.
.
├── src
│ ├── FalconEye ---------------------------# FalconEye user and kernel space
│ └── libinfinityhook ---------------------# Kernel hook implementation
├── 2021BHASIA_FalconEye.pdf
└── README.md
BCDEDIT /set nointegritychecks ONAtombombing: Brand new code injection for windows, 2016
Propagate - a new code injection trick, 2017
Windows process injection: Extra window bytes, 2018
Pavel Asinovsky. Diving into zberp's unconventional process injection technique, 2016
Rotem Kerner. Ctrl-inject, 2018
Windows process injection: Consolewindowclass, 2018
Windows process injection: Windows notication facility, 2018
A paradox: Writing to another process without openning it nor actually writing to it, 2007
Windows process injection: Service control handler, 2018
FalconEye è concesso in licenza a te secondo la licenza open source Apache 2.0.
| USERDATA | ✓ | Verifica se l'indirizzo target di WPM è nell'intervallo di conhost.exe. In tal caso, verifica se eventuali puntatori a funzione rilevanti da conhost corrispondono all'indirizzo WPM precedentemente memorizzato | https://github.com/odzhan/injection/blob/master/conhost |
| Ctrl-inject | ✓ | Rileva se l'attaccante esegue WPM nell'intervallo di KernelBase.dll della vittima | Pinjectra |
| ALPC Callback | ✓ | Estrai il pid della vittima nelle chiamate NtConnectPort alla porta ALPC. Per la tupla pid attaccante-vittima, controlla le precedenti chiamate WPM e applica il rilevamento di codice fluttuante | Pinjectra |
| WNF Callback | ✓ | WPM seguito dalla chiamata UpdateWNFStateData | https://github.com/odzhan/injection/tree/master/wnf |
| SetWindowsHook | ✓ | Salva i percorsi dei moduli registrati nell'hook NtUserSetWindowsHookEx. Successivamente, quando un modulo corrispondente a questo percorso viene caricato in un processo diverso, genera un avviso | MInjector |
| GhostWriting | ✓ | Rileva se il contesto viene impostato (viene chiamato NtSetContextThread) su un thread precedentemente sospeso | Pinjectra |
| Service Control | ✓ | WPM sovrascrive l'IDE del servizio di un processo (servizio) | https://github.com/odzhan/injection/tree/master/svcctrl |
| Shellcode injection | ✓ | Nuovo thread avviato da codice fluttuante. Percorso DLL scritto da WPM | MInjector |
| Image Mapping | ✓ | Thread avviato da codice fluttuante. Intestazione PE scritta da WPM. Percorso DLL scritto da WPM | MInjector |
| Thread Reuse | ✓ | Thread avviato da codice fluttuante. Percorso DLL scritto da WPM | MInjector |