在 tshark、tcpdump 或类似工具中导出原始数据包字节?

cti*_*tze 5 extract pcap wireshark wifi tshark

语境:

我有一个包含许多 WLAN 探测请求的 *.pcap 文件。我的目标是将每个探测请求的 WLAN 管理帧提取为原始字节(即,没有标头,也没有额外信息 - 只有像最初捕获的原始字节)。

在 Wireshark 中,我只需右键单击管理框架并选择“导出数据包字节...”: Wireshark 原始数据包字节提取

如果我选择“RAW”作为文件格式,Wireshark 就会给出我想要的内容:一个仅包含所选字节的文件。

问题:

我需要以编程方式自动执行此任务。我遇到过诸如tsharktcpdumpcapedit等工具。但是,这些工具似乎都不允许我提取 WLAN 管理框架,仅此而已。

虽然我能够使用 stdout 以 ASCII 形式获取所需的字节tcpdump,但我无法将它们保存到文件或变量中。此外,我只能针对单个探测请求执行此操作,而无法针对 *.pcap 文件中的所有探测请求执行此操作。

目前的方法:

如上所述,我能够在标准输出上以 ASCII 形式获取所需的字节:

$ tcpdump -r capture.pcap -c 1 -x
reading from file capture.pcap, link-type IEEE802_11_RADIO (802.11 plus radiotap header)
11:24:52.933799 1.0 Mb/s 2457 MHz 11b -77dBm signal antenna 1 Probe Request () [1.0* 2.0* 5.5* 6.0 9.0 11.0* 12.0 18.0 Mbit]
    0x0000:  0000 0108 8284 8b0c 1296 1824 3204 3048
    0x0010:  606c 2d1a ac01 02ff ff00 0000 0000 0000
    0x0020:  0000 0000 0000 0000 0000 0000 0000
Run Code Online (Sandbox Code Playgroud)

要提取原始字节,我可以简单地将此输出传输到grepsedxxd

$ tcpdump -r capture.pcap -c 1 -x | grep "0x00" | sed  's/0x[[:xdigit:]]*:[[:space:]]*//g' | xxd -r -p > rawbytefile
Run Code Online (Sandbox Code Playgroud)

显然,这是实现我想要的东西的一种相当老套的方法,并且必须有更好的方法。没有人想要高度依赖于其他人的程序以人为中心的输出的代码。

问题:

  1. 如何正确提取WLAN管理帧?(在命令行上/以编程方式 - 使用 Bash、Python 等)
  2. 如何为 *.pcap 文件中的每个探测请求完成此操作?(同样,以一种正确的方式 - 通过解析 ASCII 输出构建另一个 hacky 循环并不是真正应该做的事情......)

Chr*_*ard 5

我想您已经找到了一个解决方案,但我想我会发布一个可能的替代解决方案,该解决方案可能会也可能不会满足您的需求,并且仅使用tshark. 如果禁用“ wlan_mgt ”协议,“ wlan ”有效负载将传递到通用“ data ”解析器,可以打印该解析器。例如:

tshark -r capture.pcap --disable-protocol wlan_mgt -Y "wlan.fc.type_subtype == 0x0004" -T fields -e data
Run Code Online (Sandbox Code Playgroud)

...或者如果您愿意的话,可以在字节之间使用冒号分隔符:

tshark -r capture.pcap --disable-protocol wlan_mgt -Y "wlan.fc.type_subtype == 0x0004" -T fields -e data.data
Run Code Online (Sandbox Code Playgroud)

旧版本tshark不允许您在命令行上禁用特定协议,因此在这种情况下,您必须首先在 Wireshark 中禁用“ wlan_mgt ”解析器,或者创建一个单独的 Wireshark 配置文件,在其中禁用它,然后告诉tshark通过选项使用该配置文件-C <configuration profile>

我正在运行旧版本的 Wireshark (1.12.13),在我的测试中似乎存在错误,因为仅打印了探测请求数据包的子集。也许该错误已在较新版本的 Wireshark 中得到修复,但如果没有,则可以提交Wireshark 错误报告,请求修复此问题。


kai*_*toy 3

您可以使用我的 Java 库Pcap4J来实现它。

pcap4j-core.jar和添加pcap4j-packetfactory-static.jar到您的类路径并执行如下代码:

PcapHandle handle = Pcaps.openOffline("/path/to/your.pcap");
while (true) {
  try {
    Packet packet = handle.getNextPacketEx();
    Dot11ProbeRequestPacket probe = packet.get(Dot11ProbeRequestPacket.class);
    if (probe == null) { continue; }
    byte[] mgmtFrame = ByteArrays.getSubArray(
      probe.getRawData(),
      probe.getHeader().getFrameControl().isOrder() ? 28 : 24
    );
    System.out.println(ByteArrays.toHexString(mgmtFrame, ""));
  } catch (EOFException e) {
    break;
  } catch (PcapNativeException | TimeoutException | NotOpenException e) {
    e.printStackTrace();
  }
}
handle.close();
Run Code Online (Sandbox Code Playgroud)