Wireshark工具的使用

Wireshark工具简介

WireShark(前身: Ethereal) 是当前非常流行和厉害的网络封包分析工具,可以截取各种网络数据包,并显示数据包详细信息,不仅常用于测试过程中定位问题,更在网络故障定位,Web渗透中随处可见。

Wireshark抓包原理

Wireshark使用的环境大致分为两种,一种是电脑直连互联网的单机环境,另外一种就是应用比较多的互联网环境,也就是连接交换机的情况。

「单机情况」下,Wireshark直接抓取本机网卡的网络流量。

「交换机情况」下,Wireshark通过端口镜像、ARP欺骗等方式获取局域网中的网络流量。

  • 端口镜像:利用交换机的接口,将局域网的网络流量转发到指定电脑的网卡上。
  • ARP欺骗:交换机根据MAC地址转发数据,伪装其他终端的MAC地址,从而获取局域网的网络流量。

Wireshark工具的安装

工具的安装请百度一下,你就知道。

官网下载地址:https://www.wireshark.org/

国内下载地址:https://pc.qq.com/search.html#!keyword=wireshark

Wireshark界面的介绍

开始捕获前的页面

image-20230803221304719

详细介绍:

  • 主工具栏包含了开始捕获、停止捕获、显示最新分组等操作的按键;
  • 显示过滤器可输入过滤规则,使分组列表窗口仅显示符合规则的数据包;
  • 捕获过滤器可输入规则,在抓包的时候捕获符合规则的数据包;
  • 状态工具栏则显示软件当前状态与已捕获&显示的分组数量。

捕获时的界面

开始捕获后,Wireshark 会将捕获到的报文显示在界面上。

image-20230803222003006

详细介绍:

  • 分组列表显示所有捕获到的报文,顶部为报文序号、捕获时间(默认为时间戳)、来源地址、目的地址、协议名称、长度、信息

  • 分组详情显示选中报文的分层情况。

  • 分组字节流显示选中报文的16进制与ASCII码编码的字节流。

分组列表

分组列表显示每个数据包的各种字段,并默认按照序号/捕获时间升序排列分组。(若想要以某个字段降序排列,点击该字段即可。)

image-20230803222226896

额外说明:捕获界面的最左侧的No.列

选中某个数据包时,Wireshark分组列表的No.列会显示一些符号,这些符号标识的是数据包与数据包之间的关系,这里罗列一下 Wireshark 官网的解释:

image-20230803222432967

分组详情

分组详情窗口是TCP/IP五层模型最好的结构化展示,从上到下分别是:

image-20230803222606924

展开各层,能看到 Wireshark抓包工具 对各个字段的解析和注释。

image-20230803222640453

分组字节流

  • 分组字节流窗口中显示的是十六进制与ASCII字符对照形式的分组字节内容(不包含物理层的字节),即数据包在链路上传播时的原始字节流。

  • 分组字节流窗口中的字节和分组详情中的字段是一一对应的:点击字段会选中字节内容;点击某个字节16进制值会选中对应的字段。

  • 可以使用这个窗口来观察一些私有协议的字段格式。

image-20230803222844280

十六进制值与ASCII码也是对应的,GET 的 ASCII码为 0x474554

总结

从分组列表到分组详情,再到分组字节流,可以看到 Wireshark 抓包工具 是如何从大到小为我们显示多个分组——单个分组的多层结构——未解析时的原始字节流。从下而上逆推,我们可以体会到网卡和协议栈是如何实现数据包解析的。

主工具栏中常用的按键

实践中有4个按键比较常用:开始捕获停止捕获重新开始捕获显示最新的分组

image-20230803223135793

捕获的三个按键比较好理解,不做解释。

选中显示最新的分组后,分组列表会一直滚动显示最新捕获的分组。如果要查看某个报文,可以滚动鼠标滑轮,此时分组详情会停止滚动。

image-20230803223220694

常用过滤规则

连接符

  • and&& 表示同时满足
  • or|| 表示满足一个条件即可
  • !not 表示排除

基于的IP的过滤

1. 过滤出来源IP为192.168.1.100的数据包

1
2
ip.src == 192.168.1.100 
ip.src_host == 192.168.1.100

2. 过滤出目的IP为192.168.1.103的数据包

1
2
ip.dst == 192.168.1.103
ip.dst_host == 192.168.1.103

3. 过滤出来源IP或目的IP为192.168.1.103的数据包

1
ip.addr == 192.168.1.103

基于端口的过滤

1. 过滤出来源端口为80的数据包

1
2
3
4
# 过滤出TCP协议来源端口为80的数据包
tcp.srcport == 80
# 过滤出UDP协议来源端口为80的数据包
udp.srcport == 80

2. 过滤出目的端口为80的数据包

1
2
3
4
# 过滤出TCP协议目的端口为80的数据包
tcp.dstport == 80
# 过滤出UDP协议目的端口为80的数据包
tcp.dstport == 80

3.过滤出来源端口或目的端口为80的数据包

1
2
3
4
# 过滤出TCP协议来源端口或目的端口为80的数据包
tcp.port == 80
# 过滤出UDP协议来源端口或目的端口为80的数据包
udp.port == 80

4. 过滤端口范围

1
tcp.port >= 1 and tcp.port <= 80

5. 假设黑客主机192.168.226.128向服务器172.20.10.3做了端口扫描,请提交黑客扫描的端口有哪些

这种题目的风格跟中职和高职组的比赛很像。在建立 TCP 端口 连接之前,需要进行三次握手。我们只需要过滤出黑客主机对服务器的哪些端口发送了 SYN 标志位,则表示哪些端口被扫描。

1
ip.src == 192.168.226.128 and ip.dst == 172.20.10.3 and tcp.flags.syn == 1

image-20240115163708811

6. 假设黑客主机192.168.226.128向服务器172.20.10.3做了端口扫描,请提交服务器所开放的端口有哪些

当黑客主机向服务器的某个端口发送 SYN标志位的时候,如果该端口存在,则会像黑客主机返回 SYN,ACK 的标志位。

因此构造如下过滤规则:

1
ip.src ==  172.20.10.3 and ip.dst == 192.168.226.128 and tcp.flags.syn == 1 and tcp.flags.ack == 1

image-20240115163935277

基于协议的过滤

  • tcp

  • udp

  • arp

  • icmp

  • http

  • smtp

  • ftp

  • dns

  • telnet

  • ssh

  • mysql

  • ssl

  • ip

排除某个协议,如排除ssl协议:!sslnot ssl

HTTP 协议的过滤

1. 过滤出请求方法为GET的数据包

1
http.request.method == "GET"

image-20240115101415789

2. 过滤出请求方法为POST的数据包

1
http.request.method == "POST"

image-20240115101439445

3. 过滤出特定的URI(请求路径)

1
2
3
4
# 过滤出请求的URI为/admin/index.php的数据包
http.request.uri == "/admin/index.php"
# 过滤出请求的URI为/admin/index.php?username=admin的数据包
http.request.uri == "/admin/index.php?username=admin"

4. 过滤出HTTP包包含关键字的数据包(其他协议也可用)

1
2
3
4
5
# 过滤出http协议中带有admin关键字的数据包
http contains "admin"
# 过滤出ftp协议中带有flag关键字的数据包
ftp contains "flag"
...

5. 过滤出HTTP协议的POST数据包中带有某字段的数据包

1
http.request.method == "POST" && http contains "User-Agent: "

6. 过滤HTTP请求中某个属性的值

1
2
3
4
# 过滤出HTTP响应头的Server字段为Apache/2.4.6 (CentOS) PHP/5.4.16的HTTP数据包
http.server == "Apache/2.4.6 (CentOS) PHP/5.4.16"
# 过滤出HTTP请求(响应头)content-type字段值为text/html的HTTP数据包
http.content_type == "text/html"

7. 过滤出HTTP数据包响应代码为200的数据包

1
http.response.code == 200

image-20240115101256122

8. 过滤出传参为r=admin/index/login的数据包

1
http.request.uri.query.parameter == "r=admin/index/login"

image-20240115101228165

有关HTTP协议的更多过滤规则请查阅官方文档:https://www.wireshark.org/docs/dfref/h/http.html

FTP 协议的过滤

1. 过滤出FTP登陆成功的数据包

1
ftp.response.code == 230

image-20240115101027376

2. 过滤出FTP登陆失败的数据包

1
ftp.response.code == 530

image-20240115101004343

3. 过滤出FTP传输的文件数据

1
ftp-data

image-20240115100931684

4. 过滤出FTP登陆尝试过哪些用户名

1
ftp.request.command == USER

image-20240115100904530

5. 过滤出FTP登陆尝试过哪些密码

1
ftp.request.command == PASS

image-20240115100843133

有关HTTP协议的更多过滤规则请查阅官方文档:https://www.wireshark.org/docs/dfref/f/ftp.html

MYSQL 协议的过滤

1. 过滤出mysql请求,从中可以看到登陆过哪些用户名

1
mysql.login_request

image-20240115104850657

2. mysql过滤返回的状态码

1
mysql.error_code == 1045   # 过滤出所有登陆失败的数据包

image-20240115105201853

3. 查看mysql执行过的命令

1
2
mysql.command == 3
mysql.query

image-20240115162540068

Redis 协议的过滤

1. 查看在redis上执行过哪些命令

1
resp.array

image-20240115163039603

2. 查看redis服务器命令的回显

1
resp.string

image-20240115163142238

wireshark 使用技巧

协议汇总

在 wireshark 中我们使用菜单栏的统计 -> 协议分级 可以查看当前数据包中存在哪些协议。

image-20240115164158862

这样我们可以大概得知道存在哪些易受攻击服务的交互。

IP 汇总

在 wireshark 中我们使用菜单栏的统计 -> 端点 可以查看当前数据包中有哪些 IP。

image-20240115164405413

image-20240115164422168

甚至还可以看到哪些 IP 的哪些端口进行了数据的交互。

image-20240115164441273

导出对象

假设我们要导出 HTTP 协议中传输过的 PNG 类型图片,则可以使用菜单栏中的 文件 -> 导出对象,其他协议数据同理。

image-20240115164836231

时间显示格式

默认情况下,wireshark 显示的时间为 时间戳 格式,对于我们来说不是很友好,因此,需要将时间显示格式修改为,我们易读的格式。

image-20240115170139015

在菜单栏中的 视图 -> 时间显示格式 选择第一个即可。

image-20240115170242754

效果如下:

image-20240115170310684