Sementara AI generasi berikutnya dan komponen machine learning dari solusi keamanan terus meningkatkan kemampuan deteksi berbasis perilaku, pada intinya banyak yang masih mengandalkan deteksi berbasis tanda tangan. Cobalt Strike menjadi kerangka kerja Command and Control (C2) tim merah yang populer digunakan oleh aktor ancaman dan tim merah sejak debutnya, dan terus ditandatangani oleh solusi keamanan.
Untuk melanjutkan penggunaan operasional Cobalt Strike sebelumnya, kami di tim IBM X-Force Red Adversary Simulation menginvestasikan upaya riset dan pengembangan yang signifikan untuk menyesuaikan Cobalt Strike dengan perkakas internal. Beberapa alat internal khusus Cobalt Strike kami memiliki versi publik, seperti "InlineExecute-Assembly", "CredBandit", dan "BokuLoader". Dalam dua tahun terakhir, karena penandatangan Cobalt Strike yang berlebihan, kami membatasi penggunaannya untuk mensimulasikan aktor ancaman yang tidak terlalu canggih, dan sebagai gantinya memanfaatkan pihak ketiga lainnya dan C2 internal ketika melakukan latihan tim merah yang lebih canggih.
Melalui upaya riset dan pengembangan, kami telah menemukan keberhasilan operasional yang lebih baik dalam latihan tim merah tingkat lanjut dengan:
Namun, masih ada sejumlah besar aktor ancaman yang memanfaatkan salinan bajakan Cobalt Strike, dan tetap penting untuk dapat mensimulasikan aktor ancaman ini. Untuk tim merah yang bersedia melakukan upaya riset dan pengembangan, mereka mungkin masih menemukan kesuksesan operasional dengan Cobalt Strike sambil mensimulasikan musuh-musuh ini. Selain itu, Cobalt Strike adalah alat pembelajaran yang hebat, yang dapat dimanfaatkan oleh pendatang baru untuk mendapatkan pengalaman dengan kerangka kerja C2 melalui kursus pelatihan tim merah.
Ketika kami terus memperluas kemampuan C2 kami, kami membagikan beberapa insight tentang cara kami membangun kerangka kerja Cobalt Strike di masa lalu, khususnya dengan mengembangkan pemuat reflektif khusus. Ini juga dimaksudkan bagi para pembela untuk memahami cara Cobalt Strike bekerja untuk menciptakan deteksi yang lebih kuat.
Tetap terinformasi tentang tren industri yang paling penting—dan menarik—tentang AI, otomatisasi, data, dan di luarnya dengan buletin Think. Lihat Pernyataan Privasi IBM®.
Postingan blog ini adalah yang pertama dari seri yang berfungsi sebagai primer, mencakup dasar-dasar pengembangan pemuat reflektif Cobalt Strike. Seiring berjalannya seri ini, kita akan mengembangkan dasar ini dan merujuk kembali ke posting ini.
Pada akhir seri ini, kami bertujuan untuk membuat pemuat reflektif yang terintegrasi dengan fitur penghindaran Cobalt Strike yang ada dan bahkan meningkatkannya dengan teknik canggih yang saat ini tidak ada di alat. Posting mendatang akan menyelidiki lebih dalam pengembangan fitur penghindaran tertentu dan cara menerapkannya ke pemuat reflektif Cobalt Strike kami.
Untuk memulai, posting ini akan mencakup:
Ketika kita menjelajahi pemuatan reflektif Cobalt Strike melalui lensa pengembang alat keamanan ofensif, kita akan menyoroti peluang untuk deteksi dan evasi. Beberapa aspek pengembangan akan dihilangkan atau disederhanakan, dan kami mendorong Anda untuk mengisi kekosongan dengan men-debug proyek pemuat reflektif yang sudah ada, membangunnya kembali dari awal, atau mencari pelatihan.
Implan Cobalt Strike C2, yang dikenal sebagai Beacon, adalah Windows Dynamic-Link Library (DLL), dan kemampuan modular menggunakan pemuat DLL kami sendiri di Cobalt Strike dikenal sebagai User-Defined Reflective Loader (UDRL).
Biasanya, Windows DLL Loader bawaan bertanggung jawab untuk memuat DLL ke dalam ruang memori virtual proses. Windows DLL Loader ada terutama di dalam ruang pengguna, meskipun ia menyeberang ke ruang kernel saat memetakan DLL dari disk.
Menggunakan Windows DLL Loader menghadirkan beberapa kelemahan saat digunakan selama simulasi musuh:
Oleh karena itu, menggunakan Windows DLL Loader untuk memuat DLL beacon kami bukanlah solusi yang ideal. Untuk mengatasi tantangan ini, kami memuat DLL beacon dari memori menggunakan pemuat reflektif.
Tiga titik deteksi utama yang dihindari pemuatan reflektif adalah:
Pemuatan reflektif dapat dianggap sebagai pemuatan DLL mentah secara langsung dari memori, bukan pemuatan dari sistem file.
Pemuatan reflektif dan Windows DLL Loader bawaan keduanya melayani tujuan yang sama untuk memuat DLL dari format file mentah ke dalam ruang memori virtual suatu proses. Namun, pemuatan reflektif memiliki keunggulan utama dibandingkan Windows DLL Loader karena tidak memerlukan file DLL untuk ada di sistem file. Pemuatan dalam memori ini memungkinkan jumlah fase pemuatan berantai yang tidak terbatas, karena DLL implant C2 dapat disembunyikan di dalam lapisan enkripsi dan pengkodean di dalam memori proses.
Konsep kunci untuk dipahami saat memuat DLL, adalah mengetahui bahwa DLL akan diformat secara berbeda pada disk versus dalam memori. Perbedaan utama antara DLL dalam format file mentah versus format alamat virtual adalah:
Format File Mentah:
Format Alamat Virtual:
Dengan memeriksa DLL beacon HTTP di alat PE-Bear karya Aleksandra Doniec, kita dapat melihat perbedaan antara alamat mentah dan alamat virtual untuk setiap bagian dari DLL tersebut:
Tabel yang mencantumkan alamat mentah dan virtual dari setiap bagian DLL beacon.
DLL beacon HTTP/S ini adalah
PE-Bear menyediakan representasi visual dari DLL beacon kami seperti yang ada dalam format file mentah versus format ruang alamat virtual:
Representasi visual dari DLL beacon dalam format mentah (kiri) versus format virtual (kanan)
Meskipun bukan langkah paling bijaksana untuk dilakukan selama simulasi musuh, menjatuhkan DLL beacon mentah tanpa pengaburan ke disk dan memuatnya dengan Windows DLL Loader adalah cara yang bagus untuk menghilangkan muatan beacon dan DLL. Pada dasarnya, beacon hanyalah sebuah DLL. Windows DLL Loader dan pemuat reflektif hanya memuat DLL ke dalam suatu proses.
Untuk memuat DLL beacon dengan Windows DLL Loader, kami melakukan langkah-langkah berikut:
LoadLibrary
API untuk memuat DLL beacon kami dari disk.Pertama, kami menonaktifkan semua opsi Malleable PE yang membuat DLL beacon kami tidak dapat dimuat oleh Windows DLL Loader. Untuk melakukan ini, kami memodifikasi profil Malleable C2 kami dan menonaktifkan opsi penghindaran Malleable PE yang terletak di blok panggung:
Blok tahap profil C2 yang dapat ditempa dimodifikasi untuk menonaktifkan fitur penghindaran Cobalt Strike.
Setelah memodifikasi profil, kami memulai ulang Cobalt Strike Team Server, memasok
Kami terhubung ke Server Tim dengan klien Cobalt Strike. Kemudian kita membuat
Tangkapan layar membuat DLL beacon “mentah tanpa tahap” dari Cobalt Strike Client
Menggunakan kode di bawah ini, kami membuat program C bernama
Kode Windows C untuk memuat DLL beacon dari disk menggunakan Windows DLL Loader.
Kami menggunakan
Sebagai bagian dari proses pemuatan, Windows DLL Loader akan menginisialisasi DLL beacon kami dengan memanggil titik masuknya dengan
Setelah Windows DLL Loader memuat dan menginisialisasi DLL beacon kami ke ruang memori virtual proses kami, kami perlu lagi memanggil titik masuk virtual DLL beacon dengan argumen
Program kami harus mengetahui titik masuk DLL beacon virtual kami untuk menjalankan DLL beacon virtual kami. Ini dapat dilakukan secara dinamis dalam program dengan mengurai header DLL beacon virtual untuk titik masuk Relative Virtual alamat (RVA), atau kita dapat dengan cepat melihat apa itu dan hardcode nilainya.
Untuk pembuktian konsep kami, kami akan secara manual menemukan dan membuat hardcode titik masuk DLL beacon kami RVA ke dalam program kami. Menggunakan PE-bear kami menemukan bahwa titik masuk RVA ke beacon adalah
Tangkapan layar saat menemukan titik masuk DLL beacon RVA menggunakan PE-bear
Dengan kode kami siap digunakan, kami mengkompilasi program C kami menjadi Windows yang dapat dieksekusi:
Perintah yang digunakan untuk mengkompilasi program kami.
Dengan menempatkan DLL beacon dan program executable beacon pemuat kita di direktori yang sama, Windows DLL Loader akan dapat menemukan DLL kita saat menjalankan rutinitas pemuatannya.
Kami menempatkan keduanya
DLL beacon dan program pemuat ditempatkan di direktori yang sama.
Dari desktop Windows, kita klik dua kali program loadBeaconDLL.exe dan buat koneksi beacon aktif ke Server Tim kami.
Berhasil terhubung ke C2 Team Server dari DLL beacon yang dimuat menggunakan Windows DLL Loader.
Cobalt Strike menggunakan versi modifikasi dari proyek Reflective Loader oleh Stephen Fewer. Pemuat DLL dalam memori yang legendaris ini sudah berumur lebih dari satu dekade dan telah digunakan di Metasploit dan alat keamanan ofensif terkenal lainnya.
Selama bertahun-tahun, pemuat reflektif Cobalt Strike telah ditingkatkan untuk menangani semua fitur penghindaran Malleable PE yang ditawarkan Cobalt Strike. Kerugian utama untuk menggunakan User-Defined Reflective Loader (UDRL) khusus adalah bahwa fitur penghindaran PE Maleable mungkin atau mungkin tidak didukung di luar kotak.
Beberapa fitur penghindaran diimplementasikan sepenuhnya saat menggunakan UDRL, yang diintegrasikan ke dalam DLL beacon oleh mesin Malleable PE Cobalt Strikes pada saat pembuatan payload beacon. Namun, saat ini fitur-fitur seperti harus ditangani oleh UDRL, sementara yang lain seperti dan dapat ditangani oleh beacon dengan integrasi UDRL yang tepat.
Proyek Reflektif Loader asli membutuhkan kompilasi
Kemudian proyek lain bertanggung jawab untuk:
Diagram pemuat reflektif asli, memuat DLL ke memori virtual.
Metode alternatif mendahului pemuat reflektif ke DLL. Hal ini memungkinkan setiap DLL yang tidak dikelola untuk dimuat dan tidak memerlukan kompilasi DLL dari kode sumber. Ini adalah metode pemuatan reflektif yang kuat yang dapat memuat file PE apa pun (EXE atau DLL).
Diagram pemuat reflektif ditambahkan ke DLL, memuat DLL ke memori virtual.
Implementasi pemuatan reflektif Cobalt Strike menggunakan hybrid dari dua metode di atas. Metode pemuatan reflektif ini mungkin akrab bagi mereka yang memiliki pengetahuan tentang cara Meterpreter Metasploit melakukan pemuatan reflektif.
Seperti metode pemuat reflektif asli,
Ketika UDRL dimuat ke Cobalt Strike, dan operator menghasilkan muatan beacon dari klien Cobalt Strike, mesin PE Maleable Cobalt Strike menambal dalam shellcode pemuat reflektif pada offset file mentah dari
Ketika mesin Malleable PE menyelesaikan patch DLL beacon mentah, DLL beacon mentah diberikan kepada operator dalam format seperti shellcode yang dapat dieksekusi.
Diagram pemuat reflektif Cobalt Strike, memuat DLL beacon ke memori virtual.
Melihat byte awal di pembongkaran PE-Bear kita dapat melihat bahwa DLL beacon itu sendiri dapat dieksekusi:
Call reflective loader stub ditampilkan sebagai kode operasi perakitan yang dapat dieksekusi.
Byte awal
Setelah mengeksekusi secara opsional ditambahkan di depan
Kami mengonfirmasi bahwa offset file mentah untuk
Tangkapan layar saat menggunakan PE-Bear untuk menentukan offset file mentah dari ekspor ReflectiveLoader.
Karena ada di dalam direktori ekspor, alamat untuk
Untuk menemukan offset file mentah dari
Alamat virtual dan mentah untuk
Alamat mentah dan virtual dari .text bagian dari DLL beacon.
Perbedaan antara keduanya adalah
Kami dapat mengonfirmasi ini di PE-bear dengan mengklik kanan
Singkatnya, aliran proses pemuatan reflektif Cobalt Strike adalah:
Diagram yang menunjukkan fase utama cara Cobalt Strike melakukan pemuatan reflektif dari DLL beacon.
Karena pemuat reflektif kita dieksekusi sebelum DLL beacon dimuat, kode pemuat reflektif harus berupa shellcode murni.
Cara termudah untuk membuat shellcode kompleks adalah dengan menulisnya dalam C tanpa dependensi eksternal. Kemudian file C dikompilasi ke file objek. Semuanya harus dimasukkan dalam bagian dari berkas objek. Akhirnya, kami merobek.text
Mesin PE Maleable Cobalt Strike akan menangani pekerjaan mendapatkan shellcode dari file objek pemuat reflektif kami dan menambalnya ke DLL beacon mentah pada offset file mentah
Skrip agresor untuk menulis shellcode pemuat reflektif ke dalam DLL beacon mentah yang memanfaatkan Cobalt Strike.
Skrip UDRL Aggressor kami memiliki Cobalt Strike menulis di shellcode pemuat reflektif kami dengan melakukan langkah-langkah ini:
<a href="https://hstechdocs.helpsystems.com/manuals/cobaltstrike/current/userguide/content/topics_aggressor-scripts/as-resources_functions.htm#extract_reflective_pemuat">extract_reflective_pemuat</a>Fungsi Cobalt Strike Aggressor akan mengurai file objek UDRL kita dari
<a href="https://hstechdocs.helpsystems.com/manuals/cobaltstrike/current/userguide/content/topics_aggressor-scripts/as-resources_functions.htm#setup_reflective_loader">setup_reflective_pemuat</a>Fungsi Cobalt Strike Aggressor akan menggunakan mesin Malleable PE untuk menemukan offset file mentah dari kami
Cobalt Strike telah melakukan pekerjaan untuk kami mengenai mengekstraksi bagian .text dari file objek pemuat reflektif kami, menambal kode shell pemuat reflektif kami, dan memanggil pemuat reflektif kami dengan call reflective loader stub yang terletak di header DLL beacon.
Berikut adalah tahapan yang harus kita kembangkan untuk memuat beacon secara reflektif:
Ada beberapa metode berbeda yang dapat kita gunakan untuk menemukan alamat DLL beacon mentah di memori. Beberapa metode tersebut adalah:
Saat menggunakan metode yang berburu mundur, pertama-tama kita harus mendapatkan alamat saat ini dari Instruction Pointer utas kita (
Kode perakitan Intel x64 untuk mendapatkan alamat dasar DLL beacon mentah dari register RDI.
Proyek pemuat reflektif asli berburu mundur untuk header MZ dan PE. Header ini telah menjadi titik deteksi. Untuk mengatasi Cobalt Strike ini menambahkan
Dokumentasi Cobalt Strike menyatakan bahwa
Saat dikonfigurasi
Byte ini harus agak unik, atau pemuat reflektif tidak akan dapat menemukannya. Selain itu, byte untuk header MZ harus tanpa operasi dan dapat dieksekusi. Nilai-nilai tersebut tidak bisa seperti itu
Setelah menemukan titik deteksi potensial ini, saya mengembangkan metode yang berbeda, tetapi serupa untuk menemukan alamat dasar beacon mentah DLL. Metode ini menggunakan pemburu telur yang mampu mencari mundur dari
Alamat
Karena kami tidak memiliki akses mudah ke mesin Java Malleable PE,
Skrip agresor untuk menulis egg ke dalam DLL beacon mentah dan menampilkan perubahan di konsol skrip Cobalt Strike.
Kode UDRL harus mengetahui nilai telur yang ditulis ke DLL beacon mentah oleh skrip UDRL. Setelah mengetahui letak telurnya, pemburu telur mencari mundur dua kemunculan telur tersebut, seperti yang terlihat pada kode di bawah ini:
Kode perakitan Intel x64 untuk pemburu egg yang mencari mundur untuk dua contoh egg 64-bit.
Sekarang header MZ dan PE tidak lagi digunakan, kita dapat menuliskannya di skrip UDRL Aggressor:
Skrip agresor untuk menutupi MZ, PE, dan byte yang tidak digunakan dari spanduk DOS yang terletak di header DLL beacon mentah.
Ada juga cara lain, khusus Cobalt Strike, untuk menemukan alamat dasar beacon mentah DLL. Seperti yang kita lihat di atas, byte awal dalam call reflective loader stub menyimpan alamat dasar DLL beacon mentah di
Untuk memeriksa ini lebih lanjut di debugger, kami menghasilkan beacon, mendahului breakpoint (
Tangkapan layar x64dbg tentang melangkah melalui call reflective loader stub untuk melihat bahwa alamat dasar DLL beacon mentah disimpan dalam register RDI sebelum memanggil pemuat reflektif.
Di bawah ini adalah contoh kerja tentang cara mendapatkan alamat dasar DLL beacon mentah dari call reflective loader stub:
Kode C perakitan sebaris untuk mendapatkan alamat dasar DLL beacon mentah dari register RDI.
Dengan alamat dasar DLL beacon mentah, kita sekarang bisa mendapatkan nilai-nilai yang kita butuhkan untuk memuat beacon ke dalam ruang alamat virtual proses.
Tabel di bawah ini mencantumkan nilai yang kita butuhkan dari header DLL beacon mentah, lokasi tempat kita akan menemukannya, dan tipenya:.
Tabel mencantumkan nilai-nilai dari header DLL beacon mentah yang berguna untuk memuat DLL beacon.
Tidak semua isi header diperlukan untuk memuat DLL beacon. Nilai yang diperlukan dapat dikemas ulang atau dikaburkan. Nilai yang tidak diperlukan dapat dihapus atau diacak.
Setelah kita tahuSizeOfImagef
Metode yang berbeda dapat digunakan untuk mengalokasikan memori untuk virtual DLL beacon. Metode yang berbeda akan menggunakan berbagai jenis memori. Metode berbeda yang didukung oleh pemuat reflektif default Cobalt Strike adalah:
Tabel yang menunjukkan opsi alokasi memori Cobalt Strike untuk beacon virtual DLL.
Hal ini dapat ditingkatkan lebih lanjut dengan UDRL. Versi NTAPI dari fungsi-fungsi ini dapat digunakan sebagai gantinya. Lebih jauh lagi, fungsi NTAPI dapat dipanggil melalui panggilan sistem langsung atau tidak langsung yang mungkin atau mungkin tidak membantu memperkuat kemampuan penghindaran.
Ketika metode alokator diatur ke
Contoh kode dari proyek BokuLoader yang menunjukkan panggilan sistem langsung digunakan untuk mengalokasikan memori untuk DLL beacon virtual.
Gambar di bawah ini menunjukkan contoh kode menggunakan metode HellsGate dan HalosGate untuk menentukan nomor panggilan sistem:
Contoh kode dari proyek BokuLoader yang menunjukkan cara panggilan sistem ditemukan dari proses.
Setelah mengalokasikan memori untuk DLL beacon virtual, kita perlu menyalin bagian-bagian beacon dari offset file mentahnya, sebagaimana adanya dalam DLL beacon mentah, ke memori yang dialokasikan pada offset virtual relatifnya.
Jika kita mengalokasikan memori kita denganREADWRITE dan ukurannya. Sebelum memanggil titik masuk DLL beacon virtual kita perlu mengubah perlindungan memori bagian bagian yang dapat dieksekusi.
Mengalokasikan memori kita dengan membuat proses pemuatan reflektif lebih mudah tetapi meningkatkan kemungkinan deteksi oleh solusi keamanan.
Di bawah ini adalah contoh kode yang disederhanakan, dari proyek BokuLoader, yang menunjukkan ini:.
Contoh kode dari proyek BokuLoader yang menunjukkan bagian yang disalin dari DLL beacon mentah ke DLL beacon virtual.
Beberapa fitur penghindaran terkait bagian pemuatan adalah:
Dalam proyek BokuLoader publik, header untuk DLL beacon tidak disalin dari DLL beacon mentah ke DLL beacon virtual. Saat ini yang pertama
Peluang penghindaran lain yang mungkin terjadi adalah memiliki skrip UDRL Aggressor mengenkripsi bagian-bagiannya. Bagian dapat didekripsi dalam memori oleh UDRL, menggunakan kunci yang dibagikan antara UDRL dan skrip UDRL Aggressor.
Beacon x64 HTTP/S bergantung pada empat DLL untuk berfungsi dengan baik. Jika DLL ini saat ini tidak dimuat ke dalam proses, pemuat reflektif kami perlu memuatnya.
Keempat DLL tercantum dalam direktori impor HTTP DLL beacon:
Tangkapan layar dari PE-bear yang mencantumkan DLL dari direktori impor DLL beacon.
Pemuat reflektif Cobalt Strike bawaan menggunakan API Kernel32.loadLibrarya untuk pemuatan DLL.
Pemuatan DLL dapat dicapai dengan berbagai cara yang berbeda, dengan pertimbangan keamanan operasional yang berbeda. Beberapa metode tersebut adalah:
Jika DLL sudah ada dalam proses, maka API Windows di atas masih dapat digunakan untuk mendapatkan alamat dasar DLL, meskipun ini dapat memicu peringatan deteksi yang tidak diinginkan.
Atau, PEB memegang penunjuk ke
<a title="https://learn.microsoft.com/id-id/windows/win32/api/winternl/ns-winternl-peb_ldr_data" href="https://learn.microsoft.com/id-id/windows/win32/api/winternl/ns-winternl-peb_ldr_data">_PEB_LDR_DATA</a>
struktur. Di dalamnya, ada daftar tertaut dari semua DLL yang dimuat dalam proses dan informasi relatifnya (
). BokuLoader memanfaatkan ini untuk menemukan informasi DLL, menghindari panggilan API yang tidak perlu.
Jika DLL tersebut tidak ada di
Pemuatan reflektif bersarang tidak dapat dengan mudah digunakan untuk memuat dependensi DLL karena pemuat reflektif umumnya tidak mendaftarkan DLL ke proses. Kode di luar DLL tidak dapat menggunakan DLL yang dimuat secara reflektif dengan benar. Proyek DarkLoadLibrary mungkin dapat memuat DLL dengan benar ke dalam memori tanpa memicu peristiwa pemuatan gambar kernel.
Contoh kode dari proyek BokuLoader yang menunjukkan cara alamat dasar DLL yang dimuat dapat diselesaikan dengan berjalan di InMemoryOrderModuleList.
Dengan DLL yang diperlukan dimuat ke dalam proses, API yang tercantum dalam direktori impor harus diselesaikan. Alamat API kemudian perlu ditulis ke Tabel Alamat Impor (IAT) DLL beacon virtual. Dengan cara ini, beacon tahu alamat mana yang harus dituju ketika perlu memanggil API seperti
Entri impor perlu diselesaikan melalui string ordinal atau nama.
Pada gambar di bawah ini, kita melihat bahwa Cobalt Strike DLL beacon menggunakan kombinasi ordinal dan string nama untuk entri impor:
Tangkapan layar dari PE-bear yang menunjukkan beberapa entri impor untuk DLL beacon harus diselesaikan dengan ordinal.
Pemuat reflektif Cobalt Strike bawaan menggunakan
Beberapa metode penghindaran untuk menyelesaikan alamat API adalah:
GetProcAddress
NTDLL.LdrGetProcedureAddress
BokuLoader menggunakan implementasi kode khususGetProcAddress
Alamat mampu menangani string nama dan ordinal juga. Jika alamat yang dikembalikan untuk Entri Impor adalah forwarder ke DLL lain, BokuLoader akan default ke untuk menyelesaikan masalah penerusan.
Saat menulis IAT, hooking dapat diimplementasikan dengan menulis alamat virtual fungsi hook yang telah kami terapkan daripada alamat virtual API yang dimaksud. Selama output yang diharapkan dikembalikan ke beacon ketika alamat di IAT dipanggil, kita dapat mengeksekusi kode tambahan sebelum kembali ke beacon. Postingan mendatang dan rilis BokuLoader publik akan mendemonstrasikan cara kami dapat memanfaatkan pengait IAT untuk fitur penghindaran tingkat lanjut.
Dengan rilis terbaru, proyek publik BokuLoader mendukung fitur Malleable PE dari profil Cobalt Strike C2 dengan implementasi khusus. Dengan memodifikasi kunci masking diBokuLoader.cna
Mengenai keamanan operasional, penting untuk diketahui bahwa mesin pencocokan pola mampu memaksa masker XOR single-byte secara brutal. Posting mendatang akan menunjukkan cara kami dapat membuat mesin Malleable PE kami sendiri menggunakan fungsionalitas skrip Cobalt Strikes Aggressor untuk mengaburkan beacon untuk mengatasi pencocokan pola.
DLL beacon memiliki banyak relokasi yang harus diselesaikan dan ditulis ke Tabel Relokasi Dasar DLL beacon virtual sebelum dijalankan.
Di PE-bear kita dapat melihat bahwa DLL beacon secara default memiliki alamat dasar gambar
Tangkapan layar dari PE-bear menunjukkan alamat dasar gambar dari DLL beacon.
Sebelum kita mulai menulis relokasi, kita perlu menghitung delta antara alamat dasar DLL beacon virtual kita dan alamat dasar hardcode.
Misalnya, mari kita pura-pura alamat dasar untuk DLL beacon virtual kita adalah
Selanjutnya, untuk menentukan alamat virtual untuk setiap entri relokasi di Tabel Relokasi Dasar, kami menambahkan alamat dasar delta ke alamat entri relokasi kode keras untuk menentukan relokasi dalam DLL beacon virtual kami.
Pada gambar di bawah ini kita dapat melihat bahwa entri relokasi beacon ditulis mundur dalam format little-endian:
Tangkapan layar dari PE-bear menunjukkan beberapa entri relokasi ada dalam format little-endian.
Alamat hardcode untuk entri relokasi ini adalah
Kami menambahkan alamat ini ke alamat dasar delta, untuk mendapatkan alamat virtual untuk relokasi seperti yang ada di DLL beacon virtual:
Untuk setiap entri relokasi, kita perlu memeriksa apakah jenisnya
<a title="https://learn.microsoft.com/id-id/windows/win32/debug/pe-format" href="https://learn.microsoft.com/id-id/windows/win32/debug/pe-format">IMAGE_REL_BASED_DIR64 (0xA)</a>
. Jika ini salah, kami akan melewatkan penulisan relokasi.
Setelah kita menentukan alamat virtual dari relokasi yang ada di dalam DLL beacon virtual, kita menuliskannya ke ruang memori yang menyimpan alamat entri relokasi yang dikodekan.
Jika Anda tertarik untuk mempelajari lebih lanjut tentang cara melakukan relokasi PE, lihat kode fungsi doRelocations di proyek publik BokuLoader. Sebelum merilis postingan blog ini, saya mengubah kode relokasi dari assembly ke kode C, untuk membantu orang lain yang ingin mengetahui detail teknis tentang cara hal ini dilakukan.
Eksekusi beacon dapat dipecah menjadi tiga langkah:
Jika memori yang kita alokasikan untuk DLL beacon virtual kita adalah
Jika kita mengalokasikan memori beacon virtual kita sebagai non-eksekusi (
Dalam proyek BokuLoader publik, perubahan perlindungan memori dilakukan dengan panggilan sistem langsung ke
Contoh kode dari proyek BokuLoader yang menunjukkan perubahan .text bagian dari DLL beacon virtual menjadi file yang dapat dieksekusi.
Kemampuan
Agar DLL beacon virtual dapat berjalan dengan benar, DLL tersebut harus diinisialisasi terlebih dahulu dengan memanggil titik masuk DLL beacon virtual. Argumen pertama adalah alamat dasar dari DLL beacon virtual. Argumen kedua adalah
Contoh kode dari proyek BokuLoader yang menginisialisasi DLL beacon virtual.
Setelah menginisialisasi DLL beacon virtual, kita dapat mengembalikan titik masuk beacon virtual ke call reflective loader stub, atau kita dapat memanggil titik masuk virtual DLL beacon di UDRL kita dengan
Tidak seperti DLL tipikal di mana argumen pertama
<a href="https://learn.microsoft.com/id-id/windows/win32/dlls/dllmain">DLLMAIN</a>
akan menjadi alamat dasar DLL virtual, beacon mengharapkan alamat dasar dari DLL beacon mentah. Jika ini tidak disediakan, beberapa fitur penghindaran Malleable PE mungkin gagal.
Contoh kode dari proyek BokuLoader menunjukkan dua cara berbeda untuk mengeksekusi virtual DLL beacon.
Semoga postingan blog ini membantu tim merah dan tim biru lebih memahami Cobalt Strike dan proses pemuatan reflektif. Masih ada banyak sekali peluang penghindaran yang dapat diimplementasikan melalui pembebanan reflektif. Dengan pemahaman yang lebih dalam tentang konsep-konsep ini, organisasi dapat mempersiapkan diri dengan lebih baik untuk pertahanan yang sukses terhadap ancaman siber.
Posting mendatang dalam seri ini akan berfokus pada mengintegrasikan UDRL dengan fitur penghindaran Cobalt Strike saat ini, menyelami fitur penghindaran tanpa dokumen yang sudah ada di BokuLoader publik, serta fitur-fitur canggih yang belum dirilis ke publik. Nantikan informasi dan teknik yang lebih mendalam untuk mempelajari cara membawa game Cobalt Strike Anda ke tingkat berikutnya dengan pengembangan UDRL!