◆呂汝勛 龍華秋 容振邦
?
基于Python的滲透測試輔助系統(tǒng)開發(fā)
◆呂汝勛 龍華秋 容振邦
(五邑大學(xué)計算機(jī)學(xué)院 廣東 529020)
近年來,網(wǎng)絡(luò)安全事件頻頻爆出,安全問題成為整個社會關(guān)注的重點(diǎn)。滲透測試是通過模擬惡意黑客的攻擊方法,來評估計算機(jī)網(wǎng)絡(luò)系統(tǒng)安全的一種評估方法。CToolkit是一款基于Python開發(fā)的滲透測試輔助系統(tǒng),使用Flask框架構(gòu)建web服務(wù),由三大功能模塊組成:資產(chǎn)整理、漏洞利用、筆記,主要實(shí)現(xiàn)了主機(jī)開放端口及服務(wù)信息的收集。已知web應(yīng)用漏洞的利用,以及測試過程中的有用信息記錄,涵蓋了滲透測試的幾個重要的步驟,能切實(shí)提高滲透測試的工作效率。
Python;滲透測試;輔助;Flask
身處互聯(lián)網(wǎng)+時代,互聯(lián)網(wǎng)及IT產(chǎn)業(yè)發(fā)展速度空前,眾多優(yōu)秀的軟件產(chǎn)品如雨后春筍般涌現(xiàn),但是,高速發(fā)展的機(jī)遇往往伴隨著巨大的挑戰(zhàn),近年來頻頻爆出的網(wǎng)絡(luò)安全事件影響及危害極其重大,WannaCry的勒索病毒等一系列網(wǎng)絡(luò)安全事件,彰顯著當(dāng)前社會的網(wǎng)絡(luò)安全環(huán)境的不容樂觀,網(wǎng)絡(luò)安全問題已經(jīng)成為了整個社會所關(guān)注的頭等大事。
滲透測試是通過模擬攻擊來評估網(wǎng)絡(luò)系統(tǒng)安全的一種方法,能有效地預(yù)防大多數(shù)網(wǎng)絡(luò)安全事件的發(fā)生。由于已知漏洞種類繁多,而未知漏洞還在逐日增長,為每個漏洞準(zhǔn)備一個單獨(dú)的工具,會嚴(yán)重影響滲透測試的工作效率,安全工作者亟需一個揉合多種滲透測試工具的系統(tǒng),提高滲透測試的效率。
一次滲透測試過程,根據(jù)目標(biāo)的復(fù)雜性不同,需要多種方法進(jìn)行嘗試,為了方便滲透測試工作的進(jìn)行,將為本系統(tǒng)設(shè)計以下三個重要的功能模塊:資產(chǎn)整理、漏洞利用、隨手筆記。
資產(chǎn)整理是針對目標(biāo)網(wǎng)絡(luò)主機(jī)的信息收集,探測并記錄主機(jī)開放的端口及服務(wù),信息收集作為滲透測試的第一步,端口及開放服務(wù)信息是滲透測試過程中的重要突破口,資產(chǎn)整理功能模塊用以收集主機(jī)及其對應(yīng)端口服務(wù)信息。
漏洞利用是利用已知的應(yīng)用漏洞,對目標(biāo)Web應(yīng)用可能存在的利用點(diǎn)進(jìn)行檢測與利用,檢測并成功利用漏洞,是滲透測試出報告的重要憑據(jù),根據(jù)Web應(yīng)用基于HTTP協(xié)議的通性,修改該協(xié)議的內(nèi)容可達(dá)到對Web應(yīng)用系統(tǒng)進(jìn)行漏洞檢測與利用的目的,漏洞利用功能模塊用以利用已知漏洞對目標(biāo)應(yīng)用發(fā)起攻擊利用。
隨手筆記是在記錄滲透測試過程中有用信息的模塊,針對手動測試過程中發(fā)現(xiàn)的多種潛在可利用線索進(jìn)行記錄(包括圖片與文字),需要隨時做好筆記,方便更深入檢測工作的進(jìn)行,隨手筆記功能模塊用以記錄滲透測試過程中的零碎記憶。
測試工作開始,首先對目標(biāo)主機(jī)進(jìn)行端口掃描收集服務(wù)開放信息,再根據(jù)收集到的信息測試可能存在的漏洞,而整個測試過程中持續(xù)時間比較長,偶爾會有新的線索需要及時記錄,則使用隨手筆記模塊記錄零碎記憶。
系統(tǒng)是基于Python3.5開發(fā)的,使用Flask的web應(yīng)用框架,遵守RESTful的應(yīng)用接口規(guī)范,以mongodb作為數(shù)據(jù)庫,redis做消息隊列結(jié)果存儲及命令行標(biāo)準(zhǔn)輸出的緩存,整個系統(tǒng)具有良好的穩(wěn)定性與便利性。
對于不同的滲透測試項(xiàng)目,需為其新建一個新的以項(xiàng)目命名的Project,在每個項(xiàng)目中可以建立掃描任務(wù)Task,可以同時掃描多個網(wǎng)段、多個主機(jī),每個Task的掃描強(qiáng)度也分為高中低三等(對應(yīng)不同的詳細(xì)程度),對每個Project和Task進(jìn)行增刪查操作時都是直接與對應(yīng)的RESTFUL(ProjectAPI和TaskAPI)進(jìn)行交互。
(1)應(yīng)用接口
資產(chǎn)整理模塊使用了兩個API,ProjectAPI與TaskAPI。其中,ProjectAPI是創(chuàng)建、獲取、刪除項(xiàng)目的接口,TaskAPI是創(chuàng)建、獲取、刪除任務(wù)的接口,工作流程如下圖1所示。
圖1 資產(chǎn)整理
(2)異步任務(wù)處理
對目標(biāo)網(wǎng)絡(luò)主機(jī)進(jìn)行掃描并收集信息需要持續(xù)一段相當(dāng)長的時間,在這里使用了python的celery消息隊列工具,可以將長時間的運(yùn)行程序轉(zhuǎn)移到Flask之外進(jìn)行處理,使用redis作為中間人在celery與flask之間傳遞消息,工作流程如下圖2。
圖2 消息隊列
在輸入目標(biāo)主機(jī)并提交之后,flask首先從post請求中提取出參數(shù),并在給celery發(fā)送一個創(chuàng)建任務(wù)的指令,celery會在后臺默默運(yùn)行新的任務(wù)并返回任務(wù)創(chuàng)建成功的響應(yīng),前端每間隔一段時間會通過ajax向后臺請求任務(wù)狀態(tài),任務(wù)完成或失敗則會更新任務(wù)的狀態(tài)。
(3)調(diào)用Nmap
Nmap是一款免費(fèi)的、開源的網(wǎng)絡(luò)探測和網(wǎng)絡(luò)安全評估工具,在滲透測試中,通常用于掃描目標(biāo)網(wǎng)絡(luò)主機(jī)的端口服務(wù)開放信息。在本項(xiàng)目中,將通過python的subprocess模塊創(chuàng)建子進(jìn)程并運(yùn)行Nmap,掃描過程的標(biāo)準(zhǔn)輸出及時緩存到redis中,完成后返回掃描結(jié)果的文件路徑:
@celery.task()
defrun_nmap(target, task_id, level):
if not os.path.exists('/tmp/nmap-output'):
os.makedirs('/tmp/nmap-output')
cmds = [
'nmap -v -sn -PE -n --min-hostgroup 1024 --min-parallelism 1024 {} -oX {}',
'nmap -v --open --system-dns -Pn --script=banner,http-title --min-hostgroup 1024 --min-parallelism 1024 {} -oX {}',
'nmap -v -p 1-65535 --open --system-dns -P0 --script=banner,http-title --min-hostgroup 1024 --min-parallelism 1024 {} -oX {}',]
path = '/tmp/nmap-output/{}.xml'.format(task_id)
cmd = cmds[level].format(target, path)
stdout = ''
withPopen(cmd.split(' '), stdout=PIPE) as p:
for line in p.stdout:
stdout+=line.decode('utf-8')
redis_store.hset('task_stdout', task_id, stdout)
ifp.returncode != 0:
raiseCalledProcessError(p.returncode, p.args)
return {'path':path}
根據(jù)不同種類、不同版本的Web應(yīng)用進(jìn)行分類,在每個分類(Vulnerability)里對應(yīng)有保存的漏洞利用方式,通過修改HTTP協(xié)議的參數(shù)對存在漏洞的目標(biāo)Web應(yīng)用發(fā)起攻擊利用,可以自行增加、修改、刪除不同功能的Payload(有效載荷),并通過有效載荷對存在漏洞的目標(biāo)Web應(yīng)用進(jìn)行測試與利用,所有操作直接與RESTful API(VulnAPI)進(jìn)行交互。
(1)應(yīng)用接口
漏洞利用模塊使用的API是VulnAPI。VulnAPI是創(chuàng)建、獲取、刪除Web應(yīng)用分類、漏洞利用方式的接口,工作流程如下圖3所示。
圖3 漏洞利用
在分類Vulnerability可以自定義添加,在每個分類里有對應(yīng)的漏洞Payload(有效載荷),其中包括可自定義的目標(biāo)URL、HTTP頭部信息、Proxy代理選項(xiàng),Payload(有效載荷)可以自行增加、修改、刪除不同功能的Payload(有效載荷),可以對存在漏洞的目標(biāo)Web應(yīng)用進(jìn)行測試與利用,所有操作直接與RESTful API(VulnAPI)進(jìn)行交互。
(2)操作HTTP
在漏洞利用模塊中,核心是實(shí)現(xiàn)對HTTP流量的高度自定義化,能夠修改HTTP協(xié)議的可控參數(shù)并對目標(biāo)發(fā)起請求,利用已知Web應(yīng)用漏洞的利用方式,對有效載荷進(jìn)行存儲和測試,達(dá)到有效整合各種Web漏洞利用工具的效果[8]。其中,操作HTTP協(xié)議的部分,將使用Python的第三方模塊Requests實(shí)現(xiàn),通過自定義已知web漏洞的有效載荷,模擬一個瀏覽器客戶端對服務(wù)端發(fā)起http請求,并將返回響應(yīng)結(jié)果的原始數(shù)據(jù),根據(jù)響應(yīng)值判斷是否存在漏洞:
from .parsers import vuln_put_parser
import requests
args = vuln_put_parser.parse_args()
# headers
headers = {
'user-agent': args.user_agent,
'cookie':args.cookie,
'Content-Type':args.content_type}
try:
ifargs.method == 'get': # get
r = requests.get(…)
ifargs.method == 'post': # post
r = requests.post(…)
ifargs.method == 'file': #fileupload
files = json.loads(args.payload)
data = [files[name], files['content']]
r = requests.post(…,files=data,…)
exceptBaseException as e:
return {'content':'request error: '+str(e)}
return {'content':r.content, 'headers':r.headers}
隨手筆記Note使用Wysiwyg(所見即所得)編輯器作為每一篇文章(筆記)編輯和展示的核心,本項(xiàng)目采用Summernote在線編輯器,能直接迅速編輯各類格式的文字以及粘貼截圖,保證記憶記錄的及時性。并且,所有增刪查改操作都與RESTful API(NoteAPI)交互完成。
(1)應(yīng)用接口
隨手筆記模塊使用的API是NoteAPI。NoteAPI是創(chuàng)建、刪除、獲取、修改文章(筆記)的接口,工作流程如下圖4所示。
圖4 隨手筆記
(2)遞歸操作
每一篇文章都可以擁有子節(jié)點(diǎn)(文章),可以實(shí)現(xiàn)無限遞歸添加子節(jié)點(diǎn),每篇文章最多只能含有一個父節(jié)點(diǎn),每個節(jié)點(diǎn)的文章都可以編輯刪除和添加子節(jié)點(diǎn),編輯文章時可以實(shí)現(xiàn)實(shí)時保存到數(shù)據(jù)庫,所有增刪查改操作都與RESTful API(NoteAPI)交互完成。遞歸操作大部分是前端Javascript完成的,結(jié)合使用Vue.js前端框架,以添加新文章節(jié)點(diǎn)為例,通過Vue.js的自定義組件遞歸添加節(jié)點(diǎn):
varnoteList = {
name: 'note-list',
template: '{note_list_html_source}',
props: ['note'],
methods: {
add_new_note: function(){
...
$.ajax({
url: '/api/note/'+that.note.note_id,
type: 'post',
data: {title: app.newNote},
success: function(data){ that.note.children.push(data) },
});},}}
var app = new Vue({
el: '#panel',
components:{ 'note-list': noteList },
methods:{
add_new_note: function(){
var that = this;
$.ajax({
...
success: function(data){
that.notes.push(data)
that.newNote = ''; },
});}}})
在系統(tǒng)中創(chuàng)建新的項(xiàng)目,并在對應(yīng)項(xiàng)目中輸入主機(jī)名或IP地址創(chuàng)建掃描任務(wù),創(chuàng)建的任務(wù)并發(fā)進(jìn)行,可以看到對應(yīng)任務(wù)的狀態(tài)以及結(jié)果,如下圖5所示。
圖5 掃描任務(wù)
輸入必填與選填參數(shù)之后,可以對目標(biāo)web應(yīng)用發(fā)起http請求,并附上自定義的payload(有效載荷)進(jìn)行漏洞測試,以存在s2-016反序列化漏洞的虛擬環(huán)境,測試有效載荷時選用了執(zhí)行系統(tǒng)命令“cat /etc/passwd”,測試的返回結(jié)果如下圖6所示。
圖6 執(zhí)行命令
根據(jù)標(biāo)題創(chuàng)建文章之后,可以根據(jù)summernote提供的格式,編輯文字及圖片,以添加超鏈接與直接粘貼圖片為例,如下圖7所示。
圖7 編輯文章
本文詳細(xì)介紹了一款基于Python的滲透測試輔助系統(tǒng)的設(shè)計與實(shí)現(xiàn)。其設(shè)計使用了Flask的Web應(yīng)用框架,并結(jié)合了RESTful的設(shè)計,后期也可以輕松實(shí)現(xiàn)功能擴(kuò)展。同時,創(chuàng)新地使用了Celery任務(wù)隊列,實(shí)現(xiàn)了異步任務(wù)的穩(wěn)定運(yùn)行。項(xiàng)目總共實(shí)現(xiàn)了三大基本功能模塊:資產(chǎn)整理、漏洞利用、隨手筆記。資產(chǎn)整理,針對目標(biāo)網(wǎng)絡(luò)主機(jī)的信息收集,探測并記錄主機(jī)開放的端口及服務(wù);漏洞利用,利用已知的應(yīng)用漏洞,對目標(biāo)Web應(yīng)用可能存在的利用點(diǎn)進(jìn)行檢測與利用;隨手筆記,記錄滲透測試過程中發(fā)現(xiàn)的有用信息(包括圖片與文字)。通過在實(shí)際環(huán)境進(jìn)行的大量掃描測試,與虛擬環(huán)境中Web應(yīng)用漏洞的測試,以及實(shí)際滲透測試過程中的筆記記錄,驗(yàn)證了以上三大模塊功能的實(shí)用性與準(zhǔn)確性。并在開發(fā)測試過程中總結(jié)出了以下幾點(diǎn)問題:采用Nmap作為資產(chǎn)整理模塊掃描器的核心,在掃描大量端口或主機(jī)時會因?yàn)榉阑饓Φ淖钃跸拇罅康臅r間,而且會被混淆正確的端口開放信息;漏洞利用模塊需要手動收集大量Payload(有效載荷),目前階段還欠缺豐富性。針對以上項(xiàng)目實(shí)測中發(fā)現(xiàn)的問題,將會在日后的學(xué)習(xí)中尋找解決辦法,爭取將該項(xiàng)目完善成更加方便的滲透測試輔助系統(tǒng)。
[1]王世偉.論信息安全、網(wǎng)絡(luò)安全、網(wǎng)絡(luò)空間安全[J].中國圖書館學(xué)報,2015.
[2]梁娟.基于黑盒的滲透測試技術(shù)研究[J].科技展望,2016.
[3]練斌,劉永鍵.滲透測試的信息收集工具設(shè)計與開發(fā)[J].安徽電子信息職業(yè)技術(shù)學(xué)院學(xué)報,2017.
[4]裴蘭珍,羅赟騫,景劼.網(wǎng)絡(luò)安全漏洞滲透測試框架綜述[J].電子信息對抗技術(shù),2016.
[5]楊超,徐如志,楊峰.基于消息隊列的多進(jìn)程數(shù)據(jù)處理系統(tǒng)[J].計算機(jī)工程與設(shè)計,2010.
[6]尚廣明.Nmap滲透測試指南[J].信息安全與通信保密,2015.
[7]李丹.網(wǎng)絡(luò)攻擊重放技術(shù)研究[D].北京郵電大學(xué),2014.
[8]劉志凱.基于Web的Python編程環(huán)境研究[D].新疆農(nóng)業(yè)大學(xué),2015.
2016年國家級、省級高等學(xué)校大學(xué)生創(chuàng)新創(chuàng)業(yè)訓(xùn)練計劃項(xiàng)目。