做應(yīng)用識(shí)別這一塊經(jīng)常要對(duì)應(yīng)用產(chǎn)生的數(shù)據(jù)流量進(jìn)行分析。
抓包采用wireshark,提取特征時(shí),要對(duì)session進(jìn)行過濾,找到關(guān)鍵的stream,這里總結(jié)了wireshark過濾的基本語法,供自己以后參考。(腦子記不住東西)
wireshark進(jìn)行過濾時(shí),按照過濾的語法可分為協(xié)議過濾和內(nèi)容過濾。
對(duì)標(biāo)準(zhǔn)協(xié)議,既支持粗粒度的過濾如HTTP,也支持細(xì)粒度的、依據(jù)協(xié)議屬性值進(jìn)行的過濾如tcp.port==53、http.request.method=="GET"。
對(duì)內(nèi)容的過濾,既支持深度的字符串匹配過濾如http contains "Server",也支持特定偏移處值的匹配過濾如tcp[20:3] == 47:45:54。
wireshark有兩種過濾器:
- 捕捉過濾器(CaptureFilters):用于決定將什么樣的信息記錄在捕捉結(jié)果中。
顯示過濾器(DisplayFilters):用于在捕捉結(jié)果中進(jìn)行詳細(xì)查找。
捕捉過濾器在抓抱前進(jìn)行設(shè)置,決定抓取怎樣的數(shù)據(jù);顯示過濾器用于過濾抓包數(shù)據(jù),方便stream的追蹤和排查。
捕捉過濾器僅支持協(xié)議過濾,顯示過濾器既支持協(xié)議過濾也支持內(nèi)容過濾。
兩種過濾器它們支持的過濾語法并不一樣。
捕捉過濾器--捕捉前依據(jù)協(xié)議的相關(guān)信息進(jìn)行過濾設(shè)置
語法: 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位于網(wǎng)絡(luò)10.6.0.0/16,目的IP的TCP端口號(hào)在200至10000之間,并且目的IP位于網(wǎng)絡(luò) 10.0.0.0/8內(nèi)的所有封包。
字段詳解:
Protocol(協(xié)議):
可能值: ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp and udp.
如果沒指明協(xié)議類型,則默認(rèn)為捕捉所有支持的協(xié)議。
注:在wireshark的HELP-Manual Pages-Wireshark Filter中查到其支持的協(xié)議。
Direction(方向):
可能值: src, dst, src and dst, src or dst
如果沒指明方向,則默認(rèn)使用 “src or dst” 作為關(guān)鍵字。
”host 10.2.2.2″與”src or dst host 10.2.2.2″等價(jià)。
Host(s):
可能值: net, port, host, portrange.
默認(rèn)使用”host”關(guān)鍵字,”src 10.1.1.1″與”src host 10.1.1.1″等價(jià)。
Logical Operations(邏輯運(yùn)算):
可能值:not, and, or.
否(“not”)具有最高的優(yōu)先級(jí)?;?“or”)和與(“and”)具有相同的優(yōu)先級(jí),運(yùn)算時(shí)從左至右進(jìn)行。
“not tcp port 3128 and tcp port 23″與”(not tcp port 3128) and tcp port 23″等價(jià)。
“not tcp port 3128 and tcp port 23″與”not (tcp port 3128 and tcp port 23)”不等價(jià)。
顯示過濾器--對(duì)捕捉到的數(shù)據(jù)包依據(jù)協(xié)議或包的內(nèi)容進(jìn)行過濾
1.協(xié)議過濾語法
語法: Protocol . String 1 . String 2 Comparison operator Value Logical Operations Other expression
例子: http request method == "POST" or icmp.type
string1和string2是可選的。
依據(jù)協(xié)議過濾時(shí),可直接通過協(xié)議來進(jìn)行過濾,也能依據(jù)協(xié)議的屬性值進(jìn)行過濾。
按協(xié)議進(jìn)行過濾:
snmp || dns || icmp 顯示SNMP或DNS或ICMP封包。
按協(xié)議的屬性值進(jìn)行過濾:
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網(wǎng)段的封包。
tcp.port == 25 顯示來源或目的TCP端口號(hào)為25的封包。
tcp.dstport == 25 顯示目的TCP端口號(hào)為25的封包。
http.request.method== "POST" 顯示post請(qǐng)求方式的http封包。
http.host == "tracker.1ting.com" 顯示請(qǐng)求的域名為tracker.1ting.com的http封包。
tcp.flags.syn == 0×02 顯示包含TCP SYN標(biāo)志的封包。
2.內(nèi)容過濾語法
2.1 深度字符串匹配
contains :Does the protocol, field or slice contain a value
示例
tcp contains "http" 顯示payload中包含"http"字符串的tcp封包。
http.request.uri contains "online" 顯示請(qǐng)求的uri包含"online"的http封包。
2.2特定偏移處值的過濾
tcp[20:3] == 47:45:54 /* 16進(jìn)制形式,tcp頭部一般是20字節(jié),所以這個(gè)是對(duì)payload的前三個(gè)字節(jié)進(jìn)行過濾 */
http.host[0:4] == "trac"
過濾中函數(shù)的使用(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過濾支持比較運(yùn)算符、邏輯運(yùn)算符,內(nèi)容過濾時(shí)還能使用位運(yùn)算。
如果過濾器的語法是正確的,表達(dá)式的背景呈綠色。如果呈紅色,說明表達(dá)式有誤。
原文鏈接:http://www.itdecent.cn/p/9233eebfcd6b
過濾IP,如來源IP或者目標(biāo)IP等于某個(gè)IP
例子:
ip.src eq 192.168.1.107 or ip.dst eq 192.168.1.107
或者
ip.addr eq 192.168.1.107 // 都能顯示來源IP和目標(biāo)IP
過濾端口
例子:
tcp.port eq 80 // 不管端口是來源的還是目標(biāo)的都顯示
tcp.port == 80
tcp.port eq 2722
tcp.port eq 80 or udp.port eq 80
tcp.dstport == 80 // 只顯tcp協(xié)議的目標(biāo)端口80
tcp.srcport == 80 // 只顯tcp協(xié)議的來源端口80
udp.port eq 15000
過濾端口范圍
tcp.port >= 1 and tcp.port <= 80
過濾協(xié)議
例子:
tcp
udp
arp
icmp
http
smtp
ftp
dns
msnms
ip
ssl
oicq
bootp
等等
排除arp包,如!arp 或者 not arp
過濾MAC
太以網(wǎng)頭過濾
eth.dst == A0:00:00:04:C5:84 // 過濾目標(biāo)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和目標(biāo)MAC都等于A0:00:00:04:C5:84的
less than 小于 < lt
小于等于 le
等于 eq
大于 gt
大于等于 ge
不等 ne
包長(zhǎng)度過濾
例子:
udp.length == 26 這個(gè)長(zhǎng)度是指udp本身固定長(zhǎng)度8加上udp下面那塊數(shù)據(jù)包之和
tcp.len >= 7 指的是ip數(shù)據(jù)包(tcp下面那塊數(shù)據(jù)),不包括tcp本身
ip.len == 94 除了以太網(wǎng)頭固定長(zhǎng)度14,其它都算是ip.len,即從ip本身到最后
frame.len == 119 整個(gè)數(shù)據(jù)包長(zhǎng)度,從eth開始到最后
eth ---> ip or arp ---> tcp or udp ---> data
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: "
// 響應(yīng)包
http contains "HTTP/1.1 200 OK" && http contains "Content-Type: "
http contains "HTTP/1.0 200 OK" && http contains "Content-Type: "
一定包含如下
Content-Type:
TCP參數(shù)過濾
tcp.flags 顯示包含TCP標(biāo)志的封包。
tcp.flags.syn == 0x02 顯示包含TCP SYN標(biāo)志的封包。
tcp.window_size == 0 && tcp.flags.reset != 1
過濾內(nèi)容
tcp[20]表示從20開始,取1個(gè)字符
tcp[20:]表示從20開始,取1個(gè)字符以上
tcp[20:8]表示從20開始,取8個(gè)字符
tcp[offset,n]
udp[8:3]==81:60:03 // 偏移8個(gè)bytes,再取3個(gè)數(shù),是否與==后面的數(shù)據(jù)相等?
udp[8:1]==32 如果我猜的沒有錯(cuò)的話,應(yīng)該是udp[offset:截取個(gè)數(shù)]=nValue
eth.addr[0:3]==00:06:5B
例子:
判斷upd下面那塊數(shù)據(jù)包前三個(gè)是否等于0x20 0x21 0x22
我們都知道udp固定長(zhǎng)度為8
udp[8:3]==20:21:22
判斷tcp那塊數(shù)據(jù)包前三個(gè)是否等于0x20 0x21 0x22
tcp一般情況下,長(zhǎng)度為20,但也有不是20的時(shí)候
tcp[8:3]==20:21:22
如果想得到最準(zhǔn)確的,應(yīng)該先知道tcp長(zhǎng)度
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數(shù)據(jù)包,不一定是從第一字節(jié)匹配。
例子:
得到本地qq登陸數(shù)據(jù)包(判斷條件是第一個(gè)包==0x02,第四和第五個(gè)包等于0x00x22,最后一個(gè)包等于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}\x03")
oicq and (udp[8:] matches "^\x02[\x00-\xff]{2}\x00\x22[\x00-\xff]+\x03")
不單單是00:22才有QQ號(hào)碼,其它的包也有,要滿足下面條件(tcp也有,但沒有做):
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號(hào)碼為空
udp[11:2]==00:00 表示命令編號(hào)為00:00
udp[11:2]==00:80 表示命令編號(hào)為00:80
當(dāng)命令編號(hào)為00:80時(shí),QQ號(hào)碼為00:00:00:00
得到msn登陸成功賬號(hào)(判斷條件是"USR 7 OK ",即前三個(gè)等于USR,再通過兩個(gè)0x20,就到OK,OK后面是一個(gè)字符0x20,后面就是mail了)
USR xx OK mail@hotmail.com
正確
msnms and tcp and ip.addr==192.168.1.107 and tcp[20:] matches "^USR\x20[\x30-\x39]+\x20OK\x20[\x00-\xff]+"
dns模式過濾
DHCP
以尋找偽造DHCP服務(wù)器為例,介紹Wireshark的用法。在顯示過濾器中加入過濾規(guī)則,
顯示所有非來自DHCP服務(wù)器并且bootp.type==0x02(Offer/Ack)的信息:
bootp.type==0x02 and not ip.src==192.168.1.1
msn
msnms && tcp[23:1] == 20 // 第四個(gè)是0x20的msn數(shù)據(jù)包
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的數(shù)據(jù)包
msnms && tcp[20:3]=="MSG" // 找到命令編碼是MSG的數(shù)據(jù)包
tcp.port == 1863 || tcp.port == 80
如何判斷數(shù)據(jù)包是含有命令編碼的MSN數(shù)據(jù)包?
1)端口為1863或者80,如:tcp.port == 1863 || tcp.port == 80
2)數(shù)據(jù)這段前三個(gè)是大寫字母,如:
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)第四個(gè)為0x20,如:tcp[23:1] == 20
4)msn是屬于TCP協(xié)議的,如tcp
MSN Messenger 協(xié)議分析
http://blog.csdn.net/Hopping/archive/2008/11/13/3292257.aspx
MSN 協(xié)議分析
http://blog.csdn.net/lzyzuixin/archive/2009/03/13/3986597.aspx
更詳細(xì)的說明
<<wireshark過濾表達(dá)式實(shí)例介紹>>
http://www.csna.cn/viewthread.php?tid=14614
Wireshark 主界面的操作菜單中英對(duì)比
http://www.csna.cn/viewthread.php?tid=9645&extra=page%3D1
又一款好的網(wǎng)絡(luò)分析軟件
"科來網(wǎng)絡(luò)分析系統(tǒng)"
學(xué)習(xí)Ethereal/Wireshark網(wǎng)站
http://www.csna.cn/index.php
###########################################################################
1、wireshark基本的語法字符
\d 0-9的數(shù)字
\D \d的補(bǔ)集(以所以字符為全集,下同),即所有非數(shù)字的字符
\w 單詞字符,指大小寫字母、0-9的數(shù)字、下劃線
\W \w的補(bǔ)集
\s 空白字符,包括換行符\n、回車符\r、制表符\t、垂直制表符\v、換頁符\f
\S \s的補(bǔ)集
. 除換行符\n外的任意字符。 在Perl中,“.”可以匹配新行符的模式被稱作“單行模式”
.* 匹配任意文本,不包括回車(\n)? 。 而,[0x00-0xff]* 匹配任意文本,包括\n
[…] 匹配[]內(nèi)所列出的所有字符
[^…] 匹配非[]內(nèi)所列出的字符
2、定位字符 所代表的是一個(gè)虛的字符,它代表一個(gè)位置,你也可以直觀地認(rèn)為“定位字符”所代表的是某個(gè)字符與字符間的那個(gè)微小間隙。
^ 表示其后的字符必須位于字符串的開始處
$ 表示其前面的字符必須位于字符串的結(jié)束處
\b 匹配一個(gè)單詞的邊界
\B 匹配一個(gè)非單詞的邊界
3、重復(fù)描述字符
{n} 匹配前面的字符n次
{n,} 匹配前面的字符n次或多于n次
{n,m} 匹配前面的字符n到m次
? 匹配前面的字符0或1次
+ 匹配前面的字符1次或多于1次
* 匹配前面的字符0次或式于0次
4、and or 匹配
and 符號(hào) 并
or 符號(hào) 或
例如:
tcp and tcp.port==80
tcp or udp
5、wireshark過濾匹配表達(dá)式實(shí)例
5.1、搜索按條件過濾udp的數(shù)據(jù)段payload(數(shù)字8是表示udp頭部有8個(gè)字節(jié),數(shù)據(jù)部分從第9個(gè)字節(jié)開始udp[8:])
udp[8]==14 (14是十六進(jìn)制0x14)匹配payload第一個(gè)字節(jié)0x14的UDP數(shù)據(jù)包
udp[8:2]==14:05 可以u(píng)dp[8:2]==1405,且只支持2個(gè)字節(jié)連續(xù),三個(gè)以上須使用冒號(hào):分隔表示十六進(jìn)制。 (相當(dāng)于 udp[8]==14 and udp[9]==05,1405是0x1405)
udp[8:3]==22:00:f7 但是不可以u(píng)dp[8:3]==2200f7
udp[8:4]==00:04:00:2a,匹配payload的前4個(gè)字節(jié)0x0004002a
而udp contains 7c:7c:7d:7d 匹配payload中含有0x7c7c7d7d的UDP數(shù)據(jù)包,不一定是從第一字節(jié)匹配。
udp[8:4] matches "\x14\x05\x07\x18"
udp[8:] matches "^\x14\x05\x07\x18\x14"
5.2、搜索按條件過濾tcp的數(shù)據(jù)段payload(數(shù)字20是表示tcp頭部有20個(gè)字節(jié),數(shù)據(jù)部分從第21個(gè)字節(jié)開始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"
檢測(cè)SMB頭的smb標(biāo)記,指明smb標(biāo)記從tcp頭部第24byte的位置開始匹配。
tcp[24:4] == ff:53:4d:42
檢測(cè)SMB頭的smb標(biāo)記,tcp的數(shù)據(jù)包含十六進(jìn)制ff:53:4d:42,從tcp頭部開始搜索此數(shù)據(jù)。
tcp contains ff:53:4d:42
tcp matches "\xff\x53\x4d\x42"
檢測(cè)tcp含有十六進(jìn)制01:bd,從tcp頭部開始搜索此數(shù)據(jù)。
tcp matches "\x01\xbd"
檢測(cè)MS08067的RPC請(qǐng)求路徑
tcp[179:13] == 00:5c:00:2e:00:2e:00:5c:00:2e:00:2e:00
\ . . \ . .
5.3、其他
http.request.uri matches ".gif$" 匹配過濾HTTP的請(qǐng)求URI中含有".gif"字符串,并且以.gif結(jié)尾(4個(gè)字節(jié))的http請(qǐng)求數(shù)據(jù)包($是正則表達(dá)式中的結(jié)尾表示符)
注意區(qū)別:http.request.uri contains ".gif$" 與此不同,contains是包含字符串".gif$"(5個(gè)字節(jié))。匹配過濾HTTP的請(qǐng)求URI中含有".gif$"字符串的http請(qǐng)求數(shù)據(jù)包(這里$是字符,不是結(jié)尾符)
eth.addr[0:3]==00:1e:4f 搜索過濾MAC地址前3個(gè)字節(jié)是0x001e4f的數(shù)據(jù)包。