灵活使用过滤器。
IP地址: 是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一个主机分配了一个逻辑地址。
捕获单个IP地址数据
host ip/ipv6/网址/
.
host ip or host ip
no host IP 排除这个ip
src host ip 捕获ip主机上的数据
dst host ip 同上
net ip/24 捕获到达/来自ip网络中任何主机的数据
net ip mask 255.255.255.0 同上
ip6 net ipv6 来自ipv6网络中、同上
dst net ip/24 捕获到达ip地址网络内所有数据
src net ip/24 捕获来自ip地址网络内所有数据
not dst net ip 捕获除ip网络外的所有数据
捕获广播或多播地址数据
ip broadcast 捕获到255.255.255.0的数据
ip multicast 捕获通过239.255.255.255 ~ 224.0.0.0的数据
dst host ff02::1 (ipv6) 捕获所有主机到IPv6多播地址的数据
dst host ff02::2 捕获所有路由到IPv6多播地址的数据
捕获MAC地址数据
ether host mac 捕获到达/来自mac主机的数据
ether src mac 捕获来自mac主机的数据
ether dst mac 捕获到达mac同上
not ether host mac 捕获到达/来自除mac外的主机的数据
捕获所有端口号的数据
port 53 捕获到达/来自端口号为53的UDP/TCP数据(典型的DNS数据)

结合基于端口的捕获过滤器
port 20 or port 21捕获到达/来自20或21端口号的所有UDP/TCP数据

捕获特定ICMP数据

显示单个IP地址或主机数据
ip.src 捕获源IPv4地址的数据
ip.dst 捕获目标IPv4地址的数据
ip.host 表示到达/来自解析某网站后IPv4地址的数据
ip.addr 表示到达/来自 IPv4地址的数据
对于IPv6数据 可以使用的字段如下:
ipv6.src 捕获源IPv6地址的数据
ipv6.dst 表示捕获目标IPv6地址的数据
ipv6.host 表示到达/来自解析某网站后IPv6地址的数据
ipv6.addr表示到达/来自 IPv6地址的数据
显示过滤:wireshark过滤经过指定ip的数据包
显示过滤可以完整的复现测试时的网络环境,但会产生较大的捕获文件和内存占用。
ip.addr ==192.168.1.1 //显示所有目标或源地址是192.168.1.1的数据包
ip.dst==192.168.1.1 //显示目标地址是192.168.1.1的数据包
ip.src ==192.168.1.1 //显示源地址是192.168.1.1的数据包
eth.addr== 80:f6:2e:ce:3f:00 //根据MAC地址过滤,详见“wireshark过滤MAC地址/物理地址”
ip.src==192.168.0.0/16 //网络过滤,过滤一个网段
捕获过滤:wireshark捕获经过指定ip的数据包
捕捉过滤抓包前在capture option中设置,仅捕获符合条件的包,可以避免产生较大的捕获文件和内存占用,但不能完整的复现测试时的网络环境。
host 192.168.1.1 //抓取192.168.1.1 收到和发出的所有数据包
src host 192.168.1.1 //源地址,192.168.1.1发出的所有数据包
dst host 192.168.1.1 //目标地址,192.168.1.1收到的所有数据包
src host hostname //根据主机名过滤
ether host 80:05:09:03:E4:35 //根据MAC地址过滤
net 192.168.1 //网络过滤,过滤整个网段
src net 192.168
dst net 192
使用“非/且/或”建立组合过滤条件可以获得更精确的捕获
非: ! or “not” (去掉双引号)
且: && or “and”
或: || or “or”
wirershark过滤指定ip收发数据包示例:
抓取所有目的地址是192.168.1.2 或192.168.1.3 端口是80 的TCP 数据
(tcp port 80) and ((dst host 192.168.1.2) or (dst host
192.168.1.3)) //捕获过滤
tcp.port==80&&(ip.dst==192.168.1.2||ip.dst==192.168.1.3) //显示过滤
抓取所有目标MAC 地址是80:05:09:03:E4:35 的ICMP 数据
(icmp) and ((ether dst host 80:05:09:03:E4:35))
icmp && eth.dst==80:05:09:03:E4:35
抓取所有目的网络是192.168,但目的主机不是192.168.1.2 的TCP 数据
(tcp) and ((dst net 192.168) and (not dst host 192.168.1.2))
tcp&&ip.src==192.168.0.0/16&&!(ip.src==192.168.1.2)
捕获主机192.168.1.1 和主机192.168.1.2 或192.168.1.3的通信
host 192.168.1.1 and (192.168.1.2 or 192.168.1.3 )
ip.addr==192.168.1.1&&(ip.addr==192.168.1.2||ip.addr==192.168.1.3)
获取主机192.168.1.1除了和主机192.168.1.2之外所有主机通信的数据包
host 192.168.1.1 and ! 192.168.1.2
ip.addr==192.168.1.1&&!ip.addr==192.168.1.2
获取主机192.168.1.1接收或发出的telnet包,telnet使用tcp 23端口
tcp port 23 and host 192.168.1.1
tcp.port==23&&ip.addr==192.168.1.1
一、网络分析
0×00:只抓包头
在进行网络分析时往往只需要知道两个节点是不是能够联通,具体的传输信息并不重要,所以抓包的时候可以设置只抓包头,这样就大大减少了数据包的大小,有利于数据分析。
设置方法:Capture(捕获)–>Options(选项)–>Snaplen(Snap长度)。
将这个值设置200以下就可以抓到所有网络层次的头信息了。
Wireshark469.png
另外也可以直接点击任务栏里的快捷键,快速设置
Wireshark494.png
0×01:只抓必要的包
我们可以设置抓包的filter,只抓一些感兴趣的包。
设置方法:Capture(捕获)–>Options(选项)–>Capture Filter(捕获过滤器)
Wireshark591.png
在输入框里输入规则,然后点击开始即可,比如输入
dst host 220.181.111.188(捕获目标主机为220.181.111.188的数据包)
220.181.111.188是ping www.baidu.com的ip地址,不同地理位置ping的ip可能不一样,然后浏览器访问百度就可以看到我们想要的捕获结果。
Wireshark754.png
0×02:过滤
使用过滤规则进行数据包筛选是Wireshark最强大的功能之一,比如如果知道问题发生的具体协议就可以以协议名称过滤。使用协议过滤时要注意协议之间的依赖性,比如NFS共享挂载失败,问题可能发生在挂载所用的mount协议,也可能发生在mount之前的portmap协议。
Wireshark898.png
然后就是IP+端口的方式,一个比较简单的方法就是可以在感兴趣的数据包上右键然后点击“追踪流”,就可以看到与这对ip和端口的全部通信。
Wireshark967.png
也可以在相应的包上右键–>Apply as Filter(作为过滤器应用)–>Selected(选中),Wireshark就可以自动生成相应的过滤规则。这里给出一些常用的规则。
过滤IP:
IP源地址:ip.src ==192.168.1.1
IP目的地址:ip.dst== 192.168.1.1
IP地址(包括源和目的):ip.addr== 192.168.1.1
过滤端口:
TCP端口:tcp.port==80
TCP目的端口:tcp.dstport == 80
TCP源端口:tcp.srcport == 80
UDP端口:udp.port eq 15000
TCP 1-80之间的端口:tcp.port >= 1 and tcp.port <= 80
过滤协议:
http、tcp、udp、arp、icmp、http、smtp、ftp、dns 等。
过滤MAC地址:
源MAC地址:eth.src==A0:00:00:04:C5:84
目的MAC地址:eth.dst==A0:00:00:04:C5:84
MAC地址(包括源和目的):eth.addr==A0:00:00:04:C5:84
过滤包长度:
整个UDP数据包:udp.length==20
TCP数据包中的IP数据包:tcp.len>=20
Wireshark4954.png
整个IP数据包:ip.len==20
整个数据包:frame.len==20
HTTP模式过滤:
请求方法为GET:http.request.method==“GET”
请求方法为POST:http.request.method==“POST”
指定URI:http.request.uri==“/img/logo-edu.gif”
请求或相应中包含特定内容:http contains “FLAG”
0×03:自动分析
Wireshark有强大的统计分析功能,可以帮助分析人员快速统计出一些基本信息。比如点击Analyze(分析)–>Expert InfoComposite(专家信息),就可以看到数据包的中的一些不同级别的信息统计,包含重传次数、链接建立次数、网络错误等,在分析网络性能时这个功能很有作用。
Wireshark1891.png
单击Statistics(统计)–>TCPStream Graph(TCP流图形),可以生成一些统计图表,比如下图表示171到192的数据传输过程,水平线表示短暂的停止过程。
Wireshark1983.png
此外还可以统计分层信息、网络会话列表、网络端点列表、ip地址统计列表、应用层数据包信息等。
0×04:搜索
按“Ctrl+F”Wireshark也可以进行关键字搜索,选择“分组详情”后才可以搜索数据包中的内容,这样的搜索可以在CTF中也许会有意外收获。
Wireshark2112.png
二、CTF
下面每一种对应的操作都会给出一到几个CTF题目的例子,帮助大家快速上手。
0×00:搜索
题目文件:key.pcapng——https://pan.baidu.com/s/1kVyyCbt
题目描述:flag被盗,赶紧溯源!
题目题解:
首先可以只将这个数据包当做文本文件打开,比如用一些notepad++编辑器,然后直接搜索
Wireshark2258.png
正经的做法就是用Wireshark自带的搜索功能找尝试查找一些关键词(比如key、flag、shell、pass等),往往直接搜索就能有意外收获。
Wireshark2334.png
然后跟进可疑的数据包
Wireshark2347.png
根据数据包特征,很明显看出这是一个菜刀连接一句话木马的数据包,然后往下找,即可看到读取的flag
Wireshark2398.png
0×01:文件提取
题目文件: caidao.pcapng——https://pan.baidu.com/s/1kVyyCbt
题目描述:有人偷偷下载了文件!
题目题解:
根据题意可能数据包中存在文件传输,尝试直接导出,选择File(文件)–>Export Objexts(导出对象),然后可以看到一些协议,比如选中http就可以看到通过http传输的一些文件,在右下角有导出按钮,可生生成相应的文件。但是本题中无法用此方法直接看到被下载的文件,因为有些文件是直接通过tcp或udp协议传输的,http协议只能看到的访问的链接,但不会看到传输的内容(比如你去访问放一个链接download.php?file=test.rar,通过上述导出对象的方式看不出来下载的文件的内容的),如下如所示。
Wireshark2718.png
这个时候就需要找到那个执行下载的数据包,找到数据传输的部分再导出,比如下面这个数据包
Wireshark2763.png
大概是一个菜刀下载的过程,在最后一个包可以看到下载的文件,直接右键点击“导出分组字节流”,然后保存为.tar.gz文件
Wireshark2825.pngWireshark5299.png
本题中最后还要使用16进制编辑器去除开头和结尾的X@Y字符,这个是菜刀的特征符号,不是文件内容。
Wireshark2876.png
再或者一个简单的方法,右键“显示分组字节流”,去除前后各三个字节在解压缩
Wireshark2915.png
再复杂一点就是多个包的数据提取了,一个较大的文件其传输过程可能要经过多个数据包,比如下面这道题目。
题目文件:misc_fly.p.capng—— https://pan.baidu.com/s/1kVyyCbt
题目描述:抓到一只苍蝇!
题目题解:
首先用HTTP条件过滤一下
Wireshark3025.png
右键第一个包,追踪流
Wireshark3038.png
可以看到一些基本信息,首先这是一个POST数据包,发送了一些文件相关信息,包括名称(fly.rar)和大小(525701)等。接下来应该就是文件实际上传的数据包,将过滤条件改为
http.request.method==”POST”
Wireshark3157.png
从数据包的结构上看应该就是第二至第六个数据包是数据传输的过程。点开第二个可以看到MediaType的长度为131436=
Wireshark3220.png
第二到第五个都是一样的长度,第六个为1777,应该是剩余的最后一部分数据。但是131436*4+1777=527521!=525701,再看下第一个数据包
Wireshark3300.png
都知道rar文件头应该是Rar,但是选中的数据部分前面却多出了很多,简单计算一下一共多出了364,且364*5+525701=527521。所以多出的也许是某种校验数据,在导出的时候将其忽略。
Wireshark3399.png
每个包都做同样的操作即可得出5个文件,再将这个文件按顺序拼接即可。拼接的话可以使用16进制编辑器手动拼接,也可以使用linux下cat命令,比如“cat 1 2 3 4 5 > fly.rar”。这道题还设置了伪加密,需要修改加密位,将0×84位置改为0×80即可。
Wireshark3535.png
解压出来后是一个exe可执行文件,里面隐藏了一个png图片,是个二维码,扫描即可得到flag。
Wireshark3585.png
Flag:flag{m1Sc_oxO2_Fly}
0×02:信息提取
题目文件: sqlmap.pcap——https://pan.baidu.com/s/1kVyyCbt
题目描述:
Wireshark3653.png
题目题解:
数据包记录的是sqlmap获取flag的过程,使用http && http contains”flag”过滤一下
Wireshark3719.png
可以看出这是一个布尔盲注的过程,一位一位的读取flag,然后用二分法不断判断其ascii码的范围并最终确定这一位的值。第806个包是读取flag第一位的数据包
Wireshark3801.png
将其payload解码一下是这样的,判断其ascii码是否大于64
id=1 AND ORD(MID((SELECTIFNULL(CAST(value AS CHAR),0×20) FROM isg.flags ORDER BY value LIMIT0,1),1,1))>64
然后一直到836个包判断第一位ascii码值大于72,然后开始从高到低递减,判断其ascii码不大于73,则第一位的ascii码值是73,对应的字符为I。以此类推,其flag为ISG{BLind_SQl_InJEcTi0N_DeTEcTEd}。本题需要一定的耐心和SQL注入基础。但是这么做可能有些繁琐,其实pcap数据包可以直接用文本编辑器打开,就可以看到其中的http请求
Wireshark4138.png
所以可以使用字符串搜索的方式直接去查找其中的语句,然后判断flag,首先将原数据包中的http请求导出来,另存为sqli.pcap
Wireshark4206.png
导出后的文件为: sqli.pcap——https://pan.baidu.com/s/1kVyyCbt
再使用如下的Python脚本一键读取即可
Wireshark4258.png
ISG{BLind_SQl_InJEcTi0N_DeTEcTEd}
三、Tshark
Tshark是命令行版的Wireshark,相对于Wireshark它有更好地灵活性,结合脚本程序可以发挥巨大的威力,在安装Wireshark的时候就默认安装了Tshark。
Wireshark4389.png
如下是运行-h参数,具体的参数解释可以参考官方文档
https://www.wireshark.org/docs/man-pages/tshark.html
Wireshark4470.png
比如kali下的一个简单的使用示例(windows不知为何无法获取网卡)
Wireshark4509.png
-s 512:只抓取前512个字节
-i eth0:监听eth0网卡
Tshark的-z参数可以进行各种信息的统计,比如下面这条命令,统计每一秒钟里由ip为的192.168.228.128主机发出的http请求的次数
tshark -zio,stat,1.00,http&&ip.src==192.168.228.128
程序在监听的时候会不断输出拦截的数据信息
Wireshark4694.png
最后终止的时候则会给出一个报表
Wireshark4712.png
这些统计信息都可以直接写入报告或直接导入excel进行下一步处理。
四、使用Python进行数据包分析
Python本身也可以解析数据包,它可以向Wireshark一样将pcap数据包分层解析,然后进行数据处理,这里需要安装scapy模块,如果安装不成功可以在kali2.0里尝试运行。网络模型大家应该有所了解,按不同的标准有七层和五层的分法,Wireshark就是按不同层次解析数据。同理scapy也是如此,下面这段代码打开上文提到的sqlmap.pcap数据包后是这样的
Wireshark4952.png
Wireshark4954.png
scapy主要是分为Ethernet、IP、TCP、Raw这四层,每一层都有每一层的关键字,可以利用键值对的方式直接读取相应的内容。其实Python适合处理大量数据包的情况,比如需要从100个数据包中查找某个特征,使用Wireshark一个一个打开就不现实,可以写脚本批量处理。这里给出一个示例代码,其作用是将/root/pcap文件夹里的数据包全部读取一遍,查找其中存在长度为32的字符串的数据包,并将其写入到另一个文件夹中。(Python对pcapng格式的数据包处
Wireshark5215.png
Wireshark5217.png
测试数据包如下,是我们上文提到的几个数据包及两个测试数据包
20160813-084957.pcap/20160813-083457.pcap——https://pan.baidu.com/s/1kVyyCbt
Wireshark5288.png
然后执行代码运行
Wireshark5299.png
在result文件夹里可以看到20160813-084957.pcap中存在符合条件的字符串,并且生成了对应的txt文件。同理,我们可以改变查找的规则,在大量数据包中查找我们想要的信息。
Wireshark5395.png
frame contains "string" 关键字搜索。不区分大小写
fpt.request.arg contains "admin" 在FTP请求参数字段中搜索admin。
frame matches "(?i)(sombrero|football)"
专家信息记录的是关于整个网络中TCP的信息。如丢包、接受包堵塞。
分析 -> 专家信息。
应用过滤器 类型过滤器
bootp 显示所有DHCP流量 (基于BOOTP)
dns: 显示所有DNS流量,包括基于TCP传输和UDP的DNS请求和响应。
tftp 显示所有TFTP(简单文件传输协议)流量。
http 显示所有HTTP命令、 响应和数据传输包。但不显示TCP握手包/确认包/断开连接的包。
icmp 显示所有ICMP流量。
字段存在过滤器
bootp.option.hostname显示所有DHCP流量,包含主机名(DHCP 是基于BOOTP)
http.host显示所有包含有HTTP主机名字段的HTTP包。该包通常是由客户端发送给一个Web服务器的请求。
ftp.request.command 显示所有FTP命令数据,如USER、PASS或RETR命令
特有的过滤器
tcp.analysis.flags 显示所有与TCP标识相关的包,包括丢包、重发或者零窗口标志。
tcp.analysis.zero_window 显示被标志的包来表示发送方的缓冲空间已满。
过滤器背景
红色 表示不能运行
绿色 语法正确并可以运行
黄色: 语法正确 但是可能结果不理想。
识别字段名
选中看软件底部。
比较运算符
等于 不等于 大于小于 大于等于 小于等于
或or
包含contains “txt”
匹配 matches: ftp.request.arg matcher "admin":
表达式过滤器

过滤显示HTTP
过滤器过滤http 无法看CTP三次握手的数据包
所以想查看TCP相关数据包 过滤器输入tcp.port == 80
因为当客户端与web服务器通过TCP三次握手建立连接时 使用的时TCP协议的80端口。
客户端通过TCP三次握手与服务器成功建立连接后 可以向服务器发送http GET请求。
过滤显示DHCP
过滤器语法为bootp
使用复杂表达式过滤
&&或and:ip.src == 10.2.2.2 && tcp.port == 80 表示显示源地址 10.2.2.2主机 并且端口号为80的所有IPv4流量
使用ip.addr != 无法运行 正确是!ip.addr == 10.2.2.2 排除来自此ip的数据
使用!tcp.flasg.syn == 1无法运行 正确是tcp.flasg.syn != 1 仅显示SYN设置为0的TCP包
使用通用匹配符
gtp.request.arg matches "me.r"
http.request.uri matches "baby.{1, 3}smiling" 搜索两个单词之间达到三个字符的数据
快速过滤方式

专家信息6个选项卡意义

导出图片
文件、导出对象、http
理想情况下,我们可以根据Conversation视图下统计的Packets的个数,判断该端口是否开放,如果是3(TCP三次握手)可以认为该端口开放,但这是发生在网络状况良好,重传数据包很少的情况下
在实际情况下我们可以采用较为保险的方法,通过Wireshark的过滤选项(tcp.flags.syn == 1 && tcp.flags.ack == 1 && ip.src == 192.168.0.99 && !tcp.analysis.retransmission)准确定位开放端口的数据包,结果开放端口包括:22、111、32768、80、443、53
网友评论