Cobalt Strike ile Siber Saldırı Simülasyonu: Giriş #1
Cobalt Strike, en temel tanımı ile, siber saldırı simülasyonları kapsamında komuta ve kontrol için kullanılabilecek Java tabanlı bir uygulamadır. Powershell Empire, Metasploit (Meterpreter), PoshC2 gibi mevcut diğer komuta ve kontrol araçlarına ücretli bir alternatif olarak Raphael Mudge tarafından geliştirilmektedir.
Cobalt Stike’ın en önemli özelliklerinden biri hedef ağ içerisine gerçekleştirilen ilk adım (initial foothold) sonrasında komuta ve kontrol merkezi ile farklı yöntemler ile iletişimi sağlayan, beacon adı verilen ajanı ve bu ajanın sahip olduğu kabiliyetlerdir. Mevcut Cobalt Strike sürümü 3.13 itibariyle beacon, TCP reverse, TCP bind, HTTP, HTTPS ve DNS protokollerini kullanarak komuta kontrol sunucusu ile şifreli bir biçinde haberleşebilmektedir. Malleable C2 adı verilen yapı kullanılarak ajan ve komuta kontrol merkezi arasındaki iletişimin ağ üzerindeki izi/görünümü değiştirilebilmektedir. Ayrıca istismar sonrası (post-exploitation) aktiviteler ve hedef ağ içerisinde yanal hareket için kullanımı amacıyla tasarlanan “pivot” özelliği, diğer komuta kontrol araçları arasında Cobalt Strike’ı öne çıkarmaktadır. Tüm bunlara ek olarak, uluslararası alanda sızma testi çalışmaları gerçekleştiren profesyoneller tarafından tercih edilmesinde önemli bir etken de etkinlik sonrası detaylı raporlama özelliğidir. Cobalt Strike üzerinden gerçekleştirilen eylemlere dair loglar teamserver üzerinde tutulmakta, kullanılan dosyaların özet (hash) değerleri hesaplanarak, çalışma sonrası temizlik için raporlanabilmektedir. Bunların yanısıra gerçekleştirilen saldırı simulasyonu sırasında çalıştırılan işlemler, komutlar ve taktikleri kronolojik sırasında gösteren ve MITRE ATT&CK matrisine göre yorumlayan raporlar oluşturabilmektedir.
Cobalt Strike, istemci uygulaması (client) ve sunucu uygulaması (server) olmak üzere, 2 temel parçadan oluşmaktadır. Java tabanlı olduğundan istemci uygulaması Windows, OSX ve Linux işletim sistemleri üzerinde çalışabilmekte, sunucu uygulaması ise yalnızca linux üzerinde çalışabilmektedir. Kullanıcı tercihine bağlı olmak ile birlikte, genellikle hedef ağ ile komuta kontrol (C2) sunucusu direkt olarak haberleşmezler. Siber saldırılar ve simülasyonlar sırasında, gizlilik ve operasyonel güvenlik sağlaması için kullanılan, C2 ve hedef sistemler arasında trafiği yönlendiren / üzerinden geçiren (Redirector) yönlendirici adı verilen sistemler de bulunabilmektedir. Cobalt Strike ayrı bir yönlendirici modülü içermese de, belirtilen bu yapıyı destekleyebilecek yetkinliğe sahiptir. Bu genel yapı aşağıdaki akış çiziminde özetlenmiştir.
Cobalt Strike sunucu uygulaması “teamserver”, yüklü olduğu sunucu üzerinde, ilgili dizinde aşağıdaki komut ile çalışır hale getirilebilir:
./teamserver <IP> <teamserver password> [Malleable Profile] [YYYY-MM-DD]
İlk iki parametre ile teamserver çalışma ip adresi ve bağlantı için kullanılacak şifre verilmektedir. Bu iki parametre de zorunludur. Üçüncü ve dördüncü parametrelerde ise opsiyonel olarak Malleable C2 profil dosyası konumu ve çalışma için kesin bitiş tarihi verilebilmektedir. Kesin bitiş tarihi verilen sunucu üzerinde üretilen ajanlar içerisine bu tarih gömülü olup, verilen tarihten sonra ajanların çalışmaları bu şekilde engellenebilmektedir.
Teamserver’ın çalışacağı sunucuya ssh ile uzaktan bağlanıldığı durumlarda, bağlantı kapansa dahi teamserver’ın çalışır durumda kalması için screen, tmux gibi komutlar ile birlikte kullanımı tercih edilebilir.
Cobalt Strike sunucu ve istemci uygulamaları SSL kullanarak güvenli bir bağlantı kurmaktadır. Teamserver ilk kez çalıştırıldığında otomatik olarak bir sertifika üretecek ve her çalıştırıldığında bu sertifikanın imzasını sunucu ekranında gösterecektir. İstemci tarafında da ilgili sunucuya ilk kez bağlantı gerçekleştirildiğinde sunucunun imzası istemci ekranında görüntülenerek kullanıcı tarafından doğrulanması istenecektir.
“Operasyonel Güvenlik Üzerine Not”
Varsayılan ayarlarda Cobalt Strike SSL sertifika alanları statik olarak belirlenmekte ve teamserver Port 50050 üzerinde çalışmaya başlamaktadır. Her ne kadar bu yazının kapsamında yer almasa da bu durumun operasyonel güvenlik “OPSEC” bağlamında etkileri mevcut olabilir. Bu varsayılan (default) ayarlar Cobalt Strike servisinin internete açık olduğu durumlarda, varsayılan port ve sertifika kullanımı sonucu üzerinde çalışan uygulamaya dair bilgi açığa çıkmasına sebep verebilecektir. Kesin çözüm olmamakla birlikte ilgili varsayılan port’un ve sertifika değerlerinin değiştirilmesi, basit taramalar sonucunda Cobalt Strike sunucunuzun ifşa olmasını engelleyebilir. (Not: Varsayılan Port ve sertifika değiştirme işlemlerine rağmen Cobalt Strike teamserver port’unun internete açık tutulması uygun bulunmamaktadır, daha iyi bir operasyonel güvenlik için bunun yerine ssh tünelleme ya da VPN üzerinden bağlantı kurulması tercih edilmelidir). Varsayılan port ve sertifikanın değiştirilmesi için teamserver dosyası aşağıdaki gibi düzenlenebilir:
# Cobalt Strike kurulum dizini altında
vim teamserver
Dinleyici Oluşturulması ve Faydalı Yük (Payload) Üretimi
Ana ekran üzerinden, artı ve eksi butonları yardımıyla yeni bir teamserver’a bağlantı kurulabilir ya da bir team server ile bağlantı kesilebilir.
Dinleyici oluşturmak için öncelikle kulaklık butonu kullanılarak dinleyici (Listeners) sekmesi açılır. Ardından yeni bir dinleyici oluşturmak için Add butonuna tıklanır ve açılan sekmede dinleyiciye bir isim verilir, port belirlenir ve dinleyici ile birlikte kullanılacak ajan haberleşme tipi seçilir.
Kullanılabilecek diğer dinleyici çeşitleri aşağıdaki gibidir:
- HTTPS üzerinden (geri dönüşlü olarak) haberleşen Cobalt beacon,
- DNS üzerinden (geri dönüşlü olarak) haberleşen Cobalt beacon,
- DNS üzerinden (geri dönüşlü olarak) haberleşen ancak “staging” işlemi http üzerinden olan Cobalt beacon.
- TCP bind yöntemi ile (direkt) haberleşen Cobalt beacon
Bunlara ek olarak Foreign Listener adı verilen ve ajanların, çalışmakta olan Metasploit dinleyicileri ile haberleşmelerini sağlayacak bir yapı ve hedef ağ içerisinde, sistemler arasında yanal hareket için SMB protokolü üzerinden kullanılabilecek smb_pipe dinleyici yapısı da mevcuttur.
Belirlenen ayarlara uygun olarak bir çok farklı dilde payload oluşturabilmesinin yanısıra çalıştırılabilir (executable) dosya üretilmesi de mümkündür. Aşağıdaki örnekte, 80. port üzerinden http protokolü ile çalışacak bir dinleyici oluşturulmuş ardından da Payload Generator kullanılarak, bu dinleyici ile haberleşecek ajanları hedef sistemde çalıştırmak için bir payload üretilmiştir. Bu örneğimiz kapsamında payload türlerinden “powershell command” seçerek ilerlemekteyiz. Bu seçenek, direkt olarak hedef makinada komut satırına yazılarak çalıştırılabilecek bir powershell betiği üretecek ve onu belirlediğiniz bir dizine text olarak kaydedecektir.
Yukarıdaki örnekte dinleyici oluşturulurken verilen IP adresi ya da domain adresi, ajanın (beacon) hedef sistemden komuta kontrol sunucusu ile haberleşmek için bağlanacağı adres olmalıdır. Bu nedenle komuta kontrol sunucusu ve hedef sistemler arasında yönlendirici (Redirector) kullanıldığı durumlardada verilmesi gereken IP ilgili yönlendirici sistem IP’sidir.
Operasyonel Güvenlik Notu: Antivirüsler ve diğer güvenlik yazılımları, varsayılan payload betikleri için genellikle basit ancak etkili kurallar ile alarm üretmekte ve/veya bu betik ile çalışacak işlemi sonlandırmaktadırlar, bu nedenle varsayılan betiklerin değiştirilmeden kullanımı gizlilik gerektiren durumlar için önerilmemektedir.
Beacon ve Komuta kontrol merkezi dns, http ve https dinleyicileri kullanıldığı durumlarda asenkron iletişim kurmaktadırlar. Bu asenkron iletişimin varsayılan aralık değeri 60 saniyedir. Yukarıda verilen örnek için Beacon her 60 saniyede bir kere, dinleyici oluşturulurken belirlenmiş olan IP ya da domain adresinin ilgili portuna http üzerinden istek göndermektedir.
Varsayılan ayarlarda reverse_http beacon, HTTP GET isteği ile çalıştırması gereken komutları öğrenmekte ve eğer önceden çalıştırılması istenmiş bir komut ya da işlem var ise sonuçlarını HTTP POST isteği ile komuta kontrol suncusuna iletmektedir.
Asenkron HTTP iletişim varsayılan aralık değerinin değiştirilmesi “sleep <saniye>” komutu kullanılarak ya da arayüzden ilgili ajana sağ tıklanarak açıkan menü üzerinden mümkündür. Ek olarak ajan menüsünden sleep seçeneğine 2. bir parametre vererek her iletişim arasındaki uyku süresine rastgelelik katılabilmektedir. jitter değeri 0 ile 99 arasında verilebilmekte ve 60 saniyelik bir aralık değeri için 50 jitter değeri kullanılması durumunda her iletişim aralığı 30 saniye ile 90 saniye arasında rastgele şekilde değişecektir.
Son olarak, aşağıda kısaca hedef sistemdeki bir ajan ile Cobalt Strike arayüzü üzerinden etkileşim gösterilmektedir (Not: Hızlı bir örnek gösterim için sleep değeri 1 saniye altına çekilmiştir).
Bu yazı içerisinde Cobalt Strike komuta kontrol aracı ve temel yetkinliklerine değindik. Varsayılan ayarlarla http üzerinden haberleşen bir ajan ve sunucu tarafında dinleyici oluşturduk. İlgili ajanı örnek bir sistem üzerinde çalıştırarak komuta kontrol merkezi ve hedef arasındaki iletişimi ve arayüz üzerinden basitçe ajan ile etkileşimi inceledik.