🎯
Pentest
Threat Hunting : la chasse proactive aux menaces
📅 2025-05-03 ⏱ 11 min de lecture 🏷 Avancé

// SOMMAIRE

Threat Hunting : la chasse proactive aux menaces

Le Threat Hunting (chasse aux menaces) est l'approche proactive de la cybersécurité. Plutôt que d'attendre qu'une alerte se déclenche, les threat hunters partent à la recherche active des attaquants qui se cachent déjà dans votre réseau.

Qu'est-ce que le Threat Hunting ?

Sécurité RÉACTIVE (classique) :

Attaque → Alerte → Réponse

Problème : le délai moyen de détection est de 197 jours !

Sécurité PROACTIVE (Threat Hunting) :

Hypothèse → Recherche active → Découverte → Réponse

Avantage : on cherche AVANT que l'attaquant ait causé des dégâts

> En 2023, le temps moyen entre l'intrusion initiale et la détection était de 197 jours selon IBM. Le Threat Hunting vise à réduire ce délai à des heures ou des jours.

Le cycle du Threat Hunting

1. HYPOTHÈSE

"Peut-être qu'un attaquant utilise le DNS pour exfiltrer des données"

  • COLLECTE DE DONNÉES
  • Logs réseau, EDR, SIEM, DNS queries

  • INVESTIGATION
  • Analyser les données à la recherche de patterns anormaux

  • DÉCOUVERTE
  • Trouver (ou infirmer) l'activité malveillante

  • AMÉLIORATION
  • Créer des détections automatiques pour la prochaine fois

    Les sources de données essentielles

    Logs à collecter

    # Sur Windows - Sources prioritaires
    

    → Windows Event Logs (Security, System, Application, PowerShell)

    → Sysmon (journalisation avancée des processus, réseau, registre)

    → EDR logs (CrowdStrike, SentinelOne, Defender for Endpoint)

    Sur Linux

    → /var/log/auth.log, /var/log/syslog

    → Auditd logs (/var/log/audit/audit.log)

    → Process accounting

    Réseau

    → DNS queries (toutes les requêtes DNS)

    → NetFlow / IPFIX (métadonnées des flux)

    → Proxy logs (trafic web)

    → Firewall logs

    Sysmon — L'outil indispensable

    <!-- Installation et configuration de Sysmon -->
    

    <!-- Télécharger : https://docs.microsoft.com/sysinternals/sysmon -->

    <!-- Configuration recommandée (sysmonconfig.xml) -->

    <Sysmon schemaversion="4.70">

    <EventFiltering>

    <!-- Event 1 : Création de processus -->

    <ProcessCreate onmatch="include">

    <CommandLine condition="contains">powershell</CommandLine>

    <CommandLine condition="contains">cmd.exe</CommandLine>

    <CommandLine condition="contains">wscript</CommandLine>

    </ProcessCreate>

    <!-- Event 3 : Connexions réseau -->

    <NetworkConnect onmatch="include">

    <DestinationPort condition="is">4444</DestinationPort>

    <DestinationPort condition="is">1337</DestinationPort>

    </NetworkConnect>

    <!-- Event 11 : Création de fichiers -->

    <FileCreate onmatch="include">

    <TargetFilename condition="end with">.exe</TargetFilename>

    <TargetFilename condition="contains">Temp</TargetFilename>

    </FileCreate>

    </EventFiltering>

    </Sysmon>

    # Installer Sysmon avec la config
    

    .\Sysmon64.exe -accepteula -i sysmonconfig.xml

    Vérifier les événements Sysmon

    Get-WinEvent -LogName "Microsoft-Windows-Sysmon/Operational" -MaxEvents 50

    Techniques et hypothèses de hunting

    Hunting 1 : Exfiltration DNS

    # Hypothèse : un malware utilise DNS pour exfiltrer des données
    

    (données encodées dans les sous-domaines)

    Exemple de requête suspecte :

    dGhpcyBpcyBzZW5zaXRpdmUgZGF0YQ==.evil.com

    (données en base64 dans le sous-domaine)

    Détection avec Python - analyser les logs DNS

    import re

    from collections import Counter

    def analyser_dns_suspects(fichier_logs):

    with open(fichier_logs) as f:

    lignes = f.readlines()

    domaines_suspects = []

    for ligne in lignes:

    # Chercher des sous-domaines anormalement longs

    match = re.search(r'(\S+)\.example\.com', ligne)

    if match:

    sous_domaine = match.group(1)

    if len(sous_domaine) > 30: # Sous-domaine suspect si > 30 chars

    domaines_suspects.append(sous_domaine)

    return Counter(domaines_suspects).most_common(20)

    Requête KQL (Kusto Query Language) pour Microsoft Sentinel

    """

    DnsEvents

    | where Name has_any ("base64", "encoded")

    or strlen(extract(@"([^.]+)\.", 1, Name)) > 30

    | summarize count() by Name, ClientIP

    | where count_ > 10

    | order by count_ desc

    """

    Hunting 2 : Living off the Land (LOLBins)

    Les attaquants utilisent des binaires Windows légitimes pour éviter la détection.

    # LOLBins couramment abusés
    

    certutil, mshta, regsvr32, rundll32, wmic, bitsadmin

    Chercher l'utilisation suspecte de certutil (souvent utilisé pour télécharger des fichiers)

    Get-WinEvent -LogName "Microsoft-Windows-Sysmon/Operational" |

    Where-Object {$_.Message -match "certutil" -and $_.Message -match "urlcache"} |

    Select-Object TimeCreated, Message

    Requête Splunk SPL

    """

    index=windows EventCode=1

    | search Image="certutil" CommandLine="urlcache"

    | table _time, ComputerName, User, CommandLine

    """

    Requête Sigma (format universel)

    """

    title: Suspicious Certutil Usage

    detection:

    selection:

    EventID: 1

    Image|endswith: '\certutil.exe'

    CommandLine|contains:

    - 'urlcache'

    - 'decode'

    - 'encode'

    condition: selection

    """

    Hunting 3 : Connexions vers des IPs suspectes

    # Enrichissement des IPs avec VirusTotal
    

    import requests

    def check_ip_virustotal(ip, api_key):

    url = f"https://www.virustotal.com/api/v3/ip_addresses/{ip}"

    headers = {"x-apikey": api_key}

    response = requests.get(url, headers=headers)

    data = response.json()

    malicious = data['data']['attributes']['last_analysis_stats']['malicious']

    return {'ip': ip, 'malicious_votes': malicious}

    Automatiser sur un fichier de logs réseau

    def hunt_malicious_ips(netflow_file, vt_api_key):

    ips = extraire_ips_externes(netflow_file)

    results = []

    for ip in ips:

    result = check_ip_virustotal(ip, vt_api_key)

    if result['malicious_votes'] > 5:

    results.append(result)

    return sorted(results, key=lambda x: x['malicious_votes'], reverse=True)

    Hunting 4 : Comptes dormants réactivés

    # Chercher des connexions de comptes qui ne s'étaient pas connectés depuis longtemps
    

    (signe possible de compromission de credentials oubliés)

    $cutoff = (Get-Date).AddDays(-180) # Inactif depuis 6 mois

    Get-ADUser -Filter {LastLogonDate -lt $cutoff -and Enabled -eq $true} `

    -Properties LastLogonDate, PasswordLastSet |

    Select-Object Name, SamAccountName, LastLogonDate, PasswordLastSet |

    Sort-Object LastLogonDate

    Croiser avec les événements de connexion récents

    Get-WinEvent -FilterHashtable @{

    LogName='Security'

    Id=4624

    StartTime=(Get-Date).AddDays(-7)

    } | Where-Object {$_.Properties[5].Value -in $comptes_dormants}

    Framework MITRE ATT&CK

    Le framework MITRE ATT&CK catalogue toutes les techniques d'attaque connues. C'est la bible du threat hunter.

    Structure ATT&CK :
    

    Tactiques (pourquoi) → Techniques (comment) → Procédures (implémentation)

    Exemple :

    Tactique : Persistence (T1547)

    Technique : Boot/Logon Autostart Execution

    Sous-tech. : Registry Run Keys (T1547.001)

    Procédure : Malware X ajoute HKLM\Run\WindowsUpdate = malware.exe

    # Mapper vos détections au framework ATT&CK
    

    hypotheses_hunting = [

    {

    "id": "HUNT-001",

    "hypothese": "Utilisation de DNS pour C2",

    "mitre_technique": "T1071.004",

    "mitre_nom": "Application Layer Protocol: DNS",

    "sources_donnees": ["DNS logs", "NetFlow"],

    "outils": ["Zeek", "RITA"]

    },

    {

    "id": "HUNT-002",

    "hypothese": "PowerShell encodé pour l'évasion",

    "mitre_technique": "T1059.001",

    "mitre_nom": "Command and Scripting Interpreter: PowerShell",

    "sources_donnees": ["Sysmon Event 1", "PowerShell logs"],

    "outils": ["Splunk", "Sigma"]

    }

    ]

    Outils de Threat Hunting

    | Outil | Usage | Type |

    |-------|-------|------|

    | Velociraptor | Collecte forensique distribuée | Open source |

    | RITA | Analyse de trafic réseau | Open source |

    | Zeek | Analyse réseau avancée | Open source |

    | ELK Stack | SIEM open source | Open source |

    | Splunk | SIEM enterprise | Commercial |

    | Microsoft Sentinel | SIEM cloud | Commercial |

    | CrowdStrike Falcon | EDR + hunting | Commercial |

    # Velociraptor - Collecte forensique à distance
    

    Déployer un serveur Velociraptor

    ./velociraptor-v0.7.0-linux-amd64 config generate -i

    ./velociraptor-v0.7.0-linux-amd64 --config server.config.yaml frontend

    Créer un artefact de hunting personnalisé

    Chercher les processus avec des connexions réseau inhabituelles

    velociraptor artifact collect Windows.Network.Netstat

    velociraptor artifact collect Windows.Persistence.PermanentWMIEvents

    Conclusion

    Le Threat Hunting transforme la sécurité d'une posture réactive en approche proactive. En combinant hypothèses basées sur le renseignement, données de qualité (Sysmon, EDR) et framework MITRE ATT&CK, vous pouvez découvrir des attaquants qui ont contourné vos défenses automatisées. C'est le niveau supérieur de la cyberdéfense.

    💬 Voir l'article avec commentaires →
    ← PowerShell pour la sécurité : guide complet Société de surveillance et vie privée numérique →