CTF入門(mén)全攻略:從五大方向到靶場(chǎng)練習(xí)路線)
在技術(shù)圈里CTF這幾年是真火但很多剛接觸的朋友普遍有一個(gè)感覺(jué)資料太散了。今天搜到一個(gè)WP明天看到一個(gè)工具推薦后天又有人推薦一個(gè)靶場(chǎng)信息全是一塊一塊的根本串不起來(lái)。我早年入門(mén)的時(shí)候也這樣?xùn)|拼西湊摸索了大半年才把整個(gè)知識(shí)框架搭起來(lái)中間走了不少?gòu)澛贰K赃@篇東西我想了很久決定不搞那些虛的直接把零基礎(chǔ)入門(mén)CTF最該知道的東西一次性捋清楚——從CTF到底是什么、比賽有哪些形式到Web、Pwn、逆向、密碼學(xué)、雜項(xiàng)這五個(gè)方向分別學(xué)什么、練什么再到推薦哪些靶場(chǎng)、裝哪些工具、怎么做學(xué)習(xí)筆記。你照著這條路線走能少花很多冤枉時(shí)間。先說(shuō)清楚這篇文章適合誰(shuí)看。如果你是完全沒(méi)有接觸過(guò)CTF的小白也基本沒(méi)寫(xiě)過(guò)代碼那我建議你不要急著刷題先花點(diǎn)時(shí)間把基礎(chǔ)概念搞明白這篇文章會(huì)一步步告訴你每個(gè)階段該干什么。如果你已經(jīng)學(xué)過(guò)一些編程或者接觸過(guò)網(wǎng)絡(luò)安全的基礎(chǔ)知識(shí)那你可以直接跳到對(duì)應(yīng)方向的部分把工具鏈和靶場(chǎng)路線吃透。這篇文章不適合誰(shuí)看不適合那種想靠看一篇指南就變成大佬的人CTF這種事情最終還是得靠手上功夫文章只能幫你少走彎路不能代替你敲鍵盤(pán)。1. CTF入門(mén)前的核心認(rèn)知比賽形態(tài)與選手分工1.1 CTF到底考的是什么為什么值得花時(shí)間CTF全稱(chēng)Capture The Flag翻譯過(guò)來(lái)就是奪旗賽。比賽的核心邏輯很簡(jiǎn)單主辦方在一堆事先設(shè)計(jì)好的題目環(huán)境里藏了flag字符串你的任務(wù)就是通過(guò)各種技術(shù)手段把flag找出來(lái)提交拿到分?jǐn)?shù)。聽(tīng)起來(lái)像是黑客攻防游戲但實(shí)際上它是一項(xiàng)非常體系化的信息安全能力競(jìng)技。早期CTF更偏向于“破解”的概念題目類(lèi)型比較單一主要是二進(jìn)制逆向和漏洞利用。發(fā)展到現(xiàn)在比賽形式已經(jīng)豐富了很多主流題目方向通常分為五類(lèi)Web安全、逆向工程、Pwn二進(jìn)制漏洞利用、密碼學(xué)、雜項(xiàng)Misc另外還有一類(lèi)近年新起的區(qū)塊鏈方向但上手門(mén)檻較高入門(mén)階段可以先不碰。為什么建議零基礎(chǔ)的人用CTF來(lái)入門(mén)網(wǎng)絡(luò)安全因?yàn)镃TF的學(xué)習(xí)路徑是高度目標(biāo)驅(qū)動(dòng)的——你解題得到flag有即時(shí)的正向反饋。這跟你看一本書(shū)從頭啃到尾是完全不同的體驗(yàn)。我在實(shí)際帶人的過(guò)程中發(fā)現(xiàn)很多完全沒(méi)寫(xiě)過(guò)代碼的新手反而是通過(guò)打CTF題先理解了HTTP協(xié)議、二進(jìn)制文件結(jié)構(gòu)這些底層概念然后再回頭去補(bǔ)編程基礎(chǔ)的。所以如果你對(duì)網(wǎng)絡(luò)安全有興趣又擔(dān)心自己基礎(chǔ)不夠不妨直接用一種“解題驅(qū)動(dòng)學(xué)習(xí)”的思路來(lái)入門(mén)效率會(huì)比死磕書(shū)本高很多。1.2 AWD、解題賽與滲透測(cè)試的真實(shí)區(qū)別很多新人分不清CTF和滲透測(cè)試的關(guān)系這里必須做一個(gè)明確區(qū)分。CTF里的Web方向題目比如SQL注入、文件上傳、命令執(zhí)行本質(zhì)上是在一個(gè)極其理想化的環(huán)境里考察某個(gè)單一漏洞點(diǎn)。而真實(shí)滲透測(cè)試中的Web攻擊往往要面對(duì)的是復(fù)雜的業(yè)務(wù)邏輯、WAF過(guò)濾、內(nèi)網(wǎng)橫向滲透等一系列現(xiàn)實(shí)問(wèn)題。所以CTF練的是“單點(diǎn)突破的能力底子”滲透測(cè)試是“綜合應(yīng)用的場(chǎng)景實(shí)踐”前者是后者的必經(jīng)之路但不能畫(huà)等號(hào)。比賽形式方面入門(mén)階段你主要會(huì)碰到三種傳統(tǒng)解題賽Jeopardy所有題目掛在平臺(tái)上分方向分難度選手自己做題拿分適合新手訓(xùn)練和團(tuán)隊(duì)磨合。AWD攻防賽Attack With Defense每個(gè)隊(duì)伍維護(hù)自己的靶機(jī)既要修補(bǔ)漏洞防住別人攻擊又要寫(xiě)出利用腳本打別人非常激烈一般適合有一定基礎(chǔ)后再參加。滲透實(shí)戰(zhàn)賽給你一個(gè)模擬的真實(shí)業(yè)務(wù)環(huán)境要求在限定時(shí)間內(nèi)拿到指定數(shù)據(jù)題目偏綜合通常面向有經(jīng)驗(yàn)的選手。對(duì)于零基礎(chǔ)新人建議從解題賽開(kāi)始先在單一方向建立信心把每類(lèi)題目的常見(jiàn)套路摸清楚。不要一上來(lái)就報(bào)AWD那種模式對(duì)新手很不友好容易被打到懷疑人生。2. 零基礎(chǔ)入門(mén)路線拆解從搭環(huán)境到掌握五個(gè)方向2.1 環(huán)境準(zhǔn)備這些基礎(chǔ)工具提前裝好能省一個(gè)月時(shí)間工欲善其事必先利其器這句話在CTF里特別真實(shí)。我給所有跟我一起學(xué)習(xí)的朋友都建議過(guò)一個(gè)最小化起步工具清單先把這幾樣裝好其余工具等做題過(guò)程中缺什么再補(bǔ)什么千萬(wàn)別一上來(lái)就裝一大堆結(jié)果一個(gè)都用不熟。首選操作系統(tǒng)方面我建議直接用Kali Linux或者退一步用Ubuntu虛擬機(jī)。Kali里預(yù)裝了大量的安全工具最關(guān)鍵的是省去了很多環(huán)境配置的麻煩。我自己早期直接在Windows上做過(guò)題后來(lái)發(fā)現(xiàn)很多工具在Linux下跑起來(lái)確實(shí)更順比如后面會(huì)提到的Pwntools、GDB插件這些在Windows下配置成本實(shí)在太高。裝系統(tǒng)這件事上我給的建議是能用虛擬機(jī)就別雙系統(tǒng)VMware或者VirtualBox都行等你真的確定要走這條路了再考慮物理機(jī)安裝。編程基礎(chǔ)方面至少要把Python學(xué)明白。CTF里Python是最通用的語(yǔ)言寫(xiě)腳本跑爆破、處理數(shù)據(jù)、調(diào)Pwntools接口全靠它。不需要學(xué)到多深的程度列表、字典、文件讀寫(xiě)、requests庫(kù)、subprocess調(diào)用這幾個(gè)點(diǎn)能熟練使用就夠了。另外建議補(bǔ)一點(diǎn)Linux命令行基礎(chǔ)比如文件權(quán)限、進(jìn)程管理、網(wǎng)絡(luò)端口查看這些幾乎每道題都會(huì)用上。2.2 Web方向入門(mén)從HTTP協(xié)議到常見(jiàn)漏洞利用Web方向是新手最推薦優(yōu)先接觸的方向原因有三個(gè)一是它不像Pwn和逆向那樣需要很強(qiáng)的底層基礎(chǔ)二是Web方向的知識(shí)在日后工作中轉(zhuǎn)化率最高三是Web題目的反饋?zhàn)钪庇^你在瀏覽器里改個(gè)參數(shù)可能就拿到flag了正反饋非常強(qiáng)。Web方向的核心知識(shí)鏈?zhǔn)沁@樣的先搞懂HTTP協(xié)議的基礎(chǔ)包括請(qǐng)求方法、請(qǐng)求頭、Cookie機(jī)制、狀態(tài)碼這些然后學(xué)習(xí)前后端交互的基本邏輯知道參數(shù)是從哪里傳遞到哪里的接著再逐個(gè)學(xué)習(xí)常見(jiàn)漏洞類(lèi)型。對(duì)于新手優(yōu)先級(jí)最高的漏洞類(lèi)型是SQL注入、XSS跨站腳本、文件上傳、命令執(zhí)行、SSRF、反序列化。以SQL注入為例它的核心本質(zhì)是開(kāi)發(fā)者沒(méi)有對(duì)用戶輸入做過(guò)濾導(dǎo)致輸入的惡意SQL代碼拼接進(jìn)了后端查詢語(yǔ)句。新手學(xué)習(xí)時(shí)不應(yīng)該只背工具用法而是應(yīng)該手工先試一遍聯(lián)合查詢注入的完整流程判斷注入點(diǎn)、確定字段數(shù)、查庫(kù)名、查表名、查字段名、拿數(shù)據(jù)。這個(gè)“手工走一遍”的過(guò)程能幫你建立非常扎實(shí)的漏洞利用思維而不是只會(huì)丟一個(gè)sqlmap上去。學(xué)Web方向的實(shí)操建議先把靶場(chǎng)里的簡(jiǎn)單題刷到30道以上不追求速度每一道題做完都要在筆記里寫(xiě)明漏洞成因和利用流程。我見(jiàn)過(guò)太多人刷題只刷數(shù)量結(jié)果做完就忘下次碰到同樣的知識(shí)點(diǎn)還是不會(huì)。2.3 Pwn與逆向方向讀懂底層才能掌握主動(dòng)權(quán)Pwn和逆向通常被新手視為“勸退方向”因?yàn)檫@兩個(gè)方向確實(shí)需要一定的計(jì)算機(jī)底層知識(shí)。但我個(gè)人認(rèn)為如果你想在CTF這條路上走得更遠(yuǎn)哪怕最終主攻Web也值得了解一些二進(jìn)制方向的基礎(chǔ)概念。Pwn方向的核心是漏洞利用常見(jiàn)題型是棧溢出、堆溢出、格式化字符串等最終目標(biāo)是通過(guò)精心構(gòu)造的輸入數(shù)據(jù)控制程序執(zhí)行流程拿到shell或者讀取flag文件。學(xué)Pwn需要掌握的知識(shí)包括C語(yǔ)言內(nèi)存模型、函數(shù)調(diào)用棧結(jié)構(gòu)、匯編語(yǔ)言基礎(chǔ)x86和x64、GDB調(diào)試器的使用、ELF文件格式。逆向方向的核心是分析和破解常見(jiàn)題型是把一個(gè)可執(zhí)行程序進(jìn)行反編譯分析理解其加密算法或驗(yàn)證邏輯從而寫(xiě)出對(duì)應(yīng)的解密腳本。新手練習(xí)逆向建議先學(xué)會(huì)用IDA或者Ghidra打開(kāi)一個(gè)簡(jiǎn)單的二進(jìn)制文件看懂main函數(shù)的基本邏輯然后逐步接觸更復(fù)雜的混淆和反調(diào)試技巧。這里我特別想提醒一點(diǎn)不要因?yàn)橛X(jué)得Pwn和逆向“看起來(lái)很難”就直接放棄。我在實(shí)際學(xué)習(xí)過(guò)程中發(fā)現(xiàn)只要把C語(yǔ)言指針和函數(shù)調(diào)用棧這兩塊搞明白很多Pwn入門(mén)的棧溢出題是可以看懂的。建議新手在入門(mén)階段花一兩周時(shí)間認(rèn)識(shí)一下寄存器、棧幀、匯編指令這些基礎(chǔ)概念不求精通但求不陌生。這樣一來(lái)后續(xù)哪怕你主攻Web方向在遇到需要逆向分析惡意樣本或者調(diào)試程序時(shí)也不會(huì)無(wú)從下手。2.4 密碼學(xué)方向數(shù)學(xué)很重要但新手先掌握套路密碼學(xué)方向在很多新人眼中容易走偏以為要先學(xué)習(xí)高深的數(shù)學(xué)知識(shí)才能做題。實(shí)際上CTF中的密碼學(xué)題目更偏向于“密碼分析”的套路應(yīng)用對(duì)數(shù)學(xué)的要求遠(yuǎn)沒(méi)有想象中那么高當(dāng)然想進(jìn)階深入學(xué)習(xí)那就另說(shuō)了。CTF密碼學(xué)常見(jiàn)題型包括編碼轉(zhuǎn)換Base64、Hex、URL編碼等、古典密碼凱撒、維吉尼亞、柵欄等、現(xiàn)代密碼RSA、AES、DES等、以及一些哈希長(zhǎng)度擴(kuò)展攻擊、偽隨機(jī)數(shù)預(yù)測(cè)等進(jìn)階題型。新手入門(mén)密碼學(xué)第一步是要學(xué)會(huì)“識(shí)別”看到一串字符串能快速判斷出它大概是什么編碼或者什么加密方式。這一步練好了很多送分題你一眼就能解出來(lái)。第二步要熟練使用CyberChef這個(gè)工具它的英文名叫“網(wǎng)絡(luò)安全廚刀”可以理解成一個(gè)魔法般的在線數(shù)據(jù)轉(zhuǎn)換工具箱支持幾百種編碼、加密、解析操作拖拽式操作非常方便80%的密碼學(xué)送分題都能在里面解決。第三步才是針對(duì)RSA等算法的專(zhuān)項(xiàng)學(xué)習(xí)。RSA題目的常見(jiàn)攻擊方式有低加密指數(shù)攻擊、共模攻擊、已知p和q求私鑰等。新手先不要去看復(fù)雜的數(shù)學(xué)證明而是先用腳本把常見(jiàn)攻擊方式跑通理解每種攻擊適用的場(chǎng)景條件等你刷題量上去了回頭再補(bǔ)數(shù)學(xué)原理那時(shí)理解深度會(huì)完全不同。2.5 雜項(xiàng)方向腦洞與敏感度決定得分效率雜項(xiàng)Misc在CTF里是一個(gè)很有意思的“垃圾桶”方向涵蓋范圍極廣文件分析、流量分析、圖片隱寫(xiě)、音頻隱寫(xiě)、取證分析、社工等等。這個(gè)方向?qū)A(chǔ)知識(shí)的要求相對(duì)低但對(duì)常識(shí)積累和腦洞的要求非常高。新手在Misc方向最容易出現(xiàn)的問(wèn)題是“我明明知道這道題考的是圖片隱寫(xiě)但就是沒(méi)有思路。”原因在于你不知道有哪些隱寫(xiě)手法。圖片隱寫(xiě)常見(jiàn)的有LSB隱寫(xiě)像素最低有效位藏信息、附加數(shù)據(jù)隱寫(xiě)、EXIF信息、GIF幀分離等。你只有把這些手法都接觸過(guò)一遍看到圖片才會(huì)有條件反射。我的建議是新手可以把Misc當(dāng)成“開(kāi)胃菜”在刷Web方向累的時(shí)候穿插著做幾道順便積累一些文件格式知識(shí)和取證工具用法。這方向不用刻意投入大量時(shí)間但保持日常接觸非常重要因?yàn)楸荣悤r(shí)Misc題目往往是最容易拿分的“保底題”。3. 靶場(chǎng)練習(xí)路線從新手村到實(shí)戰(zhàn)賽場(chǎng)的階梯3.1 新手首選靶場(chǎng)推薦與對(duì)比學(xué)習(xí)任何技術(shù)都離不開(kāi)練習(xí)環(huán)境CTF更是如此。下面這幾個(gè)靶場(chǎng)是我個(gè)人和身邊人用得比較多、口碑比較穩(wěn)定的我按難度和適用階段做了區(qū)分。靶場(chǎng)名稱(chēng)難度梯度適用階段推薦理由BuuCTF低到中入門(mén)到進(jìn)階題目量大覆蓋方向全適合日常刷題攻防世界低到中入門(mén)到進(jìn)階有專(zhuān)門(mén)的新手練習(xí)區(qū)題目分類(lèi)清晰XCTF社區(qū)中到高進(jìn)階匯集了大量歷年賽題適合模擬真實(shí)比賽Pwnable.tw中到高Pwn專(zhuān)項(xiàng)進(jìn)階Pwn題目質(zhì)量高階梯設(shè)計(jì)合理CryptoHack低到中密碼學(xué)專(zhuān)項(xiàng)交互式密碼學(xué)學(xué)習(xí)平臺(tái)題解詳細(xì)本地DVWA靶場(chǎng)低Web入門(mén)必做本地搭建適合反復(fù)練習(xí)SQL注入等基礎(chǔ)Web漏洞我在實(shí)際帶新人的過(guò)程中一般的推薦順序是先在攻防世界的新手區(qū)過(guò)一遍對(duì)手感和題型有一定認(rèn)知后再去BuuCTF大量刷題因?yàn)锽uuCTF很多題目是從各大比賽中收集來(lái)的難度梯度比較友好。當(dāng)你覺(jué)得自己在一個(gè)方向上已經(jīng)比較熟練了再針對(duì)性地去專(zhuān)項(xiàng)靶場(chǎng)Pwnable.tw、CryptoHack做拔高訓(xùn)練。3.2 如何制定屬于自己的刷題路線靶場(chǎng)選好了接下來(lái)就是路線問(wèn)題。我自己帶過(guò)不少零基礎(chǔ)的朋友發(fā)現(xiàn)一個(gè)普遍規(guī)律凡是瞎刷題的人三個(gè)月后基本還在原地踏步凡是按路線刷題的人三個(gè)月就能達(dá)到中等難度賽題的水平。我給零基礎(chǔ)新人推薦的刷題路線是“先Web后Misc再密碼學(xué)最后按需涉獵Pwn/逆向”。這個(gè)順序的核心邏輯是Web方向的題目最容易建立正反饋Misc方向最有利于積累常識(shí)和工具熟練度密碼學(xué)方向需要一定的腳本能力但套路固定Pwn和逆向則放在最后且不需要人人深入掌握。具體來(lái)說(shuō)第一階段前兩周每天做2到3道Web方向的簡(jiǎn)單題同時(shí)穿插1道Misc題來(lái)調(diào)節(jié)腦回路。第二階段第三周到第六周每天刷1道中等難度的Web題開(kāi)始接觸密碼學(xué)方向的常見(jiàn)套路。第三階段第七周以后根據(jù)自己的興趣和職業(yè)規(guī)劃選擇主攻方向比如想做安全的可以主攻Web密碼學(xué)對(duì)二進(jìn)制感興趣的主攻Pwn逆向然后圍繞主攻方向集中刷題。這里必須提醒一點(diǎn)刷題過(guò)程中如果一道題卡了超過(guò)兩小時(shí)還完全沒(méi)有思路果斷看WriteUp題解看懂之后立刻自己重新做一遍最好能不看題解獨(dú)立復(fù)現(xiàn)。千萬(wàn)不要死磕CTF的題目數(shù)量是無(wú)限的時(shí)間卻是有限的看題解本身也是一種學(xué)習(xí)方式只要你不是看了就忘就行。3.3 團(tuán)隊(duì)訓(xùn)練與個(gè)人練習(xí)的節(jié)奏安排很多新人會(huì)問(wèn)我應(yīng)該自己?jiǎn)尉氝€是找隊(duì)伍一起練我的觀點(diǎn)是前期一定要單練后期必須要有團(tuán)隊(duì)。單練是為了打基礎(chǔ)團(tuán)隊(duì)是為了提上限。前1到3個(gè)月的個(gè)人練習(xí)期目標(biāo)是把五個(gè)方向的常見(jiàn)題型都刷過(guò)一遍建立自己的知識(shí)框架和筆記體系。這個(gè)階段一個(gè)人的效率其實(shí)是最高的因?yàn)槟憧梢酝耆醋约旱墓?jié)奏安排時(shí)間不受隊(duì)友進(jìn)度影響。3個(gè)月之后當(dāng)你已經(jīng)能獨(dú)立做出一些中等難度的題目就應(yīng)該開(kāi)始找小隊(duì)了。CTF比賽題目通常數(shù)量多、覆蓋廣一個(gè)人很難在比賽時(shí)間內(nèi)完成所有方向的題目分工協(xié)作幾乎是必須的。團(tuán)隊(duì)訓(xùn)練的方式可以是每周固定時(shí)間一起打一場(chǎng)線上賽賽后集中復(fù)盤(pán)每個(gè)人負(fù)責(zé)自己擅長(zhǎng)的方向把解題思路講給隊(duì)友聽(tīng)。這個(gè)過(guò)程既鍛煉表達(dá)能力也能幫你發(fā)現(xiàn)自己知識(shí)體系里的盲區(qū)——如果你不能把一道題的解法給別人講明白說(shuō)明你還沒(méi)有真正掌握它。4. 常用工具包盤(pán)點(diǎn)每個(gè)方向的核心工具與用法示例4.1 Web方向工具鏈從Burp Suite到SQLMapWeb方向最核心的工具也是我建議你花最多時(shí)間搞熟練的就是Burp Suite。它本質(zhì)上是一個(gè)攔截代理工具可以理解成瀏覽器和服務(wù)器之間的“中間人”你能通過(guò)它查看和修改所有經(jīng)過(guò)的HTTP請(qǐng)求和響應(yīng)這是手工測(cè)試Web漏洞的基礎(chǔ)中的基礎(chǔ)。Burp Suite的核心功能我建議按順序掌握Proxy模塊抓包改包、Repeater模塊手動(dòng)重放請(qǐng)求、Intruder模塊暴力破解和參數(shù)爆破、Decoder模塊編解碼。新手最容易忽略的是Decoder模塊但它在處理各種編碼混淆時(shí)特別好用尤其是碰到多重編碼的參數(shù)時(shí)可以省去你在終端里手動(dòng)解碼的時(shí)間。SQLMap也是Web方向必備的自動(dòng)化注入工具但我必須強(qiáng)調(diào)一點(diǎn)SQLMap只能作為輔助不能作為依賴。很多新手學(xué)會(huì)SQLMap之后就再也不想手工注入了結(jié)果一到比賽遇到有WAF攔截或者需要繞過(guò)的題就傻眼了。正確用法是先手工理解漏洞點(diǎn)再用工具提高效率。其他常用工具還包括dirsearch目錄掃描、Nmap端口掃描、御劍目錄掃描Windows下常用、中國(guó)蟻劍Webshell管理。4.2 Pwn與逆向方向工具鏈IDA、GDB與PwntoolsPwn方向最核心的工具組合是Pwntools GDB IDA/Ghidra。Pwntools是Python編寫(xiě)的一個(gè)漏洞利用開(kāi)發(fā)框架簡(jiǎn)單來(lái)說(shuō)它讓你用Python腳本去構(gòu)造和發(fā)送惡意數(shù)據(jù)從而實(shí)現(xiàn)控制程序流程的目的。新手入門(mén)Pwn第一步就是學(xué)會(huì)用Pwntools連接到遠(yuǎn)程題目環(huán)境這是幾乎所有Pwn題的通用前置動(dòng)作。下面這段代碼是最典型的Pwn題連接代碼幾乎每次做題都會(huì)用到建議直接收藏from pwn import * # 連接本地程序 p process(./pwn_test) # 連接遠(yuǎn)程題目環(huán)境比賽時(shí)使用 # p remote(1.2.3.4, 10001) # 接收程序輸出 p.recvuntil(bInput your name:) # 發(fā)送payload p.sendline(baaaabbbb) # 切換為交互模式 p.interactive()GDB則是Linux下最常用的調(diào)試器配合pwndbg插件使用可以讓你非常直觀地看到程序崩潰時(shí)的寄存器狀態(tài)、棧結(jié)構(gòu)以及各種內(nèi)存信息這對(duì)分析漏洞利用思路至關(guān)重要。逆向方向的主工具推薦IDA Pro或者免費(fèi)開(kāi)源的Ghidra兩者都能做反匯編和反編譯新手建議從IDA的F5反編譯功能入手先看偽代碼理清邏輯再回到匯編層逐行分析。4.3 密碼學(xué)與雜項(xiàng)方向工具鏈CyberChef等密碼學(xué)方向的工具核心就是CyberChef另外Python的Crypto庫(kù)和gmpy2庫(kù)也需要熟悉。Crypto庫(kù)用于處理各種加解密算法gmpy2用于高精度大數(shù)運(yùn)算RSA相關(guān)的題目幾乎都要用到它。雜項(xiàng)方向的工具相對(duì)更雜一些但有幾樣是通用的十六進(jìn)制編輯器010 Editor或HxD用來(lái)查看和修改文件底層字節(jié)。binwalk固件分析利器可以快速提取隱藏在文件中的其他文件。Stegsolve一個(gè)Java寫(xiě)的小工具專(zhuān)門(mén)用來(lái)做圖像隱寫(xiě)分析支持按通道查看圖片像素?cái)?shù)據(jù)。Wireshark流量分析神器我建議每個(gè)方向的人都裝一個(gè)因?yàn)椴还苁裁捶较虻念}目都可能涉及流量包分析。關(guān)于工具我想額外說(shuō)一句不要貪多。每個(gè)方向選2到3個(gè)主力工具花時(shí)間把它們用得滾瓜爛熟比下載20個(gè)工具但每個(gè)只會(huì)點(diǎn)按鈕要有用得多。5. 學(xué)習(xí)筆記體系把刷過(guò)的題變成自己的知識(shí)資產(chǎn)5.1 筆記要記什么一套可復(fù)用的WP模板很多新人刷題不記筆記理由是“我刷過(guò)了印象很深刻”。但實(shí)際情況是CTF的知識(shí)點(diǎn)高度碎片化而且同類(lèi)題型之間的差異很小不記錄的話一兩周后你連當(dāng)初卡住自己的關(guān)鍵點(diǎn)在哪都忘光了。刷題記筆記這個(gè)習(xí)慣可以說(shuō)是區(qū)分“有效刷題”和“無(wú)效刷題”的最重要分水嶺。我個(gè)人的CTF筆記模板是這樣的你可以直接復(fù)用題目名稱(chēng)和來(lái)源哪個(gè)平臺(tái)、哪場(chǎng)比賽題目方向與考點(diǎn)標(biāo)簽例如Web/SQL注入/聯(lián)合查詢我的嘗試過(guò)程踩過(guò)哪些坑卡在哪個(gè)環(huán)節(jié)最終解法和關(guān)鍵步驟按順序?qū)懙迷皆敿?xì)越好涉及的知識(shí)點(diǎn)總結(jié)用簡(jiǎn)短的語(yǔ)言把所有相關(guān)知識(shí)點(diǎn)拉通一遍工具和命令的參考用了什么工具敲了什么命令可遷移的經(jīng)驗(yàn)這道題的方法還能用在哪類(lèi)題上這套模板的核心邏輯是“復(fù)盤(pán)驅(qū)動(dòng)”重點(diǎn)不在于把WriteUp抄一遍而在于記錄你整個(gè)思考的轉(zhuǎn)變過(guò)程。我記得有一次遇到一道反序列化題第一次做完全沒(méi)思路翻了題解才明白是利用了一個(gè)特殊觸發(fā)鏈。這道題的筆記我寫(xiě)了兩千多字從那以后我再遇到PHP反序列化題目腦子里就有了一條清晰的排查路線。5.2 如何整理知識(shí)體系從零散筆記到個(gè)人知識(shí)庫(kù)隨著刷題數(shù)量增加零散的筆記會(huì)變得難以檢索。到這個(gè)時(shí)候就該考慮建一個(gè)結(jié)構(gòu)化的個(gè)人知識(shí)庫(kù)了。我個(gè)人推薦用Markdown文件管理配合Git做版本控制好處是純文本不依賴任何特定軟件而且可以隨時(shí)回溯歷史版本。有條件的也可以搭建一個(gè)本地文檔站點(diǎn)但沒(méi)有必要在入門(mén)階段為此花費(fèi)太多時(shí)間。知識(shí)庫(kù)的組織結(jié)構(gòu)可以參考這個(gè)思路按方向建頂層文件夾Web、Pwn、Crypto、Misc、Reverse每個(gè)方向下按知識(shí)點(diǎn)建二級(jí)文件夾例如Web目錄下就建SQL注入、XSS、文件上傳等子目錄每一道題的筆記就放在對(duì)應(yīng)的知識(shí)點(diǎn)目錄下。這樣一來(lái)在打比賽或者做題時(shí)如果你遇到“這個(gè)點(diǎn)我好像見(jiàn)過(guò)”直接在本地搜索關(guān)鍵詞就能快速找到之前的筆記和腳本效率會(huì)高很多。這里我要特意強(qiáng)調(diào)一點(diǎn)知識(shí)庫(kù)不是寫(xiě)完就完事的建議每?jī)芍茏鲆淮位仡櫚呀谒㈩}筆記重新掃一遍把重復(fù)的知識(shí)點(diǎn)合并歸納把已經(jīng)熟練掌握的內(nèi)容標(biāo)記為“可跳過(guò)”。這樣你的知識(shí)庫(kù)就會(huì)始終保持高信噪比不會(huì)變成一個(gè)新的“垃圾堆”。6. 常見(jiàn)問(wèn)題與避坑實(shí)錄新手最容易踩的坑我都替你踩過(guò)了6.1 新手常見(jiàn)問(wèn)題速查表我把帶新人時(shí)反復(fù)被問(wèn)到的問(wèn)題整理成了一個(gè)速查表每個(gè)問(wèn)題的答案都是我實(shí)際驗(yàn)證過(guò)的經(jīng)驗(yàn)可以直接用于你的實(shí)操。常見(jiàn)問(wèn)題問(wèn)題原因與解決思路做題時(shí)報(bào)錯(cuò)“connection refused”沒(méi)有先啟動(dòng)本地環(huán)境很多題目需要先開(kāi)啟Docker或服務(wù)端口確認(rèn)目標(biāo)端口處于監(jiān)聽(tīng)狀態(tài)看不懂題解里的漏洞利用代碼前置知識(shí)不夠先停一下把涉及的函數(shù)用法和協(xié)議原理查清楚再繼續(xù)看題目卡了兩小時(shí)還是沒(méi)有思路果斷看WriteUp新手不需要死磕看懂后獨(dú)立復(fù)現(xiàn)一次才是最關(guān)鍵的工具裝了但不會(huì)用不要試圖一次學(xué)完所有功能先掌握核心功能其余功能遇到具體場(chǎng)景時(shí)再去現(xiàn)查刷了很多題但感覺(jué)沒(méi)進(jìn)步大概率是刷題沒(méi)有總結(jié)開(kāi)始強(qiáng)制自己每道題寫(xiě)復(fù)盤(pán)筆記Python腳本報(bào)編碼錯(cuò)誤很多CTF數(shù)據(jù)是字節(jié)流而非字符串注意區(qū)分bytes和str用encode/decode顯式轉(zhuǎn)換6.2 四個(gè)最影響效率的學(xué)習(xí)方式誤區(qū)第一個(gè)誤區(qū)是“越難的工具越厲害”。很多新人一上來(lái)就裝一堆高級(jí)掃描框架覺(jué)得工具越強(qiáng)大自己越強(qiáng)。但事實(shí)上比賽最緊缺的是你對(duì)漏洞原理的理解和現(xiàn)場(chǎng)分析能力而不是工具數(shù)量。我被問(wèn)過(guò)很多次“這個(gè)工具能出題解嗎”實(shí)際上大多數(shù)工具只是輔助核心還是你腦子里的思路。第二個(gè)誤區(qū)是“只刷題不補(bǔ)基礎(chǔ)”。刷題確實(shí)是高效的學(xué)習(xí)方式但不是全部。如果你發(fā)現(xiàn)自己做Web題時(shí)經(jīng)??ㄔ诓粫?huì)讀代碼上說(shuō)明需要補(bǔ)一補(bǔ)JavaScript和PHP的基礎(chǔ)語(yǔ)法做Pwn題時(shí)讀不懂反匯編說(shuō)明需要回去再看C語(yǔ)言和匯編的知識(shí)?;A(chǔ)知識(shí)和刷題是互補(bǔ)的不能偏廢。第三個(gè)誤區(qū)是“只看WriteUp但不動(dòng)手復(fù)現(xiàn)”??搭}解是最容易產(chǎn)生“我學(xué)會(huì)了”錯(cuò)覺(jué)的方式實(shí)際上你對(duì)題解的理解程度只有在你動(dòng)手復(fù)現(xiàn)一遍之后才算數(shù)??搭}解五分鐘復(fù)現(xiàn)五十分鐘這個(gè)時(shí)間投入是值得的。第四個(gè)誤區(qū)是“過(guò)早分方向”。我發(fā)現(xiàn)有些新人剛?cè)腴T(mén)一個(gè)月就說(shuō)自己“只做Web其他方向不碰”。但實(shí)際上CTF是一個(gè)交叉性很強(qiáng)的領(lǐng)域多方向的基礎(chǔ)了解會(huì)反過(guò)來(lái)促進(jìn)你對(duì)主攻方向的理解。比如對(duì)密碼學(xué)套路的了解有助于你在Web題中識(shí)別加密參數(shù)對(duì)Misc方向的工具了解也能拓展你分析Web流量包的能力。前期至少把所有方向都過(guò)一遍再談專(zhuān)精。6.3 資源獲取的正確姿勢(shì)找教程、找題解、問(wèn)問(wèn)題學(xué)術(shù)和提問(wèn)也是需要技巧的。CTF圈子的學(xué)習(xí)資源非常豐富但如果獲取方式不對(duì)很容易陷進(jìn)信息過(guò)載的泥潭。我的建議是優(yōu)先看官方文檔和權(quán)威平臺(tái)的WriteUp其次是個(gè)人技術(shù)博客最后才是視頻教程。視頻教程的問(wèn)題在于信息密度比較低同樣一個(gè)知識(shí)點(diǎn)看文字可能五分鐘就能吃透看視頻要花半小時(shí)。當(dāng)然如果你完全零基礎(chǔ)看視頻入門(mén)也不是不可以但一定不要局限在看視頻要同步動(dòng)手操作。提問(wèn)方面建議使用搜索引擎和論壇搜索先確認(rèn)自己的問(wèn)題是不是已經(jīng)有人問(wèn)過(guò)。一個(gè)合格的問(wèn)題應(yīng)該包含你的操作環(huán)境、你復(fù)現(xiàn)的具體步驟、你遇到的完整報(bào)錯(cuò)信息、你已經(jīng)嘗試過(guò)的解決方案。如果你能按這個(gè)格式提問(wèn)基本會(huì)得到非常高質(zhì)量的回復(fù)。我最怕的就是有人只丟一句“這道題怎么做”這種問(wèn)題基本得不到任何有效信息。最后分享一下我這幾年刷題過(guò)程中沉淀下來(lái)的一套習(xí)慣。保持記錄是關(guān)鍵我把每道有價(jià)值的題都整理成筆記要求自己用最精簡(jiǎn)的語(yǔ)言把解題思路重新表述一遍。這個(gè)“表述”的過(guò)程有時(shí)候比做題本身更有收獲因?yàn)樗鼤?huì)強(qiáng)迫你理解得更深入。前期我也會(huì)因?yàn)橐坏李}卡了很久而煩躁但后來(lái)慢慢調(diào)整了心態(tài)——那些讓我卡住的題目往往才是我真正學(xué)到的知識(shí)。希望這份指南能讓你在CTF這條路上走得比當(dāng)年的我順暢一些也歡迎你在實(shí)操中有了新的體會(huì)以后再回頭來(lái)對(duì)照這篇內(nèi)容形成屬于自己的方法論。