So sánh virus file và virus macro

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.

Đặ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:

So sánh virus file và virus macro

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:

So sánh virus file và virus macro

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:

So sánh virus file và virus macro

So sánh virus file và virus macro

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:

So sánh virus file và virus macro

So sánh virus file và virus macro

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:

So sánh virus file và virus macro

So sánh virus file và virus macro

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.

So sánh virus file và virus macro

So sánh virus file và virus macro

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:

So sánh virus file và virus macro

Demo: Khởi chạy notepad.exe thông qua wmiprvse.exe bằng WMI

So sánh virus file và virus macro

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:

So sánh virus file và virus macro

So sánh virus file và virus macro

Đoạn mã ví dụ sử dụng ShellBrowserWindow:

So sánh virus file và virus macro

So sánh virus file và virus macro

Demo: Sử dụng ShellBrowserWindow khởi chạy calc.exe

So sánh virus file và virus macro

Đoạn mã ví dụ sử dụng ShellWindows:

So sánh virus file và virus macro

So sánh virus file và virus macro

Demo: Sử dụng ShellWindows khởi chạy calc.exe

So sánh virus file và virus macro

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.

So sánh virus file và virus macro

So sánh virus file và virus macro

Cấu trúc STARTUPINFOEXchứ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.

So sánh virus file và virus macro

So sánh virus file và virus macro

Chúng tôi lựa chọn một sample trong thực tế sử dụng hàm CreateProcessAvới kĩ thuật đã mô tả như trên để làm ví dụ minh họa. Sample có mã SHA-256: fd92d069a3e544a9b77d78216e050a03197e4fa39b40f4965fced5230f31b89e.

So sánh virus file và virus macro

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ả.

So sánh virus file và virus macro

Macro giai đoạn 2 sau khi giải mã Base64:

So sánh virus file và virus macro

Đ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).

So sánh virus file và virus macro

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:

So sánh virus file và virus macro

So sánh virus file và virus macro

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:

So sánh virus file và virus macro

So sánh virus file và virus macro

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:

So sánh virus file và virus macro

Demo: Tạo Scheduled Task khởi chạy cmd.exe

So sánh virus file và virus macro

Sample thứ nhất chúng tôi phân tích có mã SHA-256: 9ea577a4b3faaf04a3bddbfcb934c9752bed0d0fc579f2152751c5f6923f7e14.

So sánh virus file và virus macro

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:

So sánh virus file và virus macro

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 đó:

So sánh virus file và virus macro

So sánh virus file và virus macro

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.

So sánh virus file và virus macro

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:

So sánh virus file và virus macro

So sánh virus file và virus macro

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:

So sánh virus file và virus macro

So sánh virus file và virus macro

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:

So sánh virus file và virus macro

So sánh virus file và virus macro

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:

So sánh virus file và virus macro

So sánh virus file và virus macro

Demo: Sử dụng WMI hoặc Wscript để ghi vào Registry

So sánh virus file và virus macro
Sử dụng WMI
So sánh virus file và virus macro
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.

So sánh virus file và virus macro

VBA code của sample này thực hiện giải mã 3 chuỗi base64:

So sánh virus file và virus macro

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:

So sánh virus file và virus macro

So sánh virus file và virus macro

· Ghi chuỗi base64 đã decode thứ hai vào "C:\ProgramData\Defender.sct":

So sánh virus file và virus macro

· Ghi chuỗi base64 đã decode thứ ba vào "C:\ProgramData\DefenderService.inf":

So sánh virus file và virus macro

· 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:

So sánh virus file và virus macro

So sánh virus file và virus macro

· Cuối cùng tạo persistence key trong Registry để tự động khởi chạy command line trên:

So sánh virus file và virus macro

So sánh virus file và virus macro

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:

So sánh virus file và virus macro

Demo: Tạo file test.bat trong thư mục Startup

So sánh virus file và virus macro

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.

So sánh virus file và virus macro

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:

So sánh virus file và virus macro

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.

So sánh virus file và virus macro

So sánh virus file và virus macro

So sánh virus file và virus macro

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.

So sánh virus file và virus macro

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:

So sánh virus file và virus macro

So sánh virus file và virus macro

So sánh virus file và virus macro

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ã:

So sánh virus file và virus macro

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:

So sánh virus file và virus macro

So sánh virus file và virus macro

So sánh virus file và virus macro

Demo: Tải ứng dụng putty sử dụng thư viện XMLHTTP hoặc API URLDownloadToFile

So sánh virus file và virus macro
Sử dụng thư viên XMLHTTP
So sánh virus file và virus macro
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.

So sánh virus file và virus macro

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:

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.