pcap文件分析-上之wireshark工具入门


在ctf比赛中,往往会遇到network相关的分析题,这部分题一般采用.pcap文件离线分析的方式进行。在这里将从工具使用和编程解析这两个角度介绍pcap的基本分析方法,来帮助大家快速入门。在这篇文章中,将对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

http://wiki.wireshark.org/


下一节:pcap文件分析-下之winpcap开发

在这篇文章中,我们主要了解了pcap的文件格式、网络通信原理和wireshark的基本使用。在下一节中将会介绍pcap的编程知识,通过编程我们可以提取还原网络传输中的附件数据,用于进一步的分析,下次见~

Author:IDF实验室 cumirror

Mail:tongjinam#qq.com

(全文完)


评论



个人信息

求注册,求登录!

解题动态

精选练习

精选教程

联系我们