导语:研究人员发现了一款Ursnif/Gozi-ISFB样本,该样本在注入子进程时会进行TLS回调操作。如果分析师和检测工具在分析开始时就没有考虑这一点,并没有在AddressOfEntryPoint处插入断点,那么大概率会错过恶意代码的真实入口。

简介

线程本地存储TLS(Thread Local Storage)回调是Windows操作系统提供的用来支持每个线程数据结构初始化和结束的函数。使用Thread Local Storage (TLS)回调函数可以实现在实际的入口点之前执行反调试的代码,这也是OD载入程序就退出的原因所在。

恶意TLS回调(反分析欺骗)考虑了包含有恶意TLS回调的PE文件在PE头中的AddressOfEntryPoint域之前执行。

如果不了解的分析师和自动化安全工具在分析开始时就没有考虑这一点,并没有在AddressOfEntryPoint处插入断点,那么大概率会错过恶意代码的真实入口。

研究人员发现了一款Ursnif/Gozi-ISFB样本,该样本在注入子进程时会进行TLS回调操作。恶意软件使用GetThreadContext/SetThreadContext或CreateRemoteThread Windows API函数的变种来改变注入时的远程进行的入口是很常见的,但是该样本使用了一种不知名的静默技术。如果事先没有考虑这项技术,这样一点点细微的变化可能会导致一些脱壳工具破坏之后的执行流

恶意软件分发

2017年初,研究人员就发现有被黑的sharepoint帐号被滥用存储恶意payload,并通过垃圾邮件来分发URI。监测到的主要攻击活动有Dridex(英国)和Ursnif/Gozi-ISFB(澳大利亚),Ursnif变种就是通过垃圾邮件传播的。垃圾邮件如图1:

Fig1.png

图1 分发Ursnif的垃圾邮件诱饵

如果用户点击了垃圾邮件中的“REVIEW DOCUMENT”按钮,恶意软件就会从链接(https://eacg1-my.sharepoint.com/personal/steve_robson_eaconsultinggroup_com/_layouts/15/download.aspx?docid=<redacted>&authkey=<redacted>)下载一个名为YourMYOBSupply_Order.zip的zip文件。该zip文件含有恶意的JS文件,js文件一旦执行,就会下载并执行Ursnif/Gozi-ISFB payload。

而这种分发传播活动很难被检测到,因为payload的C&C服务器通过HTTPS进行通信,被黑的sharepoint帐号也用的是HTTPS进行通信 。

变种分析

执行时,样本(MD5: 13794d1d8e87c69119237256ef068043)会在挂起模式下用CreateProcessW API函数创建一个名为svchost.exe 的子进程。然后,恶意软件会创建一个section对象,并与ZwMapViewOfSection建立映射。使用memset函数来对映射section进行0填充,然后使用memcpy函数把解压的dll拷贝到该区域。然后该恶意软件会运行ntdll.dll模块来解析3个低级的API函数。

注:memcpy是c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。

之后,恶意软件会在内存的新映射区域中创建入口shellcode。在操作和找出子进程的映射section时,会调用ZwReadVirtualMemory来读取进程的PEB结构。恶意软件可以子进程的PE头的保护权限来开启写权限。然后调用ZwWriteVirtualMemory在目标子进程的svchost.exe进程开始的0X40偏移量处写一个18字节的缓存。该恶意软件就这样机智地把该区域的变为“只读”来避免引起怀疑。

然后重复改变svchost.exe PE镜像保护的过程,从进程执行开始的0x198字节偏移量处写入8字节。

隐身方法

当缓存放置在偏移量合适的位置时,该缓存就会代表进程TLS目录的偏移,因为0x198是PE可执行文件中的TLS目录的位置,而且下一个DWORD 代表的是目录的大小,如图2所示。

Fig2.png

图2 TLS目录位置和大小

当用来解析0x18字节的缓存时,TLS目录结构指向包含代表AddressOfCallBacks指针的偏移量,如图3所示。

Fig3.png

图3 带指针的 TLS目录结构

如果观察一下0xe058偏移,它指向的是AddressOfCallBacks列表,如图4。而内存中的0xe058偏移,只指向了0xe068处的回调地址,这也是真正的入口点,如图5。

Fig4.png

图4 偏移量 0xe058

Fig5.png

图5 内存偏移量0xe068

最后,恶意软件用ZwUnmapViewOfSection释放映射,并调用ResumeThread来在注入的进程中开始恶意活动(恶意活动的开始是从注入的TLS回调地址而不是PE头中的AddressOfEntryPoint )。因此,执行首先会从注入的TLS回调开始,如图6。

Fig6.png

图6 实际入口

影响

从泄露的Ursnif/Gozi-ISFB源码来看,Ursnif/Gozi-ISFB使用了标准的DllMain调用入口点来初始化注入的DLL镜像并在该入口处执行。

Fig7.png

图7 Ursnif源码中的DllMain调用

这种新变种说明开发者对恶意软件进行了修改来躲过签名,还使用了隐身技术。普通的调试环境和检测框架很难发现这种隐藏的TLS回调入口点,恶意软件可以利用这一点进行恶意活动。

IoC

文件名 :YourMYOBSupply_Order.zip
MD5 : f6ee68d03f3958785fce45a1b4f590b4
SHA256 : 772bc1ae314dcea525789bc7dc5b41f2d4358b755ec221d783ca79b5555f22ce

文件名 : YourMYOBSupply_Order.js
MD5 : c9f18579a269b8c28684b827079be52b
SHA256 : 9f7413a57595ffe33ca320df26231d30a521596ef47fb3e3ed54af1a95609132

文件名 : download1.aspx
MD5 : 13794d1d8e87c69119237256ef068043
SHA256 : e498b56833da8c0170ffba4b8bcd04f85b99f9c892e20712d6c8e3ff711fa66c

源链接

Hacking more

...