View
https://dreamhack.io/wargame/challenges/40
Python pickle 모듈의 Deserialize 취약점을 이용해 FLAG를 획득하는 문제이다.
Python pickle Deserialize 취약점
Deserialize, 역직렬화
- 직렬화된 데이터를 원래의 Object 또는 Data 상태, 타입으로 되돌리는 것 (unpickling)
- 텍스트 파일을 오브젝트로 변환하는 것
Serialization, 직렬화
- Object 또는 Data의 상태, 타입을 특정 형태의 포맷을 가진 데이터로 변환하는 것 (pickling)
- 추상적인 object(객체)를 물리적으로 전송 및 저장하기위해 단순하고 연속적인 텍스트 파일로 변환하는 과정
직렬화 하는 이유: Object는 메모리에 저장되고 string과 byte 등의 데이터는 드라이브 및 통신선에 저장되어 직렬화 과정이 있어야 물리적으로 전송, 저장할 수 있기 때문
ex) 1번 PC Object를 운영체제, 프로그래밍 언어가 다른 2번 PC로 전송하기 위해서는 메모리에 저장된 추상적 Object를 직렬화하여 2진수 바이트 데이터로 바꾸고 물리적인 회선으로 전송해주고 2번 PC에서는 역직렬화로 실제 존재하는 Object로 받음
Pickle 모듈 (직렬화, 역직렬화 모듈)
- 텍스트 이외의 자료형들을 파일로 저장하기 위해서 사용되는 파이썬 모듈
https://docs.python.org/ko/3/library/pickle.html
Pickle 모듈 설명에서 안전하지 않으므로 신뢰할 수 있는 데이터만 unpickle 하라고 경고 문구가 있다.
pickle 모듈 함수
- pickle.dump : 객체 object의 pickle된 표현을 열린 파일 객체 file에 쓴다.
- pickle.dumps : 객체 object의 pickle된 표현을 file에 쓰는 대신 bytes 객체로 리턴
- pickle.load : 열린 파일 객체 file에서 객체의 pickle된 표현을 읽고 그 안에 지정된 객체 계층 구조를 재구성하여 리턴
- pickle.loads: 객체의 pickle 된 표현 data의 재구성된 객체 계층 구조를 리턴
Pickle 모듈 취약점
- __reduce__ 메소드에서 발생하는 취약점
- reduce 메소드는 Python 객체를 unpickling 할 때 객체를 재구성하는 것에 대한 tuple을 반환해주는 메소드 (어떻게 재구성할지 에대한 tuple을 반환하는 메소드, 그 tuple에 함수 또한 리턴하고 그 함수를 콜을 하게 됨)
- reduce 메소드에서 반환되는 tuple 구성
1. 호출 가능한 객체 (호출할 클래스의 이름)
2. 호출 가능한 객체에 대한 인자 (호출 가능한 객체가 인자를 받아들이지 않으면 빈 tuple을 제공해야 한다.)
- reudce 메소드를 이용하면 내부적으로 스택에서 호출 가능한 객체가 있으면 인수와 함께 가져와서 실행
- 이 때 객체에 대한 검증 없이 실행을 해주기 때문에 취약점이 발생 (악의적인 공격자가 원하는 명령어 실행하면 문제 발생)
문제를 받으면 app.py 파일을 확인할 수 있다.
app.py
- 문제에서 FLAG는 FLAG 변수 또는 flag.txt 파일에 있다고 주어진다.
- create session 페이지에서 name, userid, password에 입력한 값을 pickle dumps 후 (직렬화) base64로 암호화하여 값으로 준다.
- base64로 암호화된 값을 넣으면 복호화 후 역직렬화하여 출력
app.py를 봤을 때 name, userid, password 로 이루어진 딕셔너리를 base64로 암호화 한 후 pickle dumps를 해 session 값을 만들어 준다.
Pickle 모듈 취약점을 이용해 FLAG 변수 값을 password의 값으로 하는 코드를 짜서 문제를 풀었다.
해당 코드를 실행하면 base64로 된 값을 얻을 수 있고 이 값을 check session 페이지에 넣으면 password에 FLAG 값이 출력된 것을 확인할 수 있다.
'Security > Web' 카테고리의 다른 글
[Dreamhack] Flying Chars 문제 풀이 (0) | 2023.09.14 |
---|---|
[Dreamhack] session 문제 풀이 (0) | 2023.09.08 |
[Dreamhack] session-basic 문제 풀이 (0) | 2023.09.06 |
[Dreamhack] cookie 문제 풀이 (0) | 2023.09.05 |
[Dreamhack] devtools-sources 문제 풀이 (0) | 2023.09.05 |