
Awesome list de mots-clés et d'artefacts pour les sessions de Threat Hunting
🎯 Liste de mots-clés pour les sessions de ThreatHunting


Le threat hunting est une approche proactive et itérative visant à détecter les activités malveillantes au sein du réseau ou des systèmes d'une organisation qui ont pu contourner les mesures de sécurité automatisées. Contrairement aux investigations réactives déclenchées par des alertes de sécurité, le threat hunting repose sur des vérifications pilotées par la threat intelligence (TI) et sur des hypothèses issues d'une analyse systématique et opportuniste. Ces hypothèses 💡 aident les chasseurs à découvrir des menaces inconnues, des menaces potentielles ou des menaces connues qui ont pu échapper aux détections de sécurité, ainsi que des vulnérabilités ou des indicateurs de compromission (IoCs) que les systèmes automatisés pourraient manquer ou exclure. Le processus vise également à identifier les signes précurseurs d'alertes/tableaux de bord et à améliorer les flux de travail SOC/triage, tout en contribuant à la gestion de l'inventaire des actifs shadow IT et en remontant les événements de faible/moyenne fiabilité nécessitant une enquête plus approfondie. L'objectif principal est d'identifier les tactiques, techniques et procédures (TTP) utilisées par les acteurs de la menace, renforçant ainsi la capacité de l'organisation à détecter et à atténuer préventivement les attaques potentielles.

Ma suggestion de processus pour organiser des sessions de threat hunting partiellement automatisées afin de maintenir des règles de détection de haute qualité au sein d'un SOC

Les équipes SOC se concentrent sur le déploiement de détections à haute fiabilité à tous les niveaux de la pyramide de maturité de la détection, ciblant les menaces connues avec un minimum de faux positifs. Le threat hunting complète cette approche en traitant les menaces inconnues, les TTP avancées et les anomalies sujettes à des taux de faux positifs élevés, comblant les lacunes et améliorant la couverture de détection au-delà des capacités standard du SOC.


Idéalement, chaque session de threat hunting devrait avoir des objectifs clairs. Cet organigramme fournit une approche structurée pour guider votre processus, de la préparation et de l'investigation jusqu'aux recommandations exploitables.
🎯 Liste de mots-clés pour les sessions de ThreatHunting
Les listes ThreatHunting-Keywords peuvent être précieuses pour les Threat Hunters, les équipes SOC et CERT pour l'analyse statique sur SIEM, car elles aident à identifier les acteurs de la menace (ou les redteamers 😆) utilisant des configurations par défaut d'outils d'exploitation renommés dans les journaux. Elle diffère des flux d'IOC par sa pertinence durable : les mots-clés ici n'ont pas de « date d'expiration » et peuvent détecter des menaces des années après leur inclusion. Ils sont flexibles, acceptent les correspondances avec jokers (wildcards) et sans sensibilité à la casse, et se concentrent uniquement sur les mots-clés par défaut.
Conçue principalement pour le Threat Hunting, cette liste peut être utile dans des scénarios complexes. Que vous ayez accès à un SIEM que vous ne gérez pas, avec des données non analysées, ou que vous fassiez partie d'une équipe SOC disposant d'un SIEM bien géré, les exemples fournis ici peuvent accélérer le processus de détection d'activités malveillantes sans avoir besoin d'analyser quoi que ce soit. Si vos journaux sont déjà analysés, cette liste peut être utilisée pour faire correspondre des champs dans vos données, pouvant potentiellement se transformer en règle de détection basée sur la catégorie de type de mot-clé que vous sélectionnez, à condition que le taux de faux positifs soit suffisamment bas.
⚠️ Tout ne peut pas être ajouté à cette liste, nous ne faisons pas ici de détections de comportements complexes, uniquement des détections simples de mots-clés dans les champs ou les journaux bruts, visant à détecter les configurations par défaut
⚠️ Beaucoup d'outils de la liste disposent de règles de détection dédiées, corrélant les événements avec des seuils et des relations de processus uniques... nous ne couvrirons pas ici toutes les détections possibles pour un outil, uniquement les détections par mots-clés
Si vous faites partie d'un centre d'opérations de sécurité (SOC) et que vous gérez des centaines de règles de détection qui reposent uniquement sur de simples détections par mots-clés sans corrélation de champs ou d'événements, envisagez de repenser votre approche. À mon avis, celles-ci ne devraient pas constituer des règles de détection individuelles. Elles seraient peut-être mieux adaptées à une liste consolidée comme celle-ci, bien que la mise en œuvre puisse être plus difficile si vous n'utilisez pas une plateforme comme Splunk.
Cette approche encourage la création de règles de haute qualité et pertinentes tout en gardant vos simples détections par mots-clés dans les champs organisées et gérables en un seul endroit. Le résultat final ? Une règle de détection complète qui les couvre toutes. Cela rationalise votre processus et optimise vos capacités de détection.
Pour les équipes de réponse aux incidents, vous pouvez utiliser cette liste lors de votre investigation sur les journaux bruts ou les fichiers pour identifier rapidement les outils d'exploitation connus avec les règles YARA Règles YARA, un script powershell ou en ingérant rapidement vos journaux dans Splunk avec Splunk4DFIR
Pour échapper à la détection par simple mot-clé, il est essentiel de recompiler et de renommer toutes les chaînes personnalisées, les noms de classes ou de fonctions, les noms de variables, les noms d'arguments, les noms d'exécutables, les user-agents par défaut, les certificats, ou toute autre chaîne qui pourrait potentiellement être associée aux outils que vous utilisez durant votre opération. Utilisez les noms les plus courants pour tout afin de vous fondre dans le trafic normal. Les scripts situés ici peuvent vous aider à en identifier certains.
Cependant, si vous développez des « red team tools » publics, envisagez d'aider la blue team en utilisant des noms distincts. Utilisez une configuration par défaut avec un port exotique, des certificats personnalisés, des user-agents uniques, des noms de fonctions et des arguments spécifiques qui ne sont pas courants. Cela aide à créer une signature claire pouvant être utilisée pour de simples détections par mots-clés, afin que la blueteam puisse au moins détecter facilement les script kiddies.
En-tête : keyword,metadata_keyword_type,metadata_tool,metadata_description,metadata_tool_techniques,metadata_tool_tactics,metadata_malwares_name,metadata_groups_name,metadata_category,metadata_link,metadata_enable_endpoint_detection,metadata_enable_proxy_detection,metadata_tags,metadata_comment,metadata_severity_score,metadata_popularity_score,metadata_github_stars,metadata_github_forks,metadata_github_created_at,metadata_github_updated_at
keyword : Les entrées de cette colonne représentent des mots-clés non sensibles à la casse utilisés pour le Threat Hunting. Ces mots-clés sont flexibles, permettant l'utilisation de jokers (wildcards) pour élargir ou affiner vos paramètres de recherche selon vos besoins.
metadata_keyword_regex : Les entrées de cette colonne représentent le motif regex de détection pour le mot-clé. Ces motifs sont affinés pour offrir des capacités de détection précises, adaptées à une utilisation avec YARA, ripgrep ou des outils de détection similaires.
metadata_keyword_type : Type des mots-clés. Actuellement, il existe trois types :
téléversez la liste threathunting-keywords.csv sur Splunk
créez une définition de lookup nommée threathunting-keywords pour le lookup threathunting-keywords.csv
WILDCARD(keyword) et assurez-vous que Case sensitive match n'est pas coché
transforms.conf``` [threathunting-keywords] batch_index_query = 0 case_sensitive_match = 0 filename = threathunting-keywords.csv match_type = WILDCARD(keyword)
- nous pouvons maintenant utiliser notre définition de lookup pour chasser 🏹
- :warning: si les recherches de la section suivante ne semblent pas fonctionner, cela peut être dû aux paramètres de limitation des ressources de splunk, surtout si vous exécutez splunk avec la configuration par défaut. Pour commencer, vous devrez peut-être envisager d'augmenter la valeur de `max_memtable_bytes` dans la section `[lookup]`.
## Exemples de cas d'utilisation avec `threathunting-keywords` :

### Chasser tous les mots-clés dans les logs bruts 😱```
`myendpointslogs`
| lookup threathunting-keywords keyword as _raw OUTPUT keyword as keyword_detection metadata_keyword_type metadata_tool metadata_description metadata_tool_techniques metadata_tool_tactics metadata_malwares_name metadata_groups_name metadata_category metadata_link metadata_enable_endpoint_detection metadata_enable_proxy_detection metadata_comment
| search metadata_description!="" AND metadata_enable_endpoint_detection=1
| stats count earliest(_time) as firsttime latest(_time) as lasttime values(_raw) as raw by metadata_keyword_type keyword_detection index sourcetype
| convert ctime(*time)
Envoyez le job en arrière-plan et conservez l'ID du job.

myendpointslogs est une macro qui recherchera tous vos logs d'endpoints, qu'il s'agisse des logs Windows, de la télémétrie EDR, de sysmon, d'auditd, des sessions bastion, des logs d'exécution PowerShell ou de tout autre log qui surveille l'activité des processus ou des fichiers. (si vous n'utilisez pas de macro, vous pouvez remplacer la macro par votre index, tag ou datamodel)
TERM() pour les recherches spécifiques avant le |lookup si nécessaire| lookup c'est très important, pour les grosses lookups comme celle-ci, utilisez toujours |lookup au lieu de |inputlookup ; |lookup utilisera la lookup poussée sur les indexeurs lorsque le bundle est répliqué, tandis que |inputlookup enverra aux indexeurs la recherche avec tout le contenu de la lookup à chaque fois. En utilisant |lookup, on gagne énormément en performances (cette recherche s'exécutera pendant des heures sur de grands environnements, donc il vaut mieux optimiser notre recherche).... keyword as _raw OUTPUT keyword as keyword_detection c'est la partie où nous allons mettre en correspondance le champ nommé avec le champ de notre lookup ; dans Splunk, est le log brut sans aucun parsing (notre cas d'usage). Lorsqu'un mot-clé correspond, le champ affichera le mot-clé de la lookup qui a correspondu sur le champ () ici.Filtrer le résultat``` | loadjob 1684146257.1495958 | search NOT (keyword_detection IN ("fixme","fixme","fixme")) NOT (metadata_keyword_type IN ("fixme","fixme")) NOT (raw IN ("fixme","fixme","fixme"))
Excluez les mots-clés requis, le texte brut ou les types de mots-clés.
si nous décidons d'exclure le type `greyware tool keyword` (mots-clés d'outils légitimes abusés par les attaquants) parce que cet environnement a trop de résultats pour ce type d'outils, nous avons deux options :
- Filtrer au début de notre recherche initiale```
`myendpointslogs`
| lookup threathunting-keywords keyword as _raw OUTPUT keyword as keyword_detection metadata_keyword_type metadata_tool metadata_description metadata_tool_techniques metadata_tool_tactics metadata_malwares_name metadata_groups_name metadata_category metadata_link metadata_enable_endpoint_detection metadata_enable_proxy_detection metadata_comment
| search metadata_description!="" metadata_keyword_type="offensive tool keyword" metadata_enable_endpoint_detection=1
| stats count earliest(_time) as firsttime latest(_time) as lasttime values(_raw) as raw by metadata_keyword_type keyword_detection index sourcetype
| convert ctime(*time)
J'ai ajouté un metadata_keyword_type="offensive tool keyword" pour ne cibler que les outils offensifs dont je suis sûr qu'ils sont utilisés par des acteurs malveillants
Donc, c'était notre cas d'utilisation pour rechercher dans les logs bruts des journaux de points de terminaison ; si nous voulons rechercher les mots-clés pour les journaux réseau (tout ce qui peut journaliser une requête ou une URL), nous changeons simplement cela en :```
`mynetworklogs`
| lookup threathunting-keywords keyword as _raw OUTPUT keyword as keyword_detection metadata_keyword_type metadata_tool metadata_description metadata_tool_techniques metadata_tool_tactics metadata_malwares_name metadata_groups_name metadata_category metadata_link metadata_enable_endpoint_detection metadata_enable_proxy_detection metadata_comment
| search metadata_description!="" AND metadata_enable_proxy_detection=1
| stats count earliest(_time) as firsttime latest(_time) as lasttime values(_raw) as raw by metadata_keyword_type keyword_detection index sourcetype
| convert ctime(*time)
Maintenant c'est la même chose que la première recherche mais j'ai changé la source de données pour mynetworklogs et ajouté metadata_enable_proxy_detection=1 pour correspondre aux mots-clés pertinents pour les logs réseau (il vaut mieux avoir des logs proxy et DNS pour cela)
mynetworklogs url=*
| lookup threathunting-keywords keyword as url OUTPUT keyword as keyword_detection metadata_keyword_type metadata_tool metadata_description metadata_tool_techniques metadata_tool_tactics metadata_malwares_name metadata_groups_name metadata_category metadata_link metadata_enable_endpoint_detection metadata_enable_proxy_detection metadata_comment
| search metadata_description!="" AND metadata_enable_proxy_detection=1
| stats count earliest(_time) as firsttime latest(_time) as lasttime values(url) as url by src_ip metadata_keyword_type keyword_detection index sourcetype
| convert ctime(*time)
#### Correspondance uniquement sur le champ de requête :```
`mynetworklogs` query=*
| lookup threathunting-keywords keyword as query OUTPUT keyword as keyword_detection metadata_keyword_type metadata_tool metadata_description metadata_tool_techniques metadata_tool_tactics metadata_malwares_name metadata_groups_name metadata_category metadata_link metadata_enable_endpoint_detection metadata_enable_proxy_detection metadata_comment
| search metadata_description!="" AND metadata_enable_proxy_detection=1
| stats count earliest(_time) as firsttime latest(_time) as lasttime values(query) as query by src_ip metadata_keyword_type keyword_detection index sourcetype
| convert ctime(*time)
myendpointslogs
| eval myfields=mvappend(service, process, process_command, parent_process, parent_process_command, grand_parent_process, grand_parent_process_command, file_path, file_name)
| lookup threathunting-keywords keyword as myfields OUTPUT keyword as keyword_detection metadata_keyword_type metadata_tool metadata_description metadata_tool_techniques metadata_tool_tactics metadata_malwares_name metadata_groups_name metadata_category metadata_link metadata_enable_endpoint_detection metadata_enable_proxy_detection metadata_comment
| search metadata_description!="" AND metadata_enable_endpoint_detection=1
| stats count earliest(_time) as firsttime latest(_time) as lasttime values(process) values(service) values(process_command) values(file_name) values(file_path) values(parent_process) values(parent_process_command) values(grand_parent_process) values(grand_parent_process_command) by metadata_keyword_type keyword_detection index sourcetype
| convert ctime(*time)
#### Speed:
If the speed is a concern or you're planning to implement this as a scheduled detection rule, you might want to consider splitting the lookup into diffent lookups by choosing the metadata_keyword_type or metadata_tool column you want to use.
Note that filtering using the search command after the `|lookup` doesn't expedite the search process. If you want to concentrate on a specific portion of the lookup without dividing it, you should use the `|inputlookup` command along with the where clause. While this method may consume more CPU resources, it generally results in faster execution. For more details, check out the Splunk documentation on inputlookup: https://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Inputlookup
#### Avec ELK :
Si vous travaillez avec la pile Elastic, il y a beaucoup de restrictions pour les listes (vous ne pouvez pas utiliser de caractères spéciaux, d'espaces...), vous avez 3 options :
- Utiliser une autre liste disponible ici dans le même dépôt https://github.com/mthcht/ThreatHunting-Keywords/tree/main/elk (ce n'est pas une extraction directe de threathunting-keywords.csv, c'est modifié pour ELK et non mis à jour)
- Utiliser les règles Sigma « hunting », directement extraites de ce projet https://github.com/mthcht/ThreatHunting-Keywords-sigma-rules avec pysigma pour la conversion
- Utiliser certaines de mes listes comme liste d'IOC avec des requêtes wildcard https://www.elastic.co/guide/en/elasticsearch/reference/8.15/query-dsl-wildcard-query.html#wildcard-top-level-params
### Exemple de tableau de bord

### Splunk4DFIR
Autre exemple d'utilisation des fichiers csv du projet avec Splunk pour chasser dans les artefacts et journaux DFIR : https://github.com/mf1d3l/Splunk4DFIR

### Autres listes géniales pour la détection
Je conserve certains artefacts pertinents dans des listes séparées ; ces listes sont plus précises et peuvent être utilisées dans les règles de détection. Elles sont disponibles dans ce [dépôt GitHub](https://github.com/mthcht/awesome-lists/tree/main/Lists)
vous y trouverez :
Ma feuille de collecte de renseignements pour planifier des sessions de Threat Hunting

- 📋 Listes : https://github.com/mthcht/awesome-lists/tree/main/Lists
- 🕵️♂️ Guides de Threat Hunting : https://mthcht.medium.com/list/threat-hunting-708624e9266f
- 🚰 Tuyaux nommés suspects : [suspicious_named_pipe_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/suspicious_named_pipe_list.csv)
- 🌐 TLD suspects (mis à jour automatiquement) : [[suspicious_TLDs]](https://github.com/mthcht/awesome-lists/tree/main/Lists/TLDs)
- 🌐 ASN suspects (mis à jour automatiquement) : [[suspicious ASNs]](https://github.com/mthcht/awesome-lists/tree/main/Lists/ASNs)
- 🔧 Services Windows suspects : [suspicious_windows_services_names_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/suspicious_windows_services_names_list.csv)
- ⏲️ Tâches Windows suspectes : [suspicious_windows_tasks_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/suspicious_windows_tasks_list.csv)
- 🚪 Ports de destination suspects : [suspicious_ports_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/suspicious_ports_list.csv)
- 🛡️ Règles de pare-feu suspectes : [suspicious_windows_firewall_rules_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/suspicious_windows_firewall_rules_list.csv)
- 🆔 User-Agents suspects : [suspicious_http_user_agents_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/suspicious_http_user_agents_list.csv)
- 📇 Identifiants USB suspects : [suspicious_usb_ids_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/suspicious_usb_ids_list.csv)
- 🔢 Adresses MAC suspectes : [suspicious_mac_address_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/suspicious_mac_address_list.csv)
- 📛 Noms d'hôte suspects : [suspicious_hostnames_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/suspicious_hostnames_list.csv)
- 🧮 Métadonnées des exécutables : [executables_metadata_informations_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/Windows%20Metadata/executables_metadata_informations_list.csv)
- 🕸️ Liste des serveurs DNS over HTTPS : [dns_over_https_servers_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/dns_over_https_servers_list.csv)
- 📚 Hijacklibs (mis à jour automatiquement) : [hijacklibs_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/Hijacklibs/hijacklibs_list.csv)
- 🌐 Listes des nœuds TOR (mis à jour automatiquement) : https://github.com/mthcht/awesome-lists/tree/main/Lists/TOR
- 🛠️ Liste LOLDriver (mis à jour automatiquement) : [loldrivers_only_hashes_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/Drivers/loldrivers_only_hashes_list.csv)
- 🛠️ Liste des bootloaders malveillants (mis à jour automatiquement) : [malicious_bootloaders_only_hashes_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/Drivers/malicious_bootloaders_only_hashes_list.csv)
- 📜 Liste des certificats SSL malveillants (mise à jour automatiquement) : [ssl_certificates_malicious_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/SSL%20CERTS/ssl_certificates_malicious_list.csv)
- 🖥️ Détection RMM : https://github.com/mthcht/awesome-lists/tree/main/Lists/RMM
- 👤🔑 Rôles et groupes importants pour AD/EntraID/AWS : [[permissions]](https://github.com/mthcht/awesome-lists/tree/main/Lists/permissions)
- 💻🔒 Extensions de fichiers connues des ransomwares : [ransomware_extensions_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/ransomware_extensions_list.csv)
- 💻🔒 Noms de fichiers connus des notes de rançon des ransomwares : [ransomware_notes_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/ransomware_notes_list.csv)
- 📝 Règles ASR Windows : [windows_asr_rules.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/windows_asr_rules.csv)
- 🌐 Listes DNSTWIST (mises à jour automatiquement) : [DNSTWIST Default Domains + script](https://github.com/mthcht/awesome-lists/tree/main/Lists/DNSTWIST)
- 🌍 Listes d'adresses IP VPN (mises à jour automatiquement) :
- 🛡️ NordVPN : [nordvpn_ips_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/VPN/NordVPN/nordvpn_ips_list.csv)
- 🛡️ ProtonVPN : [protonvpn_ip_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/VPN/ProtonVPN/protonvpn_ip_list.csv)
- 🏢 Listes de plages d'adresses IP d'entreprises (mises à jour automatiquement) : [Default Lists + script](https://github.com/mthcht/awesome-lists/tree/main/Lists/Ranges_IP_Address_Company_List/bgp.he.net)
- 🔗 Autres listes de corrélation : https://github.com/mthcht/awesome-lists/tree/main/Lists/Others
- 📋 Listes que je dois terminer : https://github.com/mthcht/awesome-lists/tree/main/todo
Consultez ces [Guides](https://github.com/mthcht/awesome-lists/tree/main/Lists#how-to-use-the-lists) pour utiliser certaines des listes :
- [Recherches sur les services Windows](https://detect.fyi/threat-hunting-suspicious-windows-service-names-2f0dceea204c)
- [Recherches sur les User-Agents](https://mthcht.medium.com/threat-hunting-suspicious-user-agents-3dd764470bd0)
- [Recherches sur DNS Over HTTPS](https://mthcht.medium.com/detecting-dns-over-https-30fddb55ac78)
- [Recherches sur les TLD suspects](https://mthcht.medium.com/threat-hunting-suspicious-tlds-a742c2adbf58)
- [Recherches sur HijackLibs](https://mthcht.medium.com/detect-dll-hijacking-techniques-from-hijacklibs-with-splunk-c760d2e0656f)
- [Recherches sur le phishing et DNSTWIST](https://detect.fyi/detecting-phishing-attempts-with-dnstwist-37c426b3bbb8)
- [Recherches sur les extensions de navigateur](https://mthcht.medium.com/detecting-browser-extensions-installations-e0ac2b45c46b)
- [C2 se cachant en pleine vue](https://mthcht.medium.com/c2-hiding-in-plain-sight-7a83963b9344)
- [Artefacts de HTML Smuggling](https://mthcht.medium.com/detecting-html-smuggling-phishing-attempts-15af824e60e4)
- [Recherches sur PSEXEC et outils similaires](https://mthcht.medium.com/detecting-psexec-and-similar-tools-c812bf3dca6c)
- [Détection de Time Slipping](https://mthcht.medium.com/event-log-manipulations-1-time-slipping-55bf95631c40)
- [Tuyaux nommés suspects](https://medium.com/detect-fyi/threat-hunting-suspicious-named-pipes-a4206e8a4bc8)
... plus [ici](https://github.com/mthcht/awesome-lists/tree/main/Lists#how-to-use-the-lists)
## Chasse DFIR de mots-clés dans les fichiers (sans SIEM)
Après avoir effectué un examen approfondi de divers outils, j'ai découvert que [ripgrep](https://github.com/BurntSushi/ripgrep) surpasse nettement ses concurrents lorsqu'il s'agit de faire correspondre rapidement une vaste liste de motifs regex à chaque ligne d'un grand fichier journal ou même de plusieurs fichiers simultanément. Il s'est avéré être la solution la plus efficace pour traiter des quantités massives de données, offrant une vitesse et une flexibilité inégalées.
### Chasser le mal dans les fichiers journaux avec **Ripgrep** et la liste 'only_keywords_regex.txt'
#### `rg.exe -f .\only_keywords_regex.txt .\EvtxECmd_Output.csv --multiline --ignore-case`
- .\only_keywords_regex.txt sert de fichier source pour les mots-clés de threat hunting, transformés en motifs regex pour une correspondance précise. Ces motifs proviennent du fichier threathunting-keywords.csv, qui a subi un processus de conversion pour une compatibilité optimale avec les opérations regex.
- .\EvtxECmd_Output.csv représente le fichier cible dans lequel la recherche sera effectuée. Dans ce contexte, il s'agit d'un fichier .csv d'un journal d'événements Windows, produit en exportant les journaux evtx. Cependant, la flexibilité de ripgrep vous permet de le remplacer par n'importe quel fichier de votre choix pour des opérations de recherche détaillées.
- L'option --multiline permet à ripgrep de gérer et de faire correspondre efficacement les motifs s'étendant sur plusieurs lignes, élargissant considérablement la portée de la recherche.
Vous obtiendrez les lignes correspondantes de cette manière avec le numéro de ligne (mais sans le mot-clé correspondant)


#### Meilleure option pour les très gros fichiers (sur Windows) :
[DFIR_hunt_in_file.ps1](https://github.com/mthcht/ThreatHunting-Keywords/blob/main/DFIR_hunt_in_file.ps1)
`powershell -ep Bypass -File .\DFIR_hunt_in_file.ps1 -patternFile "only_keywords_regex.txt" -targetFile "C:\Users\mthcht\collection\20230406154410_EvtxECmd_Output.csv" -rgPath "C:\Users\mthcht\Downloads\ripgrep-13.0.0-x86_64-pc-windows-msvc\ripgrep-13.0.0-x86_64-pc-windows-msvc\rg.exe"`
- `-targetFile` : spécifie le fichier dans lequel rechercher (dans l'exemple, des journaux extraits par DFIR-ORC)
- `-patternFile` : le fichier contenant les motifs regex `only_keywords_regex.txt`
- `-rgPath` : le chemin de l'exécutable ripgrep
contenu du script PowerShell (inclus dans le dépôt) :```powershell
param (
[Parameter(Mandatory=$true)]
[string]$patternFile,
[Parameter(Mandatory=$true)]
[string]$targetFile,
[Parameter(Mandatory=$true)]
[string]$rgPath
)
Start-Transcript -Path "$PSScriptRoot\result_search.log" -Append -Force -Verbose
$totalLines = (Get-Content $patternFile | Measure-Object -Line).Lines
$currentLine = 0
Get-Content $patternFile | ForEach-Object {
$currentLine++
Write-Host "Searching for pattern $currentLine of $totalLines : $_"
& $rgPath --multiline --ignore-case $_ $targetFile | Write-Output
}
Stop-Transcript -Verbose
Le résultat de la recherche sera dans result_search.log dans le même répertoire que le script.

todo
Dans PowerShell, c'est beaucoup plus lent, mais si vous voulez quand même procéder ainsi, vous pouvez utiliser le script ci-dessous ; il vous indiquera le numéro de ligne correspondant et le mot-clé associé :
powershell.exe -ep Bypass -File .\hunt_keywords_windows.ps1 -k .\only_keywords.txt -f .\EvtxECmd_Output.csv
[Parameter(Mandatory=$true)]
[string]$kw
)
$Keywords = Get-Content $kw $result = @()
foreach ($Keyword in $Keywords) { $SearchTerm = $Keyword.Replace("", ".") $SearchTerm = [Regex]::Escape($SearchTerm).Replace(".*", ".*")
$reader = New-Object System.IO.StreamReader($file)
$lineNumber = 0
while (($line = $reader.ReadLine()) -ne $null) {
$lineNumber++
if ($line -match $SearchTerm) {
$result += New-Object PSObject -Property @{
'Keyword' = $Keyword
'LineNumber' = $lineNumber
'Line' = $line
}
}
}
$reader.Close()
}
$result | Out-GridView Read-Host -Prompt "Press Enter to exit"
</details>
### Règles YARA

Tous les modèles de détection de ce projet sont automatiquement exportés vers des règles yara dans [ThreatHunting-Keywords-yara-rules](https://github.com/mthcht/ThreatHunting-Keywords-yara-rules)
Quelques exemples de chasse avec les règles yara :




## Tableau de données rapide pour rechercher un mot-clé
https://mthcht.github.io/ThreatHunting-Keywords/

## Faux positifs
Contribuez et ajoutez vos faux positifs à la [liste](https://github.com/mthcht/ThreatHunting-Keywords/blob/main/_false_positives/false_positives_offensive_keywords.md) des faux positifs attendus
## Règles SIGMA
Consultez la table de correspondance traduite en [règles SIGMA](https://github.com/mthcht/ThreatHunting-Keywords-sigma-rules), je la mets généralement à jour en même temps :)

## Mappage des techniques MITRE ATT&CK
avec l'addon splunk https://splunkbase.splunk.com/app/5742

Couverture pour 2242 outils (mise à jour le 2024/08/30) :

recherche splunk :
<details>```
| inputlookup threathunting-keywords.csv
| stats count by metadata_tool metadata_tool_techniques
| makemv delim=" - " metadata_tool_techniques
| mvexpand metadata_tool_techniques
| stats count by metadata_tool_techniques
Tableaux de bord Splunk (ce n'est qu'un exemple ; une grande variété de filtres peut être appliquée à l'aide des champs disponibles dans le fichier) :
exemple de tableau de bord XML Splunk :



Les contributions, les problèmes et les demandes de fonctionnalités sont les bienvenus !
``
Veuillez fournir le nom de l'outil.
``
Fournissez un lien vers le site web officiel de l'outil ou son dépôt de code source (GitHub, GitLab, etc.). Si une documentation est disponible, veuillez l'inclure.
``
Décrivez l'objectif, les fonctionnalités et les caractéristiques notables de l'outil. Si vous n'êtes pas sûr, laissez ce champ vide et j'examinerai l'outil plus en détail.
``
Si vous disposez d'informations sur un usage connu ou potentiel de cet outil par des acteurs malveillants, veuillez les partager ici.
Veuillez choisir la catégorie la plus appropriée pour l'outil :
Je déciderai si un outil mérite d'être ajouté à la liste. Les outils largement utilisés et reconnus par la communauté ont plus de chances d'être inclus que les outils obscurs ou récents.
offensive tool keyword : Ces mots-clés concernent des outils offensifs ou présentent une forte probabilité d'intention malveillante. Il est essentiel que ces termes soient pertinents et fiables pour détecter les menaces potentielles (faible taux de faux positifs)greyware tool keyword : Les mots-clés de cette catégorie correspondent à des outils « légitimes » qui sont abusés par des acteurs malveillants. Comme ces outils ont également des usages légitimes, le potentiel de faux positifs est intrinsèquement plus élevé. Il est important d'interpréter ces résultats en sachant que toutes les détections ne signifient pas nécessairement une activité malveillantesignature keyword : Ces mots-clés peuvent ne pas être directement associés à des outils, mais peuvent inclure des noms de signatures de produits de sécurité, des chaînes spécifiques ou des mots importants dans la détection des menaces.metadata_tool : Nom de l'outil que nous voulons détecter
metadata_description : description de l'outil que nous voulons détecter
metadata_tool_techniques : Techniques MITRE liées à l'outil que nous voulons détecter
metadata_tool_tactics : Tactiques MITRE liées à l'outil que nous voulons détecter
metadata_malwares_name : Noms des variantes de malwares qui utilisent l'outil en question
metadata_groups_name : Noms des groupes d'acteurs de la menace associés à l'outil
metadata_category : Nom de catégorie global de l'outil. Cela peut changer ultérieurement et les suggestions sont les bienvenues.
metadata_link : lien vers l'outil (code source, articles, échantillons, blog...)
metadata_enable_endpoint_detection : Champ indiquant si le mot-clé peut être utilisé efficacement dans les recherches sur les journaux des endpoints. Cela inclut, sans s'y limiter, les journaux d'événements Windows, l'EDR, les journaux PowerShell, auditd, les sessions bastion, Sysmon ou toute source de données contenant des champs d'activité de processus et de fichiers.
metadata_enable_proxy_detection : Champ indiquant l'applicabilité du mot-clé pour les recherches dans les journaux réseau (Proxy, journaux DNS ou toute donnée avec des requêtes et des URL provenant du réseau interne)
metadata_popularity_score : score de 1 à 10 (popularité faible à élevée)
metadata_severity_score : score de 1 à 10 (gravité faible à élevée)
metadata_tags : balises pour identifier des artefacts spécifiques, plusieurs balises peuvent être associées à un mot-clé. Lorsque certains artefacts spécifiques ne peuvent pas être ajoutés aux listes sans plus de contexte de détection, ils sont ajoutés dans mes autres listes impressionnantes pour la détection
metadata_comment : Ce champ peut contenir un commentaire utile ajouté pour le mot-clé.
metadata_github_stars : Nombre d'étoiles sur le projet github (si l'outil est sur github, sinon la valeur est N/A). Ceci est utilisé pour calculer le score de popularité
metadata_github_forks : Nombre de forks sur le projet github (si l'outil est sur github, sinon la valeur est N/A). Peut être utilisé pour les statistiques de tableau de bord des outils les plus utilisés
metadata_github_created_at : Date de création du projet github (si l'outil est sur github, sinon la valeur est N/A). Peut être utilisé pour les statistiques de tableau de bord
metadata_github_updated_at : Date de dernière mise à jour du projet github (si l'outil est sur github, sinon la valeur est N/A). Peut être utilisé pour suivre les mises à jour importantes des outils offensifs et ajuster les détections par mots-clés
_rawkeyword_rawkeyword_detection_raw| search metadata_description!="" AND metadata_enable_endpoint_detection=1 nous nous concentrons uniquement sur les logs d'endpoints ici, donc nous ajoutons metadata_enable_endpoint_detection=1 pour ne correspondre qu'aux mots-clés pertinents pour les logs d'endpoints et metadata_description!="" pour n'avoir que les mots-clés correspondus.| stats count earliest(_time) as firsttime latest(_time) as lasttime values(_raw) as raw by metadata_keyword_type keyword_detection index sourcetype ici j'ai fait un filtre rapide sans tous les champs de la lookup pour l'exemple (mais vous pouvez aussi les ajouter si vous voulez avoir plus de possibilités d'exclusions), cela nous permet d'avoir facilement une idée de quel mot-clé correspond beaucoup, afin de pouvoir exclure facilement la catégorie ou l'outil s'il y a trop de faux positifs !|loadjob myjobid, nous pouvons désormais manipuler la sortie avec les logs pertinents sans rechercher à nouveau dans tous les logs.and use this splunk visualization: https://splunkbase.splunk.com/app/5742
