## Samsung CTF_2017(Readflag, Attack)
[Summary]
1. Python Pickle 취약점을 이용
2. __reduce__ method의 return으로 지정되는 함수 (RCE가능)
[Analysis]
Readflag문제는 이전에 Plaid CTF에서도 나왔던 문제였던 Python의 Pickle 취약점을 이용하는 문제였다.
Pickle이라는 것은 파이썬에서 사용하는 각 객체나 변수, 리스트 등을 파일에다가 쓸 수도 있는 유용한 모듈인데
class를 dump한 후 load를 할 때 해당 클래스의 __reduce__ method의 return으로 지정되는 함수를 실행하는
임의 코드 실행 취약점이 발생한다.
이 취약점을 이용하려면 아래 exploit 코드와 같이 클래스를 하나 만들고 내부에 __reduce__ 함수를 만들고
return으로 원하는 메서드와 인자를 구성한 후 서버로 보내면 끝이다.
실제로 아래 exploit 코드를 보내면 실제로 서버에 있는 "test.py"를 open()하여 read()를 하고 출력해주게
되는데(eval함수를 이용해서) 처음에는 flag를 읽어보려 했으나 flag파일이 있는지도 모르고 파일이름을
몰라서 문제를 풀던 중 아래 [그림 1]와 같이 뜨는 에러 문구 중 서버의 test.py라는 파일이 서버 프로그램으로
돌고 있다는 것을 파악하였고, 그 파일을 읽어보았다. 그리고 그 파일 내부에 아래 [그림 2]과 같이 플래그가 있었다.
[그림 1] "test.py" 존재 유무 확인
[Exploit Code] - readflag_exploit.py
1 2 3 4 5 6 7 8 9 10 11 12 | from pickle import * import __builtin__ import pprint import os import commands class exploit(object): def __reduce__(self): p = "open('test.py').read()" return (__builtin__.eval,(p,)) print dumps(exploit())+'#' | cs |
[Get Flag~~!!!!]
[그림 2] test.py 파일 내 flag 확인
끝~!
'CTF writeup' 카테고리의 다른 글
[Samsung CTF_2017] Buildingblocks(Coding) (0) | 2017.07.23 |
---|---|
[Samsung CTF_2017] dfa(Defense) (0) | 2017.07.23 |
[Secuinside CTF_2017] snake(reversing) (0) | 2017.07.22 |
[Secuinside CTF_2017] TrippleRotate(reversing) (0) | 2017.07.22 |
[Secuinside CTF_2017] babyheap(pwn) (0) | 2017.07.20 |