现在的位置: 首页 c/c++ >正文

驱动防护:执行过滤驱动


要从根源杜绝web服务器进程创建子进程,驱动拦截是最靠谱的方式。一般带有类似功能的都是杀软或hips(例如毛豆等),单独为了拦截执行而安装如此庞大的软件实在是不划算,同时这类软件的功能太多,对性能影响太大。

曾经有一个k8防提权驱动可以做到这一点,但其有两个缺点:

一是不分好坏直接全杀,那么会导致基于fcgi的脚本全部无法解析(例如iis+php-cgi)。同样道理,由于非预编译的.net站点在开机之后第一次访问时会进行预编译,导致重启后.net站全部挂掉。

二是只拦截w3wp.exe,无法防护apache、tomcat等其他web服务器进程的命令执行。

针对以上需求写出了这个小工具,希望对安全防护方面能起到一些作用。


注意:此工具目前处于实验性阶段,虽然在上百万次执行测试及其中的数十次重加载测试中未出现蓝屏与内存泄漏,但不保证完全没有bug。水平有限难免有疏漏的地方,只能尽力而为。

此驱动只适用于32位2003,使用前请务必再次进行测试,若发现蓝屏请将dump提交给我(回复或邮件至zcgonvh#rootkit.net.cn),我会尽量处理。


使用说明:

附件中ProcFilter.sys是已经编译好的驱动程序;ProcFilterInst.reg是白名单列表(尽量不要手动修改白名单,导入后借助注册表编辑器编辑)。

由于加载驱动实际上就是建立服务,这里偷懒直接用bat作为控制程序,其名称为ProcFilterControl.bat,命令列表如下:

安装(list.reg和ProcFilter.sys必须在同一目录):
ProcFilterControl.bat install
停止:
ProcFilterControl.bat stop
启动:
ProcFilterControl.bat start
重启:
ProcFilterControl.bat restart
卸载(请在系统重启后手动删除%systemroot%\system32\drivers\procfilter.sys):
ProcFilterControl.bat uninstall

注册表项HKEY_LOCAL_MACHINE\SOFTWARE\GMHProtectTools\ProcFilter\Processes用于存放拦截列表,键名为要拦截的程序文件名,键值为白名单,每行一个。程序文件名必须为不包含路径的文件名称(例如w3wp.exe),白名单必须为完整路径,非完整路径将忽略。

HKEY_LOCAL_MACHINE\SOFTWARE\GMHProtectTools\ProcFilter下有两个开关与一个选项:

EnableEventLog:当设置为非零时,每次触发拦截都会记录一条事件id为4的系统日志。由于记录条数可能会非常多,没有必要不要开启,默认关闭。

EnableFileLog:当设置为非零时,每次触发拦截都会记录一条系统日志,建议开启,默认开启。

LogFileDirectory:日志文件目录,必须为绝对路径,末尾不要带\。如果未找到路径,则将禁用文件日志。仅测试了本地路径,不确保网络路径能正常工作。


修改注册表后,必须重启ProcFilter才能生效。

成功初始化、初始化失败、卸载、禁用文件日志、禁用事件日志时都会记录系统日志。

文件日志以当前日期保存于日志目录,其内容类似于:

2014-12-20    13:25:10    w3wp.exe    C:\WINDOWS\system32\net.exe
2014-12-20    13:25:22    w3wp.exe    \\192.168.223.250\sysvol\nc.exe
2014-12-20    13:25:34    w3wp.exe    C:\Documents and Settings\Administrator\桌面\procexp.exe


工具测试过程:

虚拟机windows2003配置双机调试模式,实体机开启windbg监视

将w3wp.exe设为要过滤的进程,将whoami加入其白名单,拷贝一个cmd.exe为w3wp.exe,打开三次,分别执行:

for /l %i in(1,0,1) do net
for /l %i in(1,0,1) do whoami
for /l %i in(1,0,1) do \\192.168.223.250\sysvol\nc.exe

用于模拟非白名单程序、白名单程序、远程调用程序。

打开一个正常的cmd,执行:

for /l %i in(1,0,1) do net

打开cmd,右键点击此cmd的任务栏,选择属性。将布局->屏幕缓冲区大小->高度后面加个0,确定退出。在这个cmd中打开poolmon,向下直到找到tag为None的行,监视其内核内存消耗(默认Tag为None或Wdm,由于系统自己的内存也用了这个名字所以需要减去一些,倒数第三列为当前内存占用)。


测试结果:

加载驱动程序后,不定期地卸载->重加载(测试同步)、修改系统时间(为了测试凌晨零点更换日志文件),三个多小时后的结果如图:

文件日志70M,总计一百万条以上;poolmon未检测到驱动自己申请内存的泄露,占用最高的Obtb为系统自己的对象表,停止测试并关闭三个w3wp后恢复正常;windbg未捕获到任何断点/异常;在此过程中系统一切正常,重启后驱动正常生效,iis未受影响。


下载:      ProcFilter.zip

百度网盘: http://pan.baidu.com/s/1kTkkywB

解压密码见注释。