|
|
|
联系客服020-83701501

代码审计工具 Cobra 源码分析(一)

联系在线客服,可以获得免费在线咨询服务。 QQ咨询 我要预约
代码审计器材 Cobra 源码分析(1)

0x00 序言

@0r3ak 师傅向我举荐了1款代码审计器材Cobra(wufeifei/cobra),该器材基于Python开拓,可以针对多种说话的源代码安全性评价。

在测试的过程当中,总是不得法子,有1些标题问题不晓得怎么解决,都是又很想领会下这款式子的完成事理。

在这1系列的条记中,将会记录下对 Cobra 的垄断体验,以及源码级的分析。

0x01 底子环境

Ubuntu 16.04.3 LTS

Python 2.七.12

Cobra 2.0.0-alpha.5

pdb

0x02 实行流程&环节代码分析

关于 Cobra 的布置,与根蒂的垄断法子在 Cobra 的文档中说的很详细了。我这里就不在赘述。不领会的同砚可以在本文的参考链接中取得 Cobra 的文档。

这篇条记次要记录下,CLI模式下,对某1个文件中代码做安全审计的过程当中,相干的函数调用栈,及环节函数的事理分析。此间会颠末pdb信息调试离散信息代码分析以及式子的文档,帮忙对局部式子的领会。(关于pdb的垄断法子可以参考:Flask debug 模式 PIN 码生成机制安全性研究条记)

第1步:在cobra.py文件中sys.exit(main())语句前下断点

第2步:实行如下代码(具体的恪守为:审计XXX目次下的代码)

Default
1 python cobra.py -t /home/tonghua/XXX

步入到main()函数中

main()中的代码次要恪守是,取得以后呼吁行敲的呼吁,并做响应的处置。

颠末第18行可知,main()函数在\cobra\__init__.py文件中定义,咱们步入到main()函数的定义地位。

第55行args = parser.parse_args(),args变量包含着需要用到的各个变量的值。

由代码可知,debug模式将会实行5七行的if逻辑,颠末logger记录debug日记,61行的if果决是打印帮忙信息,65行的if逻辑是发动RESTful任事。

诚然由于咱们只实行了-t参数,所以以上if果决均不会进入,间接logger.debug(‘[INIT] start scanning…&#821七;)后,持续向下实行。

第68-84行,即为该步伐进行代码审计的环节代码。

get_sid()函数(\cobra-master\cobra\cli.py 第28-38行),拼接字符串&#821七;a+式子文件夹md5的前5位+1个随机字符串&#821七;,其恪守想必理应是区分一致的扫描式子。

第七8行,Running(a_sid).status(data),实例化Running类(调用其__init__()结构法子),此后调用该器材的status()法子。其会向指定的持久文件中写入以后的审计形态。

第82行,调用cli.start()函数,劈头劈脸扫描,步入到该函数的具体完成代码(\cobra-master\cobra\cli.py 第41-122行)。

来到cli.start()函数中,第52-6七行,完成了对变量初始化赋值、logger记录扫描陈说的URL、确认目标模式(文件夹、还是Git文件等),输入体例。

第七0-七5行,明朱文件夹路径,确认每1个需要扫描的文件地位,统计文件数目

此中对文件夹下的内容进行遍历和统计的恪守,次要由\cobra-master\cobra\pickup.py中的Directory()类完成。为了先大略领会下个人的实行流程,这块具体完成细节先不分析。

第七8-88行,颠末Detection()类中的恪守完成对开拓说话、开拓框架的检测(检测规则规矩后续还可以自行减少)。这里用到了Python的@property语法糖,可以将类中的法子已变量的模式进行调用。

步入scan()函数,顾名思义这里完成了扫描恪守。

第153行创设了Rule()实例,接下来几行,对裂痕范例、开拓说话、扫描规则规矩等进行定义

第160行,颠末scan_cve()函数进行CVE裂痕扫描,步入到该函数(cobra-master\cobra\cve.py 第332-361行)中,查抄切完成体例。

 

第348-350行的for循环中,会对【裂痕规则规矩】目次下的,裂痕文件进行遍历,此中【CVI-999】开首的文件为CVE裂痕检测文件,遍历出所有的CVE裂痕文件。

第354行,pool = multiprocessing.Pool(),搞了1个过程池,之后循环遍历所有的CVE裂痕文件,在第358行进行裂痕扫描,pool.apply_async(scan_single, args=(target_directory, cve_path), callback=store),调用scan_single()漏扫函数,扫描完成后回调到store()函数中。

第3七2行,漏扫函数scan_single()的调用链:scan_single()->cve.scan_cve(),cve.get_scan_result()

这里有1个坑点即是,文件中的scan_cve()函数和CveParse类中的scan_cve()法子同名,导致刚刚跟丢了,2333

分析下cve.scan_cve()法子(第214-225行)

今天今日就先到这里,剩下的内容克日再更新。

0x03 步伐实行链

今天今日的分析先到这里,脑阔疼。

梳理下中止目前的函数调用链:

\cobra.py line 22 main()

–>\cobra\__init__.py line 82 cli.start() and line 七8 Running()

—->\cobra\cli.py line 91 scan()

——>\cobra\engine.py line 160 scan_cve()

——–>\cobra\cve.py line 358 pool.apply_async(scan_single, args=(target_directory, cve_path), callback=store)

———> \cobra\cve.py line 3七1 cve.scan_cve()

pause!!!

其它,Cobra好多文件、类中都采纳类似的法子名,翻起来好吃力啊!!!

0x04 跋文

盼愿我可以尽快认识这套式子的代码,做1些2次开拓、减少裂痕规则规矩的事。同时也等待有1天我可以参加到这个开源式子中来,孝敬实力。

暂且不论该器材的漏报、误报状况,因为主动化的代码审计,文件与文件之间的相干、函数与函数之间的调用相干、Web框架提供的把持接口、如何苦定URL路由以及一致裂痕范例的检测规则规矩,本来即是1件难度很大的事。漏报、误报在劫难逃,光是这种分享精力就让我很宾服了,再主要感谢下该开源式子的作者,让像我1样的菜鸟有1个学习的方向。也要感谢那些帮忙我的师傅们,是你们络续的率领着我成长。

0x05 参考链接

Introduction(介绍)

2七.3. pdb – The Python Debugger – Python 3.6.4 documentation

作者:童话

 

数安新闻+更多

证书相关+更多