DomXss检测模块整合开源扫描器框架golismero

有时候我们写一个检测模块,想在真实的网络环境中去检测它的能力和稳定性,想大批量的对网络中的网站进行探测,往往我们的解决方案是:


1,依靠API调各种搜索引擎的搜索结果2,自己针对检测模块写爬虫3,网上先采集一批潜在站点域名,写个临时的批量脚本。


No.1的问题是搜索引擎有数量和频次上的限制,而且只能依赖搜索引擎的爬取结果,机动性差。

No.2的问题是难道以后每次写一个检测模块都要写个爬虫配合么,那样太痛苦了。

No.3的问题和1一样,机动性差,适合小批量的扫描。

于是接下来我介绍一款国外的开源扫描框架golismero(向开源致敬)能够将我们自己写的检测模块灵活的嵌入到引擎中,配合爬虫等插件,进行定制化的扫描,从而避免我们把精力过多的放在爬虫等外部套件中而是专注提高检测模块的自身能力。

这里引用golismero官网的一段描述:

“GoLismeroisanOpenSourcesecuritytoolsthatcanruntheirownsecuritytestsandmanagealotofwellknownsecuritytools(OpenVas,Wfuzz,SQLMap,DNSrecon,robotanalyzer...)taketheirresults,feedbacktotherestoftoolsandmergeallofresults.Andallofthisautomatically.”

“Golismero是一个开源的安全工具,不但能运行自带的检测模块,也能够操作一系列知名的安全工具(Openvas,Wfuzz,SQLMap,DNSrecon,robotanalyzer等),并获取他们的扫描结果汇总在一起,而所有这些过程都是自动化的。”忘了一句很重要的,golismero使用python语言编写。

20131103161434_24132.png

golismero经过了几个版本的改良,现在无论从功能性还是稳定性上都较为强大,这篇文章主要介绍如何将自己编写的检测模块嵌入到golismero扫描框架中。

DomXssFuzz:(自己写的domxss检测模块,基于phantomjs和casperjs,修改了webkit源码,保证在IE和Webkit下通用,fuzz模式)

Golismero:强大的开源网站漏洞扫描框架

domxss检测模块是一个Javascript脚本,首先需要考虑如何用python调用,这里我使用subprocess模块开子进程调用domXssFuzz.js,然后检测完毕后js脚本会输出检测结果({…}的形式),python中直接通过communicate()函数读出子进程的输出,将结果字符串eval成字典,再做后期的处理。这是整体的思路,其中的细节,子进程超时处理等等不在此讨论。

20131103162817_14388.png

调用部分主要代码如下:

origin_wkdir=os.getcwd()os.chdir(os.path.dirname(os.path.realpath(__file__))+'/domxss')try:p=subprocess.Popen("phantomjs./domXssFu.js\""+url+"\"--hash",stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)Logger.log_verbose("Testing%sfordomxss..."%url)os.chdir(origin_wkdir)except:pass#return{}start=datetime.datetime.now()whilep.poll()isNone:time.sleep(0.1)now=datetime.datetime.now()if(now-start).seconds>timeout:os.kill(p.pid,signal.SIGKILL)os.waitpid(-1,os.WNOHANG)break#importpdb;pdb.set_trace()results=[]rsStr=p.communicate()[0].strip()

接下来考虑如何嵌入golismero框架中,这里给出插件部分的相关API:

classgolismero.api.plugin.TestingPlugin[source]Bases:golismero.api.plugin._InformationPluginTestingpluginsaretheonesthatperformthesecuritytests.ThisisthebaseclassforallTestingplugins.__init__x.__init__(...)initializesx;seehelp(type(x))forsignatureget_accepted_info()Returnalistofconstantsdescribingwhichdatatypesareacceptedbytherecv_infomethod.Returns:Datatypeconstants.Returntype:listrecv_info(info)Callbackmethodtoreceivedatatobeprocessed.Thisisthemostimportantmethodofaplugin.Hereswheremostofthelogicresides.Parameters:info(Data)Datatobeprocessed.Returns:Sharedpluginstatevariables.Returntype:PluginStateupdate_status(progress=None)Pluginscancallthismethodtotelltheuserofthecurrentprogressofwhateverthepluginisdoing.

其中所有扫描插件类都要继承golismero.api.plugin.TestingPlugin,__init__函数可以自行处理,这里比较重要的两个函数是get_accepted_info和recv_info,主扫描进程调用每个插件的recv_info函数,因此自定义的插件主体内容应该在该函数内,最后要将检测结果返回,该函数接受主进程传入的Url对象供插件处理。而get_accepted_info则告诉主进程当前自定义检测插件的返回结果类型是什么str,list,dist或者其他什么。update_status则是用来向主进程汇报当前插件的检测进度百分比。


结果返回也比较有讲究,我这里返回一个list,list中是Url对象存放domxss检测结果,因此在get_accepted_info中要写return[Url]。

最后整个插件代码如下(domxssfuzz.py):

#!/usr/bin/python#coding:utf-8#codebypnig0s@knownsecimportsysimportosimporttimeimportdatetimeimportsignalimportsubprocessimportselectimporturlparsefromgolismero.api.data.resource.urlimportUrlfromgolismero.api.data.vulnerability.suspicious.urlimportSuspiciousURLfromgolismero.api.loggerimportLoggerfromgolismero.api.pluginimportTestingPlugintimeout=100classDomXssFuzz(TestingPlugin):#----------------------------------------------------------------------def__init__(self):"""Constructor"""passdefget_accepted_info(self):return[Url]defrecv_info(self,info):ifnotinfoortype(info)isnotUrl:returnrsDict={}rsStr=''url=str(info.url)ext=url.split('.')[-1]ifnot(extin['html','html','shtml','xhtml']):return#importpdb;pdb.set_trace()origin_wkdir=os.getcwd()os.chdir(os.path.dirname(os.path.realpath(__file__))+'/domxss')try:p=subprocess.Popen("phantomjs./domXssFu.js\""+url+"\"--hash",stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)Logger.log_verbose("Testing%sfordomxss..."%url)os.chdir(origin_wkdir)except:pass#return{}start=datetime.datetime.now()whilep.poll()isNone:time.sleep(0.1)now=datetime.datetime.now()if(now-start).seconds>timeout:os.kill(p.pid,signal.SIGKILL)os.waitpid(-1,os.WNOHANG)break#importpdb;pdb.set_trace()results=[]rsStr=p.communicate()[0].strip()ifrsStrand(rsStr[0]=='{'andrsStr[-1]=='}'):rsDict=eval(rsStr)ifrsDictandrsDict.get('isVul','false')=='true':for_valueinrsDict.values():ifisinstance(_value,list)and_value:vul_url=_value[0]des="Finddomxssin[%s]"%vul_urlresults.append(SuspiciousURL(url=Url(url=vul_url),substring="noargs",level="informational",description=des))Logger.log_verbose(des)returnresults

除了这个核心的插件脚本之外,我们还需要建立一个domxssfuzz.golismero文件来说明当前插件的相关信息:

[Documentation]Description=DetectdomxssAuthor=pnig0sVersion=0.1Website=https://pnigos.comCopyright=Copyright(C)2011-2013GoLismeroProjectLicense=GNUPublicLicense[Core]Name=DetectDomXssModule=domxssfuzz.pyClass=DomXssFuzz

插件到此基本就结束了,可是没人能保证一次执行成功,调试是必不可少的,可以直接启golismero.py加载插件进行调试,但这样太繁琐了,况且golismero是多进程调用插件,调试起来很痛苦的。我们自己写一个脚本,把Url资源传到我们的插件中即可。

domxssfuzz_test.py:

#!/usr/bin/envpython#-*-coding:utf-8-*-importosfromosimportpathimportsysscript=__file__ifpath.islink(script):script=path.realpath(script)here=path.split(path.abspath(script))[0]ifnothere:#ifitfailsusecwdinsteadhere=path.abspath(os.getcwd())thirdparty_libs=path.join(here,"thirdparty_libs")ifpath.exists(thirdparty_libs):has_here=hereinsys.pathhas_thirdparty_libs=thirdparty_libsinsys.pathifnot(has_hereandhas_thirdparty_libs):ifhas_here:sys.path.remove(here)ifhas_thirdparty_libs:sys.path.remove(thirdparty_libs)if__name__=="__main__":#Asaportablescript:useourversionsalwayssys.path.insert(0,thirdparty_libs)sys.path.insert(0,here)else:#Wheninstalling:prefersystemversiontoourssys.path.insert(0,here)sys.path.append(thirdparty_libs)fromgolismero.main.testingimportPluginTesterfromgolismero.api.data.resource.urlimportUrldefmain():withPluginTester()ast:u=Url("http://www.gi.pku.edu.cn/czhuanti/?chan=5&did=6.html")printt.run_plugin("testing/scan/domxssfuzz",u)if__name__=='__main__':main()

这样我们可以直接运行测试脚本来单进程(线程)调试插件了。

最后来两张通过golismero运行我们domxssfuzz插件的图:

20131103165908_53411.png

20131103170004_58500.png

除了将我们的检测模块嵌入类似golismero开源的扫描引擎,我们还可以写一个extension整合进scrapy爬虫框架中,这个思路之前也结合domxssfuzz实现了,只是还不完善,后面有机会再说。

以上是针对Web层面的检测模块的大规模测试方案,基于主机问题的相关探测可以基于ZMap来进行,一台个人PC,几个小时,整个C段空间扫一轮。

拙作一篇,轻拍。

给出一些Brainstorm的资源:

InternetCensus2012Portscanning/0usinginsecureembeddeddevices

http://internetcensus2012.bitbucket.org/paper.html

Zmap详细用户手册及DDOS的可行性

http://www.freebuf.com/tools/11985.html

ZMap:在一个小时内扫描整个互联网

http://www.freebuf.com/tools/11884.html

REF:

http://golismero-project.com/

http://blog.csdn.net/hujkay/article/details/11800847

转载:http://www.pnigos.com/?p=147

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章