扫码领资料
获黑客教程
免费&进群
APT-Q-27也被称为Operation Dragon Breath或者金狗眼,是一个主要针对东南亚博彩产业相关人员的黑客团伙,本次分析的样本为APT-Q-27针对中文Telegram用户的攻击,样本使用了多重的白加黑侧加载。
打开目标网站,显示有4个平台的Telegram可以下载
我们点开Windows平台的下载链接
下载链接是根据浏览器的User-Agent进行判断,如果本机是Linux系统点击下载Windows版的Telegram下载链接会定向到Telegram.apk,下载链接地址为hxxps[:]//down[.]telegramxo[.]com/Telegram.apk
通过修改浏览器的User-Agent信息为Windows系统,成功下载到TG.exe,下载链接地址为hxxps[:]//down[.]telegramxo[.]com/Telegram.apk
修改浏览器的User-Agent信息为ios,点击下载发现跳转到了hxxps[:]//apps[.]apple[.]com/app/telegram-messenger/id686449807,此链接为Apple Store的官方下载地址,可以判断攻击者并没有准备针对ios平台的攻击
修改浏览器的User-Agent信息为MAC OS,下载了Telegram.dmg,下载链接地址为hxxps[:]//osx[.]telegram[.]org/updates/Telegram.dmg,此地址为Telegram官方下载链接,由此判断攻击者暂时也没有准备针对MAC OS平台下的攻击
使用exeinfope查看TG.exe发现是使用advanced installer进行打包的安装包
我们双击TG.exe进行安装
安装完毕后在桌面会创建Telegram的快捷方式,我们查看快捷方式发现目标指向了TG.exe的安装目录其中参数为appU.exe appU.dll,OpenURL appr.lnk
使用die查看appU.exe发现是使用Visual Studio 2005编译的32位程序
查看appU.exe的属性可以看到没有数字签名,通过详细信息查看此文件的原始文件名为RUNDLL.EXE,文件版本号为5.1.2600.5512(Windows XP SP3),此PE文件可能是Windows XP SP3系统下自带的rundll.exe,rundll.exe一般用于加载dll并执行指定的命令行参数的导出函数
在VT搜索appU.exe的sha256 hash可以看到此文件确实为Microsoft编写,首次提交VT的时间为2009-02-12
接着我们使用die查看appU.dll可以看到是使用VS2013编译的32位dll
查看appU.dll的属性,可以看到原始文件名为URL.DLL,文件版本号6.0.2900.5512(Windows XP SP3)
在VT搜索appU.dll的sha256 hash可以看到此文件也是Microsoft编写,首次提交VT的时间为2010-03-27
查看appU.dll的导出函数,一共导出了22个函数,其中可以看到OpenURL函数,这下我们知道Telegram快捷方式参数的作用了appU.exe appU.dll,OpenURL appr.lnk
,appU.exe(rundll.exe)加载appU.dll(url.dll)调用导出函数OpenURL并传入参数appr.lnk
使用ida查看OpenURL函数的实现,可以看到OpenURL和OpenURLA导出函数其实相同,OpenURL函数主要就是通过我们传入的参数lpFile之后直接调用ShellExecuteA函数打开,由于OpenURL函数的实现我们不仅可以打开网页URL还可以运行指定路径的可执行程序
我们查看appr.lnk快捷方式指向目标为appR.exe /s /n /u /i:appR.dat appR.dll
查看appR.exe的属性可以看到原始文件名为REGSVR32.EXE,文件版本号为5.1.2600.5512(Windows XP SP3),regsvr32.exe是Windows操作系统中用来向系统注册/卸载控件的
通过VT查看appR.exe确实为Microsoft官方编写
appR.dll的原始文件名为scrobj.dll,Windows Script Components(WSC)允许程序员使用VBScript或JScript这样的脚本语言来创建COM组件,scrobj.dll就是处理COM实现细节的运行时模块
查看appR.dat,发现是一个SCT脚本,此SCT脚本的描述信息为Bandit(强盗),JScript代码使用了jsjiami.com.v6进行了加密混淆
我们查看regsvr32的命令行参数用法,appR.exe /s /n /u /i:appR.dat appR.dll
,主要的就是通过appR.exe (regsvr32.exe)注册调用appR.dll(scrobj.dll)中的DllInstall函数并将appR.dat(.SCT)当作参数传入
可以看到appR.dll(scrobj.dll)有11个导出函数,其中的DllInstall函数将被调用
我们双击运行,确实运行了Telegram
发现一共有3个新增进程,还有另外两个名为autorun.exe的进程
我们查看Tgec500d3d.exe发现有某数字公司的签名但是签名是无效的
可以看到数字签名不落在PE文件的任何一个区段,可以判断此数字签名证书应该是伪造的
其中的std_7.0.0.1030是有某数字公司有效数字签名的PE文件,通过ResourceHacker工具查看似乎是数字公司的杀毒软件安装程序,目前暂不清楚此PE文件的作用
进程PID为6652的autorun.exe进程权限提升为了管理员权限,这里bypass了UAC实现了提权
通过Procmon查看发现还在C:\Users\xxxxx\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
开机自启目录创建了KB382456.url和KB894565.url快捷链接
我们查看这两个url文件发现他们指向的都是本地文件
我们查看进程创建情况,创建的进程为C:/Users/Public/reloc/SILan.exe
和C:/Users/Public/reloc/0/SILan.exe
路径
我们查看C:/Users/Public/reloc/
路径下的文件
通过die查看SILan.exe是使用VC6.0编译并且无数字签名
使用ida查看SILan.exe,通过搜索autorun字符串
通过交叉引用发现调用WinExec函数执行了autorun.exe
使用die查看autorun.exe发现是使用VS2003编译的32位程序并且有数字签名
查看autorun.exe发现确实数字签名确实有效
查看详情发现原文件名是Language.exe,根据文件说明应该是PowerDVD软件附带的
通过die查看language.dll发现编译时间戳为2023-4-28使用VS2010编译
language.dll有2个导出函数分别为LangDLLMain、SetRegPath
TemplateG.txt是一个加密文件
使用ida查看autorun.exe通过字符串发现language.dll
通过交叉引用看到首先通过LoadLibraryW加载了language.dll,然后通过GetProcAddress函数分别获取了SetRegPath、LangDLLMain导出函数地址,之后先调用了SetRegPath函数接着调用了LangDLLMain函数
查看C:/Users/Public/reloc/0/
路径下的文件两个文件路径下只有TemplateG.txt加密文件的内容不同其他的文件都是相同的
我们首先调试的是C:/Users/Public/reloc/0/
路径下的autorun.exe,通过x32dbg调试此为language.dll的导出函数SetRegPath函数,首先调用CreateFileW函数打开了C:\Users\Public\reloc\0\templateG.txt
初始化KERNEL32.dll字符串
初始化VirtualAlloc和CreateThread字符串,并通过LoadLibraryW函数获取kernel32基址
调用GetProcAddress获取VirtualAlloc函数地址
调用VirtualAlloc函数申请了0x4CB20字节小大的PAGE_EXECUTE_READWRITE权限的虚拟内存
调用ReadFile函数将templateG.txt文件读取到申请的虚拟内存空间地址加偏移0x3800处
之后对数据进行解密,解密算法主要的逻辑就是将第1个字节取出当作key,将key取反和第2个字节进行按位与得到byte1,之后将第2个字节取反和key进行按位与得到byte2,之后将byte1和byte2进行按位或操作得到明文填入第一个字节,之后从第3个字节开始取出加密字节重复和key进行以上步骤实现解密,解密后的数据为ShellCode
以下的python脚可以用于解密templateG.txt
#!/usr/bin/python3
# author: yauv
# time: 2023-05-12
# Decrypt APT-Q-27 templateG.txt ShellCode
import os
import sys
def DecryptShellCode(data, size):
key = data[0]
dByte = b''
for i in range(size-1):
dByte += bytes([(~key & data[i+1]) | (~data[i+1] & key)])
dByte += bytes([data[size-1]])
with open('decryptShellCode','wb') as f:
f.write(dByte)
print("Decrypt ShellCode Sucess!")
if __name__ == "__main__":
if len(sys.argv) == 2:
argv = sys.argv[1]
size = os.path.getsize(argv)
with open(argv,'rb') as f:
data = f.read()
DecryptShellCode(data, size)
else:
print("Usage: python3 decrypt.py [arg1]")
使用GetProcAddress函数获取CreateThread函数地址后执行解密后的ShellCode
此为ShellCode起始位置有一个跳转
跳转后首先会通过HASH算法获取函数地址
查看HASH算法判断为BKDRHash
通过获取的函数HASH和BKDRHash算法判断此ShellCode特征和github的开源项目DllToShellCode十分相似
DllToShellCode开源项目使用的BKDRHash算法
可以看到这里加载ntdll和DllToShellCode项目中的源码也相同
之后读取压缩大小数据通调用VirtualAlloc申请虚拟内存
接着通过BKDRHash获取RtlDecompressBuffer函数地址
调用RtlDecompressBuffer函数设置COMPRESSION_FORMAT_LZNT1 | COMPRESSION_ENGINE_MAXIMUM
标志解压缩数据到虚拟内存,可以看到解压后的数据为PE文件
接着会检查解压缩PE文件的MZ和PE标志是否正确
接着创建了HEAP_CREATE_ENABLE_EXECUTE(0x40000)权限的堆
调用RtlAllocateHeap函数申请堆空间
将解压缩PE文件的头部复制到申请的堆空间
将解压缩PE文件的所有区段逐个复制到申请的堆空间
修复PE文件的重定位数据
修复PE文件的IAT
获取PE文件的TLS表,如果存在则逐个调用TLS回调函数,如果不存在TLS表则跳过
通过call eax调用dllmain
通过ida查看dump的dll,首先会检测本进程是否为管理员权限
如果本进程不是管理员权限,则会使用反射式注入加载另一个PE文件
先将PE文件头复制到堆空间
接下来就是复制Section、修复重定位数据、修复IAT、修复对应Section的内存权限
解析导出表获取导出函数UACMe函数地址
调用UACMe函数
在解压缩的dll中除了有附加带有UACMe导出函数的dll之外还有一个PE文件
将此PE文件提取出来发现是一个有某数字公司有效数字签名的PE文件
查看此PE文件的调试信息,根据PDB文件的路径可知此PE文件原名应该为QuickInstProxy.exe
使用IDA分析UACMe函数,首先拼接了C:\Windows\explorer.exe
路径
获取当前进程的PEB,备份当前进程PEB->ProcessParameters的ImagePathName和CommandLine字段,之后将当前进程的PEB->ProcessParameters的ImagePathName和CommandLine字段改为C:\Windows\explorer.exe
将当前进程PEB的BaseDllName修改为explorer.exe
,FullDllName修改为C:\Windows\explorer.exe
初始化COM环境,使用管理员权限获取CLSID为Elevation:Administrator!new:{3E5FC7F9-9A51-4367-9063-A120244FBEC7}
的COM组件对象指针
调用CMLuaUtil->lpVtbl->ShellExec接口实现提权为管理员权限,此bypassUAC的方法可以参考github开源项目UACME的代码实现,此方式主要逻辑就是将要提权的进程PEB信息修改为白名单特权进程explorer.exe的信息欺骗PSAPI,之后通过调用AutoElevated未记录的CMSTPLUA的ShellExec接口实现提权
将进程的PEB的ImagePathName和CommandLine字段修改回去
将当前进程PEB的BaseDllName和FullDllName字段修改回去
提权后以管理员权限运行将会调用函数枚举360tray.exe进程
遍历进程如果找到目标进程360tray.exe则返回进程PID
向目标进程360tray.exe窗口并发送WM_CLOSE关闭目标进程
查询注册表键值Time,如果不存在则获取当前时间添加到注册表键值Time
查询的注册表为HKEY_CURRENT_USER\SOFTWARE\ComputerName,如果使用GetComputerNameA获取成功则作为ComputerName,如果获取失败则使用UnKnow作为ComputerName
添加删除注册表键值都是在HKEY_CURRENT_USER\SOFTWARE\ComputerName下
将Time键值中的时间每位加1用于创建互斥体
接下来会获取C&C服务器地址
如果注册表键值中存在CopyC的话则进行Base64解码并且异或5进行解密获得C&C服务器URL,如不存在CopyC键值则使用默认的v2[.]pic447[.]com
和C&C服务器通信使用的是TCP协议
通过WMI语句查询操作系统版本以及是否存在反病毒软件,通过注册表查询CPU型号
获取Chrome浏览器扩展nkbihfbeogaeaoehlefnkodbefgpgknn的文件属性,通过查询可知nkbihfbeogaeaoehlefnkodbefgpgknn为Chrome浏览器的MetaMask以太坊钱包插件
通过C&C服务器下发的命令执行对应的指令
C&C服务器的命令ID和对应功能如下表
ID | 功能 |
---|---|
0 | 关机 |
1 | 设置C&C服务器更新标志位 |
2 | 添加注册表键值Remark |
3 | 添加注册表键值ZU |
4 | 清空事件日志 |
5 | 复制获取的MetaMask扩展插件信息 |
6 | 创建线程通过CreateProcessA函数执行下载的exe |
8 | 显示窗口调用ShellExecuteA执行 |
9 | 隐藏窗口调用ShellExecuteA执行 |
0x70 | 窃取剪切板数据 |
0x71 | 设置剪切板数据 |
0x7D | 创建隐藏cmd窗口执行命令 |
0x7E | CreateProcessA函数执行写入到本地的exe,或通过反射式加载dll并调用PluginMe导出函数 |
0x23-0x25、0x65-0x6F、0x7F | 反射式加载dll并执行以下指定的导出函数PluginMe、isARDll、getDllName、isCSDll |
0x80 | 更新C&C Server通过异或5加密并Base64编码写入CopyC注册表键值,或者创建线程执行获取Chrome的MetaMask扩展信息 |
4.yara rule
以下的yara rule可以用于检测运行中的autorun.exe中通过侧加载反射式加载运行的Payload
rule APT_Q_27_COM_bypass_UAC {
meta:
description = "Apt-Q-27 COM bypassUAC"
author = "yauv"
reference = "https://yauv.me"
data = "2023-5-12"
strings:
// CMLuaUtil->lpVtbl->ShellExec
$hex1 = {FF 75 14 8B 06 6A 00 FF 75 10 FF 75 0C 8B 40 24 FF 75 08 56 FF D0}
// CMLuaUtil->lpVtbl->Release
$hex2 = {8B 06 56 8B 40 08 FF D0}
$ustring1 = "Elevation:Administrator!new:" fullword wide
$ustring2 = "{3E5FC7F9-9A51-4367-9063-A120244FBEC7}" fullword wide
$ustring3 = "explorer.exe" fullword wide
$astring1 = "aaaaa.dll" fullword ascii
$astring2 = "UACMe" fullword ascii
condition:
5 of them
}
rule APT_Q_27_Command_Control {
meta:
description = "Apt-Q-27 Command Control"
author = "yauv"
reference = "https://yauv.me"
data = "2023-5-12"
strings:
// xor 5
$hex1 = {80 34 30 05 40 3D 8C 00 00 00 72 F4}
$ustring1 = "SELECT * FROM AntiVirusProduct" wide
$ustring2 = "Root\\SecurityCenter" fullword wide
$ustring3 = "ROOT\\CIMV2" fullword wide
$astring1 = "v2.pic447.com" fullword ascii
$astring2 = "C:\\Users\\%s\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Extensions\\nkbihfbeogaeaoehlefnkodbefgpgknn\\" fullword ascii
$astring3 = "%d-%d-%d %d:%d" fullword ascii
condition:
5 of them
}
使用管理员权限打开PowerShel使用yara扫描全部进程Get-Process | ForEach-Object {yara64.exe .\aptq27.yar $_.ID}
名称: TG.exe
大小: 95360200 字节 (90 MiB)
SHA1: 7fa7dccf16a24df73b1cbf6f0b9e893bbac3606b
SHA256: d4cfb90a36244ac86c4a9c8f52308c95f010fb9ea02739b56832cfc1b1126ecb
名称: appR.dat
大小: 12744 字节 (12 KiB)
SHA1: 5b0f1e42e01d03b0d542cc48bdf27c75b971e587
SHA256: f18351208b5e135f5caf2ef16bd01892dd8182e49afdef78cc7b4fc56605dfb8
名称: appR.dat.bak
大小: 8910 字节 (8 KiB)
SHA1: 31d2cc79bed3b1e6f241762fb2a7b3a1383db88c
SHA256: 31f565e98ee026f4777bc0ce765dc4ec38c0b4619b8b68cbbedb966c2a4e8e28
名称: language.dll
大小: 5120 字节 (5 KiB)
SHA1: 08339a7110fa42b737a40e8230648586cf8412fb
SHA256: 574f8684bffdf703bb726b62633b4581824d04c5502bc36c1f52f48269ec1893
名称: templateG.txt
大小: 93524 字节 (91 KiB)
SHA1: 1a61411eb60be0875744372dfd3c00ece71f216f
SHA256: 767907401a5ed0f3aef5003e1f95267d6b7fe6dfaf75b631fc6f1d0d18f035fd
名称: templateG.txt
大小: 206784 字节 (201 KiB)
SHA1: 89285625ad35531d3080af1d36a84ddd4e3d5165
SHA256: cfa225bfedf6df4c16855d053e2706290535fdccf7f2e58ee364f370aaf0ab62
hxxps://telegramos[.]org
v2[.]pic447[.]com
103.116.15.2
根据本次分析的APT-Q-27样本主要通过多阶段的白加黑进行侧加载,可以推断此次主要攻击的目标为一些母语为中文使用Telegram的黑灰产团伙和数字加密货币投资者。侧重窃取Chrome浏览器的MetaMask以太坊钱包的数据,这和黑灰产团伙越来越多的使用数字加密货币进行交易有关,看来APT-Q-27主要就通过是黑吃黑的方式进行敛财。
https://github.com/sophoslabs/IoCs/blob/master/double-dragon-breath-iocs.csv
https://news.sophos.com/en-us/2023/05/03/doubled-dll-sideloading-dragon-breath/
https://github.com/hfiref0x/UACME
原文地址:https://www.freebuf.com/articles/system/366373.html
声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权!
(hack视频资料及工具)
(部分展示)
往期推荐
看到这里了,点个“赞”、“再看”吧
文章引用微信公众号"白帽子左一",如有侵权,请联系管理员删除!