乐于分享
好东西不私藏

伪装成驱动人生安装包样本分析

伪装成驱动人生安装包样本分析
在吉宙实验室例行威胁样本追踪过程中,发现一个伪装成驱动人生安装包文件,将其上传至吉星云诱捕分析平台(https://decoymini.com)进行检测,检测结果如下:
该样本与前两个在手法上基本相同,在之前的两次分析中由于 C2 失活未接收到数据拿到第二阶段 payload,有点可惜,但这次 C2 是存活的,也就顺利接收到了第二阶段载荷。

基本信息

这次是伪装成驱动人生安装程序,该样本是一个 32 位程序,使用 Setup Factory 5.0 版本打的包
对其进行解包 (解包方式与 7.0 以上版本不一样)

UserFeedback 是带有有效签名的文件,图标为驱动人生软件图标,其中 5.TXT 和 78.exe 可疑,这与前两次分析分析大致相似,在后续分析中也验证了行为一致。

注:5.TXT 为第一阶段载荷,包含加载器和 shellcode,78.exe 为密钥,黑文件为 libcurl.dll,具体可参阅前两次分析文章。

白鲨倒计时程序伪装成百度网盘样本分析

伪装成钉钉安装包程序样本分析

第二阶段载荷

目标存活,将接收到的第二阶段载荷分批复制到新分配的内存当中

将首地址作为线程函数,最后创建线程触发执行

开始执行时遍历 PEB 模块链表,获取 kernel32.dll 地址

函数名都是放在栈中,获取 LoadLibraryA 和 GetProcAddress 地址,通过它们再进一步获取各模块相应函数

手动实现了一个 PE 加载器

整个大致过程:

  • 加载器启动

  • 获取 API 表

  • 加载 PE 数据

  • 调用指定导出函数

  • 清理

第二阶段载荷在偏移 0x2804 处是一段 PE 数据

这段 PE 数据是个 32 位加了 UPX 壳的 DLL 文件

经脱壳后,查看导出表,只有一个名为 run 的导出函数

后面就是加载此 DLL,执行 run 导出函数

run 函数开始执行时先根据偏移从自身获取对应数据

偏移
值
0x2D008
110.40.135.215
0x2D108
441
0x2D10C
Default
0x2D12C
9193b94364b78ccdeef59098f86c9b24
0x2D22C
C:\Users\Public\Documents
0x2D291
oppenss.exe
    首次运行时以下并不会执行,这段是将自身复制到公共文档目录下并设置系统属性和隐藏属性
    但会去开启线程,线程函数目的是要去执行 sub_10008880

    sub_10008880

    此 sub 在开始执行时会去对两个全局数据作判断
    在实际首次调试过程当中,前面 if 并没有成立,这一段是以 : 分隔符获取相应 IP 和端口
    后面走的是 else 分支,将 ip 复制到 String1,端口赋给 v6 变量当中
    接着进入到 while 死循环与此 IP 进行通信,sub_100078A0 目的是创建线程,执行 sub_10006FB0,在此 sub 中,将收到的数据放到新分配的内存当中 (sub_100070F0)
    获取操作系统版本、本地计算机名,本地 IP 地址及硬件信息
    获取系统、内存和硬盘信息
    调用 COM 接口来获取网络连接信息的友好名称
    通过进程遍历检查 QQ、微信和钉钉是否在运行
    以同样的方式检查是否有杀毒软件在运行
    off_1002ACA0 和 off_1002ACA4 指向一份国内外杀软名单
    将以上获取的信息储存在 v44 变量中
    获取 BITS 服务配置
    最后将所有获取结果的数据经编码压缩后再到 sub_10007460 中进行加密 (xor) 分批次发送至 C2
    加解密都会去调用此 sub,里面包含了硬编码的 KEY
    与 C2 进行通信,后面心跳包,间隔 180s
    尝试将上述发出的指定范围流量数据筛选 dump 出并进行手动解密
    解密脚本
    import structimport zlibwith open("packet.bin", "rb") as f:    data = f.read()payload = bytearray(data[8:])vals = [    0x20001,0x40003,0x60005,0x80007,    0x90009,0x70008,0x50006,0x30004,    0x10002,0x10000,0x30002,0x50004,    0x70006,0x90008,0xB000A,0xD000C,    0xF000E,0x110010,0x130012,0x120013,    0x100011,0x160015,0x180017,0x1A0019,    0x1C001B,0x1D001D,0x1B001C,0x19001A]raw = b''.join(struct.pack("<I", x) for x in vals)key = [raw[i * 2] for i in range(56)]for i in range(len(payload) // 3):    payload[i] ^= key[i % 56]decompress_data = zlib.decompress(payload)with open("output", "wb") as f:    f.write(decompress_data[2:])
    解密后数据是个图像文件格式

    打开后是正在分析调试的图,数据已经发送到 C2 了

    对接收数据进行解密解压操作

    最后处理接收的数据
    尝试将接收的指定范围流量数据筛选 dump 出并进行手动解密
    解密方式同样,解出来的数据
    从中可以看出是一个 PE 数据,使用 DIE 查看
    这段 PE 数据为 32 位加了 UPX 壳的 DLL 文件,经脱壳后查看导出函数
    只有一个名为 PluginMe 的导出函数,原始 DLL 名 screen,这也上述发送数据截的桌面图对上,该 DLL 功能为获取桌面截图,后续还会下发各种功能的 DLL。发析了几个 DLL 后,再结合前面加载行为,与 GodRAT 相似,组织可能为银狐。

    sub_1000B240

    在上一小节提到过首先判断两个全局 byte_1002B9F4,但调试时该值为 0,所以强制修改了数据走该流程
    同样也是开启线程,目的执行 sub_1000B240,在此 sub 中,首先通过互斥体检查是否为单实例运行
    接着检测命令行参数是否带有 -acsi,若带有则会开启四个线程
    注册服务以便持久化
    尝试打开 
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\oppenss
    打开失败便去 sub_1000A660 注册服务,首先将自身复制
    并添加 -auto 参数,再创建服务
    服务崩溃后自动重启,最多 3 次,24 小时内最多重置一次计数,确保持久化,即使被终止也会被重新启动
    sub_100AC30 为注册主函数,在函数内部,首先进行进行系统版本检测,以 win7 为界分别作处理

    如果是 win7 以下,sub_100078A0 目的是创建线程,共创建 4 个线程,线程函数执行

    • sub_10009E20

    • sub_10009F10

    • sub_1000A030

    • sub_1000A2F0

    sub_10009E20

    创建一个隐藏的消息窗口,窗口过程专门处理 WM_CREATE 消息,以 -wait 方式启动服务

    sub_10009F10

    获取当前登录用户名及 SID

    sub_1000A030

    定期调用 SetProcessWorkingSetSize 来减少进程的内存占用

    sub_1000A2F0

    用于会话管理和进程守护,即使终止用户进程,服务也会立即创建;即使禁用了服务,用户进程也会重新启动服务

    以上是在 win7 以下执行的 4 个线程,如果是 win7 以上,构建命令行参数,以 -acsi 重新启动自身 (权限提升)
    判断服务启动参数,-wait 表示等待模式,-rsvc 表示恢复模式
    参数
    说明
    -auto
    服务自启动
    -acsi
    安装模式
    -wait
    等待模式
    -rsvc
    恢复模式
    回到 sub_1000B240 主体中,当设置完注册服务主函数,也会去调用上面四个线程其中三个要执行的 sub

    总 结

    经分析,该样本系伪装成驱动人生安装程序的恶意软件,采用 Setup Factory 5.0 打包,延续了此前白鲨倒计时及伪装钉钉下载器样本的白加黑加载手法。本次分析成功获取了第二阶段载荷,该载荷内置手动实现的 PE 加载器,用于动态加载并执行加密的 DLL 模块。核心模块 run 导出函数负责收集主机信息,包括操作系统版本、硬件配置、网络连接、IM 软件及杀毒软件运行状态等,经异或加密及压缩后回传至 C2 地址。同时,样本通过注册系统服务及进程守护机制实现持久化,支持下发包括屏幕截图在内的多种功能插件。综合其加载方式、通信协议及插件化架构,该木马具备 GodRAT 特征,关联组织疑似为银狐。

    综合对比三次分析 (伪装百度网盘、伪装钉钉下载器、伪装驱动人生),它们共同特征:

    • 打包与伪装手法一致:均使用 Setup Factory 系列版本 (5.0/9.0) 打包;均伪装成知名软件安装包 (百度网盘、钉钉、驱动人生);安装包体积异常偏大

    • 白加黑加载模式:均利用带有有效签名的白文件作为启动入口

    • 多层加密与载荷隐藏:均包含伪装成非 PE 格式的数据文件 (png.png、1.exe/2.exe、5.TXT/78.exe);解密后的载荷均在内存中动态分配执行,避免落地

    • C2 通信机制相同:首次连接均发送探测字符串 "ABCDE"

    差异点

    对比项
    第一次
    第二次
    第三次
    Setup Factory 版本
    5.0
    9.0
    5.0
    伪装对象
    百度网盘
    钉钉
    驱动人生
    黑 DLL
    libcurl.dll
    stdlog.dll
    libcurl.dll
    载荷文件
    png.png + private_key.bin
    1.exe + 2.exe
    5.TXT + 78.exe
    解密算法
    模重复平方算法
    SHA256 + AES-CBC
    SHA256 + AES-CBC
    C2
    18.163.11[.]11
    13.229.17[.]168
    110.40.135[.]215
    持久化机制
    /
    /
    完整实现 (服务注册 + 进程守护)
    功能插件
    /
    /
    多种功能 DLL
    归属判定
    -
    与第一次同源
    GodRAT,疑似银狐

    IoCs

    哈希

    • b6290316c488a05c284ed7084e9edb4b

    C2

    • 110.40.135[.]215

    相关学习资料