首页 科技内容详情
2022世界杯4强:Windows Defender网络检查驱动逆向剖析研究

2022世界杯4强:Windows Defender网络检查驱动逆向剖析研究

分类:科技

网址:

反馈错误: 联络客服

点击直达

Allbet Gmaing下载

欢迎进入AllbetGmaing下载(www.aLLbetgame.us),欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

,

本篇主要是先容了 Windows Defender 若何通过使用 WFP(Windows 过滤平台)在内核中实现其网络检查功效,装备工具的平安形貌符若何珍爱WFP免受潜在破绽的影响,并详细先容了我发现的一些破绽。

Windows过滤平台(Windows Filtering Platform,缩写WFP):是微软操作系统中的一套系统服务和应用程序接口,于2006年至2007年在Windows Vista中首次引入。它允许应用程序绑定到包处置环节,过滤TCP/IP协议栈的流水线数据包。WFP提供了集成通讯等功效,治理员可以将其设置为在每个应用程序的基础上挪用处置逻辑,WFP将被防火墙及其他数据包处置或毗邻监控组件挪用,如杀毒软件和家长控制软件。

就像所有逆向工程师一样,领会事物的运作方式自己就很有趣,而闭源软件的逆向会加倍令人兴奋。Windows 已经生长更新了许多版本,防病毒软件需要有质的上升。随着 Patchguard 的泛起以及对操作系统的平安性关注上升,内核钩子险些已经消逝了。然则,Windows 提供了多种方式来网络有关工具(历程、线程、文件、注册表……)的信息,例如notifications回调、过滤器、事宜……人们可能想知道 AV 驱动程序若何网络信息以及它们网络的信息类型。逆向 Windows Defender 是有价值的,由于它可能依赖于 Windows 必须提供的所有最新功效。

内核补丁珍爱(Kernel Patch Protection),PatchGuard:是Microsoft Windows 64位版本中预防对内核举行修补的一种特征。该特征2005年在Windows XP与Windows Server 2003 Service Pack 1的64位版本中首次推出。 PatchGuard:是指对Windows操作系统的焦点组件或内核本不支持的修改。这种修改没有获得微软的支持,并据微软称可能大幅降低系统的平安性、可靠性以及性能。只管微软并不推荐,但在Windows的x86版本上修补内核没有受到限制;而在Windows的x64版本中,微软选择为此行为实行分外的珍爱和手艺障碍。 由于Windows内核的设计,内核补丁珍爱并不能完全阻拦内核修补。因而这引发了对内核补丁珍爱的指斥,指责它是一种不完善的防护措施,对反病毒厂商造成的障碍跨越了其带来的利益,由于恶意软件开发者可能找到方式来绕过该措施。只管云云,内核补丁珍爱仍可防止由正当软件以不受支持方式举行的内核修补,这可能对系统的稳固性、可靠性和性能带来负面效果。

0x01 基于 WFP 的驱动程序

Windows 过滤平台允许在网络客栈的差异层设置过滤器,并提供一组厚实的功效来与流量交互:数据改动、注入、应用战略、重定向……

MSDN 页面 About Windows Filtering Platform 普遍形貌了它的所有功效以及运行方式。

1.Filter

此处剖析的驱动程序的文件版本是4.18.2102.3-0。

如前所述,网络检查驱动程序WdNisDrv严重依赖 WFP 模子。该架构异常庞大,但基本上驱动程序需要在特定层或子层上注册过滤器,指定过滤条件,然后为该过滤器提供一组称为callout的回调函数。

WFP提供了过滤器(Filter)的概率,实在现对数据的过滤。例如我们注册了一个对网络数据操作的Callout,然则我们只想对目的IP地址为A的数据包举行操作,这时就可以通过界说和注册响应的Filter,过滤出目的地址为A的数据包,Callout则只会对经由过滤后的数据包举行处置。

Callout是WFP中异常主要的数据结构,其中包罗对数据的详细操作函数,以及一个唯一标识符GUID,我们主要是通过向过滤引擎注册自己界说的Callout来实现对数据的操作。

可以通过执行以下下令dump系统受骗前设置的差异过滤器:

netsh wfp show filters

将会输出一个异常冗长的 XML 文件,其中包罗系统上的filter、callout、跳转、条理……。

有关数据包在遍历网络客栈时所经由的条理的完整列表, 可以查阅文档 TCP 数据包流。它在确立毗邻时将 TCP 标志与层映射。

在 XML 文件中搜索“windefend”时,可以检索差异层的设置。例如,当查看FWPM_LAYER_STREAM_V4层时,可以领会到windefend_stream_v4的作用是关联和注册。


标志FWP_CALLOUT_FLAG_CONDITIONAL_ON_FLOW说明上下文需要与要挪用的数据流相关联。其关联的过滤器解释,若是挪用被作废注册,它将允许流量通过,而且挪用可以阻止/允许处置数据流。它与 FWPM _ layer _ ale_flow _ established _ v4层的事情状态是一致的。


MSDN 示意该层用于在 TCP 毗邻确立时举行notifications。callout将认真确立一个“用户界说的” FLOW_CONTEXT结构,这是挪用流层callout所必须的。关联过滤器需要知足以下条件才气触发callout:

◼数据流的偏向需要向外(FWP_DIRECTION_OUTBOUND);

◼IP 协议必须是 TCP 或 UDP;

◼callout只能检查数据包,不能阻止流量(FWP_ACTION_CALLOUT_INSPECTION)。

总结一下网络检测驱动内部一个IPv4数据包的流程,当一个毗邻确立时,它会经由 FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4层。若是数据流上下文已由先行层确立,则数据包将通过流/数据报层过滤器。当关闭毗邻时,数据包通过相同的层而且流上下文被删除。在每一层,将执行一组注册到callout的回调。

2.Callout

callout 的注册是通过挪用FwpsCalloutRegister2实现的,该挪用 将FWPS_CALLOUT2_结构作为参数。它由一个与过滤器相关联的 GUID 和三个差其余回调函数组成:notify, classify 和 delete。继续传输 IPv4 数据包流,驱动程序仅为FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4注册了一个分类函数。函数原型如下:

void        FWPS_CALLOUT_CLASSIFY_FN2(
  const FWPS_INCOMING_VALUES0 *inFixedValues,
  const FWPS_INCOMING_METADATA_VALUES0 *inMetaValues,
  void *layerData,
  const void *classifyContext,
  const FWPS_FILTER2 *filter,
  UINT64 flowContext,
  FWPS_CLASSIFY_OUT0 *classifyOut
)

如前所述,该函数认真确立上下文数据流,在两个端点之间的通讯时代,该数据流上下文将与交流的数据包相关联,使用实参来填充以下结构。


FWPM_LAYER_STREAM_V4层的callout注册了 classify和delete函数。该classify函数的主要目的是确定数据包是否应该被抛弃,通过查看FLOW_CONTEXT结构的FilterFlag成员来实现。Delete 函数的主要目的是释放,释放和删除与毗邻相关的所有内容,好比 FLOW _ context。

这些函数都市为userland服务WdNisSvc确立一个要处置的notifications。这个历程由NisSrv.exe可执行文件认真,凭证收到的notifications剖析网络数据流。

3.新闻notifications

基本上,用户态服务向 WdNisDrv 驱动程序发送特定的 IOCTL 以请求毗邻notifications。驱动程序使用作废平安 IRP 行列来跟踪请求并在挪用调出时完成。毗邻notifications以header开头,然后是union,详细取决于notifications的类型。

typedef struct {
    unsigned long long CreationTime;
    unsigned long long NotificationType;
} _CONNECTION_NOTIFICATION_HEADER;
typedef struct {
    _CONNECTION_NOTIFICATION_HEADER Header;
    union {
        _FLOW_NOTIFICATION FlowNotification;
        _STREAM_DATA_NOTIFICATION StreamDataNotification;
        _ERROR_NOTIFICATION ErrorNotification;
        _FLOW_DELETE_NOTIFICATION FlowDeleteNotification;
    };
} _CONNECTION_NOTIFICATION;

例如,当确立毗邻时,该层的 classify 函数会确立以下notifications:

typedef struct {
    unsigned long long FlowHandle;
    unsigned short Layer;
    unsigned int CalloutId;
    unsigned int IpProtocol;
    unsigned char FilterFlag;
    union {
        SOCKADDR_IN IPv4;
        SOCKADDR_IN6 IPv6;
        SOCKADDR_STORAGE_LH IPvX;
    } LocalAddress;
    union {
        SOCKADDR_IN IPv4;
        SOCKADDR_IN6 IPv6;
        SOCKADDR_STORAGE_LH IPvX;
    } RemoteAddress;
    unsigned int ProcessId;
    unsigned long long ProcessCreationTime;
    unsigned char IsProcessExcluded;
    unsigned int ProcessPathLength;
} _FLOW_NOTIFICATION;

流数据notifications异常简朴,它最主要的字段是数据自己,附加到notifications和 StreamFlags成员,示意报文是出偏向照样入偏向,以及其他标志(PSH、URG)。

typedef struct {
    unsigned long long PktExchanged;
    unsigned long long FlowHandle;
    unsigned short Layer;
    unsigned int CalloutId;
    unsigned short StreamFlags;
    unsigned short IsStreamOutbound;
    unsigned int StreamSize;
} _STREAM_DATA_NOTIFICATION;

因此,在发送数据之前,服务知道哪个程序确立了毗邻以及它与哪个 IP 地址和端口通讯。然后它可以跟踪该层上发送和吸收的数据包。

我写了一个小程序,可以实时查看这些notifications。


网络了有关过滤器、callout和notifications的差异信息后,就可以领会检查驱动程序事怎么样检索网络信息以及它抓取什么样的信息来跟踪数据流。下表总结了所有差其余callouts, filters, conditions 和 flags。


0x02 设置和附加功效

1.Set/Get/Add-MpPreference

通过“Windows Security”应用程序设置 Windows Defender 时,是无法获取MpPreference的。然则,可以使用Defender PowerShell 模块接见更多设置选项。该模块由ProtectionManagement.mof形貌并在同名的 dll 中实现。Get-MpPreference用于检索当前设置,并使用Add-MpPreference和Set-MpPreference对其举行设置。


本质上,当修改设置时,会导致向驱动程序发送一个 IOCTL。例如,当清扫 IP 地址时,将SOCKADDR_STORAGE结构列表转达给驱动程序并添加到AVL 树中;然后,在确立毗邻时,将凭证AVL树检查目的地址。流程也是云云,然则为了提供更大的天真性,我们的方式略有差异。在初始化时代,在初始化时代,WdNisDrv驱动程序会注册一个回调函数,该回调将由WdFilter驱动程序通过\CallbackWdProcessNotificationCallbacknotifications。其他驱动程序通过PsSetCreateProcessNotifyRoutine实现历程notifications回调 。还会确立一个 AVL 树,而且每个历程notifications都市更新树,无论是确立、终止新历程照样更改状态。确立毗邻时,将凭证该树检查历程 ID。

2022世界杯4强www.9cx.net)实时更新比分2022世界杯4强数据,2022世界杯4强全程高清免费不卡顿,100%原生直播,2022世界杯4强这里都有。给你一个完美的观赛体验。


该模块提供了 3 个差异级其余EnableNetworkProtection参数设置网络珍爱级别。有以下枚举:Disabled、Enabled、 AuditMode。Enabled会阻止恶意的 IP 地址和域名,AuditMode不会阻止,而只是确立与本应被阻止的毗邻相关的 Windows 事宜。日志名称是“Microsoft-Windows-Windows Defender/Operational”。有趣的事宜是 1125 和 1126,它们会显示目的ip和接见它的程序,两种模式都市为用户空间服务天生毗邻notifications来举行剖析。

2.相关的 IOCTL

如前所述,可以通过使用 I/O 控制代码来设置驱动程序。这是 IOCTL 及其功效的列表:

◼0x226005 : 设置过滤状态

◼0x226009:设置历程异常(可执行路径列表)

◼0x226011:在客栈中注入数据流或数据报文

◼0x226015 : 设置 IP 地址

◼0x22A00E : 请求毗邻notifications

IOCTL 允许将数据包或数据报直接注入网络客栈。例如,若是某些数据需要注入到数据流层内部,则应打开毗邻并检索其 FlowHandle。该值与数据和数据流层的 calloutid一起通过 IRP 的输入缓冲区转达,并用于通过挪用FwpsStreamInjectAsync0来注入数据包 。下图说明晰我开发的工具在开放毗邻中的数据包注入,没有数据流notifications转达给用户空间服务。


数据报层也可以通过挪用FwpsInjectTransportSendAsync0来实现相同的 效果。

0x03 平安性剖析

1.杂乱的 ACL 机制

在初始化历程的早期,驱动程序挪用 WdmlibIoCreateDeviceSecure例程来确立装备工具。它在_DEVICE_OBJECT标志成员上设置DO_EXCLUSIVE位,之后继续在装备工具上应用平安形貌符。


unpack('< IIIII', SHA1.new("WDNISSVC".encode('utf-16le')).digest())
(3668810961, 2468724468, 4084584310, 3029221373, 430494444)

平安形貌符声明只有WdNisSvc 服务可以打开装备工具的句柄。

为了使用差其余 IOCTL,我写了一个剧本,该剧本删除了装备独占,而且只将SE_SELF_RELATIVE标志保留在平安形貌符的控制成员中。这将有用地消除对装备的任何珍爱。然则,由于装备的排他性,每当收到IRP_MJ_CLEANUP 时(很可能通过挪用 CloseHandle),驱动程序将住手过滤。

若是一直用上述机制,就无法修复我发现的以下破绽。必须使用 Windbg Preview 确立内核调试会话。然后,当加载和初始化驱动程序时,可以执行脚原本作废珍爱。

dx Debugger.State.Scripts.mod_sec.Contents.open_dev()*

2.IP 地址 exclusion 中的整数溢出

处置 IP 地址 exclusion  IOCTL 的函数需要一个 QWORD 作为计数整数,后跟一个形貌 IP 地址的SOCKADDR_STORAGE数组。


所需字节数的盘算和检查如下: (_IO_STACK_LOCATION.Parameters.DeviceIoControl.InputBufferLength < count * sizeof(sockaddr_storage) + sizeof(count))。

由于没有思量溢出,若是我们设置 count 变量的 7 个最高有用位,就可以实现溢出。然则,该计数仍然在循环中用作要插入的SOCKADDR_STORAGE的数目。现代码实验接见非映射内存页面时,这将导致蓝屏死机。

3.数据报注入中的越界读取

处置 IOCTL 的函数对输入缓冲区举行一些开端检查,以检查长度是否准确,缓冲区包罗一个“注入头”。



首先,它检查输入缓冲区是否足够大以容纳30字节长的报头结构。然后,它将头的巨细添加到头内部指定的巨细,并检查输入缓冲区的巨细是否即是或高于效果。然则,可以将此巨细字段设置为零并通过检查。在这种情形下,当挪用流注入函数时,将举行两次接见,这将导致一次越界读取:一次在注入头后面的偏移量0x1E处,另一次在偏移量0xB6处。


在调试时,可以通过查看输入缓冲区长度和举行的接见来考察破绽点。


第一次越界读取不太可能导致 BSOD。第一个值用于确定数据包是否包罗一些附加数据,而第二个值用于判断数据包的巨细。

4.通过毗邻notifications实现客栈泄露

剖析毗邻notifications的确立解释它们是由指定其类型的标头和基于它的团结组成的。这给出了一个 134 字节长的结构。确立notifications时,驱动程序使用客栈上的暂且notifications结构。然后它动态分配一块内存并用零来初始化。然则,它使用 XMM 寄存器从分配的内存中的客栈复制暂且结构。例如, _FLOW_DELETE_NOTIFICATION仅指示正在删除的流句柄,因此毗邻notifications长度为 24 字节。由于团结结构,134 个字节被分配和复制。换句话说,将 110 个分外字节从客栈复制并泄露到发送到用户空间的缓冲区。最主要的是,当完成 IRP 时,驱动程序指定巨细为 134。以下两张图片显示了显示删除毗邻notifications的程序 ,浅蓝色框中是正在泄露的客栈上的地址,对应于现实的数据流删除回调。


5.破绽验证

为了评估破绽是否真的可以被触发,我开发了一个 WinDbg Preview 剧本,此工具允许打开装备的句柄。

如前所述执行剧本后,可以使用一些选项启动该工具:

◼inject:将文件中的数据包注入到打开的毗邻中

◼notify : 显示实时毗邻notifications

◼bsod : 通过 IP 地址exclusion破绽触发整数溢出

◼ipexclu:随机天生要清扫的 IPv4 地址

inject和 notifications下令需要一些分外的步骤,在这两种情形下, EnableNetworkProtection选项都必须设置为 1 或 2,这可以通过使用治理员权限执行以下 PowerShell 下令来实现。

Set-MpPreference -EnableNetworkProtection 1

然后可以使用notifications下令运行该程序。例如,打开 Edge 浏览器时,应显示一长串notifications。

在毗邻内部测试数据包注入时,需要检索其流句柄和过滤器引擎callout ID。第二个可以通过 XML 文件检索,也可以像第一个一样通过适用程序的notifications下令检索 。

例如,假设被调试机械 A 想要向 HTTP 服务器 B 发出请求。在设置了notifications下令后,A 可以最先查询 B。可以在流确立毗邻notifications中检索流句柄。应该保持notifications下令运行,并打开另一个终端并使用带有检索到的参数的inject下令。


本文翻译自:https://blog.quarkslab.com/guided-tour-inside-windefenders-network-inspection-driver.html

发布评论