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.
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?
$0no tiene letras. La shell convierte a mayúsculas los caracteres que escribes, pero$y0no son letras: no hay nada que “mayusculizar”. Pasan intactos. (Compáralo conls, que sí tiene letras y acaba comoLS.)$0es una variable especial. En bash/sh,$0contiene el nombre del propio shell o script que se está ejecutando. En este caso, el shell que corre por detrás essh.- Al escribir
$0, la shell lo expande ashy lo ejecuta. Y eso lanza una nueva instancia deshnormal, 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 / concepto | Para qué sirve |
|---|---|
| Uppercase shell | Shell restringida que convierte la entrada a mayúsculas |
$0 | Variable especial: el nombre del shell/script en ejecución |
Por qué $0 escapa | No tiene letras (sobrevive al filtro) y expande a sh |
| Escape de shell restringida | Buscar la entrada o función que el filtro no cubre |
cat /etc/bandit_pass/bandit33 | Leer la contraseña una vez eres bandit33 |