Entrada

Bandit: nivel 32 → 33

Cómo resolver el último nivel de OverTheWire Bandit, el 32 → 33, escapando de la uppercase shell con el truco de $0.

Bandit: nivel 32 → 33

El último nivel de Bandit, y uno de los más ingeniosos. Nos meten en una “uppercase shell”: una shell que convierte en mayúsculas todo lo que escribes, así que ningún comando funciona (ls se convierte en LS, que no existe). El reto es escapar de ella, y la solución es uno de esos trucos elegantes que una vez lo ves no se te olvida.

Las contraseñas de los niveles aparecen como [REDACTED]. Siguiendo las normas de OverTheWire, no publico credenciales: la gracia es que llegues a ellas tú.

El enunciado

El enunciado del nivel avisa: tras conectarte te encuentras con una uppercase shell, y tu misión es escapar de ella. Al entrar, te recibe este mensaje y un prompt distinto:

1
2
3
$ sshpass -p '[REDACTED]' ssh bandit32@bandit.labs.overthewire.org -p 2220
WELCOME TO THE UPPERCASE SHELL
>>

Si pruebas a escribir cualquier comando, lo pasa a mayúsculas antes de ejecutarlo y falla:

1
2
3
4
>> ls
sh: 1: LS: not found
>> whoami
sh: 1: WHOAMI: not found

Todo lo que escribes se convierte a mayúsculas, y en Linux los comandos van en minúsculas, así que no ejecutas nada. Hay que encontrar algo que sobreviva a la conversión a mayúsculas y que nos dé una shell normal.

La solución: $0

1
2
>> $0
$ 

Con solo escribir $0 conseguimos una shell normal. ¿Por qué funciona?

  • $0 no tiene letras. La shell convierte a mayúsculas los caracteres que escribes, pero $ y 0 no son letras: no hay nada que “mayusculizar”. Pasan intactos. (Compáralo con ls, que sí tiene letras y acaba como LS.)
  • $0 es una variable especial. En bash/sh, $0 contiene el nombre del propio shell o script que se está ejecutando. En este caso, el shell que corre por detrás es sh.
  • Al escribir $0, la shell lo expande a sh y lo ejecuta. Y eso lanza una nueva instancia de sh normal, sin el filtro de mayúsculas. Hemos escapado.

Ya tenemos un prompt $ corriente. A partir de aquí todo funciona en minúsculas:

1
2
3
$ export TERM=xterm
$ whoami
bandit33

La idea general (“¿qué entrada sobrevive al filtro y me da una shell?”) es la misma que vimos al escapar de la shell restringida del nivel 25 → 26. Cambia el filtro (allí era more, aquí es la conversión a mayúsculas), pero la mentalidad es idéntica: buscar la grieta que el filtro no cubre.

Recoger la contraseña de bandit33

Ya como bandit33, leemos su contraseña por si quieres reconectar de forma limpia:

1
2
$ cat /etc/bandit_pass/bandit33
[REDACTED]

Y con eso entramos en el home de bandit33, donde nos espera el final:

1
2
3
4
$ cd /home/bandit33
$ cat README.txt
Congratulations on solving the last level of this game!
...

Por qué esto importa en seguridad

Este nivel es un ejemplo perfecto de escape de shell restringida, uno de los escenarios más comunes en pentesting. Montas una “jaula” para limitar lo que el usuario puede hacer (aquí, forzando mayúsculas; en otros casos, una rbash, un menú, un paginador…), pero casi siempre queda una grieta:

  • Entradas que el filtro no transforma (como $0, que no tiene letras).
  • Funciones del propio intérprete que no se pensó en bloquear (variables, expansiones, exec…).
  • Programas “inofensivos” que a su vez pueden lanzar una shell (GTFOBins).

La lección defensiva: una shell restringida no es un sandbox de verdad. Si de verdad quieres aislar a un usuario, hacen falta mecanismos del sistema (contenedores, chroot bien hecho, SELinux/AppArmor, seccomp…), no un filtro de texto que se puede esquivar con dos caracteres.

Fin del juego

1
2
$ whoami
bandit33

¡Y hasta aquí Bandit! Has recorrido los 34 niveles: desde un simple cat hasta escapes de shell, escalada de privilegios, fuerza bruta, arqueología en repositorios Git y este último truco de la uppercase shell. Si has seguido la serie entera, ahora manejas la terminal con una soltura que es la base de todo lo que viene después en seguridad ofensiva.

¿Siguiente parada? Los propios creadores recomiendan seguir con otros de sus wargames. Natas (seguridad web) o Leviathan/Narnia (más binarios y lógica) son continuaciones naturales. Y si te ha picado el gusanillo del pentesting, este es el momento de dar el salto a plataformas como Hack The Box.

Resumen

Comando / conceptoPara qué sirve
Uppercase shellShell restringida que convierte la entrada a mayúsculas
$0Variable especial: el nombre del shell/script en ejecución
Por qué $0 escapaNo tiene letras (sobrevive al filtro) y expande a sh
Escape de shell restringidaBuscar la entrada o función que el filtro no cubre
cat /etc/bandit_pass/bandit33Leer la contraseña una vez eres bandit33
Esta entrada está licenciada bajo CC BY 4.0 por el autor.