一种 Au3 远控木马变种样本分析

1 Au3 简介

    AutoIt3 (简称 Au3)是一种能够在 Windows GUI 或 DOS 上实现一系列自动化任务的脚本语言,其语法类似BASIC。

    使用 Au3 开发的程序,能够具有以下功能:

  • 模拟击键和鼠标移动操作;
  • 对窗口和进程进行操作;
  • 与所有标准的 Windows 控件进行交互。
  • 编译的独立可执行文件无需安装任何运行环境。
  • 可创建图形用户界面( GUI );
  • 支持 COM ;
  • 支持正则表达式;
  • 可直接调用外部 DLL 和 Windows API 函数;
  • 可实现 RunAs 功能;
  • 兼容大多数 Windows 版本;
  • 支持 Unicode 和 64 位操作系统。
  • 支持数字签名。
  • 支持用户账户控制( UAC )。

2 变种木马简介

    近期,本人通过在网上部署的各个 VPS 节点蜜罐,捕获到一种新型的 Au3 脚本木马变种。在以往,大多数以 Au3 编码的恶意程序攻击中,主要都是以窃取键盘输入的木马为主,比如,2016 年腾讯电脑管家在 FreeBuf 上报道的 《异次元窃贼:使用AutoIt脚本进行键盘记录窃取的“新奇玩法”》 所述。

    本次所捕获的新型变种,保留了以往的利用代码框架,但功能上明显增强,甚至还有部分神秘的功能模块可能还处于测试阶段,没有被攻击程序调用。可以认为,该新型木马变种的作者在原有的利用代码框架上,进行了增配和强化,使其完全具备远控木马的功能。甚至利用了 Au3 脚本自身的优越姿势,模拟人的键鼠操作,“手动” 退出了某厂商的些杀软进程(比如国际著名的 Avast杀毒软件)。

3 变种木马分析

3.1 可疑文件

    可疑文件被嵌入在某文档中,以邮件的方式进行传播:

被嵌入可执行程序的文档

    提取出可执行程序样本后,发现该样本为 RAR 自解压程序:

嵌入的可执行文件为 RAR 自解压程序

    使用 RAR 打开后,发现攻击者在解压配置中加入了某国语言的热门小说内容来逃避杀软检测:

自解压配置中存在混淆信息
    清理解压配置中无用信息后得到配置信息如图:

自解压配置信息

    分析自解压的配置信息发现,当用户双击文档中嵌入的 exe 程序时会触发自解压程序,将压缩包文件尽数解压到 %temp%\xxxx 目录下,该解压过程中的进度条被隐藏。且在解压过程中,如果遇到文件已存在的情况,则会直接覆盖(不会提示用户)。

    分析解压后的文件发现,压缩包内存在各种类型的文件共二十多个, 其后缀名包括:bmp、mp3、dat、icm、jpg、ppt、docx、pdf、xl、ico、txt、exe 等。其中,除了 file1.exe 和 file2、file3 文件之外,其他的文件皆为文本文件:

压缩包内文件类型

    任意打开压缩包内的文本文件发现,这些文本文件的内容都是一些字符串,此处推测这些文件存在的目的可能是为了欺骗杀软对压缩包内容的检测:

压缩包内的文本文件

    分析 file1.exe、 file2、file3 三个文件后发现:file1.exe 是 Au3 脚本的解释器,file2 是 Au3 脚本,file3 为 ini 配置文件。

    对可执行程序 file1.exe 进行查杀发现,全球 63 款主流杀软对该文件的检出率为 0 。这种情况只有两种可能,一种可能是该程序确实为 Au3 官方发布的安全程序;另一种可能是该程序经过牛逼的免杀处理后,对全球主流杀软都具有免杀能力。这里唯一可以确定的一点是,该程序确实是 Au3 脚本的解释器,确实能够运行 Au3 脚本。

file1.exe 查杀结果

    file1.exe 文件的签名情况如下:

file1.exe 签名信息

    直接双击运行 file1.exe 时,会提示选择用户手动一个 Au3 脚本(来编译并执行):

双击 file1.exe 时

3.2 脚本分析

    对 file2 进行分析发现,该脚本文件的源码通过大量增加无用注释(; 号开头的行都是单行注释)和无用代码(#-d-d-d 开头的大多是无用代码,且不干扰程序正常运行)的方式来增加内容和文件体积,此处推测目的是用于提高静态检测的难度以及使用大文件来逃避多数杀软的云查杀功能。

file2 内容充满无用的注释

    删除无用行后得到 6 KB 的代码:

file2 源码开头

    从代码可知,file2 脚本运行时会加载 file3 的的内容,那么 file3 是不是程序的配置文件呢?我们载入 file3 来看看:

file3 文件内容片段

    file3 中出现了熟悉的 [Setting],没错,经过分析发现 file3 就是一个 ini 配置文件。为了后续的分析更加直观,我们接下来将 file1.exe 改名为 AutoIt3.exe,将 file2 改名为 main.au3,将 file3 改名为 config.ini。

    研究发现,该脚本执行过程的简述如下:

  • 1. 当解压操作完成时,程序会自动以当前用户的权限运行 AutoIt3.exe ,再由 AutoIt3.exe 编译并执行脚本文件 main.au3。
  • 2. main.au3 脚本执行后会从配置文件 config.ini 中加载加密的代码段,以及解密所需的密钥和其他配置参数。
  • 3. 紧接着进行解密操作,在当前目录下生成一个临时文件,文件名为五位随机大写字母且每次运行生成的文件名皆不同。该临时文件被用于写入解密之后 Au3 脚本代码,此处我们称生成的新文件为 attack.au3。
  • 4. attack.au3 生成后,会立即被主程序编译并载入内存执行。新脚本运行之后随即删除自身的临时文件,并再次载入配置文件 config.ini。
  • 5. 此时,会根据配置文件内的 “定制化配置” 参数,以及当前的运行环境来加载不同的攻击函数模块。为了构造攻击所需的 “payload”,脚本程序会从配置文件中读取新的加密代码段及新的解密密钥。
  • 6. 当一系列攻击操作完成时,被入侵的主机会主动向 C&C 服务器发起回连请求。

    综上所述,整个木马程序的执行流程如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
+-----------+      +------------------+      +------------------+      +-------------------------+
| User Open | | User dblclick | | extracting files | | Auto Run: |
| xxxx.docx +----> | xxxx.exe in docx +----> | to %temp%\xxxx\* +----> | ./AutoIt3.exe main.au3 |
+-----------+ +------------------+ +------------------+ +----------+--------------+
|
|
v
+--------------------------+ +--------------------------+ +-----------------+
| Auto Run: | | Creat new decode script: | | main.au3 load: |
| ./AutoIt3.exe attack.au3 | <----+ attack.au3 | <----+ config.ini |
+----------+---------------+ +--------------------------+ +-----------------+
|
|
|
| +-----------------------------------------+
| | GAME OVER: |
+------------> | Your machine connect to the C&C Server! |
+-----------------------------------------+

    分析 config.ini 文件发现,依然是存在混淆信息:

 config.ini 文件中存在混淆信息

    匹配等号行发现,共有 7 个配置参数:

 config.ini 文件内容片段

    除了常规的配置外,还发现文件中大段大段的十六进制数据块上存在两对标记:

标签

    研究发现,标记内的数据为加密的十六进制数据块:

标签内的 HEX

    为了方便后续的分析,[Data] 标签和 [eData] 内连续的十六进制数据块
我们命名为HexBlock1,[sData] 和 [esData] 标签内的十六进制数据块我们命名为HexBlock2。

    分析脚本文件 main.au3 的源码发现,代码中加入大量双引号和 and 符号 "&" 来逃避杀软的静态检测:

逃避杀软检测

    部分数据块也采用了临时替换组装的方式来逃避杀软的静态检测:

部分加密数据块

    解密之后为:

部分数据库解密

    上传到云端后发现仅有2款杀软能够检测出 main.au3 为恶意文件:

全球仅有 2 框杀软能够检出恶意文件

    由于样本源码不打算公开,此处仅摘取脚本中的一些函数做介绍。需要注意的是,这些函数大部分是 Au3 官方提供的,而具有攻击性的 payload 代码大部分是存储在 DLL 数据里面:

  • #NoTrayIcon:用于隐藏程序的运行状态及任务栏图标
  • ProcessExists:此处用于判断一些杀软进程是否正在运行。
  • IniRead:用于加载配置参数。
  • FileExists:用于判断文件是否存在。
  • FileCopy:用于文件复制操作。
  • FileRead:用于读取配置文件中的加密代码块。
  • FileSetAttrib:用于设置文件属性。
  • FileWrite:用于写入解密后的新脚本到新文件中。
  • StringRegExp:用于匹配正则表达式。
  • StringRegExpReplace:用于处理正则表达式替换操作。
  • DllStructCreate:用于创建 DLL 结构体。
  • DllStructSetData:用于设置 DLL 结构体的数据内容。
  • DllStructGetPtr:用于获取结构体指针。
  • DllStructGetData:用于获取结构体的数据内容。
  • DllStructGetSize:用于获取 DLL&nbsp某指定字节数的数据内容。
  • DllCall:调用一个 DLL。
  • DllOpen:加载一个 DLL 文件到内存,以等待调用。
  • DllClose:关闭一个 DLL 文件。
  • WinExists:检测指定的程序窗口是否存在。
  • Execute:用于执行操作系统命令。
  • ShellExecute:用于执行操作系统命令。
  • FileDelete:用于文件删除操作。
  • ProcessClose:用于关闭进程操作。
  • RegDelete:用于删除注册表项操作。
  • RegWrite:用于注册表写入操作。
  • WinActive:检测指定的程序是否正在运行。
  • WinWaitClose:暂停执行脚本,直到指定的程序退出。
  • RunWait:执行一个外部程序并暂停脚本自身的运行,直到所执行的外部程序完成。
  • WinGetText:检索所有程序界面上的文字。
  • ClipPut:将指定的数据内容写入到系统剪切板。
  • DriveSpaceFree:显示指定磁盘的剩余空间。
  • InetGet:从互联网上下载文件,支持 HTTP、HTTPS、FTP 协议。
  • BitShift:用于数据位移操作。
  • BitAND:用于数据与操作。

3.3 进程注入

    考虑到直接拿脚本源码中的解密逻辑去提取 DLL 数据内容比较抽象,此处分析内容主要以逆向为主。分析发现,攻击脚本 attack.au3 执行之后,会启动以下程序(优先使用v4):

1
2
3
C:\Windows\Microsoft.NET\Framework\v2.0.50727\RegSvcs.exe
或者
C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegSvcs.exe

    先下一波断点(API 断点仅供参考):

1
2
3
4
5
6
7
8
9
10
bp kernel32.CreateProcessW
bp kernel32.MoveFileA
bp ws2_32.recv
bp ws2_32.send
bp Kernel32.WriteFile
bp Kernel32.ReadProcessMemory
bp Kernel32.WriteProcessMemory
bp Kernel32.CreateFileW
bp Kernel32.CreateFileA
bp Kernel32.SetThreadContext

    运行至启动 RegSvcs.exe 程序时,观察堆栈内容:

启动 RegSvcs.exe 程序时的堆栈内容

    观察到 CreationFlags = CREATE_SUSPENDED,其作用是程序启动后便立即停止运行,只分配了内存空间。随后观察到注入的 DLL 数据被分成五次写入到新建的 RegSvcs.exe 进程内存:

    第一次:

第一次向 RegSvcs.exe 进程写入 DLL 数据

    第二次:

第二次向 RegSvcs.exe 进程写入 DLL 数据

    第三次:

第三次向 RegSvcs.exe 进程写入 DLL 数据

    第四次:

第四次向 RegSvcs.exe 进程写入 DLL 数据

    第五次:

第五次向 RegSvcs.exe 进程写入 DLL 数据

    提取五次注入的内存块,即得到注入到 RegSvcs.exe 进程的 DLL 完整数据,我们将其命名为 inject.dll。

3.4 远控行为

    得到 inject.dll 后,发现该模块为 C# 源码编写,用 dnSpy 载入分析发现,木马运行时,首先建立与远控服务器的心跳包连接,将受害者主机的基本信息回传到木马服务器。在心跳包监听中,如果收到服务器的指令,则按照指令执行相应的代码。可接受的指令部分如下:

指令 作用
kl 开启 KeyLogger 键盘记录模块
nk 使用指定的密码加密通讯流量
~ 收集当前进程信息
! 源码中仅声明该指令,未定义具体操作
\@ 收集本地文件夹目录(只记录到文件夹名称,且排除系统目录)
# 收集指定文件夹内文件名
up 上传指定文件到服务器
dl 下载指定文件到受害者主机
Ex 执行系统命令或运行某程序
rb 在注册表中注册开启自启
mmm 退出自身进程
\%- 尝试关闭指定进程

    此外,源码中有些函数虽然定义了功能,但没有写调用代码,此处不做详细说明。此外,该远控木马客户端上线时,回传本机基础信息使用的是 BASE64 编码来加密流量:
木马回连通信

4 免杀思路总结

  • 1.在自解压注释中,通过增加正常的小说文本来干扰杀软的识别。
  • 2.解压的文件中,使用了二十多种后缀名,伪装普通的办公文件、图片文件、视频文件和文本文件。
  • 3.解压的文件中,唯一的可执行文件是带了数字签名的 Au3 脚本解释器。
  • 4.解压的文件中,大多数文件皆为无用的随机字符串。
  • 5.主要执行的脚本文件中,增加了大量无用的注释行,以及不影响代码执行的非代码行。
  • 6.主要执行的脚本文件自身体积近 3M,多数云查杀对该大小的文件内容不进行在线检测。
  • 7.主要执行的脚本文件中,对所用到的 Au3 敏感函数、敏感字符串、二进制数据库都采用了以双引号和 AND 符号构成的 "&" 字符串进行分割。
  • 8.在最终攻击代码的生成前,主程序会利用 Au3 脚本自身的优越姿势,模拟人的键鼠操作,“手动” 退出了某厂商的些杀软进程(比如国际著名的 Avast杀毒软件)。

    对该木马的免杀思路总结大概就是这几条,当程序开始往进程注入 DLL 时,已是赤裸裸的进攻,不再具备免杀特性。

5 攻击来源分析

    攻击者使用的远控服务的 IP 地址为 192.68.x.x ,所在地为瑞典,使用的通讯协议为 tcp ,端口 7771:
攻击者IP地址

    根据第三方情报数据显示,该远控端 IP 早在 2016 年就被捕获过可疑行为:
开源情报

参考链接

    更多内容请关注:王小龍的博客