用于对恶意软件的 HTTP 请求进行指纹识别的工具。基于 Tshark 并使用 Python3 编写。工作原型阶段

其主要目的是提供恶意软件请求的唯一表示(指纹),以帮助识别它们。唯一意味着每个指纹只能在一个特定的恶意软件家族中看到,但一个家族可以有多个指纹。Hfinger 以比打印整个请求更短的形式表示请求,但仍可供人类理解。
Hfinger 可用于手动恶意软件分析,也可用于沙盒系统或 SIEM。生成的指纹可用于分组请求、精确定位特定恶意软件家族的请求、识别同一家族的不同操作,或发现其他安全系统忽略但共享指纹的未知恶意请求。
一篇学术论文伴随该工具的研究,例如,描述设计选择的动机,以及与p0f、FATT和Mercury相比对该工具的评估。
想法
该项目的基本假设是,不同恶意软件家族的 HTTP 请求或多或少都是独一无二的,因此可以对它们进行指纹识别以提供某种身份识别。Hfinger 保留了有关某些标头的结构和值的信息,以提供进一步分析的手段。例如,对类似请求进行分组 - 目前,这项工作仍在进行中。在分析了恶意软件的 HTTP 请求和标头后,我们发现请求中的一些部分最具特色。这些包括:* 请求方法 * 协议版本 * 标头顺序 * 常用标头的值 * 有效负载长度、熵和非 ASCII 字符的存在
此外,还考虑了请求 URL 的一些标准特性。所有这些部分都被转化为一组特性,详细描述如下。
上述特征被翻译成可变长度的表示,即实际的指纹。根据报告模式,使用不同的特征来对请求进行指纹识别。下面将介绍有关这些模式的更多信息。特征选择过程将在即将发表的学术论文中描述。
安装
安装前所需的最低要求:* Python>= 3.3,* Tshark>= 2.2.0。可从 PyPI 安装:
pip install hfinger
Hfinger 已在 Xubuntu 22.04 LTS 上tshark使用版本 的软件包进行了测试,但应该也可以在 Xubuntu 18.04 或Xubuntu 20.043.6.2等旧版本上使用。2.6.103.2.3
请注意,与任何 PoC 一样,你应该在独立的环境中运行 Hfinger,至少在 Python 虚拟环境中运行。这里不介绍它的设置,但你可以尝试本教程。
用法
安装后,您可以直接从命令行调用该工具,hfinger 或者作为 Python 模块调用python -m hfinger。例如:
foo@bar:~$ hfinger -f /tmp/test.pcap<br>[{"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"}]<br>
-h可以使用短开关或长开关显示帮助--help:
usage: hfinger [-h] (-f FILE | -d DIR) [-o output_path] [-m {0,1,2,3,4}] [-v]<br> [-l LOGFILE]<br><br>Hfinger - fingerprinting malware HTTP requests stored in pcap files<br><br>optional arguments:<br> -h, --help show this help message and exit<br> -f FILE, --file FILE Read a single pcap file<br> -d DIR, --directory DIR<br> Read pcap files from the directory DIR<br> -o output_path, --output-path output_path<br> Path to the output directory<br> -m {0,1,2,3,4}, --mode {0,1,2,3,4}<br> Fingerprint report mode. <br> 0 - similar number of collisions and fingerprints as mode 2, but using fewer features, <br> 1 - representation of all designed features, but a little more collisions than modes 0, 2, and 4, <br> 2 - optimal (the default mode), <br> 3 - the lowest number of generated fingerprints, but the highest number of collisions, <br> 4 - the highest fingerprint entropy, but slightly more fingerprints than modes 0-2<br> -v, --verbose Report information about non-standard values in the request <br> (e.g., non-ASCII characters, no CRLF tags, values not present in the configuration list). <br> Without --logfile (-l) will print to the standard error.<br> -l LOGFILE, --logfile LOGFILE<br> Output logfile in the verbose mode. Implies -v or --verbose switch.<br><br>
您必须提供 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.1Hfinger 版本开始,详细程度有所降低。如果您想要接收有关遇到的非标准标头值、请求非有效负载部分中的非 ASCII 字符、缺少 CRLF 标记 ( ) 以及分析的请求中其他非应用程序错误问题-v的信息,则应使用 / 。在详细模式下遇到任何此类问题时,它们将被打印到标准错误输出。您还可以使用/开关(它暗示/ )将日志保存到定义的位置。日志数据将附加到日志文件中。--verbose\r\n\r\n-l--log-v--verbose
在 Python 应用程序中使用
从版本开始0.2.0,Hfinger 支持导入到其他 Python 应用程序。要在您的应用程序中使用它,只需从中导入hfinger_analyze函数hfinger.analysis 并使用 pcap 文件的路径和报告模式调用它。返回的结果是包含指纹识别结果的字典列表。例如:
from hfinger.analysis import hfinger_analyze<br><br>pcap_path = "SPECIFY_PCAP_PATH_HERE"<br>reporting_mode = 4<br>print(hfinger_analyze(pcap_path, reporting_mode))<br>
从版本开始,0.2.1Hfinger 使用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特征:* URI长度,以长度为底数的对数表示,四舍五入为整数,(示例中URI长43个字符,因此log10(43)≈2),* 目录数,(示例中有3个目录),* 平均目录长度,以目录实际平均长度的底数10表示,四舍五入为整数,(示例中有三个目录,总长度为20个字符(6 + 6 + 8),因此log10(20/3)≈1),* 所请求文件的扩展名,但前提是它在已知扩展名列表中hfinger/configs/extensions.txt,* 平均值长度,以实际平均值长度的底数10表示,四舍五入到小数点后一位,(示例中两个值的长度均为4个字符,显然等于4个字符,和log10(4)≈0.6)。
其次,分析了报头结构特征: * 请求方法编码为方法的前两个字母(PO), * 协议版本编码为整数(1表示版本1.1,0表示版本1.0,9表示版本0.9), * 报头的顺序, * 以及流行的报头及其值。
为了表示请求中标头的顺序,每个标头的名称都根据 中的模式进行编码 hfinger/configs/headerslow.json,例如,User-Agent标头编码为us-ag。编码名称以 分隔,。如果标头名称不以大写字母开头(或在分析复合标头(如Accept-Encoding)时不以大写字母的任何部分开头),则编码表示以 为前缀!。如果标头名称不在已知标头列表中,则使用FNV1a hash对其进行哈希处理,并将哈希用作编码。
在分析常用标头时,会检查请求中是否出现这些标头。这些标头包括:* Connection * Accept-Encoding * Content-Encoding * Cache-Control * TE * Accept-Charset * Content-Type * Accept * Accept-Language * User-Agent
当在请求中找到标头时,将根据典型值表检查其值以创建对header_name_representation:value_representation。标头的名称根据中的架构进行编码hfinger/configs/headerslow.json(如前所述),并且根据存储在hfinger/configs目录或文件中的架构对值进行编码configs.py,具体取决于标头。在上面的示例中,Accept编码为ac ,其值为(),得到。这些对按在请求中出现的顺序插入指纹中,并使用分隔。如果在编码表中找不到标头值,则使用 FNV1a 哈希对其进行哈希处理。如果标头值由多个值组成,则对它们进行标记以提供用分隔的值列表,例如,将得到。但是,在开发阶段,如果标头值包含“质量值”标签( ),则整个值都使用其 FNV1a 哈希进行编码。最后, User-Agent和Accept-Language标头的值直接使用其 FNV1a 哈希进行编码。*/*as-asasterisk-asteriskac:as-as/
,Accept: /, text/*ac:as-as,te-asq=
最后,在有效载荷特征中:* 存在非 ASCII 字符,用字母 表示N,否则用 表示A,* 有效载荷的香农熵,四舍五入为整数,* 和有效载荷长度,表示为以 10 为底的实际有效载荷长度的对数,四舍五入到小数点后一位。
报告模式
Hfinger以五种报告模式运行,这些模式在指纹所表示的特征方面有所不同,从而从请求中提取信息。 这些是(使用工具配置中的数字): * 模式0- 产生与模式 相似数量的碰撞和指纹2,但使用更少的特征, * 模式- 代表所有设计的特征,但比模式、和1产生的碰撞稍多, * 模式- 最佳(默认模式),代表在请求分析期间通常使用的所有特征,但也提供少量的碰撞和生成的指纹, * 模式- 在所有模式下产生最少数量的生成指纹,但实现最多的碰撞, * 模式- 提供最高的指纹熵,但也比模式-产生的指纹稍多。02423402选择这些模式是为了优化 Hfinger 唯一识别恶意软件家族的能力以及生成的指纹数量。模式0、2和4提供的恶意软件家族之间碰撞数量相似,但是,模式4生成的指纹比其他两个模式稍多。在生成的指纹和碰撞数量相当的情况下,模式2比模式表示了更多的请求特征。模式是唯一一个代表所有设计特征的模式,但与模式、和相比,它将碰撞次数增加了近两倍。模式产生的指纹比其他模式至少少两倍,但它引入的碰撞数量大约多九倍。所有设计特征的描述在这里。010143
模式由以下特征组成(按指纹中出现的顺序):* 模式0:* 目录数,* 以整数表示的平均目录长度,* 所请求文件的扩展名,* 以浮点数表示的平均值长度,* 标头的顺序,* 热门标头及其值,* 以浮点数表示的有效载荷长度。* 模式1:* 以整数表示的 URI 长度,* 目录数,* 以整数表示的平均目录长度,* 所请求文件的扩展名,* 以整数表示的变量长度,* 变量数,* 以整数表示的平均值长度,* 请求方法,* 协议版本,* 标头的顺序,* 热门标头及其值,* 非 ASCII 字符的存在,* 以整数表示的有效载荷熵,* 以整数表示的有效载荷长度。 * 模式2:* 以整数表示的 URI 长度、* 目录数量、* 以整数表示的平均目录长度、* 所请求文件的扩展名、* 以浮点数表示的平均值长度、* 请求方法、* 协议版本、* 标头顺序、* 流行标头及其值、* 存在非 ASCII 字符、* 以整数表示的有效载荷熵、* 以浮点数表示的有效载荷长度。* 模式3:* 以整数表示的 URI 长度、* 以整数表示的平均目录长度、* 所请求文件的扩展名、* 以整数表示的平均值长度、* 标头顺序。* 模式4:* 以浮点数表示的 URI 长度、* 目录数量、* 以浮点数表示的平均目录长度、* 所请求文件的扩展名、* 以浮点数表示的变量长度、* 以浮点数表示的平均值长度、* 请求方法、* 协议版本、* 标头顺序、* 流行标头及其值、* 存在非 ASCII 字符、* 以浮点数表示的有效载荷熵、* 以浮点数表示的有效载荷长度。
下载 Hfinger