Emotet是一款非常复杂的木马,主要用作其他恶意软件的加载器。Emotet的一个关键功能就是能够传播适应特定任务的定制模块或插件,包括窃取outlook通讯录、通过LAN传播等。近期,Binary Defense研究人员发现一类新的加载器类型,该加载器利用wlanAPI接口来模拟该区域的WiFi网络,然后尝试在这些网络上传播,感染过程中可以访问的所有设备,如图1所示。
图 1 Wi-Fi 传播器概览
Emotet协议
在进行进一步分析之前,首先来看下Emotet的协议。Emotet协议是基于Google Protobufs的来序列化发送和接收来自服务器的数据。Protobufs文档显示数据是通过proto文件中协议缓存消息类型来识别的。而Emotet使用了多个消息类型,本文只分析其中一个——Deliverable,当服务器发送一个要加载或执行的数据的响应时会使用该消息类型。消息如下所示:
message Deliverable { required int32 ID = 1; required int32 executeFlag = 2; required bytes blob = 3; }
在上面的protobuf消息中,ID是模块ID,blob是二进制数据,executeFlag决定了二进制文件如何加载。executeFlag域的内容如下所示:
· 1: 预留给payload和单独的可执行文件,比如Trickbot。释放在C:\ProgramData中并执行。
· 2: 与Type 1类似,但是会复制用户token。
· 3: 加载二进制文件到内存中,主要被模块使用,可以轻易被加载到内存中。
二进制文件分析
WiFi传播器的初始二进制文件到达系统时的module ID为5079,executeFlag是1,就表明它会在执行前释放到C:\ProgramData中,就像加载器更新或其他恶意软件一样。初始的二进制文件是一个含有2个二进制文件的自提取RAR文件,这两个二进制文件用来进行WiFi传播。
图 2 RAR提取
自提取的RAR文件含有2个二进制文件:service.exe和worm.exe。Worm.exe被配置为自提取RAR文件的设置文件,如图2所示,也就是说RAR文件自解压后 worm.exe就会自动执行。
Worm.exe
Worm.exe是用来传播的主可执行文件,时间戳为04/16/2018,首次提交到VirusTotal的时间为05/04/2018。含有时间戳的可执行文件中含有一个硬编码的IP地址,是Emotet的C2服务器。这表明WiFi传播行为在过去2年时间里几乎没有被发现。其中一个原因可能是二进制文件释放的频率。根据记录,2020年1月23日是Binary Defense首次发现Emotet传播该文件,但相关数据可以追溯到2019年8月底。
Worm.exe
Worm.exe开始执行后,第一个动作就是复制service.exe字符串到一个文件传播过程中会使用的变量中。然后,进入主循环,开始使用wlanAPI.dll调用来进行无线网络画像以在可以访问的网络中进行传播,如图3所示。
图 3 Worm.exe启动
使用wlanAPI.dll调用来进行无线网络画像过程中使用native wifi库来管理无线网络画像和连接。副作用是如果在虚拟机或自动化沙箱中运行恶意软件,而且没有WiFi卡的话,可能不会看到worm.exe的传播行为。这可以通过在Windows 10系统中启用WLAN auto config访问来进行部分绕过,但这只允许打开一个到接口的handle。随后的调用会使程序奔溃,因此这种绕过方式是不推荐的。
蠕虫信息收集
如图3所示,一旦获得了handle,就会调用WlanEnumInterfaces。该函数会枚举本地计算机中启用的所有WiFi设备,返回的是一系列结构。该结构中含有与WiFi设备相关的所有信息,包括设备的GUID和描述。
使用第一个可用的WiFi设备,WlanGetAvailableNetworkList会被调用来获取所有可用网络的列表。其中dwFlag参数被设置为 WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_ADHOC_PROFILES,而这在Windows XP(sp3)和Windows XP(sp2)的Windows LAN API中是无效参数,也就是说恶意软件并不适用于Windows XP设备上运行。
然后,恶意软件会开始对网络画像,保存以下信息到缓存中:
SSID: %s SIGNAL: %d SECURITY: [WPA|WPA2|UNKNOWN|WEP|OPEN] encryption: [UNKNOWN|WEP104|CCMP|TKIP|WEP40|NONE] Note: [Current Connecting| OR WLAN_AVAILABLE_NETWORK_HAS_PROFILE| OR WLAN_AVAILABLE_NETWORK_CONSOLE_USER_PROFILE]
这些信息是收集了网络列表中所有可用的网络。然后,会用大量的switch来处理使用WlanRegisterNotification传递给WiFi设备的handle连接通知。最后,获取网络认证方法和进行加密处理。网络认证方式包括:
· WPA2PSK
· WPAPSK
· UNKNOWN
· WEP
· OPEN
加密方法包括:
· TKIP
· NOEN (None misspelled)
· WEP
· AES
图 4 生成网络画像的蠕虫
暴力破解蠕虫连接
如图4所示,获取了每个网络的信息后,恶意软件就会连接、进行暴力破解。第一步是将两个重要的flag标0,然后使用获取的数据来填充下面的模板来创建网络画像。
< WLANProfile xmlns=”http://www.microsoft.com/networking/WLAN/profile/v1″ > < name >%s< /name > < SSIDConfig > < SSID > < name >%s< /name > < /SSID > < /SSIDConfig > < connectionType >ESS< /connectionType < connectionMode >auto< /connectionMode > < MSM > < security > < authEncryption > < authentication >%s< /authentication > < encryption >%s< /encryption > < useOneX >false< /useOneX > < /authEncryption > < sharedKey > < keyType >passPhrase< /keyType > < protected >false< /protected > < keyMaterial >%s< /keyMaterial > < /sharedKey > < /security > < /MSM >< /WLANProfile >
如果连接会导致“wlan_notification_acm_network_available”,那么NetworkAvailableFlag就会被设置为1。
如果连接会导致“wlan_notification_msm_connected”,那么NetworkAvailableFlag 和NetworkConnectedFlag就会被设置为1。
如果连接不饿成功,那么NetworkAvailableFlag 和NetworkConnectedFlag就会被设置为0,函数会在进入口令列表的下一个口令后循环。
如果连接成功了,恶意软件会在发送HTTP POST请求到位于87.106.37[.]146(端口8080)的C2服务器之前休眠14秒。请求的资源是静态的,硬编码值为:
87.106.37[.]146:8080/230238982BSBYKDDH938473938HDUI33/index.php
POST中的数据是:
c=< WirelessNetworkConnected >:< Password >
一旦与WiFi网络建立连接,worm.exe就会开始枚举用户并尝试暴力破解网络上所有用户的口令。
图 5 枚举所有非隐藏的共享
蠕虫用户暴力破解
当受感染的用户连接到新的网络时,恶意软件会开始枚举网络上所有非隐藏的共享,如图5所示。一旦发现共享,恶意软件就会尝试连接到网络资源的IPC$共享,尝试枚举所有连接到该网络资源的用户。使用恶意软件中包含的第二个口令列表,恶意软件会尝试暴力破解所有枚举的用户,将所有成功的尝试保存到2个缓存中:一个是用户名、一个是口令。
如果无法猜到任一用户的口令,就转向暴力破解网络资源的Administrator账号。
如果任意暴力破解成功了,就进入传播spreader函数。
Spreader
图 6 连接和生成“my.exe”
缓存中含有成功破解的用户名和口令或管理员账户口令,worm.exe就开始传播service.exe到其他系统中了。
恶意软件首先会尝试获取到互联网络资源的C$\\ share的访问权限。然后释放service.exe为C:\\中,保存为my.exe,如图6所示。此外,还会使用最近释放的my.exe添加含有以下信息的一个新服务。
Binary Path Name: C:\\my.exe Desired Access: SERVICE_ALL_ACCESS Display Name: WinDefService Service Name: Windows Defender System Service
然后启动该服务,在远程系统上执行service.exe(my.exe)。
Service.exe
Service.exe是worm.exe在远程系统上安装的受感染的payload。该二进制文件的PE时间戳为2020年1月23日,这也是Binary Defense首次发现的时间。该二进制文件以WinDefService服务的形式安装。
主线程
Service.exe开始时非常简单。有一个ServiceMain设置,会调用StartServiceCtrlDispatcher来连接服务进程的主线程到服务控制管理器,也就是说当服务执行时主线程也会执行。
在main线程中,service.exe会开始一个新的线程,该线程主要有2个作用:
· 服务安装后与新的C2进行通信;
· 释放和执行嵌入在service.exe中的Emotet二进制文件。
服务通信
service.exe的第一个动作就是打开到45.79.223[.]161:443的连接,并发送一个到/09FGR20HEU738LDF007E848F715BVE.php的请求。虽然到服务器的连接使用了443端口,443主要用于TLS加密通信,但连接是非加密的HTTP。连接打开后,service.exe会设置以下flag:
0x80000000 – INTERNET_FLAG_RELOAD 0x04000000 – INTERNET_FLAG_NO_CACHE_WRITE 0x00040000 – INTERNET_FLAG_NO_AUTH 0x00008000 – INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP 0x00004000 – INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS 0x00002000 – INTERNET_FLAG_IGNORE_CERT_DATE_INVALID 0x00001000 – INTERNET_FLAG_IGNORE_CERT_CN_INVALID 0x00000400 – INTERNET_FLAG_HYPERLINK 0x00000200 – INTERNET_FLAG_NO_UI 0x00000100 – CACHE_ENTRY_ACCTIME_FC
这些请求的资源都是硬编码和静态的。IP地址就是Emotet的C2服务器。请求中的数据包括:
“c=installed”
它会向服务器通知service.exe已经正确安装了。该请求和worm.exe发送的其他请求都没有通过TLS/SSL发送。
图 7. 用来创建新Emotet进程的flag
Emotet进程
service.exe安装成功后会与C2服务器进行通信,开始释放嵌入的Emotet可执行文件。首先,获取到%TEMP%的路径,然后在后面加上“setup.exe”。然后,进入一个通过指定硬编码缓存偏移量来定位嵌入的可执行文件的函数。定位了嵌入的可执行文件后,就会在%Temp%\\setup.exe创建一个新文件,将嵌入的可执行文件写入该文件中。然后调用CreateProcess来创建一个运行Emotet可执行文件的新进程,如图7所示。
总结
研究人员发现Emotet加入了一个新的加载器类型。Emotet使用该加载器类型可以在附近的无线网络中进行传播。研究人员建议用户使用强WiFi网络密码。
本文翻译自:https://www.binarydefense.com/emotet-evolves-with-new-wi-fi-spreader/如若转载,请注明原文地址