
1. 從零到一Wireshark在CTF流量分析中的核心定位如果你剛接觸CTFCapture The Flag比賽尤其是像BUUCTF這樣的國內知名賽事面對一個動輒幾十兆甚至上百兆的.pcap或.pcapng流量包文件第一感覺很可能是無從下手。密密麻麻的數據包列表各種陌生的協議縮寫感覺像在看天書。別慌這正是每個新手必經之路。Wireshark本質上是一個網絡協議分析器它的強大之處在于能將網絡上流動的二進制“比特流”翻譯成我們能看懂的應用層數據。在CTF的Misc雜項或Web類題目中流量分析是高頻考點其核心定位就是從海量的、看似無序的網絡通信記錄中找到出題人故意隱藏或泄露的關鍵信息Flag。為什么流量包能藏Flag因為網絡是透明的。一次完整的HTTP訪問、一次FTP文件傳輸、一次DNS查詢、甚至是一次可疑的ICMP“ping”請求所有數據交換的“元數據”和“載荷”都可能被記錄在案。出題人可能會把Flag藏在某個圖片文件的傳輸里HTTP流量編碼后放在DNS查詢的域名中DNS流量甚至是通過TCP流量的特定字段順序來隱寫。你的任務就是扮演一個“網絡偵探”使用Wireshark這個“顯微鏡”從這些記錄中還原出完整的犯罪現場找到被竊取的“寶藏”Flag。對于新手而言直接上手分析復雜流量容易勸退。我的建議是先建立信心CTF流量分析題目的答案Flag一定在流量包里并且一定有相對高效的路徑可以抵達。出題人不是為了難倒你而難倒你而是希望你掌握某種特定的分析技巧。接下來我將結合在BUUCTF等平臺實戰中提煉出的5個核心技巧帶你一步步拆解流量包你會發現這一切都有跡可循。2. 實戰前夜Wireshark高效配置與過濾語法精要工欲善其事必先利其器。直接打開Wireshark載入大流量包就開干效率極低。正確的姿勢是先做好配置并熟練掌握過濾語法這能幫你瞬間過濾掉99%的無用噪音。2.1 關鍵界面配置與首選項優化安裝完Wireshark后別急著抓包。首先進入編輯 - 首選項。外觀 - 列默認的列可能不夠用。我強烈建議添加兩列tcp.stream這是TCP流追蹤的命門。添加后每個TCP數據包都會顯示其所屬的“流”編號。同一會話比如一次完整的HTTP請求響應的數據包會有相同的流編號。http.request.uri或http.file_data針對HTTP分析非常有用能直接在列表里看到請求的URI或文件數據片段。 添加方法點擊“”號字段名稱填入上述字段點擊確定即可。協議 - HTTP確保“解壓GZip內容”是勾選的。很多Web服務器會返回GZip壓縮的數據不打開這個選項你看到的就是亂碼。布局選擇你喜歡的布局我個人習慣“數據包列表”在上“數據包詳情”在中“數據包字節”在下這樣瀏覽效率最高。2.2 過濾表達式你的“手術刀”Wireshark的過濾欄是你最強大的武器。掌握它你就能從數據包海洋中撈出你想要的那根針。基礎過濾基于協議/地址http只看HTTP協議流量。dns只看DNS協議流量。ip.addr 192.168.1.100只看與這個IP地址相關的所有流量源或目標。ip.src 192.168.1.1或ip.dst 10.0.0.1只看源IP或目標IP。tcp.port 80或udp.port 53只看特定端口的流量。進階過濾基于包內容http.request.method GET只顯示HTTP GET請求。http contains “flag”或http contains “FLAG”在HTTP協議中搜索包含“flag”關鍵字的數據包。這是最常用的技巧之一但出題人不會這么直白。tcp contains “password”在TCP載荷中搜索“password”。dns.qry.name contains “secret”在DNS查詢的域名中搜索“secret”。組合過濾使用and與、or或、not非進行組合。例如http and ip.addr 192.168.1.100只看該IP的HTTP流量。例如tcp.port 80 or udp.port 53只看Web和DNS流量。注意過濾表達式對大小寫敏感且字段名中的點號.是固定格式。當你輸入時Wireshark會有自動補全提示善用這個功能可以避免拼寫錯誤。實操心得面對一個新流量包我習慣先敲一個http看看Web流量是否活躍再敲dns看看有沒有奇怪的域名查詢。如果流量很大先用ip.addr過濾出疑似目標題目描述可能給出IP線索或內網IP如192.168.x.x,10.x.x.x的流量能極大縮小范圍。3. 核心技巧一Follow TCP/UDP/SSL Stream還原完整會話這是最重要、最核心、使用頻率最高的技巧沒有之一。單個數據包就像一封信的一頁紙而Follow Stream功能能把屬于同一次對話的所有“紙”按順序裝訂成冊讓你看到完整的“信件”。如何操作在數據包列表區右鍵任意一個TCP、UDP或SSL/TLS數據包 - 選擇追蹤流-TCP流/UDP流/SSL流。一個包含完整ASCII或EBCDIC碼表示的文本窗口會彈出。實戰解析以BUUCTF常見題型為例HTTP流這是最常見的。你可能會看到一個完整的HTTP交互GET /index.php?filesecret.txt HTTP/1.1 Host: target.com ...往下翻緊接著就是服務器的響應HTTP/1.1 200 OK ... html... flag{this_is_a_secret} .../htmlFlag可能就直接在響應的HTML、JSON數據里也可能在響應頭如Flag: xxx中。TCP流非HTTP可能是一個自定義協議的通信。比如客戶端發送一串字符服務器返回一串字符。Flag可能就藏在其中一方的發送內容里。關鍵點注意看流的內容是否像Base64編碼末尾常有、十六進制、或是有規律的偏移可能是凱撒密碼、異或等。Wireshark的流窗口默認以ASCII顯示對于非打印字符會顯示為點.此時要留意右下角的“顯示數據為”選項可以切換為“原始數據”、“C數組”等格式進行復制。UDP流常見于DNS、TFTP等協議。DNS流里可能包含flag.badguy.com這樣的子域名查詢其Flag可能就編碼在子域名中如ZmxhZ3tleGFtcGxlfQ.badguy.com其中ZmxhZ3tleGFtcGxlfQ是flag{example}的Base64編碼。避坑指南Follow出來的流窗口默認只顯示從A到B或從B到A的單向流。窗口左下角有“整個會話”、“客戶端到服務器”等選項。一定要選擇“整個會話”才能看到完整的來回對話避免遺漏關鍵信息。另外流內容可以直接全選復制出來粘貼到文本編輯器或解碼工具中進行下一步分析。4. 核心技巧二文件導出與協議深度挖掘流量包里經常傳輸文件圖片、壓縮包、文檔等。Wireshark可以像“時光機”一樣把這些文件從網絡流量中提取出來。4.1 通用文件導出方法文件 - 導出對象 - HTTP...或DICOM、SMB等。這會列出所有通過該協議傳輸的文件。你可以看到文件名、內容類型如image/png、大小等。直接選中文件保存即可。這是找回被傳輸的圖片、文檔的最快方式。4.2 手動提取原始數據對于非標準協議傳輸的文件或者你想提取某一段特定的TCP/UDP載荷需要使用“導出分組字節流”。首先使用Follow Stream功能找到包含文件數據的流。確認文件的開始和結束。在流窗口的“原始數據”或“十六進制轉儲”視圖下精確選擇從文件頭開始到文件尾結束的十六進制數據注意不是ASCII文本。例如一個PNG圖片的頭是89 50 4E 47JPG是FF D8 FF E0。復制選中的十六進制文本。使用外部工具如xxd、010 Editor、CyberChef將十六進制文本還原為二進制文件。Linux/Macecho -n “89504E47...” | xxd -r -p output.png使用CyberChef將復制的十六進制文本粘貼到輸入區使用From Hex配方然后使用Save to file。4.3 協議深度挖掘以FTP為例有些協議本身就攜帶了文件操作指令。例如FTP協議。過濾ftp你可以看到USER、PASS登錄命令以及RETR下載、STOR上傳命令。如果看到RETR flag.txt或STOR secret.zip那么緊接著的數據包連接通常是另一個TCP端口里就包含了這個文件的內容。你需要找到對應的數據連接可能通過FTP的PORT或PASV命令建立的端口然后對這個數據連接進行Follow TCP Stream就能看到文件的原始內容。實操心得導出HTTP對象是最簡單的優先嘗試。如果沒找到再考慮手動提取。手動提取的關鍵是準確識別文件頭尾。多積累常見文件的魔術字Magic Bytes這對CTF和逆向都很有幫助。另外Wireshark的“導出分組字節流”功能在數據包列表右鍵-“導出分組字節流”有時更方便它允許你直接導出選中數據包的原始字節但需要你事先通過過濾精準定位到文件傳輸的數據包范圍。5. 核心技巧三字符串搜索與編碼識別當Flag沒有明文出現或者會話流太多無從下手時全局搜索是“地毯式轟炸”的好方法。5.1 全局字符串搜索編輯 - 查找分組。搜索范圍選擇“分組字節流”字符串類型選擇“字符串”或“十六進制值”。搜索常見Flag格式flag{、FLAG{、ctf{、key{。這是最直接的。搜索提示性詞匯題目描述可能暗示了關鍵詞如secret、password、hint、findme。搜索特殊字符有時Flag可能被編碼但包含特殊字符如Base64填充、%URL編碼、\uUnicode轉義。5.2 編碼識別與初步判斷在Follow Stream或搜索出的數據中如果看到一段奇怪的字符串如何判斷其編碼Base64字符集為A-Za-z0-9/長度通常是4的倍數末尾可能有填充。例如ZmxhZw解碼后是flag。Hex十六進制僅包含0-9a-fA-F長度通常為偶數。例如666c6167解碼后是flag。URL編碼包含大量%符號如%66%6c%61%67解碼后是flag。HTML實體編碼如#102;#108;#97;#103;解碼后是flag。莫爾斯電碼、培根密碼等這需要觀察字符模式點/劃A/B分組。快速解碼工具我強烈推薦使用CyberChef這個在線工具。它集成了上百種編解碼、加密、壓縮操作可以像搭積木一樣把操作連起來比如 Base64解碼 - 十六進制解碼 - ROT13解密。把可疑字符串丟進去用常見的解碼配方From Base64, From Hex, URL Decode等試一下往往有奇效。注意事項全局搜索非常消耗資源對于超大流量包可能會卡頓甚至崩潰。建議先通過協議過濾如http縮小范圍后再搜索。另外搜索時注意大小寫可以分別嘗試。有時出題人會把Flag進行多層嵌套編碼比如Base64編碼后再進行Hex編碼這就需要你在CyberChef里進行多次解碼嘗試。6. 核心技巧四統計與端點分析發現異常行為當流量中沒有明顯的文件傳輸或Flag字符串時攻擊者的異常行為模式可能就是突破口。Wireshark的統計功能提供了宏觀視角。6.1 會話統計Conversations統計 - 會話。這個視圖列出了所有通信對IP A - IP B的流量統計包括數據包數、字節數。找“話癆”查看哪個IP地址發送或接收的數據包/字節數異常多它可能就是攻擊源或受害目標。找“異常連接”一個內網IP與大量外部IP進行短暫通信可能是端口掃描行為。或者一個客戶端與服務器在非常用端口非80、443上有大量通信這可能是一個后門或自定義服務。6.2 端點統計Endpoints統計 - 端點。這個視圖按單個IP或MAC地址統計流量。功能與會話統計類似但視角更集中于單個主機。識別掃描行為如果某個IP向目標網段的大量不同端口發送了SYN包TCP連接請求但在會話統計中這些連接大多沒有后續數據交換即未完成三次握手這很可能是端口掃描。6.3 協議分級統計Protocol Hierarchy統計 - 協議分級。以樹狀圖顯示各層協議的流量占比。發現非常用協議如果在一個看似普通的Web訪問流量中出現了占比異常的協議比如ICMP、TELNET、IRC或者有大量的DNS查詢遠超正常網頁瀏覽所需這些協議就值得深入調查。例如Flag可能通過ICMP的ping數據包載荷Data字段進行外傳ICMP隧道。實戰應用在BUUCTF的一道題目中我打開協議分級發現除了HTTP還有相當比例的TELNET流量。這極不正常因為TELNET是明文傳輸的古老協議。我立刻過濾telnetFollow TCP Stream果然在登錄后的交互命令中發現了操作系統的命令執行記錄并最終在其中找到了Flag。統計功能幫你從“大海”定位到“可疑海域”然后再用過濾和Follow Stream這些“潛水工具”去海底撈針。7. 核心技巧五高級過濾與顯示字段技巧掌握了基礎過濾后一些高級過濾和顯示技巧能讓你如虎添翼。7.1 過濾特定長度的數據包攻擊者有時會把數據藏在特定大小的數據包里。tcp.len 100過濾TCP載荷長度恰好為100字節的數據包。udp.length 50過濾UDP載荷長度恰好為50字節的數據包。frame.len 64過濾整個幀包括鏈路層頭長度為64字節的數據包可能是特殊的控制幀或心跳包。7.2 過濾包含特定字節模式的數據包這比字符串搜索更底層可以找到非打印字符的模式。tcp.payload matches “\\x89PNG”過濾TCP載荷中包含PNG文件頭十六進制89 50 4E 47的數據包。注意\x后面跟兩個十六進制數字。udp.payload[0:2] “\\xff\\xd8”過濾UDP載荷的前兩個字節是JPG文件頭FF D8的數據包。[0:2]表示從偏移0開始取2個字節。7.3 自定義列與著色規則自定義列如前所述添加tcp.stream列至關重要。你還可以添加http.content_type來快速識別文件類型。著色規則視圖 - 著色規則。你可以創建自己的規則比如將所有包含字符串flag的數據包標記為亮綠色這樣它們在列表中會非常醒目。或者將DNS流量染成淺藍色HTTP流量染成黃色便于視覺區分。實操心得高級過濾通常用于解決“奇葩”題目。比如一道題Flag被分割成很多份放在一系列長度固定的ICMP Echo Request包里。用icmp and frame.len 98過濾后一下子就得到了所有相關數據包再導出其Data字段拼接即可。自定義著色規則在長期分析中能極大提升效率讓你的眼睛快速聚焦到關鍵信息上。8. BUUCTF真題實戰解析從流量到Flag的完整推演讓我們用一個虛構但融合了BUUCTF常見考點的綜合案例來串聯運用上述技巧。假設我們拿到一個名為mystery.pcapng的流量包。第一步初步偵察與協議概覽打開文件先看協議分級。發現主要流量是HTTP和DNS有少量ICMP。總數據包數約5000個不算大。第二步優先檢查HTTP流量過濾http。瀏覽列表發現有幾個對/upload.php的POST請求和一個對/flag.zip的GET請求。后者立刻引起注意。右鍵這個GET請求的數據包 -追蹤流-TCP流。在服務器響應中看到了HTTP/1.1 200 OK和Content-Type: application/zip。太好了有一個zip文件被下載了。文件 - 導出對象 - HTTP...果然在列表里看到了flag.zip保存它。第三步處理導出的文件嘗試解壓flag.zip發現需要密碼。密碼很可能在流量包里。 回到Wireshark在剛才的HTTP流窗口顯示整個會話仔細看客戶端下載者之前的請求。在GET/flag.zip之前有一個POST請求到/login.php表單數據是usernameadminpassword7c6a180b36896a0a8c02787eeafb0e4c。這串7c6a...看起來像MD5哈希值。使用CyberChef或在線MD5解密網站嘗試破解。運氣好這是一個常見密碼的MD5比如password1。用這個密碼成功解壓flag.zip里面是一個flag.txt打開一看只有一行The final flag is not here. Look into the DNS.第四步轉向DNS流量過濾dns。發現大量對類似s3cr3t1.badguy.com、s3cr3t2.badguy.com... 的A記錄查詢。子域名部分是連續的s3cr3t加數字。右鍵任意一個DNS查詢包 -追蹤流-UDP流。在流內容中可以看到查詢的完整域名。將所有查詢的域名子部分s3cr3t1,s3cr3t2...按順序提取出來。發現它們看起來像Base64czNjcgczNjcg... 但似乎不完整。考慮到DNS標簽長度限制63字節可能Flag被分片了。將所有這些子域名字符串拼接起來czNjcgczNjcg...。但直接Base64解碼是亂碼。嘗試每段單獨解碼czNjcg-s3cr。將所有解碼結果拼接s3cr3ts3cr3t...。這看起來像重復的單詞。靈光一現會不會是每個子域名對應一個字符的編碼仔細看s3cr3t1解碼后是s3cr這不對。換個思路也許子域名本身就是編碼后的字符串。s3cr3t1去掉數字1得到s3cr3t這像是“secret”的變體leet語。數字可能是索引。提取所有子域名的核心部分和數字(s3cr3t,1),(s3cr3t,2)... 這沒有幫助。回到最初的思路s3cr3t1.badguy.com 嘗試把s3cr3t1整體進行Base32、Base58、Base91解碼或者會不會是十六進制s3cr3t1包含字母和數字但g,u,y等超出了0-9a-f范圍不是純Hex。使用高級過濾dns.qry.name contains “badguy.com”過濾出所有相關查詢。然后使用tsharkWireshark的命令行版本快速提取字段tshark -r mystery.pcapng -Y “dns.qry.name contains badguy.com” -T fields -e dns.qry.name。將輸出保存到文件再用腳本處理。寫一個簡單的Python腳本提取每個域名的子部分去掉.badguy.com和末尾的數字然后拼接。假設提取到s3cr3tpasswordis3cr3tpasswordi... 這看起來像“s3cr3tpasswords3cr3tpassword”的循環不對。換個角度題目提示“Look into the DNS” 會不會是DNS隧道一種常見的DNS隧道工具如iodine會將數據編碼到子域名中。其編碼模式可能是Base32。將子域名部分如s3cr3t1嘗試進行Base32解碼。標準Base32字符集是A-Z2-7而s3cr3t1包含小寫字母和數字需要先轉大寫。S3CR3T1進行Base32解碼... 得到亂碼。可能不是。最終發現在反復查看DNS流時注意到除了A記錄查詢還有大量的TXT記錄查詢過濾dns and dns.qry.type 16TXT類型。果然有一系列對chunk1.badguy.com、chunk2.badguy.com... 的TXT查詢。追蹤這些TXT查詢的響應包。在響應中TXT記錄字段包含了一段段Base64編碼的字符串。將所有TXT記錄里的Base64字符串按chunk后的數字順序拼接然后解碼最終得到了完整的Flagflag{dns_txt_exfil_is_cool}。復盤這道題綜合考察了HTTP文件導出、密碼破解、DNS協議分析、多種編碼識別以及數據提取和拼接的能力。關鍵轉折點在于從HTTP的假Flag提示轉向DNS并且沒有局限于常見的A記錄而是發現了更隱蔽的TXT記錄傳輸。這要求分析者不僅會工具操作還要有攻擊者思維了解數據外泄Exfiltration的多種渠道。9. 常見問題排查與獨家避坑技巧在實際操作中你會遇到各種奇怪的問題。這里記錄了一些我踩過的坑和總結的技巧。Q1Follow TCP Stream窗口里顯示的都是亂碼/十六進制看不到文字A1這通常發生在非HTTP的TCP連接上比如加密流量SSL/TLS或純二進制協議。首先檢查左下角是否誤選了“十六進制轉儲”視圖切換回“ASCII”。如果還是亂碼那說明傳輸的就是非文本數據。此時“十六進制轉儲”視圖反而是有用的你可以在這里復制原始的十六進制值進行下一步分析如圖片提取、自定義解碼。對于SSL/TLS流量除非你有私鑰否則無法解密但題目通常不會給加密流量讓你解密除非特別說明。Q2過濾表達式輸入正確但提示語法錯誤A2最常見的原因字段名拼寫錯誤。善用自動補全。比較的值類型不匹配。比如tcp.port “80”字符串和tcp.port 80整數在舊版本Wireshark中可能表現不同建議用整數。包含空格或特殊字符的字符串值需要用雙引號括起來如http.request.uri contains “/admin/login”。Q3導出的文件如圖片損壞打不開A3這通常是因為提取的數據范圍不準確。對于HTTP導出確保導出的是完整的響應體。Wireshark的導出對象功能通常是可靠的。對于手動提取務必確認你復制的十六進制數據完整且精確地包含了文件的所有字節從文件頭魔術字開始到文件結束標記為止。多一個或少一個字節都會導致文件損壞。對于PNG、ZIP等有明確結構的文件可以使用binwalk或foremost工具嘗試從你保存的原始二進制文件中自動掃描并提取嵌入的文件有時能救回來。Q4流量包太大Wireshark卡死怎么辦A4先過濾后分析不要在全量數據包上做任何耗資源的操作如全局搜索、統計圖表。先用ip.addr、tcp.port、http等過濾條件大幅縮小范圍。使用tshark命令行工具對于簡單的提取、統計任務tshark比GUI更高效。例如提取所有HTTP請求的URLtshark -r huge.pcap -Y http -T fields -e http.request.full_uri urls.txt。分割流量文件文件 - 導出特定分組可以按時間或過濾器結果保存一個小范圍的數據包然后分析這個小文件。獨家避坑技巧養成“標記”習慣在分析過程中對重要的數據包如發現可疑請求、關鍵響應右鍵點擊“標記/取消標記分組”快捷鍵CtrlM。被標記的數據包會高亮顯示。這樣在來回翻閱時能快速定位。善用“復制”功能在數據包詳情面板右鍵任意字段可以選擇“復制” - “值”、“As Filter”、“描述”等。其中“As Filter”非常有用它能自動生成一個過濾表達式精確匹配當前字段。例如在一個HTTP數據包詳情里右鍵Hypertext Transfer Protocol下的Host字段的值選擇“作為過濾器應用” - “選中”就會自動生成http.host “target.com”的過濾表達式并應用。時間就是線索關注數據包的時間戳時間列。一次完整的攻擊鏈其數據包在時間上往往是連續的。如果發現某個時間點突然出現大量密集的ICMP或DNS請求這可能就是數據外傳開始的信號。你可以通過frame.time “某時某分”這樣的過濾表達式來聚焦特定時間段。最后也是最重要的心得保持耐心和好奇心。CTF流量分析就像解謎有時需要嘗試多種思路。當一條路走不通時回到起點重新審視協議分級、端點統計看看有沒有遺漏的“異常點”。每一次成功的分析都會讓你對網絡協議和攻擊手法有更深的理解。這份理解遠比拿到一個Flag更有價值。