Natas 10 to 11

ktkalpha·2023년 9월 1일
0

natas

목록 보기
11/11
post-thumbnail

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)];

이 부분 때문
(풀이를 봤기 때문에 배우기 위해서 정리한다)


  1. $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

profile
그냥 중학생

0개의 댓글