1. 程式人生 > >對網站的開源代碼進行審計

對網站的開源代碼進行審計

-c 整體 syn mage 基礎環境 就是 for call 力量

0x00 前言

@0r3ak 師傅向我推薦了一款代碼審計工具Cobra(wufeifei/cobra),該工具基於Python開發,可以針對多種語言的源代碼安全性評估。

在測試的過程中,總是不得要領,有一些問題不知道怎麽解決,都是又很想了解下這款項目的實現原理。

在這一系列的筆記中,將會記錄下對 Cobra 的使用體驗,以及源碼級的分析。

0x01 基礎環境

Ubuntu 16.04.3 LTS

Python 2.7.12

Cobra 2.0.0-alpha.5

pdb

0x02 執行流程&關鍵代碼分析

關於 Cobra 的安裝,與基本的使用方法在 Cobra 的文檔中說的很詳細了。我這裏就不在贅述。不了解的同學可以在本文的參考鏈接中獲取 Cobra 的文檔。

這篇筆記主要記錄下,CLI模式下,對某一個文件中代碼做安全審計的過程中,相關的函數調用棧,及關鍵函數的原理分析。其間會通過pdb動態調試結合靜態代碼分析以及項目的文檔,輔助對整個項目的理解。(關於pdb的使用方法可以參考:Flask debug 模式 PIN 碼生成機制安全性研究筆記)

第1步:在cobra.py文件中sys.exit(main())語句前下斷點

技術分享圖片

第2步:執行如下代碼(具體的功能為:審計XXX目錄下的代碼)

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

步入到main()函數中

技術分享圖片

main()中的代碼主要功能是,獲取當前命令行敲的命令,並做相應的處理。

技術分享圖片

通過第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] start scanning...‘)後,繼續向下執行。

技術分享圖片

第68-84行,即為該程序進行代碼審計的關鍵代碼。

技術分享圖片

get_sid()函數(\cobra-master\cobra\cli.py 第28-38行),拼接字符串‘a+項目文件夾md5的前5位+一個隨機字符串‘,其功能想必應該是區分不同的掃描項目。

第78行,Running(a_sid).status(data),實例化Running類(調用其__init__()構造方法),然後調用該對象的status()方法。其會向指定的臨時文件中寫入當前的審計狀態。

第82行,調用cli.start()函數,開始掃描,步入到該函數的具體實現代碼(\cobra-master\cobra\cli.py 第41-122行)。

來到cli.start()函數中,第52-67行,實現了對變量初始化賦值、logger記錄掃描報告的URL、確認目標模式(文件夾、還是Git文件等),輸出方式。

技術分享圖片

第70-75行,明確文件夾路徑,確認每一個需要掃描的文件位置,統計文件數量

技術分享圖片

其中對文件夾下的內容進行遍歷和統計的功能,主要由\cobra-master\cobra\pickup.py中的Directory()類實現。為了先大體了解下整體的執行流程,這塊具體實現細節先不分析。

第78-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(),搞了一個進程池,之後循環遍歷所有的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()

技術分享圖片

這裏有一個坑點就是,文件中的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 78 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 371 cve.scan_cve()

pause!!!

另外,Cobra好多文件、類中都采用相同的方法名,翻起來好費勁啊!!!

0x04 後記

希望我可以盡快熟悉這套項目的代碼,做一些二次開發、增加漏洞規則的事。同時也期待有一天我可以參與到這個開源項目中來,貢獻力量。

暫且不論該工具的漏報、誤報情況,因為自動化的代碼審計,文件與文件之間的關系、函數與函數之間的調用關系、Web框架提供的操作接口、如何確定URL路由以及不同漏洞類型的檢測規則,本來就是一件難度很大的事。漏報、誤報在所難免,光是這種分享精神就讓我很敬佩了,再次要感謝下該開源項目的作者,讓像我一樣的菜鳥有一個學習的方向。也要感謝那些幫助我的師傅們,是你們不斷的指導著我成長。

對網站的開源代碼進行審計