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 :
- Lâattaquant, dĂ©jĂ dans le SI avec un compte lambda (merci phishing ou mot de passe « Azerty123 »),
- demande un ticket TGS pour un compte de service,
- récupÚre le ticket chiffré avec le hash du mot de passe du compte,
- 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 :
- Nettoyer les logs :
- Supprimer les événements systÚme (compte machine, service SYSTEM).
- Normaliser les formats de timestamp.
- Grouper les événements :
- Par utilisateur (
UserName) - Par intervalle horaire (1h ou 4h selon volume)
- Par utilisateur (
- 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 :
- Analyse rapide de lâutilisateur ciblé :
- Légitimité du compte ?
- Session interactive ? Service ?
- Vérification des SPN demandés :
- Services connus ?
- Changement récent ?
- 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
| Ătape | Objectif | Outils/Exemples |
|---|---|---|
| 1. Collecte | Récupérer les logs 4769 | SIEM, Sysmon |
| 2. Prétraitement | Grouper & nettoyer | Python, KQL |
| 3. Analyse | Identifier les anomalies | Z-score, DBSCAN |
| 4. Alerte | Déclencher avec contexte | SIEM + score |
| 5. Réponse | Isoler, investiguer, corréler | Playbook SOAR |
| 6. Auto | Scripts de détection | Python + API SIEM |
| 7. Feedback | Amélioration continue | Wiki 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) :
| TimeGenerated | UserName | ServiceName | EncryptionType |
|---|---|---|---|
| 2025-07-22 13:04:00 | john.doe | MSSQLSvc/… | 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.
