我有一个称职的测绘数据分析助理
2023-9-27 16:36:0 Author: paper.seebug.org(查看原文) 阅读量:6 收藏

作者:知道创宇404实验室
English version: https://paper.seebug.org/3028/

一.摘要

2023年5月份,ZoomEye团队 [1] 发布了ZoomEyeGPT [2] ,它是一款基于 GPT 的 Chrome 浏览器扩展程序,旨在为 ZoomEye 的用户带来 AI 辅助搜索的体验。

ZoomEyeGPT是GPT在ZoomEye搜索输入侧的应用。而本文会将GPT应用于ZoomEye结果输出侧,使用ChatGPT [3] 去辅助用户解读ZoomEye数据结果,提高用户在实际业务场景下分析数据和理解数据的效率。

ChatGPT的普通知识容量是远远超过人类的,但在专业知识的储备和运用方面是不及专业人员的。让ChatGPT去判断ZoomEye平台搜索结果中某个IP地址是否具备漏洞,目前它是做不到的;但让ChatGPT针对结果数据进行一些常规的分析和识别,它是可以做到的,且效率比人类更高。

首先,我们利用ChatGPT的优势,在三个实际场景中,使用ChatGPT去辅助用户解读ZoomEye数据结果:

  • 辅助用户去分析测绘数据、识别软硬件厂商、扩充指纹规则库,可以有效提升分析效率。ChatGPT是一个称职的指纹规则标注助理!

  • 辅助用户去分析SSL证书数据,判断IP所属组织机构及行业类型,结果是比较准确的。

然后,我们在实际业务场景案例中,将这些方法进行应用实践。首先在ZoomEye平台获取并下载目标网段的资产测绘数据;然后利用ChatGPT的API接口,将测绘数据输入给ChatGPT,请ChatGPT去分析解读数据;通过ChatGPT的分析结果,我们知晓目标网段中存在一个IP地址使用了"Metabase "组件,其可能受"Metabase 远程代码执行(CVE-2023-38646)"漏洞影响,该IP地址所属机构是"上海**健康科技有限公司"。

本文所讲述ChatGPT在测绘数据分析方面的应用,算是抛砖引玉。用户在使用ZoomEye平台的过程中,实际业务场景会更加复杂更加多变,若能在业务场景中找到可以与ChatGPT优势结合的点,将ChatGPT的能力为我所用,相信会起到事半功倍的效果。

二.概述

日常工作中有这样一个业务场景:某网络安全应急响应部门,获取一批漏洞情报信息《创宇安全智脑 | Metabase 远程代码执行(CVE-2023-38646)等137个漏洞情报》 [4] 之后,想摸底管辖IP网段范围内,是否有IP可能受到漏洞影响,可能受漏洞影响的IP地址属于哪些组织机构。

正常的工作流程是:首先,获取漏洞影响组件名称,研究组件对应banner数据特征(又称之为指纹规则);然后,根据组件指纹规则,获取IP网段范围内使用该组件的IP地址,即可能受到漏洞影响的IP地址;最后,判断这些IP地址属于哪些组织机构。若漏洞情报中漏洞数量较多,获取这些漏洞影响组件的指纹规则,需要人为进行规则识别,比较耗时;在判断IP地址属于哪些组织机构的时候,需要人为进行判断,也是件耗时的工作。

因此,我们试想将GPT应用于ZoomEye结果输出侧,使用ChatGPT 去辅助用户解读ZoomEye数据结果,从而提高工作效率。本文中,我们将结合该业务场景案例,尝试将ChatGPT应用到实践中。

三、 识别软硬件指纹规则

熟悉网络空间测绘领域的同学应该清楚:通过测绘获取某个IP地址某个端口的banner数据之后,在数据的header头部、body正文、ssl证书等字段中,若存在某些特定的字符串特征,我们便可以识别出该IP地址使用了某类设备或某款软件。这里的字符串特征,叫做指纹规则(不同网络空间搜索引擎平台的叫法可能不一样)。

网络空间搜索引擎平台预置了这些指纹规则之后,用户就可以根据软硬件厂商名称来直接搜索某款软硬件,而无需去记忆那些识别软硬件的具体指纹规则。例如,在ZoomEye平台上,用户可以直接输入 "app:wordpress "搜索使用WordPress软件的IP地址,而无需知道WordPress软件的具体指纹规则。

为了提升用户搜索体验,每家网络空间搜索引擎平台,都花费了巨大的人力财力去完善自家的指纹规则库,但没有哪家平台的指纹规则库可以100% 覆盖全世界软硬件厂商。

有这样一个场景:用户业务需求是测绘某特定区域的网络空间,在平台上获取该区域测绘数据之后,对于那些没有识别出软硬件的结果数据,期望通过人工分析去尽可能的识别出软硬件厂商;还有一个场景:网络空间搜索引擎平台自家的数据分析师,面对自家测绘结果中没有识别出软硬件的数据,尽可能扩充指纹规则库,以识别出更多的软硬件。

这两种场景下,是否可以使用ChatGPT去辅助用户解读ZoomEye数据,从而提升分析数据的效率呢?本章节中,我们使用一些样例去进行尝试。

3.1 识别ASUS

首先,我们使用一段比较简单的banner数据,配合事先准备好的问题话术,引导ChatGPT去分析数据并输出我们想要的结果。从下面的截图中,可以看出ChatGPT给出的答案是满足要求的,识别出硬件厂商是"华硕(ASUS)",型号是"RT-ACRH13",甚至给出了额外信息:该设备的类型是"路由器"。

图3-1 识别ASUS

3.2 识别Fortinet

接下来,我们使用稍复杂的banner数据。从下面的截图中,可以看出ChatGPT识别出硬件设备是"FortiGate",厂商是"Fortinet",同样也给出了一个额外信息:这是一个"网络安全设备"。

图3-2 识别Fortinet

3.3 识别SonicWall

接下来,我们使用更加复杂些的banner数据。从下面截图中,可以看出ChatGPT识别出厂商是"SonicWall"。出乎意料的是:ChatGPT还告诉我们,它是通过header头部和title标题中的特征字符串进行识别的。这相当于它不仅给出了识别结果,还提供了具体的识别规则:告诉我们特征字符串是什么,特征字符串应该出现在banner的什么字段。

图3-3 识别SonicWall

3.4 识别WatchGuard

之前几个示例中,banner数据已经体现出了厂商名称。接下来,我们测试难度更大的banner数据,其数据中没有直接体现出厂商名称。从下面截图中,可以看出ChatGPT依然成功识别了这条banner数据,它根据header标题内容识别出厂商是"WatchGuard"。

图3-4 识别WatchGuard

3.5 识别Cisco

接下来,我们继续使用一条比较复杂的banner数据。从下面的截图中,可以看出ChatGPT成功识别出结果是"Cisco ASA"设备,并且提供了header头部和html正文中的特征字符串,可以很好的帮助我们去添加该设备的指纹规则。

图3-5 识别Cisco

3.6 识别WordPress

接下来,我们尝试一条软件相关的banner数据。从下面截图中,可以看出ChatGPT成功识别出结果是"WordPress内容管理系统(CMS)"软件,同时提供了用于识别的特征字符串。

图3-6 识别WordPress

3.7 识别Cobalt Strike

最后,我们尝试一条比较特殊的banner数据,数据中IP地址提供一个Cobalt Strike服务。ChatGPT依然成功识别,并且针对配置内容进行分析,输出重要配置信息。

图3-7 识别Cobalt Strike

3.8 小结

通过本章节的尝试,可以看出:ChatGPT不仅具备通过banner数据识别软硬件厂商的能力,还可以识别硬件和软件的类型。更让人出乎意料的是:ChatGPT可以提供识别依据,根据banner数据中某个字段值的某个特征字符串进行判断得到结果,这就相当于提供了具体的指纹识别规则。

因此,我们认为使用ChatGPT辅助用户去分析测绘数据、识别软硬件厂商、扩充指纹规则库,可以有效提升分析效率。ChatGPT是一个称职的指纹规则标注助理!

四.解读SSL证书数据

4.1 存在的困恼

在ZoomEye平台上查看搜索结果,部分字段数据可以被普通工程师直接理解,例如下图中标识出的IP、端口、协议、国家、城市、测绘时间,一名普通IT工程师可以很直接的接收这些字段数据中包含的信息。

图4-1 搜索结果页面1

但是,有些字段数据的信息,普通工程师无法直接接收和转换,例如:下图中标识的证书字段。证书字段中数据内容很多,用户需求不一样的情况下,其关注内容就不一样;通过证书字段中的数据,用户未必能够直接得到自己需求的结果,而是需要将证书数据进行二次转换后得到自己需求的结果。

图4-2 搜索结果页面2

以上方截图为示例,用户需求是想知道这个IP地址所使用证书的持有者组织名称。那么,用户不关心证书字段的全部数据,而是只需要查看证书字段中的Subject数据;用户查看到Subject数据为"CN=sylwzn.com",无法直接知道证书的持有者组织名称,而是需要通过访问"sylwzn.com"查看网页,分析该域名对应的持有者,才可以知道该证书的持有者组织名称。

4.2 ChatGPT辅助解读

我们针对上一节中的困恼,使用ChatGPT去辅助用户解读ZoomEye数据,进而获取IP地址所使用证书的持有者组织名称,提高用户的数据解读效率。

首先,我们将ZoomEye搜索结果导出,"数据格式"选择"json格式",“字段配置”仅选择两个字段:"ip"和"ssl"。

图4-3 下载结果页面

然后,在ChatGPT中输入我们调教N次后确定的问题,用来引导ChatGPT按照我们的需求去接收数据、提取数据、分析数据、输出数据。

图4-4 ChatGPT分析SSL数据示意图1

在ChatGPT表示理解要求之后,输入2条json数据提供给它,2条json数据如下所示:

{
  "ip": "173.194.51.233", 
  "ssl": "\n\n\nSSL Certificate\n ...Subject:*CN=\.c.docs.google.com\n..."
}

{
  "ip": "41.63.166.101", 

  "ssl": "\n\n\nSSL Certificate\n ...Subject: CN=FortiGate,O=Fortinet Ltd.\n..."
}

图4-5 ChatGPT分析SSL数据示意图2

如上图所示,ChatGPT给出的答案基本满足要求。ChatGPT从输入的SSL证书数据中提取了Subject字段信息,进而提取其中的O字段和CN字段信息,根据O字段和CN字段信息识别出证书持有者组织名称。不仅如此,ChatGPT还回答出组织机构的行业类型和中文名称,而机构的行业类型和中文名称这2个信息,可以被普通技术工程师直接接收;在处理大量ZoomEye结果数据的场景下,可以有效提高用户理解数据和分析数据的效率。

此外,注意看第一条json数据中,Subject字段信息中没有包含O字段,只包含了CN字段。因此,ChatGPT根据CN字段的值去进行推断,得到了证书组织机构的名称,是比较智能的。

接下来,我们再输入2条json数据,如下所示:

{
  "ip": "104.90.119.209",
  "ssl": "\n\n\nSSL Certificate\n ... Subject: C=US,CN=store.nba.com,L=New York,O=NBA Media Ventures, LLC,ST=New York\n ..."
}
{
  "ip": "144.53.243.70",
  "ssl": "\n\n\nSSL Certificate\n ... Subject: C=AU,CN=\*.abs.gov.au,L=Belconnen,O=Australian Bureau of Statistics,ST=Australian Capital Territory\n ..."
}

图4-6 ChatGPT分析SSL数据示意图3

如上图所示,ChatGPT给出的答案比较完美。特别是对于组织机构行业的判断,是比较准确的,在实际应用中可以极大程度的辅助用户去解读数据。

五.应用实践案例

本章节,我们在一个实际业务场景中,将上述章节中的方法进行应用实践,使用ChatGPT去辅助用户分析解读ZoomEye数据结果。

5.1 应用场景

某网络安全监管部门,获取一批漏洞情报信息《创宇安全智脑 | Metabase 远程代码执行(CVE-2023-38646)等137个漏洞情报》 [3] 之后,想摸底管辖IP网段范围内,是否有IP可能受到漏洞影响,可能受漏洞影响的IP地址属于哪个组织机构。

5.2 应用示例

我们在管辖IP网段范围内选取一个C段"212.129../24"作为实践样例,在漏洞情报信息中选取前三个漏洞"锐捷EG网关fileupload文件上传"、"Cloudpanel 远程代码执行(CVE-2023-35885)"、"Metabase 远程代码执行(CVE-2023-38646)"作为实践样例。

首先,我们利用ZoomEye平台获取该C段的网络资产测绘数据;然后,借助ChatGPT去分析解读数据,判断是否有IP地址使用了这三个漏洞所对应的组件,从而判断是否有IP地址可能受到漏洞影响;最后,根据IP地址对应SSL证书信息,判断IP地址属于哪个组织机构。

  1. 获取C段测绘数据

在ZoomEye平台中,输入以下关键词,搜索指定C段IP地址、测绘时间在2023年8月1日之后的测绘数据。

cidr:"212.129.\*.*/24" +after:"2023-08-01" +before:"2024-01-01"

图5-1 搜索指定网段的测绘数据

接下来,我们将搜索结果进行下载。在下载对话框中,我们选择下载数据格式为"json格式",字段配置选择"IP地址"、"端口号"、"Banner"、"ssl"这四个字段。将下载的json文件重命名为"zoomeye_data.json"。

图5-2 下载指定网段的测绘数据
  1. 分析解读数据

选取的前三个漏洞"锐捷EG网关fileupload文件上传"、"Cloudpanel 远程代码执行(CVE-2023-35885)"、"Metabase 远程代码执行(CVE-2023-38646)",其对应的组件分别是:"锐捷"、"Cloudpanel"、"Metabase "。

我们编写Python代码(代码示例见下一小节),逐行读取json文件中的测绘数据;利用ChatGPT的API接口,将测绘数据输入给ChatGPT;请ChatGPT按照以下步骤解读分析数据,判断IP所使用的组件是否为"锐捷"、"Cloudpanel"、"Metabase "三个组件中任意一个,并根据SSL证书内容判断IP所属机构的机构名称和机构行业。

每条json数据包含4个字段:

1.字段"ip",表示"IP地址"

2.字段"port",表示"端口"

3.字段"ssl",表示"IP地址对应的SSL证书内容"

4.字段"banner",表示"测绘banner数据"

请针对每条json数据,根据我的要求进行数据提取和数据分析工作:

1.根据字段"banner"和字段"ssl"的值,分析其中的header头部、title标题等,识别其使用了什么系统或者工具,我称之为"组件名称"。

2.根据字段"ssl"值中SSL证书内容,提取用于标识证书的持有者或主题的"Subject字段"。

3."Subject字段"中的"CN"字段,用于标识证书持有者的通用名称,通常是主机名(Hostname)或域名(Domain Name)。如果是域名的话,请你提取它的主域名,并认为该主域名所对应机构的名称就是"证书机构"的机构名称。

4."Subject字段"中的"O"字段,用于标识证书持有者(通常是个人、组织或实体)的组织名称。我称之为"证书机构"的机构名称。

5.数据中并没有体现机构的行业信息。请根据步骤3和步骤4获取的"证书机构"的机构名称,结合你自己的渊博知识,推断出"证书机构"的机构行业。

6.若"ssl"值或者"Subject字段"为空,则"证书机构"的机构名称为空。

7.最后,判断"组件名称"等于"锐捷"、"Cloudpanel"、"Metabase"其中之一。如果不等于,告诉我:"无法匹配"。如果等于,请将结果告诉我:"IP地址"、"端口"、"组件名称"、证书机构"的机构名称、"证书机构"的机构行业。

若某IP地址使用"锐捷"、"Cloudpanel"、"Metabase "三个组件中任意一个组件,则输出该IP地址,及其端口、组件名称、IP所属机构的机构名称和机构行业。

如下图所示,红框中的文字为ChatGPT的回答,其表示该C段中包含一个IP地址"212.129..",其开放端口是443,使用了"Metabase "组件,所属机构是"上海**健康科技有限公司"。

图5-3 代码运行结果.png

注:ChatGPT判断该组织机构的行业为医疗健康科技行业,这是不准确的,该组织机构实际为儿童体育培训行业。我们推测ChatGPT其实并不了解该组织机构,是通过公司名称判断的机构行业;所以,ChatGPT在此处回答中的定语为"可能是"。

在这个应用实践案例中,我们首先在ZoomEye平台获取并下载目标网段的资产测绘数据;然后利用ChatGPT的API接口,将测绘数据输入给ChatGPT,请ChatGPT去分析解读数据;通过ChatGPT的分析结果,我们知晓目标网段中存在一个IP地址使用了"Metabase "组件,其可能受"Metabase 远程代码执行(CVE-2023-38646)"漏洞影响,该IP地址所属机构是"上海**健康科技有限公司",满足了实际应用场景中的需求。

当然,ChatGPT的分析结果并非100%完全准确,存在误报的可能性。但是我们用ChatGPT来做数据分析助理,辅助用户处理数据,提高工作效率,它是完全称职的。

5.3 代码示例

本章节应用实践所使用Python代码示例,如下所示:

"""按照需求,使用ChatGPT进行工作.

version:
python3
openai 0.28.0
tiktoken 0.4.0

"""

import os
import json

import openai
import tiktoken


# 设置openai的apikey
openai.api_key = os.getenv("OPENAI_API_KEY")


class WorkWithChatGPT():
    """工作类."""

    MODEL = "gpt-3.5-turbo"
    MAXTOKENS = 4000

    def __init__(self, data: dict):
        """初始化."""
        self.data = data

        self.ip = self.data.get("ip", "")
 self.port = self.data.get("port", 0)
        self.ssl = self.data.get("ssl", "")
        self.banner = self.data.get("banner", "")

        self.tiktoken_enc = tiktoken.encoding_for_model(WorkWithChatGPT.MODEL)

    def work(self):
        """执行函数."""
        self.prepare_data()
        self.chat()

    def prepare_data(self):
        """准备测绘数据."""
        self.normalize_ssl()
        self.normalize_banner()

    def normalize_ssl(self):
        """规范化ssl字段数据."""
        ssl = self.ssl.strip()
        if not ssl:
            return

        pos_subject = ssl.find("Subject:")
        pos_end = ssl.find("\n", pos_subject)
        self.ssl = ssl[: pos_end]
        self.data["ssl"] = self.ssl

    def normalize_banner(self):
        """规范化banner字段数据."""
        data_exist = {
            "ip": self.ip,
            "port": self.port,
            "ssl": self.ssl,
            "banner": ""
        }
        count_tokens_exist = self.calc_count_tokens(json.dumps(data_exist))
        max_tokens_banner = WorkWithChatGPT.MAXTOKENS - count_tokens_exist
        self.banner = self.banner[: max_tokens_banner]
        self.data["banner"] = self.banner

    def calc_count_tokens(self, string: str):
        """计算字符串token数量."""
        return len(self.tiktoken_enc.encode(string))

    def chat(self):
        """使用ChatGPT分析json数据."""
        msg_system = "你是一位IT技术专家和网络空间测绘数据分析师"
        msg_user = """
            每条json数据包含4个字段:
            1.字段"ip",表示"IP地址";
            2.字段"port",表示"端口";
            3.字段"ssl",表示"IP地址对应的SSL证书内容";
            4.字段"banner",表示"测绘banner数据"。

            请针对每条json数据,根据我的要求进行数据提取和数据分析工作:

            1.根据字段"banner"和字段"ssl"的值,分析其中的header头部、title标题等,识别其使用了什么系统或者工具,我称之为"组件名称"。
            2.根据字段"ssl"值中SSL证书内容,提取用于标识证书的持有者或主题的"Subject字段"。
            3."Subject字段"中的"CN"字段,用于标识证书持有者的通用名称,通常是主机名(Hostname)或域名(Domain Name)。如果是域名的话,请你提取它的主域名,并认为该主域名所对应机构的名称就是"证书机构"的机构名称。
            4."Subject字段"中的"O"字段,用于标识证书持有者(通常是个人、组织或实体)的组织名称。我称之为"证书机构"的机构名称。
            5.数据中并没有体现机构的行业信息。请根据步骤3和步骤4获取的"证书机构"的机构名称,结合你自己的渊博知识,推断出"证书机构"的机构行业。
            6.若"ssl"值或者"Subject字段"为空,则"证书机构"的机构名称为空。
            7.最后,判断"组件名称"等于"锐捷"、"Cloudpanel"、"Metabase"其中之一。如果不等于,告诉我:"无法匹配"。如果等于,请将结果告诉我:"IP地址"、"端口"、"组件名称"、证书机构"的机构名称、"证书机构"的机构行业。

            在你确认理解我的意思后,我会提供一条json数据给你。
        """
        msg_assistant = "理解了你的需求。请提供一条json数据。"

        messages = [
            {"role": "system", "content": msg_system},
            {"role": "user", "content": msg_user},
            {"role": "assistant", "content": msg_assistant},
            {"role": "user", "content": str(self.data)}
        ]

        completion = openai.ChatCompletion.create(
          model=WorkWithChatGPT.MODEL,
          messages=messages
        )

        answer = completion.choices[0].message["content"]
        print("-" * 50)
        if "无法匹配" in answer:
            print(f"{self.ip}, {self.port}, 不受漏洞影响.")
        else:
            print(f"{self.ip}, {self.port}, 可能受漏洞影响.")
            print(answer)


def work(filename):
    """按照需求进行工作."""
    datas = list(map(json.loads, open(filename)))

    for data in datas:
        wwc = WorkWithChatGPT(data)
        wwc.work()

if __name__ == "__main__":
    work("zoomeye_data.json")

六.结语

本文在实际场景中,使用ChatGPT去辅助用户解读ZoomEye数据结果,实际效果是不错的,可提高用户分析数据和理解数据的效率。

我们认识到ChatGPT的普通知识容量是远远超过人类的,让ChatGPT针对ZoomEye数据结果进行一些常规的分析和识别,它是可以做到的,且效率比人类更高。

用户在使用ZoomEye平台的过程中,实际业务场景会更加复杂更加多变。相信聪明的用户,在业务场景中可以找到与ChatGPT优势相结合的点,将ChatGPT运用起来,以提升数据分析效率。

七.参考链接

[1] ZoomEye 网络空间搜索引擎: https://www.zoomeye.org

[2] ChatGPT (GPT-3.5): https://chat.openai.com

[3] 创宇安全智脑 | Metabase 远程代码执行(CVE-2023-38646)等137个漏洞可检测: https://mp.weixin.qq.com/s/MPRqzwv9I8tOWr1Hdf9DCg

[4] 创宇安全智脑 | Metabase 远程代码执行(CVE-2023-38646)等137个漏洞可检测 https://mp.weixin.qq.com/s/MPRqzwv9I8tOWr1Hdf9DCg


Paper 本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/3026/


文章来源: https://paper.seebug.org/3026/
如有侵权请联系:admin#unsafe.sh