[RE021] Phân tích Qakbot – Mã độc nguy hiểm đã tồn tại hơn một thập kỉ

Calendar 18/03/2021
Calendar 3:46 Chiều

1. Tổng quan

Qakbot (còn được biết đến với các tên khác như Qbot, QuakBot, Pinkslipbot) là một trong những Banking Trojan nổi tiếng với nhiệm vụ chính là đánh cắp thông tin tài khoản ngân hàng, các phiên giao dịch trực tuyến hoặc các thông tin tài chính khác. Mặc dù bị các hãng cung cấp phần mềm diệt virus phát hiện từ năm 2008, nhưng cho tới nay Trojan này vẫn tiếp tục hoạt động và được duy trì liên tục bởi những kẻ đứng đằng sau nó. Qakbot liên tục được cải tiến bằng cách áp dụng các kĩ thuật tiên tiến hoặc mới để tránh bị phát hiện, khiến cho việc phân tích trở nên khó khăn hơn. Trong những báo cáo mới đây, Qakbot còn được sử dụng để tải về các mã độc tống tiền khác như ProLockEgregor.

Qakbot có thể được phân phối thông qua Emotet, tuy nhiên với việc Emotet đã bị hạ gục mới đây thì hiện tại con đường chính của mã độc này là thông qua các chiến dịch email spam và phishing. Khác với Emotet sử dụng MS-Word kết hợp với VBA để tải về mã độc, Qakbot lại sử dụng MS-Excel với sự hỗ trợ của Excel 4.0 Macro (XLM macro) để tải và thực thi mã độc trên máy nạn nhân. Trong tương lai gần, các nhóm tin tặc và tội phạm mạng có khả năng sẽ chuyển qua sử dụng mã độc này để tấn công vào các tổ chức hoặc cá nhân ở Việt Nam.

Trong bài viết này, chúng tôi phân tích cách thức lây nhiễm của QakBot sau khi khởi chạy bởi tài liệu Excel độc hại, các kĩ thuật mã độc sử dụng để gây khó khăn cho việc phân tích cũng như cách để trích xuất danh sách C2. Kĩ thuật persistence mà Qakbot sử dụng khá hay, run key chỉ được tạo trước khi máy tắt hoặc chuyển trạng thái suspended và bị xóa ngay lập tức khi Qakbot thực thi lại. Qakbot tận dụng triệt để kĩ thuật mã hóa để che giấu thông tin, cũng như mã hóa payload trên memory.

Các hash được sử dụng trong bài viết:

2. Document template và XLM macro

Các template của Qakbot thay đổi tùy theo chiến dịch, kẻ tấn công thông qua các template này lừa nạn nhân kích hoạt macro để tiến hành lây nhiễm mã độc. Dạng maldocs này thường sẽ có một cell là “Auto_Open cell”, tương tự như hàm “Sub AutoOpen()” trong VBA để tự động thực thi macro khi nạn nhân nhấn nút “Enable Content”.

Như đã đề cập, các template này sử dụng Excel 4.0 macros (có trước cả VBA macros), gồm các hàm được đặt bên trong các ô (cell) của một macro sheet. Để phân tích dạng macro này có thể sử dụng các công cụ:

2.1. XLMMacroDeobfuscator 

Công cụ này cho phép trích xuất nội dung của các cells, cho biết macro sheet nào có cell là “Auto_Open cell”, đồng thời hỗ trợ emulate formula.

Tuy nhiên, do macro trong các maldocs thường sẽ được obfuscate nên không phải lúc nào chức năng emulate của công cụ cũng hoạt động tốt:

2.2. Cerbero Suite

Công cụ này được phát triển bởi Erik Pistelli. Phiên bản mới nhất đã hỗ trợ định dạng XLSB, cho phép decompile được các formula của XLS và XLSB đồng thời cung cấp tính năng xem trước bảng tính gần tương tự như khi mở bằng Microsoft Excel. Hơn nữa, nó cũng cung cấp khả năng emulate các formulas. Trong quá trình trao đổi với tác giả, tôi cùng với bạn của mình đã góp ý và cung cấp các samples để chuyên gia này hoàn thiện các chức năng của sản phẩm.

Tương tự như XLMMacroDeobfuscator, khi thực hiện phân tích maldoc với Cerbero, công cụ này cũng chỉ ra được điểm bắt đầu thực thi (entry point) là cell chứa Auto_Open.

Với sự hỗ trợ của tính năng emulate, có thể thấy maldoc này thực hiện đăng kí hàm API là URLDownloadToFileA, sử dụng hàm này để download các payloads từ nhiều địa chỉ khác nhau:

Nếu download thành công một trong số các payload trên sẽ sử dụng rundll32.exe để thực thi:

2.3. Microsoft Excel

Các công cụ nêu trên dựa vào các thư viện như xlrd2pyxlsb2 cũng như parser, engine riêng để phân tích file. Do đó, trong trường hợp các công cụ này không đáp ứng được thì việc sử dụng Microsoft Excel vẫn là lựa chọn tốt nhất.

Khi phân tích bằng MS Excel, tìm tới cell chứa Auto_Open, lựa chọn tính năng Macros và chọn Step Into để bật cửa sổ Single Step:

Bằng việc sử dụng Step Into hoặc Evaluate để trace theo từng cell trong cùng column và hiển thị giá trị của từng Formula, ta có được thông tin:

Tổng kết lại, khi Qakbot maldoc thực thi được macro, nó sẽ thực hiện tải payload về máy nạn nhân để thực thi bằng rundll32.exe.

3. Loader payload

3.1. Phân tích cơ bản

Theo phân tích ở trên, payload được tải về là một DLL. DLL này export 4 hàm, trong đó có hàm DllRegisterServer được gọi bởi lệnh rundll32:

Dựa vào danh sách các hàm APIs mà DLL này import, có thể đoán được nó sẽ sử dụng để unpack ra một payload khác:

DLL này cũng sử dụng chữ kí số để tránh bị phát hiện bởi các phần mềm diệt virus và các hệ thống phát hiện:

3.2. Phân tích kĩ thuật của loader

DLL này khi thực thi sẽ thực hiện cấp phát và unpack vào memory payload chính và thực thi payload này:

Thực hiện dump payload từ memory để phục vụ phân tích. Payload dump được cũng là một DLL, code bằng Microsoft Visual C++, có tên gốc là stager_1.dll và export một hàm DllRegisterServer:

Để chắc chắn payload dump được là chính chính xác thì thường trong resource của payload này phải có các resource name là “308” và “311”.

4. Một số kĩ thuật được sử dụng trong payload chính

4.1. Junk code

Một kĩ thuật hay được sử dụng trong nhiều mẫu mã độc là chèn mã rác. Với kỹ thuật này, mã độc sẽ chèn rất nhiều mã không bao giờ được thực thi, các lệnh gọi hàm không trả về giá trị hoặc các lệnh nhảy có điều kiện với các điều kiện không bao giờ được đáp ứng. Mục đích chính của những đoạn mã này là làm cho các khối lệnh trông phức tạp hóa lên rất nhiều và gây mất thời gian của người phân tích.

Với payload của Qakbot, kẻ tấn công thực hiện chèn thêm các lời gọi hàm API vô tác dụng xen lẫn giữa các câu lệnh thật, ngoài mục tiêu gây mất thời gian nó có thể gây nhiễu thông tin khi thực thi mã độc trong các môi trường sandbox hoặc thông qua các chương trình ghi nhật kí các lời gọi hàm API.

4.2. Sử dụng quy ước gọi hàm phi chuẩn

Các calling convention tiêu chuẩn thường gặp khi phân tích mã độc là cdecl, stdcall, thiscall hay fastcall. Tuy nhiên, để gây phức tạp, Qakbot lồng ghép quy ước gọi hàm phi chuẩn khiến cho việc nhận biết các tham số truyền cho hàm trở nên khó khăn cũng như Hexrays khi decompile sẽ bị lỗi.

Ví dụ như hàm sau nhận 3 tham số truyền vào, trong đó tham số thứ nhất và thứ ba được đẩy vào stack, tham số thứ hai được gán cho thanh ghi eax. Lúc này Hexrays decompile sẽ nhận diện thiếu tham số:

Tham khảo bài viết sau để định nghĩa lại prototype của hàm. Trong trường hợp trên, ta có thể định nghĩa lại như sau: int __usercall sub_100184FE@<eax>(int arg1, int arg2@<eax>, int arg3). Kết quả có được:

Một ví dụ khác, hàm dưới đây nhận một tham số truyền vào và tham số này được gán cho thanh ghi eax. Việc nhận diện sai dẫn đến Hexrays decompile bị thiếu tham số:

Để giúp Hexrays decompile chính xác, định nghĩa prototype của hàm như sau: int *__usercall sub_10017EC5@<eax>(unsigned int arg1@<eax>). Kết quả thu được:

4.3. Giải mã strings

Tương tự Emotet, các strings chính mà payload sử dụng đều đã bị mã hóa và chỉ được giải mã khi cần sử dụng, sử dụng xong được giải phóng luôn. Các strings này sau khi mã hóa được lưu vào một mảng liên tục. Hàm giải mã nhận tham số truyền vào là giá trị index của chuỗi, sau đó đem XOR với một mảng byte được Qakbot khai báo sẵn. Trong quá trình phân tích payload này, chúng tôi thấy có 02 mảng byte chứa giá trị của các strings ban đầu đã bị mã hóa:

Tương ứng với mỗi mảng trên trên sẽ có một mảng byte chứa các giá trị dùng cho việc xor để giải mã các chuỗi:

Hàm giải mã nhận một tham số duy nhất là index của chuỗi. Bên trong hàm này sẽ gọi tới hàm chính để giải mã ra chuỗi cần sử dụng:

Hàm f_decrypt_string trong hình sẽ thực hiện nhiệm vụ sau:

  • Dựa vào giá trị index truyền vào cho hàm, tính toán độ dài của chuỗi cần giải mã.
  • Cấp phát vùng nhớ để lưu chuỗi giải mã.
  • Thực hiện vòng lặp xor với các bytes của mảng xor_bytes_arr để giải mã ra chuỗi ban đầu.

Với sự hỗ trợ của IDAPython, viết lại đoạn code thực hiện giải mã và bổ sung chú thích tại các hàm giải mã như sau:

Kết quả trước và sau khi thực hiện script sẽ giúp công việc phân tích dễ dàng hơn:

Thực hiện tương tự với các hàm giải mã khác. Tuy nhiên, kết quả trên hình có được sau khi giải mã các chuỗi có index được chỉ định sẵn trong code của Qakbot. Phần còn lại sẽ là các chuỗi với index được tính toán động khi mã độc này thực thi. Ví dụ như đoạn code sau:

Do vậy, để có được toàn bộ các chuỗi giải mã cùng với index liên quan, sử dụng đoạn code sau:

Danh sách toàn bộ các strings được giải mã xem tại Phụ lục 1 – Danh sách toàn bộ strings bên dưới.

4.4. Dynamic APIs resolve

Dựa vào kết quả giải mã strings, thu được danh sách các DLLs mà Qakbot sẽ sử dụng để lấy các hàm APIs cần thiết:

Payload sẽ tìm địa chỉ các hàm API(s) thông qua việc tìm kiếm hash được tính toán trước dựa vào tên hàm API. Ứng với mỗi DLLs sẽ có một mảng lưu thông tin hash được tính toán trước. Dưới đây là minh họa mảng lưu giá trị hash của các hàm API thuộc kernel32.dll (Mảng này sau đó sẽ được ghi đè bởi địa chỉ thật của các hàm API tương ứng):

Để phục vụ tính toán các hash, payload sử dụng thêm một bảng chứa các giá trị được dùng cho việc xor tại địa chỉ 0x1002B6F8 (g_xor_key_tbl). Thuật toán tìm kiếm địa chỉ hàm API được payload sử dụng như sau:

Viết lại hàm tính hash mà payload sử dụng, kết hợp với IDAPython để lấy ra danh sách các APIs và tạo danh sách enum tương ứng cho các hash:

Kết quả có được như sau:

Từ kết quả trên, tạo struct tương ứng và áp dụng struct này tại những đoạn code liên quan, kết quả sẽ khôi phục được lời gọi tới các hàm API:

4.5. Kiểm tra các giải pháp bảo vệ trên máy nạn nhân

Payload xây dựng danh sách các tiến trình liên quan đến các giải pháp bảo vệ endpoint gồm các trường group_id, group_index. Thực hiện vòng lặp giải mã các chuỗi tương ứng để có được danh sách các tên các process:

group_idgroup_indexprocess name
0x10x660ccSvcHst.exe
0x20x8C6avgcsrvx.exe;avgsvcx.exe;avgcsrva.exe
0x40x2E7MsMpEng.exe
0x80x1A6mcshield.exe
0x100x6ADavp.exe;kavtray.exe
0x200x398egui.exe;ekrn.exe
0x400x141bdagent.exe;vsserv.exe;vsservppl.exe
0x800x912AvastSvc.exe
0x1000x1B3coreServiceShell.exe;PccNTMon.exe;NTRTScan.exe
0x2000x90SAVAdminService.exe;SavService.exe
0x4000x523fshoster32.exe
0x8000x77CWRSA.exe
0x10000x8F0vkise.exe;isesrv.exe;cmdagent.exe
0x20000x7F9ByteFence.exe
0x40000x726MBAMService.exe;mbamgui.exe
0x80000xAFAfmon.exe

Sau đó payload sử dụng các hàm CreateToolhelp32Snapshot; Process32First; Process32Next để liệt kê toàn bộ các tiến trình đang chạy trên máy nạn nhân, kiểm tra tên của tiến trình có nằm trong danh sách nói trên. Nếu có:

  • Các tiến trình thuộc cùng một danh sách thì trả về kết quả là group_id tương ứng. Ví dụ: nếu có avp.exe;kavtray.exe thì kết quả trả về là 0x10.
  • Các tiến trình thuộc các danh sách khác nhau thì kết quả là lấy or của các group_id tương ứng. Ví dụ nếu có avp.exe;kavtray.exe và AvastSvc.exe thì kết quả trả về là 0x10 | 0x80 = 0x90.

Kết quả này sẽ ảnh hưởng tới việc thực hiện process injection. Ví dụ: nếu máy nạn nhân sử dụng giải pháp bảo vệ của Kaspersky (có tiến trình avp.exe) thì Qakbot sẽ thực hiện inject code vào mobsync.exe thay vì explorer.exe.

4.6. Anti-sandbox

4.6.1. Kiểm tra tên file

Payload kiểm tra tên của nó có nằm trong danh sách blacklist gồm: artifact.exe;mlwr_smpl;sample;sandbox;cuckoo-;virus. Vì nhiều khả năng, các môi trường sanbox sẽ tự động đổi tên file.

4.6.2. Kiểm tra tiến trình

Payload kiểm tra các tiến trình đang chạy có nằm trong danh sách blacklist gồm: srvpost.exe;frida-winjector-helper-32.exe;frida-winjector-helper-64.exe.

4.6.3. Kiểm tra Device

Payload sử dụng các hàm SetupDiGetClassDevsA, SetupDiEnumDeviceInfo, SetupDiGetDeviceRegistryPropertyA thuộc thư viện setupapi.dll để lấy thông tin về device trên hệ thống, từ đó kiểm tra với danh sách blacklist gồm A3E64E55_pr;VboxVideo;Red Hat VirtIO;QEMU.

4.6.4. Kiểm tra tên máy và tài khoản

Payload kiểm tra tên máy và tài khoản đăng nhập có nằm trong danh sách blacklist là: VIRTUAL-PC và Virtual.

Nếu thỏa bất kì điều kiện kiểm tra nào ở trên, tiến trình của payload sẽ rơi vào vòng lặp vô hạn:

4.7. Thông tin cấu hình và danh sách C2 (IP & Port)

Như đã đề cập ở trên, payload nếu được dump chính xác sẽ có các resource name là “308” và “311”. Dựa vào việc giải mã strings ở trên, ta có thể tìm được code liên quan tới các strings này:

4.7.1. Giải mã thông tin cấu hình

Cấu hình của Qakbot được lưu ở resource 308, đoạn code liên quan tới resource này sẽ thực hiện:

  • Gọi hàm giải mã với giá trị index là 0x3F5 để giải mã ra chuỗi “308”.
  • Sử dụng các hàm API của kernel32 là FindResourceA; SizeofResource; LoadResource để tải dữ liệu lưu trữ tại resource này vào vùng nhớ đã được cấp phát.
  • Gọi hàm thực hiện giải mã dữ liệu.

Payload sẽ thực hiện kiểm tra lại kích thước của resource và gọi hàm f_decrypt_res_data_by_using_RC4 để thực hiện nhiệm vụ giải mã:

Theo pseudocode trên hình, toàn bộ quá trình giải mã sẽ như sau:

  • 20 bytes đầu tiên của dữ liệu sẽ là khóa RC4, phần dữ liệu còn lại là dữ liệu cần được giải mã.
  • Sử dụng thuật toán RC4 với key có được để giải mã dữ liệu. Dữ liệu sau giải mã gồm:
    • 20 bytes đầu tiên của dữ liệu là SHA1 hash được tính trên phần còn lại của dữ liệu được giải mã.
    • Dữ liệu đã giải mã là phần loại đi 20 bytes của SHA1 hash.
  • Xác minh lại SHA1 hash để đảm bảo việc giải mã là chính xác.

Toàn bộ quá trình trên được minh họa như hình dưới đây:

Như vậy, nội dung sau khi giải mã của resource “308” gồm:

  • 10=biden02 –> CampaignID
  • 3=1614154620   –> Unix Timestamp (Wed 24 February 2021 08:17:00 UTC)
4.7.2. Danh sách C2 (IP & Port)

Với resource “311”, quá trình giải mã cũng tương tự như trên:

Kết quả sau giải mã thu được danh sách địa chỉ IP và port được phân tách nhau bởi giá trị 01:

Toàn bộ danh sách C2 mà payload này sử dụng xem tại Phụ lục 2 – Danh sách C2s bên dưới.

4.8. Process Injection

Qakbot lựa chọn tiến trình để thực hiện inject dựa vào môi trường hệ điều hành và thông tin về group_id liên quan tới các giải pháp bảo vệ đã đề cập ở trên.

Tiếp theo:

  • Sử dụng hàm API CreateProcessW để tạo tiến trình cần inject ở trạng thái suspended. Để đơn giản, tôi sẽ tập trung vào quá trình thực hiện inject vào explorer.exe.
  • Tạo một vùng nhớ mới trên tiến trình explorer.exe với quyền truy cập RWX bằng các hàm API NtCreateSection, NtMapViewOfSection.
  • Copy toàn bộ Qakbot payload vào vùng nhớ đã tạo ở trên.

Sử dụng các hàm GetThreadContext, NtProtectVirtualMemory, NtWriteVirtualMemory để ghi đè vào địa entry point của explorer.exe bằng một lệnh nhảy tới địa chỉ hàm thuộc Qakbot payload:

Cuối cùng gọi hàm ResumeThread để thực thi tiến trình đã inject code. Lúc này, explorer.exe thực thi từ entry point của nó, và thực hiện lệnh nhảy tới địa chỉ hàm của Qakbot payload:

4.9. Ghi đè payload và mã hóa payload trên mem

Để gây khó khăn cho những người làm công tác incident response, Qakbot thực hiện ghi đè null bytes lên chính payload trên disk (giữ lại DOS_HEADER, NT_HEADERS, SECTION_HEADER) đồng thời cũng mã hóa toàn bộ payload để lưu trên memory phục vụ cho việc thực hiện thực hiện kĩ thuật persistence. Điều này đảm bảo rằng toàn bộ code chính của Qakbot sẽ được thực hiện từ tiến trình đã bị inject là explorer.exe hoặc mobsync.exe.

4.10. Persistence operation

4.10.1. Run key persistence

Việc tạo persistence được thực hiện sau bước process injection. Lúc này, Qakbot sẽ tạo một thread thực hiện nhiệm vụ:

  • Gọi hàm RegisterClassExA để đăng kí một window với class name ngẫu nhiên.
  • Cài đặt một hàm callback f_process_wnd_message để thực hiện xử lý windows message.
  • Các windows message được xử lý tại hàm f_process_wnd_message như sau:
    • Khi nhận tín hiệu shutdown (WM_QUERYENDSESSION) hoặc tín hiệu power-management (WM_POWERBROADCAST) đi kèm với event báo hiệu máy sẽ chuyển sang trạng thái suspend (PBT_APMSUSPEND) thì sẽ gọi hàm f_install_persistence().
    • Khi nhận tín hiệu power-management (WM_POWERBROADCAST) đi kèm với event báo hiệu máy chuyển trạng thái resume (PBT_APMRESUMESUSPEND || PBT_APMRESUMEAUTOMATIC) thì sẽ gọi hàm f_uninstall_prev_persistence().
  • Hàm f_install_persistence() thực hiện:
    • Giải mã toàn bộ payload đã bị encrypt trước đó bằng RC4 vào memory.
    • Cấu thành lệnh regsvr32.exe -s <Qakbot_module_path>.
    • Tạo một giá trị với tên nhẫu nhiên tại registry key HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run để lưu câu lệnh trên.
  • Hàm f_uninstall_prev_persistence() thực hiện công việc ngược lại:
    • Xóa persistence key đã tạo.
    • Xóa payload trên disk.
4.10.2. Fake scheduled task persistence

Ngoài việc tạo run key persistence như trên, Qakbot còn tạo thêm một fake persistence là scheduled task để đánh lừa. Task được tạo có tên ngẫu nhiên thông qua câu lệnh sau: “%s\system32\schtasks.exe” /Create /RU “NT AUTHORITY\SYSTEM” /tn %s /tr “%s” /SC ONCE /Z /ST %02u:%02u /ET %02u:%02u

Ví dụ lệnh khi Qakbot thực thi: “C:\Windows\system32\schtasks.exe” /Create /RU “NT AUTHORITY\SYSTEM” /tn gyfzcixqb /tr “regsvr32.exe -s \”C:\Users\REM\Desktop\Qakbot_DLL_unpacked.bin\”” /SC ONCE /Z /ST 12:39 /ET 12:51

Tuy nhiên, lúc này payload trên disk đã bị xóa dữ liệu, chỉ giữ lại thông tin DOS_HEADER, NT_HEADERS, SECTION_HEADER.

4.11. Tương tác với C2

Để gây khó khăn cho người phân tích cũng như các hệ thống bảo vệ, Qakbot sẽ mã hóa POST request của nó trước khi gửi tới C2 server. Một POST request của Qakbot thường sẽ như sau:

Trước khi bị mã hóa thông tin POST request sẽ như hình dưới:

POST request này sẽ được mã hóa rồi gửi tới C2 server:

Trong đó:

  • Hàm f_encrypt_POST_request_by_RC4 thực hiện:
    • Tạo một rc4_key có độ dài 16 bytes.
    • rc4_key này sẽ ghép với một chuỗi được giải mã là “jHxastDcds)oMc=jvh7wdUhxcsdt2”. Sau đó sử dụng SHA1 để hash.
    • Sử dụng giá trị hash tính được làm rc4_key để mã hóa POST request.
    • Kết quả trả về là một vùng nhớ gồm 16 bytes đầu là rc4_key và POST request đã bị mã hóa
  • Hàm f_base64_transform sẽ thực hiện encode toàn bộ vùng nhớ chứa rc4_key và POST request đã mã hóa thành chuỗi ở định dạng base64.
  • Cuối cùng gọi hàm f_send_POST_request_to_C2 để gửi POST request này tới C2.

Dựa vào toàn bộ quá trình trên, có thể viết lại hàm giải mã POST request như sau:

5. Kết luận

Trải qua hơn một thập kỉ, Qakbot vẫn tồn tại và luôn là một mối đe dọa thường trực đối với các tổ chức lớn hiện nay. Việc sử dụng các tài liệu XLSB khiến cho tỉ lệ bị phát hiện thấp hơn so với VBA macro và gây khó khăn cho các giải pháp bảo mật. Bên cạnh đó, các payload của Qakbot cũng được áp dụng các kĩ thuật nâng cao, tiên tiến nhằm tránh bị phát hiện, gây khó khăn rất nhiều cho những người phân tích. Những kẻ đứng sau Qakbot cũng tích cực trong việc bổ sung các kĩ thuật tinh vi hơn để phát triển và mở rộng thêm tính năng. Cho tới nay, danh tính của những kẻ này vẫn luôn là một dấu hỏi. Hi vọng, trong tương lai, Qakbot cũng sẽ bị hạ gục như Emotet.

6. Tham khảo

7. Phụ lục 1 – Danh sách toàn bộ strings

index boundary: 0xB10
index: 0x0, decrypted string: tcpdump.exe;windump.exe;ethereal.exe;wireshark.exe;ettercap.exe;rtsniff.exe;packetcapture.exe;capturenet.exe
index: 0x6d, decrypted string: %SystemRoot%\SysWOW64\explorer.exe
index: 0x90, decrypted string: SAVAdminService.exe;SavService.exe
index: 0xb3, decrypted string: user32.dll
index: 0xbe, decrypted string: mpr.dll
index: 0xc6, decrypted string: Mozilla/5.0 (Windows NT 6.1; rv:77.0) Gecko/20100101 Firefox/77.0
index: 0x108, decrypted string: advapi32.dll
index: 0x115, decrypted string: %SystemRoot%\System32\mobsync.exe
index: 0x137, decrypted string: ntdll.dll
index: 0x141, decrypted string: bdagent.exe;vsserv.exe;vsservppl.exe
index: 0x166, decrypted string: Initializing database…
index: 0x17f, decrypted string: %SystemRoot%\SysWOW64\mobsync.exe
index: 0x1a1, decrypted string: .cfgindex: 0x1a6, decrypted string: mcshield.exe
index: 0x1b3, decrypted string: coreServiceShell.exe;PccNTMon.exe;NTRTScan.exe
index: 0x1e2, decrypted string: shell32.dllindex: 0x1ee, decrypted string: image/jpeg
index: 0x1f9, decrypted string: image/gifindex: 0x203, decrypted string: C:\INTERNAL\__empty
index: 0x217, decrypted string: %SystemRoot%\SysWOW64\xwizard.exe
index: 0x239, decrypted string: t=%s time=[%02d:%02d:%02d-%02d/%02d/%d]
index: 0x261, decrypted string: abcdefghijklmnopqrstuvwxyz
index: 0x27c, decrypted string: SOFTWARE\Wow6432Node\Microsoft AntiMalware\SpyNet
index: 0x2ae, decrypted string: \sf2.dll
index: 0x2b7, decrypted string: Content-Type: application/x-www-form-urlencoded
index: 0x2e7, decrypted string: MsMpEng.exe
index: 0x2f3, decrypted string: %SystemRoot%\SysWOW64\explorer.exe
index: 0x316, decrypted string: image/pjpeg
index: 0x322, decrypted string: SOFTWARE\Microsoft\Windows Defender\Exclusions\Paths
index: 0x357, decrypted string: %SystemRoot%\System32\xwizard.exe
index: 0x379, decrypted string: Software\Microsoft
index: 0x38c, decrypted string: cscript.exe
index: 0x398, decrypted string: egui.exe;ekrn.exe
index: 0x3aa, decrypted string: SOFTWARE\Wow6432Node\Microsoft\Windows Defender\Spynet
index: 0x3e1, decrypted string: WScript.Sleep %uSet objWMIService = GetObject(“winmgmts:” & “{impersonationLevel=impersonate}!\\.\%coot\cimv2”)Set objProcess = GetObject(“winmgmts:root\cimv2:Win32_Process”)errReturn = objProcess.Create(“%s”, null, nul, nul)WSCript.Sleep 2000Set fso = CreateObject(“Scripting.FileSystemObject”)fso.DeleteFile(“%s”)
index: 0x523, decrypted string: fshoster32.exe
index: 0x532, decrypted string: ALLUSERSPROFILE
index: 0x542, decrypted string: kernel32.dll
index: 0x54f, decrypted string: application/x-shockwave-flash
index: 0x56d, decrypted string: Set objWMIService = GetObject(“winmgmts:” & “{impersonationLevel=impersonate}!\\.\%coot\cimv2”)Set objProcess = GetObject(“winmgmts:root\cimv2:Win32_Process”)errReturn = objProcess.Create(“%s”, null, nul, nul)
index: 0x641, decrypted string: %SystemRoot%\explorer.exe
index: 0x65b, decrypted string: c:\\
index: 0x660, decrypted string: ccSvcHst.exe
index: 0x66d, decrypted string: %ProgramFiles(x86)%\Internet Explorer\iexplore.exe
index: 0x6a0, decrypted string: netapi32.dll
index: 0x6ad, decrypted string: avp.exe;kavtray.exe
index: 0x6c1, decrypted string: crypt32.dll
index: 0x6cd, decrypted string: shlwapi.dll
index: 0x6d9, decrypted string: snxhk_border_mywnd
index: 0x6ec, decrypted string: SOFTWARE\Microsoft\Microsoft AntiMalware\SpyNet
index: 0x71c, decrypted string: wpcap.dll
index: 0x726, decrypted string: MBAMService.exe;mbamgui.exe
index: 0x742, decrypted string: \\.\pipe\
index: 0x74c, decrypted string: .dll
index: 0x751, decrypted string: SOFTWARE\Microsoft\Windows Defender\SpyNet
index: 0x77c, decrypted string: WRSA.exe
index: 0x785, decrypted string: reg.exe ADD “HKLM\%s” /f /t %s /v “%s” /d “%s”
index: 0x7b4, decrypted string: 1234567890
index: 0x7bf, decrypted string: wmic process call create ‘expand “%S” “%S”‘
index: 0x7ec, decrypted string: wtsapi32.dll
index: 0x7f9, decrypted string: ByteFence.exe
index: 0x807, decrypted string: SubmitSamplesConsent
index: 0x81c, decrypted string: {%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X}
index: 0x863, decrypted string: NTUSER.DAT
index: 0x86e, decrypted string: .datindex: 0x873, decrypted string: cmd.exeindex: 0x87b, decrypted string: .exeindex: 0x880, decrypted string: %s\system32\
index: 0x88d, decrypted string: ws2_32.dll
index: 0x898, decrypted string: %ProgramFiles%\Internet Explorer\iexplore.exe
index: 0x8c6, decrypted string: avgcsrvx.exe;avgsvcx.exe;avgcsrva.exe
index: 0x8ec, decrypted string: */*index: 0x8f0, decrypted string: vkise.exe;isesrv.exe;cmdagent.exe
index: 0x912, decrypted string: AvastSvc.exe
index: 0x91f, decrypted string: c:\hiberfil.sysss
index: 0x931, decrypted string: wininet.dll
index: 0x93d, decrypted string: %SystemRoot%\explorer.exe
index: 0x957, decrypted string: Set objWMIService = GetObject(“winmgmts:” & “{impersonationLevel=impersonate}!\\.\%coot\cimv2”)Set colFiles = objWMIService.ExecQuery(“Select * From CIM_DataFile Where Name = ‘%s'”)For Each objFile in colFilesobjFile.Copy(“%s”)Next
index: 0xa43, decrypted string: aabcdeefghiijklmnoopqrstuuvwxyyz
index: 0xa64, decrypted string: urlmon.dll
index: 0xa6f, decrypted string: SpyNetReporting
index: 0xa7f, decrypted string: setupapi.dll
index: 0xa8c, decrypted string: aaebcdeeifghiiojklmnooupqrstuuyvwxyyaz
index: 0xab3, decrypted string: SOFTWARE\Microsoft\Microsoft Antimalware\Exclusions\Paths
index: 0xaed, decrypted string: aswhookx.dll
index: 0xafa, decrypted string: fmon.exe
index: 0xb03, decrypted string: aswhooka.dll
index boundary: 0x435
index: 0x0, decrypted string: \System32\WindowsPowerShell\v1.0\powershell.exe
index: 0x30, decrypted string: srvpost.exe;frida-winjector-helper-32.exe;frida-winjector-helper-64.exe
index: 0x78, decrypted string: powershell.exe
index: 0x87, decrypted string: /t4
index: 0x8b, decrypted string: %s \”$%s = \\\”%s\\\\; & $%s\”
index: 0xaa, decrypted string: SOFTWARE\Microsoft\Windows\CurrentVersion\Run
index: 0xd8, decrypted string: A3E64E55_pr;VBoxVideo
index: 0xee, decrypted string: .lnk
index: 0xf3, decrypted string: at.exe %u:%u “%s” /I
index: 0x108, decrypted string: Red Hat VirtIO;QEMU
index: 0x11c, decrypted string: net view /all
index: 0x12a, decrypted string: nslookup -querytype=ALL -timeout=10 _ldap._tcp.dc._msdcs.%s
index: 0x166, decrypted string: ipconfig /all
index: 0x174, decrypted string: SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
index: 0x1ad, decrypted string: regsvr32.exe -s
index: 0x1be, decrypted string: %s “$%s = \”%s\”; & $%s”
index: 0x1d7, decrypted string: Microsoft
index: 0x1e1, decrypted string: Self test FAILED!!!
index: 0x1f5, decrypted string: 311
index: 0x1f9, decrypted string: %s %04x.%u %04x.%u res: %s seh_test: %u consts_test: %d vmdetected: %d createprocess: %d
index: 0x252, decrypted string: whoami /all
index: 0x25e, decrypted string: cmd /c set
index: 0x269, decrypted string: qwinsta
index: 0x271, decrypted string: arp -a
index: 0x278, decrypted string: nltest /domain_trusts /all_trusts
index: 0x29a, decrypted string: route print
index: 0x2a6, decrypted string: “%s\system32\schtasks.exe” /Create /RU “NT AUTHORITY\SYSTEM” /tn %s /tr “%s” /SC ONCE /Z /ST %02u:%02u /ET %02u:%02u
index: 0x31b, decrypted string: VIRTUAL-PC
index: 0x326, decrypted string:  /c ping.exe -n 6 127.0.0.1 &  type “%s\System32\calc.exe” > “%s”
index: 0x368, decrypted string: error res=’%s’ err=%d len=%u
index: 0x385, decrypted string: net share
index: 0x38f, decrypted string: Virtual
index: 0x397, decrypted string: net localgroup
index: 0x3a6, decrypted string: artifact.exe;mlwr_smpl;sample;sandbox;cuckoo-;virus
index: 0x3da, decrypted string: Self test OK.
index: 0x3e8, decrypted string: netstat -nao
index: 0x3f5, decrypted string: 308
index: 0x3f9, decrypted string: ProfileImagePath
index: 0x40a, decrypted string: amstream.dll
index: 0x417, decrypted string: jHxastDcds)oMc=jvh7wdUhxcsdt2


8. Phụ lục 2 – Danh sách C2s
QakBot C2 List
98.173.34.213:995
160.3.187.114:443
73.25.124.140:2222
24.50.118.93:443
82.127.125.209:990
83.110.109.106:2222
79.129.121.81:995
189.223.234.23:995
125.63.101.62:443
113.22.175.141:443
172.78.30.215:443
47.146.169.85:443
47.22.148.6:443
76.25.142.196:443
78.63.226.32:443
105.198.236.101:443
75.67.192.125:443
176.181.247.197:443
105.96.8.96:443
108.31.15.10:995
176.205.222.30:2078
115.133.243.6:443
83.110.11.244:2222
195.43.173.70:443
197.51.82.72:443
89.137.211.239:995
105.198.236.99:443
144.139.47.206:443
202.188.138.162:443
24.43.22.218:993
69.58.147.82:2078
157.131.108.180:443
92.59.35.196:2222
195.12.154.8:443
86.160.137.132:443
59.90.246.200:443
96.57.188.174:2222
172.87.157.235:3389
189.211.177.183:995
173.184.119.153:995
50.244.112.106:443
144.139.166.18:443
90.65.236.181:2222
81.150.181.168:2222
68.186.192.69:443
74.222.204.82:995
197.161.154.132:443
38.92.225.121:443
197.45.110.165:995
71.117.132.169:443
85.52.72.32:2222
217.133.54.140:32100
193.248.221.184:2222
95.77.223.148:443
83.110.103.152:443
80.227.5.69:443
209.210.187.52:995
50.29.166.232:995
108.160.123.244:443
24.152.219.253:995
81.97.154.100:443
203.198.96.37:443
80.11.173.82:8443
97.69.160.4:2222
196.151.252.84:443
172.115.177.204:2222
98.121.187.78:443
47.187.108.172:443
216.201.162.158:443
140.82.49.12:443
71.199.192.62:443
71.88.193.17:443
182.48.193.200:443
71.187.170.235:443
77.211.30.202:995
77.27.204.204:995
96.37.113.36:993
187.250.39.162:443
122.148.156.131:995
173.21.10.71:2222
119.153.43.235:3389
71.74.12.34:443
75.118.1.141:443
75.136.26.147:443
67.6.12.4:443
71.197.126.250:443
78.185.59.190:443
125.239.152.76:995
45.46.53.140:2222
98.240.24.57:443
199.19.117.131:443
113.211.120.112:443
74.68.144.202:443
73.153.211.227:443
98.252.118.134:443
189.222.59.177:443
187.250.177.33:995
186.28.55.211:443
189.210.115.207:443
90.101.117.122:2222
72.240.200.181:2222
151.205.102.42:443
24.55.112.61:443
82.12.157.95:995
189.146.183.105:443
72.252.201.69:443
109.12.111.14:443
24.229.150.54:995
209.210.187.52:443
67.8.103.21:443
47.196.192.184:443
24.139.72.117:443
79.115.174.55:443
94.53.92.42:443
86.236.77.68:2222
89.3.198.238:443
213.60.147.140:443
84.247.55.190:8443
2.7.116.188:2222
106.51.85.162:443
87.202.87.210:2222
142.117.191.18:2222
196.221.207.137:995
188.26.91.212:443
108.46.145.30:443
125.209.114.182:995
27.223.92.142:995
173.25.45.66:443
32.210.98.6:443
65.27.228.247:443
108.29.32.251:443
189.223.97.175:443
78.97.207.104:443
181.48.190.78:443
2.232.253.79:995
136.232.34.70:443
207.246.77.75:2222
45.77.115.208:443
207.246.77.75:8443
45.63.107.192:443
45.77.117.108:2222
45.77.117.108:8443
45.77.115.208:995
45.77.117.108:443
144.202.38.185:2222
149.28.98.196:995
144.202.38.185:995
149.28.101.90:8443
149.28.99.97:995
45.32.211.207:995

Tran Trung Kien (aka m4n0w4r) 
Malware Analysis Expert
 

R&D Center – VinCSS (a member of Vingroup)
Chia sẻ bài viết