풀이 사전 지식
+ CTR
CTR 공격
# Problem
# Source
<?php
include "secret.php"; //server_secret, iv, flag
$cookie_name = "SESSION";
if (!isset($_COOKIE[$cookie_name])) {
header('Location: /signin.php');
exit;
}
$cipher="aes-128-ctr";
list($iv, $encrypted_session_data) = explode("|", base64_decode($_COOKIE[$cookie_name]), 2);
$session_data = openssl_decrypt($encrypted_session_data, $cipher, $server_secret, OPENSSL_RAW_DATA, $iv);
list($username, $auth_code) = explode("|", $session_data);
if ($auth_code !== $server_secret) {
die("No hack!");
}
?>
PHP
복사
# Solving strategy
1.
aes-128-ctr 취약점 이용
a.
고정된 nonce를 사용하여 암호화 하는 경우 같은 구간에서 같은 키스트림을 가지고 XOR 암호화 된다.
b.
$username에는 guest가 들어간다.
c.
guest와 admin의 길이는 5 글자로 XOR되는 데이터만 찾아 admin과 XOR 하면 나머지 데이터에 대해서는 수정이 가해지지 않아 $auth_code이 변경되지 않는다.
# Exploit
# Payload
import base64
cookie = "v4VtAOyMFMYbr+Xs6mSVUnxfECs6Ore01RkALAJYrLp2pGpWJdK+m+u7pPvj43wJSmCm68cDI6SL5t5uXftCBBWHef3Xf4ijTi7PmIxVoFEJVlcG1Zvgfg=="
de_cookie = base64.b64decode(cookie)
iv = de_cookie.split(b'|')[0]
encode_data = de_cookie[len(iv)+1:]
#encode_data ^ ? = guest|~~
xor_data = [e^g for e, g in zip(encode_data[:5], b'guest')]
admin_data = bytearray([e^g for e, g in zip(xor_data, b'admin')])
admin_cookie = base64.b64encode(iv+b"|"+admin_data+encode_data[5:]).decode()
print(admin_cookie)
Python
복사
# Flag
SCTF{T3ll_me_4_r3ally_s3cure_w4y_to_m4na9e_5eSS10ns}
Plain Text
복사