lazarusholic

Everyday is lazarus.dayβ

推陈出新!Kimsuky组织最新远控组件攻击场景复现

2024-03-25, T0daySeeker
https://xz.aliyun.com/t/14181
#Kimsuky

Contents

概述
近期,笔者在浏览网络中威胁情报信息的时候,发现twitter上有人发布了一篇推文,推文的大概意思是推文作者获得了Kimsuky组织使用的PowerShell后门,同时推文作者还赋了一张截图,截图上展示了PowerShell后门的控制端程序的GUI界面。

笔者之前也跟踪过Kimsuky组织,对其所使用的攻击组件有过一些研究,不过此次却是笔者第一次见到其使用PowerShell后门作为最终远控木马端,因此,笔者准备对该PowerShell后门进行详细的深度剖析:

功能分析:发现其使用socket套接字进行网络通信,通信加密算法为RC4,支持12个远控功能指令;
通信模型分析:结合后门通信数据包对其通信模型进行详细的对比分析;
逆向开发控制端:模拟构建PowerShell后门控制端,可有效还原攻击利用场景;
相关截图如下:



PowerShell后门分析
外联上线
通过分析,发现此PowerShell后门运行后,即会根据配置的外联地址发起socket套接字上线通信,默认配置信息为127.0.0.1:8888。

相关代码截图如下:



通信密钥交互
通过分析,发现此PowerShell后门将使用RC4对称加密算法对通信数据进行加解密,即当建立socket套接字连接后,该后门将把RC4密钥信息发送至控制端,发送RC4密钥的大致流程如下:

使用MD5算法对Mac地址与IP地址拼接的字符串进行Hash运行;
使用socket套接字发送MD5字符串;
RC4算法密钥信息
SendKey:MD5值+"_r"
RecvKey:MD5值+"_s"
相关代码截图如下:



RC4加密通信
通过将此PowerShell后门的RC4加密算法与Golang语言的"crypto/rc4"库中的RC4算法进行对比,发现:

此PowerShell后门的PrePare_Key函数即为Golang语言"crypto/rc4"库中func NewCipher(key []byte) (*Cipher, error) 函数;
此PowerShell后门的Rc4_Crypt函数即为Golang语言"crypto/rc4"库中func (c *Cipher) XORKeyStream(dst, src []byte)函数;
PowerShell后门RC4算法代码截图如下:



Golang语言的"crypto/rc4"库中的RC4算法代码截图如下:



远控功能
通过分析,发现此PowerShell后门支持12个远控指令,梳理远控指令列表如下:

远控指令 对应功能函数 描述
OP_REQ_DRIVE_LIST ProcessDriveList 获取磁盘信息
OP_REQ_PATH_LIST ProcessPathList 获取指定目录文件列表
OP_REQ_PATH_DELETE ProcessPathDelete 删除文件
OP_REQ_EXECUTE ProcessPathExecute 启动程序
OP_REQ_CREATE_ZIP ProcessPathZip 将目录打包成zip文件
OP_REQ_PATH_RENAME ProcessPathRename 重命名文件
OP_REQ_CREATE_DIR ProcessCreateDir 创建目录
OP_REQ_PATH_DOWNLOAD ProcessPathDownload 将指定文件或目录通过POST请求发送至指定C&C
OP_REQ_CLOSE 关闭socket连接
OP_REQ_REMOVE 关闭socket连接
OP_REQ_RESTART 关闭socket连接并重连
OP_REQ_FILE_UPLOAD 上传文件
相关代码截图如下:





ProcessPathList
通过分析,发现当PowerShell后门接收到OP_REQ_PATH_LIST指令后,将从接收指令中提取信息,并返回指定目录中的文件列表信息,大致流程如下:

从接收指令中提取信息:4字节DirPathLen、DirPath
返回信息结构如下:
RecvData:控制端发送的远控指令载荷内容
4字节Count:获取DirPath目录中的文件及目录的数量
InfoLen:目录或文件信息的长度
ByInfo:以";"分割相关信息
ByInfo目录信息:"0"、目录名、""、目录修改时间
ByInfo文件信息:"1"、文件名、文件长度、文件修改时间
相关代码截图如下:



ProcessPathExecute
通过分析,发现当PowerShell后门接收到OP_REQ_EXECUTE指令后,将从接收指令中提取信息,并启动程序,大致流程如下:

从接收指令中提取信息:4字节PathLen、Path、4字节IsDir
调用Invoke-Expression命令启动程序
相关代码截图如下:



ProcessPathDownload
通过分析,发现当PowerShell后门接收到OP_REQ_PATH_DOWNLOAD指令后,将从接收指令中提取信息,把指定文件或目录通过POST请求发送至指定C&C处,大致流程如下:

从接收指令中提取信息:4字节PathLen、Path、4字节IsDir、4字节UrlLen、Url
若IsDir值为真,则将Path路径下文件打包成zip文件
读取待下载文件的载荷,并将其base64编码
使用POST请求将载荷内容发送至“Url/show.php”链接处(Url值为接收指令中提取的信息)
相关代码截图如下:





PowerShell后门通信模型分析
为了能够更全面的对Kimsuky组织使用的PowerShell后门技术进行剖析,笔者准备在样本分析的基础上,再同时对其通信模型进行详细的剖析,并根据其通信模型特点,梳理提取可针对于Kimsuky组织PowerShell后门的网络流量检测方法。

攻击场景还原
为了能够更好的还原Kimsuky组织PowerShell后门的攻击场景,笔者尝试模拟构建了一款Kimsuky组织PowerShell后门控制端程序,目前可有效的与PowerShell后门进行交互,相关运行效果如下:



相关通信数据包截图如下:





相关操作流程如下:

Server started. Listening on 0.0.0.0:8888
nOpCode:0x0401
nUniqueIdLen:5FD47DF267932964A5B9340E55416BA1
请选择需执行的功能:help、OP_REQ_CLOSE、OP_REQ_DRIVE_LIST、OP_REQ_PATH_LIST
>help
********支持功能如下********
OP_REQ_CLOSE:关闭连接
OP_REQ_DRIVE_LIST:查看磁盘信息
OP_REQ_PATH_LIST:查看目录
**************************
请选择需执行的功能:help、OP_REQ_CLOSE、OP_REQ_DRIVE_LIST、OP_REQ_PATH_LIST
>OP_REQ_DRIVE_LIST
nOpCode:0xOP_RES_DRIVE_LIST
DriveCount:1
InfoLen:21
DisplayName:C:\()[Fixed,NTFS]
RootDirectory:C:\
请选择需执行的功能:help、OP_REQ_CLOSE、OP_REQ_DRIVE_LIST、OP_REQ_PATH_LIST
>OP_REQ_PATH_LIST
nOpCode:0xOP_RES_PATH_LIST
Command Dir:C:\Users\admin\AppData\Local\Temp
Count:59
Dir Low 11/27/2023 14:18:39
Dir vmware-admin 12/28/2016 11:23:04
Dir WPDNSE 11/27/2023 14:57:17
File admin.bmp 49208 12/28/2016 10:38:29
File ASPNETSetup_00000.log 4128 01/25/2024 09:15:13
File ASPNETSetup_00001.log 2966 01/25/2024 09:15:15
File dd_NDP462-KB3151800-x86-x64-AllOS-ENU_decompression_log.txt 1145 01/25/2024 09:17:33
File dd_SetupUtility.txt 1702 01/25/2024 09:16:13
File dd_vcredistMSI3DE8.txt 413058 12/28/2016 10:38:48
File dd_vcredistMSI3E33.txt 422262 12/28/2016 10:39:00
File dd_vcredistUI3DE8.txt 11634 12/28/2016 10:38:48
File dd_vcredistUI3E33.txt 11698 12/28/2016 10:39:00
File dd_vcredist_amd64_20231127134511.log 17423 11/27/2023 13:45:14
File dd_vcredist_amd64_20231127134511_000_vcRuntimeMinimum_x64.log 124164 11/27/2023 13:45:14
File dd_vcredist_amd64_20231127134511_001_vcRuntimeAdditional_x64.log 130754 11/27/2023 13:45:14
File dd_vcredist_amd64_20231127135758.log 12954 11/27/2023 13:58:00
File dd_vcredist_amd64_20231127142907.log 12954 11/27/2023 14:29:10
File dd_vcredist_x86_20231127134400.log 17440 11/27/2023 13:45:11
File dd_vcredist_x86_20231127134400_001_vcRuntimeMinimum_x86.log 124342 11/27/2023 13:45:10
File dd_vcredist_x86_20231127134400_002_vcRuntimeAdditional_x86.log 136626 11/27/2023 13:45:11
File dd_vcredist_x86_20231127135754.log 12145 11/27/2023 13:57:58
File dd_vcredist_x86_20231127142902.log 12145 11/27/2023 14:29:07
File dd_wcf_CA_smci_20240125_011505_902.txt 7166 01/25/2024 09:15:07
File dd_wcf_CA_smci_20240125_011507_384.txt 2694 01/25/2024 09:15:07
File DMI15E0.tmp 0 11/27/2023 13:49:00
File DMI1777.tmp 0 11/27/2023 13:49:01
File DMI1F3.tmp 0 11/27/2023 14:10:01
File DMI35B.tmp 0 11/27/2023 14:10:01
File DMI4D2.tmp 0 11/27/2023 …