02 - Cobalt Strike
Pada bagian ini, kita akan mempelajari tentang dasar-dasar C2 Cobal Strike.
0x1 - Cobal Strike
Pada tahun 2012, Raphael Mudge membuat Cobalt Strike untuk melakukan pengujian keamanan. Cobalt Strike merupakan salah satu C2 framework publik pertama.
Pada tahun 2020, Cobalt Strike diakuisisi oleh HelpSystems LLC.
Cobalt Strike adalah tool komersial yang digunakan untuk operasi Penetration Test dan simulasi serangan Advanced Persistent Threat (APT).
Tool ini memiliki berbagai kemampuan, seperti spear phishing, exploitation, post-exploitation, dan C2 communication.
0x3 - Starting the Team Server
Team Server adalah komponen pada Cobalt Strike yang berfungsi sebagai server pusat yang mengendalikan C2.
Untuk menjalankan Team Server ini, masuk ke direktori di mana Cobalt Strike server terinstal dan jalankan teamserver
executable.
1
➜ sudo ./teamserver 10.10.5.50 Passw0rd! c2-profiles/normal/webbug.profile
Keterangan:
10.10.5.50
: alamat IP dari server yang menjalankan Cobalt Strike server.Passw0rd!
: shared password yang digunakan untuk mengakses Cobalt Strike server.webbug.profile
: contoh profil Malleable C2 (akan dibahas lebih rinci nanti).
Disarankan untuk menggunakan Team Server menggunakan session tmux atau dijalankan sebagai service agar proses tidak terhenti ketika terminal terhenti.
Setelah Team Server berhasil dijalankan, selanjutnya jalankan Cobalt Strike client.
Keterangan:
Alias
: nama profil koneksi untuk terhubung ke Team Server.Host
: alamat IP dari Team Server.Port
: port yang dijalankan oleh Team Server (default-nya50050
).User
: username yang digunakan untuk mengakses Team Server.Password
: shared password yang dibuat pada saat menjalankan Team Server.
Saat terhubung ke Team Server pertama kalinya, Cobalt Strike client akan meminta konfirmasi fingerprint SHA256. Hal ini dilakukan untuk memastikan tidak ada yang menyadap traffic antara client dan server.
Berikut adalah tampilan awal dari Cobal Strike:
0x4 - Listener Management
Langkah selanjutnya adalah menyiapkan “listener”, yang akan mendengarkan koneksi yang masuk dari beacon.
Beacon adalah nama payload pada Cobalt Strike.
Ada dua jenis listener utama, yaitu: egress dan peer-to-peer.
A. Egress Listeners
Egress listener adalah listener yang memungkinkan beacon berkomunikasi keluar jaringan target menuju Team Server.
Default dari listener jenis ini adalah HTTP/S dan DNS, di mana beacon akan mengenkapsulasi traffic C2 melalui masing-masing protokol.
Untuk mengelola listener, buka menu Cobalt Strike > Listener atau klik ikon headphone.
Setelah diklik akan muncul tab Listener, disini kita bisa menambah, mengubah, menghapus dan me-restart listener.
HTTP
HTTP listener memungkinkan beacon untuk mengirimkan dan menerima pesan C2 melalui request HTTP GET dan/atau POST.
Untuk membuat HTTP listener, klik Add. Pastikan Beacon HTTP dipilih di bagian jenis payload dan beri nama listener.
Pada bagian HTTP host secara default akan diisi dengan alamat IP dari Team Server, tetapi akan lebih realistis dengan menggunakan nama domain.
Nama listener digunakan di seluruh perintah CLI Cobalt Strike, jadi pilihlah nama yang memungkinkan kita dengan mudah mengenalinya.
Ketika disimpan, Team Server akan menjalankan port 80.
1
2
3
➜ sudo ss -lntp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 50 *:80 *:* users:(("TeamServerImage",pid=2172,fd=7))
DNS
DNS listener memungkinkan beacon untuk mengirimkan dan menerima pesan C2 melalui protokol DNS.
Ada beberapa jenis record DNS yang dapat digunakan untuk mengirimkan pesan C2, termasuk record A
, AAAA
, dan TXT
.
Record TXT
biasanya lebih sering digunakan karena dapat menampung data yang banyak, menjadikannya lebih efisien untuk mengirimkan pesan C2.
Namun, untuk menggunakan listener DNS, kita perlu membuat setidaknya satu record DNS yang membuat Team Server menjadi otoritatif untuk domain tersebut.
Pada umumnya, server DNS otoritatif didefinisikan dalam record NS
(Name Server).
Berikut adalah contoh konfigurasi record DNS yang saya gunakan:
Name | Type | Data |
---|---|---|
@ | A | 10.10.5.50 |
ns1 | A | 10.10.5.50 |
pics | NS | ns1.nairpaa.me. |
Beacon DNS dapat melakukan lookup request, seperti <c2data>.pics.nairpaa.me
, yang kemudian akan dirutekan melalui infrastruktur DNS internet.
Pada akhirnya request tersebut akan sampai ke Team Server, karena kita telah menyiapkan records yang sesuai untuk mengatakan bahwa server DNS nairpaa.me memiliki otoritas subdomain pics
.
Setelah listener disimpan, kita bisa menguji records dengan melakukan lookup sembarang. Default respons dari Team Server adalah 0.0.0.0
.
1
2
➜ dig @ns1.nairpaa.me test.pics.nairpaa.me +short
0.0.0.0
OPSEC
Karena
0.0.0.0
adalah respons default (dan juga agak tidak masuk akal), Team Server Cobalt Strike dapat mudah diketahui.Respons ini dapat diubah dalam profil Malleable C2.
B. Peer-to-peer
Berbeda dengan engress listener, P2P listener tidak berkomunikasi dengan Team Server secara langsung. Sebaliknya, P2P listener dirancang untuk melakukan chaining beberapa beacon bersama-sama dalam hubungan parent/child.
Alasan utama penggunaan listener ini adalah:
- Untuk mengurangi jumlah host yang berkomunikasi ke Team Server. Karena semakin tinggi volume traffic, semakin besar kemungkinannya untuk terdeteksi.
- Untuk menjalankan beacon pada komputer yang tidak ada akses ke luar jaringan.
Cobalt Strike memiliki dua jenis P2P listener, yaitu Server Message Block (SMB) dan raw TCP.
SMB
Konfigurasi SMB listener sangat sederhana karena hanya memiliki satu opsi, yaitu nama dari pipename.
Nama default-nya adalah msagent_##
(di mana ##
adalah angka acak dalam heksadesimal), tetapi kita dapat menentukan nama apa pun yang diinginkan.
Payload beacon SMB akan memulai server pipename tersebut untuk mendengarkan koneksi yang masuk. Pipename ini dapat diakses secara lokal dan remote.
OPSEC
Penamaan pipe default ini adalah tanda penggunaan Cobalt Strike. Strategi yang baik adalah meniru nama yang dikenal digunakan oleh aplikasi umum atau Windows itu sendiri.
Jalankan
PS C:> ls \\.\pipe\
, lalu buat pipename yang mirip dengan salah satu direktori yang ada.
TCP
Beacon TCP akan mengikat (bind) dan mendengarkan pada nomor port yang ditentukan.
Kita juga dapat menentukan apakah beacon akan mengikat hanya ke localhost (127.0.0.1
) atau ke semua interface (0.0.0.0
).
Untuk mempelajari Cobalt Strike saya sarankan Anda untuk mencoba membuat berbagai jenis listerner.
Berikut adalah berbagai jenis listener (HTTP, DNS, SMB, dan TCP) yang bisa Anda coba:
0x5 - Generating Payloads
Terdapat berbagai jenis payload yang dapat dihasilkan melalui menu Payloads dalam Cobalt Strike, diantaranya:
A. HTML Application
Menghasilkan file .hta
(biasanya dikirim melalui browser melalui teknik social engineering) yang menggunakan VBScript yang disematkan untuk menjalankan payload. Ini hanya menghasilkan payload untuk listener egress dan terbatas pada arsitektur x86.
B. MS Office Macro
Menghasilkan kode VBA yang dapat ditambahkan ke dokumen Word atau Excel yang mengaktifkan macro. Ini hanya menghasilkan payload untuk listener egress tetapi kompatibel dengan Office x86 dan x64.
C. Stager Payload Generator
Menghasilkan stager payload dalam berbagai bahasa termasuk C, C#, PowerShell, Python, dan VBA. Berguna saat membangun payload atau custom exploit Anda sendiri. Ini hanya menghasilkan payload untuk listener egress, tetapi mendukung x86 dan x64.
D. Stageless Payload Generator
Sama seperti stager payload, tetapi menghasilkan payload stageless daripada stager. Memiliki format output yang lebih sedikit, misalnya tidak ada PowerShell, tetapi memiliki opsi tambahan untuk menentukan fungsi exit (process atau thread). Ini juga dapat menghasilkan payload untuk listener P2P.
E. Windows Stager Payload
Menghasilkan stager yang telah dikompilasi sebelumnya sebagai EXE, Service EXE, atau DLL.
F. Windows Stageless Payload
Menghasilkan payload stageless yang telah dikompilasi sebelumnya sebagai EXE, Service EXE, DLL, shellcode, serta PowerShell. Ini juga salah satu cara untuk menghasilkan payload untuk listener P2P.
G. Windows Stageless Generate All Payloads
Menghasilkan setiap variasi payload stageless, untuk setiap listener, dalam x86 dan x64.
Berikut adalah contoh menghasilkan setiap variasi payload stagless untuk setiap listener pada direktori C:\Payloads
.
Untuk mengetahui penjelasan lengkap mengenai payload staged dan stageless, saya merekomendasikan Anda untuk membaca artikel “Staged vs Stageless Handlers”.
0x6 - Interacting with Beacon
Berikut adalah cara kita berinteraksi dengan beacon:
A. Run Egress Beacon
Pertama-tama kita jalankan payload http_x64.exe
pada mesin Windows lokal.
Terlihat pada gambar berikut, koneksi beacon dari mesin Windows lokal masuk ke Cobalt Strike.
Keterangan:
- Kolom sleep: menunjukkan seberapa sering beacon harus melakukan check-in dengan Team Server. Secara default, check-in dilakukan setiap 60 detik. Penyesuaian interval sleep dapat membantu menghindari deteksi dan membuat komunikasi antara beacon dan Team Server lebih mirip dengan traffic jaringan normal.
- Kolom last: menunjukkan berapa lama waktu sejak beacon terakhir kali melakukan check-in. Ini dapat membantu kita untuk menentukan apakah beacon masih aktif atau tidak.
- Jika beacon melewatkan tiga check-in berturut-turut, angka di kolom terakhir akan menjadi tebal/miring untuk menunjukkan bahwa beacon mungkin telah hilang. Ini dapat berarti bahwa beacon telah ditutup, atau bahwa komunikasi antara beacon dan Team Server telah diblokir.
B. Execute Command
Untuk menjalankan perintah pada beacon, klik kanan pada bagian koneksi beacon, lalu pilih Interact. Akan muncul tab baru untuk menjalankan perintah.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
beacon> help
Beacon Commands
===============
Command Description
------- -----------
! Run a command from the history
argue Spoof arguments for matching processes
blockdlls Block non-Microsoft DLLs in child processes
browserpivot Setup a browser pivot session
cancel Cancel a download that's in-progress
cd Change directory
...
Karena sedang mempelajari Cobalt Strike dan agar tidak menunggu lama, kita dapat memberi tahu beacon untuk melakukan check-in lebih sering dengan menggunakan perintah sleep
.
1
2
beacon> sleep 5
beacon> sleep 0 # interactive
Untuk mempermudah menggunakan Cobalt Strike kita bisa mempelajari keyboard shortcuts.
C. Run Peer-To-Peer Beacon
Untuk mencoba P2P beacon, pertama jalankan tcp-local_x64.exe
.
Terlihat pada gambar berikut, tidak ada koneksi beacon baru yang masuk ke Cobalt Strike. Namun, pada Windows lokal yang menjalankan beacon terdapat port beacon yang terbuka sebagai listener.
Menjalankan Peer-To-Peer Beacon
Untuk menghubungkan ke P2P beacon (child), jalankan perintah berikut pada egress beacon (parent):
1
2
beacon> connect <target> <port>
beacon> connect localhost 4444
Menghubungkan Ke Peer-To-Peer Beacon
Jika kita menjalankan perintah sleep
pada child atau parent, maka keduanya akan menerima perintah yang sama.
D. Graph View
Untuk melihat host yang terhubung secara visual, Klik icon Graph.
Visualisasi Beacon Yang Terhubung
Keterangan:
- Green arrow = TCP
- Yellow arrow = SMB
E. Remove Beacon
Untuk memutuskan koneksi beacon, jalankan perintah berikut:
1
beacon> exit
Untuk menghilangkan beacon yang telah terputus, klik kanan pada koneksi beacon, lalu pilih Session > Remove.
Jika kita menghapus koneksi egress beacon yang sedang terhubung (alive), secara otomatis beacon akan mencoba menghubungkan kembali ke Team Server. Jadi kita tidak perlu khawatir jika tidak sengaja menghapus koneksi beacon.
0x7 - Pivot Listeners
Pivot listener memungkinkan kita untuk mengarahkan (pivot) traffic dari satu beacon ke beacon lain.
Pivot listener hanya dapat dibuat pada beacon yang sudah ada, dan tidak melalui menu Listeners.
Pivot listener bekerja dengan cara yang sama seperti listener TCP reguler, tetapi dalam urutan yang terbalik.
Beacon TCP standar akan mengikat (bind) ke 127.0.0.1
(atau 0.0.0.0
) dan mendengarkan koneksi masuk pada port yang ditentukan. Kita kemudian memulai koneksi ke beacon tersebut dari beacon yang sudah ada (dengan perintah connect
).
Sementara itu, pivot listener bekerja sebaliknya dengan memberi tahu beacon yang sudah ada untuk mengikat (bind) dan mendengarkan pada port yang ditentukan, dan beacon TCP baru menginisiasi koneksi ke beacon tersebut.
Untuk membuat pivot listener, klik kanan pada koneksi beacon dan pilih Pivoting > Listener.
Jenis payload yang digunakan untuk pivot listener adalah beacon_reverse_tcp
, bukan beacon_bind_tcp
. Meskipun ada menu drop-down, beacon_reverse_tcp
adalah satu-satunya jenis payload yang saat ini dapat digunakan dengan pivot listener.
Opsi listen host dan listen port adalah detail koneksi yang akan disertakan dalam payload yang dihasilkan dari listener ini. Opsi ini secara otomatis diisi dari beacon yang kita pilih untuk bertindak sebagai pivot.
Setelah mengklik save dan menjalankan perintah netstat
, kita akan melihat bahwa terdapat port pivot listener terbuka (dalam contoh ini, 1234
).
Kita akan melihat peringatan firewall Windows. Dalam konteks tutorial ini, kita diminta untuk mengklik “Allow Access” untuk saat ini, dan taktik untuk menangani peringatan semacam ini akan dibahas pada materi selanjutnya.
Setelah pivot listener berhasil dibuat, selanjutnya kita buat beacon khusus untuk terhubung ke pivot listener.
Ketika payload dieksekusi, reverse TCP beacon akan muncul di Cobalt Strike. Di tampilan visual, panah menunjukkan arah koneksi.
Untuk menghentikan pivot listener, buka menu Listeners reguler, sorot dan klik tombol remove.
Jika kita mengakhiri sesi beacon yang menjalankan pivot listener, maka pivot listener tidak akan bisa digunakan lagi.
Pivot Listener Tidak Bisa Digunakan
0x8 - Running as a Service
Agar menghemat waktu, kita bisa membuat Team Server berjalan sebagai service di server Linux.
Dengan pendekatan ini kita tidak perlu khawatir jika komputer yang menjalankan Team Server ter-restart, karena secara otomatis service akan berjalan kembali.
Untuk melakukan ini, pertama kita buat file di /etc/systemd/system
.
1
➜ sudo vim /etc/systemd/system/teamserver.service
Lalu tambahkan script berikut:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]
Description=Cobalt Strike Team Server
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=1
User=root
WorkingDirectory=/home/attacker/cobaltstrike
ExecStart=/home/attacker/cobaltstrike/teamserver 10.10.5.50 Passw0rd! c2-profiles/normal/webbug.profile
[Install]
WantedBy=multi-user.target
Selanjutnya, reload systemd manager dan periksa status service. Akan terlihat bahwa service itu inactive/dead.
1
2
3
4
5
➜ sudo systemctl daemon-reload
➜ sudo systemctl status teamserver.service
● teamserver.service - Cobalt Strike Team Server
Loaded: loaded (/etc/systemd/system/teamserver.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Jalankan service dan periksa kembali statusnya.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
➜ sudo systemctl start teamserver.service
➜ sudo systemctl status teamserver.service
● teamserver.service - Cobalt Strike Team Server
Loaded: loaded (/etc/systemd/system/teamserver.service; disabled; vendor preset: enabled)
Active: active (running) since Mon 2022-09-05 08:25:26 UTC; 14s ago
Main PID: 1406 (teamserver)
Tasks: 19 (limit: 4620)
Memory: 47.5M
CGroup: /system.slice/teamserver.service
├─1406 /bin/bash /home/attacker/cobaltstrike/teamserver 10.10.5.50 Passw0rd! c2-profiles/normal/webbug.profile
└─1447 ./TeamServerImage -Dcobaltstrike.server_port=50050 -Dcobaltstrike.server_bindto=0.0.0.0 -Djavax.net.ssl.keyStore=./cobaltstrike.store -Djavax.net.ssl.keyStorePassword=123456 teamserver >
Aug 05 08:25:28 ubuntu teamserver[1447]: [*] Setting 'https.protocols' system property: SSLv3,SSLv2Hello,TLSv1,TLSv1.1,TLSv1.2,TLSv1.3
Aug 05 08:25:28 ubuntu teamserver[1447]: [+] I see you're into threat replication. c2-profiles/normal/webbug.profile loaded.
Aug 05 08:25:37 ubuntu teamserver[1447]: [*] Loading Windows error codes.
Aug 05 08:25:37 ubuntu teamserver[1447]: [*] Windows error codes loaded
Aug 05 08:25:37 ubuntu teamserver[1447]: [*] Loading beacons
Aug 05 08:25:37 ubuntu teamserver[1447]: [*] Loaded 0 beacons
Aug 05 08:25:37 ubuntu teamserver[1447]: [+] Team server is up on 0.0.0.0:50050
Aug 05 08:25:37 ubuntu teamserver[1447]: [*] SHA256 hash of SSL cert is: 3bf25b6317a1c948cfad31faa0e14414d2d35f73b7947fa0bd3717ab5d0bc32d
Aug 05 08:25:37 ubuntu teamserver[1447]: [+] Listener: dns started!
Aug 05 08:25:37 ubuntu teamserver[1447]: [+] Listener: http started!
Sekarang service tersebut seharusnya active/running.
1
2
➜ sudo systemctl enable teamserver.service
Created symlink /etc/systemd/system/multi-user.target.wants/teamserver.service → /etc/systemd/system/teamserver.service.