Linux Privilege Escalation
Last updated
Last updated
Impara e pratica l'Hacking su AWS: HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica l'Hacking su GCP: HackTricks Training GCP Red Team Expert (GRTE)
Iniziamo ad acquisire conoscenze sul sistema operativo in esecuzione.
Se hai le autorizzazioni di scrittura su una qualsiasi cartella all'interno della variabile PATH
, potresti essere in grado di dirottare alcune librerie o binari:
Informazioni interessanti, password o chiavi API nelle variabili d'ambiente?
Controlla la versione del kernel e se esiste qualche exploit che può essere utilizzato per ottenere privilegi elevati
Puoi trovare un buon elenco di kernel vulnerabili e alcuni exploit già compilati qui: https://github.com/lucyoa/kernel-exploits e exploitdb sploits. Altri siti dove puoi trovare alcuni exploit già compilati: https://github.com/bwbwbwbw/linux-exploit-binaries, https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack
Per estrarre tutte le versioni di kernel vulnerabili da quel sito web puoi fare:
Gli strumenti che potrebbero aiutare a cercare exploit del kernel sono:
linux-exploit-suggester.sh linux-exploit-suggester2.pl linuxprivchecker.py (eseguire NEL vittima, controlla solo gli exploit per il kernel 2.x)
Ricerca sempre la versione del kernel su Google, forse la tua versione del kernel è scritta in qualche exploit del kernel e quindi sarai sicuro che questo exploit è valido.
Privilege Escalation di Linux - Kernel Linux <= 3.19.0-73.8
Basato sulle versioni vulnerabili di sudo che appaiono in:
Puoi verificare se la versione di sudo è vulnerabile utilizzando questo comando grep.
Da @sickrov
Controlla smasher2 box di HTB per un esempio di come questa vulnerabilità potrebbe essere sfruttata
Execshield è una tecnica di protezione proattiva che può essere utilizzata per prevenire attacchi di esecuzione di codice arbitrario.
SELinux (Security-Enhanced Linux) è un meccanismo di controllo degli accessi obbligatorio implementato nel kernel Linux.
ASLR (Address Space Layout Randomization) è una tecnica di protezione che mira a rendere più difficile per un attaccante sfruttare vulnerabilità di esecuzione arbitraria. Con ASLR abilitato, gli indirizzi di memoria vengono casualizzati, rendendo difficile prevedere la posizione esatta in cui si trova una specifica area di memoria.
Se ti trovi all'interno di un container Docker, puoi provare a evadere da esso:
Docker SecurityControlla cosa è montato e smontato, dove e perché. Se qualcosa è smontato, potresti provare a montarlo e controllare informazioni private.
Enumerare i binari utili
Inoltre, controlla se è installato un qualsiasi compilatore. Questo è utile se hai bisogno di utilizzare qualche exploit del kernel poiché è consigliabile compilarlo nella macchina in cui lo utilizzerai (o in una simile)
Verifica la versione dei pacchetti e dei servizi installati. Potrebbe esserci una vecchia versione di Nagios (per esempio) che potrebbe essere sfruttata per l'escalation dei privilegi... Si consiglia di verificare manualmente la versione del software installato più sospetto.
Se hai accesso SSH alla macchina, potresti anche utilizzare openVAS per verificare la presenza di software obsoleto e vulnerabile installato all'interno della macchina.
Nota che questi comandi mostreranno molte informazioni che saranno per lo più inutili, pertanto è consigliabile utilizzare alcune applicazioni come OpenVAS o simili che verificheranno se una qualsiasi versione del software installato è vulnerabile a exploit conosciuti
Dai un'occhiata a quali processi vengono eseguiti e controlla se qualche processo ha più privilegi del dovuto (forse un tomcat in esecuzione da root?)
Sempre controlla la presenza di debugger electron/cef/chromium in esecuzione, potresti sfruttarlo per escalare i privilegi. Linpeas li rileva controllando il parametro --inspect
nella riga di comando del processo.
Inoltre verifica i tuoi privilegi sui binari dei processi, potresti sovrascrivere qualcun altro.
Puoi utilizzare strumenti come pspy per monitorare i processi. Questo può essere molto utile per identificare processi vulnerabili eseguiti frequentemente o quando vengono soddisfatti determinati requisiti.
Alcuni servizi di un server salvano credenziali in chiaro all'interno della memoria. Normalmente avrai bisogno di privilegi di root per leggere la memoria dei processi che appartengono ad altri utenti, quindi questo è di solito più utile quando sei già root e vuoi scoprire ulteriori credenziali. Tuttavia, ricorda che come utente normale puoi leggere la memoria dei processi di tua proprietà.
Nota che al giorno d'oggi la maggior parte delle macchine non consente ptrace per impostazione predefinita, il che significa che non puoi eseguire il dump di altri processi che appartengono al tuo 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 debuggati, purché abbiano lo stesso uid. Questo è il modo classico di come funzionava il ptracing.
kernel.yama.ptrace_scope = 1: solo un processo padre può essere debuggato.
kernel.yama.ptrace_scope = 2: Solo l'amministratore può utilizzare ptrace, poiché richiede la capacità CAP_SYS_PTRACE.
kernel.yama.ptrace_scope = 3: Nessun processo può essere tracciato con ptrace. Una volta impostato, è necessario riavviare per abilitare nuovamente il tracciamento.
Se hai accesso alla memoria di un servizio FTP (ad esempio) potresti ottenere l'Heap e cercare al suo interno le credenziali.
Per un dato ID di processo, maps mostra come la memoria è mappata all'interno dello spazio degli indirizzi virtuali di quel processo; mostra anche le autorizzazioni di ciascuna regione mappata. Il file pseudo mem espone la memoria dei processi stessi. Dal file maps sappiamo quali regioni di memoria sono leggibili e i loro offset. Utilizziamo queste informazioni per cercare nel file mem e scaricare tutte le regioni leggibili in un file.
/dev/mem
fornisce accesso alla memoria fisica del sistema, non alla memoria virtuale. Lo spazio degli indirizzi virtuali del kernel può essere accessibile utilizzando /dev/kmem.
Tipicamente, /dev/mem
è leggibile solo da root e dal gruppo kmem.
ProcDump è una rielaborazione per Linux del classico strumento ProcDump della suite di strumenti Sysinternals per Windows. Puoi trovarlo su https://github.com/Sysinternals/ProcDump-for-Linux
Per scaricare la memoria di un processo potresti utilizzare:
https://github.com/hajzer/bash-memory-dump (root) - _Puoi rimuovere manualmente i requisiti di root e scaricare il processo di tua proprietà
Script A.5 da https://www.delaat.net/rp/2016-2017/p97/report.pdf (è richiesto il root)
Se scopri che il processo dell'autenticatore è in esecuzione:
Puoi eseguire il dump del processo (vedi le sezioni precedenti per trovare diversi modi per eseguire il dump della memoria di un processo) e cercare le credenziali all'interno della memoria:
Lo strumento https://github.com/huntergregal/mimipenguin ruberà le credenziali in testo normale dalla memoria e da alcuni file ben noti. Richiede privilegi di root per funzionare correttamente.
Funzionalità | Nome del 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 di autenticazione di base HTTP attive) | apache2 |
OpenSSH (Sessioni SSH attive - Uso di Sudo) | sshd: |
Verifica se qualche compito pianificato è vulnerabile. Forse puoi approfittare di uno script eseguito da root (vulnerabilità del wildcard? puoi modificare file che root utilizza? utilizzare symlink? creare file specifici nella directory che root utilizza?).
Per esempio, all'interno di /etc/crontab è possibile trovare il PATH: PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
(Nota come l'utente "user" ha privilegi di scrittura su /home/user)
Se all'interno di questa crontab l'utente root cerca di eseguire un comando o script senza impostare il percorso. Per esempio: * * * * root overwrite.sh Quindi, è possibile ottenere una shell di root utilizzando:
Se uno script viene eseguito da root e contiene un "*" all'interno di un comando, potresti sfruttarlo per fare cose inaspettate (come l'escalation dei privilegi). Esempio:
Se il carattere jolly è preceduto da un percorso come /some/path/* , non è vulnerabile (anche ./* non lo è).
Leggi la seguente pagina per ulteriori trucchi di sfruttamento dei caratteri jolly:
Wildcards Spare tricksSe puoi modificare uno script Cron eseguito da root, puoi ottenere una shell molto facilmente:
Se lo script eseguito da root utilizza una directory a cui hai pieno accesso, potrebbe essere utile eliminare quella cartella e creare un collegamento simbolico a un'altra cartella che serva uno script controllato da te.
Puoi monitorare i processi per cercare quelli che vengono eseguiti ogni 1, 2 o 5 minuti. Forse puoi approfittarne e ottenere privilegi elevati.
Ad esempio, per monitorare ogni 0,1s per 1 minuto, ordinare per comandi meno eseguiti ed eliminare i comandi che sono stati eseguiti di più, puoi fare:
È possibile utilizzare anche pspy (questo monitorerà e elencherà ogni processo che viene avviato).
È possibile creare un cron job inserendo un ritorno a capo dopo un commento (senza carattere di nuova riga), e il cron job funzionerà. Esempio (nota il carattere di ritorno a capo):
Verifica se puoi scrivere un qualsiasi file .service
, se puoi, potresti modificarlo in modo che esegua il tuo backdoor quando il servizio viene avviato, riavviato o arrestato (potresti dover aspettare il riavvio della macchina).
Per esempio, crea il tuo backdoor all'interno del file .service con ExecStart=/tmp/script.sh
Tieni presente che se hai permessi di scrittura sui binari eseguiti dai servizi, puoi cambiarli con backdoor in modo che quando i servizi vengono ri-eseguiti, i backdoor verranno eseguiti.
Puoi vedere il PATH utilizzato da systemd con:
Se trovi che puoi scrivere in una qualsiasi delle cartelle del percorso, potresti essere in grado di escalare i privilegi. Devi cercare percorsi relativi utilizzati nei file di configurazione dei servizi come:
Quindi, crea un eseguibile con lo stesso nome del percorso relativo al binario all'interno della cartella PATH di systemd in cui puoi scrivere e, quando al servizio viene chiesto di eseguire l'azione vulnerabile (Start, Stop, Reload), il tuo backdoor verrà eseguito (di solito gli utenti non privilegiati non possono avviare/arrestare servizi, ma controlla se puoi usare sudo -l
).
Per saperne di più sui servizi, utilizza man systemd.service
.
I Timer sono file di unità di systemd il cui nome termina con **.timer**
che controllano i file o gli eventi **.service**
. I Timer possono essere utilizzati come alternativa a cron poiché hanno il supporto integrato per eventi temporali del calendario e eventi temporali monotoni e possono essere eseguiti in modo asincrono.
Puoi elencare tutti i timer con:
Se puoi modificare un timer, puoi farlo eseguire a degli esistenti di systemd.unit (come un .service
o un .target
)
Nella documentazione è possibile leggere cosa sia l'Unità:
L'unità da attivare quando scade questo timer. L'argomento è un nome di unità, il cui suffisso non è ".timer". Se non specificato, questo valore predefinito è un servizio che ha lo stesso nome dell'unità timer, tranne che per il suffisso. (Vedi sopra.) Si consiglia che il nome dell'unità attivata e il nome dell'unità timer siano identici, tranne che per il suffisso.
Pertanto, per sfruttare questa autorizzazione, dovresti:
Trovare qualche unità systemd (come un .service
) che stia eseguendo un binario scrivibile
Trovare qualche unità systemd che stia eseguendo un percorso relativo e avere privilegi di scrittura sul percorso di systemd (per impersonare quell'eseguibile)
Per saperne di più sui timer, consulta man systemd.timer
.
Per abilitare un timer è necessario disporre di privilegi di root ed eseguire:
Nota che il timer viene attivato creando un symlink su /etc/systemd/system/<WantedBy_section>.wants/<name>.timer
I Socket a dominio Unix (UDS) consentono la comunicazione tra processi su macchine diverse o sulla stessa all'interno di modelli client-server. Utilizzano file di descrittore Unix standard per la comunicazione tra computer e vengono configurati tramite file .socket
.
I Socket possono essere configurati utilizzando file .socket
.
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 diverse ma un riepilogo viene utilizzato per indicare dove verrà in ascolto il socket (il percorso del file socket AF_UNIX, l'indirizzo IPv4/6 e/o il numero di porta su cui ascoltare, ecc.)
Accept
: Accetta un argomento booleano. Se è true, viene generata un'istanza di servizio per ogni connessione in ingresso e viene passato solo il socket di connessione ad essa. Se è false, tutti i socket in ascolto vengono passati all'unità di servizio avviata, e viene generata solo un'unità di servizio per tutte le connessioni. Questo valore viene ignorato per i socket datagram e FIFO in cui un'unica unità di servizio gestisce incondizionatamente tutto il traffico in ingresso. Il valore predefinito è false. Per motivi di prestazioni, si consiglia di scrivere nuovi daemon solo in modo che sia adatto per Accept=no
.
ExecStartPre
, ExecStartPost
: Prende una o più righe di comando, che vengono eseguite prima o dopo che i socket/FIFO in ascolto vengono creati e vincolati, rispettivamente. Il primo token della riga di comando deve essere un nome di file assoluto, seguito dagli argomenti per il processo.
ExecStopPre
, ExecStopPost
: Comandi aggiuntivi che vengono eseguiti prima o dopo che i socket/FIFO in ascolto vengono chiusi e rimossi, rispettivamente.
Service
: Specifica il nome dell'unità servizio da attivare sul traffico in ingresso. Questa impostazione è consentita solo per i socket con Accept=no. Di default corrisponde al servizio che ha lo stesso nome del socket (con il suffisso sostituito). Nella maggior parte dei casi, non dovrebbe essere necessario utilizzare questa opzione.
Se trovi un file .socket
scrivibile, puoi aggiungere all'inizio della sezione [Socket]
qualcosa del tipo: ExecStartPre=/home/kali/sys/backdoor
e il backdoor verrà eseguito prima che il socket venga creato. Pertanto, dovrai probabilmente aspettare il riavvio della macchina.
Nota che il sistema deve utilizzare quella configurazione del file socket o il backdoor non verrà eseguito
Se identifichi un socket scrivibile (ora stiamo parlando di Socket Unix e non dei file di configurazione .socket
), allora puoi comunicare con quel socket e forse sfruttare una vulnerabilità.
Esempio di sfruttamento:
Socket Command InjectionNota che potrebbero esserci alcuni sockets in ascolto per le richieste HTTP (Non sto parlando dei file .socket ma dei file che agiscono come socket Unix). Puoi verificarlo con:
Se il socket risponde con una richiesta HTTP, allora puoi comunicare con esso e forse sfruttare qualche vulnerabilità.
Il socket Docker, spesso trovato in /var/run/docker.sock
, è un file critico che dovrebbe essere protetto. Per impostazione predefinita, è scrivibile dall'utente root
e dai membri del gruppo docker
. Possedere l'accesso in scrittura a questo socket può portare all'escalation dei privilegi. Ecco una panoramica di come ciò può essere fatto e metodi alternativi se il Docker CLI non è disponibile.
Se hai l'accesso in scrittura al socket Docker, puoi escalare i privilegi utilizzando i seguenti comandi:
Questi comandi ti consentono di eseguire un container con accesso di livello root al file system dell'host.
Nei casi in cui non sia disponibile la CLI Docker, il socket Docker può comunque essere manipolato utilizzando l'API Docker e i comandi curl
.
Elenco delle immagini Docker: Recupera l'elenco delle immagini disponibili.
Creare un Container: Invia una richiesta per creare un container che monta la directory radice del sistema host.
Avvia il container appena creato:
Collegarsi al Container: Utilizza socat
per stabilire una connessione al container, abilitando l'esecuzione di comandi al suo interno.
Dopo aver configurato la connessione socat
, puoi eseguire comandi direttamente nel container con accesso di livello root al file system dell'host.
Nota che se hai i permessi di scrittura sul socket Docker perché sei all'interno del gruppo docker
hai più modi per ottenere privilegi elevati. Se il docker API è in ascolto su una porta potresti anche riuscire a comprometterlo.
Controlla altri modi per uscire da Docker o abusarne per ottenere privilegi elevati in:
Docker SecuritySe scopri di poter utilizzare il comando ctr
leggi la seguente pagina poiché potresti essere in grado di abusarne per ottenere privilegi elevati:
Se scopri di poter utilizzare il comando runc
leggi la seguente pagina poiché potresti essere in grado di abusarne per ottenere privilegi elevati:
D-Bus è un sofisticato sistema di comunicazione inter-processi (IPC) che consente alle applicazioni di interagire ed scambiare dati in modo efficiente. Progettato con il sistema Linux moderno in mente, offre un robusto framework per diversi tipi di comunicazione tra applicazioni.
Il sistema è versatile, supporta IPC di base che migliora lo scambio di dati tra processi, ricordando le socket di dominio UNIX avanzate. Inoltre, aiuta nella trasmissione di eventi o segnali, favorisce l'integrazione tra i componenti di sistema. Ad esempio, un segnale da un demone Bluetooth su una chiamata in arrivo può far sì che un lettore musicale si metta in pausa, migliorando l'esperienza dell'utente. Inoltre, D-Bus supporta un sistema di oggetti remoti, semplificando le richieste di servizio e le invocazioni di metodo tra applicazioni, razionalizzando processi tradizionalmente complessi.
D-Bus opera su un modello consenti/nega, gestendo le autorizzazioni dei messaggi (chiamate di metodo, emissioni di segnali, ecc.) in base all'effetto cumulativo delle regole di politica corrispondenti. Queste politiche specificano le interazioni con il bus, consentendo potenzialmente l'escalation dei privilegi attraverso lo sfruttamento di tali autorizzazioni.
Viene fornito un esempio di tale politica in /etc/dbus-1/system.d/wpa_supplicant.conf
, che dettaglia le autorizzazioni per l'utente root di possedere, inviare e ricevere messaggi da fi.w1.wpa_supplicant1
.
Le politiche senza un utente o gruppo specificato si applicano universalmente, mentre le politiche di contesto "default" si applicano a tutti non coperti da altre politiche specifiche.
Impara come enumerare e sfruttare una comunicazione D-Bus qui:
D-Bus Enumeration & Command Injection Privilege EscalationÈ sempre interessante enumerare la rete e capire la posizione della macchina.
Verifica sempre i servizi di rete in esecuzione sulla macchina con cui non sei stato in grado di interagire prima di accedervi:
Controlla se puoi fare sniffing del traffico. Se riesci, potresti essere in grado di acquisire alcune credenziali.
Controlla chi sei, quali privilegi hai, quali utenti sono nei sistemi, chi può effettuare il login e chi ha i privilegi di root:
Alcune versioni di Linux sono state colpite da un bug che consente agli utenti con UID > INT_MAX di ottenere privilegi elevati. Ulteriori informazioni: qui, qui e qui.
Sfruttalo utilizzando: systemd-run -t /bin/bash
Verifica se sei un membro di qualche gruppo che potrebbe garantirti privilegi di root:
Interesting Groups - Linux PrivescVerifica se all'interno degli appunti è presente qualcosa di interessante (se possibile)
Se conosci una password dell'ambiente, prova a effettuare il login come ogni utente utilizzando la password.
Se non ti dispiace fare molto rumore e i binari su
e timeout
sono presenti sul computer, puoi provare a forzare l'utente utilizzando su-bruteforce.
Linpeas con il parametro -a
prova anche a forzare gli utenti.
Se scopri che puoi scrivere all'interno di una cartella del $PATH, potresti essere in grado di ottenere privilegi elevati creando un backdoor all'interno della cartella scrivibile con il nome di un comando che verrà eseguito da un utente diverso (idealemente root) e che non è caricato da una cartella situata precedentemente alla tua cartella scrivibile in $PATH.
Potresti essere autorizzato a eseguire alcuni comandi utilizzando sudo o potrebbero avere il bit suid. Verificalo utilizzando:
Alcuni comandi inaspettati ti permettono di leggere e/o scrivere file o addirittura eseguire un comando. Per esempio:
La configurazione di Sudo potrebbe consentire a un utente di eseguire alcuni comandi con i privilegi di un altro utente senza conoscere la password.
In questo esempio l'utente demo
può eseguire vim
come root
, ora è banale ottenere una shell aggiungendo una chiave ssh nella directory root o chiamando sh
.
Questa direttiva permette all'utente di impostare una variabile di ambiente durante l'esecuzione di qualcosa:
Questo esempio, basato sulla macchina HTB Admirer, era vulnerabile al PYTHONPATH hijacking per caricare una libreria python arbitraria durante l'esecuzione dello script come root:
Salta per leggere altri file o utilizza symlink. Ad esempio nel file sudoers: hacker10 ALL= (root) /bin/less /var/log/*
Se viene utilizzato un jolly (*), è ancora più facile:
Contromisure: https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/
Se il permesso sudo è dato a un singolo comando senza specificare il percorso: hacker10 ALL= (root) less è possibile sfruttarlo modificando la variabile PATH
Questo metodo può essere utilizzato anche se un binario suid esegue un altro comando senza specificarne il percorso (controlla sempre con strings il contenuto di un binario SUID strano).
Esempi di payload da eseguire.
Se il binario suid esegue un altro comando specificando il percorso, allora puoi provare a esportare una funzione con lo stesso nome del comando che il file suid sta chiamando.
Ad esempio, se un binario suid chiama /usr/sbin/service apache2 start devi provare a creare la funzione e esportarla:
La variabile d'ambiente LD_PRELOAD viene utilizzata 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 caricamento preventivo di una libreria.
Tuttavia, per mantenere la sicurezza del sistema e impedire che questa funzionalità venga sfruttata, in particolare con eseguibili suid/sgid, il sistema impone determinate 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 caricare solo le librerie nei percorsi standard che sono anche suid/sgid.
L'escalation dei privilegi può verificarsi se hai la possibilità di eseguire comandi con sudo
e l'output di sudo -l
include l'affermazione env_keep+=LD_PRELOAD. Questa configurazione consente alla variabile d'ambiente LD_PRELOAD di persistere e essere riconosciuta anche quando i comandi vengono eseguiti con sudo
, potenzialmente portando all'esecuzione di codice arbitrario con privilegi elevati.
Salva come /tmp/pe.c
Quindi compilarlo usando:
Infine, aumentare i privilegi eseguendo
Un privesc simile può essere sfruttato se l'attaccante controlla la variabile di ambiente LD_LIBRARY_PATH poiché controlla il percorso in cui verranno cercate le librerie.
Quando si incontra un binario con permessi SUID che sembra insolito, è una buona pratica verificare se sta caricando correttamente i file .so. Questo può essere verificato eseguendo il seguente comando:
Per esempio, incontrare un errore come "open(“/percorso/a/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (File o directory non esistente)" suggerisce un potenziale per l'exploit.
Per sfruttarlo, si procederebbe creando un file C, diciamo "/percorso/a/.config/libcalc.c", contenente il seguente codice:
Questo codice, una volta compilato ed eseguito, mira ad elevare i privilegi manipolando i permessi dei file ed eseguendo una shell con privilegi elevati.
Compila il file C sopra in un file oggetto condiviso (.so) con:
Infine, eseguire il binario SUID interessato dovrebbe attivare l'exploit, consentendo un potenziale compromesso del sistema.
Ora che abbiamo trovato un binario SUID che carica una libreria da una cartella in cui possiamo scrivere, creiamo la libreria in quella cartella con il nome necessario:
Se ricevi un errore come
Questo significa che la libreria che hai generato deve avere una funzione chiamata a_function_name
.
GTFOBins è una lista curata di binari Unix che possono essere sfruttati da un attaccante per eludere le restrizioni di sicurezza locali. GTFOArgs è la stessa cosa ma per i casi in cui è possibile iniettare solo argomenti in un comando.
Il progetto raccoglie funzioni legittime dei binari Unix che possono essere abusate per eludere le shell restrittive, escalare o mantenere privilegi elevati, trasferire file, generare shell bind e reverse, e facilitare altre attività di post-sfruttamento.
gdb -nx -ex '!sh' -ex quit sudo mysql -e '! /bin/sh' strace -o /dev/null /bin/sh sudo awk 'BEGIN {system("/bin/sh")}'
Se puoi accedere a sudo -l
, puoi utilizzare lo strumento FallOfSudo per verificare se trova come sfruttare una regola sudo.
Nei casi in cui hai accesso sudo ma non la password, puoi escalare i privilegi attendendo l'esecuzione di un comando sudo e quindi dirottando il token di sessione.
Requisiti per l'escalation dei privilegi:
Hai già una shell come utente "sampleuser"
"sampleuser" ha usato sudo
per eseguire qualcosa negli ultimi 15 minuti (di default è la durata del token sudo che ci consente di utilizzare sudo
senza inserire alcuna password)
cat /proc/sys/kernel/yama/ptrace_scope
è 0
gdb
è accessibile (puoi caricarlo)
(Puoi abilitare temporaneamente ptrace_scope
con echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
o modificare permanentemente /etc/sysctl.d/10-ptrace.conf
e impostare kernel.yama.ptrace_scope = 0
)
Se tutti questi requisiti sono soddisfatti, puoi escalare i privilegi usando: https://github.com/nongiach/sudo_inject
Il primo exploit (exploit.sh
) creerà il binario activate_sudo_token
in /tmp. Puoi usarlo per attivare il token sudo nella tua sessione (non otterrai automaticamente una shell root, esegui sudo su
):
Il secondo exploit (exploit_v2.sh
) creerà una shell sh in /tmp posseduta da root con setuid
Il terzo exploit (exploit_v3.sh
) creerà un file sudoers che rende eterni i token sudo e consente a tutti gli utenti di utilizzare sudo
Se hai permessi di scrittura nella cartella o su uno dei file creati all'interno della cartella, puoi utilizzare il binario write_sudo_token per creare un token sudo per un utente e PID. Ad esempio, se puoi sovrascrivere il file /var/run/sudo/ts/sampleuser e hai una shell come quell'utente con PID 1234, puoi ottenere privilegi sudo senza dover conoscere la password facendo:
Il file /etc/sudoers
e i file all'interno di /etc/sudoers.d
configurano chi può utilizzare sudo
e come. Questi file per impostazione predefinita possono essere letti solo dall'utente root e dal gruppo root.
Se riesci a leggere questo file potresti essere in grado di ottenere alcune informazioni interessanti, e se riesci a scrivere su qualsiasi file sarai in grado di elevare i privilegi.
Se sei in grado di scrivere, puoi abusare di questo permesso
Un altro modo per abusare di questi permessi:
Ci sono alcune alternative al binario sudo
come doas
per OpenBSD, ricordati di controllare la sua configurazione in /etc/doas.conf
Se sai che un utente di solito si connette a una macchina e utilizza sudo
per ottenere privilegi elevati e hai ottenuto una shell all'interno di quel contesto utente, puoi creare un nuovo eseguibile sudo che eseguirà il tuo codice come root e quindi il comando dell'utente. Quindi, modifica il $PATH del contesto utente (ad esempio aggiungendo il nuovo percorso in .bash_profile) in modo che quando l'utente esegue sudo, venga eseguito il tuo eseguibile sudo.
Nota che se l'utente utilizza 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
O eseguendo qualcosa come:
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
Ciò significa che i file di configurazione da /etc/ld.so.conf.d/*.conf
verranno letti. Questi file di configurazione puntano ad altre cartelle dove verranno ricercate le librerie. Ad esempio, il contenuto di /etc/ld.so.conf.d/libc.conf
è /usr/local/lib
. Ciò significa che il sistema cercherà le librerie all'interno di /usr/local/lib
.
Se per qualche motivo un utente ha le autorizzazioni di scrittura su uno dei percorsi indicati: /etc/ld.so.conf
, /etc/ld.so.conf.d/
, su qualsiasi file all'interno di /etc/ld.so.conf.d/
o su qualsiasi cartella all'interno del file di configurazione dentro /etc/ld.so.conf.d/*.conf
, potrebbe essere in grado di elevare i privilegi.
Guarda come sfruttare questa errata configurazione nella pagina seguente:
Copiando la libreria in /var/tmp/flag15/
verrà utilizzata dal programma in questo posto come specificato nella variabile RPATH
.
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
Le capacità di Linux forniscono un sottoinsieme dei privilegi di root disponibili a un processo. Questo suddivide efficacemente i privilegi di root in unità più piccole e distinte. Ciascuna di queste unità può quindi essere concessa autonomamente ai processi. In questo modo, l'insieme completo dei privilegi viene ridotto, diminuendo i rischi di sfruttamento. Leggi la seguente pagina per saperne di più sulle capacità e su come abusarne:
Linux CapabilitiesIn una directory, il bit per "eseguire" implica che l'utente interessato può fare "cd" nella cartella. Il bit "lettura" implica che l'utente può elencare i file, e il bit "scrittura" implica che l'utente può eliminare e creare nuovi file.
Le Liste di Controllo degli Accessi (ACL) rappresentano il livello secondario dei permessi discrezionali, in grado di sovrascrivere i tradizionali permessi ugo/rwx. Questi permessi migliorano il controllo sull'accesso ai file o alle directory permettendo o negando diritti a utenti specifici che non sono proprietari o fanno parte del gruppo. Questo livello di granularità garantisce una gestione degli accessi più precisa. Ulteriori dettagli possono essere trovati qui.
Concedi all'utente "kali" permessi di lettura e scrittura su un file:
Ottenere file con ACL specifiche dal sistema:
In vecchie versioni potresti dirottare una sessione shell di un utente diverso (root). Nelle versioni più recenti sarai in grado di connetterti solo alle sessioni di screen del tuo utente. Tuttavia, potresti trovare informazioni interessanti all'interno della sessione.
Elenco delle sessioni di screen
Allegare a una sessione
Questo era un problema con le vecchie versioni di tmux. Non sono riuscito a dirottare una sessione tmux (v2.1) creata da root come utente non privilegiato.
Elenco delle sessioni tmux
Allegare a una sessione
Controlla Valentine box da HTB per un esempio.
Tutte le chiavi SSL e SSH generate su sistemi basati su Debian (Ubuntu, Kubuntu, ecc) tra settembre 2006 e il 13 maggio 2008 potrebbero essere interessate da questo bug. Questo bug si verifica durante la creazione di una nuova chiave ssh in quei sistemi operativi, poiché erano possibili solo 32.768 variazioni. Ciò significa che tutte le possibilità possono essere calcolate e avendo la chiave pubblica ssh è possibile cercare la corrispondente chiave privata. È possibile trovare le possibilità calcolate qui: https://github.com/g0tmi1k/debian-ssh
PasswordAuthentication: Specifica se l'autenticazione tramite password è consentita. Il valore predefinito è no
.
PubkeyAuthentication: Specifica se l'autenticazione tramite chiave pubblica è consentita. Il valore predefinito è yes
.
PermitEmptyPasswords: Quando l'autenticazione tramite password è consentita, specifica se il server consente l'accesso agli account con stringhe di password vuote. Il valore predefinito è no
.
Specifica se l'utente root può effettuare l'accesso tramite ssh, il valore predefinito è no
. Possibili valori:
yes
: root può accedere utilizzando password e chiave privata
without-password
o prohibit-password
: root può accedere solo con una chiave privata
forced-commands-only
: Root può accedere solo utilizzando la chiave privata e se le opzioni dei comandi sono specificate
no
: no
Specifica i file che contengono le chiavi pubbliche che possono essere utilizzate per l'autenticazione dell'utente. Può contenere token come %h
, che verranno sostituiti dalla directory home. È possibile indicare percorsi assoluti (che iniziano con /
) o percorsi relativi dalla home dell'utente. Ad esempio:
Quella configurazione indicherà che se provi a effettuare il login con la chiave privata dell'utente "testusername", ssh confronta la chiave pubblica della tua chiave con quelle situate in /home/testusername/.ssh/authorized_keys
e /home/testusername/access
L'inoltro dell'agente SSH ti consente di utilizzare le tue chiavi SSH locali invece di lasciare le chiavi (senza frasi segrete!) sul tuo server. In questo modo, sarai in grado di saltare tramite ssh su un host e da lì saltare su un altro host utilizzando la chiave situata nel tuo host iniziale.
È necessario impostare questa opzione in $HOME/.ssh.config
in questo modo:
Nota che se Host
è *
ogni volta che l'utente passa a una macchina diversa, quella macchina sarà in grado di accedere alle chiavi (che è 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 l'inoltro dell'agente ssh con la parola chiave AllowAgentForwarding
(per impostazione predefinita è consentito).
Se trovi che l'Inoltro dell'Agente è configurato in un ambiente, leggi la seguente pagina poiché potresti essere in grado di sfruttarlo per ottenere privilegi elevati:
SSH Forward Agent exploitationIl file /etc/profile
e i file in /etc/profile.d/
sono script che vengono eseguiti quando un utente avvia una nuova shell. Pertanto, se puoi scrivere o modificare uno qualsiasi di essi, puoi ottenere privilegi elevati.
Se viene trovato uno script di profilo strano, dovresti controllarlo per dettagli sensibili.
A seconda del sistema operativo, i file /etc/passwd
e /etc/shadow
potrebbero avere un nome diverso o potrebbe esserci un backup. Pertanto, è consigliato trovarli tutti e verificare se è possibile leggerli per vedere se contengono hash all'interno dei file:
In alcune occasioni è possibile trovare hash delle password all'interno del file /etc/passwd
(o equivalente)
Prima di tutto, genera una password con uno dei seguenti comandi.
Quindi aggiungi l'utente hacker
e inserisci la password generata.
Ad esempio: hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash
Ora puoi utilizzare il comando su
con hacker:hacker
In alternativa, puoi utilizzare le seguenti righe per aggiungere un utente fittizio senza password. ATTENZIONE: potresti compromettere la sicurezza attuale della macchina.
NOTA: Nei sistemi 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. Ad esempio, puoi scrivere in alcuni file di configurazione del servizio?
Per esempio, se la macchina sta eseguendo un server tomcat e puoi modificare il file di configurazione del servizio Tomcat all'interno di /etc/systemd/, allora puoi modificare le righe:
Il tuo backdoor verrà eseguito la prossima volta che tomcat viene avviato.
Le seguenti cartelle potrebbero contenere backup o informazioni interessanti: /tmp, /var/tmp, /var/backups, /var/mail, /var/spool/mail, /etc/exports, /root (Probabilmente non sarai in grado di leggere l'ultima, ma prova)
Leggi il codice di linPEAS, cerca diversi possibili file che potrebbero contenere password. Un altro strumento interessante che puoi utilizzare a questo scopo è: LaZagne che è un'applicazione open source utilizzata per recuperare molte password memorizzate su un computer locale per Windows, Linux e Mac.
Se riesci a leggere i registri, potresti trovare informazioni interessanti/confidenziali al loro interno. Più strano è il registro, più interessante sarà (probabilmente). Inoltre, alcuni registri di audit "cattivi" configurati (con backdoor?) potrebbero permetterti di registrare password all'interno dei registri di audit come spiegato in questo post: https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/.
Per poter leggere i log del gruppo adm sarà davvero utile.
Dovresti anche controllare i file che contengono la parola "password" nel nome o all'interno del contenuto, e controllare anche gli IP e le email nei log, o gli hash tramite espressioni regolari. Non elencherò qui come fare tutto questo, ma se sei interessato puoi controllare gli ultimi controlli che linpeas esegue.
Se sai da dove uno script python verrà eseguito e puoi scrivere all'interno di quella cartella o modificare le librerie python, puoi modificare la libreria OS e inserire un backdoor (se puoi scrivere dove lo script python verrà eseguito, copia e incolla la libreria os.py).
Per inserire un backdoor nella libreria, aggiungi alla fine della libreria os.py la seguente riga (cambia IP e PORT):
Una vulnerabilità in logrotate
consente agli utenti con permessi di scrittura su un file di registro o sulle directory genitori di potenzialmente ottenere privilegi elevati. Questo perché logrotate
, spesso in esecuzione come root, può essere manipolato per eseguire file arbitrari, specialmente in directory come /etc/bash_completion.d/. È importante controllare i permessi non solo in /var/log ma anche in qualsiasi directory in cui viene applicata la rotazione dei log.
Questa vulnerabilità riguarda la versione 3.18.0
e precedenti di logrotate
Ulteriori informazioni dettagliate sulla vulnerabilità possono essere trovate su questa pagina: https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition.
È possibile sfruttare questa vulnerabilità con logrotten.
Questa vulnerabilità è molto simile a CVE-2016-1247 (registri di nginx), quindi ogni volta che scopri di poter modificare i log, controlla chi gestisce quei log e verifica se puoi ottenere privilegi sostituendo i log con symlink.
Riferimento alla vulnerabilità: https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f
Se, per qualsiasi motivo, un utente è in grado di scrivere uno script ifcf-<qualunque>
in /etc/sysconfig/network-scripts o può modificare uno già esistente, allora il sistema è compromesso.
Gli script di rete, ad esempio ifcg-eth0, sono utilizzati per le connessioni di rete. Assomigliano esattamente ai file .INI. Tuttavia, vengono ~sourced~ su Linux da Network Manager (dispatcher.d).
Nel mio caso, l'attributo NAME=
in questi script di rete non è gestito correttamente. Se hai spazi bianchi nel nome, il sistema cerca di eseguire la parte dopo lo spazio bianco. Questo significa che tutto ciò che segue il primo spazio bianco viene eseguito come root.
Ad esempio: /etc/sysconfig/network-scripts/ifcfg-1337
La directory /etc/init.d
è la sede degli script per System V init (SysVinit), il sistema classico di gestione dei servizi Linux. Include script per avviare
, fermare
, riavviare
e talvolta ricaricare
i servizi. Questi possono essere eseguiti direttamente o tramite collegamenti simbolici trovati in /etc/rc?.d/
. Un percorso alternativo nei sistemi Redhat è /etc/rc.d/init.d
.
D'altra parte, /etc/init
è associato a Upstart, un sistema di gestione dei servizi più recente introdotto da Ubuntu, che utilizza file di configurazione per compiti di gestione dei servizi. Nonostante il passaggio a Upstart, gli script SysVinit sono ancora utilizzati insieme alle configurazioni di Upstart grazie a uno strato di compatibilità in Upstart.
systemd emerge come un moderno inizializzatore e gestore dei servizi, offrendo funzionalità avanzate come l'avvio su richiesta dei daemon, la gestione dell'automount e gli snapshot dello stato di sistema. Organizza i file in /usr/lib/systemd/
per i pacchetti di distribuzione e in /etc/systemd/system/
per le modifiche degli amministratori, semplificando il processo di amministrazione di sistema.