
APT-Hunter est un outil de Threat Hunting pour les journaux d'événements Windows, conçu avec une mentalité de purple team pour détecter les mouvements APT cachés dans la mer des journaux d'événements Windows, afin de réduire le temps nécessaire pour découvrir une activité suspecte.
Threat hunting for Windows event logs, built with a purple-team mindset.
APT-Hunter est un outil de threat hunting pour les journaux d'événements Windows. Il utilise des règles de détection prédéfinies et des statistiques de journaux pour faire remonter l'activité APT dissimulée dans de grands volumes d'événements, réduisant le temps nécessaire pour découvrir des comportements suspects. Il est particulièrement efficace pour les évaluations de compromission.
Les résultats sont écrits sous forme de chronologie qui peut être analysée directement dans Excel, Timeline Explorer, Timesketch et outils similaires, ou explorée dans le tableau de bord web intégré avec un triage LLM local en option.
Téléchargez les binaires compilés depuis la page Releases, ou exécutez depuis les sources (Python 3.8+) :
git clone https://github.com/ahmedkhlief/APT-Hunter.git
cd APT-Hunter
python3 -m pip install -r requirements.txt
python3 APT-Hunter.py -p /opt/wineventlogs/ -o Project1 -allreport
-p accepte un répertoire ou un fichier unique. Ajoutez -web pour ouvrir le tableau de bord à la fin de l'analyse.





Exécutez python3 APT-Hunter.py -h pour la liste complète. Options principales :
| Option | Description |
|---|---|
-p, --path | Fichier ou dossier de journaux à analyser |
-o, --out | Nom / répertoire de sortie |
-start, -end | Restreindre la chronologie (format ISO) |
-tz | Fuseau horaire (local ou par ex. Asia/Dubai) |
-cores | Cœurs CPU à utiliser (par défaut : la moitié des disponibles) |
-hunt, -huntfile, -eid | Hunting par chaîne/regex, fichier de regex, ou Event ID |
-sigma, -rules | Hunting avec des règles Sigma converties en JSON |
-o365hunt, -o365rules, -o365raw | Hunting dans les journaux d'audit Office 365 |
-procexec, -logon, -objaccess, -allreport | Rapports supplémentaires |
-web, -webview, -webhost, -webport | Lancer le tableau de bord web |
-llm, -llm-provider, -llm-url, -llm-model, -llm-key, -llm-severity, -llm-batch, -llm-context | Analyse LLM locale |
Analyser un dossier de fichiers EVTX (les types de journaux sont détectés automatiquement) :
python3 APT-Hunter.py -p /opt/wineventlogs/ -o Project1 -allreport
Se concentrer sur une plage temporelle :
python3 APT-Hunter.py -p /opt/wineventlogs/ -o Project1 -allreport -start 2022-04-03 -end 2022-04-05T20:56
Hunting avec une chaîne, une regex, ou un fichier de regex :
python3 APT-Hunter.py -hunt "psexec" -p /opt/wineventlogs/ -o Project2
python3 APT-Hunter.py -huntfile "(psexec|psexesvc)" -p /opt/wineventlogs/ -o Project2
python3 APT-Hunter.py -huntfile huntfile.txt -p /opt/wineventlogs/ -o Project2
Hunting avec des règles Sigma :
python3 APT-Hunter.py -sigma -rules rules.json -p /opt/wineventlogs/ -o Project2
Récupérer les dernières règles Sigma converties pour APT-Hunter (écrit rules.json) :
./Get_Latest_Sigma_Rules.sh
Parcourez un rapport généré dans le navigateur : filtrage, graphiques, chronologie d'incident et export de rapport IR.
python3 run_webapp.py <Output>/<Output>_Report.xlsx # or pass the output directory
python3 APT-Hunter.py -p <logs> -o <Output> -web # analyse, then open the dashboard
python3 APT-Hunter.py -webview <Output> # open an existing report
Accepter un constat de triage l'épingle à la chronologie d'incident avec ses preuves, attachées comme sous-événements repliables : ils se trouvent sous le constat dans le tableau plutôt qu'entremêlés avec tout le reste, et ils sont exclus des graphiques de chronologie afin que les graphiques restent lisibles. Supprimer un constat supprime ses sous-événements avec lui.
Le serveur écoute par défaut sur 0.0.0.0:5000. Utilisez --host / --port (ou -webhost / -webport) pour modifier cela, par exemple --host 127.0.0.1 pour le garder en local. Les constats examinés et la chronologie sont conservés lorsque le cache du rapport est reconstruit.

Tableau de bord principal : total des événements et décomptes par sévérité, répartition par sévérité, principales règles de détection déclenchées, et volume d'événements quotidien. La barre latérale liste chaque journal d'événements et tableau récapitulatif du rapport.

Chronologie d'incident : constats épinglés représentés par heure et codés par couleur selon la sévérité. Zoomez et déplacez-vous dans les périodes chargées, générez un résumé exécutif par IA, et exportez le rapport IR ou le CSV.

Chronologie chronologique : une chaîne d'attaque se déploie en ses sous-événements, et le panneau de détails affiche le récit, les techniques MITRE et le score.
Le graphique de chronologie d'incident est zoomable, de sorte que les rafales d'événements séparés de quelques minutes ou secondes restent lisibles : faites glisser sur le graphique pour zoomer sur une période, Shift+glisser pour vous déplacer, Ctrl/Cmd+molette pour zoomer autour du curseur, ou utilisez la bande de vue d'ensemble en dessous. Les étiquettes ne se chevauchent jamais ; celles qui ne tiennent pas sont masquées, et survoler un point liste chaque événement empilé dessus.
Notez les événements détectés selon leur caractère malveillant à l'aide d'un modèle local, depuis la ligne de commande :
python3 APT-Hunter.py -p <logs> -o <Output> -llm -llm-provider ollama -llm-model llama3 -llm-severity High
Ou par événement depuis le tableau de bord (vérifier, expliquer, corréler). Configurez le fournisseur (Ollama / LM Studio / llama.cpp), le modèle, l'URL et le délai d'attente sur la page Settings du tableau de bord. N'importe quel serveur local compatible OpenAI fonctionne ; aucune donnée n'est envoyée à un service cloud.
Agentic Triage dans la barre latérale du tableau de bord transforme des milliers d'alertes en une courte liste de constats :
La phase d'investigation nécessite un LLM qui prend en charge l'appel d'outils. Si le vôtre ne le fait pas, APT-Hunter revient à un pipeline fixe de pivot/corrélation. La couverture est identique dans les deux cas, puisque l'agent n'ajoute que de la profondeur par-dessus la première passe. Les tours d'outils et une limite de temps réel sont plafonnés dans Settings.

Triage agentique : l'historique des exécutions montre la portée, les décomptes d'alertes et de groupes, les constats et les appels LLM par exécution. Ici, 91 alertes critiques sur un hôte se sont réduites à 32 groupes et une seule chaîne d'attaque à score élevé.

Détail d'un constat : le récit, les techniques MITRE, les preuves et la trace d'investigation complète (chaque événement lu, fenêtre de chronologie et recherche d'alerte effectués par l'agent), afin que chaque conclusion puisse être auditée.
Note : La sortie du LLM est une aide au triage, pas un verdict. Examinez les constats avant de vous y fier. Les modèles de raisonnement peuvent nécessiter de relever le délai d'attente des requêtes bien au-dessus de la valeur par défaut de 200 s.
| Exemple | Description |
|---|---|
| Sample_TimeSketch.csv | Chronologie que vous pouvez téléverser dans Timesketch pour voir l'image complète d'une attaque |
| Sample_Report.xlsx | Chaque événement détecté dans tous les journaux Windows fournis |
| Sample_Logon_Events.csv | Tous les événements de logon avec champs analysés (date, utilisateur, IP source, processus de logon, station de travail, type de logon, appareil, journal d'origine) |
| Sample_Process_Execution_Events.csv | Toutes les exécutions de processus capturées depuis les journaux d'événements |
| Sample_Object_Access_Events.csv | Accès aux objets capturés depuis l'Event 4663 |
| Sample_Collected-SIDS.csv | Utilisateurs et leurs SID, pour aider les investigations |
| EventID_Frequency_Analysis.xls | Analyse de fréquence des Event ID |
Twitter : @ahmed_khlief · LinkedIn : Ahmed Khlief
Distribué sous GNU GPL v3. Voir LICENSE.
Merci à Joe Maccry pour son incroyable contribution aux cas d'usage Sysmon ( plus de 100 cas d'usage ajoutés par Joe )