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.
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).
Các formatter chính được sử dụng là BinaryFormatter
và XmlSerializer
. Đố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.
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 đếnKpiDisplayFormControlBase
. - 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
: ClassKpiDisplayFormControlBase
.
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)