动态检测webshell

检测原理

“假动态”和“真动态”。 这里真假动态均为个人理解。

假动态是指会模拟执行样本代码,这里模拟执行,应该是指解释执行代码,但又不是真的执行。例如 1+1,在模拟执行之后会得到2,但是例如 f(1) +1,f是一个系统内置函数,如果没有很好的对f做解释执行的话,那这个模拟执行的结果就不准确。系统有那么多内置函数,假动态如果要做到准确,成本实现非常之高,但如果不做准确,在面对样本中的动态操作时,效果较差。

真动态的话,就是是真的会执行样本代码,与病毒检测类似,有一个动态执行的沙箱,可参考阿里云的《云环境下恶意脚本检测的最佳实践》。这里具体如何实现的由于未参与过,也无从知道。但是从测试的效果来看,如果样本中都是“确定”的数值变量,不那么动态的,那么这个沙箱检测可以成功检测得出。

关于这个实现原理,个人猜想是hook了指定的危险函数,能实时监测内存……等等,反正我不会…

绕过“真动态”

这次aliyun第四届恶意文本检测webshell,绕了四个,撞了一个,三个有效。记录下绕过的思路。

1. 探测沙盒

测试发现

  1. 编码对动态的沙盒无效,编码也是php代码,对解释引擎自然是无效的
  2. 在无限循环或者其他超长超大字符、数组情况下,沙盒表现为超时、或者正常
  3. 暴力的污点传播模式,内置的不可信函数的返回值不可信,即污点

2. Bypass

刚看了活动规则….“不得公开绕过技巧及样本”

一言以蔽之——用魔法打败魔法,用动态打败动态,动态条件、动态调用、动态变量、动态函数……