Phân tích bản vá tháng 05/2021 trên Sharepoint Server 2013

Dạo này thấy các Security Researcher thi nhau public các bài viết phân tích n-day khiến cộng đồng security trong nước xôn sao. Cũng vì thế mà ae trong team dù đang rất nhiều việc cũng phải tranh thủ nhảy vào nghiên cứu bú fame cho bằng anh bằng em.

Người người phân tích Pre-Auth thì chúng tôi tạm thời phân tích Post-Auth, nhà nhà phân tích Exchange thì chúng tôi phân tích Sharepoint. Chúc anh em đọc có nhiều niềm vui và có thêm thông tin hữu ích.

1. DIFF PATCH

Sau khi tải và cài đặt Sharepoint cùng với các bản patch (phiên bản Foundation 2013 SP1), ta lấy các dll tiến hành diff. Các dll của Sharepoint hầu hết ở 3 thư mục:

  • C:\Windows\Microsoft.NET\assembly\GAC_MSIL
  • C:\Program Files\Common Files\microsoft shared
  • C:\inetpub\wwwroot\wss

Tên file đều có pattern là Microsoft.Sharepoint.*.dll. Có thể sử dụng 7zip với option regex để gom các file này một cách nhanh chóng.

7z.exe a dll.7z -r .\Microsoft.Sharepoint.*.dll

Sử dụng DNSpy export toàn bộ các file dll của cả hai phiên bản ra code C# rồi thực hiện diff bằng WinMerge. Công cụ này có sẵn filter ASP.NET Devel giúp loại bỏ các đoạn code khác nhau không quan trọng (các dòng code bị đảo vị trí hoặc thay đổi về version, …), làm quá trình diff trở nên dễ dàng hơn.

Bảng Filters trong tab Tools – Filters
Kết quả sau khi filter & diff

Có thể nhận thấy hầu như code được thay đổi tại các đoạn gọi hàm Deserialize; các thuộc tính như Binder, Resolver được bổ sung giúp cho việc thực hiện deserialize trở nên an toàn hơn trước input người dùng (chỉ cho phép chuyển đổi các đối tượng với kiểu dữ liệu quy định trước).

Đoạn mã vá lỗi BinaryFormatter trong class Microsoft.SharePoint.Portal.WebControls.ScorecardFilterValuesProviderCollectionProxy
Đoạn mã vá lỗi XmlSerializer trong class Microsoft.SharePoint.ApplicationPages.MetaWeblog.MetaWeblogPage

Các formatter chính được sử dụng là BinaryFormatterXmlSerializer. Đối với BinaryFormatter nếu không chỉ định thuộc tính Binder, ta có thể trực tiếp khai thác bằng cách đưa vào các payload độc hại. Còn XmlSerializer yêu cầu kiểu dữ liệu thích hợp, nên muốn khai thác được thì phải tùy ý điều khiển được kiểu dữ liệu đầu vào.

Các định dạng và điều kiện khai thác của từng formatter
(Blackhat USA 2017 – Friday the 13th: JSON Attacks)

Ta sẽ phân tích đoạn patch về BinaryFormatter do không có yêu cầu đặc biệt về input người dùng. Theo thông tin diff bên trên, trong file Microsoft.Sharepoint.Portal.dll, BinaryFormatter được gọi ở namespace WebControls.ScorecardFilterValuesProviderCollectionProxy vì vậy ta đi sâu hơn vào class này.

2. PHÂN TÍCH

Phân tích file Microsoft.SharePoint.Portal.WebControls.dll, ta nhận thấy BinaryFormater được gọi tới trong hàm ParseQueryString(string queryString). Hàm này thực hiện urldecode đối với query string của người dùng, sau đó decode base64 và truyền vào cho câu lệnh BinaryFormatter.Deserialize() để tiến hành chuyển đổi sang đối tượng. Trong đó giá trị của queryString chính là giá trị của tham số SCFVP trên URL.

Tiếp tục trace code, ParseQueryString() được gọi từ method OnPreRender() trong class KpiDisplayFormControlBase.

KpiDisplayFormControlBase kế thừa class System.Web.UI.UserControl, do đó KpiDisplayFormControlBase có thể được gọi trực tiếp từ một web form page (file aspx) thông qua Register.

Như vậy định hình được flow như sau:

  • Tạo một page aspx có Register gọi đến KpiDisplayFormControlBase.
  • Truy cập page aspx vừa tạo với giá trị của tham số SCFVP là payload thực hiện RCE.

Để có thể tạo được một page aspx trên Sharepoint thì user phải có quyền Add and Customize Pages. Quyền này thường được bật đối với các user trong group Farm Administrators. Request dưới đây sẽ tạo một page có tên là rce.aspx với các thuộc tính:

  • Namespace: Micrsoft.Sharepoint.Portal.WebControls
  • Assembly: Thông tin file dll của namespace trên (có thể lấy bằng DNSpy)
  • Register: Class KpiDisplayFormControlBase.

Sử dụng công cụ ysoserial.net để tạo ra payload với gadget bất kỳ mà BinaryFormatter hỗ trợ, ở đây ta chọn TextFormattingRunProperties.

Request đến page rce.aspx vừa tạo với payload trigger RCE

Lệnh calc được thực thi thành công

Credit: @dieulink81 (Member of Zepto Team)

Leave a comment

Your email address will not be published. Required fields are marked *