8
月
在社区成长 8 月
LEVEL 90
100 XP
受影响的平台: Microsoft Windows 受影响方: Windows 用户影响: 完全远程控制受感染的计算机严重级别: 高
该报告显示,威胁行为者在受感染的系统上安装了许多Web shell 服务器。在本次后续行动中,我们对其中一个名为UpdateChecker.aspx 的Web shell 服务器进行了深入分析,该服务器部署在受感染系统的Microsoft IIS(Internet 信息服务)服务器上。
2025 年全球威胁形势报告
使用此报告可以了解最新的攻击者策略,评估您的暴露情况,并在下一次攻击攻击您的环境之前确定采取行动的优先顺序。
立即下载
在这篇博客中,我们将探讨用于保护Web shell 的混淆技术、其控制命令的结构(JSON 格式)以及攻击者控制系统时命令流量的概要。我们还详细介绍了Web shell 控制受感染系统的功能。
图1: 包含经过混淆的C# 代码的ASPX 文件内容的视图。
标签%@ Page Language='C#' % 和script runat='server' 表示ASPX 文件是用C# 语言编写的,并且仅在服务器端执行,例如在Windows IIS(Internet 信息服务)服务器中。
为了更有效地分析Web shell,我们成功地对C#代码进行了反混淆,如图2所示。一些随机生成的名称已被替换为更有意义的名称。
图2: 反混淆的C# 代码。
Page_Load() 函数(如图3 所示)作为C# 脚本的入口函数,当攻击者远程向网页发送命令时会调用该函数。
图3: 入口函数-Page_Load()的显示。
下面的C# 代码片段显示,如果请求方法不是HTTP POST 或请求内容类型不是application/octet-stream,则Web shell 将返回错误页面。
图4: 攻击者和Web shell 之间的HTTP POST 流量。
根据我们的分析,body首先被加密,然后以Base64编码。如图4 所示,Wireshark 中的模拟流量捕获说明了命令如何在HTTP POST 正文中传输。发送方随后在响应数据包正文中接收结果。
对Base64编码的body数据进行解码后,得到加密的二进制数据,如图5所示。
图5: Base64 解码的帖子正文数据。
前16 个字节使用硬编码密钥加密,该密钥在Page_Load() 方法中定义。使用硬编码的密钥,我们可以解密并获得一个15 字节的密钥以及末尾的一个字节的填充。
图6: Web shell 中已解析命令数据的调试器视图。
图6是明文命令数据的实例(模块Base和请求GetBasicServerApplicationInfo)。 JSON 键和值被解析并存储在一个特殊的类中(我们将其重命名为str_obj)。
必须在任何控制命令JSON: ProtocolVersion(值为1.0)、ModuleName、RequestName 以及任何其他可选参数中包含这些键及其相应值。否则,如果缺少任何必需的密钥,Web shell 将返回一条错误消息。
我们在下表中列出了所有功能。
模块名称
请求名称
参数
基地
获取基本服务器信息
基地
获取基本服务器应用程序信息
命令外壳
执行命令
工作目录、命令
文件管理器
获取驱动器
文件管理器
获取驱动器信息
驱动器名称
文件管理器
获取Web根目录
文件管理器
获取文件系统列表
路径
文件管理器
创建目录
路径、目录名
文件管理器
复制目录
源路径、目标路径、目录名称、覆盖允许
文件管理器
移动目录
源路径、目标路径、目录名称、覆盖允许
文件管理器
删除目录
路径
文件管理器
获取目录信息
路径
文件管理器
设置目录时间
路径、CreationTimeUtc、LastModifiedTimeUtc、LastAccessTimeUtc
文件管理器
设置目录属性
路径、属性
文件管理器
创建文件
路径、文件名
文件管理器
复制文件
源路径、目标路径、允许覆盖、文件名
文件管理器
移动文件
源路径、目标路径、允许覆盖、文件名
文件管理器
删除文件
路径
文件管理器
获取文件内容
路径
文件管理器
设置文件内容
路径、文件内容、文件名
文件管理器
获取文件信息
路径
文件管理器
设置文件时间
路径、CreationTimeUtc、LastModifiedTimeUtc、LastAccessTimeUtc
文件管理器
设置文件属性
路径、属性
文件管理器
按名称搜索
路径、关键字、大小写匹配、单词匹配
文件管理器
按内容搜索
路径、文件类型、关键字、大小写匹配
文件管理器
替换文件内容
路径、文件类型、FindWhat、ReplaceWith、MatchCase、UseRegularExpression
文件管理器
获取路径分隔符
攻击者可以使用GetBasicServerInfo 请求通过Base 模块从受感染的服务器收集基本信息。结果包中包含服务器软件、服务器名称、服务器IP地址、服务器端口、操作系统名称、机器名称、用户名、运行时名称和运行时版本。
攻击者可以通过CommandShell模块和ExecuteCommand请求以IIS权限执行Windows命令。
FileManager 模块提供了管理文件和目录的全面功能,包括创建和删除文件和目录、移动或复制
背景
此分析是FortiGuard 事件响应小组(FGIR) 进行的题为“入侵中东关键国家基础设施”(完整报告在此)的调查的后续行动,该调查调查了针对中东关键国家基础设施(CNI) 的长期网络入侵。该报告显示,威胁行为者在受感染的系统上安装了许多Web shell 服务器。在本次后续行动中,我们对其中一个名为UpdateChecker.aspx 的Web shell 服务器进行了深入分析,该服务器部署在受感染系统的Microsoft IIS(Internet 信息服务)服务器上。
2025 年全球威胁形势报告
使用此报告可以了解最新的攻击者策略,评估您的暴露情况,并在下一次攻击攻击您的环境之前确定采取行动的优先顺序。
立即下载
在这篇博客中,我们将探讨用于保护Web shell 的混淆技术、其控制命令的结构(JSON 格式)以及攻击者控制系统时命令流量的概要。我们还详细介绍了Web shell 控制受感染系统的功能。
混淆的 ASPX 网页文件
Web shell 由ASPX 网页文件“UpdateChecker.aspx”驱动,其中包含一堆高度混淆的C# 代码,如图1 所示。方法名称、变量名称和类名称等可读元素是随机生成的,然后以Unicode 进行编码。此外,所有常量值(包括字符串和数字)都经过加密或编码。
图1: 包含经过混淆的C# 代码的ASPX 文件内容的视图。
标签%@ Page Language='C#' % 和script runat='server' 表示ASPX 文件是用C# 语言编写的,并且仅在服务器端执行,例如在Windows IIS(Internet 信息服务)服务器中。
为了更有效地分析Web shell,我们成功地对C#代码进行了反混淆,如图2所示。一些随机生成的名称已被替换为更有意义的名称。
图2: 反混淆的C# 代码。
Page_Load() 函数(如图3 所示)作为C# 脚本的入口函数,当攻击者远程向网页发送命令时会调用该函数。
图3: 入口函数-Page_Load()的显示。
流量分析
对Web shell 代码的分析表明,控制命令必须在HTTP POST 请求正文中发送。下面的C# 代码片段显示,如果请求方法不是HTTP POST 或请求内容类型不是application/octet-stream,则Web shell 将返回错误页面。
尝试{ if (httpRequest.HttpMethod != http_post || httpRequest.ContentType != _str_application_octet_stream) {
response_error_page(httpRequest, httpResponse);返回; }
图4: 攻击者和Web shell 之间的HTTP POST 流量。
根据我们的分析,body首先被加密,然后以Base64编码。如图4 所示,Wireshark 中的模拟流量捕获说明了命令如何在HTTP POST 正文中传输。发送方随后在响应数据包正文中接收结果。
对Base64编码的body数据进行解码后,得到加密的二进制数据,如图5所示。
图5: Base64 解码的帖子正文数据。
前16 个字节使用硬编码密钥加密,该密钥在Page_Load() 方法中定义。使用硬编码的密钥,我们可以解密并获得一个15 字节的密钥以及末尾的一个字节的填充。
图6: Web shell 中已解析命令数据的调试器视图。
图6是明文命令数据的实例(模块Base和请求GetBasicServerApplicationInfo)。 JSON 键和值被解析并存储在一个特殊的类中(我们将其重命名为str_obj)。
必须在任何控制命令JSON: ProtocolVersion(值为1.0)、ModuleName、RequestName 以及任何其他可选参数中包含这些键及其相应值。否则,如果缺少任何必需的密钥,Web shell 将返回一条错误消息。
模块和功能
Web shell 功能分为三个模块: Base、CommandShell 和FileManager。每个模块都提供多个功能(由RequestName 键指定)和一些可选参数。我们在下表中列出了所有功能。
模块名称
请求名称
参数
基地
获取基本服务器信息
基地
获取基本服务器应用程序信息
命令外壳
执行命令
工作目录、命令
文件管理器
获取驱动器
文件管理器
获取驱动器信息
驱动器名称
文件管理器
获取Web根目录
文件管理器
获取文件系统列表
路径
文件管理器
创建目录
路径、目录名
文件管理器
复制目录
源路径、目标路径、目录名称、覆盖允许
文件管理器
移动目录
源路径、目标路径、目录名称、覆盖允许
文件管理器
删除目录
路径
文件管理器
获取目录信息
路径
文件管理器
设置目录时间
路径、CreationTimeUtc、LastModifiedTimeUtc、LastAccessTimeUtc
文件管理器
设置目录属性
路径、属性
文件管理器
创建文件
路径、文件名
文件管理器
复制文件
源路径、目标路径、允许覆盖、文件名
文件管理器
移动文件
源路径、目标路径、允许覆盖、文件名
文件管理器
删除文件
路径
文件管理器
获取文件内容
路径
文件管理器
设置文件内容
路径、文件内容、文件名
文件管理器
获取文件信息
路径
文件管理器
设置文件时间
路径、CreationTimeUtc、LastModifiedTimeUtc、LastAccessTimeUtc
文件管理器
设置文件属性
路径、属性
文件管理器
按名称搜索
路径、关键字、大小写匹配、单词匹配
文件管理器
按内容搜索
路径、文件类型、关键字、大小写匹配
文件管理器
替换文件内容
路径、文件类型、FindWhat、ReplaceWith、MatchCase、UseRegularExpression
文件管理器
获取路径分隔符
攻击者可以使用GetBasicServerInfo 请求通过Base 模块从受感染的服务器收集基本信息。结果包中包含服务器软件、服务器名称、服务器IP地址、服务器端口、操作系统名称、机器名称、用户名、运行时名称和运行时版本。
攻击者可以通过CommandShell模块和ExecuteCommand请求以IIS权限执行Windows命令。
FileManager 模块提供了管理文件和目录的全面功能,包括创建和删除文件和目录、移动或复制