应用层下基于异常行为的未知勒索软件检测
转载地址:http://www.freebuf.com/articles/system/152387.html
墨攻安全实验室通过对国外知名主机端防护软件进行研究,发现了一个比较好的应用层的勒索软件检测方案:通过创建隐藏的诱饵文件,实时拦截对诱饵文件的加密操作,从而有效应对未知的勒索软件。
下面我们以 windows 为例,给出应用层勒索软件检测代码原型。
1. 创建诱饵文件
关键点:
a. 在每个盘的根目录、Users目录、Users/Administrator/Documents 目录创建诱饵。
b. 每次创建诱饵,都创建两个目录,一个是文件夹名按字母序能排到第一位,一个是文件夹名按字母序能排到最后一个
c. 创建的诱饵文件种类涵盖要尽量全。包括doc、 docx、 pem、jpeg等
a 点保证了勒索软件试图加密的目录里面都有诱饵。b 点则保证了无论文件夹访问顺序是正序还是逆序,诱饵文件都能被最先访问到。c 点保证了诱饵属于勒索软件感兴趣的文件。
以上诱饵文件都是隐藏文件。
2. 应用层监控文件加密操作
在windows下面,如果使用文件过滤驱动,其实很容易做到文件加密行为的拦截。但鉴于目前的安全防护现状,对大多数公司以及云厂商而言,使用驱动带来的稳定性的担忧会远远超过它带来的未知勒索软件防护这种好处。
做安全防护的都知道,宁大家都查不出来,也不能搞死用户机器啊!
如果不能找到稳定的应用层的解决方案,我们最终保卫地球、为国为民的愿望就会流产。
这部分有两个关键点:
a. 应用层文件系统监控
Windows提供了FindFirstChangeNotification 和ReadDirectoryChangesW 两种方法。参见 https://msdn.microsoft.com/en-us/library/windows/desktop/aa365261(v=vs.85).aspx。只有 ReadDirectoryChangeW才能获得具体变动的文件信息。
b. 进程拦截
此处有个蛋疼的地方在于,应用层文件系统监控发现变动的时候,我们获得的仅仅是文件名信息和变动的操作,并不能获得当前导致变动的进程信息。就是说,我们知道对哪个文件有加密行为,但是不知道是谁干的。
只能去查找哪个进程持有该变动文件的句柄。Windows下有两种方式,一种是通过NtQuerySystemInformation来查询的。一种可以通过 RestartManager来查找。
主要区别在于NtQuerySystemInformation随时会被干掉。而RestartManager是微软钦定的 api。
查找到有问题的进程,直接OpenProcess,Suspend即可。(我原来对不 hook不加驱动拦截进程操作总觉得很不解。思维定势啊)
完整代码参见https://github.com/mogongtech/RansomDetection
测试方式:
1. 找一台干净的虚拟机,我的环境是win2008。目前 RestartManager的支持是vista+,故建议环境是win7 , win2008这种。如果你要支持winxp,请将查找句柄的函数用NtQuerySystemInformation 来实现。建议你不设置网络以及共享文件夹。
2. 虚拟机里面创建以下目录,并把github上 breadcrumb目录下的蜜罐文件放进去。(别问我为啥目录是这几个,因为我硬编码的)
C:\Cversions245
C:\Xdata229
C:\Users\Acly09pk
C:\Users\Qtua
C:\Users\Administrator\Documents\Lmirror147 C:\Users\Administrator\Documents\Nsetup158
3. 编译RansomDetection代码,放到虚拟机里面运行
4. 解压github上 test 目录下的样本并运行(这是locker,不是随便造的勒索软件)