用于对恶意软件HTTP请求进行指纹识别的工具。基于Tshark并用Python3编写。目前处于工作原型阶段 :-)
其主要目标是为恶意软件请求提供唯一的表示(指纹),以帮助识别它们。唯一 在此处意味着每个指纹应仅出现在一个特定的恶意软件家族中,但一个家族可以有多个指纹。Hfinger 以比打印整个请求更短的形式表示请求,但仍可供人类解读。
Hfinger 可用于手动恶意软件分析,也可用于沙箱系统或 SIEM 中。生成的指纹有助于对请求进行分组、将请求精确定位到特定的恶意软件家族、识别同一家族的不同操作,或发现被其他安全系统忽略但共享指纹的未知恶意请求。
一篇学术论文 伴随此工具的工作,描述了例如设计选择的动机,以及该工具与 p0f、FATT 和 Mercury 的对比评估。
此项目的基本假设是,不同恶意软件家族的HTTP请求或多或少是唯一的,因此可以通过指纹识别提供某种形式的身份识别。Hfinger 保留有关某些标头的结构和值的信息,以便进行进一步分析。例如,对相似请求进行分组——目前这仍是一项正在进行的工作。
在分析恶意软件的HTTP请求和标头后,我们已识别出请求中一些最具区分度的部分。这些包括:
此外,还考虑了请求URL的一些标准特征。所有这些部分都转化为一组特征,详细描述见此处。
上述特征被转化为可变长度的表示形式,即实际的指纹。根据报告模式的不同,会使用不同的特征来对请求进行指纹识别。有关这些模式的更多信息如下所示。特征选择过程将在即将发表的学术论文中描述。
安装前的最低要求:
Python >= 3.3,Tshark >= 2.2.0.可通过PyPI安装:
pip install hfinger
Hfinger 已在 Xubuntu 22.04 LTS 上使用版本 3.6.2 的 tshark 包进行测试,但应适用于旧版本,如 Xubuntu 18.04 上的 2.6.10 或 Xubuntu 20.04 上的 3.2.3。
请注意,与任何概念验证一样,您应在隔离的环境中运行 Hfinger,至少使用 Python 虚拟环境。其设置不在此处介绍,但您可以尝试 本教程。
安装后,您可以直接从命令行调用 hfinger 工具,或通过 python -m hfinger 作为 Python 模块调用。
例如:
foo@bar:~$ hfinger -f /tmp/test.pcap
[{"epoch_time": "1614098832.205385000", "ip_src": "127.0.0.1", "ip_dst": "127.0.0.1", "port_src": "53664", "port_dst": "8080", "fingerprint": "2|3|1|php|0.6|PO|1|us-ag,ac,ac-en,ho,co,co-ty,co-le|us-ag:f452d7a9/ac:as-as/ac-en:id/co:Ke-Al/co-ty:te-pl|A|4|1.4"}]
帮助可以使用短选项 -h 或长选项 --help 显示:
usage: hfinger [-h] (-f FILE | -d DIR) [-o output_path] [-m {0,1,2,3,4}] [-v]
[-l LOGFILE]
Hfinger - 对存储在pcap文件中的恶意软件HTTP请求进行指纹识别
optional arguments:
-h, --help 显示此帮助信息并退出
-f FILE, --file FILE 读取单个pcap文件
-d DIR, --directory DIR
从目录DIR读取pcap文件
-o output_path, --output-path output_path
输出目录的路径
-m {0,1,2,3,4}, --mode {0,1,2,3,4}
指纹报告模式。
0 - 与模式2碰撞数和指纹数相似,但使用更少的特征,
1 - 所有设计特征的表示,但比模式0、2和4碰撞稍多,
2 - 最优(默认模式),
3 - 生成的指纹数最少,但碰撞数最高,
4 - 指纹熵最高,但比模式0-2生成的指纹稍多
-v, --verbose 报告请求中非标准值的信息(例如,非ASCII字符,没有CRLF标记,配置列表中不存在的值)。
如果没有--logfile (-l),将打印到标准错误输出。
-l LOGFILE, --logfile LOGFILE
在详细模式下的输出日志文件。隐含 -v 或 --verbose 开关。
您必须提供pcap文件的路径(-f),或者包含pcap文件的目录(-d)。输出为JSON格式。 它将打印到标准输出,或者使用源文件名称保存到提供的目录(-o)中。例如,命令:
hfinger -f example.pcap -o /tmp/pcap
的输出将保存到:
/tmp/pcap/example.pcap.json
报告模式 -m/--mode 可以通过提供范围 0-4 内的整数来更改默认报告模式。这些模式在表示的请求特征或舍入模式上有所不同。默认模式(2)由我们选择以表示通常在请求分析中使用的所有特征,但它也提供较低的碰撞数和生成的指纹数。使用其他模式,您可以实现不同的目标。例如,在模式 3 中,您获得的生成指纹数较少,但恶意软件家族之间碰撞的机会更高。如果您不确定,则无需更改任何内容。有关报告模式的更多信息,请参见此处。
从版本 0.2.1 开始,Hfinger 的详细程度降低。如果您希望接收有关遇到的标头非标准值、请求非载荷部分中的非ASCII字符、缺少CRLF标记(\r\n\r\n)以及分析请求时遇到的其他非应用程序错误的信息,则应使用 -v/--verbose。在详细模式下遇到任何此类问题时,将打印到标准错误输出。您还可以使用 -l/--log 开关将日志保存到指定位置(它隐含 -v/--verbose)。日志数据将附加到日志文件中。
从版本 0.2.0 开始,Hfinger 支持导入到其他Python应用程序。要在您的应用程序中使用它,只需从 hfinger.analysis 导入 hfinger_analyze 函数,并使用pcap文件的路径和报告模式调用它。返回的结果是一个包含指纹结果的字典列表。
例如:
from hfinger.analysis import hfinger_analyze
pcap_path = "在此处指定PCAP路径"
reporting_mode = 4
print(hfinger_analyze(pcap_path, reporting_mode))
从版本 0.2.1 开始,Hfinger 使用 logging 模块记录有关遇到的标头非标准值、请求非载荷部分中的非ASCII字符、缺少CRLF标记(\r\n\r\n)以及分析请求时遇到的其他非应用程序错误的信息。Hfinger 创建自己的 hfinger 名称的记录器,但在没有事先配置的情况下,日志信息实际上会被丢弃。如果您希望接收此日志信息,在调用 hfinger_analyze 之前,应配置 hfinger 记录器,将日志级别设置为 logging.INFO,根据需求配置日志处理器,并将其添加到记录器中。更多信息可在 hfinger_analyze 函数的文档字符串中找到。
指纹基于从请求中提取的特征。使用 完整列表 中的特定特征取决于从预定义列表中选择的报告模式(有关报告模式的更多信息,请参见此处)。下图展示了在默认报告模式下创建一个示例指纹。

分析请求的三个部分以提取信息:URI、标头结构(包括方法和协议版本)以及载荷。指纹的特定特征使用 |(竖线)分隔。为示例中的 POST 请求生成的最终指纹是:
2|3|1|php|0.6|PO|1|us-ag,ac,ac-en,ho,co,co-ty,co-le|us-ag:f452d7a9/ac:as-as/ac-en:id/co:Ke-Al/co-ty:te-pl|A|4|1.4
特征的创建如下所述,按其在指纹中出现的顺序。
首先,提取URI特征:
log10(43)≈2),log10(20/3)≈1),hfinger/configs/extensions.txt 中已知扩展名列表中时,log10(4)≈0.6)。其次,分析标头结构特征:
PO),为了表示请求中标头的顺序,每个标头名称根据 hfinger/configs/headerslow.json 中的方案进行编码,例如,User-Agent 标头编码为 us-ag。编码后的名称用 , 分隔。如果标头名称不以大写字母开头(或其任何部分在分析复合标头如 Accept-Encoding 时),则编码表示前缀为 !。如果标头名称不在已知标头列表中,则使用 FNV1a哈希 进行哈希,并使用该哈希作为编码。
在分析常用标头时,检查请求中是否出现它们。这些标头包括:
当在请求中找到该标头时,其值会针对典型值表进行检查,以创建 标头名称表示:值表示 对。标头名称根据 hfinger/configs/headerslow.json 中的方案编码(如前所述),值根据存储在 hfinger/configs 目录或 configs.py 文件中的方案编码(取决于标头)。在上述示例中,Accept 编码为 ac,其值 */* 编码为 as-as(asterisk-asterisk),得出 ac:as-as。这些对按在请求中出现的顺序插入到指纹中,并使用 / 分隔。如果在编码表中找不到标头值,则使用 FNV1a 哈希对其进行哈希。如果标头值由多个值组成,则将其分词以提供用 , 分隔的值列表,例如,Accept: */*, text/* 将给出 ac:as-as,te-as。然而,在当前的开发阶段,如果标头值包含“质量值”标签(q=),则整个值使用其 FNV1a 哈希进行编码。最后, 和 标头的值直接使用其 FNV1a 哈希进行编码。
最后,载荷特征:
N 表示,否则用 A 表示,Hfinger 在五种报告模式下运行,这些模式在指纹中表示的特征以及从请求中提取的信息上有所不同。它们是(使用工具配置中的数字):
0 - 生成与模式 2 相似的碰撞数和指纹数,但使用更少的特征,1 - 表示所有设计的特征,但产生的碰撞比模式 0、2 和 4 稍多,2 - 最优(默认模式),表示通常用于请求分析的所有特征,但同时也提供较低的碰撞数和生成的指纹数,3 - 在所有模式中生成的指纹数最少,但碰撞数最高,4 - 提供最高的指纹熵,但生成的指纹也比模式 0-2 稍多。选择这些模式是为了优化 Hfinger 唯一识别恶意软件家族的能力与生成指纹数量之间的平衡。模式 0、2 和 4 在恶意软件家族之间的碰撞数相似,但模式 4 生成的指纹比另外两种稍多。模式 2 比模式 0 表示更多的请求特征,但生成的指纹数和碰撞数相当。模式 1 是唯一表示所有设计特征的模式,但与模式 0、1 和 4 相比,碰撞数增加了近两倍。模式 3 生成的指纹至少比其他模式少两倍,但碰撞数增加了约九倍。所有设计特征的描述请见此处。
这些模式由以下特征组成(按在指纹中出现的顺序):
0:
1:
2:
3:
4:
