2018/12/20

MatesCTF S3R2 - Simple Death Note - Web

Cuộc sống quanh tôi gói gọn trong những câu hỏi. Làm gì, ở đâu, khi nào, làm thế nào, cái gì. Mỗi khi tôi muốn kể một điều gì đó là tôi lại tự hỏi, bắt đầu từ đâu?
Bắt đầu từ đâu để giải quyết được cái đề bài này?

#1. Lang thang đi tìm cách Debug


Tôi có một tật xấu là luôn tìm cách debug để hiểu chương trình, điều này khiến tôi chậm chạp trong mọi tình huống. Có một lần khi tham gia 1 cuộc diễn tập mã độc quy mô khu vực, ban đầu các đội tham gia sẽ có 1 mẫu malware viết bằng js. Pha 1, nhiều chuyên gia ở các công ty lớn đã nhanh chóng thực thi trong môi trường sandbox để xác định hành vi và có được các domain C&C. Còn tôi thì vẫn đang mày mò cách mà chương trình thực thi. Các pha tiếp theo sẽ trả lời các yêu cầu, forensic, ... Và chỉ đến pha cuối thì việc tôi ngồi debug mã mới có tác dụng lấy được DGA, và các thứ ẩn dấu bên trong.

Vậy thì Debug thế nào? Tôi cũng tiếp xúc với nhiều loại file từ trước, exe, dll, elf, mach-o, so.., mỗi loại đều có điểm giống và khác nhau. Có lẽ thời gian chơi CTF ở mảng Misc, Forensic đã gíup tôi khá nhiều.
Bằng chút ngoại cảm, tôi đoán Web + DLL => ASP.NET ? (có thể dùng Detect It Easy, hay PEiD, ... )
Sử dụng 1 công cụ reverse .net assembly khá ổn là dnSpy để decompile ra source C#

Đọc code thì cũng khá ít, chỉ đáng chú ý là có hẳn 1 method để viết flag vào HttpResponse, tôi hiểu là nếu chạy được method này thì có flag. 1 Action handler CreateNote_click chứa code nhiều hơn các chỗ khác. Bằng ngoại cảm có vẻ không có lỗi nào lấy flag một cách dễ dàng chỉ cần 1 bước.
Kinh nghiệm đi pwn các server chạy .net (oh, trời ơi tin được không, dù tôi không biết tí lập trình asp.net nào nhưng mà tôi vẫn pwn được đấy :v magic) thì từ mã nguồn các đoạn code server side sẽ được compile thành file dll để tăng tốc xử lý. Và cái file web04.dll này chính là đoạn xử lý phía server, còn các thành phần râu ria css, js, html (aspx) thì không được gửi kèm.
Tôi thích debug php, python (các thứ interpreter, plaintext) hơn là java và .net bởi 2 thằng enterprise này luôn phải dùng đến một công cụ thứ 3 để làm việc debug dễ dàng hơn, chủ yếu là biến binary -> source code.
Trường hợp này cũng không ngoại lệ, single binary. No fuck given. Tôi cũng thử google xem có cách nào chạy tạo được 1 con server dùng mỗi file này hay không, nhưng không tìm thấy. Và tôi cũng phải resolve 1 vài dependency cho giống với server.
Cách 2: đi tìm 1 mã nguồn gần giống mà tôi có thể thay đổi một chút để trở thành web04.dll
Tôi nghĩ chắc người dev cái bài này cũng lười giống tôi nốt, thế nên tôi sử dụng chính các keyword trong binary như App_start (failed), ViewSwitch (OK), Site_Mobile (failed), CreateNote_Click (failed)
Và tìm được 1 con hàng gần giống https://blogs.msdn.microsoft.com/webdev/2013/12/19/building-a-basic-web-forms-application-using-visual-studio-2013/ (updated)
Download từ link github trong bài https://github.com/balaTest/BlogPosts/commits/master.
Source này dùng Visual Studio để build, nhưng tôi thì rất ngại cài VS, bởi nó yêu cầu tài nguyên vượt quá giới hạn máy tôi.
Sự lựa chọn tối ưu của tôi là :
- SharpDevelop
Sau đó chỉnh chỉnh 1 tí, fix các bug bằng google thần chưởng, và tốn cả buổi sáng để ngồi setup, học cách code C#, cài thư viện, kết hợp với skill Rờ Em (crack phần mềm dạo và một số lần tham dự các giải Flare-on, PAN) thì tôi đã có một source chạy ngon. Sau đó đơn giản là Add thư mục sau khi build xong vào IIS, cấu hình các thứ magic magic để có một server ok



Load WebFormsNoAuth.dll từ thư mục /bin vào dnSpy:
Cũng khá giống với web04, nếu cần thay đổi gì thì chỉ cần rebuild lại là được. Các cấu hình khác không cần thay đổi nhiều.

Trước khi giải thì có nhiều người sploi trước đây là dạng .NET deserialize.
Trước đây thì tôi cũng đã từng trải nghiệm qua việc khai thác lỗi deserialize ở PHP, Java. Còn lần .NET này thì là lần đầu, mặc dù tôi cũng đọc tin về loại tấn công này từ BlackHat.

#2. PoC

JsonConvert.DeserializeObject là method của Newtonsoft.Json có thể có lỗi khai thác được.
Đi tìm PoC, "exploit .net deserialize" hiện ngay hàng đầu tiền đạo : https://github.com/pwntester/ysoserial.net
Và trong repo này có chứa đủ thông tin references, tôi sẽ đọc slide, rồi whitepaper, các thứ để tìm poc,
https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf

Đâu đó trong slide có nói đến các thư viện bị lỗi
Và thực chất Json.Net chính là Newtonsoft.Json \m/

Copy-paste xem có chạy được không (ở đây tôi không Base64 encode/decode nữa. Truyền thẳng giá trị vào) :? Không có calc.exe hiện lên một cách ma thuật. Kèm theo đó là error log.

Chỉ có thông báo lỗi thôi chứ không có calc.exe /m\
Puck ! Như vậy là Type cần phải giống với yêu cầu là lớp Kills


Nhìn lại class Kills một chút, tại sao property tagobject mà không phải là int để rồi phải cast sang int một lần nữa :?

Hmm. Thử "cho vào trong" xem sao. Một lần nữa cũng không có magic gì cả :/
Không muốn debug mà tiếp tục đọc paper

Vì khá dốt Engrisk nên tôi chỉ đọc qua qua, kiểu như là cái ObjectDataProvider này rất đa dụng, có thể gọi được các method public chỉ cần Method Name + Parameter và Object Instance. Liên hệ lại method void catFlag thì tôi nghĩ nó là đáp án cuối.
Thử đã, xong rồi breakpoint debug chi tiết vào Json.NET sau. Chỉnh lại $type, MethodName, ObjectInstance, và tenten
{"tag":{"$type":"System.Windows.Data.ObjectDataProvider,PresentationFramework","MethodName":"catFlag","ObjectInstance":{"$type":"WebFormsNoAuth.App_Start.Helper, WebFormsNoAuth"}}}
Đối với web04.dll thì cần đổi namespace chút.

/Peace

Link src & exploit:
https://mega.nz/#!uTB31Kqb!x_ZFnN1O2wojEV4_bCaTtJ6mfeCp27w8xzaEvfYnwg8

No comments:

Post a Comment