代码审计工具Cobra(wufeifei/cobra)(wufeifei)(组图)

0x00序言

@0r3ak师父向我推荐了一款代码审计工具Cobra(wufeifei/cobra),该工具基于Python开发,可以针对多种语言的源代码安全性评估。

在测试的过程中,总是不得要领,有一些问题不晓得如何解决,都是又很想了解下这货款目的实现原理。

在这一系列的笔记中,将会记录下对Cobra的使用体验,以及源码级的剖析。

0x01基础环境

Ubuntu16.04.3LTS

Python2.7.12

Cobra2.0.0-alpha.5

pdb

0x02执行流程&关键代码剖析

关于Cobra的安装,与基本的使用方式在Cobra的文档中说的很详尽了。我这儿就不在赘言。不了解的朋友可以在本文的参考链接中获取Cobra的文档。

这篇笔记主要记录下,CLI模式下,对某一个文件中代码做安全审计的过程中,相关的函数调用栈,及关键函数的原理剖析。其间会通过pdb动态调试结合静态代码剖析以及项目的文档,辅助对整个项目的理解。(关于pdb的使用方式可以参考:Flaskdebug模式PIN码生成机制安全性研究笔记)

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

图片[1]-代码审计工具Cobra(wufeifei/cobra)(wufeifei)(组图)-唐朝资源网

第2步:执行如下代码(具体的功能为:审计XXX目录下的代码)

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

进入到main()函数中

图片[2]-代码审计工具Cobra(wufeifei/cobra)(wufeifei)(组图)-唐朝资源网

main()中的代码主要功能是,获取当前命令行敲的命令,并做相应的处理。

图片[3]-代码审计工具Cobra(wufeifei/cobra)(wufeifei)(组图)-唐朝资源网

通过第18行可知我要印源码,main()函数在cobra__init__.py文件中定义,我们进入到main()函数的定义位置。

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

由代码可知,debug模式将会执行57行的if逻辑,通过logger记录debug日志,61行的if判定是复印帮助信息,65行的if逻辑是启动RESTful服务。

其实因为我们只执行了-t参数,所以以上if判定均不会步入,直接logger.debug('[INIT]startscanning…')后,继续向上执行。

图片[4]-代码审计工具Cobra(wufeifei/cobra)(wufeifei)(组图)-唐朝资源网

第68-84行,即为该程序进行代码审计的关键代码。

图片[5]-代码审计工具Cobra(wufeifei/cobra)(wufeifei)(组图)-唐朝资源网

get_sid()函数(cobra-mastercobracli.py第28-38行),拼接字符串'a+项目文件夹md5的前5位+一个随机字符串',其功能想必应当是分辨不同的扫描项目。

第78行,Running(a_sid).status(data),实例化Running类(调用其__init__()构造方式),之后调用该对象的status()方式。其会向指定的临时文件中写入当前的审计状态。

第82行,调用cli.start()函数,开始扫描,进入到该函数的具体实现代码(cobra-mastercobracli.py第41-122行)。

来到cli.start()函数中,第52-67行,实现了对变量初始化形参、logger记录扫描报告的URL、确认目标模式(文件夹、还是Git文件等),输出形式。

图片[6]-代码审计工具Cobra(wufeifei/cobra)(wufeifei)(组图)-唐朝资源网

第70-75行,明晰文件夹路径,确认每一个须要扫描的文件位置,统计文件数目

图片[7]-代码审计工具Cobra(wufeifei/cobra)(wufeifei)(组图)-唐朝资源网

其中对文件夹下的内容进行遍历和统计的功能,主要由cobra-mastercobrapickup.py中的Directory()类实现。为了先大体了解下整体的执行流程,这块具体实现细节先不剖析。

第78-88行,通过Detection()类中的功能实现对开发语言、开发框架的检查(检查规则后续还可以自行降低)。这儿用到了Python的@property句型糖,可以将类中的方式已变量的方式进行调用。

图片[8]-代码审计工具Cobra(wufeifei/cobra)(wufeifei)(组图)-唐朝资源网

进入scan()函数,顾名思义这儿实现了扫描功能。

图片[9]-代码审计工具Cobra(wufeifei/cobra)(wufeifei)(组图)-唐朝资源网

第153行创建了Rule()实例,接出来几行,对漏洞类型、开发语言、扫描规则等进行定义

图片[10]-代码审计工具Cobra(wufeifei/cobra)(wufeifei)(组图)-唐朝资源网

第160行,通过scan_cve()函数进行CVE漏洞扫描,进入到该函数(cobra-mastercobracve.py第332-361行)中,查看其实现方法。

图片[11]-代码审计工具Cobra(wufeifei/cobra)(wufeifei)(组图)-唐朝资源网

第348-350行的for循环中,会对【漏洞规则】目录下的,漏洞文件进行遍历,其中【CVI-999】开头的文件为CVE漏洞检查文件,遍历出所有的CVE漏洞文件。

第354行,pool=multiprocessing.Pool(),搞了一个进程池,然后循环遍历所有的CVE漏洞文件,在第358行进行漏洞扫描我要印源码,pool.apply_async(scan_single,args=(target_directory,cve_path),callback=store),调用scan_single()漏扫函数,扫描完成后反弹到store()函数中。

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

图片[12]-代码审计工具Cobra(wufeifei/cobra)(wufeifei)(组图)-唐朝资源网

这儿有一个坑点就是,文件中的scan_cve()函数和CveParse类中的scan_cve()方式同名,致使刚才跟丢了,2333

剖析下cve.scan_cve()方式(第214-225行)

图片[13]-代码审计工具Cobra(wufeifei/cobra)(wufeifei)(组图)-唐朝资源网

明天就先到这儿,剩下的内容今天再更新。

0x03程序执行链

明天的剖析先到这儿,脑阔疼。

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

cobra.pyline22main()

–>cobra__init__.pyline82cli.start()andline78Running()

—->cobracli.pyline91scan()

——>cobraengine.pyline160scan_cve()

——–>cobracve.pyline358pool.apply_async(scan_single,args=(target_directory,cve_path),callback=store)

———>cobracve.pyline371cve.scan_cve()

pause!!!

另外,Cobra很多文件、类中都采用相同的方式名,翻上去好费力啊!!!

0x04杂记

希望我可以尽早熟悉这套项目的代码,做一些二次开发、增加漏洞规则的事。同时也期盼有三天我可以参与到这个开源项目中来,贡献力量。

姑且不论该工具的漏报、误报情况,由于手动化的代码审计,文件与文件之间的关系、函数与函数之间的调用关系、Web框架提供的操作插口、如何确定URL路由以及不同漏洞类型的检查规则,原本就是一件难度很大的事。漏报、误报在所难免,光是这些分享精神就让我很佩服了,再度要谢谢下该开源项目的作者,让像我一样的新手有一个学习的方向。也要谢谢这些帮助我的师父们,是大家不断的指导着我成长。

0x05参考链接

Introduction(介绍)

27.3.pdb-ThePythonDebugger-Python3.6.4documentation

© 版权声明
THE END
喜欢就支持一下吧
点赞205赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容