思路分享:配置Windows域以动态分析混淆的横向移动工具

阅读量    68300 |

分享到: QQ空间 新浪微博 微信 QQ facebook twitter

 

我们最近遇到了一个大型混淆的恶意软件,该样本提供了一些有趣的分析挑战。它使用虚拟化技术来阻止我们为静态分析生成完全去混淆的内存dump。如果按照传统的方法,静态分析如此大的虚拟化样本,可能需要几天到几周的时间,为了减少分析时间,FLARE逆向团队Mandiant一起合作,最终成功将逆向时间缩短到了几个小时。

我们怀疑该样本是横向移动工具,因此我们需要适当的环境进行分析。事实证明,配置域环境进行分析是必不可少的步骤。我们希望能够给其他遇到横向移动样本的分析师提供一定的支持。所以在本文中,我们将解释如何利用一个虚拟的Windows域分析此恶意软件以及我们用于确认某些恶意软件功能的分析技术。

 

初步分析

在开始分析一个新的恶意样本时,我们往往从静态分析开始。希望通过静态分析了解该样本的类型和功能。我们可以利用静态分析所得到的一些信息为后面的分析提供一些帮助。通常情况下,我们可以通过类似于CFF Explorer这样的工具对可执行文件进行结构分析。在本例中,待分析的样本大小为6.64MB。这表明样本中应该包含了静态链接库,例如Boost或OpenSSL,这使得分析变得困难。

此外,我们注意到导入表包括了八个动态链接DLL,每个DLL中只有一个导入函数,如下图所示。

这是打包器和混淆器导入DLL的常用方法,通过该方法可将这些DLL用于运行时链接,避免在静态分析阶段暴露恶意软件使用的API。

通过字符串分析,再次印证了该恶意软件很难静态分析。由于文件太大,字符串导入出来之后数量已经超过了75000.我们使用StringSifter对这些字符串进行排序分析,但却没有得到任何有用的信息。下图显示了根据StringSifter分析得到的最相关的字符串:

当我们遇到此类型的问题时,通常我们可以通过动态分析的方式来捕获恶意样本的行为。我们可以尝试通过动态分析工具evil.exe进行分析,关于evil.exe的使用方法如下:

Usage: evil.exe [/P:str] [/S[:str]] [/B:str] [/F:str] [/C] [/L:str] [/H:str] [/T:int] [/E:int] [/R]
   /P:str -- path to payload file.
   /S[:str] -- share for reverse copy.
   /B:str -- path to file to load settings from.
   /F:str -- write log to specified file.
   /C -- write log to console.
   /L:str -- path to file with host list.
   /H:str -- host name to process.
   /T:int -- maximum number of concurrent threads.
   /E:int -- number of seconds to delay before payload deletion (set to 0 to avoid remove).
   /R -- remove payload from hosts (/P and /S will be ignored).
If /S specifed without value, random name will be used.
/L and /H can be combined and specified more than once. At least one must present.
/B will be processed after all other flags and will override any specified values (if any).
All parameters are case sensetive.

我们尝试通过挂起进程并内存dump的方式来拿到payload,但经过试验我们发现这是非常困难的。因为恶意软件基本上马上就会退出并删除自身。我们通过下面的命令,最终成功dump了部分数据。

sleep 2 && evil.exe /P:"C:WindowsSystem32calc.exe" /E:1000 /F:log.txt /H:some_host

我们选择了一个自删除时间间隔稍长的payload文件,并且为它提供了日志文件名和主机名等参数,通过参数配置,可以使得时间事件缩短,让我们可以在进程终止之前挂起它。

两秒之后,我们使用Process Dump生成了内存快照,但不幸的是,虚拟化仍然很大程度的阻碍了我们的分析。我们拿到的数据仍然带有一定程度的混淆。但是幸运的是我们成功从这部分数据中提取到了一些新的字符串,为我们之后的分析打开了突破口。

下图显示了我们新提取的字符串,这些字符串在原始样本中并为提取出来:

dumpedswaqp.exe
psxexesvc
schtasks.exe /create /tn "%s" /tr "%s" /s "%s" /sc onstart /ru system /f
schtasks.exe /run /tn "%s" /s "%s"
schtasks.exe /delete /tn "%s" /s "%s" /f
ServicesActive
Payload direct-copied
Payload reverse-copied
Payload removed
Task created
Task executed
Task deleted
SM opened
Service created
Service started
Service stopped
Service removed
Total hosts: %d, Threads: %d
SHARE_%c%c%c%c
Share "%s" created, path "%s"
Share "%s" removed
Error at hooking API "%S"
Dumping first %d bytes:
DllRegisterServer
DllInstall
register
install

根据已有的信息来看,我们推测该样本是一个远控木马。但是,如果不给样本提供横向移动的环境,就无法证实我们的猜想。为了加快分析速度,我们创建了一个虚拟的Windows域。

创建虚拟的Windows域需要一些稍微复杂的配置,因此我们在本文中进行记录,细微可以帮助其他想要通过该方法分析样本的人。

 

建立测试环境

在测试环境中,请确保已经安装干净的Windows10和Windows Server 2016虚拟机。我们建议创建两台Windows Server 2016计算机,以便可以将域控制器与其他测试系统分开。

在主机系统上的VMware Virtual Network Editor中,使用以下设置创建自定义网络:

 1. 在"VMNet信息"下,选择"仅主机"按钮。
 2. 确保禁用"连接主机虚拟适配器"以防止连接到外部世界。
 如果将使用静态IP地址,请确保禁用"使用本地DHCP服务"选项。

具体配置如下所示:

接下来,配置guest网络适配器以连接到该网络。

1. 为虚拟机配置主机名和静态IP地址。
2. 选择域控IP来作为所有Guest的默认网关和DNS服务器。

具体配置如下图所示:

完成所有配置后,首先将Active Directory域服务和DNS服务器角色安装到指定的域控制器服务器上。这可以通过Windows Server Manager应用程序来完成,如下图所示:

一旦角色成功安装,就会如下图一样运行升级操作。

一旦将Active Directory域服务角色添加到服务器,就可以通过通知菜单访问升级选项,添加具有完全限定的根域名的新林域forest,例如测试域.local。其他选项可以保留为默认选项。升级过程完成后,重新启动系统。

升级域控制器后,通过域控制器上的Active Directory用户和计算机创建测试用户帐户。如下图所示:

创建测试帐户后,继续将虚拟网络上的其他系统加入域。这可以通过高级系统设置来完成,如下图所示,可使用测试帐户凭据将系统加入域。

将所有系统都加入域后,请验证每个系统是否可以ping通其他系统。我们建议在测试环境中禁用Windows防火墙,以确保每个系统都可以访问测试环境中另一个系统的所有可用服务。

授予测试帐户对所有测试系统的权限权限。可以通过使用下图所示的命令手动修改每个系统上的本地管理员组来完成,也可以通过组策略对象(GPO)自动修改。

net localgroup administrators sa_jdoe /ADD

 

域动态分析

至此,我们准备开始进行动态分析。我们通过安装并启动Wireshark和Process Monitor来准备测试环境。我们为三个Guest系统创建了快照,并在客户端上的测试域帐户的上下文中运行了恶意软件,如下所示:

evil.exe /P:"C:WindowsSystem32calc.exe" /L:hostnames.txt /F:log.txt /S /C

我们使用以下以行分隔的主机名填充hostnames.txt文件:

DBPROD.testdomain.local
client.testdomain.local
DC.testdomain.local

 

数据包分析

在分析捕获到的流量包后,我们确定了到主机列表中每个系统的SMB连接。在SMB握手完成之前,请求了Kerberos凭证。为用户请求一个ticket granting ticket(TGT),并为每个服务器请求服务凭证,如下体所示。要了解Kerberos身份验证协议的更多信息,请参阅我们最近的博客文章,其中介绍了该协议以及一个新的Mandiant Red Team工具。

恶意软件通过SMB访问C$共享并写入文件C:Windowsswaqp.exe. 然后它使用RPC启动SVCCTL,SVCCTL用于注册和启动服务。SVCCTL创建了swaqpd服务。该服务用于payload,随后被删除。最后,文件被删除,没有观察到其他活动。流量如下图所示:

这与我们使用Process Monitor分析到的行为基本符合。接着,我们继续使用不同的命令行选项和环境运行恶意软件。结合我们的静态分析,我们可以自信地确定恶意软件的功能,其中包括将有效负载复制到远程主机,安装和运行服务以及事后删除证据。

 

结论

大量混淆的样本静态分析可能需要数十个小时。动态分析技术为此提供了比较好的解决方案,但是它需要分析人员对样本的预测和提供模拟的环境。在这种情况下,我们可以将我们静态分析得到的内容结合虚拟机化的Windows域完成分析。通过FFLARE团队的逆向技术和Mandiant团队的红队技术,我们充分利用了FireEye的各种技能。这种组合将分析时间减少到几个小时。我们通过从受感染主机中快速提取必要的IOC来支持主动的事件响应调查。我们希望分享这种经验可以帮助其他人建立自己的横向运动分析环境。

分享到: QQ空间 新浪微博 微信 QQ facebook twitter
|推荐阅读
|发表评论
|评论列表
加载更多