Mã độc như virus, Trojans, worms, spyware và rootkits cho phép hacker xâm nhập vào các hệ thống bảo mật và thực hiện cuộc tấn công vào các hệ thống mục tiêu. Vì vậy, để phát hiện và khắc phục các mã độc hiện có và ngăn chặn các tấn công khác trong tương lai, việc thực hiện phân tích mã độc là rất quan trọng. Có nhiều công cụ và phương pháp được sử dụng để thực hiện nhiệm vụ này. Phần này sẽ giải thích quy trình phân tích mã độc và thảo luận về các công cụ được sử dụng để thực hiện điều nó.
Sheep Dip Computer là gì?
Sheep Dip Computer, trong lĩnh vực an ninh thông tin và phân tích malware, là một thuật ngữ chỉ việc phân tích các file hoặc thông điệp đáng ngờ để xác định sự hiện diện của malware. Tương tự như quá trình “đặt cừu vào nước tẩy“, trong đó cừu được ngâm trong dung dịch hóa chất để làm cho chúng không có ký sinh trùng, việc sheep dip computer nhằm tạo ra một máy tính được cô lập, không liên kết với các máy tính khác trên mạng để ngăn chặn sự xâm nhập của malware vào hệ thống.
Trước khi tiến hành quá trình này, cần lưu trữ tất cả các chương trình đã tải xuống trên các thiết bị lưu trữ bên ngoài như CD-ROM hoặc DVD.
Một máy tính được sử dụng cho sheep dip computer cần có các công cụ như port monitor, file monitor, network monitor và một hoặc nhiều chương trình diệt virus để thực hiện phân tích malware trên các file, ứng dụng, tin nhắn, các thiết bị phần cứng ngoại vi (như USB và ổ đĩa) và nhiều tác vụ khác.
Một số tác vụ thông thường thực hiện trong quá trình sheep dip computer bao gồm:
- Kiểm tra quyền user, group và tiến trình đang chạy
- Kiểm tra các port và mạng đang hoạt động
- Kiểm tra các trình device controller và các file
- Kiểm tra hệ thống registry và kernel
Antivirus Sensor System
Hệ thống cảm biến diệt virus (Antivirus Sensor Systems) là một tập hợp phần mềm máy tính nhằm phát hiện và phân tích các mối đe dọa từ mã độc như virus, worm và Trojan. Hệ thống này được sử dụng cùng với các máy tính sheep dip.
Các cảm biến diệt virus có thể được cài đặt trực tiếp trên các máy tính cá nhân hoặc được triển khai trên hệ thống mạng toàn diện. Chúng thường sử dụng cơ sở dữ liệu cập nhật liên tục để nhận diện các biểu hiện mới của mã độc, cũng như các phương pháp phân tích heuristics để phát hiện những mối đe dọa chưa được biết đến trước đó. Vai trò chính của hệ thống cảm biến diệt virus là bảo vệ máy tính và mạng khỏi các mối đe dọa đến từ mã độc. Khi phát hiện được một sự xâm nhập, nó có thể cảnh báo người dùng, xử lý hoặc cách ly các tệp tin nghi ngờ, và thực hiện các biện pháp khắc phục để ngăn chặn sự lây lan và gây hại từ mã độc đó.
Giới thiệu về Malware Analysis
Mục tiêu chính của việc phân tích mã độc
Malware có thể gây ra tổn thất về trí tuệ và tài chính đối với mục tiêu, bất kể đó là cá nhân, một nhóm người hay một tổ chức. Hơn nữa, nó có khả năng lan truyền từ một hệ thống này sang hệ thống khác một cách dễ dàng và âm thầm.
Phân tích malware là quá trình dịch ngược một mẫu malware cụ thể để xác định nguồn gốc, chức năng và tác động tiềm năng của nó. Qua việc thực hiện phân tích malware, ta có thể trích xuất thông tin chi tiết về nó. Đây là một phần quan trọng không thể thiếu trong quá trình kiểm tra xâm nhập.
Các mục tiêu chính của việc phân tích một chương trình độc hại là như sau:
- Xác định chính xác những gì đã xảy ra
- Xác định ý đồ
- Phát hiện các chỉ số của việc xâm phạm
- Xác định mức độ phức tạp của kẻ xâm nhập
- Xác định các lỗ hổng đã bị khai thác
- Xác định phạm vi thiệt hại do sự xâm nhập gây ra
- Bắt giữ kẻ gây ra việc cài đặt phần mềm độc hại
- Phân biệt kẻ xâm nhập hoặc người nội bộ chịu trách nhiệm cho việc xâm nhập.
Cần tuân thủ những gì?
Khi các bạn phân tích mã đôc, cần tuân thủ các hướng dẫn sau đây:
- Trong quá trình phân tích, tập trung vào các đặc điểm cơ bản thay vì hiểu mọi chi tiết.
- Thử nghiệm các công cụ và phương pháp khác nhau để phân tích, vì một phương pháp duy nhất có thể không hữu ích.
- Xác định, hiểu và đánh bại các kỹ thuật ngăn chặn phân tích mã độc.
Phân loại
Cả hai kỹ thuật đều nhằm hiểu cách hoạt động của mã độc, nhưng chúng khác nhau về các công cụ sử dụng cũng như thời gian và kỹ năng cần thiết để thực hiện phân tích. Ta nên thực hiện cả phân tích tĩnh lẫn phân tích động để có cái nhìn sâu sắc hơn về chức năng của mã độc.
- Phân tích tĩnh (Static Analysis): Nó còn được gọi là phân tích code, và nó liên quan đến việc chỉ xem xét code chứ không cần thực thi. Quá trình này sử dụng các công cụ và kỹ thuật khác nhau để xác định phần nào là phần độc độc hại của một chương trình hoặc file. Phương pháp này cũng thu thập thông tin về chức năng của mã độc và thu thập các chỉ mục kỹ thuật hoặc signature đơn giản mà mã độc tạo ra. Các chỉ mục này bao gồm tên file, giá trị MD5 hoặc băm, loại filevà kích thước file.
- Phân tích động (Dynamic Analysis): Phân tích động còn được gọi là phân tích hành vi, và nó liên quan đến việc thực thi mã độc để biết cách nó tương tác với máy tính cũng như tác động của nó đối với hệ thống sau khi nó xâm nhập vào hệ thống. Viêc phân tích này có thể tiết lộ thông tin như domain, file path, các key registry được tạo ra, địa chỉ IP, các file thêm vào, file đã cài đặt, DLL và các file liên kết nằm trên hệ thống hoặc mạng.
Quy trình phân tích mã độc
Phân tích mã độc cung cấp một hiểu biết sâu sắc về mỗi mẫu mã độc và xác định xu hướng công nghệ mới từ một lượng lớn các mẫu. Các mẫu mã độc này phần lớn tương thích với các file thực thi nhị phân trên Windows. Việc phân tích mã độc trên các thiết bị kết nối với mạng doanh nghiệp là rất nguy hiểm. Do đó, luôn luôn nên phân tích các mẫu mã độc trong một môi trường thử nghiệm trên một mạng cô lập.
Phân tích mã độc bao gồm các bước sau:
- Chuẩn bị môi trường thử nghiệm (Testbed)
- Phân tích tĩnh (Static Analysis)
- Phân tích động (Dynamic Analysis)
Chuẩn bị môi trường thử nghiệm
Yêu cầu để xây dựng một môi trường thử nghiệm (testbed):
- Một mạng thử nghiệm cô lập để chứa testbed và các dịch vụ mạng cô lập như DNS.
- Các máy mục tiêu được cài đặt với nhiều hệ điều hành và trạng thái cấu hình khác nhau (chưa được vá lỗi, đã được vá lỗi, …).
- Các công cụ và phương pháp sao lưu và khôi phục để nhanh chóng xóa và xây dựng lại máy mục tiêu.
- Một số công cụ được yêu cầu cho việc kiểm thử.
Dưới đây là những công cụ quan trọng:
- Công cụ imaging: Để có được ảnh đĩa sạch cho mục đích điều tra và xử lý hình sự.
- Công cụ phân tích file/dữ liệu: Để thực hiện phân tích tĩnh của các file malware.
- Công cụ Registry/configuration: Xác định xem malware xâm nhập vào registry Windows và các biến cấu hình nào khác.
- Sandbox: Phân tích động thủ công.
- Công cụ phân tích log: Các thiết bị bị tấn công ghi lại các hoạt động của malware và tạo ra các file log. Các công cụ này được sử dụng để trích xuất các file log đó.
- Công cụ thu thập mạng: Để hiểu cách malware giao tiếp với ai bên ngoài mạng.
Các bước để chuẩn bị môi trường thử nghiệm (testbed):
- Bước 1: Cấp phát hệ thống vật lý
- Bước 2: Cài đặt máy ảo (VMware, Hyper-V, …) trên hệ thống
- Bước 3: Cài đặt hệ điều hành trên các máy ảo
- Bước 4: Cô lập hệ thống khỏi mạng bằng cách đảm bảo rằng card mạng NIC đang ở chế độ “Host-Only”
- Bước 5: Mô phỏng các dịch vụ Internet bằng các công cụ như INetSim (https://www.inetsim.org)
- Bước 6: Vô hiệu hóa “Sharing Folder” và “Guest Isolation“
- Bước 7: Cài các công cụ phân tích mã độc
- Bước 8: Tạo giá trị băm (hash value) cho từng hệ điều hành và công cụ
- Bước 9: Sao chép mã độc vào máy ảo
Phân tích tĩnh
Phân tích tĩnh là quá trình điều tra một file thực thi mà không chạy hoặc cài đặt nó. Do đó, việc thực hiện phân tích tĩnh là an toàn. Tuy nhiên, một số loại mã độc không cần thực thi mà vẫn có thể gây hại. Do đó, người điều tra vẫn nên thực hiện phân tích tĩnh trong một môi trường cô lập. Phân tích tĩnh thực chất là kiểm tra code để tìm các cấu trúc dữ liệu, lời gọi hàm, …, có thể đại diện cho hành vi độc hại hay không.
Mình có hẳn 1 bài nói chi tiết về phân tích tĩnh, các bạn có thể đọc thêm ở bài Kỹ thuật phân tích tĩnh trong phân tích mã độc.
Một số kỹ thuật phân tích malware:
File Fingerprinting
File fingerprinting là quá trình tính toán giá trị băm (hash value) cho file. Quá trình này bao gồm tính toán các giá trị băm để nhận diện chức năng của nó và so sánh nó với các giá trị băm của các mã độc khác hoặc các file khác từ các tình huống trước đó. Giá trị băm có thể được sử dụng để nhận dạng mã độc hoặc định kỳ kiểm tra xem có thay đổi nào được thực hiện trên mã nhị phân trong quá trình phân tích hay không.
Các fingerprinting này được sử dụng để theo dõi và xác định các chương trình tương tự từ cơ sở dữ liệu. Fingerprinting không hoạt động cho một số loại file tin cụ thể, bao gồm các file được mã hóa hoặc được bảo mật bằng mật khẩu, hình ảnh, âm thanh, video, …
Thuật toán MD5 (Message-Digest Algorithm 5) và SHA-1 (Secure Hash Algorithm 1) là hai hàm băm phổ biến nhất được sử dụng trong phân tích malware. Các công cụ khác nhau như HashMyFiles có thể sử dụng để tạo fingerprinting cho file nghi ngờ. HashMyFiles là một công cụ giao diện đồ họa (GUI) có thể tính toán các giá trị băm khác nhau.
HashMyFiles tạo giá trị băm cho một file tin bằng cách sử dụng các thuật toán MD5, SHA1, CRC32, SHA-256, SHA-512 và SHA-384. Công cụ cũng cung cấp thông tin về file tin như đường dẫn đầy đủ, ngày tạo, ngày sửa đổi, kích thước, thuộc tính, phiên bản và phần mở rộng, giúp ích trong việc tìm kiếm và so sánh các file tương tự.
Local and Online Malware Scanning
Ta có thể sử dụng các công cụ nổi tiếng để kiểm tra xem virus có được tìm thấy trước đó hay chưa, có thể rằng nó đã được nhiều nhà cung cấp phần mềm diệt virus phát hiện và đã lưu lại vào CSDL.
VirusTotal tính toán giá trị băm của một file và so sánh với cơ sở dữ liệu của nó để xác định sự tồn tại của mã độc trong quá khứ. Quá trình này đơn giản hóa việc điều tra tiếp theo bằng cung cấp thông tin chi tiết về code, chức năng các chi tiết quan trọng khác. Ngoài ra, VirusTotal cung cấp các chi tiết quan trọng như máy mục tiêu, thời gian biên dịch, loại file, bộ xử lý tương thích, entry point, các PE sections, thư viện liên kết dữ liệu (DLLs), các tài nguyên PE sử dụng, các giá trị băm khác nhau, code chương trình, loại kết nối được thiết lập, …
Performing Strings Search
Các chương trình sẽ chứa các chuỗi lệnh để thực hiện các chức năng cụ thể. Những chuỗi này truyền thông tin từ chương trình đến người dùng. Tuy nhiên trong một số trường hợp, các chuỗi này có thể mang nội dung độc hại.
Viêc tìm kiếm qua các chuỗi này có thể cung cấp thông tin về chức năng cơ bản của chương trình, giúp xác định các hành động gây hại mà chương trình có thể thực hiện. Ta có thể sử dụng các công cụ như BinText để trích xuất chuỗi được nhúng từ các file thực thi.
Xác định phương pháp đóng gói/giấu mã
Hacker sử dụng phương pháp đóng gói và giấu mã để nén, mã hóa hoặc sửa đổi file thực thi nhằm tránh phát hiện. Giấu mã cũng có thể che giấu việc thực thi các chương trình. Khi người dùng chạy một chương trình đã được đóng gói, chương trình đó cũng chạy một chương trình nhỏ để giải nén file đã được đóng gói và sau đó chạy file đã giải nén. Điều này gây khó khăn khi dịch ngược mã độc.
PEiD là một công cụ miễn phí cung cấp thông tin về các file thực thi Windows. Nó có khả năng nhận dạng các signature liên quan đến hơn 600 packer và trình biên dịch khác nhau. Công cụ này cũng có thể hiển thị loại packer được sử dụng cho việc đóng gói chương trình. Ngoài ra, nó còn hiển thị các thông tin bổ sung như entry point, vị trí file, phần EP và subsystem được sử dụng để đóng gói.
Tìm thông tin về Portable Executables (PE)
Định dạng Portable Executable (PE) là định dạng file thực thi được sử dụng trên hệ điều hành Windows, lưu trữ thông tin mà hệ thống Windows cần để quản lý mã thực thi. Nó lưu trữ siêu dữ liệu (meta data) về chương trình và giúp tìm ra các thông tin chi tiết về file đó. Ví dụ, file nhị phân Windows có định dạng PE, và nó có một số thông tin như thời gian tạo và sửa đổi file, các hàm nhập, xuất, thời gian biên dịch, DLL, các file liên kết, chuỗi, …
PE header của một file bao gồm các phần sau:
- .text: Chứa các chỉ thị và code chương trình mà CPU thực thi.
- .rdata: Chứa thông tin nhập và xuất cũng như read-only data khác được sử dụng bởi chương trình.
- .data: Chứa dữ liệu toàn cục mà hệ thống có thể truy cập từ bất kỳ đâu.
- .rsrc: Bao gồm các tài nguyên như biểu tượng, hình ảnh, menu, chuỗi, phần này cũng cung cấp hỗ trợ đa ngôn ngữ.
Ta có thể sử dụng thông tin header để thu thập thêm chi tiết về một file hoặc chương trình bằng các công cụ như PEView để trích xuất các thông tin được đề cập ở trên.
PE Explorer là một công cụ cho phép mở, xem và chỉnh sửa nhiều loại file thực thi Windows 32-bit (còn được gọi là file PE) từ các loại phổ biến như EXE, DLL và ActiveX Controls đến các loại ít quen thuộc như SCR (Screensavers), CPL (Control Panel Applets), SYS, MSSTYLES, BPL, DPL,…
Xác định File Dependencies
Bất kỳ chương trình nào đều phụ thuộc vào các thư viện tích hợp sẵn của hệ điều hành, giúp thực hiện các hành động cụ thể trên hệ thống. Chúng lưu trữ các hàm nhập và xuất trong file kernel32.dll. Ta cần tìm các thư viện và file dependencies, vì chúng chứa thông tin về các run-time requirement của một ứng dụng. File dependencies bao gồm các thư viện liên kết, các hàm và lời gọi hàm, giúp ta đoán được mã độc có thể thực hiện những gì.
Một số chuẩn DLLs như hình bên dưới:
Dependency Walker là một công cụ cho phép liệt kê tất cả các module phụ thuộc của một file thực thi và xây dựng biểu đồ cây phân cấp cho các phụ thuộc đó. Nó cũng có thể ghi lại tất cả các hàm của mỗi module trong các hàm xuất và gọi. Hơn nữa, nó phát hiện nhiều vấn đề phổ biến trong ứng dụng như file bị thiếu hoặc không hợp lệ, không phù hợp trong việc nhập/xuất, lỗi phụ thuộc vòng tròn, không phù hợp với các module máy tính và lỗi khởi tạo module.
Malware Disassembly
Phân tích tĩnh cũng bao gồm việc chuyển đổi một file thực thi cụ thể thành định dạng nhị phân để nghiên cứu các chức năng và tính năng của nó. Quá trình này giúp xác định ngôn ngữ được sử dụng để lập trình mã độc, các API, … Dựa trên các mã hợp ngữ đã tái tạo, ta có thể kiểm tra logic của chương trình và nhận ra khả năng gây nguy hiểm của nó. Để thực hiện quá trình này, ta có thể sử dụng các công cụ như IDA Pro và OllyDbg.
IDA Pro là một công cụ disassembler và gỡ lỗi đa nền tảng, nó tạo ra hợp ngữ và mã giả để dễ dàng phân tích. Các tính năng:
- Disassembler
- Debugger
Một số công cụ dịch ngược khác:
- Ghirda
- x64dbg
- Radare
- Oily Dbg
- Win Dbg
Phân tích file thực thi ELF
ELF là một định dạng file thực thi chung trong Linux. Nó bao gồm ba thành phần chính bao gồm ELF header, các sections và các segments. Mỗi thành phần đóng vai trò độc lập trong việc tải và thực thi.
Trích xuất các ký hiệu
Trích xuất các ký hiệu (symbols) là quá trình lấy lại các loại dữ liệu như hàm và biến được sử dụng trong code được sử dụng bởi người lập trình, giúp hiểu được chức năng của code. Chạy lệnh sau để trích xuất các ký hiệu từ một file thực thi ELF:
Symbol table '.symtab' contains 32 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000400248 0 SECTION LOCAL DEFAULT 1
2: 0000000000400268 0 SECTION LOCAL DEFAULT 2
3: 0000000000400280 0 SECTION LOCAL DEFAULT 3
4: 00000000004002a0 0 SECTION LOCAL DEFAULT 4
5: 0000000000601ff0 0 SECTION LOCAL DEFAULT 5
6: 0000000000602000 0 SECTION LOCAL DEFAULT 6
7: 0000000000602028 0 SECTION LOCAL DEFAULT 7
8: 0000000000602040 0 SECTION LOCAL DEFAULT 8
9: 0000000000400330 0 SECTION LOCAL DEFAULT 9
...
30: 0000000000000000
Ở đây, option -s được sử dụng để hiển thị các mục trong phần bảng ký hiệu của file. Hoặc sử dụng các tùy chọn --symbols
hoặc --syms
để trích xuất các ký hiệu.
Xác định program headers
Header tiết lộ cấu trúc bộ nhớ của code nhị phân. Nó giúp xác định xem file thực thi ELF có được đóng gói đúng cách hay không. Để mục đích này, công cụ readelf có thể được sử dụng với tùy chọn -l theo sau là tên file.
Elf file type is EXEC (Executable file)
Entry point 0x400040
There are 9 program headers, starting at offset 64
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
PHDR 0x0000000000000040 0x0000000000400040 0x0000000000400040
0x00000000000001f8 0x00000000000001f8 R 0x8
INTERP 0x0000000000000238 0x0000000000400238 0x0000000000400238
0x000000000000001c 0x000000000000001c R 0x1
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x0000000000000720 0x0000000000000720 R E 0x200000
LOAD 0x0000000000000db8 0x0000000000600db8 0x0000000000600db8
0x0000000000000220 0x0000000000000228 RW 0x200000
DYNAMIC 0x0000000000000dd0 0x0000000000600dd0 0x0000000000600dd0
0x0000000000000200 0x0000000000000200 RW 0x8
NOTE 0x0000000000000254 0x0000000000400254 0x0000000000400254
0x0000000000000044 0x0000000000000044 R 0x4
GNU_EH_FRAME 0x00000000000006b8 0x00000000004006b8 0x00000000004006b8
0x000000000000001c 0x000000000000001c R 0x4
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 0x10
GNU_RELRO 0x0000000000000db8 0x0000000000600db8 0x0000000000600db8
0x00000000000001f0 0x00000000000001f0 R 0x1
Section to Segment mapping: