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