THÔNG TIN KĨ THUẬT CHI TIẾT
Ngày nay,
các tài liệu văn bản được sử dụng rất thường xuyên trong việc trao đổi thông
tin giữa nhiều người (cá nhân, doanh nghiệp, v...v..) và do vậy, đây
cũng chính là một trong những hướng tấn công (attack vector) phổ biến
nhất hiện nay.
Theo quan
sát của chúng tôi, các tài liệu chứa mã độc này được sử dụng rất nhiều như một
cách thức để tấn công có chủ đích vào các tổ chức hoặc người dùng cuối, qua đó
làm bàn đạp để khai thác/tấn công các mục tiêu kế tiếp tùy theo mục đích
của kẻ tấn công. Các tài liệu này thường tận dụng các tính năng có sẵn (cho
phép chèn VBA code độc hại) hoặc lợi dụng các lỗ hổng bảo mật trong quá
trình xử lý tài liệu của các ứng dụng như Microsoft Office (Word, Excel,
PowerPoint) và PDF reader (Adobe Acrobat, Foxit Reader, ...) để lây
nhiễm mã độc vào máy của nạn nhân.
![]() |
Nguồn: https://www.kaspersky.com/blog/ms-office-vulnerabilities-sas-2019/26415/ |
Đặc biệt,
trong các cuộc tấn công thực tế hiện nay (thông qua spam/phishing mail),
các tài liệu chứa Macro độc hại vẫn tiếp tục là một trong những hướng chính để
tiếp cận mục tiêu của kẻ tấn công và thường đạt hiệu quả cao vì bằng phương
pháp này có thể vượt qua (bypass) nhiều lớp phòng thủ trong hệ thống mà
thông thường chỉ có hiệu lực trong việc ngăn chặn các tập tin thực thi độc lập
(standalone file). Hơn thế nữa, các phần mềm diệt virus truyền thống (Anti-Virus
- AV) thường vẫn chưa đạt hiệu quả trong khả năng phân biệt giữa tài liệu
hợp lệ và tài liệu chứa mã độc, do việc này làm ảnh hưởng khá nhiều tới tới
hiệu năng của phần mềm AV.
Trong khuôn khổ của bài viết
này, chúng tôi tổng hợp và phân tích một số kĩ thuật phổ biến, thường gặp của
mã độc Macro và các hành động mà chúng tạo ra trong quá trình tương tác với hệ
thống.
1. Kết hợp Macro với PowerShell hoặc các LOLBins
Các Macros được viết bằng ngôn ngữ VBA (Visual Basic for Applications), ngôn
ngữ này có đầy đủ tính năng cho phép truy cập sâu vào hệ thống. Dựa vào khả
năng này, kẻ tấn công sẽ xây dựng các đoạn mã lệnh nhằm mục đích đơn giản là tải
xuống và thực thi payload đã tải về trực tiếp từ chính tiến trình của
Office. Các đoạn mã này thường sẽ dựa vào PowerShell và các LOLBins (thuật ngữ Living-off-the-land binary ám chỉ
các tập tin binary được cung cấp bởi chính hệ điều hành cho các mục đích hợp lệ
tuy nhiên lại bị lạm dụng bởi các tác nhân độc hại) khác nhau. Mặc dù, các Marco/PowerShell
thường được kẻ tấn công sử dụng kĩ thuật làm rối (obfuscate) rất kĩ, tuy nhiên những hành vi bất thường của chúng có
thể dễ dàng bị phát hiện bởi các giải pháp EDR tiên tiến hiện nay.
Ví dụ điển hình cho kĩ thuật này là dòng mã độc Emotet. Emotet là một Trojan chủ yếu
lây lan qua các email spam (malspam).
Nạn nhân bị nhiễm có thể thông qua script độc hại; tệp tài liệu chứa macro hoặc
liên kết độc hại. Theo thống kê từ ANYRUN,
dòng mã độc này luôn chiếm vị trí đầu trong bảng xếp hạng:
![]() |
Sample được chúng tôi sử dụng minh họa có SHA-256:
fdd6288747eb976a863966935b7800b1ed839ded3fe15dfa039a2c6f68b940b5. Thông thường,
các sample của Emotet mở ra sẽ có nội dung tương tự như sau:
Khi người dùng nhấn vào nút “Enable Content” thì hành động nhấn vào nút này cũng đồng nghĩa với
việc thực thi một file không rõ nguồn gốc (không
khác gì nhấn đúp chuột vào file thực thi). Mã macro của sample này sử dụng
kĩ thuật mã hóa và thay thế kí tự để qua mặt các giải pháp bảo vệ cũng như làm
khó cho người phân tích:
Tiến hành phân tích toàn bộ code trên, sau khi được giải
mã nó sinh ra một cmd và sau đó thực thi mã powershell:
Sử dụng các công cụ theo dõi tiến trình hệ thống sẽ thấy
được điểm bất thường dễ nhận ra của các tiến trình cha/con liên quan tới
Winword.exe. Rõ ràng, từ mã macro ban đầu được thực thi bởi winword.exe sẽ sinh
ra tiến trình cmd.exe. Từ cmd.exe sẽ khởi chạy tiến trình powershell.exe:
Toàn bộ câu lệnh powershell cũng đã được kẻ tấn công
áp dụng kĩ thuật làm rối như trên hình. Bằng cách cấu hình Powershell-enhanced-logging,
người phân tích có thể lấy được nội dung ban đầu của đoạn mã powershell. Đoạn
mã powershell sau khi deobfuscated sẽ thực hiện một vòng lặp đơn giản để lặp
qua nhiều tên miền nhằm tải xuống và thực hiện payload thứ hai. Tên của payload
này được tạo ngẫu nhiên.
2. Đánh lừa tiến trình cha/con
Có thể thấy ở kĩ thuật trên, các tiến trình lạ sẽ được
khởi chạy dưới vai trò là tiến trình con của các ứng dụng Microsoft Office. Dựa
vào dấu hiệu bất thường này mà các giải pháp phòng thủ tiên tiến có thể dễ dàng
phát hiện và đưa ra cảnh báo. Do vậy, kẻ tấn công thường sẽ tìm mọi cách để làm
sao có thể thực thi được payloads bằng cách lẩn tránh khỏi việc phát hiện thông
qua kĩ thuật sinh tiến trình từ các tiến trình khác của hệ thống mà không phải
là từ Microsoft Office.
Kĩ thuật đầu tiên và thường thấy nhất là sử dụng WMI để
khởi chạy một tiến trình mới. Bằng kỹ thuật này, tiến trình mới sẽ được sinh ra
dưới tiến trình wmiprvse.exe. Đoạn
mã minh họa cho kĩ thuật này như sau:
Demo: Khởi chạy notepad.exe thông qua wmiprvse.exe bằng WMI
Kĩ thuật thứ hai là sử dụng COM (Component Object Model). Trong Windows, các thành phần COM cũng
cũng như giao diện của COM đều được gán một ID. ID của thành phần COM được gọi
là CLSID (class identifier); của giao
diện COM là IID (interface identifier).
Các ID này được gọi chung là GUID (globally
unique identifier) là một cấu trúc 16 byte và được xác định duy nhất. Tất cả
các ID này đều được chứa trong registry của windows cùng với thông tin về các
thành phần hoặc giao diện mà nó đại diện. COM cho phép các thành phần phần mềm
tương tác với nhau thông qua hệ điều hành vì thế nó hoàn toàn có thể bị lợi dụng
để chèn và thực thi mã độc như một chương trình hợp lệ, qua đó duy trì sự tồn tại
của mã độc. Thông qua VBA, kẻ tấn công cơ bản có thể tham chiếu tới bất kì COM
object nào để sử dụng chức năng của nó. Ví dụ, các object như ShellBrowserWindow và ShellWindows có thể được sử dụng để
thực thi một tiến trình mới từ Explorer:
Đoạn mã ví dụ sử dụng ShellBrowserWindow:
Demo: Sử dụng ShellBrowserWindow khởi chạy calc.exe
Đoạn mã ví dụ sử dụng ShellWindows:
Demo: Sử dụng ShellWindows khởi chạy calc.exe
Một kĩ thuật khác nữa cho phép kẻ tấn công giả mạo tiến
trình cha đó là sử dụng Parent PID Spoofing bằng hàm API CreateProcessA.
Kĩ thuật này khá đơn giản và được sử dụng phổ biến. Hàm API CreatProcessA cho
phép người dùng tạo các tiến trình mới và theo mặc định, các tiến trình được tạo
sẽ kế thừa từ tiến trình cha. Tuy nhiên, hàm này cũng hỗ trợ một tham số
là lpStartupInfo
(trỏ tới cấu trúc STARTUPINFOEX), cho phép định
nghĩa tiến trình cha mong muốn.
Cấu trúc STARTUPINFOEX
chứa một lpAttributeList và sử dụng UpdateProcThreadAttribution,
qua đó có thiết lập tiến trình cha thông qua thuộc tính PROC_THREAD_ATTRIBUTE_PARENT_PROCESS.
Chúng tôi lựa chọn một sample trong thực tế sử dụng
hàm CreateProcessA
với
kĩ thuật đã mô tả như trên để làm ví dụ minh họa. Sample có mã SHA-256: fd92d069a3e544a9b77d78216e050a03197e4fa39b40f4965fced5230f31b89e.
Macro giai đoạn 1 sẽ tiến hành giải mã và thực thi
macro giai đoạn thứ 2. Bằng cách áp dụng kĩ thuật đơn giản này, macro giai đoạn
2 chứa mã độc thực sự được ẩn đi dẫn tới cơ chế phân tích tĩnh áp dụng trên
macro giai đoạn đầu tiên sẽ không hiệu quả.
Macro giai đoạn 2 sau khi giải mã Base64:
Đoạn mã trên áp dụng kĩ thuật giả mạo tiến trình cha cho
tiến trình mới được tạo, bao gồm các bước như sau:
·
Lấy Process ID của tiến trình explorer.exe
thông qua câu lệnh truy vấn WMI: SELECT ProcessId FROM Win32_Process
WHERE Name = 'explorer.exe'
·
Gọi hàm OpenProcess
để lấy handle của tiến trình explorer.exe.
·
Gọi hàm InitializeProcThreadAttributeList
để khởi tạo danh sách các thuộc tính.
·
Gọi hàm UpdateProcThreadAttribute để
cập nhật AttributesList structure với handle là của explorer.exe.
·
Lấy đường dẫn của dllhost.exe trên hệ thống
tùy theo OS (32 bit hoặc 64 bit).
·
Tạo một tiến trình mới là dllhost.exe
thông qua hàm CreateProcessA với Process Creation Flags được thiết lập ở giá trị
0x80004 (EXTENDED_STARTUPINFO_PRESENT | CREATE_SUSPENDED).
Kết quả, dllhost.exe sẽ chạy như một tiến trình con của
explorer.exe chứ không phải là một tiến trình con của winword.exe:
Cuối cùng, tiến hành inject
shellcode vào tiến trình dllhost.exe và thực hiện các hành vi độc hại:
Có thể thấy, các kĩ
thuật mà kẻ tấn công sử dụng trong sample này rất dễ thực hiện, chỉ bằng cách tận
dụng những tính năng đơn giản do chính hệ điều hành hỗ trợ, từ đó cung cấp một
cách hiệu quả để vượt qua việc phân tích tĩnh và phân tích động.
3. Thiết lập Scheduled Task
Khi một máy tính đã bị
nhiễm phần mềm độc hại, một trong những bước tiếp theo của kẻ tấn công thường
thực hiện là tìm cách duy trì sự hoạt động của mã độc. Có nhiều kĩ thuật khác
nhau, trong đó việc tạo các tác vụ theo lịch trình là cách phổ biến. VBA hoàn
toàn hỗ trợ cho phép thực hiện tạo Scheduled Task, qua đó có thể gây nhiễu
trong quá trình giám sát các hoạt động phát sinh từ Office bởi lúc này svchost.exe
sẽ tạo lập ra tác vụ.
Đoạn mã ví dụ tạo một
task có tên “AVUpdateTask” thực hiện khởi chạy cmd.exe:
Demo: Tạo Scheduled Task khởi chạy cmd.exe
Sample thứ nhất chúng
tôi phân tích có mã SHA-256: 9ea577a4b3faaf04a3bddbfcb934c9752bed0d0fc579f2152751c5f6923f7e14.
Khi mở tài liệu, đoạn
mã VBA thuộc Sub Document_Open() của sample này thực thi như sau:
Khi người dùng đóng
tài liệu, đoạn mã VBA thuộc Sub
Document_Close() của
sample này sẽ thực hiện nhiệm vụ tạo ra một task có tên “chrome updater” để thực thi payload đã giải mã trước đó:
Sample thứ hai minh họa tiếp cho kĩ thuật này
là của nhóm APT32 (aka OceanLotus),
có mã SHA-256:
1fc1bc4d004ab51398070d8e3025fecf8878229cda8befdbc9a2faf592b8d876, đã được đề
cập trong báo cáo của FireEye vào tháng 05/2017.
Mặc dù nó có phần mở rộng
là “.doc” nhưng thực chất nó là dạng ActiveMime, “.mht” chứa văn bản và hình ảnh.
Mã VBA của sample này đầu tiên sẽ tạo ra một file xml có tên ngẫu nhiên và tạo
task có tên “SystemSoundServices” để
thực thi các câu lệnh được cấu hình trong file xml. Mục đích là để tải về
backdoor đầu tiên từ hệ thống của nhóm APT32:
Tiếp theo, tạo lại
task “SystemSoundServices”, khi triggered
thì "regsvr32.exe" được thực thi để thực hiện câu lệnh với tham số
như sau:
Kĩ thuật này sử dụng scrobj.dll
nhằm thực thi file XML được lưu trữ từ xa có chứa payload được nhúng. Khi giám
sát bằng Sysmon, sẽ quan sát được các hành vi khi mở tài liệu như sau:
4. Can thiệp vào Registry
Ngoài kĩ thuật
Scheduled Task nói trên, một kĩ thuật cũng phổ biến không kém nhằm duy trì sự
hoạt động của mã độc đó là can thiệp vào Registry. Thông qua mã VBA, kẻ tấn
công có thể truy cập vào Registry – để lưu trữ các payloads, chỉnh sửa các thiết
lập của hệ thống và tạo các điểm duy trì persistence (đảm bảo mã độc có thể khởi chạy lại kể cả khi người dùng khởi động lại
máy).
Một số đoạn mã minh họa
việc sử dụng macro, thông qua WMI hoặc Wscript để can thiệp trực tiếp vào
Registry:
Demo: Sử dụng WMI hoặc Wscript để ghi vào Registry
![]() |
Sử dụng WMI |
![]() |
Sử dung Wscript |
Ví dụ thực tế cho kĩ
thuật này, chúng tôi sử dụng một sample có SHA-256:
707d2128a0c326626adef0d3a4cab78562abd82c2bd8ede8cc82f86c01f1e024.
VBA code của sample
này thực hiện giải mã 3 chuỗi base64:
Sau đó thực hiện lần
lượt các bước:
· Ghi chuỗi
base64 đã decode đầu tiên vào "C:\ProgramData\WindowsDefender.ini". Bản
chất chuỗi base64 này là một Powershell đã bị kẻ tấn công obfuscate:
·
Ghi chuỗi
base64 đã decode thứ hai vào "C:\ProgramData\Defender.sct":
·
Ghi chuỗi
base64 đã decode thứ ba vào "C:\ProgramData\DefenderService.inf":
·
Tạo một
command line sử dụng lolbin là CMSTP.exe (Microsoft Connection Manager
Profile Installer) để cài đặt cấu hình trong file inf trên:
·
Cuối cùng
tạo persistence key trong Registry để tự động khởi chạy command line trên:
5. Thả payload nhúng sẵn trong tài liệu
Một trong những kĩ thuật
thường gặp nữa là thả payload nhúng sẵn trong tài liệu xuống hệ thống để thực
thi. Kĩ thuật này có ưu và nhược điểm của nó. Khi ghi payload xuống ổ đĩa thì
các payload này sẽ bị phân tích bởi các AV cũng như lưu vết trên hệ thống. Bù lại,
kĩ thuật này vẫn mang lại hiệu quả cho kẻ tấn công trong việc kiểm soát mục
tiêu một cách nhanh chóng.
Đoạn mã ví dụ sử dụng FileSystemObject để thực
hiện drop file:
Demo: Tạo file test.bat trong thư mục Startup
Với kĩ thuật này, chúng tôi một lần nữa sử dụng
một sample khác của nhóm APT32 để làm ví dụ thực tế. Sample có SHA-256:
a4a066341b4172d2cb752de4b938bf678ceb627ecb72594730b78bd05a2fad9d.
VBA code của sample
này cấu thành đường dẫn để lưu file main_background.png
vào thư mục %APPDATA% và thiết lập persistence key trong Registry. Tùy thuộc
vào OS để thực hiện các câu lệnh tương ứng nhằm ghi giá trị vào Registry:
Sau đó lấy nội dung (đã bị encode) nhúng sẵn trong tài liệu,
thực hiện decode và ghi vào file main_background.png.
Như vậy, mã độc sẽ thực
thi vì COM bị ghi đè được gọi trong một scheduled task mặc định trên Windows
7/10, có tên SystemSoundsService. Scheduled task này sẽ trigger khi người dùng
đăng nhập vào máy.
Ví dụ tiếp theo là một tài liệu định dạng
Excel, có mã SHA-256:
cb85072e6ca66a29cb0b73659a0fe5ba2456d9ba0b52e3a4c89e86549bc6e2c7.
Mã VBA tự động thực hiện
khi người dùng mở tài liệu. Đầu tiên, sẽ tiến hành lấy dữ liệu đã encode base64
được nhúng sẵn:
Sau đó tiến hành giải
mã dữ liệu thông qua công cụ Certutil.exe có sẵn trên hệ điều hành Windows và thực thi payload đã giải mã:6. Tải payload từ bên ngoài
Thay vì nhúng sẵn
payload trong tài liệu như kĩ thuật trước, kẻ tấn công có thể lợi dụng các chức
năng/ hàm của hệ thống để thực hiện tải payload từ môi trường bên ngoài về để
thực thi. Một số đoạn code minh họa sử dụng thư viện XMLHTTP kết hợp với ADODB
để ghi file; gọi hàm API trực tiếp của hệ thống như URLDownloadToFileA hoặc
sử dụng chính các công cụ sẵn có để thực hiện tải payload:
Demo: Tải ứng dụng putty sử dụng thư viện XMLHTTP hoặc API URLDownloadToFile
![]() |
Sử dụng thư viên XMLHTTP |
![]() |
Sử dụng API URLDownloadToFile |
Minh họa cho kĩ thuật
này chúng tôi sử dụng một sample có mã SHA-256:
e2d878a43607c04f151052e81a560a80525a343ea4e719c3a79e1cc8c45e47c5. Mặc dù mã
macro đã bị làm rối, tuy nhiên có thể dễ dàng xác định được URL được sử dụng để
tải xuống payload. Payload của sample này được lưu trữ trên trang pastebin.com.
7. Excel 4.0 (XLM macros)
Excel 4.0 là một chuẩn cũ của Microsoft, nó hỗ trợ một định dạng macro được gọi
là XLM. Tất cả các phiên bản Excel tính tới hiện tại đều có khả năng thực thi
macro Excel 4.0, tuy nhiên việc sử dụng chúng không được Microsoft khuyến khích.
Dù đã bị lãng quên từ lâu, Excel 4.0 hiện đang xuất hiện trở lại, việc sử dụng
chức năng của chúng như một trình tải payload độc hại khiến các tài liệu này
khó bị phát hiện.
Khó khăn trong việc
phát hiện một phần liên quan đến thực tế là các macro không được lưu trữ trong một
VBA project, nhưng lại lưu trong các cell của bảng tính đã bị ẩn đi. Có nghĩa
là các macro không có trong VBA stream của tập tin, nhưng được lưu dưới định dạng
BIFF (Binary Interchange File Format)
bên trong OLE “Workbook” stream.
Minh họa cho kĩ thuật
này, chúng tôi sử dụng một sample có mã SHA-256:
8870d88040d227887e616fc48d59caf920c238dcdedc0e9c3b6669a7337ae819.
Bình thường nếu sử dụng
công cụ oledump.py để kiểm tra file, sẽ thấy file này không chứa các streams liên quan đến
VBA code:
Tuy nhiên, khi thực hiện
Enable content sẽ thấy từ tiến trình EXCEL.EXE sinh ra một tiến trình con là msiexec.exe.
Tiến trình con này sẽ thực hiện việc tải payload mới về:
Như đã mô tả ở trên,
các câu lệnh marcro được lưu trong cell của hidden sheet. Do đó, thực hiện
Unhide toàn bộ các sheet sẽ có được thông tin như sau:
Như trên hình, cell đầu
tiên có chức năng là Auto_Open, tương tự như Sub AutoOpen() trong VBA để tự động
chạy macro, từ đó sẽ thực thi lệnh ở B87 thuộc sheet có tên help:
TẠM KẾT
Chúng tôi xin khép lại
bài tổng hợp này tại đây. Hi vọng bài viết phần nào đã cung cấp được những
thông tin hữu ích về các cách thức mà kẻ tấn công sử dụng. Trên thực tế, kẻ tấn
công có thể kết hợp, lồng ghép các kĩ thuật trên nhằm đạt được mục đích cuối
cùng hoặc phát triển các kĩ thuật khác tinh vi hơn. Chúng tôi sẽ cập nhật, bổ
sung thêm trong tương lai gần.
TÀI
LIỆU THAM KHẢO
Các nguồn tham khảo được
sử dụng làm tư liệu cho bài viết:
https://outflank.nl/blog/2018/10/06/old-school-evil-excel-4-0-macros-xlm/
------------------------------
Để tiện theo dõi, chúng tôi cung cấp toàn bộ bài viết dưới dạng PDF:
File name: CSS-RD-ADV-200104-010_Cac ki thuat Macro malware pho bien v1.0 Final.pdf
File hash (SHA-256): 652c4d0db28384a069207db44653b755b90dd6c7a6481821b162f8e065a706be
------------------------------
Để tiện theo dõi, chúng tôi cung cấp toàn bộ bài viết dưới dạng PDF:
File name: CSS-RD-ADV-200104-010_Cac ki thuat Macro malware pho bien v1.0 Final.pdf
File hash (SHA-256): 652c4d0db28384a069207db44653b755b90dd6c7a6481821b162f8e065a706be
Tran Trung Kien (aka m4n0w4r)
R&D Center - VinCSS (a member of Vingroup)
No comments:
Post a Comment