Dynamic Analysis

*******< HÃY CHẮC CHẮN BẠN ĐÃ SNAPSHOT TRƯỚC KHI BẮT ĐẦU VÌ TÔI SẼ KHÔNG CHỊU TRÁCH NHIỆM CHO BẤT KỲ THIỆT HẠI NÀO MÀ MÁY BẠN DÍNH PHẢI>*******

Phân tích động (phân tích hành vi) bao gồm phân tích mẫu bằng cách thực thi nó trong một môi trường cách ly và theo dõi các hoạt động, tương tác và ảnh hưởng của nó đối với hệ thống.

Sử dụng phân tích động là quan trọng vì nó giúp hiểu vì sao quá trình này quan trọng, hãy xem xét vấn đề của phần mềm độc hại được đóng gói. Nhớ lại rằng đóng gói phần mềm độc hại liên quan đến nén hoặc làm rối mã lệnh x86 của phần mềm độc để che giấu tính độc hại của chương trình đó. Một mẫu phần mềm độc hại được đóng gói sẽ giải nén chính nó khi tấn công vào máy mục tiêu để thực thi mã.

Ví dụ, với phân tích tĩnh, chúng ta phải trước tiên tìm vị trí của mã lệnh bị làm rối trong tệp phần mềm độc hại. Sau đó, chúng ta phải tìm vị trí của các chương trình con giải rối nhằm giải rối mã này để chúng có thể chạy. Sau khi xác định được các chương trình con, chúng ta phải tìm hiểu cách thức giải rối này hoạt động để thực hiện nó trên mã. Chỉ sau đó chúng ta mới có thể bắt đầu quá trình đảo ngược mã độc hại thực sự.

Một giải pháp đơn giản nhưng thông minh thay cho quá trình này là thực thi phần mềm độc hại trong một môi trường an toàn và được giới hạn gọi là sandbox. Chạy phần mềm độc hại trong sandbox cho phép nó giải nén chính nó như nó sẽ làm khi tấn công vào một mục tiêu thực. Bằng cách chỉ đơn giản chạy phần mềm độc hại, chúng ta có thể tìm hiểu các máy chủ mà mã độc cụ thể kết nối tới, các tham số cấu hình hệ thống mà nó thay đổi và các hoạt động đầu vào/đầu ra thiết bị mà nó cố gắng thực hiện.

1. System And Network Monitoring

Khi mã độc được thực thi, nó có thể tương tác với hệ thống theo nhiều cách khác nhau và thực hiện các hoạt động khác nhau. Ví dụ, khi được thực thi, mã độc có thể sinh ra một tiến trình con, thả các tệp bổ sung trên hệ thống tệp, tạo các khóa và giá trị registry để tồn tại lâu dài, và tải xuống các thành phần khác hoặc nhận lệnh từ máy chủ điều khiển và kiểm soát. Việc theo dõi sự tương tác của mã độc với hệ thống và mạng sẽ giúp hiểu rõ hơn về bản chất và mục đích của mã độc.

Trong quá trình phân tích động, khi mã độc được thực thi, bạn sẽ tiến hành các hoạt động theo dõi khác nhau. Mục tiêu là thu thập dữ liệu thời gian thực liên quan đến hành vi của mã độc và tác động của nó đối với hệ thống. Danh sách sau đây đề cập các loại theo dõi khác nhau được thực hiện trong quá trình phân tích động:

  • Theo dõi tiến trình: Bao gồm theo dõi hoạt động của tiến trình và kiểm tra các thuộc tính của tiến trình kết quả trong quá trình thực thi mã độc.
  • Theo dõi hệ thống tệp: Bao gồm theo dõi hoạt động hệ thống tệp thời gian thực trong quá trình thực thi mã độc.
  • Theo dõi registry: Bao gồm theo dõi các khóa registry được truy cập/sửa đổi và dữ liệu registry đang được đọc/ghi bởi tập tin nhị phân độc hại.
  • Theo dõi mạng: Bao gồm theo dõi lưu lượng trực tiếp tới và đi từ hệ thống trong quá trình thực thi mã độc.

Những hoạt động giám sát được giải thích trong các điểm trước sẽ giúp thu thập thông tin về chủ đề và mạng liên quan đến hành vi của mã độc.

2. Dynamic Analysis (Monitoring) Tools

2.1 Kiểm tra Tiến trình với Process Hacker

Process Hacker là một công cụ nguồn mở, đa năng giúp theo dõi tài nguyên hệ thống. Đây là công cụ tuyệt vời để kiểm tra các tiến trình đang chạy trên hệ thống và để kiểm tra các thuộc tính của tiến trình. Nó cũng có thể được sử dụng để khám phá các dịch vụ, kết nối mạng, hoạt động ổ đĩa, v.v.

Một khi mẫu mã độc được thực thi, công cụ này có thể giúp bạn xác định tiến trình mã độc mới được tạo (tên tiến trình và ID tiến trình) và bằng cách nhấp chuột phải vào tên tiến trình và chọn Thuộc tính, bạn sẽ có thể kiểm tra các thuộc tính tiến trình khác nhau. Bạn cũng có thể nhấp chuột phải vào một tiến trình và kết thúc nó.

2.2 Xác định tương tác Hệ thống với Process Monitor

Process Monitor là một công cụ giám sát nâng cao cho thấy sự tương tác thời gian thực của các tiến trình với hệ thống tệp, registry và hoạt động tiến trình/luồng.

Khi bạn chạy công cụ này (chạy với quyền Quản trị viên), bạn sẽ ngay lập tức nhận thấy nó ghi lại tất cả các sự kiện hệ thống, như được hiển thị trong ảnh chụp màn hình sau. Để ngừng ghi lại các sự kiện, bạn có thể nhấn Ctrl + E, và để xóa tất cả các sự kiện bạn có thể nhấn Ctrl + X. Ảnh chụp màn hình sau đây cho thấy các hoạt động được ghi lại bởi Process Monitor trên một hệ thống sạch:

Từ các sự kiện được ghi lại bởi Process Monitor, bạn có thể thấy rằng rất nhiều hoạt động được tạo ra trên một hệ thống sạch. Khi thực hiện phân tích mã độc, bạn sẽ chỉ quan tâm đến các hoạt động được tạo ra bởi mã độc. Để giảm nhiễu, bạn có thể sử dụng các tính năng lọc che giấu các mục không mong muốn và cho phép bạn lọc dựa trên các thuộc tính cụ thể. Để truy cập tính năng này, hãy chọn menu Lọc và sau đó nhấp vào Lọc (hoặc nhấn Ctrl + L).

3. Các bước phân tích động

Trong quá trình phân tích động (phân tích hành vi), bạn sẽ tuân theo một chuỗi các bước để xác định chức năng của phần mềm độc hại. Danh sách dưới đây liệt kê các bước được thực hiện trong phân tích động:

  • Khôi phục lại snapshot khi máy chưa nhiễm virus: Điều này bao gồm khôi phục máy ảo của bạn về một trạng thái sạch.
  • Chạy các công cụ giám sát/phân tích động: Trong bước này, bạn sẽ chạy các công cụ giám sát trước khi thực thi mẫu phần mềm độc hại. Để tận dụng tối đa các công cụ giám sát, bạn cần chạy chúng với quyền quản trị viên.
  • Thực thi mẫu phần mềm độc hại: Trong bước này, bạn sẽ chạy mẫu phần mềm độc hại với quyền quản trị viên.
  • Dừng các công cụ giám sát: Điều này bao gồm chấm dứt các công cụ giám sát sau khi tệp nhị phân phần mềm độc hại được thực thi trong một khoảng thời gian cụ thể.
  • Phân tích kết quả: Điều này bao gồm thu thập dữ liệu/báo cáo từ các công cụ giám sát và phân tích chúng để xác định hành vi và chức năng của phần mềm độc hại.

PS: Không có ảnh chỉ dẫn cụ thể đâu (đang lười lắm và nó cũng không quá khó nên có thể trong tương lai sẽ có bài cụ thể về phần này hoặc không (•_•))

4. Phân tích Dynamic-Link Library (DLL)

Dynamic-Link Library (DLL) là một mô-đun chứa các hàm (gọi là hàm xuất hoặc exports) có thể được sử dụng bởi một chương trình khác (như một tệp thực thi hoặc DLL). Một tệp thực thi có thể sử dụng các hàm được triển khai trong DLL bằng cách nhập chúng từ DLL.

Hệ điều hành Windows chứa nhiều DLL xuất các hàm khác nhau được gọi là Interfaces Lập Trình Ứng Dụng (API). Các hàm trong các DLL này được sử dụng bởi các tiến trình để tương tác với hệ thống tệp, quá trình, hệ thống đăng ký, mạng và giao diện người dùng đồ họa (GUI).

Để hiển thị các hàm xuất trong công cụ CFF Explorer, tải tệp PE xuất hàm và nhấp chuột vào Export directory. Screenshot sau đây hiển thị một số hàm được xuất bởi Kernel32.dll (nó là một DLL hệ điều hành và nằm trong thư mục C: \ Windows \ System32). Một trong số các hàm xuất bởi Kernel32.dll là CreateFile; hàm API này được sử dụng để tạo hoặc mở một tệp:

Trong screenshot dưới đây, có thể thấy rằng notepad.exe nhập một số hàm được xuất bởi kernel32.dll, bao gồm hàm CreateFile. Khi bạn mở hoặc tạo một tệp với Notepad, nó gọi hàm CreateFile API được triển khai trong Kernel32.dll:

Trong ví dụ trên, notepad.exe không cần triển khai chức năng để tạo hoặc mở tệp trong mã của nó. Thay vào đó, nó chỉ nhập và gọi hàm CreateFile API được triển khai trong Kernel32.dll. Lợi ích của việc triển khai DLL là mã của nó có thể được dùng chung bởi nhiều ứng dụng. Nếu một ứng dụng muốn gọi một hàm API, nó phải tải một bản sao của DLL xuất API vào không gian bộ nhớ của nó.

Truy cập Link này để hiểu thêm về DLL

4.1 Tại sao kẻ tấn công sử dụng DLL?

Bạn thường sẽ thấy bên tạo malware phân phối mã độc của họ dưới dạng DLL thay vì các tệp thực thi. Danh sách dưới đây liệt kê một số lý do tại sao kẻ tấn công triển khai mã độc của mình dưới dạng DLL:

  • Một DLL không thể được thực thi bằng cách nhấp đôi chuột; DLL cần một quá trình chủ để chạy. Bằng cách phân phối mã độc dưới dạng DLL, tác giả phần mềm độc hại có thể tải DLL của mình vào bất kỳ quá trình nào, bao gồm cả các quá trình hợp lệ như Explorer.exe, winlogon.exe, etc. Kỹ thuật này cho phép kẻ tấn công giấu các hoạt động của mã độc và tất cả các hoạt động độc hại được thực hiện bởi mã độc sẽ xuất phát từ quá trình chủ.
  • Tiêm một DLL vào một quá trình đang chạy cung cấp khả năng tồn tại lâu dài trên hệ thống đối tượng.
  • Khi một DLL được tải bởi một quá trình vào không gian bộ nhớ của nó, DLL sẽ có quyền truy cập vào toàn bộ không gian bộ nhớ của quá trình, do đó cho phép nó thay đổi chức năng của quá trình. Ví dụ, kẻ tấn công có thể tiêm một DLL vào một quá trình trình duyệt và đánh cắp thông tin đăng nhập bằng cách điều hướng chức năng API của nó.
  • Phân tích một DLL không phải là một công việc đơn giản và có thể rắc rối hơn so với phân tích một tệp thực thi.

Hầu hết các mẫu mã độc thả hoặc tải xuống một DLL, sau đó tải DLL vào không gian bộ nhớ của một quá trình khác. Sau khi tải DLL, thành phần dropper/loader sẽ xóa chính nó. Kết quả là, khi thực hiện một cuộc điều tra phần mềm độc, bạn có thể chỉ tìm thấy DLL.

4.2 Phân tích DLL bằng cách sử dụng rundll32.exe

Để xác định hành vi của phần mềm độc và theo dõi hoạt động của nó bằng phân tích động, việc hiểu cách thực thi DLL là rất quan trọng. Như đã đề cập trước đó, một DLL cần một quá trình để chạy. Trên Windows, rundll32.exe có thể được sử dụng để khởi chạy một DLL và gọi các chức năng được xuất từ DLL. Cú pháp sau đây là để khởi chạy một DLL và gọi một chức năng xuất bằng cách sử dụng rundll32.exe:

rundll32.exe <đường dẫn đầy đủ đến tệp dll>, <Export function> <Optional arguments>

Các tham số liên quan đến rundll32.exe được giải thích như sau:

  • Đường dẫn đầy đủ đến DLL: Chỉ định đường dẫn đầy đủ đến DLL và đường dẫn này không thể chứa khoảng trắng hoặc ký tự đặc biệt.
  • Chức năng xuất (Export function): Đây là một chức năng trong DLL sẽ được gọi sau khi DLL được tải.
  • Các đối số tùy chọn (Optional arguments): Các đối số là tùy chọn và nếu được cung cấp, các đối số này sẽ được truyền cho chức năng xuất khi nó được gọi.
  • Dấu phẩy: Đây được đặt giữa đường dẫn đầy đủ đến DLL và chức năng xuất. Chức năng xuất là bắt buộc để cú pháp đúng.

Xem thêm về rundll32 tại đây

4.2.2 Khởi chạy DLL bằng cách sử dụng rundll32.exe

Trong quá trình điều tra phần mềm độc, bạn sẽ gặp phải các biến thể khác nhau của DLL. Hiểu cách nhận diện và phân tích chúng là rất quan trọng để xác định hành động độc hại của chúng. Các ví dụ sau đây trình bày những tình huống khác nhau liên quan đến DLL.

Ví dụ 1 – Phân tích một DLL không có hàm xuất

Khi một DLL được tải, hàm điểm nhập (entry point function) của nó được gọi (sau đó gọi hàm DLLMain của nó). Kẻ tấn công có thể triển khai các chức năng độc hại (như keylogging, đánh cắp thông tin, vv) trong hàm DLLMain mà không xuất bất kỳ hàm nào.

Trong ví dụ sau đây, DLL độc hại (aa.dll) không chứa bất kỳ hàm exports, điều này cho biết, tất cả các chức năng độc hại có thể được triển khai trong hàm DLLMain của nó, sẽ được thực thi (được gọi từ điểm nhập của DLL) khi DLL được tải. Từ ảnh chụp màn hình dưới đây, có thể thấy rằng phần mềm độc hại nhập các hàm từ wininet.dll (mà xuất hàm liên quan đến giao thức HTTP hoặc FTP). Điều này cho thấy rằng phần mềm độc có thể gọi các hàm mạng này trong hàm DLLMain, để tương tác với máy chủ C2 (command and control) sử dụng giao thức HTTP hoặc FTP:

Bạn có thể cho rằng, vì không có hàm xuất, một DLL có thể được thực thi bằng cú pháp sau đây:

C:>rundll32.exe C:\samples\aa.dll

Khi bạn chạy một DLL với cú pháp trên, DLL sẽ không được thực thi thành công; đồng thời, bạn sẽ không nhận được bất kỳ lỗi nào. Lý do cho điều này là khi rundll32.exe xác thực cú pháp dòng lệnh, nó không hoàn thành kiểm tra cú pháp. Kết quả là rundll32.exe thoát mà không tải DLL.

Bạn cần đảm bảo cú pháp dòng lệnh là chính xác để tải thành công một DLL. Lệnh được hiển thị trong kết quả đầu ra sau đây sẽ chạy DLL thành công. Trong lệnh sau đây, test là một tên giả định, và không có hàm xuất như vậy, nó chỉ được sử dụng để đảm bảo cú pháp dòng lệnh là chính xác. Trước khi chạy lệnh sau đây, các công cụ giám sát khác nhau mà chúng ta đã đề cập trong chương này (Process Hacker, Noriben, Wireshark, Inetsim) đã được khởi động:

C:>rundll32.exe C:\samples\aa.dll,test

Sau khi chạy lệnh, lỗi sau đã xuất hiện, nhưng DLL đã được thực thi thành công. Trong trường hợp này, vì cú pháp chính xác, rundll32.exe đã tải DLL (bước 2, được đề cập trong Phần 6.2.1 Hoạt động của rundll32.exe). Kết quả là, hàm entry point của DLL đã được gọi (lần lượt gọi DLLMain, chứa mã độc). Sau đó rundll32.exe cố gắng tìm địa chỉ của hàm xuất test (đó là bước 3, được đề cập trong Phần 6.2.1 Hoạt động của rundll32.exe). Vì nó không thể tìm thấy địa chỉ của test, lỗi sau đã hiển thị. Mặc dù thông báo lỗi được hiển thị, DLL đã được tải thành công (đó chính xác là điều chúng ta mong muốn để theo dõi hoạt động của nó)

Bạn cần đảm bảo cú pháp dòng lệnh là chính xác để tải thành công một DLL. Lệnh được hiển thị trong kết quả đầu ra sau đây sẽ chạy DLL thành công. Trong lệnh sau đây, test là một tên giả định, và không có hàm xuất như vậy, nó chỉ được sử dụng để đảm bảo cú pháp dòng lệnh là chính xác. Trước khi chạy lệnh sau đây, các công cụ giám sát khác nhau mà chúng ta đã đề cập trong chương này (Process Hacker, Noriben, Wireshark, Inetsim) đã được khởi động:

C:>rundll32.exe C:\samples\aa.dll,test

Sau khi chạy lệnh, lỗi sau đã xuất hiện, nhưng DLL đã được thực thi thành công. Trong trường hợp này, vì cú pháp chính xác, rundll32.exe đã tải DLL. Kết quả là, hàm entry point của DLL đã được gọi (lần lượt gọi DLLMain, chứa mã độc). Sau đó rundll32.exe cố gắng tìm địa chỉ của hàm xuất test. Vì nó không thể tìm thấy địa chỉ của test, lỗi sau đã hiển thị. Mặc dù thông báo lỗi được hiển thị, DLL đã được tải thành công (đó chính xác là điều chúng ta mong muốn để theo dõi hoạt động của nó).

Ví dụ 2 – Phân tích một DLL có hàm xuất

Để giải thích ví dụ này, chúng ta sẽ xem xét một DLL độc hại khác (obe.dll). Hình ảnh chụp màn hình sau đây hiển thị hai hàm (DllRegisterServer và DllUnRegisterServer) được xuất bởi DLL:

Mẫu DLL được chạy bằng lệnh sau. Mặc dù obe.dll được tải vào bộ nhớ của rundll32.exe, nó không gây ra bất kỳ hành vi nào. Điều này xảy ra vì hàm điểm nhập DLL không thực thi bất kỳ chức năng nào:

C:>rundll32.exe c:\samples\obe.dll,test

Trên một cạnh khác, khi chạy mẫu với chức năng DllRegisterServer như dưới đây, nó gây ra giao tiếp HTTPS với máy chủ C2. Từ đây, có thể suy ra rằng DLLRegisterServer thực hiện chức năng mạng:

C:>rundll32.exe c:\samples\obe.dll,DllRegisterServer

4.3 Phân tích DLL bằng cách sử dụng Process Checks

Hầu hết thời gian, việc khởi chạy một DLL bằng rundll32.exe sẽ hoạt động tốt, nhưng một số DLL kiểm tra xem chúng đang chạy dưới một quy trình cụ thể (như explorer.exe hoặc iexplore.exe) và có thể thay đổi hành vi hoặc chấm dứt chính nó nếu chúng đang chạy dưới bất kỳ quy trình nào khác (bao gồm cả rundll32.exe). Trong những trường hợp như vậy, bạn sẽ phải tiêm vào DLL vào quy trình cụ thể để kích hoạt hành vi.

Một công cụ như RemoteDLL cho phép bạn tiêm một DLL vào bất kỳ quy trình nào đang chạy trên hệ thống. Nó cho phép bạn tiêm một DLL bằng ba phương pháp khác nhau; điều này hữu ích vì nếu một phương pháp thất bại, bạn có thể thử một phương pháp khác.

DLL (tdl.dll) sử dụng trong ví dụ sau đây là một thành phần của TDSS Rootkit. DLL này không chứa bất kỳ hàm xuất nào; tất cả hành vi độc hại được thực hiện trong hàm điểm nhập DLL. Chạy DLL bằng lệnh sau tạo ra lỗi cho biết quá trình khởi tạo DLL không thành công, đây là biểu hiện rằng hàm điểm nhập DLL không được thực hiện thành công:




<Cảm ơn vì đã bỏ thời gian đọc đống chữ dài dòng rất hàn lâm này thay vì nhắn tin vs ny (▀̿Ĺ̯▀̿ ̿)>

Leave a Reply

Your email address will not be published. Required fields are marked *

Proudly powered by WordPress | Theme: Code Blog by Crimson Themes.