逆向工程演练:分析Arechclient2示例

admin 2023年7月30日21:56:46评论9 views字数 5191阅读17分18秒阅读模式

关键词

逆向工程、反混淆、Arechclient2

最近,SentinelOne与vx-underground合作,首次举行恶意软件逆向分析挑战。其中,SentinelOne要求网络安全研究人员提交他们的分析成果,以展示他们的才能,并将他们的见解带给更多的人。

本文演示了一种对恶意软件样本进行逆向工程问题的解决方法,其中不仅强调了分析样本所采取的具体步骤,还强调了随着逆向的展开所进行的逻辑推理。本文展示了当研究人员面临挑战时,是如何应对并解决的。对于任何希望学习或发展其逆向工程技能的人来说,这是一个极好的例子。

本文将回顾分析ArechClient2样本的过程。包括样本的初步分析、反混淆、脱壳和提取载荷。然后分析.NET有效载荷,揭示其配置信息和C2信息。

1. 初步分析


该样本由两个文件组成,一个是可执行文件,另一个是a3x文件。经过快速简略分析,发现a3x文件是AutoIt编译的脚本。可执行文件图标是AutoIt的徽标,版权信息显示它是AutoIt。因而初步判断此可执行文件运行时可能会执行a3x文件。

在Windows沙箱中运行了该文件以快速获取信息,并立即获得了Windows Defender对其MSIL的查询结果:特洛伊木马。这表明此AutoIt部分只是第二阶段.NET二进制文件的加载程序。如果您不熟悉这些术语,“MSIL”代表Microsoft中间语言,它是.NET二进制文件编译的中间字节码。

这个a3x脚本是可读的,所以在将其放入Visual Studio Code后,可以看到如图1所示结果。

逆向工程演练:分析Arechclient2示例

图1:a3x脚本

起初这看起来很杂乱,但仔细看会发现了一些突出的信息:对 “DoctrineDrama” 函数的调用看起来像是字符串解密。所以下一步是找到这个函数。通过使用搜索功能查找其名称,直到找到实际的实现进程。所有函数都以关键字“Func”开头,并以关键字“EndFunc”结尾,这使得函数便于识别。图2为 “DoctrineDrama”函数代码。代码是模糊的,似乎包含一些花指令。第一步是缩进代码以便于阅读。

逆向工程演练:分析Arechclient2示例

图2:DoctrineDrama函数

观察循环中的switch,case代码,可以发现只有使用了ExitLoop指令的分支是重要的。通过查看switch的循环条件可以确定以上推测。在函数的开头,第二个变量是循环条件,初始值为921021。查看switch循环,该值只与包含ExitLoop指令的case分支相匹配,这意味着其他的case分支均未被运行,可以被忽略。将原始代码中的不必要的循环,未被使用的指令删除后,结果如图3所示。

逆向工程演练:分析Arechclient2示例

图3:修改后的DoctrineDrama函数

阅读清理后的代码,可以推断出一些更合适的变量名称,第一个参数似乎是加密的输入,第二个参数是密钥。第一个变量是加密结果的字符串。
为了理解余下的代码,通过查阅AutoIt的文档可知, 代码中使用的stringSplite”函数使用以下参数:
  • 一个字符串
  • 一个分隔符字符
  • 一个确定分隔符搜索模式的可选参数
因此,在DoctrineDrama函数的第二个局部变量是将输入的数据中分割字符串数组。接下来,代码迭代该数组的所有元素,并在每次迭代时向输出字符串附加一个新字符。可以看见,一个名为“Chr”的函数被调用,根据文档可知该函数将0-255的数值转化为ASCII字符。但是在Chr函数里有奇怪的操作-字符串的减法,这是如何实现的?通过网络查阅,可以发现在AutoIt中,如果对数字字符串执行任何算术操作,它们似乎都会自动转换为数字。循环完成后,将返回输出字符串。

逆向工程演练:分析Arechclient2示例

图4:DoctrineDrama完全清理版本

通过查看图4所示的代码完全清理的版本,在C#中重新实现了解密过程,以构建一个简单的反混淆器,如图5所示。

逆向工程演练:分析Arechclient2示例

图5:反混淆器

反混淆器使用简单的正则表达式匹配每一个对DoctrineDrama函数的请求,并将其替换为解密的字符串,并输出所有解密字符串的列表。

2. 转储有效载荷


将所有字符串解析后,尝试在字符串转储中搜索一些WindowsAPI函数名,发现了“NtResumeThread”、“CreateProcessW”、“NtUnmapViewOfSection”三个字符串,这三个结合在一起,说明恶意软件极大的可能使用了进程镂空(Process Hollowing)攻击技术。随后,在字符串转储中搜索.exe,发现了可疑的注射目标Microsoft.NETFrameworkv4.0.30319jsc.exe,它是一种基于.NET 4.x框架的Windows 10 安装自带的工具。
在这之后,则是使用x64Dbg软件调试可执行文件。在CreateProcessW函数上设置断点,从而确保在注射进程开始之前中断。运行过入口点后,收到了图6所示的弹窗消息。逆向工程演练:分析Arechclient2示例

图6:错误信息弹窗

这消息框声明违反了一项EULA,但在调试过程中,并未阅读或同意过相关内容,因而无法再进一步调试恶意软件。幸运的是,x64Dbg有一个内置的AutoIt EULA旁路,称为隐藏调试器(PEB)。我们能在“Debug>Advanced>Hide Debugger (PEB)”路径找到,这可以确保在提升模式下运行x64Dbg。

在处理了相对简单的反调试之后,我们让它运行。调试时,可执行文件会生成一个文件对话框,请求一个a3x文件,当在没有调试器的情况下运行时,它会自动找到脚本文件。在将其指向脚本文件后,我们让它一直运行到CreateProcessW函数上设置的断点被触发。在这一点上,jsc.exe文件将以挂起模式启动,该模式会暂时停止大部分活动和处理,但仍然保持一些基本功能以便能够迅速恢复到正常操作状态。

检查进程浏览器(Process Explorer)可确认AutoIt脚本中解密的路径确实是注入目标。并在NtResumeThread函数上添加了另一个断点,这将在注入完成后,中断执行线程恢复执行恶意软件。

逆向工程演练:分析Arechclient2示例

图7:进程浏览器

至此,我们已经知道恶意软件是基于.NET,随后将使用ExtremeDumper从jsc.exe进程中获取托管载荷。以管理员身份运行ExtremeDumper并转储jsc.exe文件,如果没有显示,请确保使用的是ExtremeDumper的x86版本。
在写入本文时,加载程序不再运行,并显示有关Windows更新的错误消息。通过筛选字符串转储,怀疑是有某种日期检查阻止了软件的进一步执行。这可能是为了防止将来的逆向分析。幸运的是,之前已经转存下了实际有效载荷。
3. .NET有效载荷


接下来需要处理从加载程序转储的托管载荷。其内存映像被严重混淆,需要从类模块,也称为全局类型中寻找有效信息。之所以首先检查这个类,是因为它的构造函数是在程序入口点之前调用的。许多混淆处理程序在入口点前调用它们的运行时保护功能,或字符串解密之类的函数。

以上猜测是正确的, 在模块(0x06000003)中发现了一个名为“c”的字符串解密方法,如图8所示。该方法从内嵌的资源中读取加密的字符串数据,然后对其执行单个异或运算解密。用于解密的密钥是通过参数提供的,可以猜测每个字符串都有一个对应的解密密钥。

逆向工程演练:分析Arechclient2示例

图8:c函数

检查上述函数c后证明,解密依赖于函数调用流相关的变量。对解密程序的调用需要有几个被加密的参数,这些参数使用了几个隐晦的判断和全局变量,并且会根据调用流进行初始化和更改。

逆向工程演练:分析Arechclient2示例

图9:解密程序的调用代码

这意味着我们必须模拟或解决获取上述表达式中的局部变量和全局字段所需的所有计算,来对函数c所调用的参数进行解密。对函数调用流的额外依赖进一步增加了所需的工作量,因为我们需要以正确的顺序解决每个方法中的所有计算。考虑到这一切,编写静态字符串解密工具的思路是不现实的。
随后,通过对二进制的筛选,我发现它与Redline工具有很多相似之处,两者都使用数据契约(DataContract)和异步任务来实现独立的窃取模块。

逆向工程演练:分析Arechclient2示例

图10:样本的二进制文件

在寻找网络相关功能后,发现了一个位于0x0200010C的名为cj的类,它通过.NET的 TcpClient类连接到了服务器。查看代码,我们可以发现另一个名为xj的类,其中似乎包含TCP连接的IP和端口号。参见第155行代码tcpClient.Connect(xj.c,Convert.ToInt32(xj.a.d)。

逆向工程演练:分析Arechclient2示例

图11:引用xj类的代码

除此之外,xj类中还包含恶意软件访问和下载字符串的URL,参阅代码第168行。进一步查看位于0x02000107的xj类,它包含很多属性,但最有趣的是它的构造函数。

逆向工程演练:分析Arechclient2示例

图12:xj类的代码

这看起来像是一个潜在的配置类。它初始化了用于初始TCP连接和下载在cj类中看到的那些字符串的属性。这些是一个很好的指标,表明我们确实在查看恶意软件的配置。
接下来,在构造函数的末尾设置一个断点。由于字符串解密方法仍未完全解析,因此获取字符串的最简单方法就是运行二进制程序并让它为我们解密字符串。通过使用dnSpy工具调试可执行文件,直到遇到在构造函数末尾设置的断点。在断点命中后,我们可以通过展开参数的本地窗口来查看其中的所有属性和字段值,如图13所示。

逆向工程演练:分析Arechclient2示例

图13:参数的本地窗口

这里我们看到C2 IP77.73.133.83和端口15647。我们还可以看到一个Pastebin网站的链接,该链接包含另一个IP 34.107.35.186,可能是备用的C2。
在调试之前,对字符串解密方法进行修改,添加几行代码将每个解密的字符串写入磁盘。此修改使字符串不再立即返回,而是传入AppendAllText函数并写入我们选择的文件中。

逆向工程演练:分析Arechclient2示例

图14:修改的字符串解密方法

转储中的值一些与在本地窗口中找到的值相同,同时还包含了一些特别的字符串。例如,我们得到了偷窃者检查潜在凭据的路径列表。这个偷窃者的主要目标似乎是浏览器、邮件客户端和像Steam这样的游戏客户端。这与大多数主流偷窃者类似。
谈到字符串,我注意到了与Redline的另一个相似之处,即在运行时,字符串转换时使用字符数组。然而Redline在通常情况下会使用Replace或Remove方法向这些数组中插入一些从构造字符串中删除的额外垃圾数据。

逆向工程演练:分析Arechclient2示例

图15:字符串处理

由于深层次的混淆以及与现有偷窃者具有相当相似的行为,将不再进一步调查此有效载荷。至此,我们揭示了最重要的IOCs,并对偷窃者的目标有了很好的了解。

4. ArechClient恶意软件家族的识别


在分析转存的字符串后,可以发现,一些指标可能有助于将恶意软件总结为某个恶意软件家族。虽然这个样品看起来确实很像Redline工具,但实际上它不是那个恶意软件家族的成员。通过观察,发现这些二进制数据对象看起来像是C2通信:

逆向工程演练:分析Arechclient2示例

图16:转存的字符串

将上述数据和端口号与其他研究分析相互参考,揭示了不同恶意软件家族的相似性。下面的屏幕截图显示了由IronNet的研究人员执行ArechClient2样本的网络捕获。通过比较这些数据,我们可以得出结论,我们的样本也是ArechClient2家族的一部分。

逆向工程演练:分析Arechclient2示例

图17:执行ArechClient2样本的网络捕获

5. 总结


我们发现初始的加载程序是在AutoIt中实现的,并使用进程镂空加载基于.NET的有效载荷,我们重构了字符串解密方法,使我们能够部分的反混淆加载程序。我们使用调试器和ExtremeDumper工具转存了托管有效载荷。我们分析并调试了托管有效载荷,以显示有效载荷的配置信息,其中包含C2信息。

附录 攻击指标


种类
指标
C2
77.73.133.83:15647
Potential Fallback C2
34.107.35.186:15647
URL for fallback C2
https[:]//pastebin.com/raw/NdY0fAXm
.NET payload Test.exe
SHA1: 054742329f83a5d177dd1937992e6755f43c420e
AutoIt loader 45.exe
SHA1: 2a4062e10a5de813f5688221dbeb3f3ff33eb417
AutoIt script S.a3x
SHA1: 4397b1d855e799f4d38467a848cda2273c1c6c73


END

参考链接:https://www.sentinelone.com/blog/reverse-engineering-walkthrough-analyzing-a-sample-of-arechclient2/


编辑|胡睿东

审校|何双泽、王仁

本文为CNTIC编译整理,不代表本公众号观点,转载请保留出处与链接。联系信息进入公众号后点击“关于我们”可见。

逆向工程演练:分析Arechclient2示例


原文始发于微信公众号(国家网络威胁情报共享开放平台):逆向工程演练:分析Arechclient2示例

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年7月30日21:56:46
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   逆向工程演练:分析Arechclient2示例http://cn-sec.com/archives/1918819.html

发表评论

匿名网友 填写信息