---
# System prepended metadata

title: Mã độc Cobalt Strike C2

---

Mã độc Cobalt Strike C2
===============

## Cobalt Strike

Một công cụ nổi tiếng được dùng để pentest và thử nghiệm độ bảo mật của hệ thống. Hiện đã ra mắt đến bản 4.8. Một trong những tính năng cơ bản của nó là C2 server. Tính năng mà hầu hết các mã độc hiện nay đều sử dụng.

## Cơ chế của 1 C2 server

- Là một cơ chế ra lệnh và điều khiển, có nghĩa là tin tặc sẽ điều khiển máy nạn nhân từ xa, dùng các lệnh shell hoặc giao diện tương tác(VD: lệnh ```shell whoami ``` trong cửa sổ terminal của Cobalt Strike sẽ đưa về thông tin của máy tính nạn nhân)
- C2 Server sử dụng các giao thức như DNS, HTTP hoặc HTTPs, và 1 số giao thức khác, tuy nhiên trong bài này em sẽ nói kĩ về HTTP.
- Giao thức HTTP (Hyper Text Transfer Protocol) là 1 giao thức phổ biến rộng rãi trên Internet vì độ linh hoạt của nó. Không chỉ văn bản thông thường mà còn các hình thức khác như video, hình ảnh. Sự linh hoạt đó vô tình lại bị các hacker tận dụng trong việc khởi tạo C2.
- Trong 1 Beacon HTTP, hacker sẽ tìm mọi cách thực thi file mã độc trên máy nạn nhân. Cụ thể, file đấy sẽ gửi payload HTTP về C2 server đang được khởi chạy. Sau đó kết nối được thiết lập và hacker có thể thực hiện điều khiển máy nạn nhân từ xa.



## Phân tích payload 
Trong bài này em sử dụng công cụ x64dbg để tiến hành debug và xem hành vi của shellcode được sử dụng cho Beacon HTTP
- Cụ thể, nó sẽ sử dụng hàm ``` LoadLibraryA ```và ``` GetProcAddress ``` để thu thập các APIs từ thư viện ``` wininet ```

![](https://hackmd.io/_uploads/B1eOtt0hh.png)


Ở chỗ này lệnh ``` jmp rax ``` được sử dụng và ta có thể thấy ``` rax ``` đang chứa địa chỉ của hàm ``` LoadLibraryA ``` và ``` rcx ``` chứa tên thư viện ``` wininet```. Khi đó shellcode sẽ gọi ``` LoadLibraryA("wininet")```.


![](https://hackmd.io/_uploads/SJGJ5FAn2.png)

Sau đó, shellcode sử dụng hàm ``` InternetConnectA ``` kết nối địa chỉ của C2 server là ``` 192.168.190.128 ``` và cổng của listener là ``` 80 ```.


![](https://hackmd.io/_uploads/Syrj0Y0hh.png)

![](https://hackmd.io/_uploads/SkiBkq03h.png)


Request được gửi đến server với hàm ``` HttpSendRequest ``` với header là  ``` User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)\r\n ``` 

![](https://hackmd.io/_uploads/SyHEgc023.png)

![](https://hackmd.io/_uploads/BJUMx5R3n.png)

Sau đó shellcode sử dụng hàm ``` InternetReadFile ``` để trao đổi thông tin với server C2


![](https://hackmd.io/_uploads/rJdsf5A22.png)




### Chú thích: 
Trong file executable x64 có 1 thuật ngữ gọi là calling convention, nghĩa là cách truyền vào tham số khi gọi hàm. Tham khảo đường link sau: 
https://learn.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-170

Ta biết được cách sử dụng calling convention trong assembly của 1 file:

![](https://hackmd.io/_uploads/Hy-V2YAhh.png)

Giả sử cho 1 hàm sau đây:

![](https://hackmd.io/_uploads/rk23it0h3.png)

Khi đó, ta sẽ có khung tham số như sau:


![](https://hackmd.io/_uploads/SytraKRh3.png)


## Mã độc 

Dưới đây là đoạn code c++ được em viết để có thể sử dụng payload mã độc.

- Đầu tiên em sử dụng hàm VirtualAlloc để allocate 1 vùng memory, từ đó có thể thay đổi quyền sử dụng vùng memory đó.

![](https://hackmd.io/_uploads/B1LtQc02n.png)

- Sau đó, sử dụng hàm ``` VirtualProtect ``` để có thể thay đổi chế độ bảo vệ của vùng memory thành ``` PAGE_EXECUTE_READ ```, có nghĩa là cho phép thực thi trên 1 vùng nhớ chỉ có quyền đọc.

![](https://hackmd.io/_uploads/ryHRQq023.png)

- Để tránh xung đột với các luồng khác trong quá trình giao tiếp với C2 Server, em đã sử dụng hàm ``` CreateThread ``` để tạo 1 luồng riêng cho payload.

![](https://hackmd.io/_uploads/HJsDE5Rh2.png)


- Sau đó chúng ta có thể tương tác bằng C2 Server.


![](https://hackmd.io/_uploads/Hy8LH9R33.png)


## Video Demo

https://drive.google.com/file/d/1thycO5xXTS-Hjree-mdYHMTMYDlqeQLw/view?usp=sharing