wireshark抓取常用報文協議過濾法則大全

做應用識別這一塊經常要對應用產生的數據流量進行分析。

抓包採用wireshark,提取特徵時,要對session進行過濾,找到關鍵的stream,這裏總結了wireshark過濾的基本語法,供自己以後參考。(腦子記不住東西)

wireshark進行過濾時,按照過濾的語法可分爲協議過濾和內容過濾。

對標準協議,既支持粗粒度的過濾如HTTP,也支持細粒度的、依據協議屬性值進行的過濾如tcp.port==53、http.request.method=="GET"。

對內容的過濾,既支持深度的字符串匹配過濾如http contains "Server",也支持特定偏移處值的匹配過濾如tcp[20:3] == 47:45:54。

wireshark有兩種過濾器:

捕捉過濾器(CaptureFilters):用於決定將什麼樣的信息記錄在捕捉結果中。
顯示過濾器(DisplayFilters):用於在捕捉結果中進行詳細查找。


捕捉過濾器在抓抱前進行設置,決定抓取怎樣的數據;顯示過濾器用於過濾抓包數據,方便stream的追蹤和排查。

捕捉過濾器僅支持協議過濾,顯示過濾器既支持協議過濾也支持內容過濾。

兩種過濾器它們支持的過濾語法並不一樣。

捕捉過濾器--捕捉前依據協議的相關信息進行過濾設置
語法:    Protocol    Direction    Host(s)    Value    Logical Operations    Other expression
例子:    tcp    dst    10.1.1.1    80    and    tcp dst 10.2.2.2 3128

示例:

(host 10.4.1.12 or src net 10.6.0.0/16) and tcp dst portrange 200-10000 and dst net 10.0.0.0/8
捕捉IP爲10.4.1.12或者源IP位於網絡10.6.0.0/16,目的IP的TCP端口號在200至10000之間,並且目的IP位於網絡 10.0.0.0/8內的所有封包。

字段詳解:

Protocol(協議):
可能值: ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp and udp.
如果沒指明協議類型,則默認爲捕捉所有支持的協議。
注:在wireshark的HELP-Manual Pages-Wireshark Filter中查到其支持的協議。


Direction(方向):
可能值: src, dst, src and dst, src or dst
如果沒指明方向,則默認使用 “src or dst” 作爲關鍵字。
”host 10.2.2.2″與”src or dst host 10.2.2.2″等價。


Host(s):
可能值: net, port, host, portrange.
默認使用”host”關鍵字,”src 10.1.1.1″與”src host 10.1.1.1″等價。


Logical Operations(邏輯運算):
可能值:not, and, or.
否(“not”)具有最高的優先級。或(“or”)和與(“and”)具有相同的優先級,運算時從左至右進行。
“not tcp port 3128 and tcp port 23″與”(not tcp port 3128) and tcp port 23″等價。
“not tcp port 3128 and tcp port 23″與”not (tcp port 3128 and tcp port 23)”不等價。


顯示過濾器--對捕捉到的數據包依據協議或包的內容進行過濾
1.協議過濾語法

語法:    Protocol    .    String 1    .    String 2    Comparison operator      Value    Logical Operations    Other expression
例子:    http         request         method     ==    "POST"    or    icmp.type
string1和string2是可選的。

依據協議過濾時,可直接通過協議來進行過濾,也能依據協議的屬性值進行過濾。

按協議進行過濾:

snmp || dns || icmp    顯示SNMP或DNS或ICMP封包。
按協議的屬性值進行過濾:
ip.addr == 10.1.1.1
ip.src != 10.1.2.3 or ip.dst != 10.4.5.6
ip.src == 10.230.0.0/16    顯示來自10.230網段的封包。
tcp.port == 25    顯示來源或目的TCP端口號爲25的封包。
tcp.dstport == 25    顯示目的TCP端口號爲25的封包。
http.request.method== "POST"    顯示post請求方式的http封包。
http.host == "tracker.1ting.com"    顯示請求的域名爲tracker.1ting.com的http封包。
tcp.flags.syn == 0×02    顯示包含TCP SYN標誌的封包。
2.內容過濾語法

2.1深度字符串匹配

contains :Does the protocol, field or slice contain a value

示例

tcp contains "http"    顯示payload中包含"http"字符串的tcp封包。
http.request.uri contains "online"    顯示請求的uri包含"online"的http封包。
2.2特定偏移處值的過濾

tcp[20:3] == 47:45:54  /* 16進制形式,tcp頭部一般是20字節,所以這個是對payload的前三個字節進行過濾 */

http.host[0:4] == "trac"

過濾中函數的使用(upper、lower)

upper(string-field) - converts a string field to uppercase
lower(string-field) - converts a string field to lowercase
示例
upper(http.request.uri) contains "ONLINE"


wireshark過濾支持比較運算符、邏輯運算符,內容過濾時還能使用位運算。
如果過濾器的語法是正確的,表達式的背景呈綠色。如果呈紅色,說明表達式有誤。


原文鏈接:https://blog.csdn.net/cumirror/article/details/7054496

 

1.
過濾IP,如來源IP或者目標IP等於某個IP
例子:
ip.src eq 192.168.1.107 or ip.dst eq 192.168.1.107
或者
ip.addr eq 192.168.1.107 // 都能顯示來源IP和目標IP

2.
過濾端口
例子:
tcp.port eq 80 // 不管端口是來源的還是目標的都顯示
tcp.port == 80
tcp.port eq 2722
tcp.port eq 80 or udp.port eq 80
tcp.dstport == 80 // 只顯tcp協議的目標端口80
tcp.srcport == 80 // 只顯tcp協議的來源端口80

udp.port eq 15000

過濾端口範圍
tcp.port >= 1 and tcp.port <= 80

3.
過濾協議
例子:
tcp
udp
arp
icmp
http
smtp
ftp
dns
msnms
ip
ssl
oicq
bootp
等等

排除arp包,如!arp   或者   not arp

4.
過濾MAC
太以網頭過濾
eth.dst == A0:00:00:04:C5:84 // 過濾目標mac
eth.src eq A0:00:00:04:C5:84 // 過濾來源mac
eth.dst==A0:00:00:04:C5:84
eth.dst==A0-00-00-04-C5-84
eth.addr eq A0:00:00:04:C5:84 // 過濾來源MAC和目標MAC都等於A0:00:00:04:C5:84的

less than 小於 < lt
小於等於 le

等於 eq
大於 gt
大於等於 ge
不等 ne

5.
包長度過濾
例子:
udp.length == 26 這個長度是指udp本身固定長度8加上udp下面那塊數據包之和
tcp.len >= 7   指的是ip數據包(tcp下面那塊數據),不包括tcp本身
ip.len == 94 除了以太網頭固定長度14,其它都算是ip.len,即從ip本身到最後
frame.len == 119 整個數據包長度,從eth開始到最後

eth ---> ip or arp ---> tcp or udp ---> data

6.
http模式過濾
例子:
http.request.method == "GET"
http.request.method == "POST"
http.request.uri == "/img/logo-edu.gif"
http contains "GET"
http contains "HTTP/1."

// GET包
http.request.method == "GET" && http contains "Host: "
http.request.method == "GET" && http contains "User-Agent: "
// POST包
http.request.method == "POST" && http contains "Host: "
http.request.method == "POST" && http contains "User-Agent: "
// 響應包
http contains "HTTP/1.1 200 OK" && http contains "Content-Type: "
http contains "HTTP/1.0 200 OK" && http contains "Content-Type: "
一定包含如下
Content-Type:


7.
TCP參數過濾
tcp.flags 顯示包含TCP標誌的封包。
tcp.flags.syn == 0x02     顯示包含TCP SYN標誌的封包。
tcp.window_size == 0 && tcp.flags.reset != 1

8.
過濾內容

tcp[20]表示從20開始,取1個字符
tcp[20:]表示從20開始,取1個字符以上
tcp[20:8]表示從20開始,取8個字符
tcp[offset,n]

udp[8:3]==81:60:03 // 偏移8個bytes,再取3個數,是否與==後面的數據相等?
udp[8:1]==32   如果我猜的沒有錯的話,應該是udp[offset:截取個數]=nValue
eth.addr[0:3]==00:06:5B

例子:
判斷upd下面那塊數據包前三個是否等於0x20 0x21 0x22
我們都知道udp固定長度爲8
udp[8:3]==20:21:22

判斷tcp那塊數據包前三個是否等於0x20 0x21 0x22
tcp一般情況下,長度爲20,但也有不是20的時候
tcp[8:3]==20:21:22
如果想得到最準確的,應該先知道tcp長度

matches(匹配)和contains(包含某字符串)語法
ip.src==192.168.1.107 and udp[8:5] matches "\\x02\\x12\\x21\\x00\\x22"
ip.src==192.168.1.107 and udp contains 02:12:21:00:22
ip.src==192.168.1.107 and tcp contains "GET"
udp contains 7c:7c:7d:7d 匹配payload中含有0x7c7c7d7d的UDP數據包,不一定是從第一字節匹配。

例子:
得到本地qq登陸數據包(判斷條件是第一個包==0x02,第四和第五個包等於0x00x22,最後一個包等於0x03)
0x02 xx xx 0x00 0x22 ... 0x03
正確
oicq and udp[8:] matches "^\\x02[\\x00-\\xff][\\x00-\\xff]\\x00\\x22[\\x00-\\xff]+\\x03$"
oicq and udp[8:] matches "^\\x02[\\x00-\\xff]{2}\\x00\\x22[\\x00-\\xff]+\\x03$" // 登陸包
oicq and (udp[8:] matches "^\\x02[\\x00-\\xff]{2}\\x03$" or tcp[8:] matches "^\\x02[\\x00-\\xff]{2}\\x03$")
oicq and (udp[8:] matches "^\\x02[\\x00-\\xff]{2}\\x00\\x22[\\x00-\\xff]+\\x03$" or tcp[20:] matches "^\\x02[\\x00-\\xff]{2}\\x00\\x22[\\x00-\\xff]+\\x03$")

不單單是00:22纔有QQ號碼,其它的包也有,要滿足下麪條件(tcp也有,但沒有做):
oicq and udp[8:] matches "^\\x02[\\x00-\\xff]+\\x03$" and !(udp[11:2]==00:00) and !(udp[11:2]==00:80)
oicq and udp[8:] matches "^\\x02[\\x00-\\xff]+\\x03$" and !(udp[11:2]==00:00) and !(udp[15:4]==00:00:00:00)
說明:
udp[15:4]==00:00:00:00 表示QQ號碼爲空
udp[11:2]==00:00 表示命令編號爲00:00
udp[11:2]==00:80 表示命令編號爲00:80
當命令編號爲00:80時,QQ號碼爲00:00:00:00

得到msn登陸成功賬號(判斷條件是"USR 7 OK ",即前三個等於USR,再通過兩個0x20,就到OK,OK後面是一個字符0x20,後面就是mail了)
USR xx OK [email protected]
正確
msnms and tcp and ip.addr==192.168.1.107 and tcp[20:] matches "^USR\\x20[\\x30-\\x39]+\\x20OK\\x20[\\x00-\\xff]+"

9.
dns模式過濾

10.
DHCP
以尋找僞造DHCP服務器爲例,介紹Wireshark的用法。在顯示過濾器中加入過濾規則,
顯示所有非來自DHCP服務器並且bootp.type==0x02(Offer/Ack)的信息:
bootp.type==0x02 and not ip.src==192.168.1.1

11.
msn
msnms && tcp[23:1] == 20 // 第四個是0x20的msn數據包
msnms && tcp[20:1] >= 41 && tcp[20:1] <= 5A && tcp[21:1] >= 41 && tcp[21:1] <= 5A && tcp[22:1] >= 41 && tcp[22:1] <= 5A
msnms && tcp[20:3]=="USR" // 找到命令編碼是USR的數據包
msnms && tcp[20:3]=="MSG" // 找到命令編碼是MSG的數據包
tcp.port == 1863 || tcp.port == 80

如何判斷數據包是含有命令編碼的MSN數據包?
1)端口爲1863或者80,如:tcp.port == 1863 || tcp.port == 80
2)數據這段前三個是大寫字母,如:
tcp[20:1] >= 41 && tcp[20:1] <= 5A && tcp[21:1] >= 41 && tcp[21:1] <= 5A && tcp[22:1] >= 41 && tcp[22:1] <= 5A
3)第四個爲0x20,如:tcp[23:1] == 20
4)msn是屬於TCP協議的,如tcp

MSN Messenger 協議分析
http://blog.csdn.net/Hopping/archive/2008/11/13/3292257.aspx

MSN 協議分析
http://blog.csdn.net/lzyzuixin/archive/2009/03/13/3986597.aspx

更詳細的說明
<<wireshark過濾表達式實例介紹>>
http://www.csna.cn/viewthread.php?tid=14614

Wireshark 主界面的操作菜單中英對比
http://www.csna.cn/viewthread.php?tid=9645&extra=page%3D1

又一款好的網絡分析軟件
"科來網絡分析系統"

學習Ethereal/Wireshark網站
http://www.csna.cn/index.php

 

 

###########################################################################

 

 

1、wireshark基本的語法字符

\d          0-9的數字
\D          \d的補集(以所以字符爲全集,下同),即所有非數字的字符
\w          單詞字符,指大小寫字母、0-9的數字、下劃線
\W          \w的補集
\s          空白字符,包括換行符\n、回車符\r、製表符\t、垂直製表符\v、換頁符\f
\S          \s的補集
.          除換行符\n外的任意字符。 在Perl中,“.”可以匹配新行符的模式被稱作“單行模式”
.*       匹配任意文本,不包括回車(\n)? 。 而,[0x00-0xff]*        匹配任意文本,包括\n
[…]          匹配[]內所列出的所有字符
[^…]          匹配非[]內所列出的字符

----------------------------------------------------------------------------------------
2、定位字符  所代表的是一個虛的字符,它代表一個位置,你也可以直觀地認爲“定位字符”所代表的是某個字符與字符間的那個微小間隙。

^          表示其後的字符必須位於字符串的開始處
$          表示其前面的字符必須位於字符串的結束處
\b          匹配一個單詞的邊界
\B          匹配一個非單詞的邊界

----------------------------------------------------------------------------------------
3、重複描述字符

{n}          匹配前面的字符n次
{n,}          匹配前面的字符n次或多於n次
{n,m}          匹配前面的字符n到m次
?          匹配前面的字符0或1次
+          匹配前面的字符1次或多於1次
*          匹配前面的字符0次或式於0次

----------------------------------------------------------------------------------------
4、and or 匹配

and 符號 並
or  符號 或
例如:
tcp and tcp.port==80
tcp or udp

----------------------------------------------------------------------------------------
5、wireshark過濾匹配表達式實例

5.1、搜索按條件過濾udp的數據段payload(數字8是表示udp頭部有8個字節,數據部分從第9個字節開始udp[8:])
udp[8]==14        (14是十六進制0x14)匹配payload第一個字節0x14的UDP數據包
udp[8:2]==14:05 可以udp[8:2]==1405,且只支持2個字節連續,三個以上須使用冒號:分隔表示十六進制。 (相當於 udp[8]==14 and udp[9]==05,1405是0x1405)
udp[8:3]==22:00:f7 但是不可以udp[8:3]==2200f7
udp[8:4]==00:04:00:2a,匹配payload的前4個字節0x0004002a
而udp contains 7c:7c:7d:7d 匹配payload中含有0x7c7c7d7d的UDP數據包,不一定是從第一字節匹配。
udp[8:4] matches "\\x14\\x05\\x07\\x18"
udp[8:] matches "^\\x14\\x05\\x07\\x18\\x14"

5.2、搜索按條件過濾tcp的數據段payload(數字20是表示tcp頭部有20個字節,數據部分從第21個字節開始tcp[20:])
tcp[20:] matches "^GET [ -~]*HTTP/1.1\\x0d\\x0a"
等同http matches "^GET [ -~]*HTTP/1.1\\x0d\\x0a"

tcp[20:] matches "^GET (.*?)HTTP/1.1\\x0d\\x0a"
tcp[20:] matches "^GET (.*?)HTTP/1.1\\x0d\\x0a[\\x00-\\xff]*Host: (.*?)pplive(.*?)\\x0d\\x0a"
tcp[20:] matches "^GET (.*?)HTTP/1.1\\x0d\\x0a[\\x00-\\xff]*Host: "
tcp[20:] matches "^POST / HTTP/1.1\\x0d\\x0a[\\x00-\\xff]*\\x0d\\x0aConnection: Keep-Alive\\x0d\\x0a\\x0d\\x0a"

檢測SMB頭的smb標記,指明smb標記從tcp頭部第24byte的位置開始匹配。
tcp[24:4] == ff:53:4d:42

檢測SMB頭的smb標記,tcp的數據包含十六進制ff:53:4d:42,從tcp頭部開始搜索此數據。
tcp contains ff:53:4d:42
tcp matches "\\xff\\x53\\x4d\\x42"

檢測tcp含有十六進制01:bd,從tcp頭部開始搜索此數據。
tcp matches "\\x01\\xbd"

檢測MS08067的RPC請求路徑
tcp[179:13] == 00:5c:00:2e:00:2e:00:5c:00:2e:00:2e:00
                  \      .     .     \     .     .
5.3、其他
http.request.uri matches ".gif$" 匹配過濾HTTP的請求URI中含有".gif"字符串,並且以.gif結尾(4個字節)的http請求數據包($是正則表達式中的結尾表示符)
注意區別:http.request.uri contains ".gif$" 與此不同,contains是包含字符串".gif$"(5個字節)。匹配過濾HTTP的請求URI中含有".gif$"字符串的http請求數據包(這裏$是字符,不是結尾符)

eth.addr[0:3]==00:1e:4f 搜索過濾MAC地址前3個字節是0x001e4f的數據包。

原文鏈接:https://blog.csdn.net/ffggnfgf/article/details/51056018

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章