Menorah Analysis report
Menorah Analysis report
Preface
Recently, I am learning APT attack analysis because of my internship.
The APT Analysis report, which is my first foray into studying APT attacks and the C# language, is also an opportunity for me to learn English.
by the way, I feel that English is becoming more and more important for Learning about network security.
I can try to finish write the Analysis report in english ,Wish me luck
最近因为实习的原因,正在学习APT攻击分析。 这是第一篇APT分析报告,顺便学学C#,学学英语,感觉英语对于学习网络安全越来越重要了。我可以尝试用英文写完这个报告,祝我好运。
Malware information
目前已经知道的样本信息如下
- 文件大小:26.50KB
- 文件类型:PE32 executable (GUI) Intel 80386 Mono/.Net assembly, for MS Windows
- MD5: 868da692036e86a2dc87ca551ad61dd5
- SHA1: c9d18d01e1ec96be952a9d7bd78f6bbb4dd2aa2a
- SHA256:64156f9ca51951a9bf91b5b74073d31c16873ca60492c25895c1f0f074787345
Malware Analysis
查壳
![image-20240102171411278](picutre/Menorah Analysis report/image-20240102171411278.png)
发现是C#的文件,C#的语法和JAVA差不多,也算比较简单,这里就不讲C#的语法了
逆向分析
直接用dnSpy打开即可进行分析
将样本拖入DnSpy开始进行分析(Dnspy运行需要.Net Framework环境的支持,不能运行请下载并安装后再运行Dnspy),拖入后会显示下图所示一些信息包括文件名以及版本等静态信息。另外要注意的是exe文件拖入Dnspy后在侧边栏中名称为黄色,而dll文件拖入后在侧边栏中名称为白色。
![image-20240102171821399](picutre/Menorah Analysis report/image-20240102171821399.png)
之后右键Go To Entry Point即可跳转到main函数,一般来说程序具有窗口(无论隐藏与否)时,main函数都是用来调用Application.Run()进行窗口的启动(学过SDK/MFS的同学应该不陌生,这就相当于启动了窗口的消息循环):
![image-20240102172034953](picutre/Menorah Analysis report/image-20240102172034953.png)
这里提一句,在Dnspy中也可以进行交叉引用的分析,只要选中函数名或变量名,然后右键Analyze即可打开对应窗口进行查看,很方便:
![image-20240102172114344](picutre/Menorah Analysis report/image-20240102172114344.png)
代码分析
分析Main函数
![image-20240102172521705](picutre/Menorah Analysis report/image-20240102172521705.png)
首先代码对程序的命令行进行了限制,恶意软件必须使用等于当前目录的前两个字母的参数运行,否则就退出,这一步应该是为了确保是远程控制启动的吧
然后创建了一个名“115CF7F6-69B4-49EE-B453-BAF00531AC52”为的互斥体,确保一次只有一个恶意软件执行
然后就启动Form1函数
![image-20240102172957874](picutre/Menorah Analysis report/image-20240102172957874.png)
![image-20240102172942967](picutre/Menorah Analysis report/image-20240102172942967.png)
Form函数启动了InitializeComponent()函数
InitializeComponent()函数用于设置窗口的设置,类似与WIN32的注册窗口那部分
base.Opacity = 0.0;
:设置窗体的不透明度为0,这意味着窗体将完全透明,不可见。base.ShowIcon = false;
:设置窗体是否显示图标为假,通常用于隐藏窗体左上角的图标。base.ShowInTaskbar = false;
:设置窗体是否在任务栏中显示为假,通常用于隐藏窗体在任务栏中的图标。
base.Load += new EventHandler(this.Form1_Load);
:订阅窗体的 Load
事件,当窗体加载时将触发 Form1_Load
方法。
可以看到这些代码的主要目的是为了初始化一个特定样式的窗体,使其没有边框、完全透明、不显示在任务栏和不显示图标,就是为了隐藏程序。然后在加载时执行Form1_Load函数
![image-20240102173447795](picutre/Menorah Analysis report/image-20240102173447795.png)
改代码主要设置了对C2服务器
的通信方式和加密校验是什么,然后执行了I4NQA9F55K2()函数
,并且在每隔3200毫秒(32秒)执行 一次I4NQA9F55K3()函数
,该代码主要用于确保与C2服务器的持续通信
![image-20240102174116965](picutre/Menorah Analysis report/image-20240102174116965.png)
![image-20240102174130207](picutre/Menorah Analysis report/image-20240102174130207.png)
I4NQA9F55K2()函数
会调用 E1AMBJ40()函数
,传递的参数为计算机名称+用户名
E1AMBJ40()函数
会计算计算机名称+用户名的MD5值
![image-20240102174522059](picutre/Menorah Analysis report/image-20240102174522059.png)
![image-20240102175145422](picutre/Menorah Analysis report/image-20240102175145422.png)
![image-20240102174746209](picutre/Menorah Analysis report/image-20240102174746209.png)
这段代码的主要目的是生成一个包含各种字符和信息的字符串,字符串的格式为
"d@<MD5 hash>@HostName|Username"
,
然后调用O1K65YZ4()函数
,参数为"http://tecforsc-001-site1.gtempurl.com/ads.asp"
地址和上面生成的那个字符串。
然后将返回的结果中的双引号去掉和两端的空格。
创建一个新的线程,通过使用匿名委托方法,在线程中执行 ZZEK9ZBCESO2(ZZEK9ZBCESO1)
方法。
![image-20240102181827247](picutre/Menorah Analysis report/image-20240102181827247.png)
![image-20240102181759826](picutre/Menorah Analysis report/image-20240102181849118.png)
![image-20240102182233112](picutre/Menorah Analysis report/image-20240102182233112.png)
将前面生成的字符串转换为字节数组,然后调用UBB2S0CLZ4CT77函数进行加密操作(XOR加密),然后再进行base64加密
调用J9VPJSN2EN2函数
选择 3 到 14 之间的随机数,并根据硬编码的“密钥”生成一串字符,再经过一系列的转换和形成字符串"若干字符[@<value>@]若干字符"
然后将标识主机的编码字符串通过 POST 请求泄露到 C2 服务器。
使用 GetResponse、GetResponseStream 和 ReadToEnd 函数读取服务器响应:
![image-20240102182524969](picutre/Menorah Analysis report/image-20240102182524969.png)
恶意进程创建一个新线程来处理 C2 服务器响应
![image-20240102182659455](picutre/Menorah Analysis report/image-20240102182659455.png)
服务器响应具有以下结构[@<Value>@]
。提取的值进行 Base64 解码和使用 XOR 运算符进行解密(密钥为Q&4g)。解密后的字符串具有以下结构“Param1@Param2@Param3
”。Param2 是命令 ID,可以是 1 或 2,Param3 是要执行的命令,经过 Base64 编码。
命令分析
接下来就是在接受到返回数据的时候的命令的解析了收到的数据解密后的格式如下[@<Value>@]
命令的格式如下:Param1@Param2@Param3
- Param1可以为”NCNT”,或者非”NCNT”,表示是否执行命令
- Param2可以为”1”或者”2”
- Param3是要执行的命令
parm2 = 1 && param3 = “+sp”*
![image-20240103101622320](picutre/Menorah Analysis report/image-20240103101622320.png)
![image-20240103102417610](picutre/Menorah Analysis report/image-20240103102417610.png)
该段代码首先将第三个参数进行base64解密然后取+sp后面的数据进行将[S]替换为”C:\\windows\\system32\\“
然后通过PM函数执行一个外部命令(通过创建新的进程使用 CreatePipe 创建一个匿名管道,并且读取句柄可继承),使用 PeekNamedPipe 和 Read 方法读取进程的输出,并将该命令的输出捕获到一个字符串中,信息存储在 text3
变量中
parm2 = 1 && param3 = “+nu”
![image-20240103102454854](picutre/Menorah Analysis report/image-20240103102454854.png)
![image-20240103102504357](picutre/Menorah Analysis report/image-20240103102504357.png)
![image-20240103102515706](picutre/Menorah Analysis report/image-20240103102515706.png)
将”1.1.1”用”|”和C2服务器地址链接起来,信息存储在 text3
变量中
parm2 = 1 && param3 = “+fl”
![image-20240103102953414](picutre/Menorah Analysis report/image-20240103102953414.png)
这段代码处理一个命令,根据输入的目录路径,获取该目录下的文件和子目录信息,并将其格式化为文本字符串。这通常用于列出目录内容,类似于命令行中的 “dir” 命令或文件浏览器中的文件列表。最终,信息存储在 text3
变量中
parm2 = 1 && param3 = “+dn”
![image-20240103103452951](picutre/Menorah Analysis report/image-20240103103452951.png)
这段代码处理一个命令,根据输入的文件路径,执行文件操作(上传文件到服务器),并根据操作结果生成相应的消息,该消息存储在 text3
变量中。
![image-20240103103836081](picutre/Menorah Analysis report/image-20240103103836081.png)
这段代码用于构建并发送包含系统信息、用户信息、文件操作信息和文件内容的Base64编码字符串给服务器,以便服务器能够处理和记录这些信息。
parm2 = 2
![image-20240103103740993](picutre/Menorah Analysis report/image-20240103103740993.png)
![image-20240103103749587](picutre/Menorah Analysis report/image-20240103103749587.png)
这段代码用于接收并保存文件,然后通知服务器文件保存成功。它首先从Base64编码的文件内容中解码文件,确定文件的保存路径,保存文件,生成一个成功消息,然后将信息传递回服务器。
数据特征
"O [@NWZ3IhIWASZoHnIhFRMNIRMeAiVpEwBQF2MHIhNgcCYTY3QjFHV/Mx52GTISZwQxGWxIKzRIWxE+@]B j H Q"
?4=4
总结
写到这里差不多一个分析就写完了,这是我第一次接触C#,也是第一次逆向C#的东西,感觉这个APT分析还是蛮有意思的,C#的语言相比起WIN32和C语言其实逆向难度更小,因为基本上都是源代码回去的,还是很好理解
SHA256
64156f9ca51951a9bf91b5b74073d31c16873ca60492c25895c1f0f074787345
MUTEX
115CF7F6-69B4-49EE-B453-BAF00531AC52
C2 SERVER
http[:]//tecforsc-001-site1.gtempurl.com/ads.asp
参考资料
https://bbs.kanxue.com/thread-270368-1.htm
https://securityscorecard.com/research/menorah-malware-apt34/