飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 188|回复: 5

[溯源取证] 对一个混淆的Web Shell脚本进行深入剖析

[复制链接]
  • TA的每日心情
    开心
    2019-3-15 11:00
  • 签到天数: 262 天

    [LV.8]以坛为家I

    发表于 前天 14:43 | 显示全部楼层 |阅读模式

    发布地址:https://www.fortinet.com/blog/threat-research/in-depth-analysis-of-an-obfuscated-web-shell-script
    发布日期: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编码形式呈现。此外,所有常量值(包括字符串和数字)也都经过加密或编码处理,进一步增加了代码的隐蔽性和分析难度。
    1.png


        标签 <%@ Page Language="C#" %> 和 <script runat="server"> 表明该ASPX文件使用C#语言编写,且仅在服务器端执行,例如在Windows的IIS(Internet 信息服务)服务器上运行。

        为了更有效地分析该Web Shell,我们成功对C#代码进行了去混淆处理,结果如下图所示。其中,部分原本随机生成的名称已被替换为更具可读性和实际意义的名称,以便于理解和分析。
    2.png

    如下图所示的Page_Load()函数是C#脚本的入口函数,当攻击者远程向网页发送命令时,该函数会被调用。
    3.png
    三、流量分析

    对Web Shell代码的分析表明,控制命令必须通过HTTP POST请求的请求体(body)发送。

    以下C#代码片段显示,如果请求方法不是HTTP POST,或请求的内容类型(Content-Type)不是 application/octet-stream,Web Shell 将返回一个错误页面。

    1. try {
    2.     if (httpRequest.HttpMethod != http_post || httpRequest.ContentType != _str_application_octet_stream) {   
    3.        response_error_page(httpRequest, httpResponse);
    4.         return;
    5.     }
    复制代码
    4.png

        根据我们的分析,请求体中的数据首先经过加密,然后再进行Base64编码。如上图所示,在Wireshark中捕获的模拟流量展示了命令如何通过HTTP POST请求体进行传输。发送方随后会在响应包的响应体中接收到执行结果。

        在对Base64编码的请求体数据进行解码后,我们得到了加密的二进制数据,如下图所示。这些数据需进一步解密才能还原出原始的控制命令内容。
    5.png
        前16个字节使用一个硬编码的密钥进行加密,该密钥在 Page_Load() 方法中定义。通过该硬编码密钥解密后,我们可以得到一个15字节的密钥和末尾1字节的填充数据。利用这15字节的解密密钥,便可进一步解密后续的命令数据。

        在加密之前,传输的命令数据及其执行结果均以JSON格式进行组织和序列化。这意味着攻击者发送的控制指令以及Web Shell返回的系统响应,都是先构造成JSON结构,再经过加密和Base64编码后进行传输。
    6.png
    上图展示了一个明文命令数据的示例(模块为 Base,请求为 GetBasicServerApplicationInfo)。该JSON中的键值对被解析后,存储在一个特殊的类中(该类已被我们重命名为 str_obj)。

    在任何控制命令的JSON中,以下字段及其对应值是必须包含的:

    1. ProtocolVersion(值为 1.0)
    2. ModuleName
    3. RequestName
    复制代码

    此外,还可包含其他可选参数。如果缺少上述任一必填字段,Web Shell 将返回错误信息并拒绝执行命令。这一机制确保了通信格式的规范性,同时也增加了攻击者构造合法请求的隐蔽性。

    四、模块与功能
    该Web Shell的功能被划分为三个模块:Base(基础信息)、CommandShell(命令执行)和 FileManager(文件管理)。每个模块提供多个功能(通过 RequestName 指定),并支持若干可选参数。
    以下是所有功能的详细列表:
    模块名称请求名称参数说明
    Base
    GetBasicServerInfo

    Base
    GetBasicServerApplicationInfo

    CommandShell
    ExecuteCommand
    WorkingDirectory(工作目录)、Command(执行命令)
    FileManager
    GetDrives

    FileManager
    GetDriveInformation
    DriveName(驱动器名称)
    FileManager
    GetWebRoot

    FileManager
    GetFileSystemsList
    Path(路径)
    FileManager
    CreateDirectory
    Path(路径)、DirectoryName(目录名)
    FileManager
    CopyDirectory
    SourcePath(源路径)、DestinationPath(目标路径)、DirectoryName(目录名)、OverwriteAllow(是否允许覆盖)
    FileManager
    MoveDirectory
    SourcePath、DestinationPath、DirectoryName、OverwriteAllow
    FileManager
    DeleteDirectory
    Path(路径)
    FileManager
    GetDirectoryInformation
    Path(路径)
    FileManager
    SetDirectoryTime
    Path(路径)、CreationTimeUtc(创建时间)、LastModifiedTimeUtc(最后修改时间)、LastAccessTimeUtc(最后访问时间)
    FileManager
    SetDirectoryAttributes
    Path(路径)、Attributes(属性)
    FileManager
    CreateFile
    Path(路径)、FileName(文件名)
    FileManager
    CopyFile
    SourcePath、DestinationPath、OverwriteAllow、FileName
    FileManager
    MoveFile
    SourcePath、DestinationPath、OverwriteAllow、FileName
    FileManager
    DeleteFile
    Path(路径)
    FileManager
    GetFileContent
    Path(路径)
    FileManager
    SetFileContent
    Path(路径)、FileContent(文件内容)、FileName(文件名)
    FileManager
    GetFileInformation
    Path(路径)
    FileManager
    SetFileTime
    Path、CreationTimeUtc、LastModifiedTimeUtc、LastAccessTimeUtc
    FileManager
    SetFileAttributes
    Path、Attributes
    FileManager
    SearchByName
    Path、Keyword(关键词)、MatchCase(区分大小写)、MatchWord(全词匹配)
    FileManager
    SearchByContent
    Path、FileTypes(文件类型)、Keyword、MatchCase
    FileManager
    ReplaceFileContent
    Path、FileTypes、FindWhat(查找内容)、ReplaceWith(替换内容)、MatchCase、UseRegularExpression(是否使用正则表达式)
    FileManager
    GetPathSeparator



    (一)功能说明:
    1、Base 模块
    攻击者可通过 GetBasicServerInfo 请求获取受控服务器的基础信息,返回内容包括:

    1. 服务器软件(如 IIS 版本)
    2. 服务器名称
    3. 服务器IP地址和端口
    4. 操作系统名称
    5. 主机名(Machine Name)
    6. 当前用户名
    7. 运行时环境名称(如 .NET)
    8. 运行时版本
    复制代码

    GetBasicServerApplicationInfo 可进一步获取Web应用程序相关信息。
    2、CommandShell 模块
    通过 ExecuteCommand 请求,攻击者可在服务器上以IIS进程权限执行任意Windows命令,实现远程命令执行,例如运行 ipconfig、whoami、net user 等系统命令,甚至下载并执行恶意载荷。
    3、FileManager 模块
    该模块提供完整的文件系统管理能力,功能强大,包括:

    获取磁盘驱动器列表和信息
    浏览目录结构,读取文件内容
    创建、删除、复制、移动文件和目录
    修改文件/目录的时间戳和属性(用于隐藏痕迹)
    按文件名或内容搜索文件(支持大小写和正则匹配)
    替换指定文件中的内容(可用于篡改网页或配置文件)
    获取路径分隔符(适配不同系统环境)

    这些功能使攻击者能够全面控制受感染服务器的文件系统,进行持久化驻留、横向移动或数据窃取。

    综上所述,该Web Shell虽然经过高度混淆,但具备结构清晰、功能全面的特点,是一个高度隐蔽且功能强大的后门工具,对关键基础设施系统构成严重威胁。


    五、演示

    我们开发了一个Python脚本,用于模拟攻击者向Web Shell发送命令,以便进行测试和分析。在本节中,我们将展示几个控制命令的实际示例。脚本输出包括发送给Web Shell的命令数据以及命令执行后的响应结果。为便于理解其功能,以下仅展示明文格式的命令及其返回结果。

    1. 使用 Base 模块的 GetBasicServerApplicationInfo 请求获取服务器应用信息:

    发送的命令(明文JSON):
    7.png

    2. 使用 CommandShell 模块的 ExecuteCommand 请求执行 whoami Windows 命令:
    8.png
    3. 使用FileManager模块执行一些文件操作:
    9.png
    在C:\目录下使用CreateDirectory请求创建了一个名为test的文件夹。  
    在该新文件夹内使用CreateFile请求创建了一个名为test.txt的文件。
    Hi Fortinet!(Base64编码),作为FileContent键的值发送,被写入该文件。该请求为SetFileContent。
    接下来,它使用GetFileContent请求从文件test.txt中读取内容,以验证所有内容是否创建正确。
    最后,它使用相应的DeleteFile和DeleteDirectory请求删除了创建的文件和文件夹。
    10.png
    上图显示了创建的文件夹(C:\test)和文件(test.txt)的详细信息,包括文件内容,其中文件的所有者为DefaultAppPool,这是IIS服务使用的身份。
    六、总结
        本次后续分析深入剖析了一个名为 UpdateChecker.aspx 的Web Shell后门。该文件采用了高度复杂的代码混淆技术,旨在逃避安全分析与检测,其C#代码中的类名、方法名、变量名均被随机化并以Unicode编码,关键字符串和常量也被加密或编码,极大增加了人工分析难度。
        我们详细解析了攻击者与该Web Shell之间的通信机制:控制命令通过HTTP POST请求体传输,内容类型必须为 application/octet-stream;命令数据以JSON格式组织,经过加密和Base64编码后发送;服务器响应同样遵循相同格式,返回执行结果。
        通过编写自定义Python脚本模拟攻击行为,我们验证了该Web Shell的强大功能,包括:

    1. 获取服务器基础信息(如系统、IIS、.NET版本等)
    2. 以IIS进程权限执行任意系统命令(如 whoami)
    3. 全面的文件与目录管理能力(浏览、创建、删除、复制、搜索、修改内容等)
    4. 文件属性与时间戳篡改(用于隐藏痕迹)
    复制代码


    这些功能表明,该Web Shell是一个功能完备、隐蔽性强的远程控制后门,一旦被部署在关键系统上,可能造成数据泄露、服务中断或进一步的横向渗透。
    (一)安全建议
    我们建议广大用户:
    1. 及时更新所有安全设备的病毒库和IPS规则;
    2. 定期审查服务器目录,排查未知或可疑的 .aspx、.php 等脚本文件;
    3. 限制IIS应用池权限,避免使用高权限账户运行Web服务;
    4. 启用日志审计,监控异常HTTP请求(如POST请求中包含加密载荷);
    复制代码



    (二)威胁情报标识(IOC)
    样本 SHA-256:
    1. A841C8179AC48BDC2EBF1E646D4F552D9CD02FC79207FDC2FC783889049F32BC
    2. (文件名:UpdateChecker.aspx)
    复制代码

    评分

    参与人数 1威望 +2 飘云币 +2 收起 理由
    飞天 + 2 + 2 感谢发布原创作品,PYG有你更精彩!

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2024-7-27 18:35
  • 签到天数: 598 天

    [LV.9]以坛为家II

    发表于 前天 15:48 | 显示全部楼层
    样本在那呢?
    A841C8179AC48BDC2EBF1E646D4F552D9CD02FC79207FDC2FC783889049F32BC

    解密失败, 请检查sha256值是否正确!
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-1-13 20:56
  • 签到天数: 1993 天

    [LV.Master]伴坛终老

    发表于 前天 23:29 | 显示全部楼层
    谢谢提供分享学习一下
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-1-13 20:56
  • 签到天数: 1993 天

    [LV.Master]伴坛终老

    发表于 前天 23:29 | 显示全部楼层
    谢谢提供分享学习一下
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-1-14 13:49
  • 签到天数: 393 天

    [LV.9]以坛为家II

    发表于 昨天 14:31 | 显示全部楼层
    PYG有你更精彩!
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-1-14 16:50
  • 签到天数: 1592 天

    [LV.Master]伴坛终老

    发表于 昨天 21:41 | 显示全部楼层
    感谢大佬分享学习
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表