文/姜開達 武永興
(作者單位為上海交通大學)
CTF 競賽逐漸演變成為網(wǎng)絡安全競賽的一種重要形式
隨著全社會對網(wǎng)絡空間安全的重視程度日益增加,高校的網(wǎng)絡安全人才培養(yǎng)和各行業(yè)在職安全人員專業(yè)能力提升教育日益重要,網(wǎng)絡安全人才供不應求的局面還將長期持續(xù)。
各類網(wǎng)絡安全競賽作為培養(yǎng)安全人才,發(fā)現(xiàn)安全人才的有效途徑,這幾年在國內(nèi)出現(xiàn)了爆發(fā)式增長。比賽提供了一個完美的平臺,參與者能夠綜合運用各種手段,進行漏洞挖掘和有效利用,開展取證分析和積極防御,像攻擊者一樣來思考問題,在攻防相長的過程中完成自我升華。比賽選手或主動或被動,補全了計算機和網(wǎng)絡安全基礎理論知識,培養(yǎng)了從理論轉向實踐的動手能力,并且能夠在安全領域結合業(yè)務活學活用。同時伴隨競賽也凝聚了一支支蓬勃發(fā)展的安全團隊,他們有著共同的理想和奮斗目標,互相鼓舞激勵前行。
Capture The Flag(簡稱CTF)直譯為“奪旗賽”,起源于1996 年美國舉辦的DEF CON 全球黑客大會,最早是交流安全技術的重要途徑。隨著時間的推移,CTF 競賽逐漸演變成為網(wǎng)絡安全競賽的一種重要形式,發(fā)展成為全球范圍網(wǎng)絡安全圈的流行比賽,成為了學習鍛煉網(wǎng)絡安全技術,展現(xiàn)安全能力和水平的絕佳平臺。參賽隊伍需要通過解決網(wǎng)絡安全的技術問題來獲取盡可能多的flag。flag 可能來自于一臺遠端的服務器,一個復雜的軟件,也可能隱藏在一段通過密碼算法或協(xié)議加密的數(shù)據(jù),或是一組網(wǎng)絡流量及音頻視頻文件中。選手需要綜合利用自己掌握的安全技術,并輔以快速學習新知識,通過獲取服務器權限,分析并破解軟件或是設計解密算法等不限定途徑來獲取。
目前主流的網(wǎng)絡安全競賽體現(xiàn)為以下幾種形式:
1.解題賽(Jeopardy)
這是大多數(shù)國內(nèi)外CTF 比賽的主流形式,選手自由組隊參賽,題目通常在比賽過程中陸續(xù)放出。解出一道題目后,提交題目對應的flag 即可得分,比賽結束時分高者勝(同分時比較總提交時間)。為了向現(xiàn)實生活中實際場景靠攏,近年也出現(xiàn)了一種新的Real World 形式,題目載體一般是現(xiàn)實中真實出現(xiàn)過的漏洞。
2.攻防賽(AWD,Attack With Defense)
通常為現(xiàn)場比賽采用,是多數(shù)CTF決賽的比賽形式,選手自由組隊參賽,但通常隊伍人數(shù)會受到限制(3~6 人不等),比賽中更為注重臨場反應和解題速度,考察團隊多方面的綜合安全能力,要求攻防能力均衡,不能存在短板。
3.破解賽(Pwn)
國內(nèi)知名的破解賽有GeekPwn(極棒)安全極客大賽,“天府杯”國際網(wǎng)絡安全大賽等。這類比賽沒有明確命題和答案,主要來自參賽選手提交的0day 漏洞。
4.混合賽(Mix)
CTF 線下賽可能是解題賽,可能是攻防賽+解題賽,比如XCTF 國際網(wǎng)絡攻防聯(lián)賽總決賽,也有可能是攻防賽+Real World,比如第三屆強網(wǎng)杯全國網(wǎng)絡安全挑戰(zhàn)賽。
常見的比賽題目類型包含但不限于以下幾類:
1.Web 安全
通過瀏覽器訪問題目服務器上的網(wǎng)站,尋找網(wǎng)站漏洞,利用網(wǎng)站漏洞獲得服務器的部分或全部權限,拿到flag。具體考察:操作系統(tǒng)和網(wǎng)站應用服務器安全,網(wǎng)站多種語言源代碼審計分析(特別是php),數(shù)據(jù)庫管理和SQL 語句查詢,Web 漏洞挖掘和利用(SQL 注入和XSS 等),各種服務器提權,編寫代碼補丁并修復網(wǎng)站漏洞。
2.逆向工程
題目就是一個軟件,但通常沒有軟件的源代碼。需要利用工具對軟件進行反編譯甚至反匯編,從而理解軟件內(nèi)部邏輯和原理,找出與flag 計算相關的算法并破解這個算法,拿到flag。具體考察:Windows / Linux / Android 在 x86 / x86_64 /ARM 平臺多種編程語言的熟練掌握,對源代碼及二進制文件的分析和理解,對多種反編譯乃至反匯編逆向工具和脫殼調(diào)試技巧的熟練掌握,Android 移動應用APK文件的逆向分析,掌握加解密、內(nèi)核編程、算法、反調(diào)試和代碼混淆技術。
3.漏洞挖掘與漏洞利用
訪問一個本地或遠程的二進制服務程序,通過逆向工程找出程序中存在的漏洞,并利用程序中的漏洞獲取遠程服務器的部分或全部權限,拿到flag。具體考察:Windows / Linux 平臺的二進制程序漏洞挖掘,掌握C / C++ / Python / PHP / Java / Ruby/ 匯編等語言,掌握緩沖區(qū)溢出和格式化字符串攻擊,編寫shellcode 并進行利用。
4.密碼學
分析題目中的密碼算法與協(xié)議,利用算法或協(xié)議的弱點來計算密鑰或對密文進行解密,從而拿到flag。具體考察:掌握古典密碼學和現(xiàn)代密碼學,分析密碼算法和協(xié)議,計算密鑰和進行加解密操作。
5.其他雜類
利用隱寫術等保護技術將信息隱藏在圖像、音頻、視頻中,或者信息就在一段內(nèi)存鏡像或網(wǎng)絡流量中,嘗試將隱藏的信息恢復出來即可拿到flag。ACM 算法題,游戲或其他安全常識題目,都需要一定的編程基礎。具體考察:信息搜集能力,編程能力,移動(Mobile)應用安全,隱寫術和信息隱藏,計算機取證 (Forensics) 技術和文件恢復,計算機網(wǎng)絡基礎以及對網(wǎng)絡流量的分析能力。
目前國內(nèi)外安全比賽風起云涌,但也同時存在一些問題。比賽數(shù)量越來越多,幾乎每周都有比賽,但質(zhì)量參差不齊。國際比賽難度越來越高,對新人不友好,可能會打擊到入門新人的積極性。一些國內(nèi)比賽題目直接挪用以前的陳題,腦洞太大導致選手花費了很多時間卻沒有學到知識,還有一些隊伍為了利益或名聲存在作弊的行為。種種怪現(xiàn)象影響了安全比賽的健康發(fā)展。
高難度的競賽對選手的知識積累與技術熟練度要求非常高
現(xiàn)在很多比賽獎金不菲,但對于參與者來說,獎金并不是最吸引人的,最重要的還是賽題的質(zhì)量。好的題目能夠引導選手去注意到一些以前忽略的知識點,可以是一些新的利用方法,也可以是現(xiàn)實生活中遇到的漏洞的復現(xiàn)等等。要讓選手在經(jīng)過數(shù)小時奮戰(zhàn)之后,獲得感滿滿,而不是為了強行提升難度去增加腦洞題數(shù)量。
高難度的競賽對選手的知識積累與技術熟練度要求非常高,因此如果想要在競賽中取得好成績,需要首先具備扎實的計算機理論和實踐基礎。其中涉及到的重要基礎課程包括:計算機組成與系統(tǒng)結構、操作系統(tǒng)、編譯原理、數(shù)據(jù)結構、計算機網(wǎng)絡、密碼學、離散數(shù)學、數(shù)論、近世代數(shù)、數(shù)字電路等。
安全競賽已經(jīng)成為了安全從業(yè)人員非常好的入門途徑,獲獎經(jīng)歷也成為了很多學生求職的敲門磚,一些在安全賽場上表現(xiàn)出色的選手,在實際工作中同樣表現(xiàn)優(yōu)秀。對于參加比賽的選手來說,要想從一個比賽中有所收獲,首先要明白競賽題目和實戰(zhàn)的區(qū)別,比賽一般會涉及到最新的知識點,可能會觸及到知識的盲區(qū),這時不能產(chǎn)生畏難的情緒。參加比賽最鍛煉的不是技術水平,而是融會貫通,快速學習的能力。技術和知識可能會隨著時間而過時,但是快速學習的能力對個人的成長會一直有益。比賽之后要積極地和命題人交流,了解題目的考察點,有沒有非預期解法等,要樂于分享自己的解題思路(Writeup),和其他選手交流互通有無。最重要的是多尋找一些志同道合的伙伴,盡快參與到實際的競賽中來,隊員之間多交流,多總結,從而迅速熟悉當下競賽的題目風格和形式,通過實戰(zhàn)獲得能力上的最大提升,同時也能夠促進團隊的默契與凝聚力。知識的積累,能力的提升從來沒有快速通道,只有一次次地參與比賽挑戰(zhàn),長期沉淀下來才能小有所成。
紙上得來終覺淺,絕知此事要躬行,這也正是網(wǎng)絡安全競賽的魅力,吸引著一代代安全愛好者走入網(wǎng)絡空間的神秘殿堂。