簡易流量分析
.pcap檔案結構
.pcap檔案是常用的資料報存盤形式,不是簡單的文本檔案,是具有特定結構的二進制檔案,
.pcap/.cap檔案結構如下:
Pcap Header
檔案頭,具有24個位元組,而檔案頭又分成7個部分,
| 欄位 | 意義 |
|---|---|
| Magic(4位元組) | 標記檔案開始,并用以識別檔案和位元組順序,若值為0xa1b2c3d4,表示大端存盤模式,依序讀取;若值為0xd4c3b2a1,表示小端存盤模式,每個存盤單元都是從低地址讀取至高地址,現行的計算機設計以小端存盤模式居多, |
| Major(2位元組) | 當前檔案的主要版本號,一般為0x0200, |
| Minor(2位元組) | 當前檔案的次要版本號,一般為0x0400, |
| ThisZone(4位元組) | 當地標準時間,如果使用GMT(格林威治標準時間)則全為0;一般全為0, |
| SigFigs(4位元組) | 時間戳經度,一般全為0, |
| SnapLen(4位元組) | 最大存盤長度,設定所抓取資料包的最大長度,如果所有資料包都需要抓取,將值設定為65535, |
| LinkType(4位元組) | 鏈路型別,決議資料包首先需要判斷其鏈路型別,一般值為1,即以太網, |
常用的LinkType(鏈路型別)如下:
- 0: BSD loopback devices, except for later OpenBSD
- 1: Ethernet, and Linux loopback devices
- 6: 802.5 Token Ring
- 7: ARCnet
- 8: SLIP
- 9: PPP
- 10: FDDI
- 100: LLC/SNAP-encapsulated ATM
- 101: “raw IP”, with no link
- 102: BSD/OS SLIP
- 103: BSD/OS PPP
- 104: Cisco HDLC
- 105: 802.11
- 108: later OpenBSD loopback devices (with the AF_value in network byte order)
- 113: special Linux “cooked” capture
- 114: LocalTalk
Packet Header
資料包頭,具有16個位元組,每個資料包頭后面都是真正的資料包,資料包頭分為4個部分,
| 欄位 | 意義 |
|---|---|
| Timestamp(4位元組) | 時間戳高位,精確到秒(seconds),為Unix時間戳,捕獲資料包的時間一般以該值為根據, |
| Timestamp(4位元組) | 時間戳低位,可以精確到微秒(microseconds), |
| Caplen(4位元組) | 當前資料區的長度,即抓取資料幀的長度,由此可以得到下一資料幀的位置, |
| Len(4位元組) | 離線資料長度,網路中實際的資料幀長度,一般不大于Caplen,多數情況下與Caplen值一致, |
Packet Data
鏈路層中的資料幀,長度為在Packet Header中定義的Caplen,即.pcap檔案并沒有規定抓取的資料幀之間需要間隔字串,資料幀部分的內容格式為標準的網路協議格式,
開始試驗
以下操作基于檔案aim.pcap,目標是提取其中的flag,
列印基本資訊:
from scapy.all import *
if __name__ == '__main__':
pcap = rdpcap('./aim.pcap')
print(pcap)
可以看到結果<aim.pcap: TCP:1088 UDP:87 ICMP:0 Other:5>,
列印pcap物件資訊:
print(type(pcap))
可得pcap即為scapy庫所定義的包串列,
對pcap迭代:
for item in pcap:
print(repr(item))
# 或者 print(item.show())
可以看到包資訊:
資訊篩查
提取HTTP項:
for item in pcap:
if('TCP' in item) and (item['TCP'].fields['dport']==80):
print(repr(item))
通過篩選列印出的包體資訊,發現對flag的訪問目標IP為192.168.0.123,所以再增加篩選條件:
for item in pcap:
if('TCP' in item) and (item['TCP'].fields['dport']==80) and (item['IP'].fields['dst']='192.168.0.123'):
print(repr(item))
至此得到所有關于訪問flag的請求包資訊(為GET型別),
將回應資訊也列印出來:
for item in pcap:
if ("TCP" in item) and ("IP" in item):
src = https://www.cnblogs.com/4thrun/p/item['IP'].fields['src']
dst = item["IP"].fields['dst']
sport = item['TCP'].fields['sport']
dport = item['TCP'].fields['dport']
if (srchttps://www.cnblogs.com/4thrun/p/=='192.168.0.123' and sport==80) or (dst=='192.168.0.123' and dport==80):
print(repr(item))
在這些資訊中就能找到對flag檔案成功訪問的請求:
| 請求 | 回應 | 內容 |
|---|---|---|
| / | 200 | Hello World |
| /favicon.ico | 404 | |
| /flag | 404 | |
| /flag/5 | 200 | None |
| /flag/2 | 200 | - |
| /flag/1 | 200 | flag |
| /flag/4 | 200 | ULRGB} |
| /flag/3 | 200 | {YKLTG |
| /flag/100 | 200 | None |
得出結果
按照數字順序拼接,可以得到flag值,即flag-{YKLTGULRGB},
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/270660.html
標籤:其他
上一篇:jarvis OJ-DSA
下一篇:HTB系列之七:Bastard
