Theo các chuyên gia, 4 lỗ hổng được khai thác trong chiến dịch tấn công có chủ đích có định danh: CVE-2021-26855 (Mail Exchange Pre-Auth SSRF), CVE-2021-26857 (Post-Auth Deserialization), CVE-2021-26858 (Post-Auth arbitrary file write) và CVE-2021-27065 (Post-Auth arbitrary file write).
DIFF PATCH
Các entrypoint được sử dụng đều có dạng: “/ecp/x.js”. Điều đặc biệt của cuộc tấn công là chỉ với 1 request tới 1 file chưa từng tồn tại trên server, tin tặc có thể trigger được SSRF và gửi full request tới server backend.
Phiên bản để nghiên cứu là Microsoft Exchange Server 2016 CU 18 vá lỗ hổng định danh CVE-2021-26855. Phiên bản thực hiện để diff với patch mới nhất là bản patch được release ngay trước đó 2020 Dec Patch - KB4593465
Thông tin về bản Microsoft Exchange Server 2016 thử nghiệm để phân tích lỗ hổng
Bên trong các file update này có chứa các file binary/dll sẽ được patch, hoàn toàn có thể giải nén tất cả ra bằng nhiều công cụ (bài báo này dùng công cụ 7zip).
Giải nén Microsoft Exchange Server 2016
Các file dll được giải nén đa phần được viết bằng dotNet. Do đó, để tiếp tục phát triển sử dụng dnSpy để (giải nén) decompile tất cả file dll này ra dạng .cs và sử dụng cho việc diff sau đó.
Để decompile tất cả file dll, người dùng cần import vào dnSpy và chọn “Export to Project”.
Lưu ý rằng trong setting của dnspy, phần decompiler cần bỏ tick mục “Show tokens, RVA …” để bỏ qua các comment về địa chỉ, RVA… gây cản trở cho việc diff sau này.
Việc decompile sẽ tốn khoảng 30 phút cho cả 2 bản vá. Tuy nhiên, do quá trình decompile sẽ có một số lỗi xảy ra hoặc là một số string mà developer để lại, cần phải dọn dẹp gọn gàng lại một lần nữa trước khi diff, dưới đây là một ví dụ:
Quá trình diff cũng khá mất thời gian do có nhiều byte rác vẫn còn lại trong code.
Lỗ hổng CVE-2021-26855
Việc phát hiện lỗ hổng được thực hiện bằng diff, thay vì các challenge spotthebugs được phổ biến trên Internet. Sau khi diff, phát hiện ra có một vài thay đổi quan trọng tại dll: Microsoft.Exchange.FrontEndHttpProxy.
Tại BEResourceRequestHandler, method ShouldBackendRequestBeAnonymous() được thêm mới.
BEResourceRequestHandler là class sẽ được dùng vào việc handle các request có dạng resource (các file có đuôi .js, .css…). Việc xác định class này có thể handler request được hay không dựa vào method BEResourceRequestHandler.CanHandle().
Đầu tiên là sẽ kiểm tra sự tồn tại của một cookie đặc biệt với method GetBEResouceCookie(). Method này sẽ lấy và trả về giá trị cookie “X-BEResource”
Tiếp sau đó, BEResourceRequestHandler.IsResourceRequest() sẽ kiểm tra xem URL request có đuôi dạng các file resource hay không.
Giá trị “X-BEResource” sau đó tiếp tục được truyền vào BackEndServer.FromString() để xác định BackEnd Server cho request này.
BackEndServer.FromString() xử lý cookie X-BEResource như sau
Để thỏa mãn các điều kiện trên thì X-BEResource sẽ có dạng như sau:
X-BEResource=EXCHANGE2016~1942062522;
Tại ProxyRequestHandler.BeginProxyRequest() sẽ gọi tới GetTargetBackEndServerUrl() để xác định uri sắp được forward tới Method GetTargetBackEndServerUrl() có nội dung như sau:
Nội dung của đoạn này có chức năng xây dựng lại url sẽ chuyển tiếp vào backend. Trong đó, Host của request được xác định bằng BackEndServer.Fqdn, kết hợp với BEResourceRequestHandler phía trên, giá trị BackEndServer.Fqdn này lại có thể điều khiển được bằng cookie X-BEResource.
Bằng sự kết hợp ngẫu nhiên, lỗ hổng SSRF CVE-2021-26855 ra đời. Để khai thác cần chỉnh sửa cookie thành dạng:
X-BEResource=EXCHANGE2016/owa/auth/logon.aspx?a=~1942062522;
Sau khi được xử lý qua ProxyRequestHandler, url cuối cùng được forward tới Backend có dạng như sau:
Như vậy là đã có thể gửi request tới server Backend mà không bị cản trở. Việc quyết định request qua proxy có cần xác thực (Authenticated) hay không được quyết định tại ProxyRequestHandler.PrepareServerRequest().
Với trường hợp các request được xử lý bởi class BEResourceRequestHandler, luồng chương trình sẽ thực thi vào nhánh else cuối cùng, nghĩa là cho phép Authenticated.
Chính điều này khiến lỗ hổng SSRF trở nên đặc biệt hơn. Hãng Microsoft đã khắc phục lỗ hổng này bằng cách thêm method ShouldBackendRequestBeAnonymous() vào class BEResourceRequestHandler để không cho phép các request này được gửi cred vào backend.
Luồng đi của 1 request trên Exchange server có dạng như sau:
Lỗ hổng CVE-2021-27065
Nghiên cứu về log tấn công từ một số bài phân tích, có thể thấy tin tặc sử dụng tính năng ResetOAB trong Exchange admin center để ghi file.
Để khai thác lỗ hổng này, đầu tiên tin tặc sẽ cần một tài khoản Admin mail exchange, sau đó sửa param External URL trong Exchange admin > Servers > Virtual Directories.
Sau khi đã cài đặt tham số “External URL”, tiến hành sử dụng tính năng ResetOABVirtualDirectories và nhập path của file cần ghi.
Sau khi thực hiện, file sẽ được ghi vào đường dẫn đã định sẵn với nội dung có thể điều khiển tùy ý.
Như vậy là đã có thể ghi shell tùy ý, lỗ hổng CVE-2021-27065 này không quá khó khăn để phát hiện và thực thi. Phần tiếp theo của bài báo sẽ giới thiệu về sự kết hợp hoàn hảo giữa các lỗ hổng bảo mật.