BoB/write-up

[BoB CTF] misc) 02_bob_secret_note

re.t 2023. 8. 24. 15:47

  AES 128bit를 EBC, CBC 두 개의 운영모드를 사용해서 암호화하고 Base64로 인코딩한 값 (토큰)을 바탕으로 admin에 해당하는 토큰값을 추정하여 로그인해야하는 문제이다.

  처음 서버에 접근할 때에는 PoW 챌린지가 주어지는데, 아래와 같이 코드를 작성해서 해결해주면 된다. 

import json
from base64 import b64encode

def encode_to_base64(data):
    # Convert the json data to string
    json_str = json.dumps(data)
    
    # Encode the string to bytes
    json_bytes = json_str.encode()
    
    # Convert bytes to base64 encoded string
    base64_encoded = b64encode(json_bytes).decode()
    
    return base64_encoded

# Example usage
data_to_encode = {
    "token": "챌린지로 주어지는 토큰 값을 여기에 입력",
    "iv": "13c47f87221fbdfbc12d397de94d2252"
}

encoded_token = encode_to_base64(data_to_encode)
print(encoded_token)

  각 토큰은 Base64로 인코딩 되어있는데, 디코딩할 경우 token과 IV (initial vector) 값이 JSON 형식으로 작성되어 있다. 모든 경우에서 IV 값은 동일하고, 토큰 값의 첫 블럭과 맨 마지막 블럭의 값 역시 동일하다. 첫 블럭은 EBC, 그 다음부터는 CBC로 암호화 하는데, 첫 블럭의 값은 항상 일정하므로 사실상 CBC 모드로만 암호화 하는 것과 동일하다. 때문에 admin으로 가입했을 때의 토큰 값을 알아내기 위해서는 admin과 유사한 계정을 여러 개 만들어 패턴을 파악한 다음, 역으로 admin의 토큰 값을 추정해내면 된다.

 

51db35eca235fe7a		admin 1
d088939e3f57dadd

38d34e66ef5fcb90
7ab6b09df4c1bbbc

83df7b311ea9107c
974b2fdb22dd66a8

0e200b115cccf7a6
9118bd3c9615ebd1

a2b5728418a4f9e6
197d5b7c389cedd4


=
51db35eca235fe7a		admin1
d088939e3f57dadd

7752fefc87e9d00a
c511dd4f3675f0c9

6036243dffd957d8
21c814018349e7b0

8fec00e97a743a95
8322e29fdbf83b0a

82664a306c0c9319
94bef0a9103b6ca5


=
51db35eca235fe7a		admin 2
d088939e3f57dadd

eff8b24c393246ec
79e8599b50d42e22

b99178d222efd609
f8d68b0225f79a04

78cc7cd733466e0d
5ff887e2dc87ac78

67474203ef854f50
65111c6356afeb37


=
51db35eca235fe7a		admin2
d088939e3f57dadd

acc40b7982584b2f
12415bcc0af73e7c

1aae5f7f31d12f66
117327366b521ee3

e02c26b681d54db5
38c8a6fadfe9bd2e

ab19d6411163a0f4
4280ba9849597370

 

근데 그걸 어떻게 하지..