Lazarus, ngân hàng X và chuyện bên lề — Phần 1: Hai con chuồn chuồn con

Gần đây, Zepto có nhận được một số mẫu mã độc được cho rằng có liên quan tới các cuộc tấn công APT vào hệ thống ngân hàng của Việt Nam mà báo chí có đưa tin gần đây [1]. Trong đó có đề cập đến 2 mẫu mã độc được cho là sử dụng trong chiến dịch trên.

Liệu 2 mẫu trên thật sự làm gì và có gì liên quan đến nhau? Bức tranh toàn cảnh của chiến dịch này là gì? Câu trả lời sẽ dần được hé lộ trong series bài viết phân tích về cuộc tấn công APT này.

Quan hệ giữa 2 file trên sau khi phân tích

Phân tích mẫu 1— syschk.ps1

Để ngắn gọn, đây là 1 script Powershell với mục đích inject 1 đoạn code DLL vào process Explorer. Đoạn code DLL này tạo ra 3 thread trong DLLMain có tác vụ lần lượt như sau:

  • Keylog: gồm lưu lại phím và Clipboard
  • Screenshot: lưu lại ảnh màn hình
  • Hàm Sleep: Đưa 2 thread trên vào trạng thái ngủ
Hàm Main của mẫu Powershell
Decode, Replace 1 đoạn String để tạo ra 1 mẫu Powershell khác
Các biến thú vị được sử dụng ở hàm trên

Cụ thể khi mẫu mã độc tìm được process Explorer, nó sẽ tạo ra 1 mẫu Powershell khác ở thư mục %temp%tmp\XXXX.ps1 với XXXX là [0–9][A-F].

Sau đó mẫu XXXX.ps1 được thực thi bằng lệnh sau:

Start-Process powershell.exe -PassThru -WindowStyle Hidden -ArgumentList -ep bypass -file C:\Windows\Temp\tmp\XXXX.ps1

File được tạo ra bởi hàm DoProcess
Nội dung của file tmp9603.ps1

Nội dung của file tmp trên là sử dụng một kỹ thuật Invoke-ReflectivePEInjection để inject một file DLL từ bộ nhớ (RAM) vào 1 process đang chạy [2], dù hàm này bị thay đổi khá nhiều tuy nhiên chúng cùng chung 1 mục đích như đã nói.

FYI: Mẫu DLL chính là $PEBytes

Những câu lệnh chính của biến $NewBlock

Tiếp đó ta load file DLL vào IDA để phân tích kỹ hơn các tính năng theo dõi nạn nhân.

Phân tích mẫu DLL

Nhảy vào entry point, ta thấy có 3 thread riêng biệt

Câu lệnh thực thi chính của file DLL

Cần chú ý thư mục %temp%GoogleChrome, vì nơi đây sẽ chứa dữ liệu mà hàm Screenshot và Keylog ghi lại từ User.

Phân tích Thread 1 — Keylog

Ta tóm gọn T1 thực thi lần lượt như sau:

  • Lấy Title của “Cửa sổ” hiện tại mà User đang sử dụng
  • Hàm Keylog (trùng tên với thread)
  • Hàm lấy Clipboard
  • Lưu ra file
Nội dung lấy Title của “Cửa sổ” hiện tại
Nội dung hàm Keylog

FYI: Tại sao một mã độc APT tấn công vào ngân hàng VN lại không hỗ trợ log lại tiếng Việt hay Unicode. Dù log tiếng Việt nằm ở 1 phạm trù khác với các ngôn ngữ Unicode.

Ngoài ra project này [3] đề cập chi tiết cách log được kí tự Unicode.

Nội dung hàm lấy Clipboard

Sau đó 2 loại log phím trên lưu dữ liệu tại %temp%chromeupdater_pk.

Nội dung hàm lưu dữ liệu log User

Demo

Log sau khi chạy thread Keylog

Phân tích Thread 2 — Screenshot

Nội dung chính của thread Screenshot
Nội dung hàm takeScreenshot

FYI: Nội dung hàm takeScreenshot rất giống link này[4]

Phân tích Thread 3 — Hàm Sleep
Với Thread này, ta thấy nó đang cố gắng điều khiển 1 biến boolean shouldSleep dựa vào kiểm tra file C:\ProgramData\2.dat có tồn tại hay không.

Nội dung hàm điều khiển này

Biến shouldSleep cũngđược sử dụng ở 2 thread còn lại (hình dưới). Nói ngắn gọn, thread số 3 này đưa 2 thread còn lại vào trạng thái Sleep. Đây là 1 cách cơ bản để đưa mã độc vào trạng thái Inactive để bypass các AV và sandbox online đang scan các hành vi độc hại.

Biến shouldSleep được sử dụng trong 2 thread Keylog Screenshot

Kết thúc của thread này là hàm deleteAllInLogFolder và WINAPI RemoveDirectoryA.

Nhiệm vụ của 2 hàm này để xóa toàn bộ các thư mục lưu log của thread Keylog Screenshot, nói đơn giản là nó đang xóa các dấu vết của chính nó.

hàm deleteAllInLogFolder

Nhận xét

Mẫu Powershell và DLL đều đi vay mượn code, và không có gì đặc biệt về mặt kỹ thuật.

Ngoài ra ta chắc chắn mẫu này sẽ cần đi kèm với các mẫu mã độc khác để hoạt động được, ví dụ như gửi thông tin thu thập được đến C&C server hay ra lệnh Sleep (chỉnh sửa file 2.dat).

Phân tích mẫu 2 — hs.exe

Load mã độc vào IDA, mở tab Import ta có

Các hàm import nghi ngờ

Nhìn vào số lượng các hàm được sử dụng, ví dụ như hàm connect được gọi ở 4 nơi. Ta đoán chương trình này sử dụng Winsock (WS2_32.dll) để thiết lập kết nối (connect), gửi (send) và nhận (recv) lệnh và dữ liệu.

Bắt đầu với hàm WinMain. Ở đây ta tách được 2 tác vụ rõ ràng như:

  • Giải mã tham số đầu vào (ở đây là thông tin về C&C server)
  • Tạo 1 thread để nhận lệnh của C&C server

FYI: Tham số đầu vào của mã độc này được truyền vào bởi một mẫu khác (giải thích ở cuối bài) như sau

hs.exe [địa chỉ bị encrypt của victim]

Tổng thể nội dung của mã độc

Đầu tiên, ta để ý tham số đầu vào đi qua hàm decrypt. Sau đó, ta có địa chỉ C&C cần kết nối tới.

Nội dung hàm decrypt
Rút gọn hàm decrypt

Sau khi có địa chỉ C&C server, mẫu sẽ tạo 1 thread(main_thread) với mục đích nhận lệnh từ C&C server (xem hình tổng quan ở trên).

Mục đích chính của việc nhận lệnh này là forward các lệnh điều khiển từ C&C server đến máy đã bị lây nhiễm (địa chỉ của máy lây nhiễm lấy từ C&C server).

Sau đây ta chứng thực lại điều đó.

Nội dung main_thread

Trong main_thread này mã độc nhận một số lệnh tiếng Nga như dưới

Các câu lệnh mà mã độc chấp nhận từ C&C server

Vì ở đây có 1 trường hợp thú vị về việc người phát triển mã độc cố gắng đánh lừa người phân tích bằng cách tạo sự sai lệch giữa tên và mục đích thực sự của 1 đoạn nhận lệnh (poluchit), nên ta sẽ đi phân tích tên câu lệnh, tên dịch và lệnh thực thi thực sự của mã độc.

FYI: Tất cả các câu lệnh ở đây đều được mã hóa khi cả gửi và nhận. Tuy nhiên các câu lệnh dưới đây đều dưới dạng không mã hóa để trực quan hơn.

Bảng các lệnh thực thi của mã độc

Gửi lệnh “Nachalo”: Khởi tạo kết nối với C&C server. Cụ thể hình dưới là khởi tạo kết nối với C&C server 5 lần để nhận các lệnh tiếp theo (forwarder).

Khởi tạo kết nối với C&C server

Nhận lệnh “Ustanavlivat”: Nhận địa chỉ của máy cần forward lệnh tới

Hình dưới giải thích khá rõ cách hoạt động. Bắt đầu với nhận dữ liệu từ C&C server, tuy nhiên chỉ lấy ra 4 byte đầu tiên để decrypt ra được kích cỡ của dữ liệu còn lại (gọi là A). Sau đó so sánh kích cỡ lấy được với kích cỡ của A. Nếu sai thì ngừng Session hiện tại, nếu đúng thì tiếp tục .

Nhận địa chỉ của máy cần forward lệnh tới

Nhận lệnh “Poluchit”: Gửi địa chỉ của máy bị lây nhiễm mã độc lên C&C server.

Đây có thể coi là bước xác thực sau quá trình nhận được IP cần forward tới.

Điểm thú vị ở đây nghĩa của từ “Poluchit” là nhận, trong khi mục đích thực sự của nó lại là gửi địa chỉ máy bị lây nhiễm lên C&C server.

Đây là 1 trong những điểm nghi ngờ mấu chốt giúp chúng tôi tiếp tục phân tích và tìm thêm những mẫu khác có liên quan tới một nhóm chuyên tấn công APT vào các ngân hàng ĐNÁ, Lazarus.

FYI: Có 1 bài phân tích [5] đối với 1 mẫu khá tương tự mẫu này(sample #5), tuy nhiên đây có vẻ là 1 chiến dịch khác của nhóm Lazarus. Vì vậy, chúng tôi sẽ viết phần 2 về việc phân tích chiến dịch có sử dụng mẫu Forwarder này.

Gửi lại địa chỉ của máy bị lây nhiễm lên C&C server

Nhận lệnh “Pereslat”: Chuyển tiếp dữ liệu giữa C&C server và máy đã bị cài mã độc.

Tạo 1 thread forward_*
Nội dung của thread này
Cụ thể hàm redirect_traffic giữa C&C server và máy bị nhiễm mã độc

Khi nhận lệnh “derzhat” tiếp tục giữ kết nối. Còn lại, nếu nhận lệnh “vykhodit” thì sẽ thông báo cho C&C server và thực thi việc ngắt Session.

2 lệnh cuối “derzhat” và “vykhodit”

Dựa vào phân tích trên, ta thấy đây chỉ là 1 mẫu mã độc dùng để chuyển tiếp (forward) dữ liệu giữa C&C server và mã độc. Sự chuyển tiếp này rất có thể xảy ra trong mạng private của tổ chức bị tấn công, nghĩa là C&C server cũng nằm trong mạng của tổ chức, và cũng nhận lệnh thông qua mẫu Forwarder này.

Ngoài ra, mẫu thứ nhất (Powershell) đóng vai trò là 1 trong nhiều mẫu RAT được cài đặt vào Client.

Chưa dừng ở đó, dựa vào những điểm nghi ngờ nêu trong bài viết, chúng tôi cũng tìm được những thông tin, dẫn chứng về các chiến dịch tấn công vào ngân hàng Việt Nam có liên quan tới nhóm Lazarus (thông tin cụ thể ở phần 2).

Góc nhìn hiện tại

Hiện tại chúng tôi khá chắc chắn đây là mẫu mã độc được phân tán bởi nhóm Lazarus đến từ Triều Tiên. Với hồ sơ và các bài phân tích về nhóm này, đây là 1 nhóm được quản lý trực tiếp bởi Cục 121 của cơ quan tình báo Triều Tiên. Mục tiêu của nhóm này những năm gần đây là tấn công vào hệ thống tài chính của các nước ĐNÁ, đặc biệt là các ngân hàng. Đặc biệt là vụ suýt đánh cắp thành công 1 tỷ đô-la ở ngân hàng TW Bangladesh. Ngoài ra trong quá khứ nhóm này cũng đã từng thực hiện các cuộc tấn công APT vào ngân hàng Việt Nam.

Timeline các chiến dịch của nhóm Lazarus từ năm 2007 đến 2018 (tổng hợp bởi TrendMicro [6]), các ngân hàng Việt Nam cũng nằm trong danh sách đó.

FYI: Hiện tại C&C server vẫn đang hoạt động.

Tạm gác lại 2 con chuồn chuồn con, đáp án cho những câu hỏi chưa được giải đáp sẽ dần được hé lộ qua phần 2: Lộ diện.

Tham khảo

  1. http://ictnews.vn/cntt/bao-mat/canh-bao-khan-ma-doc-dang-tan-cong-co-chu-dich-vao-ngan-hang-va-ha-tang-quan-trong-quoc-gia-170123.ict
  2. https://clymb3r.wordpress.com/2013/04/06/reflective-dll-injection-with-powershell/
  3. https://github.com/SherifEldeeb/UniLogger/blob/master/README.md
  4. https://www.apriorit.com/dev-blog/193-multi-monitor-screenshot
  5. https://baesystemsai.blogspot.com/2017/02/lazarus-false-flag-malware.html
  6. https://www.trendmicro.com/vinfo/us/security/news/cybercrime-and-digital-threats/a-look-into-the-lazarus-groups-operations

@nl @floppydisk @bakhoang @tofu

Leave a Reply

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