Mục lục bài viết || Contents of the article

    Kết thúc chuyên đề phân tích mã độc lab là bài phân tích về cấu trúc 03 của mã độc LAB 07. Bài viết lần này sẽ lần lượt tìm hiểu các nội dung: Chương trình đạt được trạng thái ổn định như thế nào để đảm bảo nó vẫn hoạt động sau khi máy tính khởi động lại? Đưa ra 2 chữ kí dạng host-based để nhận diện mã độc? Mục đích chương trình là gì? Phương pháp gỡ bỏ mã độc khi bị lây nhiễm?

    Lab 7-3 gồm 2 file: Lab07-03.dll và Lab07-03.exe

    Kiểm tra thấy cả EXE và DLL đều không được packed, được biên dịch bằng Microsoft Visual C++ 6.0.

    Kiểm tra nhanh DLL:

    DLL import một số hàm từ KERNEL32.dll, WS2_32.dll và MSVCRT.dll, trong đó đáng chú ý là các hàm thao tác với process và mutex. Các hàm networking từ WS2_32.dll được import theo ordinal, ta sẽ xem xét chúng về sau.

    lab 7.31

    lab 7.32

    Không có thông tin Export của DLL. Do đó DLL này không thể được import bởi một chương trình. Nhưng một chương trình vẫn có thể sử dụng các hàm của một DLL không có Export thông qua hàm LoadLibrary.

    lab 7.33

    Một string đáng lưu ý trong DLL là địa chỉ IP: 127.26.152.13, đây là một địa chỉ C&C server.

    lab 7.34

    Kiểm tra nhanh EXE:

    EXE Import một số hàm từ KERNEL32.dll và MSVCRT.dll. Đáng chú ý có một số hàm xứ lý handle.

    lab 7.35

    Không thấy có dấu hiệu trong PE Import table cho thấy Lab07-03.EXE sử dụng Lab07-03.DLL hoặc import bất kỳ hàm nào từ Lab07-03.DLL.

    String đáng chú ý trong EXE gồm: kerne132.dll, kernel32.dll, Kernel32., Lab07-03.dll, C:\windows\system32\kerne132.dll, C:\Windows\System32\Kernel32.dll.

    Mã độc có thể thực hiện thay thế, giả mạo file KERNEL32.dll.

    lab 7.36

    Thực thi mã độc bằng cách double click vào Lab07-03.exe.

    Kết quả ProcMon khi thực thi mã độc:

    lab 7.37

    Theo dõi Service Manager sau khi thực thi mã độc, không thấy xuất hiện service khả nghi.

    ⇒  Không phát hiện dấu hiệu khả nghi nào đáng kể.

    Tiến hành phân tích tĩnh với IDA Pro

    • Phân tích file Lab07-03.DLL

    Hàm DLLMain

    lab 7.38

    lab 7.39

    lab 7.40

    lab 7.41

    Đầu tiên, mã độc thực hiện kiểm tra không gian stack xem có đủ 4600 byte không, sử dụng hàm __alloca_probe (0x10001015). Chức năng này giúp tránh lỗi stack overflow.

    Nhìn nhanh qua sơ đồ giả mã hàm DllMain, phán đoán:

    • Mã độc thử mở Mutex với tên “SADFHUHF” để kiểm tra xem đã có instance nào của nó đang được thực thi chưa. Nếu đã có instance khác, mã độc kết thúc thực thi; nếu không, nó tạo một mutext với tên “SADFHUHF” để đánh dấu sự tồn tại của mình trong hệ thống.
    • Mã độc cố gắng mở một socket bằng hàm socket với các thàm số:
    • Nếu mở socket thành công, mã độc thực hiện dịch string “127.26.152.13” thành địa chỉ TCP/IP network byte order sau đó thiết lập một kết nối tới địa chỉ IP này.
    • Mã độc sử dụng chuỗi “hello” làm dữ liệu gửi liên tục đến socket đã mở và mỗi lần gửi chuỗi “hello”, mã độc cũng thực hiện gửi tín hiệu SD_SEND (shutdown send) tới socket, đồng thời lắng nghe dữ liệu nhận được. Nếu dữ liệu nhận được bằng 0, lặp lại thao tác send-shutdown-recv; Nếu dữ liệu nhận được > 0, so sánh 5 byte đầu tiên của dữ liệu với chuỗi “Sleep”.
    • Nếu 5 byte đầu tiên của dữ liệu nhận được là chuỗi “Sleep”, mã độc thực hiện ngủ trong khoảng 6.5 phút rồi lặp lại thao tác send-shutdown-recv-strncmp.
    • Nếu 5 byte đầu tiên của dữ liệu nhận được khác chuỗi “Sleep”, mã độc so sánh 4 byte đầu tiên của dữ liệu với chuỗi “exec”, nếu không đúng, mã độc ngủ trong khoảng 6.5 phút. Nếu 4 byte đầu tiên của dữ liệu nhận được là chuỗi “exec”, mã độc tạo một process bằng hàm CreateProcess với các tham số (https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx) :
      • lpApplicationName: 0, tên tiến trình sẽ là chuỗi string liền trước dấu cách đầu tiên trong chuỗi lệnh command line.
      • lpCommandLine: Lệnh command line, là phần tính từ byte thứ 5 của dữ liệu nhận được.
      • lpProcessAttributes: Handle không cho phép kế thừa.
      • lpThreadAttributes: Handle không cho phép kế thừa.
      • bInheritHandles: Không còn quan trọng nữa vì 2 tham số trên.
      • dwCreationFlags: 8000000h, CREATE_NO_WINDOW (https://msdn.microsoft.com/en-us/library/windows/desktop/ms684863(v=vs.85).aspx)
      • lpEnvironment: Không quan trọng
      • lpCurrentDirectory: Cùng đường dẫn thư mục với tiến trình gọi (Lab07-03.EXE (hay DLL???)).
      • lpStartupInfo:
      • lpProcessInformation:
    • Sau đó mã độc ngủ trong khoảng 6.5 phút và lặp lại thao tác send-shutdown-recv-strncmp…

    => Trick (confirmed) : Có thể phán đoán nhanh các chức năng của một mã độc bằng việc chỉ quan tâm đến các lệnh call.

    • Phân tích file Lab07-03.EXE: Nhận xét nhanh luồng thực thi của mã độc:
    • Kiểm tra các tham số đầu vào, nếu không có đúng 2 tham số, kết thúc thực thi (chính là nguyên nhân khi thử thực thi mã độc ở phần phân tích động, mã độc nhanh chóng kết thúc).

    lab 7.42

    • So sánh tham số đầu vào thứ 2 với chuỗi “WARNING_THIS_WILL_DESTROY_YOUR_MACHINE”, nếu đúng, thực hiện các chức năng độc hại tiếp theo. Nếu sai, kết thúc thực thi. => Để mã độc tiếp tục thực thi:

    Lab07-03.exe WARNING_THIS_WILL_DESTROY_YOUR_MACHINE

    lab 7.43

    lab 7.44

    Các chức năng độc hại sau khi mã độc vượt qua 2 bước kiểm tra tham số đầu vào:

    • Thực hiện tạo hoặc mở một file với đường dẫn “C:\\Windows\\System32\\Kernel32.dll”, quyền truy cập GENERIC_READ (http://www.asmcommunity.net/forums/topic/?id=29466), chế độ chia sẻ FILE_SHARE_READ, chỉ mở file khi nó đã tồn tại trong hệ thống (dwCreationDisposition = 3, OPEN_EXISTING), hTemplateFile = EAX. Nhìn vào đường dẫn file này và quyền truy cập READ, dễ dàng đoán được cụ thể mã độc mở và đọc nội dung file Kernel32.dll. (https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx)
    • Tạo một file mapping object với quyền PAGE_READONLY, sau đó thực hiện map mapping object vừa tạo với không gian bộ nhớ của tiến trình mã độc.

    lab 7.45

    • Mở file Lab07-03.dll trong cùng thư mục với tiến trình mã độc thông qua hàm CreateFile, với quyền truy cập 10000000h (chưa tìm ra EQU tương ứng). Nếu không mở được file này, mã độc kết thúc thực thi.
    • Với file Lab07-03.dll mở thành công, mã độc tạo một mapping object và map object đó vào không gian bộ nhớ tiến trình của nó.
    • Các đoạn code loc_401538, loc_401653, loc_40169F, loc_401783, và loc_4017B9 chứa một loạt lệnh tính toán và thao tác với không gian bộ nhớ => chỉ phán đoán đoạn code này thực hiện đọc và ghi trên hai file C:\Windows\System32\Kernel32.dll và Lab07-03.dll, dựa vào dwDesiredAccess có thể nhận xét mã độc đọc từ Kernel32.dll và ghi vào Lab07-03.dll. (Không nên đi quá sâu vào các đoạn code rối rắm như thế này, ta có thể thực hiện phân tích động với tham số đúng và quan sát thay đổi của 2 file này sau.). Trong các đoạn code trên, mã độc thực hiện gọi tới hai hàm sub_401040 và sub_401070. Hai hàm này ngắn và thực hiện một loạt các phép toán và thao tác trên bộ nhớ, cũng không cần phân tích sâu. (Việc đi sâu vào các hàm hay đoạn code rối rắm như vậy có thể coi là những cái bẫy cần tránh.)

    lab 7.47

    lab 7.48

    lab 7.49

    • Trong hàm main, sau khi qua một loạt các đoạn code tính toán và thao tác trên bộ nhớ, mã độc đóng hai handle của hai file C:\Windows\System32\Kernel32.dll và Lab07-03.dll, sau đó thực hiện copy file Lab07-03.dll tới địa chỉ và tên file mới là C:\windows\system32\kerne132.dll thông qua hàm CopyFile tại dòng 0x4017F4. Rõ ràng mã độc cố gắng giả mạo kernel32.dll bằng Lab07-03.dll với cái tên nhạy cảm là kerne132.dll. Nếu không thực hiện thành công hàm CopyFile nêu trên, mã độc nhảy tới loc_401806; nếu thực hiện thành công hàm CopyFile, mã độc gọi hàm exit, kết thúc thực thi..

    lab 7.51

    • loc_401806: Mã độc truyền tham số đầu vào là chuỗi “C:\*” và gọi hàm sub_4011E0.
    • Xét hàm sub_4011E0:

    Nhìn vào dòng 1, nhận thấy “C:\*” là giá trị của tham số đầu vào lpFileName. Ngay đầu hàm sub_4011E0, mã độc thực hiện tìm kiếm file thông qua lời gọi hàm FindFirstFile, với tham số lpFileName chính là “C:\*”.

    Như vậy, mã độc thực hiện tìm kiếm ổ C:

    Ngay sau đó lại là một loạt code thực hiện tính toán, so sánh và thao tác trên bộ nhớ, từ loc_401210 tới loc_40135C. Sau các đoạn code trên, mã độc thực hiện gọi chính hàm sub_4011E0, đệ quy những thao tác vừa thực hiện.

    Có một chú ý trong khối code phức tạp trên, mã độc push giá trị “.exe” làm tham số đầu vào (Str2) cho hàm _stricmp.(https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_71/rtref/stricmp.htm). Có thể kết luận mã độc tìm kiếm các file định dạng .exe trong ổ C:. Mỗi khi tìm được 1 file .exe, mã độc nhảy tới hàm sub_4010A0. Mã độc tiếp tục tìm kiếm trong ổ C: bằng hàm FindNextFile.

    Xem xét hàm sub_4010A0:

    Mã độc thực hiện mở file thông qua hàm CreateFile, với quyền truy cập ghi (dwDesiredAccess = 10000000h); tạo một mapping object cho file với flProtect = 4 (PAGE_READWRITE) và thực hiện map mapping object vừa tạo với không gian nhớ của tiến trình. Tất cả các hàm này thực hiện trên cùng một file (EAX).

    lab 7.52

    Trong khi đảm bảo quyền đọc file, mã độc thực hiện lặp thao tác tìm kiếm chuỗi string “kernel32.dll” trong file map.

    lab 7.53

    lab 7.54

    Các lệnh repne và rep tại 0x401186, 0x401196 và 0x40119D tương ứng với các hàm strlen và memcpy. Nhìn vào giả mã, thấy hàm memcpy thực hiện copy dword_403010 và ghi đè lên v10. Trong khi v10 đối với hàm stricmp chính là Str1, hay trong code dịch ngược, nó là giá trị trên EBX (dòng 0x401173). Tóm lại, ở đoạn code này, mã độc thực hiện ghi đè giá trị dword_403010 lên vùng nhớ của chuỗi string “kernel32.dll” trong không gian nhớ file map.

    lab 7.55

    Nếu dùng dword_403010 để thay thế một chuỗi string, nhiều khả năng dword_403010 cũng là một string đặc biệt. Ta dịch giá trị 6E72656Bh sang string, được . (Trong IDA Pro, đặt con trỏ chuột vào giá trị Hexa này và nhấn phím A)

    lab 7.56

    Như vậy, mã độc không sửa đổi file C:\Windows\System32\Kernel32.dll mà đọc nội dung của file này, ghi vào file Lab07-03.dll, sau đó copy file Lab07-03.dll thành file C:\windows\system32\kerne132.dll. Sau đó, mã độc thực hiện duyệt tất cả các file .exe trong ổ C: và tìm kiếm nếu file .exe nào sử dụng thư viện kernel32.dll, nó sẽ thay thế bằng DLL độc hại –  kerne132.dll.

    Như vậy, chúng ta có thể đưa ra các kết luận:

    1. Chương trình đạt được trạng thái ổn định như thế nào để đảm bảo nó vẫn hoạt động sau khi máy tính khởi động lại?

    Chương trình thực hiện việc mapping C:\\Windows\\System32\\Kernel32.dll và Lab07-03.dll, sau khi thực hiện một loạt các hành vi, nó tiến hành sửa một hoặc cả hai file trên. Cuối cùng, file: C:\\windows\\system32\\kerne132.dll được tạo ra. Bằng phương thức này, mã độc đảm bảo hoạt động ngay cả khi chương trình khởi động lại.

    1. Đưa ra 2 chữ kí dạng host-based để nhận diện mã độc?
    • Việc tạo ra file mới: C:\\windows\\system32\\kerne132.dll.
    • Nội dung trong file chứa chuỗi: WARNING_THIS_WILL_DESTROY_YOUR_MACHINE và một mutex: SADFHUHF
    1. Mục đích chương trình là gì?

    Chương trình: Lab07-03.exe sử dụng để thực thi: Lab07-03.dll thành một backdoor hoạt động liên tục trên máy bị lây nhiễm. DLL này kết nối tới địa chỉ C&C: 127.26.152.13 và cho phép nhận lệnh thực thi: sleep và exec.

    1. Phương pháp gỡ bỏ mã độc khi bị lây nhiễm?

    Phương pháp đơn giản nhất là xóa các file: Lab07-03.exe, Lab07-03.dll, kerne132.dll. Tuy nhiên, trước đó cần tìm và chỉnh sửa các chương trình gọi tới DLL này để thực hiện gọi về DLL chuẩn: kernel32.dll.

    Bài viết đề xuất || Recommended
    Không chỉ website của doanh nghiệp nhỏ mà ngay cả website của nhiều tổ chức, doanh nghiệp lớn tại Việt Nam cũng đã từng bị xâm nhập. Thực trạng này dẫn...
    Kiến thức | 24/03/2021
    Một trong những chìa khóa để kinh doanh online thành công là bảo mật website của doanh nghiệp.  1. Lý do doanh nghiệp kinh doanh online cần đẩy mạnh bảo mật...
    Kiến thức | 24/03/2021
    Bảo mật website hiện đang là yêu cầu cấp thiết với mọi doanh nghiệp. Theo đó, các đơn vị an ninh mạng cũng cho ra đời nhiều dịch vụ bảo mật website đa...