使用 osquery 追踪被盗代码签名证书
代码签名恶意软件
近期,270 万台运行 Windows 的计算机感染了恶意软件,这些软件使用从流行应用 CCleaner 创建者那里窃取的证书进行签名,并通过其软件更新机制植入。幸运的是,由于我们的同事 Alessandro Gario 提交的拉取请求增加了 Windows 可执行代码签名验证(也称为 Authenticode),现在使用 osquery 可以轻松检测签名的恶意软件。本文解释了代码签名在事件响应中的重要性,并通过使用这一新的 osquery 功能来检测最近的 CCleaner 恶意软件,展示了其用例。
如果您不熟悉 osquery,请花点时间阅读我们之前的博客文章,其中我们解释了为什么我们是 osquery 的传播者,以及我们如何扩展它以在 Windows 平台上运行。osquery 的部分吸引力在于其灵活性和开源模式——如果您需要构建其他功能,请告诉我们!
使用 osquery 验证 Authenticode 签名
Alessandro 在 osquery/tables/system/windows/authenticode.cpp 中实现了从系统读取代码签名和证书信息的代码。签名的验证是通过调用系统 API WinVerifyTrust() 完成的。
以下是一个使用 osquery 检查 Windows 可执行文件代码签名的简化示例:
1
2
3
|
...> result FROM authenticode
...> WHERE path = 'C:\Windows\explorer.exe';
|
大多数列的含义不言自明,但“result”值不是。 “Result”可能表示:
| 状态 |
解释 |
| missing |
缺少签名。 |
| invalid |
无效签名,由缺少或损坏的文件引起。 |
| untrusted |
无法验证的签名。 |
| distrusted |
有效签名,但被用户明确不信任。 |
| valid |
有效签名,但未被用户明确信任。 |
| trusted |
有效签名,且被用户信任。 |
使用 SQL 在 osquery 中获取聚焦结果
为了充分利用这一新功能,请在 osquery 内与其他系统表执行 JOIN 查询。我们将演示如何使用 SQL 查询通过减少列出进程时的噪音来增强系统监控:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
osquery> SELECT process.pid, process.path, authenticode.result
...> FROM processes as process
...> LEFT JOIN authenticode
...> ON process.path = authenticode.path
...> WHERE result = 'missing';
+------+-----------------------------------------------------------+---------+
| pid | path | result |
+------+-----------------------------------------------------------+---------+
| 3752 | c:\windows\system32\sihost.exe | missing |
| 3872 | C:\Windows\system32\notepad.exe | missing |
| 4860 | C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe | missing |
| 5200 | C:\Windows\system32\conhost.exe | missing |
| 6040 | C:\Windows\osqueryi.exe | missing |
+------+-----------------------------------------------------------+---------+
|
追踪被盗签名证书
假设您刚刚了解到一个恶意软件活动。恶意软件作者使用从合法软件供应商那里窃取的代码签名证书对其可执行文件进行代码签名。供应商通过获取新的代码签名证书并重新分发用新证书签名的应用程序来响应此事件。在此示例中,我们将使用 CCleaner。如何搜索计算机上使用此被盗证书签名的任何软件,但过滤掉使用供应商新证书签名的软件?
示例 1:查找使用被盗证书签名的可执行文件
1
2
3
4
5
6
7
8
9
10
|
osquery> SELECT files.path, authenticode.subject_name,
...> authenticode.serial_number,
...> authenticode.result AS status
...> FROM (
...> SELECT * FROM file
...> WHERE directory = "C:\Program Files\CCleaner"
...> ) AS files
...> LEFT JOIN authenticode
...> ON authenticode.path = files.path
...> WHERE authenticode.serial_number == "4b48b27c8224fe37b17a6a2ed7a81c9f";
|
示例 2:查找由受影响供应商签名但未使用其新证书的可执行文件
1
2
3
4
5
6
7
8
9
10
11
|
osquery> SELECT files.path, authenticode.subject_name,
...> authenticode.serial_number,
...> authenticode.result AS status
...> FROM (
...> SELECT * FROM file
...> WHERE directory = "C:\Program Files\CCleaner"
...> ) AS files
...> LEFT JOIN authenticode
...> ON authenticode.path = files.path
...> WHERE authenticode.subject_name LIKE "%Piriform%"
...> AND authenticode.serial_number != "52b6a81474e8048920f1909e454d7fc0";
|
示例 3:代码签名和文件哈希
也许您还想记录哈希值,以跟踪已安装的内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
SELECT files.path AS path,
...> authenticode.subject_name AS subject_name,
...> authenticode.serial_number AS serial_number,
...> authenticode.result AS status,
...> hashes.sha256 AS sha256
...> FROM (
...> SELECT * FROM file
...> WHERE directory = "C:\Program Files\CCleaner"
...> ) AS files
...> LEFT JOIN authenticode
...> ON authenticode.path = files.path
...> LEFT JOIN hash AS hashes
...> ON hashes.path = files.path
...> WHERE authenticode.subject_name LIKE "%Piriform%"
...> AND authenticode.serial_number != "52b6a81474e8048920f1909e454d7fc0"
|
出于我们的示例目的,请注意我们将搜索范围限制在“C:\Program Files\CCleaner”。您可以根据需要调整搜索范围。
我们展示的查询已在 osquery 的交互式 shell 模式下运行,这更适合事件响应。您可以按计划运行任何这些查询——使用 osquery 进行检测而不是响应。为此,您需要在要监控的主机上安装 osqueryd(osquery 守护程序),并配置日志记录基础设施以收集这些查询的输出(例如,将 osquery 输出馈送到 LogStash / ElasticSearch 以供后续分析)。
未来的 osquery 工作
在本文中,我们展示了 osquery 作为系统信息检索工具的灵活性:使用熟悉的 SQL 语法,您可以快速制作自定义查询,仅返回与您当前目标相关的信息。检查 Authenticode 签名的能力只是 osquery 作为响应工具搜索潜在入侵指标的一种用途。许多 IT 和安全团队正在使用 osquery 进行即时事件响应,包括初始恶意软件检测和识别传播。
Trail of Bits 很早就认识到 osquery 的潜力。一年多来,我们一直在根据客户的要求添加各种功能。如果您已经在使用 osquery 或正在考虑使用它,并且需要构建某个功能,请告诉我们!我们随时准备帮助您根据需求定制 osquery。