From: http://blog.csdn.net/xmphoenix/article/details/6546022 http://www.seanyxie.com/wireshark%E5%8C%85%E8%BF%87%E6%BB%A4%E8%AF%AD%E6%B3%95/
Wireshark是世界上最流行的網絡分析工具。這個強大的工具可以捕捉網絡中的數據,並為用戶提供關於網絡和上層協議的各種信息。與很多其他網 絡工具一樣,Wireshark也使用pcap network library來進行封包捕捉。可破解局域網內QQ、郵箱、msn、賬號等的密碼!!
wireshark的原名是Ethereal,新名字是2006年起用的。當時Ethereal的主要開發者決定離開他原來供職的公司,並繼續開發這個軟件。但由於Ethereal這個名稱的使用權已經被原來那個公司注冊,Wireshark這個新名字也就應運而生了。
在成功運行Wireshark之后,我們就可以進入下一步,更進一步了解這個強大的工具。
下面是一張地址為192.168.1.2的計算機正在訪問“openmaniak.com”網站時的截圖。
1. MENUS(菜單)
2. SHORTCUTS(快捷方式)
3. DISPLAY FILTER(顯示過濾器)
4. PACKET LIST PANE(封包列表)
5. PACKET DETAILS PANE(封包詳細信息)
6. DISSECTOR PANE(16進制數據)
7. MISCELLANOUS(雜項)
程序上方的8個菜單項用於對Wireshark進行配置:
- "File"(文件)
- "Edit" (編輯)
- "View"(查看)
- "Go" (轉到)
- "Capture"(捕獲)
- "Analyze"(分析)
- "Statistics" (統計)
- "Help" (幫助)
打開或保存捕獲的信息。
查找或標記封包。進行全局設置。
設置Wireshark的視圖。
跳轉到捕獲的數據。
設置捕捉過濾器並開始捕捉。
設置分析選項。
查看Wireshark的統計信息。
查看本地或者在線支持。
在菜單下面,是一些常用的快捷按鈕。
您可以將鼠標指針移動到某個圖標上以獲得其功能說明。
顯示過濾器用於查找捕捉記錄中的內容。
請不要將捕捉過濾器和顯示過濾器的概念相混淆。請參考Wireshark過濾器中的詳細內容。 返回頁面頂部
封包列表中顯示所有已經捕獲的封包。在這里您可以看到發送或接收方的MAC/IP地址,TCP/UDP端口號,協議或者封包的內容。
如果捕獲的是一個OSI layer 2的封包,您在Source(來源)和Destination(目的地)列中看到的將是MAC地址,當然,此時Port(端口)列將會為空。
如果捕獲的是一個OSI layer 3或者更高層的封包,您在Source(來源)和Destination(目的地)列中看到的將是IP地址。Port(端口)列僅會在這個封包屬於第4或者更高層時才會顯示。
您可以在這里添加/刪除列或者改變各列的顏色:
Edit menu -> Preferences
5. PACKET DETAILS PANE(封包詳細信息)
這里顯示的是在封包列表中被選中項目的詳細信息。
信息按照不同的OSI layer進行了分組,您可以展開每個項目查看。下面截圖中展開的是HTTP信息。
“解析器”在Wireshark中也被叫做“16進制數據查看面板”。這里顯示的內容與“封包詳細信息”中相同,只是改為以16進制的格式表述。
在上面的例子里,我們在“封包詳細信息”中選擇查看TCP端口(80),其對應的16進制數據將自動顯示在下面的面板中(0050)。
在程序的最下端,您可以獲得如下信息:
- - 正在進行捕捉的網絡設備。
- 捕捉是否已經開始或已經停止。
- 捕捉結果的保存位置。
- 已捕捉的數據量。
- 已捕捉封包的數量。(P)
- 顯示的封包數量。(D) (經過顯示過濾器過濾后仍然顯示的封包)
- 被標記的封包數量。(M)
正如您在Wireshark教程第一部分看到的一樣,安裝、運行Wireshark並開始分析網絡是非常簡單的。
使用Wireshark時最常見的問題,是當您使用默認設置時,會得到大量冗余信息,以至於很難找到自己需要的部分。
過猶不及。
這就是為什么過濾器會如此重要。它們可以幫助我們在龐雜的結果中迅速找到我們需要的信息。
-
-
捕捉過濾器:用於決定將什么樣的信息記錄在捕捉結果中。需要在開始捕捉前設置。
顯示過濾器:在捕捉結果中進行詳細查找。他們可以在得到捕捉結果后隨意修改。
那么我應該使用哪一種過濾器呢?
兩種過濾器的目的是不同的。
捕捉過濾器是數據經過的第一層過濾器,它用於控制捕捉數據的數量,以避免產生過大的日志文件。
顯示過濾器是一種更為強大(復雜)的過濾器。它允許您在日志文件中迅速准確地找到所需要的記錄。
兩種過濾器使用的語法是完全不同的。我們將在接下來的幾頁中對它們進行介紹:
1. 捕捉過濾器
捕捉過濾器的語法與其它使用Lipcap(Linux)或者Winpcap(Windows)庫開發的軟件一樣,比如著名的TCPdump。捕捉過濾器必須在開始捕捉前設置完畢,這一點跟顯示過濾器是不同的。
設置捕捉過濾器的步驟是:
- 選擇 capture -> options。
- 填寫"capture filter"欄或者點擊"capture filter"按鈕為您的過濾器起一個名字並保存,以便在今后的捕捉中繼續使用這個過濾器。
- 點擊開始(Start)進行捕捉。
語法:
Protocol
Direction
Host(s)
Value
Logical Operations
Other expression
例子:
tcp dst 10.1.1.1 80 and
tcp dst 10.2.2.2 3128
Protocol(協議):
可能的值: ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp and udp.
如果沒有特別指明是什么協議,則默認使用所有支持的協議。 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)"不同。
例子:
tcp dst port 3128
顯示目的TCP端口為3128的封包。
ip src host 10.1.1.1
顯示來源IP地址為10.1.1.1的封包。
host 10.1.2.3
顯示目的或來源IP地址為10.1.2.3的封包。
src portrange 2000-2500
顯示來源為UDP或TCP,並且端口號在2000至2500范圍內的封包。
not imcp
顯示除了icmp以外的所有封包。(icmp通常被ping工具使用)
src host 10.7.2.12 and not dst net 10.200.0.0/16
顯示來源IP地址為10.7.2.12,但目的地不是10.200.0.0/16的封包。
(src 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或者來源網絡為10.6.0.0/16,目的地TCP端口號在200至10000之間,並且目的位於網絡10.0.0.0/8內的所有封包。
注意事項:
當使用關鍵字作為值時,需使用反斜杠“/”。
"ether proto /ip" (與關鍵字"ip"相同).
這樣寫將會以IP協議作為目標。
"ip proto /icmp" (與關鍵字"icmp"相同).
這樣寫將會以ping工具常用的icmp作為目標。
可以在"ip"或"ether"后面使用"multicast"及"broadcast"關鍵字。
當您想排除廣播請求時,"no broadcast"就會非常有用。
查看 TCPdump的主頁以獲得更詳細的捕捉過濾器語法說明。
在Wiki Wireshark website上可以找到更多捕捉過濾器的例子。 2. 顯示過濾器:
通常經過捕捉過濾器過濾后的數據還是很復雜。此時您可以使用顯示過濾器進行更加細致的查找。
它的功能比捕捉過濾器更為強大,而且在您想修改過濾器條件時,並不需要重新捕捉一次。
語法:
Protocol
.
String 1
.
String 2
Comparison
operator
Value
Logical
Operations
Other
expression
例子:
ftp
passive
ip
==
10.2.3.4
xor
icmp.type
Protocol(協議):
您可以使用大量位於OSI模型第2至7層的協議。點擊"Expression..."按鈕后,您可以看到它們。
比如:IP,TCP,DNS,SSH
您同樣可以在如下所示位置找到所支持的協議:
Wireshark的網站提供了對各種 協議以及它們子類的說明。 String1, String2 (可選項):
協議的子類。
點擊相關父類旁的"+"號,然后選擇其子類。
Comparison operators (比較運算符):
可以使用6種比較運算符:
英文寫法:
C語言寫法:
含義:
eq
==
等於
ne
!=
不等於
gt
>
大於
lt
<
小於
ge
>=
大於等於
le
<=
小於等於
Logical expressions(邏輯運算符):
英文寫法:
C語言寫法:
含義:
and
&&
邏輯與
or
||
邏輯或
xor
^^
邏輯異或
not
!
邏輯非
被程序員們熟知的邏輯異或是一種排除性的或。當其被用在過濾器的兩個條件之間時,只有當且僅當其中的一個條件滿足時,這樣的結果才會被顯示在屏幕上。
讓我們舉個例子:
"tcp.dstport 80 xor tcp.dstport 1025"
只有當目的TCP端口為80或者來源於端口1025(但又不能同時滿足這兩點)時,這樣的封包才會被顯示。
例子:
snmp || dns || icmp
顯示SNMP或DNS或ICMP封包。
ip.addr == 10.1.1.1
顯示來源或目的IP地址為10.1.1.1的封包。
ip.src != 10.1.2.3 or ip.dst != 10.4.5.6
顯示來源不為10.1.2.3或者目的不為10.4.5.6的封包。
換句話說,顯示的封包將會為:
來源IP:除了10.1.2.3以外任意;目的IP:任意
以及
來源IP:任意;目的IP:除了10.4.5.6以外任意
ip.src != 10.1.2.3 and ip.dst != 10.4.5.6
顯示來源不為10.1.2.3並且目的IP不為10.4.5.6的封包。
換句話說,顯示的封包將會為:
來源IP:除了10.1.2.3以外任意;同時須滿足,目的IP:除了10.4.5.6以外任意
tcp.port == 25
顯示來源或目的TCP端口號為25的封包。
tcp.dstport == 25
顯示目的TCP端口號為25的封包。
tcp.flags
顯示包含TCP標志的封包。
tcp.flags.syn == 0x02
顯示包含TCP SYN標志的封包。
如果過濾器的語法是正確的,表達式的背景呈綠色。如果呈紅色,說明表達式有誤。
表達式正確
錯誤
常見過濾規則:
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 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]+”
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=1
又一款好的網絡分析軟件
“科來網絡分析系統”
學習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的數據包。