例如DC收到ClientCredential后并通过一系列的验证步骤后,返回STATUS_SUCCESS(0x00000000),表示认证通过,如图6-所示。 5.服务端也利用Session_key和ClientChallenge函数去计算一个ClientCredential 6.服务端对比客户端发送过来的ClientCredential,一致表示通过认证 同时在认证的整个协议包里面 图6- flag位设置为0x212fffff 综上所述,我们需要注意点2个点为: 1.客户端可以无限发送ClientCredential给服务端进行校验; 2.客户端可以关闭签名校验。 图6- IV和明文为0的运算过程 所以配合漏洞点一中的利用,我们可以通过关闭签名校验,然后发送大量的ClientCredential(0000000000000000)请求来进行验证(如图6- 所示), 图6- 发送大量ClientCredential 图6- 认证通过 利用点三:利用NetrServerPasswordSet2方法重置DC机器帐户密码 在通过认证之后,我们就可以调用RPC函数了,在漏洞的
下面给出了WindowsClientCredential的定义,从中我们可以看到真正的凭证最终保存在类型为NetworkCredential的ClientCredential属性中。 { 3: //其他成员 4: public bool AllowNtlm { get; set; } 5: public NetworkCredential ClientCredential calculatorService")) 2: { 3: NetworkCredential credential = channelFactory.Credentials.Windows.ClientCredential
任务10:第三方ClientCredential模式调用 创建一个控制台程序 dotnet new console --name ThirdPartyDemo 添加 Nuget 包:IdentityModel
calculatorService"); 12: NetworkCredential credential = channelFactory.Credentials.Windows.ClientCredential ICalculator>("calculatorService"); 19: credential = channelFactory.Credentials.Windows.ClientCredential
在构造函数中传入绑定对象构建ClientBase<T>; 在ClientBase<T>开启(调用Open方法)之前,访问如下三个只读属性:ChannelFactory、Endpoint和ClientCredential ChannelFactory, proxy2.ChannelFactory) = False 接下来,再通过实验整个在ClientBase<T>开启(调用Open方法)之前访问ChannelFactory、Endpoint和ClientCredential 我们可以得出以下两个最佳实践: 避免通过人为指定绑定对象创建ClientBase<T>对象,应该尽可能使用配置的绑定信息; 避免在ClientBase<T>开启之前读取ChannelFactory、Endpoint和ClientCredential
ICalculator>("calculatorService"); 2: NetworkCredential credential = channelFactory.Credentials.Windows.ClientCredential ChannelFactory<ICalculator>("calculatorService"); 9: credential = channelFactory.Credentials.Windows.ClientCredential ICalculator>("calculatorService"); 2: NetworkCredential credential = channelFactory.Credentials.Windows.ClientCredential ChannelFactory<ICalculator>("calculatorService"); 9: credential = channelFactory.Credentials.Windows.ClientCredential
clientId, clientSecret); } return headers; } private static String encodeClientCredential(String clientCredential ) { try { return URLEncoder.encode(clientCredential, StandardCharsets.UTF_8.toString());
ICalculator>("calculatorService"); 2: NetworkCredential credential = channelFactory.Credentials.Windows.ClientCredential ChannelFactory<ICalculator>("calculatorService"); 9: credential = channelFactory.Credentials.Windows.ClientCredential
漏洞利用: 1.欺骗客户端凭据 在于NetrServerReqChallenge交换质询调用后,客户端通过NetrServerAuthenticate3调用,并通过一个参数调用ClientCredential ComputeLogonIncredential(会话密钥)函数的值ClientStoredCredential+时间戳,ClientStoredCredential是一个递增的值,由客户端提供,在握手时初始化与ClientCredential
calculatorService"); 6: NetworkCredential credential = channelFactory.Credentials.Windows.ClientCredential ChannelFactory<ICalculator>("calculatorService"); 13: credential = channelFactory.Credentials.Windows.ClientCredential
>("calculatorService"); 4: NetworkCredential credential = channelFactory.Credentials.Windows.ClientCredential ChannelFactory<ICalculator>("calculatorService"); 15: credential = channelFactory.Credentials.Windows.ClientCredential
new AuthenticationContext(authority); var authResult = await authContext.AcquireTokenAsync(appUri, clientCredential
认证失败直接返回,认证通过向开放服务下发token,开放服务侧接入的网关插件会本地解析token,拿到用户信息并存储在请求上下文 ctx.defauth = { clientName: 'xxxx', clientCredential
ClientCredential具有一个类型为X509CertificateRecipientClientCredential的ServiceCertificate只读属性表示服证书。