微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

计算.pcap文件中的唯一MAC地址

如何解决计算.pcap文件中的唯一MAC地址

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

不能把我的头缠起来,加上“ tcp --help”是完全没有用的: 到目前为止,我已经知道了

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

任何帮助将不胜感激

解决方法

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

例如,您可以做

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

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

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

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

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

但是,在那种情况下,sort将进行排序,而uniq将检查唯一性并用-c进行计数,这是来源的和目标地址。从06:05:04:03:02: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

这可能是可能确定网络上存在哪些地址的最佳方法;您网络上的一台机器可能正在将数据包发送到网络上的目标地址 not (也许在地球上的任何地方都不存在或不是从地球发射的),因此目标地址可能不是您的目标地址想。另一方面,如果您的网络上有一台具有该目标地址的计算机,并且不必在网络上发送任何数据包,那么,如果您仅查看源地址,则不会显示该计算机。但是,即使不是不可能,也不太可能。 (例如,它不会响应ARP数据包,这使得网络上的其他计算机不太可能(尽管并非不可能)知道其MAC地址,因此也不太可能(尽管并非不可能)知道其MAC地址将会目标地址。)

对于目标 MAC地址,请

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

如果两者都需要,则需要使用 newline 作为源地址和目标地址之间的分隔符,以将它们放在单独的行上,因此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

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

,

如果只想计算捕获文件中存在的唯一以太网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已经提供了唯一端点的列表,因此没有重复项可以处理。

,

我之前提出的解决方案是使用 tshark - 我仍然建议使用该解决方案 - 但是如果您真的想使用 {{3 }} 来解决这个问题,那么它就可以完成,但您还需要其他实用程序的一些帮助。下面建议的解决方案需要 tcpdumpcutsedsort

最初的问题要求“...给定 .pcap 文件中唯一 MAC 地址的数量”,所以这正是下面的 count_unique_macs.sh strong> 脚本可以。它需要 .pcap 文件的 2 次传递,第一次隔离源 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。