2017年2月

使用BurpSuite攻击JavaScript Web服务代理

JavaScript Web服务代理是用于与WCF Web服务交互的WSDL(Web服务描述语言)文件的一种选择。这个代理文件用作Web服务方法的描述,公开可用的服务方法及其参数。 JavaScript服务代理或者说JSWS(JavaScript Web服务),它们是AJAX框架的组件,通常可以用于代替相同Web服务的WSDL。JSWS使用JavaScript来对描述符文件进行建模,并且传输中的JSON使得它成为WSDL的XML的一个很好的替代,因为JavaScript和JSON被大量集成到所有浏览器中。客户端应用程序将根据需要加载JSWS或嵌入到页面中。JSWS包含将指示浏览器创建JSON请求的JavaScript代码。JSWS文件的示例在下面。

Type.registerNamespace('NewsSite.AdGroups');
NewsSite.AdGroups.Advertisement=function() {
NewsSite.AdGroups.Advertisement.initializeBase(this);
this._timeout = 0;
this._userContext = null;
this._succeeded = null;
this._failed = null;
}
NewsSite.AdGroups.Advertisement.prototype={
_get_path:function() {
 var p = this.get_path();
 if (p) return p;
 else return NewsSite.AdGroups.Advertisement._staticInstance.get_path();},
GetAds:function(SubsectionID,AdGroupID,Element,iCounter,succeededCallback, failedCallback, userContext) {
return this._invoke(this._get_path(), 'GetAds',false,{SubsectionID:SubsectionID,AdGroupID:AdGroupID,Element:Element,iCounter:iCounter},succeededCallback,failedCallback,userContext); }}
NewsSite.AdGroups.Advertisement.registerClass('NewsSite.AdGroups.Advertisement',Sys.Net.WebServiceProxy);
NewsSite.AdGroups.Advertisement._staticInstance = new NewsSite.AdGroups.Advertisement();
NewsSite.AdGroups.Advertisement.set_path = function(value) { NewsSite.AdGroups.Advertisement._staticInstance.set_path(value); }
NewsSite.AdGroups.Advertisement.get_path = function() { return NewsSite.AdGroups.Advertisement._staticInstance.get_path(); }
NewsSite.AdGroups.Advertisement.set_timeout = function(value) { NewsSite.AdGroups.Advertisement._staticInstance.set_timeout(value); }
NewsSite.AdGroups.Advertisement.get_timeout = function() { return NewsSite.AdGroups.Advertisement._staticInstance.get_timeout(); }
NewsSite.AdGroups.Advertisement.set_defaultUserContext = function(value) { NewsSite.AdGroups.Advertisement._staticInstance.set_defaultUserContext(value); }
NewsSite.AdGroups.Advertisement.get_defaultUserContext = function() { return NewsSite.AdGroups.Advertisement._staticInstance.get_defaultUserContext(); }
NewsSite.AdGroups.Advertisement.set_defaultSucceededCallback = function(value) { NewsSite.AdGroups.Advertisement._staticInstance.set_defaultSucceededCallback(value); }
NewsSite.AdGroups.Advertisement.get_defaultSucceededCallback = function() { return NewsSite.AdGroups.Advertisement._staticInstance.get_defaultSucceededCallback(); }
NewsSite.AdGroups.Advertisement.set_defaultFailedCallback = function(value) { NewsSite.AdGroups.Advertisement._staticInstance.set_defaultFailedCallback(value); }
NewsSite.AdGroups.Advertisement.get_defaultFailedCallback = function() { return NewsSite.AdGroups.Advertisement._staticInstance.get_defaultFailedCallback(); }
NewsSite.AdGroups.Advertisement.set_enableJsonp = function(value) { NewsSite.AdGroups.Advertisement._staticInstance.set_enableJsonp(value); }
NewsSite.AdGroups.Advertisement.get_enableJsonp = function() { return NewsSite.AdGroups.Advertisement._staticInstance.get_enableJsonp(); }
NewsSite.AdGroups.Advertisement.set_jsonpCallbackParameter = function(value) { NewsSite.AdGroups.Advertisement._staticInstance.set_jsonpCallbackParameter(value); }
NewsSite.AdGroups.Advertisement.get_jsonpCallbackParameter = function() { return NewsSite.AdGroups.Advertisement._staticInstance.get_jsonpCallbackParameter(); }
NewsSite.AdGroups.Advertisement.set_path("/AdGroups/Advertisement.asmx");
NewsSite.AdGroups.Advertisement.GetAds= function(SubsectionID,AdGroupID,Element,iCounter,onSuccess,onFailed,userContext) {NewsSite.AdGroups.Advertisement._staticInstance.GetAds(SubsectionID,AdGroupID,Element,iCounter,onSuccess,onFailed,userContext); }
var gtc = Sys.Net.WebServiceProxy._generateTypedConstructor;
if (typeof(NewsSite.AdGroups.AdGroupInfo) === 'undefined') {
NewsSite.AdGroups.AdGroupInfo=gtc("NewsSite.AdGroups.AdGroupInfo");
NewsSite.AdGroups.AdGroupInfo.registerClass('NewsSite.AdGroups.AdGroupInfo');
}

文件加载后,后续的请求将按以下方式格式化。

JSON-request.png

这个指示浏览器如何格式化请求的文件的一个副作用是这也可以帮助攻击者枚举Web服务方法和潜在注入点。 在这些可以利用之前,重要的是要了解JSWS何时使用,以及如何识别它。

识别JSWS

有多种不同的方法来识别这些服务何时在应用程序中使用。应用程序可以通过查找https://some.domaim.com/WebService.asmx/js来请求允许通过代理日志识别的JSWS文件。应用程序还可能请求具有调试信息的相同文件,https://some.domain.com/WebService.asmx/jsdebug。 jsdebug文件将包含有关所需参数的数据类型的附加信息,以及需要哪些参数。即使应用程序没有请求jsdebug文件,它很可能仍然可用。

或者,应用程序可能使用PageMethods技术,这意味着JSWS将直接嵌入到页面中。

这通常在aspx页面而不是asmx,但它可以与任何扩展一起。这个方法可以通过搜索服务器响应的“PageMethods”字符串,或通过检查代理日志的方法调用来识别(例如https://some.domain.com/WebService.aspx/GetInformation

JSWS扩展

在识别出这种技术正在使用之后,攻击者能够处理Web服务将接受的所有请求变化,但这需要时间,并且可能相当冗长乏味。开始在评估中经常看到JSWS之后,我决定创建一个Burp扩展来自动化这个过程。该工具是在Eric Gruber的Wsdler之后建模的,并且以相同的方式运行。JSWS扩展可以从https://github.com/NetSPI/JSWS下载,目前正在等待进入BApp商店。

要使用此工具,只需右键单击包含JSWS的请求或响应,然后单击Parse JSWS(解析JSWS)。如果应用程序正在加载JSWS文件,则该文件应已位于代理日志中。

parse-JSWS.png

建议解析jsdebug文件而不是js文件,因为它会给用户提供更多关于篡改哪些类型的参数的信息。

如果应用程序使用JSWS的PageMethods表示,请右键单击包含PageMethods代码的请求或响应,然后单击Parse JSWS。

然后,JSWS扩展将打开一个JSWS选项卡,以及一个用于刚刚解析的服务的子选项卡。 在此选项卡下有两个窗格,顶部包含所有可用的方法,底部包含JSON模板。

JSWS-tab.png

从这里,请求可以作为任何JSON请求处理,并可以发送到Repeater进行手动测试,或者Intruder和Scanner进行自动测试。

结论

该扩展程序当前不能通过被动扫描检测到JSWS的存在。这项功能正在实现将在未来的版本中发布。对于你可能发现的任何功能要求或错误,请给我发电子邮件或在Github提问。

BurpSuite和Fiddler串联使用解决App测试漏包和速度慢的问题

前言

没什么技术含量,就是一个小tips,请轻喷,大侠们有什么更好的也欢迎分享讨论。

问题

在实际的测试过程中,我一直使用BurpSuite,但是在使用它进行Android App的测试时发现有两种不好的情况:

  1. 使用了burp的代理后,响应速度明显降低,有的App对响应时间有要求,待到响应包返回后,页面已经显示超时,无法完成测试。
  2. 第二种情况更是糟糕,就是出现抓不到包的情况。在MottonIN的群也有小伙伴反映过相同的情况;官方论坛也有人遇到:http://forum.portswigger.net/thread/1115

解决方案

经过反复尝试,找到了如下的解决方法:

手机wifi设置代理 —–>Fiddler —->BurpSuite —–>互联网(或者测试环境网络)

原理说明

肯定有个疑问,只用burp都慢了,双重代理岂不是更慢?

答案是非也,串联速度会比只用burp快很多,为什么呢?这可能(我不能保证说得是对的,只是自己的猜测)和2个工具的抓包机制有关了。

Fidder 只是http和https的代理而且是用C#写出来的,而BurpSuite是从底层包中解析http流量,而且是Java写的,这么一对比,单独使用2者的时候,Fidder比BurpSuite也就很正常。

为啥串联还快呢,当Fidder的流量走BurpSuite的时候,没有流量解析的过程,只是单纯的转发,少了最耗时的步骤。总体而言还是比单独使用BurpSuite的时候快很多。

详细配置

1.Fidder和BurpSuite的配置

监听8888端口,手机上的代理地址就设置这个

pic1.png

如果要抓https的包,就要如下配置。

pic2.png

gateway的配置,设置的内容是burpsuite的代理地址,表示流量经过Fiddler后,转发到Burp的代理地址

pic3.png

pic4.png

2.手机上的配置:

设置代理地址;安装Fiddler的证书。

类似案例:

比如,sql注入的时候想要看到sqlmap使用了哪些payload,就可以使用proxy参数。

pic5.png

注意:

Fiddler 默认是不会使用系统hosts 的,而Burpsuite默认是会使用的,所以呢,串联后是会使用的。如果你的测试需要绑定hosts,请注意。

互联网企业安全高级指南读书笔记

前言

春节前花了几天时间,终于把这本书完整读完了。受益匪浅!

这是市面上第一本从总览的视角陈述甲方企业安全建设思路与框架,描绘企业内部信息安全全貌的书。

除了“战略”层面的全局观,这本书还难能可贵的深入了一些技术细节,在“战术”层面也不乏很多干货。

为了帮助记忆和理解,我基本上每章都用思维导图的方式整理了笔记。

这些笔记并非对全书的完整总结,亦非斗胆点评,仅作为个人理解和梳理思路的笔记之用。

第三章 甲方安全建设方法论

第三章.png

第四章 业界的模糊地带

第四章.png

第五章 防御架构原则

第五章.png

第六章 基础设施安全

第六章.png

第七章 网络安全

第七章.png

第八章 入侵感知体系

第八章.png

第九章 漏洞扫描

第九章.png

总结

总得来说,互联网企业和传统行业企业在安全建设的思路上,殊途同归。

不同点

  • 扩展性

互联网企业的业态具有大流量、高实时性、海量用户、海量数据的显著特征。由于流量太大,所以“两个海量”的特征与传统企业非常不一样。同时,互联网企业的线上业务就是钱,这样就决定了高实时性是必保的点。传统企业的线上业务即便是挂了,在一定时间内也不会直接影响生产力。

为了应对一大一高两个海量,传统安全企业的解决方案存在先天不足:无法无缝横向扩展。这就导致了互联网企业更多的选择自研防护手段。

互联网企业对安全防护手段的要求是,低维护成本+高扩展性。而传统企业呢,更看重的是易配置+防护全面。

  • 自研能力

这一点非常容易理解。互联网企业拥有足够的薪资吸引高端人才,所以才能支撑自研的需求。而传统企业除了保护线上业务外,还需要应对合规、内部防泄密等安全外延业务诉求。自身也不具备自研的能力。

相同点

  • 分层防御+威胁感知

无论是线上业务防攻击,还是内部治理防泄密,都必须依赖分层设计的多重防御措施交互实现立体化、深层次的防御能力。应对瞬息万变的攻击特征,必须具备第一时间感知威胁发生的能力。所以,无论是威胁情报,还是大数据分析,这些技术在不同业态的甲方企业内都会有持续的生命力和价值点。综上,虽然业态不同,但核心思想还是相通的。

另外,作者赵老师在书中提到,传统企业迫于提高生产力、提高效率的压力,业态向互联网转化的速度会越来越快。所以,互联网企业在线上业务安全防御方面的经验,领先传统企业十年,此言不虚。安全的本质始终没有变,就看在不同环境下怎么玩的踏实,怎么玩出精彩。

与君共勉。

利用Scapy造一个Passive DNS Collector 工具:Pdns_sniff

pdns_sniff是什么?

简单理解为一个记录你发起过的DNS请求的东西,利用了Passive DNS 思路,被动的记录发起过的DNS请求。

pdns_sniff有什么用?

利用这样的工具可以帮助我在愉快的上网的同时,轻松搜集到测试目标的各种子域名。

pdns_sniff原理是什么?

利用了python里的强大的scapy套件,运用它抓取,解析出DNS请求包从而得到各种域名。使用了mysql进行数据存储,利用了gevent协程进行并发进行数据包的分析和写入数据库(PS:刚学gevent,拿来用用。)

效果图

效果图一:数据库中记录1

20170205223502148630530254796.png

效果图二:数据库中记录2

20170205223524148630532412525.png

效果图三:工具输出记录

20170205223538148630533859265.png

效果图四:使用方法

20170205223434148630527450376.jpeg

需要安装的三方库

  • gevent
  • scapy
  • MySQLdb

需要修改的数据库配置

大概在第29行

conn = mysql.connect(user='root', passwd='yourpassword', host='127.0.0.1', db='dnslogsDB')

pdns_sniff的相关代码

https://github.com/coffeehb/tools/tree/master/pdns_sniff