KBOT恶意软件分析
2020-02-21 11:40:00 Author: www.4hou.com(查看原文) 阅读量:120 收藏

研究人员近期发现一个通过注入恶意代码到Windows可执行文件进行传播的恶意软件,也就是说该恶意软件是一个病毒。研究人员将该恶意软件命名为KBOT。

KBOT概述

KBOT会通过互联网或本地网络或从受感染的外部媒介入侵用户的计算机。感染的文件启动后,恶意软件会可以在系统中立足,将自己写入开始菜单和计划任务中,然后部署web探针尝试窃取受害者的银行和个人数据。出于同样的目的,KBOT会下载额外的窃取器模块,该模块会收集用户的所有信息并发送到C2服务器,包括口令、加密钱包数据、文件列表和安装的应用等。恶意软件会保存所有文件,并用RC6算法加密虚拟文件系统中收集的数据,因此很难检测。

感染方法

KBOT会通过添加多态恶意代码到文件主体中来感染所有互联连接设备和共享网络文件夹上的EXE文件。为达到这一目的,恶意软件会使用IID_IwbemObjectSink接口和SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA ‘Win32_LogicalDisk 查询来监听本地和网络逻辑设备上的连接事件,覆盖IWbemObjectSink接口的Indicate函数,对每个驱动都会执行目录递归扫描和感染EXE文件。

恶意软件在扫描目录和感染可执行exe文件前,会使用API函数NetServerEnum和NetShareEnum提取到共享网络资源的路径:

 

与其他很多病毒一样,KBOT也会对入口点代码打补丁,转到多态代码的switch会添加到代码部分的开始。因此,入口点的原始代码和代码部分的开始并不会保存。因此,受感染的文件的原始功能并不保留。

入口点病毒代码

Jmp命令进行到多态代码的switch:

病毒还会添加加密的数据到以下section的尾部:.rsrc、.data、.rdata。位于选定section之后的数据会移动。同时,relocation表目录的参数、资源目录、导入目录、section参数和其他PE文件参数都会相应修改。加密的数据包括主恶意软件模块(DLL)的主体、解密代码、加载到内存的代码、运行库的代码。数据是用XOR方法加密的,库文件是用RC4算法加密,用Aplib压缩的。

受感染的文件示例

在多态代码的末尾是获取kernel32.dll基的经典代码段:

然后,VirtualProtect函数的API地址会被提取,然后用来设置写和执行.rsrc、.data、.rdata区域的病毒数据的权限。数据解密后,会执行到相关代码的switch:

代码会用基本僵尸功能来解密DLL库,在内存中映射库header和section,解析从import目录的导入,使用来自relocation表目录的信息执行手动重定位,然后在库入口点执行代码。

KBOT功能

注入

为了在系统中隐藏恶意活动和在系统应用环境中执行,KBOT会尝试注入代码到运行的系统进程中。

使用API函数OpenProcess/OpenProcessToken和GetTokenInformation,会提取进程的SID到主恶意软件模块加载的地址空间。如果进程的SID与WinLocalSystemSid匹配,KBOT就会使用CreateProcess API和CREATE_SUSPENDED flag来创建新的进程svchost.exe,然后执行经典注入:使用API函数NtCreateSection/NtMapViewOfSection,在svchost.exe进程的内存空间中分配内存,复制header和主模块的sections,然后解析来自import目录的import,并使用来自relocation 表目录的信息进行手动重定位。然后,KBOT会用入口点地址调用CreateRemoteThread/RtlCreateUserThread API。如果进程的SID与WinLocalSystemSid不匹配,恶意软件就会设置SeDebugPrivilege debug权限,并尝试在运行的进程services.exe和svchost.exe中执行类似的注入,其中SID与WinLocalSystemSid是匹配的。

KBOT也会注入injects.ini文件中指定的DLL到该文件中列出的进程中。包括injects.ini文件在内的配置文件都在僵尸的主模块的一个section中加密。样本首先会搜索存储中需求文件的当前版本,如果搜索失败,就从原始版本中读取文件数据,数据以加密形式位于僵尸主机的body中。其中一个特殊的bot模块——JF,会负责处理这类文件。在每个此类文件的加密数据的开始部分,有一个含有JF签名的数据描述部分的结构。

配置文件的数据处理步骤描述

含有加密文件数据描述的结构对应的每个加密的文件:

injects.ini示例:

上述的UPITER.32和JUPITER.64 都是执行web注入的DLL,可以帮助恶意软件窃取输入浏览器的用户隐私数据,包括口令、信用卡号、加密货币钱包地址等。这样的注入是通过伪造web页面内容实现的,这是将恶意代码注入到HTTP流量中的结果。因此,需要修改浏览器和负责流量传输和处理的系统函数的代码。为此,在系统和浏览器进程中执行注入后,web-inject库会对主流浏览器中的函数代码和负责传输流量的系统函数代码打补丁:

来自配置文件的注入列表由恶意软件保存在inject descriptors全局数组中,这是与Rovnix bootkit类似的功能。

DLL劫持

当系统启动时,为了在合法系统应用的地址空间进行操作,恶意软件要感染系统可执行文件的import目录指定的系统函数和替换到开始菜单中来执行DLL劫持攻击。

1、在系统文件夹C:\Windows\\System32中,恶意软件会搜索与攻击匹配的可执行文件EXE,会排除以下文件:

2、在manifest文件中含有字符串level=”requireAdministrator”和 >true。这就表示可执行文件需要管理员权限才可以运行。

3、Stop列表中包含的文件名:

找到满足所有条件的可执行文件后,KBOT会在系统目录中创建一个任意名字的文件夹,复制检测到的exe文件到该文件夹中。为了执行这些要求管理员权限的操作,恶意软件会使用EIFOMoniker Elevation:Administrator!new:{3ad05575-8857-4850-9277-11b85bdb8e09}”生成一个shellcode。

Shellcode功能

Shellcode和必要的参数会使用CreateRemoteThread API函数注入到explorer.exe进程中。

复制后,病毒会在相同文件夹中创建任意命名的文件,创建的文件是加密的文件存储,VFAT用作文件系统。位于存储的是主bot模块的当前版本,来自C2的配置文件,系统信息和其他服务数据。

来自系统应用的目录、import目录的DLL和KBOT服务数据存储看起来是这样的:

然后,KBOT会感染复制的系统库。DLLEntryPoint入口点代码会被以下代码覆写:

在感染可执行文件时,病毒会添加多态代码到code section,到.rsrc、.data、.rdata section的尾部加入加密代码。与加入到EXE文件的代码不同,代码并不含有僵尸主机的加密main模块,而是会从文件存储中读取和解密。从创建的文件夹中的系统exe文件导入的函数会覆写执行到多态代码的switch的代码:

恶意代码的下一步操作算法与感染的EXE文件中恶意代码是类似的,除了main bot模块是从加密的存储读取的。受感染的DLL的原始数据并没有保存。

DLL的最后一个section尾部的加密代码如下所示:

这样,系统EXE文件开始后,位于下一部分的导入DLL会加载到进程的地址空间中。在调用导入的函数后,恶意代码就会执行。

开始菜单

为了在系统开始菜单中运行,恶意软件会使用以下方法:

1.  将自己写入Software\\Microsoft\\Windows\\CurrentVersion\\Run。为了防止出现UAC窗口,会设置__compat_layer环境变量的值为RunAsInvoker。用CreateDesktop API可以创建一个新的桌面。在桌面框架内,会使用CreateProcess API来启动regedit.exe进程。恶意软件会注入shellcode到进程中,使用API函数来写入系统EXE的完全路径到指定注册表。

2.  使用WMI工具会常见一个任务在计划任务中运行系统exe文件,然后是感染的恶意DLL文件。

KBOT会执行计划任务中的当前任务的初步检查,读取从任务中导入的DLL的内容,搜索感染签名数据:

如果受感染的文件中没有任务,就会以本地系统账户(S-1-5-18)的名义创建新任务:

任务参数:

创建的任务的XML示例:

远程管理

为了远程管理受害者的计算机,KBOT会创建BC.ini文件中列出的服务器的逆向连接。

为了使用RDP协议创建多个即时会话,恶意软件会配置远程桌面服务器设置:

1、恶意软件会找到在内存中加载termserv.dll的进程。

 

2、然后对termserv.dll加载的进程的内存section打补丁。不同的补丁代码会应用到不同的系统版本中。

 

3、在打补丁过程中,会在模块的内存中搜索特定的字节集,并用指定内地替换。

 

然后,KBOT会编辑负责TermService设置的注册表值:

· HKLM\SYSTEM\ControlSet\Control\TerminalServer\LicensingCore\ EnableConcurrentSessions

· HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon\EnableConcurrentSessions

· HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon\ AllowMultipleTSSessions

· HKLM\SOFTWARE\Policies\Microsoft\WindowsNT\TerminalServices\MaxInstanceCount

然后重启TermService,并在系统中创建一个用户用作SID WinBuiltinRemoteDesktopUsersSid的远程连接。

C2通信

恶意软件会开启一个接收和处理来自服务器命令的进程。命令列表会以缓存的形式发送。为了接收命令,会使用网络连接wininet.dll API。接收命令的域名位于hosts.ini文件中,恶意软件会周期性的更新该文件。所有包括C2数据和连接参数在内的配置文件都以加密形式保存在main bot模块的最后一个section中,新的版本会保存在加密的VFAT存储中。从C2接收的文件会位于加密存储中。

hosts.ini配置文件示例

受感染系统的僵尸ID和详细信息都会提前发送给C2服务器。流量是用AES算法加密的:

恶意软件会接收来自C2服务器的命令,包括:

· DeleteFile — 删除来自文件存储的指定文件

· UpdateFile — 更新文件存储中指定的文件

· UpdateInjects — 更新injects.ini.

· UpdateHosts — 更新hosts.ini.

· UpdateCore — 更新main bot模块和配置文件kbot.ini.

· Uninstall — 卸载恶意软件

· UpdateWormConfig — 更新含有要感染的exe文件位置信息的worm.ini

 

worm.ini示例

· UpdateBackconnectConfig — 更新含有用于反向连接的服务器列表的配置文件

bc.ini示例

· Load — 加载文件到存储中,恶意软件会加载监听程序来收集用户数据、web inject DLL和配置文件。

 

Web inject的配置文件部分示例

混淆

为了防止研究任意分析其恶意活动,KBOT还使用了一系列混淆工具。加载时,main bot模块会检查导入的函数是否在断点修复,如果修复就重新加载导入的DLL到内存中,o是导入函数名,并且使用了字符串混淆。加密的字符串保存在一个特殊的数组结构中,要访问这些字符串,需要调用解密函数和数组中的字符串结构树。这些字符串用RC4算法加密,解密key保存在结构中。

含有字符串描述的结构数组示例

访问字符串:

解密函数:

执行web注入的DLL的混淆

恶意软件还会挂起IBM Trusteer Rapport线程,找到代码来自位于*\\Trusteer\\Rapport\\*.dll的DLL处运行的代码

然后,恶意软件会发送DLL内容的签名。如果存在,就挂起线程的执行,对环境打补丁来执行sleep函数,然后恢复线程:

然后,KBOT会扫描导入的函数代码。如果代码修复了就重新加载导入的库函数到内存中,并解析import。

本文翻译自:https://securelist.com/kbot-sometimes-they-come-back/96157/如若转载,请注明原文地址


文章来源: https://www.4hou.com/posts/BRqo
如有侵权请联系:admin#unsafe.sh