WFP网络过滤驱动分析报告

基本信息

样本名称 qsafd_vw_1_10_0_20.sys
样本类型 Rootkit
样本大小 56.38 KB (57728 bytes)
MD5 D615E94389B927888FDCDE7D2F36BF4C

简介

该Rootkit样本是一个基于WFP框架的网络过滤驱动,在特定的网络分层中设置过滤器,对特定网络数据进行过滤。

样本详细分析

初始化

初始化派遣函数

通过memcpy设置驱动的派遣函数,将所有的派遣函数都设置为subMajorFunction_140004748,如图:

image-20200703201424104

函数subMajorFunction_140004748根据接受到IRP请求,进行相应的操作,由于缺少R3程序,这里便没有详细分析具体的派遣函数操作。

image-20200703201833804

初始化设备对象和设备符号链接

创建名为\Device\CtrlSM的设备对象,创建名为\DosDevicse\CtrlSM的设备符号链接,如图:

image-20200703202257655

初始化卸载函数

卸载函数释放自旋锁,设备对象和符号链接,释放分配的内存池等,如图:

image-20200703202512519

检测过滤器状态

调用函数FwpmBfeStateGet0检测过滤器的运行状态:

  • 当过滤器处于正在运行,便执行主要过滤函数submain_1400026A0;

  • 当过滤器没有正在运行,便执行函数FwpmBfeStateSubscribeChanges0,当过滤器引擎状态发生改变便调用subCallbackmain_1400077A8函数(与submain_1400026A0相同)

image-20200703204413132

主要过滤行为

开启过滤引擎

先通过函数ExUuidCreate初始化25个UUID(UUID用来唯一标识提供者、子层、Callout),然后在调用函数FwpmEngineOpen0开启过滤引擎,如图:

image-20200703205703744

添加名为NFSDK Provider的Provider,然后再通过submainFwpsCalloutRegister2_1400028E8函数注册Callout,以及submainFwpmFilterAdd0_140001008函数添加Filter,如图:

image-20200704124341034

注册Callout

先调用FwpmTransactionBegin0开启过滤设置,然后再调用subFwpsCalloutRegister2_14000284C函数来注册Callout,一共注册了22个callout,如图:

image-20200704142251282

注册完后,当过滤器命中设置好的规则后(后面会添加过滤规则),便会执行上图中classifyFn1函数,对相应网络数据进行过滤。由于一共注册了22个callout,其中大多需要实际网络环境才能触发,调试起来比较麻烦;静态也有很多结构体指针的使用,因此短时间内无法将每个callout所执行的行为完全分析清楚。

检测杀软

通过查看驱动注册表项,来检测杀软的网络过滤驱动是否存在,如图:

image-20200704151535750

添加子层

通过调用函数FwpmSubLayerAdd0分别添加NFSDK Sublayer子层和NFSDK Recv Sublayer子层,并根据检测杀软的结果来修改子层的权重(权重值决定过滤的优先级),如图:

image-20200704152444483

添加Callout和Filter

通过调用函数subFwpmFilterAdd0_140001420将之前注册的22个Callout添加到WFP过滤引擎中,并在成功添加Callout后再添加包含相应规则的Filter。

image-20200704153418804

函数subFwpmFilterAdd0_140001420,先通过函数FwpmCalloutAdd0添加Callout,当添加Callout成功后便在通过函数FwpmFilterAdd0向系统添加一个新的过滤器对象,如图:

image-20200704160727584

其中上图中的FWPM_FILTER_CONDITION0_结构定义了需要满足什么条件时过滤条件成立。具体结构如下:

1
2
3
4
5
typedef struct FWPM_FILTER_CONDITION0_ {
GUID fieldKey; //GUID
FWP_MATCH_TYPE matchType; //指定要执行的匹配类型
FWP_CONDITION_VALUE0 conditionValue; //一个FWP_CONDITION_VALUE0结构,其中包含与该字段匹配的值。
} FWPM_FILTER_CONDITION0;

总结

该样本是一个典型的基于WFP框架开发的恶意Rootkit,对受害主机的特定网络数据包进行过滤,来实施恶意操作。该样本包含正常的文件签名,并且会检测系统中的安全软件进行对抗,一般难以发现。因此在日常使用中用户应注意辨别恶意软件。