ModSecurity技巧:使用ssdeep检测Webshell
最新版本的ModSecurity增加了ssdeep检测webshell的接口,于是猛地回忆起搞客户端安全(游戏安全)的时候买过一本书《恶意软件分析诀窍与工具箱-对抗“流氓”软件的技术与利器》,这本书就提到了用ssdeep来查找恶意软件(webshell是恶意软件的一种,安全领域是互通的嘛)。本文介绍如何使用它来检测webshell。
一 、安装ssdeep
下载ssdeep并安装 http://ssdeep.sourceforge.net/
tar zxvf ssdeep-2.12.tar.gz
cd ssdeep-2.12
./configure
make
make install
二、识别webshell实例
接下来我们下载一个webshell,试一试如何使用ssdeep来识别webshell
以b374k.php为例
首先获得webshell b374k.php的ssdeep hash(fuzzy hashing)值,并存储到b37_hashs.txt文件中
ssdeep -b webshell/b374k.php >b37_hashs.txt
cat b37_hashs.txt
ssdeep,1.1--blocksize:hash:hash,filename
384:UsaSwsF3RtJhwhxY5janx0Rig5xJx52FRsBU0ipgFHF3xR:44snx0Rig5x752EBUxpc5,"b374k.php"
然后使用这个值来获得相似度,相似度为100(当然啦,因为没有做任何修改)
ssdeep -bm b37_hashs.txt webshell/b374k.php
b374k.php matches b37_hashs.txt:b374k.php (100)
为了方便理解,我们拿ssdeep与md5做类比
md5 webshell/b374k.php
MD5 (webshell/b374k.php) = b8d3f0f9ad8b1083f24072f8cfe13e04
我们知道对文件取md5值是用于验证文件的完整性的,因为它对任意的修改都能感受到(hash碰撞小概率事件除外),而ssdeep则用于计算文件相似度,它是通过计算上下文相关的分段hash值(fuzzy hashing)来判断文件相似度的。在识别webshell的场景中,我们可以先获取样本的ssdeep hash值,然后设置相似度范围,来识别同一系列的变形shell。想想一个小白黑客获得一个好用的webshell后,第一件事会干嘛?肯定是改变登录账号密码。
cp webshell/b374k.php webshell/b374k.php.bak
vim webshell/b374k.php.bak
想雁过留痕的,估计还会改webshell的title等文本来标记到此一游。
心思稍微重点的想绕过WAF的童鞋,说不定还会修改cookie中的关键字,例如批量替换cookie txtauth关键字。
修改完毕后,分别用md5与ssdeep来看发生了什么。
md5 webshell/b374k.php.bak
MD5 (webshell/b374k.php.bak) = b8d3f0f9ad8b1083f24072f8cfe13e04
md5值发生了变化,说明webshell文本内容发生了变化;接着使用ssdeep来查看修改后的webshell的相似度
ssdeep -bm b37_hashs.txt webshell/*
b374k.php matches b37_hashs.txt:b374k.php (100) #原始webshell
b374k.php.bak matches b37_hashs.txt:b374k.php (97)#修改了登录账号与作者标记
b374k.php.bak2 matches b37_hashs.txt:b374k.php (88)#修改了登录账号、作者标记、cookie特征
最后,我们选择一个合适的相似度来判断是否为webshell(真实场景中,调参找到合适的阈值才是考验人的活...)。
例如,只筛选相似度90以上的
ssdeep -t 90 -bm b37_hashs.txt webshell/*
b374k.php matches b37_hashs.txt:b374k.php (100)
b374k.php.bak matches b37_hashs.txt:b374k.php (97)
三、扩展
除了使用ssdeep来查找相似的恶意软件(静态文本),我们还可以逆向思维,根据相似度来判断混在正常进程中的恶意进程,依据是进程在运行时由于变量变化而发生的变动是轻微的,而代码被加壳后的的变化是相当显著的,例如UPX加壳会使相似度瞬降到0%。
参考:
http://blog.spiderlabs.com/2014/11/modsecurity-advanced-topic-of-the-week-detecting-malware-with-fuzzy-hashing.html
《恶意软件分析诀窍与工具箱-对抗“流氓”软件的技术与利器》
微博http://weibo.com/tanjiti 博客http://danqingdani.blog.163.com/ github https://github.com/tanjiti 豆瓣http://www.douban.com/people/tanjiti/
[作者/碳基体,本文属于FreeBuf.COM独家发布文章,未经许可禁止转载]
- Java中String、StringBuffer、StringBuilder的区别
- 一条全表扫描sql语句的分析 (r4笔记第32天)
- Mybatis【缓存、代理、逆向工程】
- 关于db_files和maxdatafiles的问题(r4笔记第31天)
- 了解一下CPU 第一篇(r4笔记第30天)
- Java中的String类能否被继承?为什么?
- Mybatis【与Spring整合】
- 使用logon trigger完成动态的session跟踪(r4笔记第29天)
- struts2关于action拦截器使用方法 现记录如下
- Struts2【入门】
- 通过ORA错误反思sql语句规范(r4笔记第41天)
- 算法01 七大排序之:冒泡排序和快速排序
- 自下向上的编写容易阅读的代码(上)
- Hibernate【inverse和cascade属性】知识要点
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 利用cutree划分pheatmap聚类结果
- 使用Mfuzz进行转录组表达模式聚类分析
- 使用PopLDdecay快速进行连锁不平衡分析
- 报错坑 | LDSC安装报错怎么解决?
- 看看斯坦福大学是如何教学生编程的
- 安全框架shiro入门示例
- maven导入jar包到本地仓库
- Python-matplotlib 空间栅格数据可视化
- 图解面试题:如何找到喜欢的电影?
- Java agent 与 byte buddy
- 关于TRTC云端混流的踩坑分享
- 聊聊dubbo-go的ConsistentHashLoadBalance
- R语言用WinBUGS 软件对学术能力测验(SAT)建立分层模型
- R语言使用随机技术差分进化算法优化的Nelson
- R语言用神经网络改进Nelson-Siegel模型拟合收益率曲线分析