https://overthewire.org/wargames/natas/natas11.html
오늘은 윈도우즈에서 한번 해 보았다.
참고로 Burp Suite 다운로드는 여기
쿠키가 XOR encryption으로 보호 되어 있다고 한다.
그리고 배경을 바꾸는 기능이 있다
쿠키도 뭔가 암호화 되어 있다.
일단 소스코드를 확인해보자
$defaultdata = array( "showpassword"=>"no", "bgcolor"=>"#ffffff");
function xor_encrypt($in) {
$key = '<censored>';
$text = $in;
$outText = '';
// Iterate through each character
for($i=0;$i<strlen($text);$i++) {
$outText .= $text[$i] ^ $key[$i % strlen($key)];
}
return $outText;
}
function loadData($def) {
global $_COOKIE;
$mydata = $def;
if(array_key_exists("data", $_COOKIE)) {
$tempdata = json_decode(xor_encrypt(base64_decode($_COOKIE["data"])), true);
if(is_array($tempdata) && array_key_exists("showpassword", $tempdata) && array_key_exists("bgcolor", $tempdata)) {
if (preg_match('/^#(?:[a-f\d]{6})$/i', $tempdata['bgcolor'])) {
$mydata['showpassword'] = $tempdata['showpassword'];
$mydata['bgcolor'] = $tempdata['bgcolor'];
}
}
}
return $mydata;
}
function saveData($d) {
setcookie("data", base64_encode(xor_encrypt(json_encode($d))));
}
$data = loadData($defaultdata);
if(array_key_exists("bgcolor",$_REQUEST)) {
if (preg_match('/^#(?:[a-f\d]{6})$/i', $_REQUEST['bgcolor'])) {
$data['bgcolor'] = $_REQUEST['bgcolor'];
}
}
saveData($data);
saveData에서
base64_encode(xor_encrypt(json_encode($d)))
이런식으로 저장하므로
data를 base64_decode 해 보았다
echo base64_decode("MGw7JCQ5OC04PT8jOSpqdmkgJ25nbCorKCEkIzlscm5oKC4qLSgubjY=")
0l;$$98-8=?#9*jvi 'ngl*+(!$#9lrnh(.*-(.n6
이런 문자열이 나왔다.
그리고 아마 해독한 결과는
{"showpassword":"no","bgcolor":"#ffffff"}
일 것이다.
그 두가지 문자열을 XOR하면 key가 나올 것 이다.
<?php
function xor_encrypt($in) {
$key = '{"showpassword":"no","bgcolor":"#ffffff"}';
$text = $in;
$outText = '';
// Iterate through each character
for($i=0;$i<strlen($text);$i++) {
$outText .= $text[$i] ^ $key[$i % strlen($key)];
}
return $outText;
}
echo xor_encrypt("0l;$\$98-8=?#9*jvi 'ngl*+(!$#9lrnh(.*-(.n6");
?>
KNHLKNHLKNHLKNHLKNHLKNHLKNHLKNHLKNHLKNHLK
이게 키가 맞는지 확인해보자
<?php
function xor_encrypt($in) {
$key = 'KNHLKNHLKNHLKNHLKNHLKNHLKNHLKNHLKNHLKNHLK';
$text = $in;
$outText = '';
// Iterate through each character
for($i=0;$i<strlen($text);$i++) {
$outText .= $text[$i] ^ $key[$i % strlen($key)];
}
return $outText;
}
$haha = json_decode(xor_encrypt(base64_decode("MGw7JCQ5OC04PT8jOSpqdmkgJ25nbCorKCEkIzlscm5oKC4qLSgubjY=")), true);
echo $haha['showpassword'];
echo $haha['bgcolor'];
?>
no#ffffff
이제 키를 얻었으니까 한번 data를 만들어 보자
<?php
function xor_encrypt($in) {
$key = 'KNHLKNHLKNHLKNHLKNHLKNHLKNHLKNHLKNHLKNHLK';
$text = $in;
$outText = '';
// Iterate through each character
for($i=0;$i<strlen($text);$i++) {
$outText .= $text[$i] ^ $key[$i % strlen($key)];
}
return $outText;
}
$defaultdata = array( "showpassword"=>"yes", "bgcolor"=>"#ffffff");
$haha = base64_encode(xor_encrypt(json_encode($defaultdata)));
echo $haha;
?>
MGw7JCQ5OC04PT8jOSpqdmkgJ25nbCorKCEkIzlscm5oKC4qLSgubjY=
intercept로 쿠키 수정하면
안된다. 이유는
$outText .= $text[$i] ^ $key[$i % strlen($key)];
이 부분 때문
(풀이를 봤기 때문에 배우기 위해서 정리한다)
$outText .= : Concatenation assignment 문자열을 합치는 concat
$text[$i] ^ $key[$i % strlen($key)];
암호/복호화 할 문자열의 i번째 글자 XOR(^)
key의 i번째 글자인데
key가 4글자라서 i가 3을 넘으면 오류가 난다
그렇기 때문에 i % strlen을 하는데
------------------^ modular operator: 나머지를 구한다.
여기에서 key는 KNHL 4글자이므로
i % 4 이다
i가 만약 0이라면
0 % 4 = 0
1 % 4 = 1
2 % 4 = 2
3 % 4 = 3
4 % 4 = 0
5 % 4 = 1
6 % 4 = 2
.
.
.
이렇게 01230123이 반복된다.
그래서 key는 KNHL이다.
다시 수정하고 실행하면
YWqo0pjpcXzSIl5NMAVxg12QxeC1w9QG