Evasion EDR pour la Recherche: Direct Syscalls Expliques sans Romance
Comment fonctionnent vraiment les direct syscalls en etude defensive controlee, pourquoi ils restent detectables, et ce que les blue teams devraient regarder avant d acheter la prochaine boite noire.
Les direct syscalls sont devenus un meme sur YouTube et dans les fils Twitter, pourtant la plupart des recherches publiees n approchent meme pas ce qu un EDR moderne (CrowdStrike Falcon 7.x, SentinelOne Singularity, Microsoft Defender for Endpoint avec ETW-TI kernel) voit reellement. Chez Basilisk OffSec on etudie la technique en labo isole - Windows 11 23H2 sans internet, snapshots VMware versionnes, et aucune envie d emballer ca en service. L objectif est clair: comprendre le chemin NTDLL -> SSN -> syscall -> kernel pour ecrire de meilleures detections, pas vendre du bypass. Si votre plan est d empiler des IOC et pretendre que c est du red team professionnel, autant fermer l onglet.
Rappel sans condescendance: chaque fonction documentee dans ntdll.dll (NtAllocateVirtualMemory, NtCreateThreadEx, NtProtectVirtualMemory) porte un System Service Number (SSN) qui change a chaque build de Windows. L EDR pose typiquement un hook JMP inline sur les premiers octets de ces stubs en user-mode, donc quand votre loader appelle VirtualAlloc le flux passe par la DLL injectee avant d atteindre le kernel. Un direct syscall consiste a recopier le stub dans votre binaire - mov r10, rcx; mov eax, SSN; syscall; ret - en sautant le hook. Ca marche, mais comme on va voir c est une victoire facile contre la telemetrie user-mode et nulle contre la telemetrie kernel. Relisez Bypass d'AMSI et d'ETW pour la Recherche Defensive: Ce que les Blue Teams Doivent Savoir pour la logique proche.
Pour reproduire chez moi j utilise SysWhispers3 (le fork maintenu par klezVirus) qui genere des stubs MASM pour un projet C++ compile avec MSVC 19.38. Le SSN est resolu au runtime via Hell's Gate ou Halo's Gate, en parcourant l EAT de la ntdll mappee depuis le disque - pas la version en memoire qui peut etre alteree. En trois heures de paillasse j avais un POC qui alloue RW, ecrit un shellcode inoffensif (calc.exe brut, rien de plus), bascule NtProtectVirtualMemory en RX et lance NtCreateThreadEx. Sysmon 15 avec la config SwiftOnSecurity loge la creation de thread, mais ProcessAccess reste propre. Belle victoire jusqu a ce que vous activiez Defender en EDR block mode et que l alerte arrive du kernel via Threat Intelligence ETW.
Voici ce que personne ne veut dire sur scene: Microsoft-Windows-Threat-Intelligence emet des evenements pour NtAllocateVirtualMemory, NtProtectVirtualMemory avec RWX, NtMapViewOfSection et NtCreateThreadEx independamment de tout hook user-mode. Vous avez saute NTDLL, parfait, mais le kernel a vu le syscall arriver avec une pile de retour pointant vers le .text de votre binaire au lieu de ntdll.dll - exactement ce que la detection d anomalie de call stack traque. Elastic Security a une regle publique depuis 2023, et la communaute Threat Hunting avec Sigma et Elastic: De l'Indicateur a la Regle de Detection l ingere par defaut. Les indirect syscalls (rebondir dans ntdll et faire le syscall la-bas) corrigent la pile mais creent d autres artefacts que YARA-X attrape.
Sur les missions autorisees on discute ce compromis avec le client avant toute execution, ce qui relie direct a Red Team 101: Difference entre Pentest et Operations Adversariales Reelles: l emulation d adversaire a un perimetre, des regles d engagement et une fenetre. L exercice defensif est en fait plus riche - executer le POC, capturer l ETW-TI avec SilkETW ou krabsetw, et ecrire une regle Sigma qui couvre l heuristique sans declencher sur l installeur Teams. Je combine ca avec du hardening selon Durcissement de Windows 11 pour Postes de Travail a Haut Risque et je verifie le mouvement lateral comme decrit dans Mouvement Lateral en Lab: SMB, WMI et WinRM avec Focus Detection, parce qu un direct syscall isole est rarement l histoire complete d un vrai incident.
Questions frequentes auxquelles je reponds vite: non, on ne publie pas de loader pret a l emploi; non, l unhooking via une copie fraiche de NTDLL depuis le disque n est pas magique - Defender mappe ca depuis 2022 via memory image integrity; et non, ChatGPT ecrivant votre shellcode en Nim ne vous rend pas invisible, ca vous donne juste une entropie etrange dans le .text que le classifieur ML de l EDR adore. Si vous demarrez serieusement l offensif, construisez une base avec Pentest Active Directory : Kerberoasting Pas a Pas dans un Lab GOAD et Construire une Infra C2 avec Sliver en Lab Isole pour la Recherche Defensive avant de plonger dans les syscalls, sinon vous admirez votre reflet dans Process Hacker.
Takeaway pratique: si vous defendez, activez le provider Microsoft-Windows-Threat-Intelligence (PPL requis sur le service EDR), ingestez dans le SIEM et construisez trois regles - call stack non issu de ntdll, NtProtectVirtualMemory passant de RW a RX en region private, et NtCreateThreadEx cross-process avec adresse de depart dans le heap. Ca attrape 80% des POCs publics sans cout de licence supplementaire. Si vous etes chercheur, documentez, isolez, ne distribuez pas de binaires compiles et rappelez-vous que la frontiere entre etude et delit est le consentement ecrit du proprietaire de l actif - sujet que OPSEC pour Chercheurs en Securite: Modele de Menace Personnel couvre serieusement.