如果 Linux 是您的主要工作环境,那么您可能熟悉可执行和可链接格式 (ELF),它是 Linux 上用于可执行文件、库、核心转储等的主要文件格式。 我写过关于使用原生 Linux 工具来理解 ELF 二进制文件的文章,首先介绍了 如何构建 ELF 二进制文件,然后是一些关于如何 分析 ELF 二进制文件 的通用技巧。 如果您不熟悉 ELF 和可执行文件,我建议您先阅读这些文章。
Capa 简介
Capa 是来自 Mandiant(一家网络安全公司)的 开源项目。 用该项目自己的话说,capa 检测可执行文件中的能力。 尽管 Capa 的主要目标是未知且可能具有恶意性质的可执行文件,但本文中的示例是在日常 Linux 实用程序上运行 Capa,以了解该工具的工作原理。
鉴于大多数恶意软件都是基于 Windows 的,因此早期的 Capa 版本仅支持 PE 文件格式,这是一种主要的 Windows 可执行文件格式。 但是,从 v3.0.0 开始,已经添加了对 ELF 文件的支持(感谢 Intezer)。
什么是能力?
能力的概念实际上意味着什么,尤其是在可执行文件的上下文中? 程序或软件满足某些计算需求或解决问题。 为了简单起见,我们的要求可能包括查找文件、读取/写入文件、运行程序、将某些数据记录到日志文件、打开网络连接等。 然后,我们使用我们选择的编程语言和特定指令来完成这些任务并编译程序。 生成的二进制文件或可执行文件然后代表用户执行这些任务,因此生成的可执行文件能够执行上述任务。
查看源代码,很容易确定程序的作用或其意图。 但是,一旦程序被编译为可执行文件,源代码就会被转换为机器语言,并且不再是生成的可执行文件的一部分(除非使用调试信息进行编译)。 我们仍然可以通过查看等效的汇编指令并结合一些 Linux API(glibc/系统调用)的知识来理解它,但是这很困难。 确实存在反编译器之类的工具,它们试图将汇编转换为可能是原始源代码的伪代码。 但是,它不是一对一的匹配,并且只是尽力而为的尝试。
为什么需要另一个工具?
如果我们有多个原生 Linux 工具来分析二进制文件,为什么我们还需要另一个工具? 现有工具可以帮助开发人员排除故障并调试开发过程中可能出现的问题。 它们通常是初步分析未知二进制文件的第一步,但是,它们还不够。
有时,需要的不是冗长的反汇编或长长的伪代码,而仅仅是基于其 API 使用情况的二进制文件中所见功能的快速摘要。 通常,恶意二进制文件和恶意软件会采用一些反分析或反向工程技术,这些技术会使此类原生工具无助。
Capa 的主要受众是恶意软件或安全研究人员,他们经常遇到无法获得源代码的未知二进制文件。 他们需要确定它是恶意软件还是良性可执行文件。 第一步是确定可执行文件可以做什么,然后再进行动态分析。 这可以通过针对流行的框架(我们将在下面探讨)匹配的一些预定义规则集来完成。 原生 Linux 工具并非为此类用途而设计的。
获取 Capa
从 此处 下载预构建的 Capa Linux 程序。 您必须使用 v3.0.0 或更高版本。 Capa 是用 Python 编程的,但是下载的程序不是 Python 解释器可以执行的 .py
文件。 而是可以直接从 Linux 命令行运行的 ELF 可执行文件。
$ pwd
/root/CAPA
$
$ wget -q https://github.com/mandiant/capa/releases/download/v3.0.2/capa-v3.0.2-linux.zip
$
$ file capa-v3.0.2-linux.zip
capa-v3.0.2-linux.zip: Zip archive data, at least v2.0 to extract
$
$ unzip capa-v3.0.2-linux.zip
Archive: capa-v3.0.2-linux.zip
inflating: capa
$
$ ls -l capa
-rwxr-xr-x. 1 root root 41282976 Sep 28 18:29 capa
$
$ file capa
capa: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=1da3a1d77c7109ce6444919f4a15e7e6c63d02fa, stripped
命令行选项
Capa 带有各种命令行选项。 本文将介绍其中的一些选项,首先是帮助内容
$ ./capa -h
usage: capa [-h] [--version] [-v] [-vv] [-d] [-q] [--color {auto,always,never}] [-f {auto,pe,elf,sc32,sc64,freeze}]
[-b {vivisect,smda}] [-r RULES] [-s SIGNATURES] [-t TAG] [-j]
sample
The FLARE team's open-source tool to identify capabilities in executable files.
<< snip >>
$
使用此命令检查是否正在运行所需的 Capa 版本(v3 及更高版本)
$ ./capa --version
capa v3.0.2-0-gead8a83
Capa 输出和 MITRE ATT&CK 框架
Capa 输出可能有点令人不知所措,因此首先在简单的实用程序(例如 pwd
)上运行它。 Linux 上的 pwd
命令会打印当前工作目录,这是一个常用命令。 请注意,根据您使用的发行版,pwd
可能是 shell 内置的(没有单独的可执行文件)。 首先使用 which
命令识别其路径,然后将完整路径提供给 Capa。 这是一个例子
$ which pwd
/usr/bin/pwd
$
$ file /usr/bin/pwd
/usr/bin/pwd: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=ec306ddd72ce7be19dfc1e62328bb89b6b3a6df5, for GNU/Linux 3.2.0, stripped
$
$ ./capa -f elf /usr/bin/pwd
loading : 100%| 633/633 [00:00<00:00, 2409.72 rules/s]
matching: 100%| 76/76 [00:01<00:00, 38.87 functions/s, skipped 0 library functions]
+------------------------+------------------------------------------------------------------------------------+
| md5 | 8d50bbd7fea04735a70f21cca5063efe |
| sha1 | 7d9df581bc3d34c9fb93058be2cdb9a8c04ec061 |
| sha256 | 53205e6ef4e1e7e80745adc09c00f946ae98ccf6f8eb9c4535bd29188f7f1d91 |
| os | linux |
| format | elf |
| arch | amd64 |
| path | /usr/bin/pwd |
+------------------------+------------------------------------------------------------------------------------+
+------------------------+------------------------------------------------------------------------------------+
| ATT&CK Tactic | ATT&CK Technique |
|------------------------+------------------------------------------------------------------------------------|
| DISCOVERY | File and Directory Discovery:: T1083 |
+------------------------+------------------------------------------------------------------------------------+
+-----------------------------+-------------------------------------------------------------------------------+
| MBC Objective | MBC Behavior |
|-----------------------------+-------------------------------------------------------------------------------|
| FILE SYSTEM | Writes File:: [C0052] |
+-----------------------------+-------------------------------------------------------------------------------+
+------------------------------------------------------+------------------------------------------------------+
| CAPABILITY | NAMESPACE |
|------------------------------------------------------+------------------------------------------------------|
| enumerate files on Linux (2 matches) | host-interaction/file-system/files/list |
| write file on Linux | host-interaction/file-system/write |
+------------------------------------------------------+------------------------------------------------------+
使用 -f elf
参数运行 Capa,告诉它要分析的可执行文件是 ELF 文件格式。 对于未知二进制文件,可能需要此选项;但是,Capa 完全有能力自行检测格式并进行分析,因此如果需要,您可以跳过此选项。 在开始时,您将看到一条加载/匹配消息,因为 Capa 会从后端加载其规则,然后分析可执行文件并将其与这些规则进行匹配。 通过将 -q
选项添加到所有命令来跳过显示此消息。
Capa 输出分为多个部分。 第一部分使用其 md5、sha1 或 sha256 哈希值唯一标识二进制文件,后跟操作系统、文件格式和体系结构信息。 在处理可执行文件时,此信息通常至关重要。 在以下各节中,Capa 使用 ATT&CK 策略和技术来匹配功能。
MITRE ATT&CK 最好用项目自己的话说
MITRE ATT&CK® 是一个全球可访问的对抗战术和技术知识库,基于现实世界的观察。
如果您想了解更多关于 ATT&CK 的信息,请参阅 此处的 MITRE ATT&CK 框架。
您可以在以下两个部分中将 Capa 的输出与 MITRE ATT&CK 框架的输出进行匹配。 我将在本文中跳过这一部分。
最后,在“能力”部分中,您可以看到列出了两个特定功能
enumerate files on Linux
write file on Linux
将其与 pwd
程序的性质进行比较,该程序需要显示当前目录。 在这里,它匹配第一个功能(记住 Linux 中一切皆文件的概念)。 那么第二部分说写入文件呢? 我们当然没有将 pwd
输出写入任何文件。 但是,请记住,pwd
需要将当前目录位置写入终端;否则如何打印输出? 如果您仍然不确定它是如何工作的,请运行以下命令并匹配输出。 如果您不熟悉 strace
或它的作用,我有一篇文章介绍了它 here。 重点关注文章末尾的 write 系统调用,其中 pwd
可执行文件需要将目录路径(字符串)写入 1,它代表标准输出。 在我们的例子中,那是终端。
$ strace -f /usr/bin/pwd
execve("/usr/bin/pwd", ["/usr/bin/pwd"], 0x7ffd7983a238 /* 49 vars */) = 0
brk(NULL)
<< snip >>
write(1, "/root/CAPA\n", 11/root/CAPA
) = 11
close(1) = 0
close(2) = 0
exit_group(0) = ?
+++ exited with 0 +++
在不同的 Linux 实用程序上运行 Capa
现在您已经知道如何运行 Capa,我强烈建议您在各种日常 Linux 实用程序上尝试它。 选择实用程序时,请尽量多样化。 例如,选择与文件系统或存储命令(如 ls
、mount
、cat
、echo
等)一起使用的实用程序。 接下来,移动到网络实用程序,如 netstat
、ss
、telnet
等,您将在其中找到可执行文件的网络功能。 将其扩展到更大的程序守护程序,如 sshd
以查看与加密相关的功能,然后是 systemd
、bash
等。
需要提醒的是,如果您看到与这些原生实用程序的恶意软件匹配的规则,请不要太害怕。 例如,在分析 systemd 时,Capa 显示了基于从网络接收数据的功能的 COMMAND AND CONTROL 的匹配项。 这种能力可以被真正的程序用于合法情况,而恶意软件可以将其用于恶意目的。
以调试模式运行
如果您希望了解 Capa 如何在可执行文件中找到所有这些功能,请提供 -d
标志,该标志会在屏幕上显示其他信息,这些信息可能有助于了解其内部工作原理。 使用此数据并在 GitHub 上的源代码中查找线索。
$ ./capa -q /usr/sbin/sshd -d
首先要注意的是,Capa 将规则保存到临时目录并从那里读取它们
DEBUG:capa:reading rules from directory /tmp/_MEIKUG6Oj/rules
调试输出显示它从该目录加载了各种规则。 例如,请参阅它如何尝试识别机器的主机名
DEBUG:capa:loaded rule: 'get hostname' with scope: function
有了这些信息,很容易查找规则。 只需转到 rules
目录并 grep
搜索特定的规则名称,如下面的示例所示。 该规则在 .yml 文件中声明。
$ grep -irn "name: get hostname" *
rules/host-interaction/os/hostname/get-hostname.yml:3: name: get hostname
检查列出各种 API 的 -api
部分。 Capa 查找 gethostname
API 的用法(在 Linux 上),您也可以在那里看到 Windows 等效项。
$ cat _MEIKUG6Oj/rules/host-interaction/os/hostname/get-hostname.yml
rule:
meta:
name: get hostname
namespace: host-interaction/os/hostname
<< snip >>
features:
- or:
- api: kernel32.GetComputerName
- api: kernel32.GetComputerNameEx
- api: GetComputerObjectName
- api: ws2_32.gethostname
- api: gethostname
您可以使用手册页找到有关此特定系统调用的更多信息。
$ man 2 gethostname
GETHOSTNAME(2) Linux Programmer's Manual GETHOSTNAME(2)
NAME
gethostname, sethostname - get/set hostname
<< snip >>
详细用法
识别 Capa 正在查找哪些 API 的另一种好方法是使用 verbose 模式,如下所示。 这个简单的示例显示了 opendir
、readdir
和 fwrite
API 的用法
$ ./capa -q /usr/bin/pwd -vv
enumerate files on Linux (2 matches)
<< snip >>
api: opendir @ 0x20052E8
api: readdir @ 0x2005369, 0x200548A
write file on Linux
<< snip >>
os: linux
or:
api: fwrite @ 0x2002CB5
自定义规则
与其他优秀的工具一样,Capa 允许您通过添加自己的规则来扩展它。如果您注意到了,调试输出中也给出了这个提示。
$ capa --signature ./path/to/signatures/ /path/to/executable
指定规则
您还可以查找特定的规则,而不是让 Capa 尝试匹配每一个规则。通过添加 -t
标志,后跟准确的规则名称来实现这一点。
$ ./capa -t "create process on Linux" /usr/sbin/sshd -q -j
从 rules
目录中的 .yml 文件中显示规则名称。例如
$ grep name rules/host-interaction/process/create/create-process-on-linux.yml
name: create process on Linux
输出格式
最后,Capa 允许使用 -j
标志以 JSON 格式输出。 此标志有助于快速使用信息并辅助自动化。此示例命令需要安装 jq 命令。
$ ./capa -t "create process on Linux" /usr/sbin/sshd -q -j | jq .
总结
Capa 是 ELF 可执行文件所需工具的宝贵补充。 我说所需是因为我们现在经常看到 Linux 恶意软件的案例。 Linux 上的工具必须赶上步伐来应对这些威胁。 您可以尝试使用 Capa,并在各种可执行文件上运行它,还可以编写自己的规则并将它们添加到上游,以造福社区。
评论已关闭。