CVE-2023-29357它允许攻击者绕过身份验证并升级权限,是一个影响SharePoint使用的漏洞。由于未正确验证 JWT 令牌的签名,该漏洞存在于 ValidateTokenIssuer 方法内部。
受影响的版本为:小于16.0.10399.20005。
相关公告:
在SPJsonWebSecurityBaseTokenHandler类中添加MissingAlgorithm枚举,以覆盖传入的令牌缺少算法的情况。
重写ReadToken方法,并调用SPAuthenticationAlgorithmValidator.ValidateAlgorithm。
ValidateAlgorithm继续调用HasValidAlgorithm方法来检查JWT中的alg的值。
ZDI的公告中也描述了该漏洞存在于ValidateTokenIssuer方法中。补丁代码添加了调用SPClaimsUtility.IsEnableOldHashedProofTokenFormat方法的代码段。
调用堆栈到ValidateTokenIssuer:
基于以上信息,可以用该算法制作 JWT 令牌并执行与 JWT 发行者( JWT 令牌 none 值)相关的操作。
为了进行身份验证,SharePoint会从以下两个位置获取令牌: GET param prooftoken/headerX-PROOF_TOKEN和 header Authorization。
该令牌需要具有以下值:
图片来源:https://learn.microsoft.com/en-us/troubleshoot/azure/active-directory/verify-first-party-apps-sign-in#application-ids-of-commonly-used-microsoft-applications
在尝试使用上述格式发送JWT后,SharePoint识别出当前用户是“SharePoint App”。
虽然用户已经成功认证SharePoint App,但该漏洞的目的是我们需要冒充farmadmin账户。使用/_api/web/siteusers端点列出当前站点上具有权限的用户。
为了模拟其他账户,我们需要修改proof token中的nameid字段.此时,我们的proof token如下所示:
在使用新令牌进行请求后,进程报错Specified method is not supported。
进行调试找出原因,异常在SPApplicationPrincipalName.CreateFromString方法中显现。
主要原因是我们当前的值applicationPrincipleName没有@字符,因此无法拆分成长度为2的数组。
根据堆栈跟踪定位到SPApplicationPrincipalName.CreateFromString方法
从堆栈跟踪向上追溯一点,SharePoint会检查SPAppRequestContext.Current是否有效,如果有效,则调用SPAppRequestContext.Current.ClientId SPApplicationPrincipalName.CreateFromString,如上面的堆栈跟踪截图所示。
因此,只需要将SPAppRequestContext.Current的值设置为null,就不会再调用ClientId了。
经过一段时间的调试,我发现SPAppRequestContext.InitCurrent方法负责给SPAppRequestContext.Current赋值。其中调用了SPApplicationRequestHelper.IsApplicationRequest方法来检查发送的请求是否是“应用程序请求”。
该方法如下:
在这里,我们只需要关注spincomingOAuthIdentityType两个常量SPIncomingOAuthIdentityType.UserAndApplication和SPIncomingOAuthIdentityType.ApplicationOnly进行比较。只要我们的请求不符合这两个条件,SPAppRequestContext.Current就是null。
为了使spincomingOAuthIdentityType不等于上述两个值,我们需要关注SPIncomingTokenContext.SetIdentityType方法。该方法通过我们发送的proof token来确定我们的token是用户还是应用程序。
经过一段时间的调试,我们发现当我的proof token中的isuser字段的值为true时,可以将claimsIdentity.Actor的值设置为null,从而不进入if语句的内部代码块。
然后,程序继续执行到下面的SPIncomingTokenContext.IsProofToken方法,该方法检查proof token中的tt字段,如果该字段不存在,则跳过并返回false。
因此,我们成功将IdentityType设置为UserOnly而不是UserAndApplication或ApplicationOnly。
此时,SPApplicationRequestHelper.IsApplicationRequest的返回值为false,app请求上下文设置为null。
至此认证已经成功。
目前的proof token是:
在使用新的令牌重新尝试后,结果如下:
成功模拟farmadmin账户后,我们可以继续利用CVE-2023-24955来RCE,这个漏洞我会在下一篇博文中写到。
翻译自:https://sec.vnpt.vn/2023/08/phan-tich-cve-2023-29357-microsoft-sharepoint-validatetokenissuer-authentication-bypass-vulnerability/
页面更新:2024-03-31
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号