抓包工具的使用

HTTP抓包工具有老牌的Fiddler和Charles,但这些工具仅限于HTTP抓包,想要抓取传输层的tcp包则需要用到更加强大的wireshark和tcpdump。

wireshark和tcpdump都可以捕获通过网卡的所有网络通信的数据包,可以完整查看网络中的每层、每个协议、每个数据包的详细组成信息。但是缺点是信息太多,需要过滤和处理。

WireShark基本过滤规则

IP 地址过滤

  • 显示特定 IP 地址的流量

    1
    ip.addr == 192.168.1.100

    这会显示源或目标 IP 地址为 192.168.1.100 的所有数据包。

  • 显示某个 IP 地址之间的通信

    1
    ip.addr == 192.168.1.100 && ip.addr == 8.8.8.8

    这会显示源地址为 192.168.1.100 且目标地址为 8.8.8.8 之间的所有数据包。

协议过滤

  • 显示特定协议的数据包

    1
    tcp

    这会显示所有 TCP 数据包。

  • 显示特定端口的流量

    1
    tcp.port == 80

    这会显示目标或源端口为 80 的所有 TCP 数据包。

  • 显示所有 ARP 数据包

    1
    arp

应用层协议过滤

  • 显示 HTTP 请求和响应

    1
    http

    这会显示所有 HTTP 请求和响应数据包。

  • 显示 DNS 查询和响应

    1
    dns

    这会显示所有 DNS 查询和响应数据包。

数据包方向过滤

  • 显示进入或离开特定 IP 地址的流量

    1
    ip.src == 192.168.1.100

    这会显示源地址为 192.168.1.100 的所有数据包。

  • 显示进入或离开特定网络接口的流量

    1
    eth.addr == 00:11:22:33:44:55

    这会显示以太网地址为 00:11:22:33:44:55 的所有数据包。

逻辑运算符

  • **与运算符 (&&)**:

    1
    ip.addr == 192.168.1.100 && tcp.port == 80

    显示源或目标 IP 地址为 192.168.1.100 且目标或源端口为 80 的所有 TCP 数据包。

  • **或运算符 (||)**:

    1
    ip.addr == 192.168.1.100 || ip.addr == 8.8.8.8

    显示源地址为 192.168.1.100 或目标地址为 8.8.8.8 的所有数据包。

  • **非运算符 (!)**:

    1
    !tcp.port == 80

    显示所有不是目标或源端口为 80 的 TCP 数据包。

其它过滤条件

  • 过滤特定数据包大小

    1
    frame.len > 1000

    显示大小大于 1000 字节的所有数据包。

  • 根据协议层次过滤

    1
    tcp.flags.syn == 1 && tcp.flags.ack == 0

    显示 SYN 标志为 1 而 ACK 标志为 0 的所有 TCP 数据包(TCP 握手过程中的第一个数据包)。

  • 根据时间戳过滤

    1
    frame.time > "2024-06-01 12:00:00"

    显示时间戳晚于 2024-06-01 12:00:00 的所有数据包。

tcpdump用法

1
tcpdump [options] [filter_expression]
  • **[options]**:可选的命令行选项,用于配置 tcpdump 的捕获行为,如捕获的接口、是否显示数据包内容等。
  • **[filter_expression]**:过滤表达式,用于指定要捕获的数据包的类型或条件。

tcpdump基本过滤规则

IP 地址过滤

  • 显示特定 IP 地址的流量

    1
    host 192.168.1.100

    这会显示源或目标 IP 地址为 192.168.1.100 的所有数据包。

  • 显示特定 IP 地址之间的通信

    1
    host 192.168.1.100 and host 8.8.8.8

    这会显示源地址为 192.168.1.100 且目标地址为 8.8.8.8 之间的所有数据包。

协议过滤

  • 显示特定协议的数据包

    1
    tcp

    这会显示所有 TCP 数据包。

  • 显示特定端口的流量

    1
    port 80

    这会显示目标或源端口为 80 的所有数据包。

  • 显示所有 ARP 数据包

    1
    arp

应用层协议过滤

  • 显示 HTTP 请求和响应

    1
    port 80

    这会显示所有 HTTP 请求和响应数据包。

  • 显示 DNS 查询和响应

    1
    port 53

    这会显示所有 DNS 查询和响应数据包。

数据包方向过滤

  • 显示进入或离开特定 IP 地址的流量

    1
    src host 192.168.1.100

    这会显示源地址为 192.168.1.100 的所有数据包。

  • 显示进入或离开特定网络接口的流量

    1
    ether host 00:11:22:33:44:55

    这会显示以太网地址为 00:11:22:33:44:55 的所有数据包。

逻辑运算符

  • **与运算符 (and)**:

    1
    src host 192.168.1.100 and port 80

    显示源地址为 192.168.1.100 且目标或源端口为 80 的所有数据包。

  • **或运算符 (or)**:

    1
    src host 192.168.1.100 or dst host 8.8.8.8

    显示源地址为 192.168.1.100 或目标地址为 8.8.8.8 的所有数据包。

  • **非运算符 (not)**:

    1
    not port 22

    显示所有不是目标或源端口为 22 的数据包。

其它过滤条件

  • 过滤特定数据包大小

    1
    greater 1000

    显示大小大于 1000 字节的所有数据包。

  • 根据协议层次过滤

    1
    tcp[13] & 2 != 0

    显示所有 SYN 标志为 1 而 ACK 标志为 0 的 TCP 数据包(即 TCP 握手过程中的第一个数据包)。

  • 根据时间戳过滤

    1
    after "2024-06-01 12:00:00"

    显示时间戳晚于 2024-06-01 12:00:00 的所有数据包。

tcpdump 还支持各种选项来更精确地控制捕获行为,例如指定捕获的网络接口、输出到文件等。以下是一些常用的选项:

  • 指定捕获接口

    1
    tcpdump -i eth0
  • 将捕获结果输出到文件

    1
    tcpdump -w capture.pcap
  • 从文件中读取捕获结果

作者

echo

发布于

2024-06-13

更新于

2024-08-10

许可协议

评论