很多人一直注重于攻,而轻视于防。
+ a* t" N7 b6 o( C) }3 x
8 S, u0 l+ T* p1 c4 g- m 攻在于创新,防在于全面。+ |( n [* Z, s/ a- @
用计算机的术语来说,攻是个单线程任务,你单核cpu频率越高,则效果愈好。防则是个多线程任务,你cpu核心越多,则效果俞佳。( }- m; [3 v7 U+ N
上面是前言,下面说webshell的查杀& ]4 k; ?0 C" L& z
; v; T2 T# ~, b9 e3 p4 L 其实和pc一样,如安卓的恶意捆绑木马和linux的恶意镜像源。一样的道路,web也要过一遍,pc端杀毒也是几个阶段。( n) v, A9 s6 R
从最初的专杀到特征码查杀再到基于行为的查杀(启发式查杀),再到最近炒得火热的云查杀。
; w- U. \( i8 r y. v* ?8 ]8 ] 说句题外话:所谓的云查杀更像是基于网络的特征码查杀。1 I3 {- m( s" M4 d
同理:服务器上的webshell查杀也需要走特征码的路线,在现在硬件水平高于网络通信带宽的情况下,特征码还是非常必要的,
; A4 G. u( T7 o; E A# }6 Y# R 接下来的就是讲webshell的特征码问题。
9 c0 ]( H, u1 c/ E& J( m2 z1 r8 v 依据pc端病毒特征码的原理:根据执行文件如PE文件,从各个段提出多个特征码进行多对一的映射定位(这个主要是为了防止类此myccl之类的过免杀),这种提取的方式有很多种,大部分高效的做法还是经验丰富的病毒分析师凭经验定位特征码。
V) z5 c# Q& D! R! X% e0 [) y* {
! c4 I" C8 m2 a+ K: B, y' e5 @. ] 如PC端病毒特征码类似,但又不尽相同,pc端的病毒是以执行文件存在的,提取特征码只是在机器码-反汇编代码的基础上进行定位的。而webshell是以源码的形式进行定位。机器码是最底层的语言,定的很死,比如我们od中常用的int3 就是0cch一一对应,不会再变。而webshell使用高级脚本语言,高级语言的写法是存在多样性,如php中的各种字符串操作函数,这无疑增加了定位特征码的难度。( c% I$ U: J- G6 I. N; p
其实,现实是这样的对于大马的查杀是相对容易的,无论php,asp,.net的大马,他们中调用的一些函数是普通脚本代码不会用到,所以可以以这些特殊函数为正则匹配规则,进行匹配。(大部分的服务器安全软件也是这样做的)当然这样做的结果,会出现误杀的情况,因此要借用多重特征码进行匹配。一些做免杀的朋友,可能就笑了,这太好过了,直接做下字符串拆分,然后在连接,或者写个加解密,再或者加混淆代码轻松就过了。4 m8 [6 B4 e4 ~- p0 R
这样理论上是对的,但是实际中忽略了电脑硬件的能力,对于2^32的运算一般配置的电脑也不会超过10秒,对于各种字符串加解密我们可以对与加解密运算的字符进行匹配,然后查杀设计要加入语义分析,如果学过编译原理的应该熟悉,对匹配到的字符串加减操作进行还原进行最终的匹配。* A0 S, S' U9 _8 z
对于一句话木马的查杀则比较麻烦,因为变异的一句话木马有些是用的web应用程序正常调用的函数,再加上些变形,查杀是比较棘手,这种查杀则需要进行大量的样本收集,对其进行特征码提取。8 d! j+ ^" d" Z0 R
特征码的提取可采用统计学中的采样方法,取一定数量的样本(包括正常样本和网马样本),对其进行异样提取,再对各类样本进行同样提取,再通过出现概率在进行添加。最终生成特征码样本。) p/ b* L; `+ \; n* f
这样基本对已知存在的一句话木马匹配到。& y( ~. j) q1 F8 m$ C8 v
对于特征码的匹配算法尚在测试中。$ D- T: T5 f3 q0 s* s1 i
7 I2 r3 t1 O; D y# k 欢迎提供更多的webshell样本. |