APT-Q-27多重白加黑DLL侧加载的Telegram诱饵

新闻资讯   2023-07-08 12:06   91   0  

扫码领资料

获黑客教程

免费&进群


1.前言

APT-Q-27也被称为Operation Dragon Breath或者金狗眼,是一个主要针对东南亚博彩产业相关人员的黑客团伙,本次分析的样本为APT-Q-27针对中文Telegram用户的攻击,样本使用了多重的白加黑侧加载。

2.样本运行流程图

3.恶意代码分析

打开目标网站,显示有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平台下的攻击

3.1 TG.exe分析

使用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.exeC:/Users/Public/reloc/0/SILan.exe路径

3.2 autorun.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加密文件的内容不同其他的文件都是相同的

3.3 C:/Users/Public/reloc/0/分析

我们首先调试的是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

3.3.1 DecompressDll

通过ida查看dump的dll,首先会检测本进程是否为管理员权限

如果本进程不是管理员权限,则会使用反射式注入加载另一个PE文件

先将PE文件头复制到堆空间

接下来就是复制Section、修复重定位数据、修复IAT、修复对应Section的内存权限

解析导出表获取导出函数UACMe函数地址

调用UACMe函数

在解压缩的dll中除了有附加带有UACMe导出函数的dll之外还有一个PE文件

将此PE文件提取出来发现是一个有某数字公司有效数字签名的PE文件

查看此PE文件的调试信息,根据PDB文件的路径可知此PE文件原名应该为QuickInstProxy.exe

3.3.2 UACMe分析

使用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关闭目标进程

3.3 C:/Users/Public/reloc/分析

3.3.1 DeCompressDll

查询注册表键值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窗口执行命令
0x7ECreateProcessA函数执行写入到本地的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}

5.IOCs

名称: 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

CC

hxxps://telegramos[.]org
v2[.]pic447[.]com
103.116.15.2

6.总结

根据本次分析的APT-Q-27样本主要通过多阶段的白加黑进行侧加载,可以推断此次主要攻击的目标为一些母语为中文使用Telegram的黑灰产团伙和数字加密货币投资者。侧重窃取Chrome浏览器的MetaMask以太坊钱包的数据,这和黑灰产团伙越来越多的使用数字加密货币进行交易有关,看来APT-Q-27主要就通过是黑吃黑的方式进行敛财。

7.参考

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视频资料及工具

(部分展示)


往期推荐

给第一次做渗透项目的新手总结的一些感悟

「登陆页面」常见的几种渗透思路与总结!

突破口!入职安服后的经验之谈

红队渗透下的入口权限快速获取

攻防演练|红队手段之将蓝队逼到关站!

CNVD 之5000w通用产品的收集(fofa)

自动化挖掘cnvd证书脚本

Xray捡洞中的高频漏洞

实战|通过供应链一举拿下目标后台权限

实战|一次真实的域渗透拿下域控(内网渗透)

看到这里了,点个“赞”、“再看”吧


文章引用微信公众号"白帽子左一",如有侵权,请联系管理员删除!

博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。