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
근데 그걸 어떻게 하지..
'BoB > write-up' 카테고리의 다른 글
[BoB CTF] rev) 01_TEAtime (0) | 2023.08.24 |
---|---|
[BoB CTF] web) 02_old_python_interpreter (0) | 2023.08.24 |
[BoB CTF] web) 01_flying_chicken (0) | 2023.08.24 |
[BoB CTF] misc) 03_I'm_Happy (0) | 2023.08.24 |
[BoB CTF] misc) 01_find me if you can (0) | 2023.08.24 |