Khám Phá Insecure Serialization và Những Gadget Mới Trong .NET Framework (Phần 2)
Trong phần một của bài viết này, tôi đã giới thiệu cho các bạn về khái niệm Insecure Serialization cùng với một số Serialization gadget. Tiếp theo, trong bài viết này, tôi sẽ tiếp tục mang đến cho các bạn cái nhìn sâu hơn về các Deserialization gadget mới trong .NET, cũng như cách kết hợp giữa Deserialization gadget và Serialization gadget. Nếu bạn quan tâm, có thể tham khảo bài viết gốc tại đây: Bài viết gốc tại GitHub.
Các Gadget Deserialization Mới Trong .NET Framework
Trong bảng sau đây, tôi sẽ liệt kê một số gadget mới được phát hiện trong .NET framework, tuy nhiên, do giới hạn bài viết nên tôi sẽ chỉ đề cập đến hai gadget: PropertyGrid
và ComboBox
. Cả hai gadget này đều có khả năng dẫn đến việc gọi đến các getter tùy ý.
Ý Tưởng Về Gadget Gọi Getter Tùy Ý
Việc khai thác insecure serialization dựa vào việc gọi các getter trong khi quá trình deserialization lại thường gọi đến các setter. Điều này dẫn đến một câu hỏi thú vị: Nếu chúng ta tìm ra các deserialization gadget có khả năng gọi các getter tùy ý và kết hợp chúng với các serialization gadget thì sao? Trên thực tế, một gadget deserialization đã được trình bày trong bài báo "Friday the 13th JSON Attacks" của BHUSA 2017: System.Windows.Forms.BindingSource
. Tuy nhiên, gadget này có vẻ không còn khả dụng cho phần lớn các serializers hiện tại (như Json.NET) và các phiên bản mới hơn của .NET Framework.
Gadget PropertyGrid
Gadget PropertyGrid
được kích hoạt thông qua setter set_SelectedObjects
, mà chứa nhiều lệnh gọi quan trọng. Tuy nhiên, điều quan trọng ở đây là việc gọi đến method PropertyGrid.Refresh
. Dưới đây là một phần của mã nguồn thể hiện cơ chế gọi lệnh:
csharp
public object[] SelectedObjects
{
set
{
try
{
this.FreezePainting = true;
this.SetFlag((ushort)128, false);
if (this.GetFlag((ushort)16))
this.SetFlag((ushort)256, false);
...
else
this.Refresh(false);
this.SetFlag((ushort)32, false);
}
finally
{
this.FreezePainting = false;
}
}
}
Phương thức Refresh
sẽ lần lượt gọi đến tất cả các getters có thể truy cập của các đối tượng trong mảng đã cung cấp.
Gadget ComboBox
Gadget ComboBox
được kích hoạt thông qua setter set_Text
. Để khai thác gadget này, trước tiên chúng ta cần đảm bảo rằng đối tượng với getter mà bạn muốn gọi đã được thêm vào Items collection
. Sau khi thiết lập thuộc tính DisplayMember
, ta có thể gọi setter set_Text
với giá trị mà mình mong muốn.
csharp
public string GetItemText(object item)
{
if (!this.formattingEnabled)
return item == null ? string.Empty : Convert.ToString(item, CultureInfo.CurrentCulture);
...
}
Như vậy, thông qua hai gadget trên, ta có thể thực hiện các cuộc tấn công phức tạp hơn nữa.
Kết Hợp Các Gadget Để Tạo Ra Tấn Công RCE
Trong phần này, tôi sẽ bàn về việc kết hợp giữa các Getter gadget và insecure Serialization gadget có thể dẫn đến Remote Code Execution (RCE).
Kết Hợp PropertyGrid và Gadget SecurityException
Gadget SecurityException có thể dẫn đến RCE nếu ta kích hoạt được getter System.Configuration.SettingsPropertyValue.get_PropertyValue
. Kết hợp giữa Gadget PropertyGrid và SecurityException sẽ giúp ta gọi đến bất kỳ getter nào và dẫn đến việc thực thi mã độc.
Dưới đây là mẫu payload cho việc khai thác này:
json
{
"$type":"System.Windows.Forms.PropertyGrid, System.Windows.Forms, ...",
"SelectedObjects": [...]
}
Kết Hợp ComboBox và Gadget SettingsPropertyValue
Kết hợp gadget này có thể được thực hiện với nhiều serializer như JSON.NET, XamlReader. Các bước diễn ra như sau:
- Deserialize gadget SettingsPropertyValue, đặt mảng byte SerializedValue thành gadget BinaryFormatter mà kẻ tấn công xác định.
- Khi gadget SettingsPropertyValue được thêm vào ComboBox,
DisplayMember
sẽ dẫn đến việc gọi getter của gadget này, và qua đó thực thi mã độc.
Dưới đây là mẫu payload cho gadget này:
json
{
"$type":"System.Windows.Forms.ComboBox, System.Windows.Forms, ...",
"Items": [...]
}
Kết Luận
Tóm lại, bài viết đã giới thiệu một số gadget mới trong .NET framework có thể tận dụng trong các cuộc tấn công thông qua insecure serialization. Việc nắm rõ cách hoạt động và kết hợp các gadget này là rất quan trọng trong việc bảo mật ứng dụng .NET và ngăn chặn các cuộc tấn công tiềm tàng.
source: viblo