MuddyWater组织被认为是一个来自伊朗的APT组织,从2017年活跃至今。其攻击目标国家包括伊拉克、约旦、土耳其、黎巴嫩等中东地区国家,具有较明显的政治意图。目标行业包括政府机构、电信、能源及高科技行业。
一、背景
MuddyWater组织被认为是一个来自伊朗的APT组织,从2017年活跃至今。其攻击目标国家包括伊拉克、约旦、土耳其、黎巴嫩等中东地区国家,具有较明显的政治意图。目标行业包括政府机构、电信、能源及高科技行业。
其攻击方式包括水坑攻击、钓鱼文档、恶意手机APP等。最为常见的方式则是使用钓鱼文档,向目标发送带有诱导性文字、图片的文档,这些文件通常也带有真实公司或政府的标识,最终将PowerShell后门植入到目标机器上。
二、攻击方式梳理
本小节将对MuddyWater的攻击方法和过程进行梳理。
阶段一、载荷投递
向目标发送带有宏的word文档,通过诱导性的文字欺骗用户点击允许文档编辑,从而执行宏。
1、无保护措施的doc文档
宏负责解码使用base64编码的内容并执行
解码后的命令为使用powershell执行下载命令。
2、利用加密和混淆保护宏的doc文档
宏代码被混淆,该例中,对base64编码的功能代码解码后,释放3个文件并设置注册表启动项,等待用户重启后再执行后续功能。
3、利用加密保护宏并创建可执行文件钓鱼文档
使用密码保护宏代码,宏代码中放弃了长期使用的利用脚本下载可执行文件的方式,而是直接将可执行文件写入到磁盘上,但是此种方式会使得钓鱼文档异常巨大,此例中钓鱼文档为6.93MB。
阶段二、模块加载
VBA脚本
直接下载恶意文件
拼接PowerShell命令,利用VBA的shell函数执行。
解密数据,设置自启动项及文件释放
启动项内容:
JScript脚本
由VBA脚本释放JScript脚本,而将解密部分的功能移植到JScript脚本中,随后将数据拼接起来,组成powershell代码,并执行。
PowerShell脚本
加载阶段的powershell基本上分为两个类型,第一种为直接从cc文件服务器上下载文件,如图例:
第二种为解密powershell脚本并执行,如图例:
阶段三、后门分析
Powershell后门
由阶段二解密出Powershell脚本,这一阶段的Powershell脚本经多次解混淆可得最终内容。脚本被分成了三段分别进行混淆,第一段是配置信息,第二段和第三段是代码,这也是此次分析的Powershell中的一个特点。
配置信息主要包括C&C、本地目录、注册路径、密钥等信息。
其中,C&C网址数超过500个,皆为普通网站,请求文件皆为php文件,疑似是被攻击者上传了php后门,来接收Powershell后门的请求。
检查当前进程,发现有分析类工具则关机。检查的进程包括:
修改注册表,开启Office的“信任对VBA工程对象模型的访问”功能,启动所有宏,且
禁用 protected 视图。注册表路径:
HKCU:\Software\Microsoft\Office\版本号\word\Security\ AccessVBOM,值为1
HKCU:\Software\Microsoft\Office\版本号\word\Security\ VBAWarnings,值为1
HKCU:\Software\Microsoft\Office\版本号\
word\Security\ProtectedView\ DisableAttachementsInPV,值为1
HKCU:\Software\Microsoft\Office\版本号\
word\Security\ProtectedView\ DisableInternetFilesInPV,值为1
HKCU:\Software\Microsoft\Office\版本号\
word\Security\ProtectedView\ DisableInternetFilesInPV,值为1
脚本在500多个网址中随机挑选一个作为C&C进行连接。上线信息包括操作系统名称、操作系统位数、本机可用IP、名称、当前用户名和工作域等内容,经加密后上传。键值对:
键 | 值 |
SYSINFO | 上线信息 |
ACTION | “REGISTER” |
C&C返回的内容经解密后为文本内容,解析后得到一个键值对数组,每个键值对的值为Url。
随后脚本检查键值对。若STATUS键对应值为”OK”,则保存TOKEN键的值到配置变量sysid中,否则将重复之前的上线行为。第一次感染时,脚本将C:\ProgramData\ZIPSDK\目录下创建以名称和内容均为sysid的文件,之后每次请求远控指令都会返回该TOKEN。
每次请求指令均发送键值对:
键 | 值 |
ACTION | “COMMAND” |
TOKEN | sysid |
当返回内容STATUS键内容为”OK”时表示有内容。若ACTION键对应值为”REGISTER”,则像之前一样注册。否则读取CMD键对应的指令。
键 | 值含义 |
STATUS | “OK”代表由内容 |
ACTION | 主指令,”REGISTER”代表注册,和之前相同 |
CMD | 副指令 |
CMDID | 指令ID,在指令执行完后会发回给C&C |
指令种类如下:
指令 | 含义 |
“reboot” | 重启 |
“shutdown” | 关机 |
“clean” | 删除C、D、E和F盘下文件(需要用户确定)并关机 |
“screenshot” | 截屏并回传。 图片保存在C:\ProgramData\ZIPSDK\下,名称为sysid,后缀为png。 |
“upload” | 下载文件(与指令名含义相反),保存在C:\ProgramData\ZIPSDK\下 |
其他 | 视作powershell指令。 |
回传截屏图像时的键值对如下:
键 | 值含义 |
SYSID | sysid |
IMAGE | 截图base64编码值 |
ACTION | “IMAGE” |
请求下载文件时的键值对如下:
键 | 值含义 |
SYSID | sysid |
FILE | 空串 |
ACTION | “UPLOAD” |
下载文件时键值对如下
键 | 值含义 |
CONTENT | base64编码的文件 |
FILENAME | 文件名 |
指令执行后,还需要回传状态:
键 | 值含义 |
ACTION | “RESULT” |
OUTPUT | 若执行结果为”error”,则为”Operation is fail”,否则为”done” |
CMDID | C&C下发的CMDID |
TOKEN | sysid |
该脚本在后续的时间内不断进行更新,在我们再次捕获的样本中,远程控制命令部分增加了新的指令字:
指令 | 含义 |
“reboot” | 重启 |
“shutdown” | 关机 |
“clean” | 删除C、D、E和F盘下文件(需要用户确定)并关机 |
“screenshot” | 截屏并回传。 图片保存在C:\ProgramData\下,名称为sysid,后缀为png。 |
“upload”打头 | 下载文件(与指令名含义相反),保存在C:\ProgramData\下。 |
“excel”打头 | 去除指令中的”risk”字符串,将剩余部分保存为C:\ProgramData\a.ps1, 并使用excel相关COM组件加载该脚本并将其删除。 |
“outlook”打头 | 去除指令中的”risk”字符串,将剩余部分保存为C:\ProgramData\a.ps1, 并使用outlook相关COM组件加载该脚本并将其删除。 |
“risk”打头 | 去除指令中的”risk”字符串,将剩余部分保存为C:\ProgramData\a.ps1, 并使用ShellWindows相关COM加载该脚本并将其删除。 |
其他 | 视作powershell指令。 |
在另外一个版本的powershell脚本中则有不同的命令控制指令。
getCommand首先向C&C发起参数为”a=b&b=id值”的Get请求,解码后内容如下:
内容 | 含义 |
“register” | 该结果未使用 |
“-1” | 失败 |
若不是以上两种,则继续解析,得到cmdid和cmd两部分,其中cmdid代表指令id,而cmd是实际的powershell指令。
执行结果和指令ID会回传至C&C,按照1024个字符分组发送。
返回的内容保存在配置变量id中,若包含32个字母数字组合,则保存在C:\Users\Public\当前用户名.dat文件中。此处获取的文件为powershell脚本,不过根据代码可以推断出此处也可以根据攻击者指令来获取其他内容。
Android后门
Android后门在植入目标手机后会将自身图标隐藏,并启用后门服务
后门启动过程中,将向预置于APK内的C&C发起连接。
78.129.139.131
103.13.67.4
80.80.163.182
80.90.87.201
91.187.114.210
在首次上线过程中,木马将默认通过函数sendAllData传送以下信息:
若后门没有接收到指令,则发出以下内容:
若木马接收到指令,根据以下拆分:
样本支持以下指令:
Command | Meaning |
201 | SendSystemInfo |
202 | SendSmartSms |
203 | SendContact |
205 | SendAllSms |
207 | SendSms |
211 | SendSmsSent |
212 | SendSmsReceived |
213 | SendPhoneNumber |
木马功能列表
除此,我们发现了后门的某些功能并未被启用
IP | UserName | Password |
203.215.176.35 | admin | cisco |
203.215.176.35 | admin | @@uroosh## |
203.215.176.35 | admin | cisco |
203.215.176.35 | admin | @@uroosh## |
202.69.48.66 | admin | cisco |
202.69.48.66 | admin | @@uroosh## |
202.69.48.66 | admin | cisco |
202.69.48.66 | admin | @@uroosh## |
爆破字典
说明此版本木马可能尚处于开发阶段。
Delphi后门
恶意文档首先释放%AppData%\Roaming\CiscoAny.exe,文件信息如下。该程序启动时进程名为RT 4G Cellular Networking。
%AppData%\Roaming\CiscoAny.exe首先会生成用本机用户名加密的%AppData%\Roaming\ID.dat和%Temp%\<user_id>.txt,其中ID.dat带有本机唯一标识ID记<user_id>,<user_id>.txt包含本机ip、硬盘信息、进程列表、内存信息、本地计算机默认语言信息。
其中本地ip为http请求icanhazip.com获取。
释放%Temp%\CiscoAny.exe并启动,将%AppData%\Roaming\CiscoAny.exe写入注册表启动项。
等待C2 googleads.hopto.org传输powershell脚本文件
C2在分析时已经下线
第二阶段
第一阶段释放的%Temp%\CiscoAny.exe会获取%Temp%\<user_id>.txt
获取到google.com的代理信息,若包含代理设置则使用该代理。
获取到185.117.75.116的代理设置
使用TCP向185.117.75.116发送<user_id>.txt作为上线提醒
三、攻击技术分析
1、对脚本进行混淆处理
该组织采用对脚本混淆的方法来对抗静态分析系统对其的检测,同时也增加了分析人员的分析难度。这里使用的混淆分为三种,第一种是编码或加密,动态分析时可以直接提取其内容,第二种则为常见的字符串混淆,将原本的函数名、变量名替换为随机生成的字符串,或使用大小写混写的方式,干扰静态分析。第三种为利用Powershell提供的Secure string机制,该功能是用于对password进行保护的,攻击者则用来将代码进行加密编码。
该组织采用的编码方法一般是将脚本通过BASE64编码填入到Powershell或者VBA脚本中,如下图:
下图是对方法名进行大小写混写的方式来提高分析难度:
利用随机字符填充变量名:
利用powershell提供的机制隐藏恶意代码:
安全字符串的使用方法如下:
首先将普通的密码字符串通过方法ConvertTo-SecureString将纯文本转换为安全字符串,使用SecureStringToBSTR方法对其结果进行存储,并使用PtrToStringAuto方法还原。
$SecurePassword = ConvertTo-SecureString $PlainPassword
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecurePassword)
$UnsecurePassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
可以看到加密解密前后差距异常巨大,在文本中写入的字符串与恶意代码完全无关系,能够很好的躲避静态分析和静态检测。
2、ByPass技术
这里利用的是CMSTP.exe,CMSTP是一个与Microsoft连接管理器配置文件安装程序关联的二进制文件。它接受INF文件,这些文件可以通过恶意命令武器化,以脚本(SCT)和DLL的形式执行任意代码。它是一个受信任的Microsoft二进制文件,位于以下两个Windows目录中:
C:\Windows\System32\cmstp.exe
C:\Windows\SysWOW64\cmstp.exe
AppLocker默认规则允许在这些文件夹中执行二进制文件,因此我们可以用它来作为bypass的一种方法。该方法最初是由Oddvar Moe发现的,使用这个二进制文件可以绕过AppLocker和UAC。
CMSTP.exe接受DLL,INF,SCT文件,但DLL和SCT文件的执行都需要依赖INF文件,攻击者使用此技术,来保证投放的恶意文档能够在目标机器上执行,由此可见,APT组织往往会第一时间吸收攻击方法并对其加以应用,以保证他们的攻击是非常有效果的。
3、C&C代理
在攻击者使用的脚本配置部分中,我们找到了超过500个的C&C网址,皆为普通网站,请求了特定的php文件,疑似是被攻击者上传了php后门,来接收Powershell后门的请求。
四、攻击者与组织特征
特征一:具有较强烈的政治目的
该组织一直活跃在中东地区,不断的对中东国家的政府机构发起攻击,主要的载体是利用带有宏病毒的DOC文档,且文档内容模糊不清,着重提示了需要点击启用宏按钮,而模糊文档中带有的信息,如此一来,分析人员无法通过文档内容对其攻击进行归类分析,也无法从中提取有效的信息。近一年来,攻击者也开始着手对文档内容进行编篡,以达到混淆视听的目的,更加贴近于被攻击者的使用习惯,降低警惕性。
特征二:非常依赖脚本语言进行攻击
在我们的持续观察中,该组织非常依赖使用VBS脚本和PowerShell脚本对目标进行攻击,在这两个脚本上采取了大量的对抗手段,包括反调试,加密,混淆等。如此一来,便通过静态的文件分析无法检测到该组织的攻击。只能通过动态分析的方式对其进行检测,由于其使用的是Powershell脚本,大多数沙箱是无法完整复现该样本的行为的,并且,攻击者往往是将攻击拆分成了两部分来做,第一步会设置自启动项,第二步,利用计划任务来启动恶意脚本,沙箱的单次运行环境是无法检测该样本的。
特征三:无论在任何环境均使用ByPass UAC技术
基本上每一次攻击中都可以看到该组织使用CMSTP.exe程序来绕过UAC和AppLocker,以保证恶意脚本能够静默的在目标机器上执行,在其他的组织中很少会见到攻击者如此频繁的采用同一种绕过技术,这一程度上也使得该组织特征鲜明。
特征四:使用被攻破的网站作为Proxy
该组织使用网页挂马的方式,隐藏真实的C&C地址。通过大范围的扫描和网页挂马,搜集了大量的Proxy机器。在主机沦陷后,从网络侧监控将没有明显的流量特征,信息上传的过程很好的隐藏在大量的正常访问中。同时,在被发现时,也不会暴露真实的C&C地址,再次潜入也不会受到封堵和检测。
五、总结
MuddyWater组织一直活跃在中东地区,绝大部分攻击均通过脚本完成,但是该组织也开始逐步开始使用delphi编写新的RAT工具,并向Android等移动端设备上迁移。因此我们认为该组织仍然在不断的开发新的工具,使用新的攻击技术以攻击防御更加严密的目标。