Tại BlackHat Asia, nhóm outflank đã phát hành Evil Clippy – một công cụ hỗ trợ cho red team và những người kiểm định bảo mật trong việc tạo tài liệu MS Office độc ​​hại. Evil Clippy có thể ẩn các VBA macro, stomp VBA code (thông qua p-code) và gây nhầm lẫn đối với các công cụ phân tích macro phổ biến. Nó chạy trên Linux, OSX và Windows.

Trong bài đăng này, outflank sẽ giới thiệu các tính năng của Evil Clippy và công nghệ đằng sau nó. Mã nguồn mới nhất của công cụ có thể được tìm thấy ở đây:

https://github.com/outflanknl/EvilClippy

Bản phát hành nhị phân mới nhất có sẵn tại:

https://github.com/outflanknl/EvilClippy/releases

Trường hợp sử dụng

Tại thời điểm viết bài, công cụ này có khả năng nhận các macro độc hại để vượt qua tất cả các sản phẩm chống vi-rút chính và hầu hết các công cụ phân tích maldoc. Nó đạt được điều này bằng cách rà soát các tệp MS Office ở mức định dạng tệp.

Hình dưới đây cho thấy tỷ lệ phát hiện của Cobalt Strike VBA macro mặc định trước khi Evil Clippy được áp dụng. Đây là một macro “process injection” cơ bản – rõ ràng là độc hại và thực tế được phát hiện bởi tất cả các nhà cung cấp chống vi-rút lớn nhất.

Sau khi áp dụng Evil Clippy cho tài liệu này (EvilClippy.exe -s fake.vbs -g -r cobaltstrike.doc), tất cả các công cụ chống vi-rút chính đều không phát hiện được macro này.

Lưu ý rằng Evil Clippy chỉ tập trung vào việc trốn tránh phân tích tĩnh. Một sự kết hợp có thể đặc biệt hiệu quả cho sự thỏa hiệp ban đầu trong các hoạt động red team là phân phối các tài liệu độc hại được tạo bằng Evil Clippy thông qua HTML smuggling (giúp vượt qua các biện pháp phòng thủ theo phạm vi). Nếu cần lẫn tránh phân tích động của các macro, thì hãy đọc blog của outflank về việc bypassing AMSI for VBA.

Evil Clippy được viết bằng C #. Mã biên dịch hoàn toàn tốt với trình biên dịch Mono C# và đã được thử nghiệm trên Linux, OSX và Windows. Hướng dẫn biên dịch và sử dụng có thể được tìm thấy trong readme .

Kỹ thuật công nghệ

Để hiểu cách thức hoạt động của Evil Clippy, chúng ta cần đi sâu vào Compound File Binary Format (CFBF). Định dạng tệp này được sử dụng rất nhiều trong MS Office. Evil Clippy hỗ trợ hai loại tệp MS Office sau:

  • Định dạng 97 – 2003 (.doc và .xls), các tệp này hoàn toàn ở định dạng tệp CFBF.
  • Định dạng 2007+ (.docm và .xlsm), các tệp này thực sự là các thùng chứa ZIP.Nếu bạn giải nén tập tin, bạn sẽ tìm thấy một tập tin có tên là vbProject.bin, trong thư mục từ Word (.docm) hoặc thư mục xx ((xxsm). Tệp này là tệp CFBF chứa thông tin macro cho tài liệu.

Evil Clippy sử dụng thư viện  OpenMCDF để thao tác các tệp CFBF. Nếu muốn thao tác các tệp CFBF theo cách thủ công, thì FlexHEX là một trong những trình chỉnh sửa tốt nhất cho việc này.

Cửa sổ ở phía dưới bên trái hiển thị cấu trúc của tệp CFBF cụ thể này. Một tệp CFBF giống như một hệ thống tệp trong một tệp duy nhất: có các luồng (nghĩ về chúng như “files”) có thể được lưu trữ trong các container (nghĩ về chúng như “directories”).

“macros” container chứa tất cả subcontainers và streams liên quan đến VBA macro trong tài liệu MS Word. Trong các tệp MS Excel, vùng chứa này được gọi là “_VBA_PROJECT_CUR”. Cấu trúc và nội dung của container này được Microsoft giải thích trong một đặc tả dài và phức tạp được gọi là MS-OVBA .

Các stream quan trọng nhất trong macro container là:

  • PROJECT: một luồng với dữ liệu văn bản chỉ định thông tin dự án. Nó có thể được coi là một tệp cấu hình với các dòng CRLF được  phân tách.
  • _VBA_PROJECT: một luồng có dữ liệu nhị phân chỉ thị cho công cụ VBA. Không có tài liệu chính thức về nội dung của luồng này, nhưng điều quan trọng là cách các macro được diễn giải (mà chúng ta sẽ thấy sau trong bài viết này).
  • Dir : một luồng chứa bố cục dự án VBA. Luồng này được nén và định dạng của nó là định dạng tốt nhất.
  • Module streams: hình ở trên có hai luồng mô-đun có tên là “ThisDocument” và “Module1”. Chúng chứa mã thực tế sẽ chạy. Mỗi luồng mô-đun bao gồm hai phần: PerformanceCache – undocumented  và CompcedSourceCode – chứa mã nguồn macro VBA ở định dạng nén.

Lưu ý rằng một số luồng chứa dữ liệu nén (đáng chú ý nhất là luồng dir và Module), sử dụng thuật toán nén tùy chỉnh . Evil Clippy tái sử dụng mã từ  Kavod.VBA.Compression để thực hiện thuật toán nén.

Để biết thêm thông tin về định dạng tệp này, hãy xem bản trình bày TROOPERS19 của outflank có tiêu đề MS Office File Format Sorcery.

VBA stomping (via p-code)

Kỹ thuật mạnh nhất của Evil Clippy là VBA stomping. Việc VBA stomping đã sử dụng một tính năng không chính thức: phần PerformanceCache  của mỗi luồng mô-đun chứa mã giả được biên dịch (p-code) cho công cụ VBA. Nếu phiên bản MS Office được chỉ định trong luồng  _VBA_PROJECT phù hợp với phiên bản MS Office của chương trình máy chủ (Word hoặc Excel) thì mã nguồn VBA trong luồng mô-đun sẽ bị bỏ qua và thay vào đó p-code được thực thi.

Tóm lại: nếu chúng ta biết phiên bản MS Office của hệ thống đích (ví dụ: Office 2016, 32 bit), chúng ta có thể thay thế mã nguồn VBA độc hại bằng mã giả, trong khi mã độc vẫn sẽ được thực thi thông qua p-code. Trong khi đó, bất kỳ công cụ phân tích mã nguồn VBA (như chống vi-rút) đều bị đánh lừa hoàn toàn.

Vesselin Bontchev là người đầu tiên công khai tài liệu kỹ thuật này ( mẫu). Đội ngũ bảo mật từ Walmart đã thu thập các nguồn tài nguyên lớn về chủ đề này tại đây . Outflank đã thảo luận ngắn gọn về kỹ thuật này trong buổi nói chuyện The The Office Office Show Show tại DerbyCon. Evil Clippy là công cụ đầu tiên vũ khí hóa hoàn toàn kỹ thuật này cho các red team và người kiểm định bảo mật.

Ví dụ: để thay thế mã nguồn VBA trong tài liệu độc hại của bạn bằng mã giả và để p-code độc hại chạy trên các bản cài đặt 32 bit của Office 2016, hãy chạy Evil Clippy bằng dòng lệnh sau:

EvilClippy.exe -s fakecode.vba -t 2016×86 macrofile.doc

Sau khi thực hiện lệnh này, một tệp có tên là “macrofile_EvilClippy.doc” sẽ được tạo. Bất kỳ công cụ phân tích VBA phổ biến nào như OleVBA, OleDump hoặc VirusTotal sẽ cho bạn biết rằng tệp này chứa mã giả. Tuy nhiên, nếu tệp được mở trên bản cài đặt 32 bit của Office 2016 , p-code độc hại sẽ được thực thi thay thế.

Vì vậy, để làm cho cuộc tấn công này hoạt động, chúng ta cần biết phiên bản MS Office của mục tiêu. Đạt được điều này không khó. Một mẹo phổ biến là gửi cho nạn nhân một email có chứa pixel theo dõi. Nếu pixel được MS Outlook truy xuất (thường là một phần của cùng cài đặt MS Office), các tiêu đề của yêu cầu HTTP này sẽ tiết lộ số phiên bản MS Office và cho dù đó là cài đặt 32 hay 64 bit.

Evil Clippy cũng có thể tự động hóa nhận dạng phiên bản đích cho bạn bằng cách sử dụng thủ thuật tạo khuôn mẫu. Quá trình theo đây là như sau:

  • Tạo mẫu MS Word (.dot / .dotm) bao gồm macro độc hại.
  • Chạy công cụ Evil Clippy với tùy chọn -webserver và trỏ nó vào tệp mẫu độc hại. Sau đó, sẽ có một máy chủ web lắng nghe các kết nối đến trên cổng bạn đã chỉ định.
  • Sau đó, tạo một tài liệu khác trỏ đến tài liệu mẫu này qua URL bằng cách tham chiếu nó dưới dạng mẫu từ thanh công cụ của nhà phát triển trong Word (có thể sử dụng tiện ích mở rộng tùy ý, không cần mở rộng .dot!).
  • Nếu tài liệu này được mở, MS Office sẽ liên hệ với máy chủ web để lấy mẫu. Evil Clippy sẽ xác định phiên bản MS Office đích từ tiêu đề HTTP và sẽ vá các byte phiên bản trong luồng _VBA_PROJECT của mẫu độc hại trước khi phục vụ nó.

Hãy chắc chắn đọc các cảnh báo trong readme trước khi  sử dụng tùy chọn này! Các hình sau đây cho thấy tính năng này đang hoạt động:

Ẩn macro

Lưu ý rằng sau khi chạy macro bằng p-code trong MS Office, công cụ VBA sẽ xây dựng lại mã nguồn VBA từ p-code và hiển thị nó trong GUI của trình soạn thảo VBA khi mở. Do đó, chúng tôi cần một mẹo bổ sung để che giấu mã độc hại khỏi những kẻ tò mò.

Một kỹ thuật để đạt được điều này là sửa đổi luồng PROJECT. Như đã đề cập ở trên, luồng này có thể được coi là một tệp cấu hình cho GUI của trình soạn thảo VBA. Chỉ cần xóa một dòng chẳng hạn như “Module=Module1”, chúng ta có thể làm cho mô-đun có tên là Module1 biến mất trong trình soạn thảo VBA. Lưu ý rằng điều này không hoạt động với các mô-đun mặc định của “ThisDocument” hoặc “ThisWorkbook”, vì vậy phải đặt mã độc vào một mô-đun riêng để thực hiện thủ thuật này.

Evil Clippy có thể tự động ẩn tất cả các mô-đun bằng cờ -g:

EvilClippy.exe -g macrofile.doc

Một mẹo khác để làm cho mã macro không thể truy cập được là đánh dấu dự án là bị khóa và không thể xem được. Tính năng này đã được Carrie Robberts từ Walmart thêm vào Evil Clippy và có thể được sử dụng với cờ -u. Carrie đã viết một blog chi tiết về chủ đề này.

Công cụ phẫn tránh phân tích

Mặc dù các cờ -g và -u có thể ẩn mã độc khỏi mắt người thường, nhưng chúng không bảo vệ chống lại các công cụ bảo mật phân tích ở cấp định dạng tệp. Ví dụ, pcodingmp có thể được sử dụng bởi một nhà phân tích để trích xuất mã p từ tài liệu. Tuy nhiên, chúng ta có thể sử dụng sự mơ hồ và phức tạp của đặc tả MS-OVBA để gây nhầm lẫn cho các công cụ phân tích khác nhau, bao gồm cả pcodingmp.

Evil Clippy có thể nhầm lẫn pcodingmp và nhiều công cụ phân tích khác với cờ -r.

EvilClippy.exe -r macrofile.doc

Sau khi chạy pcodingmp trên tệp này, nó gặp sự cố với một tệp tin không tìm thấy lỗi và danh sách tên mô-đun trống:

Làm thế nào để nó đạt được điều này? Với cờ -r Evil Clippy đặt các tên mô-đun ASCII ngẫu nhiên trong luồng Dir. Hầu hết các công cụ phân tích sử dụng tên mô-đun được chỉ định ở đây, trong khi MS Office phân tích tên mô-đun từ luồng _VBA_PROJECT. Bằng cách đặt tên mô-đun ASCII ngẫu nhiên, hầu hết các công cụ phân tích p-code và VBA bị crash, trong khi p-code và VBA thực tế vẫn chạy tốt trong Word và Excel. Thông tin thêm về nguyên nhân gốc rễ của vấn đề này có thể được đọc trong chủ đề Twitter này của Vesselin Bontchev, tác giả của pcodingmp.

Nguồn: outflank.nl