江西外語外貿(mào)職業(yè)學(xué)院電子商務(wù)學(xué)院 江洋
CTF是Capture The Flag(奪旗賽)的簡稱,已經(jīng)成為全球范圍網(wǎng)絡(luò)安全圈流行的競賽形式,可以很好地鍛煉網(wǎng)絡(luò)安全人員的技術(shù)水平。如果能夠在網(wǎng)絡(luò)安全類課程中引入CTF的教學(xué)和練習(xí)模式,可以達(dá)到更好的教學(xué)效果。故而我們決定設(shè)計(jì)和搭建這樣一個(gè)平臺(tái)。首先來看看這個(gè)網(wǎng)絡(luò)教學(xué)平臺(tái)需要達(dá)到的功能要求,首先,需要先在系統(tǒng)建立一個(gè)題庫,包含CTF常見的幾大類題型(WEB,CRYPTO,REVERSE,PWN,MISC),要對題庫按照題型進(jìn)行分類,每一類題型中分出不同的難度等級,超級管理員應(yīng)該具有題庫的管理功能。其次,這個(gè)系統(tǒng)需要最基本的學(xué)生注冊和登錄功能,教師賬號需要有班級設(shè)置和作業(yè)布置、批改的功能。超級管理員可以對教師賬號和學(xué)生賬號進(jìn)行管理。為了增加學(xué)生的學(xué)習(xí)興趣和學(xué)習(xí)積極性,增加組隊(duì)PK的競賽功能。參見圖1。
圖1 網(wǎng)絡(luò)安全平臺(tái)功能分析
技術(shù)架構(gòu)選擇方面,使用Python的WEB框架Flask,存儲(chǔ)數(shù)據(jù)庫使用mysql,緩存數(shù)據(jù)庫使用redis。選好了技術(shù)架構(gòu)之后,進(jìn)行關(guān)系型數(shù)據(jù)庫的設(shè)計(jì),首先,需要一個(gè)題庫類型的數(shù)據(jù)表,字段需要包含主鍵、類型名稱。其次,需要一個(gè)題庫表,需要包含的字段有主鍵、習(xí)題名稱、習(xí)題類型ID、習(xí)題詳情。針對賬號系統(tǒng),需要一個(gè)教師賬號表、一個(gè)學(xué)生賬號表、一個(gè)班級表、一個(gè)班級成員表。針對作業(yè)布置系統(tǒng),需要設(shè)計(jì)作業(yè)表。針對組隊(duì)PK系統(tǒng),我們需要設(shè)計(jì)隊(duì)伍表、競賽試題表。
基于設(shè)計(jì)好的數(shù)據(jù)庫系統(tǒng),進(jìn)行WEB層面的設(shè)計(jì)和開發(fā)。首先設(shè)計(jì)用戶登錄系統(tǒng),這里,使用內(nèi)存數(shù)據(jù)庫redis來進(jìn)行會(huì)話管理,首先用戶輸入用戶名和密碼,服務(wù)器驗(yàn)證通過之后,在redis生成一個(gè)鍵值對,鍵為一個(gè)隨機(jī)值,通過http返回給瀏覽器存儲(chǔ)于cookie中;對應(yīng)的值記錄了用戶的身份信息。瀏覽器訪問服務(wù)器的請求中攜帶cookie信息,服務(wù)器接收到請求,根據(jù)cookie信息在redis中查找用戶對應(yīng)的身份信息,如果查到了就可以識(shí)別為某個(gè)具體的用戶,如果沒有查詢到redis中的記錄情況,有可能是登錄信息過期,需要引導(dǎo)用戶重新登錄。
其次,需要對題庫系統(tǒng)進(jìn)行設(shè)計(jì)與開發(fā)。整個(gè)系統(tǒng)的超級管理員應(yīng)該能夠?qū)α?xí)題庫進(jìn)行增刪改查操作。教師用戶可以從題庫中進(jìn)行特定條件的篩選和查看,同時(shí)還可以選擇一部分題目發(fā)布作業(yè)。因?yàn)轭}目需要進(jìn)行分類,所有這里系統(tǒng)中會(huì)有一個(gè)題庫類型表,在習(xí)題表中添加一個(gè)類型字段,在這個(gè)字段填寫習(xí)題類型編號來標(biāo)記每一道題目的具體類型,參見圖2。
圖2 關(guān)系型數(shù)據(jù)庫設(shè)計(jì)圖
再次,搭建組隊(duì)PK競賽系統(tǒng),這里編寫WEB邏輯,讓普通用戶可以組隊(duì),超級管理員可以進(jìn)行競賽題目的挑選和組織,同時(shí),在組隊(duì)競賽的過程中,以計(jì)分板的形式來顯示各個(gè)隊(duì)伍的得分排行榜。為了完成這個(gè)功能,需要一個(gè)隊(duì)伍得分記錄表,隊(duì)伍字段填寫隊(duì)伍的主鍵ID,題目記錄解決的CTF題目ID,得分字段用來記錄對應(yīng)的得分。為了做出排行版的功能,需要不斷地查詢某個(gè)隊(duì)伍的所有得分記錄,并且相加算出總分。這樣的操作,需要對每個(gè)隊(duì)伍都計(jì)算一遍。最后還要把所有隊(duì)伍的分?jǐn)?shù)從高到低排序進(jìn)行顯示。為了降低mysql數(shù)據(jù)庫的連接和查詢負(fù)載,在系統(tǒng)中使用Linux的crontab定時(shí)任務(wù),每分鐘執(zhí)行一次以上操作,把查詢結(jié)果存儲(chǔ)到內(nèi)存型數(shù)據(jù)庫redis中,在WEB服務(wù)中,每次訪問排行榜功能頁面的時(shí)候,系統(tǒng)都會(huì)從redis中讀取排行榜數(shù)據(jù),從而降低了mysql關(guān)系型數(shù)據(jù)庫的工作負(fù)擔(dān)。
最后,開始整個(gè)系統(tǒng)的搭建工作,操作系統(tǒng)選擇了Centos7 64位版本的Linux,容器技術(shù)方面選擇了Docker技術(shù),接著使用Docker運(yùn)行Flask(負(fù)責(zé)系統(tǒng)Web邏輯)、mariadb(存儲(chǔ)關(guān)系型數(shù)據(jù))和redis(負(fù)責(zé)會(huì)話管理和數(shù)據(jù)緩存)。
在CTF題型選擇方面,WEB、CRYPTO、REVERSE、PWN、MISC這 五個(gè)方向都有所涉及,在WEB方面,將SQL注入和代碼審計(jì)作為重點(diǎn)題型。SQL注入是Web系統(tǒng)存在最廣泛的漏洞,原理相對簡單,主要是由于系統(tǒng)開發(fā)人員在開發(fā)客戶和關(guān)系型數(shù)據(jù)庫交互的邏輯代碼時(shí),沒有對客戶輸入的字符串進(jìn)行轉(zhuǎn)義和過濾,處理和限制不夠嚴(yán)謹(jǐn),導(dǎo)致客戶可以通過輸入他精心構(gòu)置拼接的字符串,從而非法獲取得到信息系統(tǒng)數(shù)據(jù)庫當(dāng)中的數(shù)據(jù)。SQL注入有很多種類,按照數(shù)據(jù)類型進(jìn)行分類有字符型、數(shù)字型和搜索型,按照Web應(yīng)用程序提交方式可以分類為HTTP請求頭注入、POST型、GET型、Cookie型;按照執(zhí)行的具體效果可以分類為堆查詢注入、盲注、報(bào)錯(cuò)注入和聯(lián)合查詢注入。
代碼審計(jì)具體指的是對源代碼進(jìn)行檢查,尋找代碼中的安全缺陷、漏洞和bug,這需要操作者有多方面的技能和技術(shù),其中包括編程技術(shù)、漏洞原理、中間件和操作系統(tǒng)的系統(tǒng)服務(wù),前端技術(shù)涉及html、javascript、dom等,相關(guān)可以挖掘的漏洞有xss漏洞、CSRF漏洞和JSON劫持等。后端編程語言涉及php、python和java,目前基本上所有的WEB應(yīng)用程序都是基于MVC模式編寫的,理解MVC的工作模式和原理,才能很好地進(jìn)行后端漏洞的挖掘和利用。MVC即是model、view和controller。model就是模型層,用來和持久層對接,能夠?qū)﹃P(guān)系型數(shù)據(jù)庫進(jìn)行增刪改查的具體操作。view是視圖層,負(fù)責(zé)html模板的數(shù)據(jù)渲染,controller是控制器,可以和相應(yīng)的url進(jìn)行綁定,從而進(jìn)行相應(yīng)業(yè)務(wù)的處理,接受HTTP請求,進(jìn)行HTTP響應(yīng)。MVC是一種業(yè)務(wù)邏輯,顯示界面和數(shù)據(jù)分離的方式來組織代碼,將具體的業(yè)務(wù)邏輯組織到一個(gè)組件里面,在用戶交互、改進(jìn)和個(gè)性化制定用戶界面的同時(shí),不用重新改動(dòng)業(yè)務(wù)邏輯。
在CRYPTO方面,主要涉及古典密碼學(xué)和現(xiàn)代密碼學(xué),古典密碼學(xué)是一種實(shí)用性存在,它的編碼和破譯常常依賴于設(shè)計(jì)者和破解者的技巧和創(chuàng)造力,主要包含三種類型,單表替換加密、多表替換加密和特殊的加密方式。而現(xiàn)代密碼學(xué)來源于20世紀(jì)中期的大量理論研究,1949年香農(nóng)發(fā)表題為《保密系統(tǒng)的通信理論》的論文,標(biāo)志著現(xiàn)代密碼學(xué)的開端?,F(xiàn)代密碼學(xué)主要包含四個(gè)方面:對稱加密(典型應(yīng)用有DES,AES,RC4),非對稱加密(典型應(yīng)用有橢圓曲線加密,RSA,EIGamal),哈希函數(shù)(典型應(yīng)用有SHA-1,SHA-512,MD5),數(shù)字簽名(典型應(yīng)用有DSA簽名,RSA簽名,EIGamal簽名)。
在REVERSE方面,主要涉及反匯編和調(diào)試等技術(shù)手段,分析計(jì)算機(jī)應(yīng)用程序的二進(jìn)制代碼,研究程序的具體算法實(shí)現(xiàn)細(xì)節(jié)和原理。主要應(yīng)用范圍有應(yīng)用軟件漏洞挖掘,移動(dòng)安全,軟件的破解和反破解,惡意代碼地分析和判斷。具體題目考察形式是通過對一個(gè)二進(jìn)制應(yīng)用程序(windows平臺(tái)的exe文件和dll文件或者是Linux平臺(tái)的elf文件)進(jìn)行逆向分析,分析和掌握應(yīng)用程序內(nèi)部的運(yùn)行機(jī)制,考察形式主要看最終是否能夠得到一個(gè)預(yù)先設(shè)置好的密碼,或者編寫一個(gè)注冊器,用來在給定一個(gè)用戶名的情況下,計(jì)算出對應(yīng)的驗(yàn)證碼。
在PWN方面,主要涉及緩沖區(qū)溢出漏洞的挖掘和防護(hù),計(jì)算機(jī)應(yīng)用程序的運(yùn)行依賴棧中的函數(shù)調(diào)用棧。緩沖區(qū)溢出具體是指在棧內(nèi)寫入超出長度限制的數(shù)據(jù),從而干擾程序運(yùn)行的流程和方向,進(jìn)而獲得系統(tǒng)控制權(quán)的攻擊手段。為了實(shí)現(xiàn)緩沖區(qū)溢出,需要滿足兩個(gè)基本條件:應(yīng)用程序要有向棧內(nèi)寫入數(shù)據(jù)的行為,應(yīng)用程序沒有限制寫入數(shù)據(jù)的長度。題目按照技術(shù)手段分為三個(gè)大類:修改應(yīng)用程序返回地址,使它指向溢出數(shù)據(jù)中的一段shellcode;修改應(yīng)用程序返回地址,讓它指向計(jì)算機(jī)內(nèi)存中已經(jīng)存在的某個(gè)函數(shù);修改應(yīng)用程序返回地址,讓它指向內(nèi)存中已經(jīng)存在的一段二進(jìn)制指令。
在MISC方面,題目涉及電子取證、人肉搜索、數(shù)據(jù)分析、流量分析和數(shù)據(jù)隱寫。主要考察做題人的快速理解能力、學(xué)習(xí)能力、日常知識(shí)積累,反應(yīng)速度和聯(lián)想能力。
所有習(xí)題,都會(huì)通過Docker封裝上傳到系統(tǒng),Docker是開發(fā)人員和系統(tǒng)管理員使用容器開發(fā),部署和運(yùn)行應(yīng)用程序的平臺(tái)。使用Docker可以輕松部署開發(fā)好的應(yīng)用程序。使用Docker部署應(yīng)用程序有很多優(yōu)點(diǎn):可以垂直的堆疊服務(wù);可以增加和分發(fā)容器副本;可以共享服務(wù)器CPU內(nèi)核;可以封裝復(fù)雜的應(yīng)用程序。
通過以上的設(shè)計(jì)和技術(shù)選擇,設(shè)計(jì)并搭建了一個(gè)基于CTF模式的網(wǎng)絡(luò)教學(xué)平臺(tái),導(dǎo)入題庫之后,把這個(gè)平臺(tái)引入到了高職網(wǎng)絡(luò)安全的課程教學(xué)中,取得了很好的教學(xué)效果。