đŸ”„ Kerberoasting : l’art de griller de l’AD
 et pourquoi vos dĂ©fenses ne tiennent pas la braise

Cela fait plus de 10 ans que les experts cybersĂ©curitĂ© alertent sur le Kerberoasting, cette attaque aussi simple qu’efficace pour rĂ©cupĂ©rer les mots de passe de comptes Ă  privilĂšges via Kerberos. Et pourtant, en 2025, cette technique continue de caramĂ©liser les contrĂŽleurs de domaine, avec un petit goĂ»t de brĂ»lĂ© pour les SOC qui n’y voient que du feu.
Pourquoi cette attaque vieillit bien ? Parce que vos détections
 vieillissent mal.


🧯 Petit rappel pour les distraits : c’est quoi le Kerberoasting ?

Le Kerberoasting, c’est un peu comme scanner un menu de restaurant pour y trouver des plats chiffrĂ©s avec des mots de passe faibles
 sauf qu’ici, le menu, c’est Kerberos.

En clair :

  1. L’attaquant, dĂ©jĂ  dans le SI avec un compte lambda (merci phishing ou mot de passe « Azerty123 »),
  2. demande un ticket TGS pour un compte de service,
  3. récupÚre le ticket chiffré avec le hash du mot de passe du compte,
  4. repart avec sous le bras pour le craquer tranquillement en local avec Hashcat, JTR, ou son blender préféré.

Et voilĂ . Le compte de service, souvent admin local ou pire, est compromis. Et vous, vous ne voyez rien venir.


đŸ•”ïžâ€â™‚ïž Des dĂ©tections obsolĂštes face Ă  un feu discret

Les outils de détection se basent encore trop souvent sur des rÚgles rigides façon :

  • « Si plus de X requĂȘtes TGS par minute → alerte ! »
  • « Si chiffrement RC4 utilisĂ© → suspicion ! »

Sauf que :

  • Les services lĂ©gitimes font parfois plein de requĂȘtes (bonjour les faux positifs),
  • Et les attaquants ne sont pas pressĂ©s : une requĂȘte toutes les 15 minutes sur 24h ? Personne ne lĂšve un sourcil.
  • Les admins adorent encore RC4 (soupirs).

RĂ©sultat : des alertes partout
 sauf lĂ  oĂč il faut.


🧠 Nouvelle approche : Kerberos rencontre les stats

Une Ă©quipe de chercheurs (coucou BeyondTrust) a dĂ©cidĂ© de lĂącher les regex pour adopter une modĂ©lisation statistique comportementale.

Leur méthode ?
👉 Regrouper les requĂȘtes TGS dans des clusters de comportements (ex. : nombre, type de service, moment, user-agent…)
👉 Suivre l’évolution de ces clusters dans le temps sous forme d’histogrammes
👉 DĂ©tecter les anomalies statistiques, pas juste les pics.

Bonus :

  • Chaque alerte est explicable (on comprend pourquoi elle est levĂ©e),
  • Le modĂšle affiche son niveau d’incertitude (vous avez dit XDR ?),
  • Ça tourne en temps rĂ©el, avec moins de 30s de calcul par heure d’évĂ©nements.

Pas mal pour une détection que votre SIEM mettait 2 jours à rater.


đŸ§Ș TestĂ© en conditions rĂ©elles : pas qu’un PowerPoint

La mĂ©thode a Ă©tĂ© testĂ©e sur 50 jours d’évĂ©nements Kerberos en prod :

  • DĂ©tection fiable de 2 attaques rĂ©elles de type Kerberoasting simulĂ©es,
  • Identification de 3 changements d’infrastructure (migrations, mises Ă  jour AD) sans faux positifs critiques,
  • Une anomalie « exotique » dĂ©tectĂ©e, analysĂ©e et justifiĂ©e.

Le modĂšle a non seulement Ă©vitĂ© la panique, mais aussi donnĂ© du contexte Ă  chaque alerte.

Autrement dit : moins d’alertes Ă  la noix, plus d’intelligence dans vos logs.


🧰 Et en pratique ? Tu fais quoi demain ?

Quelques pistes concrĂštes pour ne pas finir rĂŽti :

  • 🔒 Audit de tous les comptes de service avec SPN → longs mots de passe + sans RC4, please.
  • đŸš«Â Supprimez les accounts avec Kerberos RC4 par dĂ©faut (vous savez qui vous ĂȘtes).
  • 📉 Surveillez les TGS Ă©mis par utilisateur unique sur des services multiples, mais pas juste en volume brut.
  • 📊 IntĂ©grez une logique de dĂ©tection adaptative, mĂȘme Ă  petite Ă©chelle (Elastic, Sentinel, Splunk → c’est faisable).
  • đŸ§© Coupler cette dĂ©tection avec un ITDR comme BeyondTrust peut automatiser la rĂ©ponse.

💣 En conclusion : Kerberos est votre ami
 jusqu’à ce qu’il vous plante un couteau dans le dos

Le vrai problĂšme, ce n’est pas Kerberos. C’est la paresse de vos dĂ©tections et la rigiditĂ© de vos outils. Les attaquants se sont adaptĂ©s, et vous ?

Il est temps de passer d’un modĂšle oĂč on guette les Ă©clairs, Ă  un modĂšle oĂč on comprend les nuages.

Et si votre SIEM vous crie « Kerberoasting detected » Ă  chaque pause-cafĂ© de l’admin, c’est peut-ĂȘtre pas un feu
 juste votre dĂ©tection qui fume.


đŸ›Ąïž Mini-Playbook SOC – DĂ©tection comportementale de Kerberoasting

🎯 Objectif

Renforcer la dĂ©tection des attaques de type Kerberoasting en utilisant une approche comportementale et statistique, plus robuste que les rĂšgles statiques traditionnelles.
Ce playbook est conçu pour ĂȘtre progressivement dĂ©ployĂ© dans un SOC, avec ou sans solution ITDR.


đŸ§© Étape 1 – PrĂ©requis techniques

Collecte de logs indispensable :

  • đŸŽ«Â Event ID 4769 (Windows Security Log) : Ă©mission d’un ticket TGS.
  • đŸ§‘â€đŸ’» Nom d’utilisateur (UserName)
  • đŸ–„ïž ServiceName (SPN demandĂ©)
  • 🔒 EncryptionType
  • 📆 Timestamp

Outils recommandĂ©s :

  • SIEM (Splunk, ELK, Sentinel, QRadar, etc.)
  • Un moteur d’analyse statistique :
    • Python (Pandas, SciPy, Scikit-learn)
    • Ou module UEBA du SIEM, ou ITDR type BeyondTrust

đŸ§Ș Étape 2 – PrĂ©traitement & segmentation

But : construire des comportements « normaux » de demande TGS.

➀ À faire :

  1. Nettoyer les logs :
    • Supprimer les Ă©vĂ©nements systĂšme (compte machine, service SYSTEM).
    • Normaliser les formats de timestamp.
  2. Grouper les événements :
    • Par utilisateur (UserName)
    • Par intervalle horaire (1h ou 4h selon volume)
  3. Extraire les variables clés :
    • Nombre de requĂȘtes TGS / heure / user
    • Types de chiffrement utilisĂ©s
    • Nombre de SPN diffĂ©rents ciblĂ©s
    • DiversitĂ© des services demandĂ©s
    • Volume moyen vs pic soudain

📊 Étape 3 – Analyse comportementale

Objectif : dĂ©tecter des Ă©carts significatifs au comportement historique.

➀ Options :

  • Approche statistique simple :
    • Moyenne mobile + Ă©cart-type
    • DĂ©tection d’anomalies (Z-score, IQR)
  • Approche avancĂ©e (optionnel) :
    • Clustering non supervisĂ© : DBSCAN ou K-Means
    • ModĂšles de dĂ©tection d’anomalies : Isolation Forest, One-Class SVM

💡 Conseil : commencez simple, puis complexifiez au besoin. Le Z-score suffit souvent Ă  dĂ©tecter les attaques « anormales ».


🚹 Étape 4 – DĂ©clenchement d’alertes

➀ CritĂšres recommandĂ©s :

  • RequĂȘtes TGS > moyenne + 2x Ă©cart-type
  • Utilisateur demandant > X SPN diffĂ©rents en 1h
  • Ticket RC4 demandĂ© alors que l’AD est censĂ© ĂȘtre AES-only
  • PrĂ©sence de tickets chiffrĂ©s sur des comptes dĂ©sactivĂ©s

Bonus : Ajouter une marge d’incertitude dans l’alerte pour prioriser les analyses (ex. : score de confiance sur 100).


📩 Étape 5 – RĂ©ponse SOC

Workflow type :

  1. Analyse rapide de l’utilisateur ciblé :
    • LĂ©gitimitĂ© du compte ?
    • Session interactive ? Service ?
  2. Vérification des SPN demandés :
    • Services connus ?
    • Changement rĂ©cent ?
  3. CorrĂ©lation avec d’autres Ă©vĂ©nements :
    • CrĂ©ation de compte ?
    • Mouvement latĂ©ral suspect ?

Actions possibles :

  • Isolation du poste
  • RĂ©initialisation des comptes de service concernĂ©s
  • Investigation via EDR
  • CrĂ©ation d’un cas dans ITDR / XDR

🛠 Étape 6 – Automatisation (optionnel mais recommandĂ©)

  • 🔁 Script Python pour scoring et analyse horaire
  • đŸ“€ Export CSV ou JSON vers SIEM ou outil XDR
  • 📧 Alerte automatisĂ©e par email/Slack si score > seuil
  • 🧠 IntĂ©gration dans un moteur de dĂ©tection type Sentinel + Azure Logic Apps

📘 Étape 7 – Documentation & retour d’expĂ©rience

  • 🔎 Documenter chaque cas dĂ©tectĂ© (vrai positif, faux positif, test Red Team
)
  • đŸ›Ąïž Mettre Ă  jour le modĂšle selon les changements d’infrastructure (migration, nouvelle app
)
  • đŸ§‘â€đŸ« Former les analystes SOC Ă  l’interprĂ©tation des comportements au lieu des simples rĂšgles

✅ RĂ©sumĂ© visuel

ÉtapeObjectifOutils/Exemples
1. CollecteRécupérer les logs 4769SIEM, Sysmon
2. PrétraitementGrouper & nettoyerPython, KQL
3. AnalyseIdentifier les anomaliesZ-score, DBSCAN
4. AlerteDéclencher avec contexteSIEM + score
5. RéponseIsoler, investiguer, corrélerPlaybook SOAR
6. AutoScripts de détectionPython + API SIEM
7. FeedbackAmélioration continueWiki SOC

🧠 En bonus : 3 conseils pratiques et des exemples de script

  • CrĂ©e une whitelist de services bavards lĂ©gitimes (imprimantes, services backend, etc.)
  • Renomme les SPN obsolĂštes ou dĂ©sactive les comptes dormants
  • Utilise AES comme standard, et dis adieu au RC4

✅ 1. Exemple de script Python : dĂ©tection simple d’anomalie TGS par Z-score

Ce script analyse des logs d’évĂ©nements TGS (Event ID 4769) depuis un CSV extrait de ton SIEM (ou via API), et identifie les utilisateurs qui font des requĂȘtes TGS anormalement Ă©levĂ©es.

đŸ’Ÿ Format CSV attendu (tgs_logs.csv) :

TimeGeneratedUserNameServiceNameEncryptionType
2025-07-22 13:04:00john.doeMSSQLSvc/…0x17

🐍 Script Python (Z-score, seuil = 2σ)

python

import pandas as pd
import numpy as np
from datetime import timedelta

# Charger les logs TGS
df = pd.read_csv("tgs_logs.csv", parse_dates=["TimeGenerated"])

# Grouper par utilisateur et heure
df["TimeRounded"] = df["TimeGenerated"].dt.floor("H")
grouped = df.groupby(["UserName", "TimeRounded"]).size().reset_index(name="TGS_Count")

# Moyenne + écart-type par utilisateur
stats = grouped.groupby("UserName")["TGS_Count"].agg(["mean", "std"]).reset_index()
grouped = grouped.merge(stats, on="UserName")

# Calcul du Z-score
grouped["z_score"] = (grouped["TGS_Count"] - grouped["mean"]) / grouped["std"]
grouped["anomalie"] = grouped["z_score"] > 2  # seuil = 2σ

# Affichage des anomalies
anomalies = grouped[grouped["anomalie"]]
print("🚹 Anomalies dĂ©tectĂ©es :")
print(anomalies[["UserName", "TimeRounded", "TGS_Count", "z_score"]])


🔍 RĂ©sultat attendu :

text
🚹 Anomalies dĂ©tectĂ©es :
  UserName     TimeRounded         TGS_Count    z_score
  john.doe     2025-07-22 14:00     34           2.87
  svc.account  2025-07-22 09:00     61           3.15

✅ 2. Exemple de requĂȘte KQL (Azure Sentinel / Microsoft Defender)

DĂ©tection de pics de requĂȘtes TGS suspects (EventID 4769), par utilisateur sur 1h, avec filtrage RC4 :

kql
SecurityEvent
| where EventID == 4769
| where AccountType == "User"
| extend HourBucket = bin(TimeGenerated, 1h)
| summarize TGS_Count = count(), 
            SPNs = dcount(ServiceName),
            RC4_Tickets = countif(EncryptionType == "0x17")
    by Account = TargetUserName, HourBucket
| join kind=inner (
    SecurityEvent
    | where EventID == 4769
    | summarize avg_count = avg(count()) by TargetUserName
) on $left.Account == $right.TargetUserName
| where TGS_Count > avg_count * 2  // seuil ajustable
| project HourBucket, Account, TGS_Count, SPNs, RC4_Tickets


✅ Exemple de requĂȘte ELK / Lucene / Kibana DSL

En supposant que tu logs les 4769 dans un index winlogbeat-* :

json
GET winlogbeat-*/_search
{
  "size": 0,
  "query": {
    "bool": {
      "must": [
        { "match": { "event.code": "4769" }},
        { "match": { "winlog.event_data.TicketEncryptionType": "0x17" }}
      ]
    }
  },
  "aggs": {
    "users": {
      "terms": { "field": "winlog.event_data.TargetUserName.keyword", "size": 10 },
      "aggs": {
        "by_hour": {
          "date_histogram": {
            "field": "@timestamp",
            "fixed_interval": "1h"
          },
          "aggs": {
            "tgs_count": { "value_count": { "field": "winlog.event_data.ServiceName.keyword" }}
          }
        }
      }
    }
  }
}

🔎 Tu peux ensuite visualiser ces buckets horaires dans un dashboard Kibana et appliquer des seuils manuellement, ou via Watcher / alertes.


🔧 Bonus : intĂ©gration SIEM ou alerting

  • Splunk : convertis le script en recherche SPL et utilise anomalydetection ou movingavg.
  • Sentinel : ajoute un Playbook Logic App pour crĂ©er un ticket automatiquement.
  • ELK : ajoute un trigger dans Watcher ou ElastAlert.

đŸ”„ Kerberoasting : l’art de griller de l’AD
 et pourquoi vos dĂ©fenses ne tiennent pas la braise
Partager cet article : Twitter LinkedIn WhatsApp

đŸ–‹ïž PubliĂ© sur SecuSlice.com

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Retour en haut