“师傅”网银木马技术分析与防护方案

“师傅”网银木马在2015年4月被IBM反欺诈平台发现,它是基于Shiz源代码进行构建的,并且借鉴了包括Zeus、Gozi和Dridex等在内的多个著名木马的相关技术。该木马曾主要以日本境内14家银行为攻击目标,随后2015年9月22日开始,“师傅”木马开始在英国出现,并且至少攻击了十余家银行。2017年1月6日,researchcenter.paloaltonetworks.com网站刊文称,“师傅”木马的作者在2016年对其进行了改进,早期的“师傅”通过利用CVE-2015-0003来获得被入侵主机的系统权限,现在改为使用编号CVE-2016-0167的Windows提权漏洞来达到同样目的。

本报告所分析的样本是网银木马“师傅”的变种,通过利用其内置的系统漏洞利用模块来提升自身的权限,进而以系统级权限窃取用户登录网银业务的凭证来造成危害。

“师傅”时间线跟踪如下图所示:

CVE-2016-0167

Microsoft Windows是美国微软(Microsoft)公司发布的一系列操作系统。win32k.sys是Windows子系统的内核部分,是一个内核模式设备驱动程序,它包含有窗口管理器、后台控制窗口和屏幕输出管理等。

Microsoft Windows的内核模式驱动程序中存在特权提升漏洞,该漏洞源于程序没有正确处理内存中的对象。攻击者可利用该漏洞提升本地权限并运行任意代码。

受影响的系统版本如下:

  • Microsoft Windows Vista SP2
  • Windows Server 2008 SP2和R2 SP1
  • Windows 7 SP1
  • Windows 8.1
  • Windows Server 2012 Gold和R2
  • Windows RT 8.1
  • Windows 10 Gold和1511

传播与感染

  • 文件绑定
  • 邮件附件

样本分析

  • 分析环境
系统 Windows 7, 32bit
使用工具 ProcessMonitor,Xuetr,Wireshark, OllyDbg, IDA
  • TAC检测结果

其他同源样本如下表:

MD5 文件大小 威胁等级
f25528baf3d68444fa7d7fda382e9835 338948 中威胁
ebf3e72f8b698bbb0d026416d7a75a6a 338948 中威胁
e98459c647a6e328c8b65945884ef29a 338948 中威胁
  • 文件结构

  • 主要功能

[1]隐蔽攻击:通过多次解密和进程注入完成攻击。

[2]网络行为:样本收集本机信息(包括但不限于本地时区、当前时间、操作系统版本、杀毒软件版本、主机名)上传至远程服务器,并持续与远程服务器通信,保持对用户的控制和对用户信息的窃取。

[3]沙箱检测:样本有反调试与反虚拟机功能,可通过对比文件名、进程名、用户名以及系统特征等方式判断自身是否可能存在于沙箱中。

[4]杀软对抗:样本可以对多款分析工具/杀毒软件/沙箱进行检测。检测到杀软后样本会处于sleep死循环中,表现为无恶意行为;检测到沙箱后,通过结束脚本解释器、流量抓取工具、二进制分析工具等进程,从而切断沙箱与外部的交互或阻止沙箱对其的自动化分析。

[5]持续攻击:样本通过自身的隐藏与自启动,实现对目标主机的持续攻击,主要包括:通过注入svchost.exe等进程进行进程隐藏;通过在开始菜单启动文件夹下创建js脚本完成自启动。

该样本执行流程概要图如下所示:

该样本的各个功能简单介绍如下:

  • 解密injector,覆盖原有代码

解密PE文件代码如下:

解密算法代码如下:

002C0564    3B75 64         cmp esi,dword ptr ss:[ebp+0x64]
002C0567    75 0D           jnz short 002C0576
002C0569    0375 68         add esi,dword ptr ss:[ebp+0x68]
002C056C    037D 68         add edi,dword ptr ss:[ebp+0x68]
002C056F    2B4D 68         sub ecx,dword ptr ss:[ebp+0x68]
002C0572    85C9            test ecx,ecx
002C0574    74 12           je short 002C0588
002C0576    AD              lods dword ptr ds:[esi]
002C0577    50              push eax
002C0578    2D BB462156     sub eax,0x562146BB
002C057D    90              nop
002C057E    90              nop
002C057F    33C2            xor eax,edx
002C0581    5A              pop edx
002C0582    AB              stos dword ptr es:[edi]
002C0583    83E9 03         sub ecx,0x3
002C0586  ^ E2 DC           loopd short 002C0564

修改0x400000处的内存属性为可写:

替换0x400000处的内容(覆盖原样本的地址空间,使其本质上被替换为注入模块):

修改IAT中函数地址:

  • 反虚拟机、反调试与沙箱检测
  • 反虚拟机

判断Commandline中的参数:

接着在进程列表中查找进程,将获得到的进程名使用CRC32加密,调用函数RtlComputeCrc32:

判断其是否是特定进程,比如vmtoolsd.exe进程,与硬编码比较,这些硬编码为特定的进程名使用CRC32加密后得到的。

在系统查找如下校验值:

进程名编码列表列举如下:

0x278CDF58 – vmtoolsd.exe
0x99DD4432 – ?
0x1F413C1F – vmwaretray.exe
0x6D3323D9 – vmusrvc.exe
0x3BFFF885 – vmsrvc.exe
0x64340DCE – ?
0x63C54474 – vboxtray.exe
0x2B05B17D – ?
0xF725433E – ?
0x77AE10F7 – ?
0xCE7D304E – dumpcap.exe
0xAF2015F2 – ollydbg.exe
0x31FD677C – importrec.exe
0x6E9AD238 – petools.exe
0xE90ACC42 – idag.exe
0x4231F0AD – sysanalyzer.exe
0xD20981E0 – sniff_hit.exe
0xCCEA165E – scktool.exe
0xFCA978AC – proc_analyzer.exe
0x46FA37FB – hookexplorer.exe
0xEEBF618A – multi_pot.exe
0x06AAAE60 – idaq.exe
0x5BA9B1FE – procmon.exe
0x3CE2BEF3 – regmon.exe
0xA945E459 – procexp.exe
0x877A154B – peid.exe
0x33495995 – autoruns.exe
0x68684B33 – autorunsc.exe
0xB4364A7A – ?
0x9305F80D – imul.exe
0xC4AAED42 – emul.exe
0x14078D5B – apispy.exe
0x7E3DF4F6 – ?
0xD3B48D5B – hookanaapp.exe
0x332FD095 – fortitracer.exe
0x2D6A6921 – ?
0x2AAA273B – joeboxserver.exe
0x777BE06C – joeboxcontrol.exe
0x954B35E8 – ?
0x870E13A2 – ?

获取路径c:\sample\pos.exe:

调用PathFileExistsA检查该文件是否存在:

如果不存在:则获取kernel32.dll:

获取Process32NextW函数名称:

接着获取函数地址:

检查该函数地址前4字节的内容是否是0x8C2C033:

  • 反调试

调用kernel32.IsDebuggerPresent:

查询DebugPort,ExceptionPort是否被占用,以确定是否处于远程调试状态:

获取\.\NPF_NdisWanIp,查找是否存在wireshark:

  • 沙箱检测
  • 文件名长度校验(若大于30位则认为是沙箱运行):

  • 与特定值比较:

共需比较以下值(常见沙箱对样本的重命名):

0xE84126B8 – sample.exe
0x0A84E285 – ?
0x3C164BED – ?
0xC19DADCE – ?
0xA07ACEDD – ?
0xD254F323 – ?
0xF3C4E556 – ?
0xF8782263 – ?
0xCA96016D – ?

接着查找特定文件和目录,下图为查找c:\analysis\sandboxstarter.exe:

查找c:\analysis目录:

查找c:\insidetm:

查找c:\windows\system32\drivers\vmmouse.sys:

查找c:\windows\system32\drivers\vmhgfs.sys:

查找c:\windows\system32\drivers\vboxmouse.sys:

查找c:\iDEFENSE:

查找c:\popupkiller.exe:

查找c:\tools\execute.exe:

查找c:\Perl:

查找c:\Python27:

  • 比较计算机名、用户名。获得计算机名:

获得用户名:

与以下字符串比较(常见的沙箱用户名):

SANDBOX
FORTINET
VIRUS
MALWARE
MALNETVM

若有任何一个字符串出现,则程序进入sleep死循环:

查找下述进程:

0xD2EFC6C4 – python.exe
0xE185BD8C – pythonw.exe
0xDE1BACD2 – perl.exe
0xF2EAA55E – autoit3.exe
0xB8BED542 – ?

进程名使用CRC32加密,具体数值如下图所示:

若以上进程正在运行,则直接终止这些进程(切断沙箱的内部控制)。此外如果样本运行于Windows XP(32bit)环境下,也将进入sleep循环。

  • 判断当前权限高低

如果当前进程权限不足并且系统版本为windows7或Server2008,则进入漏洞利用代码,否则将继续原程序处理流程。

  • 高权限下的行为

获取环境变量并扩展:

这里得到的是Windows_NT_1,在Win7 x86环境下:

接着计算0xFFFFFFFF,0xEEEEEEEE,0xAAAAAAAA,0x77777777的CRC32的值:

CRC32计算结果如下:

0x395693AE
0xB24495D2
0xF39F86E1
0xBAE0B5C8

取计算结果的最后两位数存放在栈中,如下图所示:

取其中0xAE000000和0xD2000000作为Atom的名称:

添加名为ae000000d2000000的GlobalAtom:

根据当前时间创建文件夹:

打开自身:

创建文件C:\ProgramData\3e7205a8.exe:

接着读取自身的.rsrc段和.tls段中的内容,初始化一个256字节的数组,初始化的形式:v17[]={0,1,2,3,….,255},接着从头读取.rsrc段中的内容,与数组中的每一位进行xor操作,得到结果存放进数组中。

接着对.tls段中的内容进行解密:

可以大致看到是一个PE文件。该PE文件由aPlib压缩库压缩的。

接着将内容加密:

加密后写入注册表中:

写入内容:

对压缩的文件进行解压:

修改文件头中的标志位:

查找文件:

创建进程:

将0xFFFFFFFF写入内存:

将文件写入svchost的内存:

接着创建远程线程:

下图所示进程为传入文件路径时创建的进程,获取tmp文件路径以拷贝自身至该目录下:

得到文件路径:C:\Users\hello\pudF5F0.tmp:

创建文件:

写入文件:

执行文件:

最后,程序退出。

  • 低权限下的行为,如果权限不足,则进入exploit函数中进行提权,如下图所示:

首先申请一段内存用于临时存放exploit程序:

拷贝一个PE文件到内存中:

在PE文件中查找0x99999999:

可以看到0x99999999后跟着的是函数内容,0x99999999是一个标识,标志着函数的开始。

执行后首先加载一部分进行漏洞利用需要用到的函数:

创建线程后判断系统版本:

释放漏洞利用文件:

创建名为WaitEventX的事件:

进入漏洞利用部分:

之后查找以下进程:

如存在上述进程,则创建一个挂起的wuauclt.exe,否则就创建一个svchost.exe并且传入参数-k netsvcs。在创建进程的时候可以看到,0x3F4180处的值被校验,若存在杀毒软件则置为1,不存在为0:

进程:C:\Windows\system32\svchost.exe,参数为-k netsvcs

查看目录是否存在,不存在就创建:

创建全局互斥体Global\{DAN6J0-ae000000d2000000e100}

查询注册表项:

  • 子进程运行

Hook函数:

接着创建线程。

线程1:注册回调函数监控注册表项更改,更新以下浏览器的版本:

线程2:执行网络通信相关行为。

设置注册表键值HKCU\software\Microsoft\windows

创建js文件并拷贝至启动文件夹,设置开机启动项:

js中设置开机启动项的代码如下所示:

var mxakulvhjn = new ActiveXObject("WScript.Shell");
 mxakulvhjn.Run("C:\\PROGRA~2\\442843c9.exe");

访问windowsupdate.com测试网络连通性:

向使用NMC技术的DNS服务器发起DNS请求,查询主控服务器的地址用以进行C&C通信:

获取操作系统信息,并将其填写为get参数的形式,准备发送至C&C服务器:’

注册包中的部分参数解析如下表所示:

Botid 随机生成的作为用户标识的ID
Ver 为样本的版本号(该样本为1.759)
Up 上传时的本地时间戳
Os 操作系统版本
Ltime 用户所在的时区(+8)
Av 用户所使用的杀毒软件

将get参数加密后发送至C&C服务器:

  • 网络行为

样本通过三个DNS服务器92.222.80.28、78.138.97.93和77.66.108.93查询C&C服务器的地址:

该C&C服务器使用了.bit(采用了NMC技术的)域名,存在着低成本且难以审查与控制的特性。

Namecoin是去中心化的域名系统,它提供与传统DNS服务商类似的功能,它对应.bit域名,与传统DNS服务商不同的是Namecoin通过点对点网络来共享DNS查询表,只要网络中有Namecoin服务器软件在运行,域名就能被访问,可以阻止网络审查。

  • 启动方式

该样本通过设置开始菜单启动项,在开始菜单中创建Common.js脚本,完成主机重启后的自启动,以达到持续攻击的目的。

攻击定位

样本查询其真实C&C服务器所需的三个DNS服务器(IP地址分别是92.222.80.28、78.138.97.93和77.66.108.93)所在地区分别如图1、图2和图3所示:

图1 DNS服务器所在地区(1)

图2 DNS服务器所在地区(2)

图3 DNS服务器所在地区(3)

防护方案

1.绿盟科技检测服务

  • 绿盟科技工程师前往客户现场检测。
  • 绿盟科技在线云检测,登陆绿盟云,申请威胁分析中心试用。链接地址如下:

https://cloud.nsfocus.com/#/krosa/views/initcdr/productandservice?service_id=1018

2.绿盟科技木马专杀解决方案

  • 短期服务:绿盟科技工程师现场木马后门清理服务(人工服务+IPS+TAC+终端防护(金山V8+))。确保第一时间消除网络内相关风险点,控制事件影响范围,提供事件分析报告。
  • 中期服务:提供3-6个月的风险监控与巡检服务(IPS+TAC+人工服务)。根除风险,确保事件不复发。
  • 长期服务:基于行业业务风险解决方案(威胁情报+攻击溯源+专业安全服务)

总结

该样本通过利用内置的本地系统漏洞利用模块进行提权,从而以系统级权限窃取用户登录网银业务的凭证来造成危害。

由于该其具备种类繁多的反调试/分析/检测手段,所以一般的杀毒软件会认为它是安全的程序而放行;而一般的沙箱检测对其是无能为力的。这对于用户群体来说是极其危险的。

在网络通信方面由于其使用了.bit域名,使得攻击更具有隐蔽性和匿名性,使攻击者难以被追踪。

附录

将样本原文件中的加密数据以0x8D为密钥解密得到以下内容:

AddMandatoryAce
ADVAPI
Advapi32.dll
advapi32.dll
ws2_32.dll
WPUCloseEventW
PUCloseSocketHandle
WPUCreateEvent
WPUCreateSocketHandle
WPUFDIsSet
WPUGetProviderPath
WPUModifyIFSHandle
WPUPostMessage
WPUQueryBlockingCallback
WPUQuerySocketHandleContext
WPUQueueApc
WPUResetEvent
WPUSetEvent
WPUOpenCurrentThread
WPUCloseThread
WSPStartup
> %1\r\ndel %0
software\\microsoft\\windows\\currentversion\\run
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/echo
rundll32.exe shell32.dll, ShellExec_RunDLL %s
Microsoft\\Microsoft AntimalwareSoftware\\Coranti
Software\\risingSoftware\\TrendMicroSoftware\\Symantec
Software\\ComodoGroup
Software\\Network Associates\\TVD
Software\\Data Fellows\\F-SecureSoftware\\Eset\\Nod
Software\\Softed\\ViGUARD
Software\\Zone Labs\\ZoneAlarm
Software\\Avg
Software\\VBA32
Software\\Doctor Web
Software\\G Data
Software\\Avira
Software\\AVAST
Software\\Avast
Software\\KasperskyLab\\protectedSoftware\\BitdefenderSoftware\\Panda
SoftwareSoftware\\Sophos.bat\\\\.\\%C:
|$$$}rstuvwxyz{$$$$$$$>?@ABCDEFGHIJKLMNOPQRSTUVW$$$$$$XYZ[\\]^_`abcdefghijklmnopq
conhost
CreateProcessInternalW
ConvertStringSecurityDescriptorToSecurityDescriptorW
Content-Type: multipart/form-data; boundary=---------------------------%s\r\n
Content-Type: application/x-www-form-urlencoded\r\n
Host: %s\r\n%d.%d.%d.%d
%d.%d.%d.%d.%x
%temp%\\debug_file.txt
[%u][%s:%s:%u][0x%x;0x%x]%sDnsFlushResolverCache
\\*.*
dnsapi.dll
DnsGetCacheDataTable.dll.exe
download.windowsupdate.com
vk.com
yandex.ru
HTTP/1.1
https://http://%s
IsWow64Process
kernel
kernel32.dll
LdrGetProcedureAddress
Microsoft
NtAllocateVirtualMemory
CLOSED
LAST_ACKTIME_WAIT
DELETE_TCB
LISTEN
SYN_SENTSYN_RCVDESTAB
FIN_WAIT1
FIN_WAIT2
CLOSE_WAIT
CLOSING
TCP\t%s:%d\t%s:%d\t%s\n
netstat\nProto\tLocal address\tRemote address\tState\n
ntdll.dll
NtResumeProcess
NtSuspendProcess
\\\\?\\globalroot\\systemroot\\system32\\drivers\\null.sys
NtWriteVirtualMemory
openRegisterApplicationRestart
RtlCreateUserThread
ResetSR
RtlComputeCrc32
rundll32
SeDebugPrivilege
SystemDrive\\StringFileInfo\\%04x%04x\\ProductName
software\\microsoft\\windows nt\\currentversion\\winlogon
shell
Sleep
srclient.dll
SeShutdownPrivilege
\"%s\"
%d\t%s\ntaskmgr\nPID\tProcess name\nnet user\n
the computer is joined to a domain\n..
\\VarFileInfo\\Translation
GET%windir%\\system32\\%windir%\\syswow64\\POST*.exe
Low
%SystemDrive%
\\*SYSTEM*%02x%s:Zone.
Identifier
GetProcessUserModeExceptionPolicy
etProcessUserModeExceptionPolicy
%ws\\%ws\n%x
WORKGROUP
HOME
Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\ExplorerDisableCurrentUser
Run%s.datsoftware\\microsoft\\windows
%OS%_%NUMBER_OF_PROCESSORS%S
S:(ML;;NRNWNX;;;LW)D:(A;;GA;;;WD)
S:(ML;;NRNWNX;;;LW)D:(A;;GA;;;WD)(A;;GA;;;AC)
\\\\.\\AVGIDSShim
FFD3\\\\.\\NPF_NdisWanIpc:\\sample\\pos.exe
ANALYSERS
SANDBOX
VIRUS
MALWARE
FORTINET
MALNETVM
c:\\analysis\\sandboxstarter.exe
c:\\analysis
c:\\insidetm
c:\\windows\\system32\\drivers\\vmmouse.sys
c:\\windows\\system32\\drivers\\vmhgfs.sys
c:\\windows\\system32\\drivers\\vboxmouse.sys
c:\\iDEFENSE
c:\\popupkiller.exe
c:\\tools\\execute.exe
c:\\Perl
c:\\Python27
api_log.dll
dir_watch.dll
pstorec.dll
dbghelp.dll
Process32NextW
Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Zones\\31406.bit
MiniDumpWriteDump\r\nReferer: %s\r\n
\\Google\\Chrome\\User Data\\Default\\Cachevar 
%s = new ActiveXObject("WScript.Shell"); %s.Run("%s");
IntelPowerAgent32
%OS%_%NUMBER_OF_PROCESSORS%
%s\cmd.exe
ComSpecConsoleWindowClass.exe
kernel32.dll
ntdll.dll
ZwQuerySystemInformation
ZwAllocateVirtualMemory
PsLookupProcessByProcessId
PsReferencePrimaryTokenClassWindow
open "%s" -q%windir%\\system32\\sdbinst.exe
/c "start "" "%s" -d"
%windir%\\system32\\sndvol.exe
"%s" -u /c "%s\\SysWOW64\\SysSndVol.exe /c "start "" "%s" -d"
"%temp%\\%u
%u.tmp
Wow64DisableWow64FsRedirection
Wow64RevertWow64FsRedirection
runas.exe
%systemroot%\\system32\\svchost.exe
%systemroot%\\system32\\wscript.exe
snxhk.dll
sbiedll.dll
/c start "" "%s" " "
cmd.exe
runas 
--crypt-test:3
It work's!
--vm-test

关于绿盟科技

北京神州绿盟信息安全科技股份有限公司(简称绿盟科技)成立于2000年4月,总部位于北京。在国内外设有30多个分支机构,为政府、运营商、金融、能源、互联网以及教育、医疗等行业用户,提供具有核心竞争力的安全产品及解决方案,帮助客户实现业务的安全顺畅运行。

基于多年的安全攻防研究,绿盟科技在网络及终端安全、互联网基础安全、合规及安全管理等领域,为客户提供入侵检测/防护、抗拒绝服务攻击、远程安全评估以及Web安全防护等产品以及专业安全服务。

北京神州绿盟信息安全科技股份有限公司于2014年1月29日起在深圳证券交易所创业板上市交易,股票简称:绿盟科技,股票代码:300369。

如果您需要了解更多内容,可以
加入QQ群:570982169
直接询问:010-68438880

Spread the word. Share this post!

Meet The Author

Leave Comment