【问题标题】:Counting unique MAC addresses from a .pcap file计算 .pcap 文件中的唯一 MAC 地址
【发布时间】:2021-01-20 07:50:48
【问题描述】:

我正在尝试生成一个 shell 命令,该命令将使用 tcpdump 读取给定的 .pcap 文件并输出给定​​ .pcap 文件中唯一 MAC 地址的数量

我无法理解它,而且“tcp --help”非常没用: 到目前为止,我得到了这个

tcpdump -r mypcap.pcap ether -v `dst ff:ff:ff:ff:ff:ff` | uniq -c

任何帮助将不胜感激

【问题讨论】:

  • 所以我想没有人真正回答我的问题,我问如何使用 tcpdump 而不是 wireshark。即使你的答案很好,但它们不是被问到的。

标签: linux terminal packet pcap tcpdump


【解决方案1】:

Wireshark 的 TShark 命令行实用程序可能会更好地工作,因为它可以更好地控制数据包的输出格式。

例如,你可以这样做

tshark -r mypcap.pcap -T fields -E separator=, -e eth.src -e eth.dst

对于以太网捕获,它将为每个数据包打印数据包的源 MAC 地址和目标 MAC 地址,它们之间用逗号分隔。

引用我机器上的 uniq 手册页:

如果输入中的重复行不相邻,则不会被检测到,因此可能需要先对文件进行排序。

所以接下来您应该将tshark 的输出通过管道传输到sort

但是,在这种情况下,sort 将进行排序,uniq 将检查唯一性并与-c 一起计数,是源地址和目标地址的。从 06:05:04:03:02:01 到 01,01:02:03:04:05:06 到 06:05:04:03:02:01 将被计为不同: 02:03:04:05:06。这可能不是你想要的。

如果您想要 MAC 地址的计数,而不关心目标 MAC 地址,请执行

tshark -r mypcap.pcap -T fields -e eth.src | sort | uniq -c

可能是确定网络中存在哪些地址的最佳方法;您网络上的一台机器可能正在向您网络上的目标地址发送数据包(并且可能在地球上的任何地方都不存在或从地球发射),因此目标地址可能不是您的想。另一方面,如果您的网络上有一台具有该目标地址的机器,并且它不费心在网络上发送任何数据包,那么如果您只查看源地址,它就不会出现;但是,即使不是不可能,也不太可能出现这种情况。 (例如,它不会响应 ARP 数据包,这使得网络上的其他机器不太可能(尽管并非不可能)知道它的 MAC 地址,因此虽然并非​​不可能,但它的 MAC 地址不太可能(尽管并非不可能)地址将一个目标地址。)

对于目的地 MAC 地址,执行

tshark -r mypcap.pcap -T fields -e eth.dst | sort | uniq -c

如果两者都需要,则需要使用 换行符 作为源地址和目标地址之间的分隔符,将它们放在不同的行上,因此sort 将对源地址和目标地址进行排序uniq 将找到唯一的地址。至少如果这是使用与 Bourne 兼容的 shell(Bourne shell、Korn shell a/k/a ksh、Bourne-again shell a/k/a bash 等)和

tshark -r mypcap.pcap -T fields -E separator='
' -e eth.src -e eth.dst | sort | uniq -c

是的,这是第一个引号之后的换行符,而换行符之后是另一个引号。

【讨论】:

  • 但是如果一台机器没有安装wireshark和tshark所以你必须使用tcpdump之类的原始工具怎么办?
【解决方案2】:

如果您只想计算捕获文件中存在的唯一以太网 MAC 地址的数量,那么我同意 @user13951124 的观点,即使用 tshark 是此用例的更好工具选择。在这里,我提出了一个使用 tshark-z endpoints,eth 选项的替代解决方案。

例如,我有一个包含 2 个唯一以太网 MAC 地址的文件,当我运行以下命令时:

tshark.exe -nqr mypcap.pcap -z endpoints,eth

我得到以下输出:

AST modules loaded
================================================================================
Ethernet Endpoints
Filter:<No Filter>
                       |  Packets  | |  Bytes  | | Tx Packets | | Tx Bytes | | Rx Packets | | Rx Bytes |
00:26:b9:b3:ce:7a              2          1072          2            1072           0               0
00:12:17:b5:0d:32              2          1072          0               0           2            1072
================================================================================

如果你想要计数,你可以将输出传递给wc,然后打印表达式的结果减去不相关的输出行数,在我的例子中是 6。所以整个命令看起来像这样:

count=$(tshark.exe -nqr mypcap.pcap -z endpoints,eth | wc -l) && echo $(( $count - 6 ))

在这种情况下,您得到的输出很简单:

2

我的猜测是这个解决方案会更快,因为不需要排序并且tshark 已经提供了唯一端点的列表,所以也没有重复的处理。

【讨论】:

  • @user13951124 和 Christopher Maynard 感谢你们的解释和提供非常好的例子!我特别询问 tcpdump 命令的原因是,对于 tshark,您需要安装 wireshark,并且 tcpdump 通常已经存在于机器中。因此,例如,您正在对一台机器进行渗透测试并且需要查看流量并且它没有wireshark,您可能会使用tcpdump。
【解决方案3】:

我之前提出的解决方案使用 tshark - 我仍然会推荐该解决方案而不是这个解决方案 - 但如果您真的想使用 tcpdump 来解决这样就可以完成,但是您还需要其他实用程序的帮助。下面建议的解决方案需要cutsedsortwc

最初的问题要求“...给定 .pcap 文件中唯一 MAC 地址的数量”,所以这正是以下 count_unique_macs.sh strong> 脚本。它需要 2 次 .pcap 文件,第一次隔离源 MAC,第二次隔离目标 MAC。它将它们全部写入一个临时文件,然后仅按唯一的 MAC 对它们进行排序。最后显示文件的行数,然后删除临时文件。

#!/bin/sh
if [[ $# -lt 1 ]]; then
        echo "Usage: count_unique_macs.sh <file>"
        exit 1
fi

file=$1
tmp_file=/tmp/macs
tcpdump -r $file -ne 2> /dev/null | cut -d ' ' -f 2 > $tmp_file
tcpdump -r $file -ne 2> /dev/null | cut -d ' ' -f 4 | sed 's/,//' >> $tmp_file
cat $tmp_file | sort -u | wc -l
rm -f $tmp_file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    相关资源
    最近更新 更多