NATAS0-33
Natas教授了服务器端网络安全的基础知识。natas的每个级别都包含位于http://natasX.natas.labs.overthewire.org的自己的网站 ,其中X是级别号码。有没有SSH登录。要访问某个级别,请输入该级别的用户名(例如,0级的natas0)及其密码。
每个级别都可以访问下一级别的密码。你的工作是以某种方式获得下一个密码并升级。所有密码也存储在/ etc / natas_webpass /中。例如,natas5的密码存储在/ etc / natas_webpass / natas5文件中,并且只能由natas4和natas5读取。
Natas Level 0
1 | Username: natas0 |
过程:
进入题目后
1 | You can find the password for the next level on this page. |
查看源码获得flag
1 | <html> |
The password for natas1 is gtVrDuiDfck831PqWsLEZy5gyDz1clto
Natas Level 0 → Level 1
1 | Username: natas1 |
过程:
进入题目后
1 | ou can find the password for the next level on this page, but rightclicking has been blocked! |
提示密码就在这个页面,但是鼠标右键被禁用了,所以通过F12查看源码来获取密码
The password for natas2 is ZluruAthQk7Q2MqmDeTiUij2ZvWy2mBi
Natas Level 1 → Level 2
1 | Username: natas2 |
过程:
先看看页面源码
1 | <html> |
发现这样一个图片files/pixel.png
,但是非常小,感觉没有什么用,那就直接访问http://natas2.natas.labs.overthewire.org/files/ 发现除了pixel.png
图片还有一个users.txt
的文件
获得文件内容
1 | # username:password |
natas3: sJIJNW6ucpu6HPZ1ZAchaDtwd7oGrD14
Natas Level 2 → Level 3
1 | Username: natas3 |
过程:
进入题目后查看源码,发现没有什么可用信息,那就看一下robots文件
1 | User-agent: * |
访问 /s3cr3t/
,发现users.txt
文件,接着访问users.txt
获得下一关的密码
natas4:Z9tkRkWmpt9Qr7XrR5jWRkgOU901swEZ
Natas Level 3 → Level 4
1 | Username: natas4 |
过程:
1 | Access disallowed. You are visiting from "" while authorized users should come only from "http://natas5.natas.labs.overthewire.org/" |
从http://natas5.natas.labs.overthewire.org/访问就可以获得密码,那就直接使用Burp suite抓包,将请求头的Referer改为题目指定的
Http协议中的referer表示的就是你从哪个页面来的
1 | Referer: http://natas5.natas.labs.overthewire.org/ |
The password for natas5 is iX6IOfmpN7AYOQGPwtn3fXpbaJVJcHfq
Natas Level 4 → Level 5
1 | Username: natas5 |
过程:
进入题目后提示还没有登陆
1 | Access disallowed. You are not logged in |
用Burp suite获取请求包
1 | GET / HTTP/1.1 |
发现Cookie: loggedin=0
,猜测0为没有登陆,1为已经登陆,所以将0改为1,重放后获得密码
The password for natas6 is aGoY4q2Dc6MgDq4oL4YtoKtyAg9PeHa1
Natas Level 5 → Level 6
1 | Username: natas6 |
过程:
进入题目后有一个提交框,我们还是先看看源码,点击View sourcecode
发现PHP脚本
1 |
|
我们输入的参数和预先设定的$secret
一样就可以获得密码,那直接访问secret.inc
文件试试看
访问http://natas6.natas.labs.overthewire.org/includes/secret.inc,虽然页面空白,但是鼠标右键查看源码~哇
1 |
|
现在回来直接在提交框提交FOEIUWGHFEEUHOFUOIU
获得密码
The password for natas7 is 7z3hEENjQtflzgnT29q7wAvMNfZdh0i9
Natas Level 6 → Level 7
1 | Username: natas7 |
过程:
发现两个超链接,但是并没有什么用,查看网页源码获得提示
1 | <!-- 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
Natas Level 7 → Level 8
1 | Username: natas8 |
过程:
还是点击View sourcecode
看看源码吧
1 |
|
提交的参数经过三次处理后等于$encodedSecret
就会获得密码
bin2hex()函数是把 ASCII 字符的字符串转换为十六进制值
strrev()函数是反转字符串
base64_encode()进行Base64编码
那个就写一个脚本还原$encodedSecret
的值,代码如下
1 |
|
提交运行的结果获得密码
The password for natas9 is W0mMhUcRRnG8dcghE4qvk3JA9lGt8nDl
Natas Level 8 → Level 9
1 | Username: natas9 |
过程:
查看源码
1 |
|
通过passthru()来执行外部命令,可以使用;
命令分隔符,这将允许我们在一行中使用2个命令。我们还将使用#
注释命令,它将注释符号后面的其余文本。
因此输入; cat /etc/natas_webpass/natas10 #
将运行passthru命令; grep -i ; cat /etc/natas_webpass/natas10 #
并注释掉dictionary.txt。
nOpp1igQAkUzaI1GUUjzn1bFVj7xCNzu
Natas Level 9 → Level 10
1 | Username: natas10 |
过程:
感觉套路一样,只是说过滤了某些字符,还是查看源码
1 |
|
过滤了;
和&
,那就想办法绕过,使用.* /etc/natas_webpass/natas11 #
,.#
意思是通过grep搜索所有,并将其匹配到 /etc/natas_webpass/natas11
。
1 | Output: |
natas11:U82q5TCMMQ9xuFoI3dYX61s7OZD9JKoK
Natas Level 10 → Level 11
1 | Username: natas11 |
过程:
还是之接看源码
1 |
|
首先定义了一个数组,然后创建了一个’xor_encrypt’函数,该函数将一个字符串作为输入并使用一个经过审查的密钥执行XOR操作 ;’loadData’函数,将默认数组加载到$ mydata中,检查cookie中是否存在数据,如果是,则尝试对其进行base64_decode,对其执行XOR操作,并将JSON解码为数组 ,如果这确实是一个数组,并且找到适当的值,则使用cookie中的值更新mydata的值 ,如果不是,则保留默认值;’saveData’函数,该函数用于将Cookie设置为JSON编码,异或,然后base64编码的数据.
XOR加密的特性
1 | Original_Data XOR KEY = Encrypted_Data |
所以使用这个特性写一个脚本来算出KEY,Cookie=ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw=,
1 | <php? |
运行结果为:
1 | qw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jq |
所以key为qw8J,接着再写算出以qw8J
为密钥,’showpassword’的值为’yes’ 的密文
1 |
|
运行结果为
1 | ClVLIh4ASCsCBE8lAxMacFMOXTlTWxooFhRXJh4FGnBTVF4sFxFeLFMK |
最后使用Burp suite抓包修改Cookie为刚得到的获得密码
The password for natas12 is EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3
Natas Level 11 → Level 12
1 | Username: natas12 |
过程:
同样先看源码
1 |
|
genRandomString函数创建一个10个字符的随机字符串 ;
makeRandomPath函数传入一个目录和扩展名,并创建一个随机文件名;
makeRandomPathFromFilename函数,它接收一个目录和一个文件名,并从文件名中提取扩展名。然后它使用这个信息来调用makeRandomPath;
然后PHP代码检查是否已上传文件,然后从提供的文件名创建一个随机路径。然后它会检查大小以确保其大小不超过1000字节,如果这些检查通过,它会上传文件并告诉路径
我先正常上传了一个正常的小于1K的图片,成功返回了路径和重命名后的文件名。于是上传一个shell
1 |
|
修该扩展名为jpg,使用burp suite 抓包
1 | POST /index.php HTTP/1.1 |
修改filename的扩展名,将jpg
改为php
4flu9u53ae.php
返回:
1 | The file upload/d0tmjn54an.php has been uploaded |
shell上传成功,接着执行命令cat /etc/natas_webpass/natas13
查看密码
访问:natas12.natas.labs.overthewire.org/upload/d0tmjn54an.php?cmd=cat /etc/natas_webpass/natas13
获得密码
jmLTY0qiPZBbaKc9341cqPQZBJv7MQbY
Natas Level 12 → Level 13
1 | Username: natas13 |
过程:
这里就不把源码复制过来了,这题不同的是用了exif_imagetype 函数来获取图片的类型。大多数文件类型(如JPEG,ZIP,TAR等)在文件的开头都有一个“ Magic Number ”来帮助验证它的文件类型。因此,要通过exif_imagetype函数检查,我们的文件必须以支持的图像格式的幻数开始。
jpeg文件有固定的文件头,其文件头的格式如下:
1 | Start Marker | JFIF Marker | Header Length | Identifier |
用python创建一个shell脚本
1 | fh = open('shell.jpg','w') |
然后用上一题同样的方法上传,获取密码
Lg96M10TdfaPyVBkJdjymbllQ5L6qdl1
Natas Level 13 → Level 14
1 | Username: natas14 |
过程:
1 |
|
注意的一个关键问题是,如果我们在GET请求中提供了一个’debug’参数,它将回显发送到数据库的确切查询。
用户:username
密码:password
访问:http://natas14.natas.labs.overthewire.org/index.php?username=username&%20password=password&debug
返回:
1 | Executing query: SELECT * from users where username="username" and password="password" |
用户:” or “1”=”1
密码:password
访问:
返回:
1 | Executing query: SELECT * from users where username="" or "1"="1" and password="password" |
用户:” or “1”=”1
密码:” or “1”=”1
访问:
返回:
1 | Executing query: SELECT * from users where username="" or "1"="1" and password="" or "1"="1" |
成功登陆并返回密码
Natas Level 14 → Level 15
1 | Username: natas15 |
过程:
1 |
|
经过多次尝试后,这一题是sql盲注,并且存在natas16这个用户,而密码是32个字符,可以用这条查询语句来查寻密码中是否有a
。
Select * from username where username =“natas16”and password LIKE BINARY“%a%”
所以用python写一个脚本来爆破出密码
1 | import requests |
第一个循环是找出密码由哪些字符组成,而第二个双重循环的目的是查出密码,这样更快一点。
1 | W |