pcap文件分析-上之wireshark工具使用
1.pcap文件格式说明
pcap文件格式是常用的数据报文存储格式,主流抓包软件,如wireshark、tcpdump等都支持这种格式。
其具体格式为:
pcap文件头 + { 数据报文信息 + 数据报文 }+
通过查看pcap.h文件,可以知道pcap文件头的具体格式(24字节):
struct pcap_file_header {
bpf_u_int32 magic;
u_short version_major;
u_short version_minor;
bpf_int32 thiszone; /* gmt to local correction */
bpf_u_int32 sigfigs; /* accuracy of timestamps */
bpf_u_int32 snaplen; /* max length saved portion of each pkt */
bpf_u_int32 linktype; /* data link type (LINKTYPE_*) */
};
每一个数据报文,都有对应的数据报文信息(16字节),用于记录数据报文收发的时间,数据报文的长度:
struct timeval {
long tv_sec;
suseconds_t tv_usec;
};
struct pcap_pkthdr {
struct timeval ts;
bpf_u_int32 caplen;
bpf_u_int32 len;
};
数据报文,即网络中传输的数据包,其具体格式依赖于具体的网络协议,比如一个数据报文链路层采用以太网协议,网络层采用IP协议,传输层采用TCP协议,那么其内容就需要一层一层向上解析。
如果自己对比协议规范去进行pcap文件的解析,那么这个过程无疑是非常痛苦的,还好有强大的wireshark能帮助我们进行协议分析的工作。这里我们用wireshark和UE打开pcap文件,来直观的学习下pcap的文件格式,具体内容如下图所示:
其中深绿色部分是pcap文件头、浅蓝色是数据报文信息、红色部分则是数据报文。
UE中凌乱的数据在wireshark中呈现得紧紧有条,看到这里也许你迫不及待想好好折腾下wireshark。别着急,在介绍wireshark之前,我们再来介绍一个很重要的概念:网络通信原理 ---- stream。
2.网络通信原理 ---- stream
也许你接触过socket编程,编写过c/s架构的程序,那么你知道client与server间的通信,其实依赖的就是网络数据报文。在编程时,server必然要绑定一个端口进行监听,而client则需要链接server的那个端口。
如果你不太了解socket编程,别着急,我们看下面这个小示例:
#------------------------------------------
#server:
import socket
s = socket.socket()
host = 127.0.0.1
port = 1234
s.bind((host, port))
s.listen(5)
while True:
c, addr = s.accept()
print 'Got connection from', addr
c.send('Thank you for connecting')
c.close()
#------------------------------------------
#client:
import socket
s = socket.socket()
host = 127.0.0.1
port = 1234
s.connect((host, port))
print s.recv(1024)
借助python,你可以轻而易举的写出server和client,这里为了便于单机测试,将其中的host都设置为本机环回地址127.0.0.1。在实际过程中设置为服务器ip地址即可。
正如上面代码所示,在socket编程中host和port的设置是非常关键的。那么具体到在网络通信中来,对于client:host即表明其连接的server ip,我们称之为dip,而port就是server监听的端口,我们称之为dport,当client发起通信连接时,会用其自身ip作为sip,操作系统会为其分配一个随机端口作为sport,这样server收到报文后就会往这个sip/sport发送数据报文,从而实现通信了。
等等,不是说网络通信时有tcp/udp这两种不同的形式吗?但上面没有提到!是的,其实python中进行socket实例化时,默认会采用socket.AF_INET----IPV4协议,socket.SOCK_STREAM----TCP连接。
上面反复谈到连接、连接,那么什么是连接,在上例中client通过tcp协议向server发起连接:
client TCP server
sip/sport ----> dip/dport
server通过相同的协议,对client进行回应:
dip/dport <---- sip/sport
回应报文中的sip/sport和dip/dport正好与请求报文相反。
对于上述两个方向的交互,我们即称为一条网络连接,也就是一条流(stream),它包括两个方向。stream是区分不同的网络通信的重要概念。在后续wireshark的使用中会经常看到它。
注:不同的书籍或者工程师对网络连接或流的定义可能存在差异,这里读者自己把握理解即可。
3.wireshark实用技巧
wireshark支持的协议种类非常宽泛,界面呈现十分友好,其最强大的地方在于协议的decoder,对于常见的协议解析得非常细致,同时它的过滤、统计功能十分强大,非常适合做网络流量的分析。
3.1 decoder
下图是我访问baidu时,其中一个数据报文在wireshark中的解析截图:
有以太头开始,到HTTP请求头,每一层都解析得非常清晰。在以太层,我们可以看到MAC信息;在IP层,我们能看到IP首部的各个字段,其中包括重要的TTL信息、ID信息、SIP/DIP等信息;在TCP层,我们则能知道SPORT/DPORT的信息,windows窗口大小等等;而对于HTTP协议头,wireshark也按行进行了解析,可谓是一目了然。
3.2 过滤
wireshark的过滤分为两种:
捕获过滤(CaptureFilters):用于决定捕获什么样的数据报文,当选择网卡时,点击"Options"选项,即可进行设置:
wireshark捕获过滤器
显示过滤(DisplayFilters):用于在捕获报文中进行特定查找:
wireshark显示过滤器
wireshark的过滤语法非常丰富,具体可以参考下面这篇文章:
http://blog.csdn.net/cumirror/article/details/7054496
3.3 查看流的交互信息
通过在条目上右击,然后选择"follow tcp stream"可以通过stream进行过滤,查看这个连接交互的具体信息。P.S. 注意filter中用到的语法:我在baidu中搜索了“hello” :-)
过滤baidu搜索的连接
stream交互的具体过程
3.4 查看流统计信息
wireshark除了过滤功能外,还有一个比较不错功能,那就是它的统计集。通过menu菜单中的Statistics->Conversations就可以浏览pcap中数据流量的整体信息了:
统计集信息
3.5 pcap文件的过滤保存
有时你想将pcap中特定的内容进行保存,那么可以通过menu菜单中的File->Export Specified Packets来实现:
4.更多参考
http://zh.wikipedia.org/wiki/TCP/IP%E5%8D%8F%E8%AE%AE%E6%97%8F
From: http://ctf.idf.cn/index.php?g=&m=article&a=index&id=10