Ottenere root con setuid e il flag s

1

Ok, quindi sto cercando di capire cosa fa il flag s in linux.

Ho il seguente codice:

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>

int main(int argc, char **argv, char **envp)
{
  gid_t gid;
  uid_t uid;
  gid = getegid();
  uid = geteuid();

  printf("gid %d\n",gid);
  printf("uid %d\n",uid);

  setresgid(gid, gid, gid);
  setresuid(uid, uid, uid);

  system("id");
}

e il flag s è impostato per l'utente.

-rwsr-xr-x 1 root root 7358 2017-08-24 17:45 a.out

quindi a mio avviso, poiché il flag s è impostato, il gid effettivo e uid dovrebbero essere l'utente.

Tuttavia, quando eseguo questo file come un altro utente, ottengo quanto segue.

nebula@nebula:/tmp$ ./a.out 
gid 1000
uid 1000
uid=1000(nebula) gid=1000(nebula) groups=1000(nebula),4(adm),20(dialout),24(cdrom),46(plugdev),108(lpadmin),109(sambashare),110(admin)

Credo che ciò dimostri che l'uid e il gid efficaci non sono stati impostati come avrei pensato.

Qualsiasi aiuto ?? Grazie!

    
posta MikeSchem 25.08.2017 - 02:51
fonte

2 risposte

1

I filesystem possono essere montati con setuid disabilitato. Normalmente questo viene fatto su dispositivi rimovibili (perché l'amministratore non ha il controllo su cosa contiene il dispositivo rimovibile) e sui filesystem di rete (a meno che il filesystem non sia montato da un server affidabile). È buona pratica farlo per tutti i filesystem che non dovrebbero consentire l'escalation dei privilegi, come un filesystem per i file temporanei.

Controllare il punto di montaggio in cui si trova il file eseguibile setuid:

df /tmp

È probabile che sul tuo computer, /tmp sia un filesystem separato - vedrai /tmp nella colonna "Montato su". Controlla le opzioni di montaggio per /tmp ; su Linux puoi cercarli in /proc/mounts :

grep /tmp /proc/mounts

Se vedi nosuid come una delle opzioni nella quarta colonna, il filesystem è montato con setuid e setgid disabilitato: ls ancora elenca i bit e chmod li cambia ancora, ma non hanno alcun effetto.

Fai i tuoi esperimenti su un altro filesystem. /var/tmp di solito è montato sullo stesso filesystem di / e quello ha bisogno di setuid abilitato per programmi come (/usr)/bin/su e (/usr)/bin/sudo .

I bit setuid / setgid possono anche essere disabilitati tramite un framework di sicurezza come SELinux. Vedi questo thread su ServerFault su come indagare su questo.

    
risposta data 25.08.2017 - 10:25
fonte
0
  1. Sembra esserci un bug secondario nel tuo programma.

Hai il bit s impostato solo per il proprietario, non per il gruppo, ma stai usando il gid quando per tutti i parametri in setresuid e amp; setresgid (righe 17 e 18). [modifica:] Per questo motivo, il gid apparterrà all'utente che esegue il programma, non al proprietario di a.out.

Se cambi i parametri su quelle linee su uid, dovresti ottenere il risultato previsto. Soggetto al n. 2 di seguito.

  1. L'output per il geteuid sembra anomalo. Dovrebbe essere 0. Vorrei indagare se fossi in te. Non riesco a replicarlo però.

Se ti preoccupi solo del motivo per cui setresuid e setresid non funzionano correttamente, imposta su 0 (o qualsiasi numero di uid / gid valido) e guarda cosa succede.

A proposito, dovresti controllare i loro valori di ritorno.

    
risposta data 25.08.2017 - 06:43
fonte

Leggi altre domande sui tag