Webshell流量深入理解

Webshell流量深入理解

Webshell流量,指的是攻击者在已经获取一个Web服务器的部分权限后,通过上传的Webshell后门脚本与服务器进行交互时,所产生的网络通信数据。

首先,攻击者通过漏洞(如文件上传漏洞、SQL注入、命令注入等)将一个Webshell脚本文件(如 shell.phpbackdoor.jsp)放到了网站的目录下。这个Webshell脚本就是一个驻留在服务器上的后门

攻击者通过客户端(专用连接工具)向这个Webshell脚本发送命令,服务器就可以执行攻击者想要执行的命令。

简单来说:

Webshell流量 = 攻击者通过Web后门(Webshell)远程控制服务器时,产生的“指令”和“结果”数据流。

通过分析webshell流量,可以知道攻击者的意图和攻击手法

一般CTF中,常涉及的流量有: 中国菜刀,蚁剑,冰蝎,哥斯拉,CobalStrike(CS流量)等。

菜刀流量

菜刀流量的一个明显的特征就是,响应里可能有 ->| |<- 这样的字符串

以buuctf:菜刀666题目为例:

打开流量包追踪流:

image-20251102134054182

可以发现,在请求内容里,主要利用的是eval函数/assert函数,所有参数都经过base64编码,使用base64_decode函数。而响应内容是带 ->| |<-分隔符的

其次,如果多看几个流量,还会发现参数名上也有一些特征:参数名通常是命名为z1、z2、z3……通常 z0用于设置环境变量、z1为密码、z2为执行的命令。

这些就是菜刀流量的特征了,由于只是base64编码内容或直接呈现明文,因此流量分析过程简单。

以上题为例,追踪流很容易发现传输的文件:

image-20251102153817421

提取出图片后得到key,再解密foremost提取出的压缩包,即可得到flag

蚁剑流量

还是先介绍一下特征,以便我们如何得知这是一个蚁剑流量:

相比菜刀使用明文/弱编码(Base64),使用固定分隔符|<-,极易被waf拦截,蚁剑主要改进的功能是编码解码器。

蚁剑的默认编码/解码器:

image-20251103163938735

一. default

选择编/解码器选着default时,不对传输的Payload进行任何操作。

这里我搭建了一个文件上传靶场,传入一句话木马并抓取蚁剑的连接流量:

因为蚁剑是http 协议post请求,对http数据流进行追踪,可以找到数据交互的过程。

image-20251103172001510

可以发现payload只进行了URL编码,可以使用工具轻松解码:

image-20251103172142040

同时,我们也看到了一些特征:

  1. 蚁剑带了明显的特征函数@ini_set();
  2. 在响应的回显结果中,发现前后各有一串随机字符串(这是蚁剑为了对抗安全检测而设计的混淆手段)

二. base64编码器

请求响应流量如下:

image-20251103173652384

可以发现,当选择编/解码器选着base64时,蚁剑会将payload经过base64编码再经过URL编码后赋值给一个随机字符串

然后将这个随机字符串的值通过POST方法传入eval函数再base64解码,通过eval函数执行。

其余的特征不变,包括响应值中依旧前后会有随机的字符串:

image-20251103174039711

三. chr编码器

请求响应流量如下:

image-20251103174357217

可以发现,当编码器选择chr的时候,蚁剑会对payload的所有字符都利用利用chr函数进行转换,其余的特征均相同

四. 其它

  • chr16编码器:对payload的所有字符都利用chr函数转换,但是对chr函数传递的参数是十六进制。
  • rot13编码器:对payload中的字母进行rot13转换。
  • rspphp编码器:需要配置生成RSA生成公钥、私钥

冰蝎流量

冰蝎是一款基于Java开发的动态加密通信流量的新型Webshell客户端,冰蝎当中 shell 是通过传输协议配置的

可以看到有以下协议:

image-20251105124214340

冰蝎 4.0 通信流程如下:

密钥协商

1
2
3
1、攻击者首先通过GET或者POST传参的方法对服务器请求密钥,譬如:http://127.0.0.1/webshell.aspx?password=6

2、服务器使用生成的随机数的MD5值的前十六位当作密钥K并且存储在全局变量$_SESSION中,并且发给攻击者

加密传输

1
2
3
4
5
1、攻击者得到了密钥K,将K作为密钥进行AES128或者异或加密加密手法将执行命令发送到服务段

2、服务端得到密文之后使用K进行解密

3、将得到的执行结果使用K进行AES加密之后传回攻击者

image-20251110133125398

待更新ing……