Ultima modifica:
SUID, EID & ID
Il bit SUID (Set User ID) permette di eseguire un file con l'ID dell'owner, viene impostato tramite
Un esempio e' il file
Esso permette di cambiare la shell dell'utente corrente modificando il file
L'ID utente e' un numero che identifica l'utente all'interno del sistema,
Quindi
Compiliamolo con gcc e runniamolo, l'output mostrera' in entrambi i campi 1000:
Con i permessi standard l'ID e l'EID combaciano, ma attivando il SUID e cambiando l'owner a root:root no, L'ID e' rimasto 1000, ma l'EID (quello che importa a noi ora) e' diventato 0, il processo girera' sotto l'EID, quindi con privilegi di root, ovvero l'owner.
Fate attenzione perche' gli script interpretati (quelli con lo shabang #!) sono esonerati dal SUID per questioni di sicurezza (per approfondire qui), vediamo come si comporta lo stesso programma in Python:
Non cambia niente, l'EID resta uguale all'ID e viceversa.
Torniamo a parlare di
Cattiamo il file
Conclusione
Spero che con questi piccoli esempi il concetto di bit SUID si sia capito, in caso di dubbi o altro lasciate un commento.
Un sistema Unix senza i permessi sarebbe come un mondo senza leggi, chiunque potrebbe fare quello che vuole.
Tuttavia il bit SUID se non viene usato correttamente puo' causare problemi come privilege escalation (che vedremo prossimamente), non ne abusiamo e stiamo attenti ad utilizzarlo. Grazie dell'attenzione.
Preso spunto: The Art Of Exploitation
Il bit SUID (Set User ID) permette di eseguire un file con l'ID dell'owner, viene impostato tramite
chmod
con l'attributo s
:
Bash:
chmod u+s <file>
/bin/chsh
, facciamo ls per capire meglio:
Bash:
-rwsr-xr-x 1 root root 35056 Jul 3 18:48 /bin/chsh
/etc/passwd
, il proprietario di entrambi i file e' root, questo vuol dire che l'utente normale non puo' usare /bin/chsh
e nemmeno modificare manualmente il file /etc/passwd
, in nostro soccorso arriva il bit SUID, grazie a questo il programma chsh
verra' eseguito con i priviliegi di root qualunque sia l'utente che lo esegue, riuscendo cosi' a modificare il file /etc/passwd
.L'ID utente e' un numero che identifica l'utente all'interno del sistema,
memset
ha ID 1000 e root
ha ID 0, quando avvio un programma con memset
questo girera' con ID 1000 (di conseguenza con i permessi di memset
), ma nel momento che avvio un software in cui e' abilitato il SUID questa regola cambia, viene impostato L'EID (Effective UID), che appartiene all'owner e il Real UID, che appartiene all'utente che avvia il programma.Quindi
/bin/chsh
viene eseguito con EID 0 e RUID 1000, per capire meglio guardiamo questo programma in C:
C:
#include <stdio.h>
int main () {
printf("ID: %d\n", getuid()); // Stampa l'ID corrente.
printf("EID: %d\n", geteuid()); // Stampa l'EID corrente.
return 0;
}
Bash:
void suid $ ll suid
-rwxr-xr-x 1 memset memset 20480 Sep 26 19:21 suid
void suid $ ./suid
ID: 1000
EID: 1000
void suid $ sudo chown root:root suid
void suid $ sudo chmod u+s suid
void suid $ ./suid
ID: 1000
EID: 0
void suid $
Fate attenzione perche' gli script interpretati (quelli con lo shabang #!) sono esonerati dal SUID per questioni di sicurezza (per approfondire qui), vediamo come si comporta lo stesso programma in Python:
Bash:
void suid $ ll suid.py
-rwxr-xr-x 1 memset memset 86 Sep 26 19:10 suid.py
void suid $ ./suid.py
ID: 1000
EID: 1000
void suid $ sudo chown root:root suid.py
void suid $ sudo chmod u+s suid.py
void suid $ ll suid.py
-rwsxr-xr-x 1 root root 86 Sep 26 19:10 suid.py
void suid $ ./suid.py
ID: 1000
EID: 1000
void suid $ cat suid.py
#! /bin/python3
import os
print(f"ID: {os.getuid()}")
print(f"EID: {os.geteuid()}")
Torniamo a parlare di
chsh
e proviamo a levare il bit in questione:
Bash:
void ~ $ cat /etc/passwd | grep memset
memset:x:1000:1000::/home/memset:/bin/bash
void ~ $ ls -l /bin/chsh
-rwsr-xr-x 1 root root 35056 Jul 3 18:48 /bin/chsh
void ~ $ chsh
Changing shell for memset.
Password:
New shell [/bin/bash]: /bin/sh
Shell changed.
void ~ $ cat /etc/passwd | grep memset
memset:x:1000:1000::/home/memset:/bin/sh
void ~ $ sudo chmod u-s /bin/chsh
void ~ $ ls -l /bin/chsh
-rwxr-xr-x 1 root root 35056 Jul 3 18:48 /bin/chsh
void ~ $ chsh
Changing shell for memset.
Password:
New shell [/bin/sh]: /bin/bash
chsh: setpwnam failed
Shell *NOT* changed. Try again later.: Permission denied
void ~ $ cat /etc/passwd | grep memset
memset:x:1000:1000::/home/memset:/bin/sh
/etc/passwd
greppando la stringa inerente all'utente memset
, la shell predefinita' e' bash, con ls -l
controlliamo i permessi, il SUID e' attivato quindi procediamo a cambiare shell mettendo sh, cattiamo nuovamente il file passwd per far vedere che la stringa e' cambiata, ora e' presente :/home/memset:/bin/sh invece di :/home/memset:/bin/bash, togliamo il bit SUID con sudo chmod u-s /bin/chsh
e ls
per una "conferma", infine ridiamo chsh
, abbiamo un errore coi permessi! in quanto lo stiamo facendo girare con l'ID di memset
, che non possiede i permessi per modificare in /etc.Conclusione
Spero che con questi piccoli esempi il concetto di bit SUID si sia capito, in caso di dubbi o altro lasciate un commento.
Un sistema Unix senza i permessi sarebbe come un mondo senza leggi, chiunque potrebbe fare quello che vuole.
Tuttavia il bit SUID se non viene usato correttamente puo' causare problemi come privilege escalation (che vedremo prossimamente), non ne abusiamo e stiamo attenti ad utilizzarlo. Grazie dell'attenzione.
Preso spunto: The Art Of Exploitation