yusakul 发表于 2020-12-16 16:06

plugx家族RAT样本分析

本帖最后由 yusakul 于 2020-12-24 13:13 编辑

# 一、样本概述

样本从海莲花服务器扒下来的(经提醒修改,原先错误归类为海莲花),wsc_proxy.exe执行后加载wsc.dll解密wsc.dump文件,得到攻击模块(dll),攻击模块注入自身到系统进程后连接远控服务器上线,接收执行远控功能。远控功能包括:管理系统、文件、屏幕、进程、服务、网络、远程shell、键盘记录等。

**wsc_proxy.exe**主要功能为:

1.携带小红伞签名的exe文件;

2.加载wsc.dll。

**wsc.dll**主要功能为:

1.解密并调用wsc.dump。

**wsc.dump**主要功能为:

1.注册自启服务;

2.注入自身到系统进程svchost、msiexec;

3.被注入进程连接cc,执行远控指令。

# 二、样本类型

样本为越南海莲花组织开发,plugx木马程序。未加壳,通过注册服务的方式进行权限维持,实现开机启动。

# 三、详细分析

## 3.1 执行释放

A、攻击组件由三个文件组成wsc_proxy.exe、wsc.dll、wsc.dump。

B、执行经过签名的合法程序wsc_proxy.exe,并恶意加载loader程序wsc.dll。

C、loader程序wsc.dll解密并解压缩payload文件。

D、解密的shellcode被注入到合法的系统进程中。

E、注入的Windows进程执行C2 /远控功能。

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216130954.png)

*执行链*

## *3.2 攻击细节*

Payload启动并挂起系统信任的文件svchost.exe,将具有解密加载功能的函数注入到svchost进程,并在scvhost进程入口地址构造shellcode,唤醒scvhost进程执行shellcode,shellcode将跳转到解密加载函数,该函数解密wsc.dump文件并执行payload。

如上操作后,payload将运行在白名单进程中,达到隐藏自身的目的,后续注入挖空进程msiexec.exe的过程与之相同。

## 3.3 远控模块

远控功能包括:系统配置、文件管理、屏幕监视、进程管理、服务管理、远程shell、网络配置、注册表管理、数据库管理、键盘记录等。

| 分发命令 | 子命令 | 描述       |
| -------- | ------ | ---------- |
| Option   | 0x2000 | 锁屏       |
|          | 0x2001 | 直接关机   |
|          | 0x2002 | 重启动   |
|          | 0x2003 | 提示将关机 |
|          | 0x2005 | 弹出对话框 |

表一

| 分发命令 | 子命令 | 描述                           |
| -------- | ------ | ------------------------------ |
| Disk   | 0x3000 | 遍历磁盘                     |
|          | 0x3001 | 查找文件                     |
|          | 0x3002 | 递归查找文件                   |
|          | 0x3004 | 读取文件                     |
|          | 0x3007 | 写文件                         |
|          | 0x300A | 创建文件                     |
|          | 0x300C | 创建隐藏桌面,并创建进程       |
|          | 0x300D | 文件操作(复制、移动、重命名) |
|          | 0x300E | 根据环境变量名获取路径         |

表2

| 分发命令 | 子命令 | 描述   |
| -------- | ------ | -------- |
| Screen   | 0x4000 | 远程桌面 |
|          | 0x4100 | 截图   |

表3

| 分发命令 | 子命令 | 描述   |
| -------- | ------ | -------- |
| Process| 0x5000 | 创建进程 |
|          | 0x5001 | 枚举进程 |
|          | 0x5002 | 关闭进程 |

表4

| 分发命令 | 子命令 | 描述         |
| -------- | ------ | ------------ |
| Service| 0x6000 | 查询服务配置 |
|          | 0x6001 | 修改服务配置 |
|          | 0x6002 | 启动服务   |
|          | 0x6003 | 控制服务   |
|          | 0x6004 | 删除服务   |

表5

| 分发命令 | 子命令 | 描述    |
| -------- | ------ | ------- |
| Shell    | 0x7002 | 启动cmd |

表6

| 分发命令 | 子命令 | 描述         |
| -------- | ------ | -------------- |
| Telnet   | 0x7100 | 启动Tlenet服务 |

表7

| 分发命令 | 子命令 | 描述         |
| -------- | ------ | ------------ |
| RegEdit| 0x9000 | 枚举注册表键 |
|          | 0x9001 | 创建注册表键 |
|          | 0x9002 | 删除注册表键 |
|          | 0x9003 | 复制注册表键 |
|          | 0x9004 | 枚举键值   |
|          | 0x9005 | 设置键值   |
|          | 0x9006 | 删除键值   |
|          | 0x9007 | 读取键值   |

表8

| 分发命令 | 子命令 | 描述         |
| -------- | ------ | ------------ |
| Nethood| 0xA000 | 枚举网络资源 |

表9

| 分发命令 | 子命令 | 描述         |
| -------- | ------ | ------------ |
| PortMap| 0xB000 | 开启端口映射 |

表10

| 分发命令 | 子命令 | 描述            |
| -------- | ------ | ----------------- |
| SQL      | 0xC000 | 获取数据库信息    |
|          | 0xC001 | 列出驱动程序说明s |
|          | 0xC002 | 连接数据库      |

表11

| 分发命令 | 子命令 | 描述            |
| -------- | ------ | ----------------- |
| Netstat| 0xD000 | 获取TCP相关信息   |
|          | 0xD001 | 获取UDP相关信息   |
|          | 0xD002 | 设置TCP连接的状态 |

表12

| 分发命令 | 子命令 | 描述   |
| -------- | ------ | -------- |
| KeyLog   | 0xE000 | 键盘记录 |

表12

| 分发命令 | 子命令 | 描述       |
| -------- | ------ | ---------- |
| ClipLog| 0xF000 | 剪切板记录 |

表13

## 3.4 逆向细节

### 3.4.1 wsc_proxy.exe

wsc_proxy.exe文件数字签名为AVAST Software
s.r.o.,来自安全厂商AVAST。说明样本开发者拥有该安全厂商私有证书,利用证书将样本签名,达到免杀目的(可能是由于厂商的数字签名私钥泄露或被破解)。

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216130955.png)

wsc_proxy.exe数字签名

#### 0x1 加载“解密dll”

wsc_proxy.exe为带签名的白名单程序,程序功能为:加载wsc.dll。

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216130956.png)

### 3.4.2 wsc.dll

#### 0x1 构造shellcode

wsc.dll构造了一段shellcode调用wsc.dll导出函数sub_10001000,构造地址为wsc_proxy.exe加载自身完成时。sub_10001000为加载函数。

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216130957.png)

构造shellcode

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216130958.png)

Shellcode地址

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216130959.png)

执行流程

#### 0x2加载wsc.dump

读取wsc.dump到内存,修改内存属性为可执行,跳转到目标wsc.dump地址执行。

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131000.png)

文件路径

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131001.png)

修改内存属性,跳转执行

### 3.4.3 wsc.dump

文件wsc.dump猜测为样本开发者从内存中dump函数指令得到二进制文件,跳转到文件首地址即可正常执行函数。

#### 0x1 解密解压缩并执行payload

解密wsc.dump自带的加密数据,再次解压得到一个dll文件,在内存中展开PE文件并修复重定位。上述操作完毕后调用该payload(dll)。

在该片内存中标记“PLUG”。

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131002.png)

解密算法

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131003.png)

解压得到payload

### 3.4.4 payload

Payload每次启动将检查启动环境,并据此进行一些初始化操作。同时payload将根据启动参数执行不同的功能。

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131004.png)

#### 0x1 初始化

##### 提升权限

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131005.png)

##### 2) 复制到指令目录

复制样本组件到路径"C:\\ProgramData\\Windows NT\\accessories\\

wsc_proxy.exe",文件属性为隐藏,再次启动wsc_proxy.exe。

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131006.png)

#### 0x2 注册自启服务:100进程

主要目的为注册自启服务,注册服务之前有检查权限和提升权限的操作。

##### 提权

利用方法:COM提升名称(COM Elevation
Moniker)技术提升接口权限,ICMLuaUtil接口启动附带管理员权限进程wsc_proxy.exe进程,启动参数为100。

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131007.png)

进程监控

##### 注册服务

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131008.png)

创建服务

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131009.png)

注册表被添加的启动服务

#### 0x3 注入、挖空svchost进程:200进程

该进程将查找系统文件svchost.exe,启动并挂起svchost,随后修改svchost进程内存,将一个功能为“解密、解压缩wsc.dll并加载payload”的函数写入到svchost进程内存,寻找入口地址OEP并在此构造shellcode跳转到解密解压缩函数。

恢复svchost主线程,执行解密解压缩操作,执行payload。

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131010.png)

创建挂起进程:svchost

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131011.png)

计算跳转

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131012.png)

构建shellcode

#### 0x4 svchost进程:201进程

##### 创建内存映射,保存一些工具类函数,待后续使用。

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131013.png)

保存跨进程访问的工具类函数

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131014.png)

保存功能函数

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131015.png)

磁盘管理

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131016.png)

注册表操作

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131017.png)

进程管理

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131018.png)

枚举网络资源

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131019.png)

获取网络状态

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131020.png)

计算机设置

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131021.png)

端口映射

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131022.png)

服务管理

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131023.png)

启动远程cmd

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131024.png)

数据库操作

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131025.png)

启动telnet服务

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131026.png)

Hook键盘消息

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131027.png)

保存键盘记录到本地

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131028.png)

剪切板记录

##### 创建、注入、挖空msiexec进程

操作过程与操作svchost相同,见下图。

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131029.png)

##### 上线、通讯

通讯线程为OlProcNotify,该线程能够使用三种协议尝试连接地址steam.dajuw.com,端口为443。

通信成功后发送附带加密key的加密报文,在接收处理循环中接收执行远控指令。

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131030.png)

执行流程

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131031.png)

上线协议

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131032.png)

发送接收指令消息

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131033.png)

接收消息、处理指令

##### 4)插件管理器

远控服务器可以发送指令创建模块管理线程,线程名为:OlProcManager。该线程同样先使用指定的协议连接服务器,并进入入一个“发送-接收-处理”循环,遍历执行远控模块具有的功能(管理磁盘、文件、屏幕…)。

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131034.png)

发送消息

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131035.png)

接收指令循环

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131036.png)

执行功能

#### 0x5 msiexec进程:209进程

209进程同201进程将功能模块函数安装,并创建管道实现进程通讯。此外,209进程创建DoImpUserProc线程接收指令执行功能函数。

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131037.png)

功能安装与管道通讯

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131038.png)

执行功能

#### 0x5 300进程

300进程操作:关闭并删除远控服务,清理远控留下的注册表痕迹,最后将远控程序和文件删除。

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131039.png)

![](https://gitee.com/yusakul/ImageHostingService/raw/master/20201216131040.png)

# 四、样本特征

暂不提供

yusakul 发表于 2020-12-21 10:59

Sam.777 发表于 2020-12-21 10:39
wsc_proxy.exe不是白程序吗,加载恶意dll

嗯 白的 自己用都可以{:1_918:}

addqcx 发表于 2020-12-17 11:53

谢谢分享

zsxm6865 发表于 2020-12-17 20:25

感谢分享!

QRQ 发表于 2020-12-17 22:27

谢谢楼主分享吧

yangyuyinxiang 发表于 2020-12-18 19:20

感谢楼主的分享

Sam.777 发表于 2020-12-21 10:39

wsc_proxy.exe不是白程序吗,加载恶意dll

Karry1121 发表于 2020-12-24 09:34

感谢楼主 又学到新知识了{:1_893:}

yangruiqi 发表于 2020-12-25 11:30

plugx,好厉害

20000721yy 发表于 2020-12-26 14:55

感谢楼主的分享
页: [1] 2
查看完整版本: plugx家族RAT样本分析