Brief CVE description
Lỗ hổng CVE-2023-29357 cho phép kẻ tấn công bỏ qua xác thực, leo thang đặc quyền trên các hệ thống sử dụng SharePoint. Lỗ hổng tồn tại bên trong method ValidateTokenIssuer do không thực hiện chính xác việc xác minh signature của JWT token. Các phiên bản bị ảnh hưởng: < 16.0.10399.20005. Advisory:- https://msrc.microsoft.com/update-guide/vulnerability/CVE-2023-29357
- https://www.zerodayinitiative.com/advisories/ZDI-23-882/
Mitigation
- Upgrade lên phiên bản mới nhất của SharePoint.
- Bật tính năng AMSI integration và sử dụng Windows Defender.
Analysis
Thêm enumMissingAlgorithm
vào để coverage các trường hợp token đưa vào bị thiếu algorithm.

ReadToken
của class SPJsonWebSecurityBaseTokenHandler
và gọi đến SPAuthenticationAlgorithmValidator.ValidateAlgorithm
.

ValidateAlgorithm
tiếp tục gọi đến method HasValidAlgorithm
để kiểm tra giá trị alg
trong phần JWT header.

ValidateTokenIssuer
. Bản patch thêm vào đoạn code gọi đến method SPClaimsUtility.IsEnableOldHashedProofTokenFormat
.


ValidateTokenIssuer
.

none
và làm một điều gì đó có liên quan đến JWT issuer (giá trị của iss
trong JWT token).
Để kiểm tra authentication, SharePoint lấy giá trị tại 2 vị trí: GET param prooftoken
/header X-PROOF_TOKEN
và header Authorization
.


ver
: giá trị phải làhashedprooftoken
.nbf
vàexp
: là giá trị thời gian hiện tại và thời gian hết hạn của JWT tokenaud
vàiss
: là giá trị audience và issuer, mà ở đây bắt buộc phải là00000003-0000-0ff1-ce00-000000000000
. Giá trị00000003-0000-0ff1-ce00-000000000000
là Application ID cho Office 365 SharePoint Online, mặc dù giá trị này cũng có thể sử dụng được ở các phiên bản SharePoint on-premise. [caption id="attachment_15906" align="aligncenter" width="2000"]Source: https://learn.microsoft.com/en-us/troubleshoot/azure/active-directory/verify-first-party-apps-sign-in#application-ids-of-commonly-used-microsoft-applications[/caption]
realm
: Giá trị này được leak bằng cách gửi 1 request đến API với giá trị token trong headerAuthorization
là bất kì.
SharePoint App
.


SharePoint App
nhưng mục đích của lỗi là ta cần impersonate được account farmadmin.
Liệt kê các user có quyền trên Site hiện tại bằng endpoint /_api/web/siteusers
.

nameid
trong proof token.
Proof token lúc này của ta như sau:

Specified method is not supported
.

SPApplicationPrincipalName.CreateFromString
.

applicationPrincipleName
hiện tại của ta không có kí tự @
nên không thể split để array2.Length
bằng 2
được.
[caption id="attachment_15915" align="alignnone" width="2000"]
SPAppRequestContext.Current
có giá trị hay không, nếu có thì sẽ gọi đến SPAppRequestContext.Current.ClientId
⇒ SPApplicationPrincipalName.CreateFromString
như ảnh stack trace ở trên.

SPAppRequestContext.Current
là null
thì sẽ không gọi đến ClientId
nữa.
Sau một thời gian debug, mình nhận thấy rằng method SPAppRequestContext.InitCurrent
sẽ thực hiện nhiệm vụ gán giá trị cho SPAppRequestContext.Current
.Trong này gọi đến method SPApplicationRequestHelper.IsApplicationRequest
để check request được gửi đến có phải là 1 “application request” hay không.


spincomingOAuthIdentityType
với 2 constants là SPIncomingOAuthIdentityType.UserAndApplication
và SPIncomingOAuthIdentityType.ApplicationOnly
. Chỉ cần request của mình không thỏa 2 điều kiện này thì SPAppRequestContext.Current
sẽ là null
.
Để spincomingOAuthIdentityType
không bằng hai giá trị trên, ta xét method SPIncomingTokenContext.SetIdentityType
, method này sẽ dựa trên proof token mình gửi lên để quyết định token của mình là User hay Application.

isuser
trong proof token của mình có giá trị là true
, mình có thể làm cho giá trị của claimsIdentity.Actor
bằng null
và không nhảy vào đoạn code bên trong câu lệnh if.

SPIncomingTokenContext.IsProofToken
bên dưới, method này kiểm tra field tt
trong proof token, nếu không tồn tại field này thì sẽ bỏ qua và trả về false
.

IdentityType
trở thành UserOnly
mà không phải UserAndApplication
hay ApplicationOnly
nữa.

SPApplicationRequestHelper.IsApplicationRequest
là false
và set app request context cho null
.





6562 lượt xem