前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Windows 防火墙 RPC 过滤器的工作原理

Windows 防火墙 RPC 过滤器的工作原理

作者头像
Khan安全团队
发布2022-01-18 10:01:06
1.1K0
发布2022-01-18 10:01:06
举报
文章被收录于专栏:Khan安全团队

Windows 防火墙可以限制对 RPC 接口的访问。这很有趣,因为人们对 RPC 重新产生了兴趣,尤其是PetitPotam技巧。例如,您可以使用使用netsh命令运行的以下脚本来阻止对EFSRPC接口的任何访问。

代码语言:javascript
复制
rpc
filter
add rule layer=um actiontype=block
add condition field=if_uuid matchtype=equal data=c681d488-d850-11d0-8c52-00c04fd90f7e
add filter
add rule layer=um actiontype=block
add condition field=if_uuid matchtype=equal data=df1941c5-fe89-4e79-bf10-463657acf44d
add filter
quit

此脚本添加了两条规则,它们将阻止对 UUID 为 c681d488-d850-11d0-8c52-00c04fd90f7e和 df1941c5-fe89-4e79-bf10-463657acf44d的 RPC 接口上的任何调用。这些对应于两个 EFSRPC 接口。

这在防火墙的上下文中是如何工作的?Windows 过滤平台的内核组件是否有内置的 RPC 协议解析器来阻止连接?那太复杂了,相反,一切都是由一些特殊层在用户模式下完成的。如果您使用NtObjectManager的防火墙Get-FwLayer命令,您可以通过过滤IsUser属性来检查注册为在用户模式下运行的图层。

代码语言:javascript
复制
PS> Get-FwLayer | Where-Object IsUser
KeyName                      Name
-------                      ----
FWPM_LAYER_RPC_PROXY_CONN    RPC Proxy Connect Layer
FWPM_LAYER_IPSEC_KM_DEMUX_V4 IPsec KM Demux v4 Layer
FWPM_LAYER_RPC_EP_ADD        RPC EP ADD Layer
FWPM_LAYER_KM_AUTHORIZATION  Keying Module Authorization Layer
FWPM_LAYER_IKEEXT_V4         IKE v4 Layer
FWPM_LAYER_IPSEC_V6          IPsec v6 Layer
FWPM_LAYER_IPSEC_V4          IPsec v4 Layer
FWPM_LAYER_IKEEXT_V6         IKE v6 Layer
FWPM_LAYER_RPC_UM            RPC UM Layer
FWPM_LAYER_RPC_PROXY_IF      RPC Proxy Interface Layer
FWPM_LAYER_RPC_EPMAP         RPC EPMAP Layer
FWPM_LAYER_IPSEC_KM_DEMUX_V6 IPsec KM Demux v6 Layer
  • FWPM_LAYER_RPC_EP_ADD - 过滤进程创建的新端点。
  • FWPM_LAYER_RPC_EPMAP - 过滤对端点映射器信息的访问。
  • FWPM_LAYER_RPC_PROXY_CONN - 过滤与 RPC 代理的连接。
  • FWPM_LAYER_RPC_PROXY_IF - 通过 RPC 代理过滤接口调用。
  • FWPM_LAYER_RPC_UM - 过滤对 RPC 服务器的接口调用

这些层中的每一层都可能很有趣,您可以通过netsh为所有层添加规则。但我们将只关注 FWPM_LAYER_RPC_UM 层是如何工作的,因为这是一开始介绍的脚本使用的那个。如果在添加 RPC 过滤规则后运行以下命令,可以查看新创建的规则:

代码语言:javascript
复制
PS> Get-FwFilter -LayerKey FWPM_LAYER_RPC_UM -Sorted | Format-FwFilter
Name       : RPCFilter
Action Type: Block
Key        : d4354417-02fa-11ec-95da-00155d010a06
Id         : 78253
Description: RPC Filter
Layer      : FWPM_LAYER_RPC_UM
Sub Layer  : FWPM_SUBLAYER_UNIVERSAL
Flags      : Persistent
Weight     : 567453553048682496
Conditions :
FieldKeyName               MatchType Value
------------               --------- -----
FWPM_CONDITION_RPC_IF_UUID Equal     df1941c5-fe89-4e79-bf10-463657acf44d


Name       : RPCFilter
Action Type: Block
Key        : d4354416-02fa-11ec-95da-00155d010a06
Id         : 78252
Description: RPC Filter
Layer      : FWPM_LAYER_RPC_UM
Sub Layer  : FWPM_SUBLAYER_UNIVERSAL
Flags      : Persistent
Weight     : 567453553048682496
Conditions :
FieldKeyName               MatchType Value
------------               --------- -----
FWPM_CONDITION_RPC_IF_UUID Equal     c681d488-d850-11d0-8c52-00c04fd90f7e

如果您阅读了我的一般博客文章,那么输出应该是有意义的。FWPM_CONDITION_RPC_IF_UUID 条件键用于指定要匹配的接口的 UUID FWPM_LAYER_RPC_UM 有许多可能的字段可供过滤,您可以通过检查图层对象的Fields属性来查询这些字段。

代码语言:javascript
复制
PS> (Get-FwLayer -Key FWPM_LAYER_RPC_UM).Fields

KeyName                              Type      DataType
-------                              ----      --------
FWPM_CONDITION_REMOTE_USER_TOKEN     RawData   TokenInformation
FWPM_CONDITION_RPC_IF_UUID           RawData   ByteArray16
FWPM_CONDITION_RPC_IF_VERSION        RawData   UInt16
FWPM_CONDITION_RPC_IF_FLAG           RawData   UInt32
FWPM_CONDITION_DCOM_APP_ID           RawData   ByteArray16
FWPM_CONDITION_IMAGE_NAME            RawData   ByteBlob
FWPM_CONDITION_RPC_PROTOCOL          RawData   UInt8
FWPM_CONDITION_RPC_AUTH_TYPE         RawData   UInt8
FWPM_CONDITION_RPC_AUTH_LEVEL        RawData   UInt8
FWPM_CONDITION_SEC_ENCRYPT_ALGORITHM RawData   UInt32
FWPM_CONDITION_SEC_KEY_SIZE          RawData   UInt32
FWPM_CONDITION_IP_LOCAL_ADDRESS_V4   IPAddress UInt32
FWPM_CONDITION_IP_LOCAL_ADDRESS_V6   IPAddress ByteArray16
FWPM_CONDITION_IP_LOCAL_PORT         RawData   UInt16
FWPM_CONDITION_PIPE                  RawData   ByteBlob
FWPM_CONDITION_IP_REMOTE_ADDRESS_V4  IPAddress UInt32
FWPM_CONDITION_IP_REMOTE_ADDRESS_V6  IPAddress ByteArray16

过滤器有很多潜在的配置选项。您可以根据通过接口验证的远程用户令牌进行过滤。或者,您可以根据身份验证级别和类型进行过滤。这可以让您保护 RPC 接口,以便所有调用者都必须在 RPC_C_AUTHN_LEVEL_PKT_PRIVACY级别使用 Kerberos。 

无论如何,配置它对我们来说并不重要,您可能想知道它是如何工作的,因为试图找到绕过它的方法的第一步是知道这个过滤层在哪里处理(注意,我没有找到绕过,但你永远不知道)。 

由于 RPC 协议的复杂性,过滤是通过RpcRtRemote扩展 DLL 在 RPC 服务器进程内实现的,这也许并不令人意外。除 RPCSS 外,默认情况下不加载此 DLL。相反,仅当存在 WNF_RPCF_FWMAN_RUNNING WNF 状态的值时才会加载它。下图是用netsh添加两条 RPC 过滤规则后的状态。

代码语言:javascript
复制
PS> $wnf = Get-NtWnf -Name 'WNF_RPCF_FWMAN_RUNNING'
PS> $wnf.QueryStateData()

Data ChangeStamp
---- -----------
{}             2

如果 WNF 值发生更改,RPC 运行时会设置订阅以加载 DLL。加载后,RPC 运行时将注册所有当前接口以检查防火墙。在安全回调的正常处理过程中调用接口时会检查过滤规则。运行时将调用 RpcRtRemote 中的 FwFilter函数,传递有关防火墙接口调用的所有详细信息。过滤器调用仅适用于 DCE/RPC 协议,而不适用于 ALPC。它也只会在调用者是远程的时候被调用。如果调用是通过 TCP 来的,情况总是如此,但对于命名管道,只有当管道是通过 SMB 打开时才会调用它。

在这里,我们最终可以确定如何处理 RPC 过滤器。FwFilter函数构建与FWPM_LAYER_RPC_UM层的字段列表相对应的防火墙值列表, 并将它们与层的数字 ID一起传递给 FwpsClassifyUser0 API。此 API 将枚举该层的所有过滤器并应用返回分类的条件检查,例如阻止或许可。基于此分类,RPC 运行时可以允许或拒绝调用。 

为了使过滤器可以访问以进行分类,RPC 服务器必须具有 对引擎的 FWPM_ACTRL_OPEN访问权限和对过滤器的FWPM_ACTRL_CLASSIFY访问权限。默认情况下,Everyone组具有这些访问权限,但是 AppContainers 和可能的其他沙箱没有。然而,一般来说,AppContainer 进程不倾向于创建特权 RPC 服务器,至少任何远程攻击者会发现有用的服务器。您可以使用Get-AccessibleFwObject命令检查对各种防火墙对象 的访问。

代码语言:javascript
复制
PS> $token = Get-NtToken -Filtered -Flags LuaToken
PS> Get-AccessibleFwObject -Token $token | Where-Object Name -eq RPCFilter

TokenId Access             Name
------- ------             ----
4ECF80  Classify|Open RPCFilter
4ECF80  Classify|Open RPCFilter

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
多因子身份认证
多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档