使用 Python 搜索 PCAP 文件和有关搜索查询的 return 关键信息

Using Python to search through a PCAP file and return key information about the search query

我们得到了一个 PCAP 文件,我的工作是找到:

在用户得到infected/attacked之前,他们使用了一个流行的搜索引擎(不是Google)来搜索一些信息。使用 Python 找出 1) 哪个搜索引擎和 2) 他们使用哪些关键字进行此类搜索。 3) 搜索引擎推荐了哪个网站 4) 用户实际访问了哪个网站?

通过在 Wireshark 上打开 PCAP 文件,我已经找到了正确答案:Bing

虽然我还不能确定第 2、3、4 部分

但这显然不是作业的目的,因为我必须使用 Python 来 return 信息

我目前的代码是:

pcapfile = open('nameofpcapfile.pcap', 'rb')

x = pcapfile.read()
decoded = x.decode("iso-8859-1")

searchengines = ["www.google.com", "www.yahoo.com", "www.ask.com", "www.bing.com",
                 "www.aol.com", "www.baidu.com", "www.wolframalpha.com",
                 "www.duckduckgo.com", "www.yandex.ru"]

searchenginesfound = []

for i in searchengines:
    if i in decoded:
        searchenginesfound.append(i)


if searchenginesfound.__len__() == 0:
    print("Search engine not found")
elif searchenginesfound.__len__() == 1:
    print("Search Engine used: ", searchenginesfound)
elif searchenginesfound.__len__() > 1:
    print("Search Engines used: ", searchenginesfound)

此代码能够成功returnbing.com作为搜索引擎使用。但是,我不知道如何处理第 2、3 和 4 部分

有什么建议吗?

pcaps 有严格的格式,允许分隔不同的数据包。在一个完美的世界里,你需要实现一个 pcap 解析器,让你一个一个地获取每个数据包进行研究。您使用了更重的方法,它只是将所有内容解析为文本(这在您的特定情况下有效:-)),所以这就是我将要记录的内容。但是,我真的建议您研究一下:当您拥有每个数据包时,它会容易得多。

如果允许您使用库,scapydpkt 等库可以帮助您解析 pcaps。

首先,您需要知道自己在寻找什么。关键字实际上是链接到 HTTP 请求的参数。当您将其解析为文件时,它匹配 url 的 ?& 参数,例如 http://www.example.org/?param1=foo&param2=bar

在您的情况下,当您正在寻找 Bing 时,这里是您可以找到的参数列表:https://docs.microsoft.com/en-us/rest/api/cognitiveservices/bing-web-api-v5-reference#query-parameters

要获得这些,您需要先提取所有 URL。为此,您可以使用正则表达式和 Python 内置 re 模块。在网上找一个好的,例如这是我为 HTTP 找到的:

regex = r"/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/"

然后您需要 re.search(regex, decoded) 然后使用 groups()(在线查找 :-))查找所有 URL。之后,您将能够 split("&") 获取各种关键字。

对于 3) 和 4),您需要找到下一个 HTTP 应答和请求。这是不实现 pcap 解析器变得棘手的地方,因为您需要猜测它们在您的文本块中的位置。您或许可以查找 HTTP 标记,因为它们位于 HTTP 请求之前和之后,但这很混乱。