论坛首页 逆向工程技术区 阅读主题

[分享]对一个混淆的Web Shell脚本进行深入剖析

329 浏览 0 回复
#1 楼主 2026-06-01 21:09:08
发布地址:9b5K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2X3L8%4u0@1K9h3&6W2N6q4)9J5k6h3y4G2L8g2)9J5c8X3u0D9L8$3N6Q4x3V1k6@1K9s2u0W2j5i4c8Q4x3X3c8J5k6i4y4W2j5i4u0U0K9q4)9J5c8X3W2F1i4K6u0V1k6r3g2H3N6r3S2Q4x3X3c8S2L8X3q4D9P5i4y4A6M7#2)9J5k6r3!0X3i4K6u0V1j5h3&6Q4x3X3c8G2j5X3k6#2M7$3y4S2N6r3g2V1i4K6u0V1N6$3g2T1i4K6u0V1M7$3S2W2L8r3I4Q4x3X3c8K6j5%4u0A6M7s2b7`.发布日期:2025年7月25日发布标题:In-Depth Analysis of an Obfuscated Web Shell Script一、背景    本次分析是针对“中东关键国家基础设施被入侵事件”调查的后续工作(完整报告见此处),该调查由FortiGuard事件响应团队(FGIR)开展,旨在深入调查一起长期针对中东地区关键国家基础设施(CNI)的网络入侵事件。    报告披露,攻击者在受感染系统上部署了多个Web Shell后门。在此后续分析中,我们对其中一个名为UpdateChecker.aspx的Web Shell进行了深入剖析。该Web Shell被部署在受感染系统的Microsoft IIS(Internet 信息服务)服务器上。    在本篇博客中,我们将深入探讨用于保护该Web Shell的混淆技术、其控制命令的结构(以JSON格式组织),以及攻击者控制受感染系统时的命令通信流程。我们还将详细分析该Web Shell对受控系统所具备的各项控制能力。二、经过混淆的ASPX网页文件    该Web Shell由一个名为“UpdateChecker.aspx”的ASPX网页文件驱动,其中包含大量高度混淆的C#代码,如下图所示。所有可读的代码元素,例如方法名、变量名和类名,均被替换为随机生成的名称,并以Unicode编码形式呈现。此外,所有常量值(包括字符串和数字)也都经过加密或编码处理,进一步增加了代码的隐蔽性和分析难度。    标签 <%@ Page Language="C#" %> 和 <script runat="server"> 表明该ASPX文件使用C#语言编写,且仅在服务器端执行,例如在Windows的IIS(Internet 信息服务)服务器上运行。    为了更有效地分析该Web Shell,我们成功对C#代码进行了去混淆处理,结果如下图所示。其中,部分原本随机生成的名称已被替换为更具可读性和实际意义的名称,以便于理解和分析。
如下图所示的Page_Load()函数是C#脚本的入口函数,当攻击者远程向网页发送命令时,该函数会被调用。
三、流量分析对Web Shell代码的分析表明,控制命令必须通过HTTP POST请求的请求体(body)发送。以下C#代码片段显示,如果请求方法不是HTTP POST,或请求的内容类型(Content-Type)不是 application/octet-stream,Web Shell 将返回一个错误页面。
    if (httpRequest.HttpMethod != http_post || httpRequest.ContentType != _str_application_octet_stream) {   
       response_error_page(httpRequest, httpResponse);
        return;
    }    根据我们的分析,请求体中的数据首先经过加密,然后再进行Base64编码。如上图所示,在Wireshark中捕获的模拟流量展示了命令如何通过HTTP POST请求体进行传输。发送方随后会在响应包的响应体中接收到执行结果。    在对Base64编码的请求体数据进行解码后,我们得到了加密的二进制数据,如下图所示。这些数据需进一步解密才能还原出原始的控制命令内容。
    前16个字节使用一个硬编码的密钥进行加密,该密钥在 Page_Load() 方法中定义。通过该硬编码密钥解密后,我们可以得到一个15字节的密钥和末尾1字节的填充数据。利用这15字节的解密密钥,便可进一步解密后续的命令数据。    在加密之前,传输的命令数据及其执行结果均以JSON格式进行组织和序列化。这意味着攻击者发送的控制指令以及Web Shell返回的系统响应,都是先构造成JSON结构,再经过加密和Base64编码后进行传输。上图展示了一个明文命令数据的示例(模块为 Base,请求为 GetBasicServerApplicationInfo)。该JSON中的键值对被解析后,存储在一个特殊的类中(该类已被我们重命名为 str_obj)。在任何控制命令的JSON中,以下字段及其对应值是必须包含的:
ProtocolVersion(值为 1.0)ModuleNameRequestName
此外,还可包含其他可选参数。如果缺少上述任一必填字段,Web Shell 将返回错误信息并拒绝执行命令。这一机制确保了通信格式的规范性,同时也增加了攻击者构造合法请求的隐蔽性。
四、模块与功能该Web Shell的功能被划分为三个模块:Base(基础信息)、CommandShell(命令执行)和 FileManager(文件管理)。每个模块提供多个功能(通过 RequestName 指定),并支持若干可选参数。以下是所有功能的详细列表:模块名称请求名称参数说明BaseGetBasicServerInfo无BaseGetBasicServerApplicationInfo无CommandShellExecuteCommandWorkingDirectory(工作目录)、Command(执行命令)FileManagerGetDrives无FileManagerGetDriveInformationDriveName(驱动器名称)FileManagerGetWebRoot无FileManagerGetFileSystemsListPath(路径)FileManagerCreateDirectoryPath(路径)、DirectoryName(目录名)FileManagerCopyDirectorySourcePath(源路径)、DestinationPath(目标路径)、DirectoryName(目录名)、OverwriteAllow(是否允许覆盖)FileManagerMoveDirectorySourcePath、DestinationPath、DirectoryName、OverwriteAllowFileManagerDeleteDirectoryPath(路径)FileManagerGetDirectoryInformationPath(路径)FileManagerSetDirect

...(已截断)

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-287791.htm

暂无回复,快来抢沙发吧!

请登录后参与讨论

立即登录 注册账号