Covenant
Covenant
Covenant .NET’in kırmızı takım uygulamalarında
ki gücünü ortaya koymak için .NET ile yazılmış komuta kontrol
(command and control, yazıda C&C kısaltması da
kullanılacaktır) kütüphanesidir. Birden fazla kişinin beraber
çalışmasına imkan sunan bir yapısı vardır. Covenant’ı
anlatmadan önce komuta kontrol nedir, çeşitleri nelerdir, ne için
kullanılır onu anlatmak istiyorum.
Bilgisayar terminolojisinde komuta kontrol, sisteme
bulaşan zararlı yazılımların saldırgan tarafından yönetildiği
sunucuya/sisteme denir. Şöyle bir senaryo düşünelim: Siber
saldırganlar DDoS saldırısı yapmak üzere tasarlanmış bir
zararlı yazılım yazıp yayıyorlar. Bu zararlının 1000 adet
sistemde çalıştığını ve bir hedefe DDoS saldırısı
yapacağını düşünelim. Zararlıdan etkilenen bilgisayarları
(DDoS’un yapılacağı değil, zararlının bulunduğu sistemler)
asker, kötü niyetli saldırganı da bunların komutanı gibi
düşünebiliriz. Bu sistemlerin bir yerden komut alıp bu komutları
yerine getirmesi gerekir. İşte komut aldıkları yere komuta
kontrol sunucusu/sistemi denir.
3 model C&C modeli bulunur[1]:
-
Merkezi C&C: Bir tane sunucu ve birden fazla istemcinin olabileceği komuta kontrol mimarisidir. Bu mimari diğerlerine nazaran daha güvenli ve sağlam bir sistem oluşturur. Fakat tek sunucuya olan bağlılıktan dolayı sunucuya gelebilecek herhangi bir hasarda sistem çalışmaz hale gelir.
-
Peer-to-peer C&C: Her istemcinin, aslında sunucu da olabileceği mimari türüdür. Yazması daha zordur.
-
Dağınık C&C: Bu mimari aktif bir bağlantı ve iletişim sağlamamakla beraber, istemci sürekli dinlemektedir. Sunucu bütün interneti tarayarak istemcisini bularak haberleşme sağlanır. Büyük ölçekli komuta kontrol işleri için kullanımı çok zordur.
Covenant’ın Mimarisi
Genel bir bilgi verdikten sonra asıl konumuz olan Covenant’a dönebiliriz. Covenant sunucu – istemci mimariyi benimser ve 3 temel birimden oluşur[2]. Bunlar Covenant, Elite ve Grunt olarak adlandırılır.-
Covenant: Merkezi sunucuya verilen isimdir. Birden fazla
kullanıcı var ise tek bir merkez sunucu kullanılarak bu sunucu
üzerinden işlemler yapılabilir.
-
Elite: İstemci tarafına verilen isimdir. Komut arayüzü
sağlayarak sunucuyla iletişime geçip işlemleri yapmamıza olanak
verir.
-
Grunt: Zararlı betik, çalıştırılabilir dosya vb. atak
vektörleri ile kurban sistemde çalıştırılıp, ayağa
kaldırılan kısımdır.
Covenant’ın Özellikleri
-
Platform desteği: .NET Core tabanında çalıştığı
için Linux, MacOS ve Windows işletim sistemlerinde çalışmaya
imkan vermektedir. Docker ile kurulum seçeneği de olduğundan
docker kurulabilen her sistemde çalışabilir.
-
Multi-kullanıcı desteği: Bir tane Covenant sunucusu
kullanılarak birden fazla kullanıcıya aynı anda hizmet
verebilir.
-
C# desteği: Covenant C# ile yazıldığınından dolayı
tek satırlık C# komutlarının çalışmasına izin veriyor.
-
Bulgu takibi: İletişime geçilen veya etki edilen bütün
sistemlerle ilgili bilgiler daha sonra kullanılmak üzere saklanıp
sunulur.
Covenant Kurulumu
Covenant sistemini ayağa kaldırmanın 2 farklı yolu var. İlki (ve daha kolay olanı) .NET komutu ile çalıştırmak. İkincisi ise docker yardımıyla sistemleri ayağa kaldırmak. Bu yazıda 2 yolu da anlatmaya çalışacağım.İlk başta Github’ta bulunan repoyu indirmemiz gerekiyor. Bunun için “git clone --recurse-submodules https://github.com/cobbr/Covenant” komutunu kullanarak indiriyoruz. Bu yazıda Covenant sunucusu için Lubuntu 18.04, Elite kurulumu için pop!_os 18.04, Grunt için Windows 10 işletim sistemleri kullanılmıştır. Covenant sunucusunun IP adresi 10.0.2.7, Elite için kullandığım makinenin IP adresi 10.0.2.15’tir. Görsellerdeki adreslerde onlara aittir. Covenant sunucusundaki kullanıcı adı “Admin”, parola “password” olarak kullanılmıştır. Bunların her birini kendi isteğinize göre değiştirirebilirsiniz.
Dotnet
ile kurulum
Covenant’ı dotnet
ile kurmak çok basit. İndirdiğimiz dosyanın içerisinde
Covenant/Covenant yolunu
izleyerek
aşağıdaki komutları uyguluyoruz.
Covenant için:
-
“
dotnet build
” komutu ile build ediyoruz.
-
“
dotnet run
” komutunu kullanarak sistemi hazır hale getirip, çalıştırıyoruz..
Elite
için:
-
“
dotnet build
”
komutu ile build ediyoruz.
-
“
dotnet run
” komutu ile sistemi hazır hale getirip, çalıştırıyoruz.
Docker
ile Kurulum
Covenant
dotnet’in yanı sıra docker ile kurulma imkanı sunuyor. Docker
ile kurulması da gayet basit.
Covenant için:
-
“
docker build -t covenant .
”
komutu ile build ediyoruz.
-
“
docker run -it -p 7443:7443 -p 80:80 -p 443:443 --name covenant -v Covenant’ın-dosya-yolu:/app/Data covenant --username Admin --computername Covenant-makinenin-IP-adresi
”
komutu ile sistemi hazır hale getirip çalıştırıyoruz.
Elite
için:
-
“
docket build -t elite .
”
komutu ile build ediyoruz.
-
“
docker run -it --rm --name elite elite --username Admin --computername Covenant-IP-adresi
”
komutu ile sistemi hazır hale getirip, çalıştırıyoruz.
Kullanımı
Sistemlerimizi
hazır hale getirdikten sonra kullanımına geçebiliriz. Arayüzü
gayet kullanışlı ve kullanıcı dostu olan Elite üzerinden
ilerleyeceğiz. Help komutunu kullanarak o menüde kullanabileceğimiz
seçenekleri görebiliriz.
Menüler
üzerinden teker teker gideceğiz. İlk başta Listeners özelliğinden
başlayalım. İsminden de anlaşılacağı üzere bu modül
dinleyici oluşturup ayarlarını yapmamız için gereken modül.
Listeners komutuyla içine girelim.
Listeners
menüsüne ilk girdiğimizde bize daha önce tanımlı olan objeleri
verecek.
Help komutuyla
Listeners’ın bize sunduklarına bakıyoruz.
“HTTP” komutu ile
yeni bir dinleyici oluşturmak için ilk adımları atalım.
“
Start”
komutuyla hazır hale getirip çalıştırıyoruz. Hazır olunca
ID’si ile beraber uyarı geliyor. “Rename” komutuyla bu ID’yi
değiştirebiliyoruz. “Rename 377d42b4c4 http” komutuyla ismini
http yapıp devam edeceğim.
Listeners menüsünden
çıkmadan önce çalışıp çalışamadığını kontrol etmek için
“Show” komutunu kullanıyoruz. Objemizin aktif olduğunu görünce
her şeyin yolunda gittiğini anlayıp, devam ediyoruz.
Launchers özelliğine
baktığımızda, burası atak vektörlerini, payloadları oluşturmak
için kullandığımız kısım. Launcher yazıp girdiğimizde bize
hangi seçeneklerimiz olduğunu gösteriyor.
PowerShell
ile örnek senaryo yapalım. Bu senaryomuzda PowerShell betiği
oluşturup, kurban makineye bulaştıracağız. Bulaşma işlemi
gerçekleştikten sonra Covenant tabiri ile Windows makinemiz artık
Grunt olacak. PowerShell menüsünü açtığımızda aşağıdaki
gibi bir ekran bizi karşılıyor.
PowerShell menüsünü
açtıktan sonra yapabileceklerimize help ile bakıyoruz.
“Set ListenerName
http” komutuyla kendi oluşturduğumuz Listener’a veri akışı
olacak şekilde ayarlıyoruz.
“Generate”
komutuyla powershell betiğimizi yaratıyoruz.
Grunts
menüsüne dönüyoruz. Bu menüye girer girmez bizi aşağıdaki
gibi bir ekran karşılıyor.
Komutu
kopyalayarak kurban makinemiz olan Windows makineye aktarıyoruz.
Windos
makinede powershell betiğini çalıştırdıktan sonra Elite’in
arayüzüne “Grunt ....... has been activated” şeklinde bir
uyarı geliyor. Bu uyarı geldiğinde anlamalıyız ki betik çalıştı
ve iletişime hazır.
Okunması ve anlaması
daha kolay olması açısında bu ismi değiştiriyoruz. “Rename
eski-ad yeni-ad” şeklinde çalışan komutu uyguluyoruz.
İsmini
değiştirdiğimiz Grunt’a komutlar vermek için “Interact demo”
komutunu kullanıyoruz.
Bu aşamadan itibaren
kurban makineye komutlar verebilir. Covenant kütüphanesinin bize
sunduklarına “Help” komutu ile bakıyoruz. Tek ekran görüntüsüne
sığmayacak kadar fazla seçenek veriyor bize.
Tam bu noktada
anlatmak istediğim bir konu var. Covenant’ın çalışma
mekanizması şu şekilde işliyor. Grunt’a “ls” komutunu
yazdığımız zaman, kurban makineye iş atanıyor.
Genellikle
iş atandıktan sonra atanan işin
id
numarası
ile beraber bize bir uyarı dönüyor.
İş
bittikten sonra
iş tamamlandı uyarısıyla beraber sonuç veriliyor.
Şimdi bazı denemeler
yapabiliriz. “ls” komutu ile bulunduğumuz dizinde nelerin
olduğuna bakalım.
Yardım
kısmında görünen komutlardan devam edelim. “ps” komutu ile
çalışan işlemlerin pid, ppid ve isim bilgilerine bakabiliriz.
Windows
sistemlerde bolca kullanılan Registry’ler için de komutlar var.
Bu komutlar hem yerel bilgisayar için hem de uzakta bulunan
bilgisayarın Registry değerlerini gösterme ve değiştirmeye
olanak sağlıyor. GetRegistryKey fonksiyonunu kullanarak
HKEY_CURRENT_USER\SOFTWARE’de bulunan bütün Registry’leri
listeleyelim.
Bir
başka senaryo üzerinden devam edelim. Bu sefer Launchers
menüsündeki Binary seçeneğini kullanalım. Binary seçeneği bize
ihtiyacımız için gerekli olan çalıştırılabilir dosyayını
(bizim senaryomuzda .exe dosyası) oluşturup kullanımımıza
sunuyor.
Binary’de
kullanabileceğimiz komutlara bakalım.
“Set ListenerName
http” komutuyla dinleyici modülümüzü ayarlayalım. Bundan sonra
y
a
pmamız
gereken şey “Host dosya-adi” komutunu kullanarak asıl zararlı
dosyamızı http dinleyici modülümüzden indirilebilir hale
getirelim. Bu
dosyayı Windows makinemize yükledikten sonra çalıştırıyoruz.
Bağlantı sağlandığı zaman aynı PowerShell’de olduğu gibi
başarılı mesajı vererek komutlarımızı çalıştırmaya hazır
hale geliyor.
Artık Grunts
menüsünde sunulan bütün her şeyi kullanabiliriz. Grunt’ımıza
atanan 6e93967577 ismini binary-demo şeklinde değiştirdim. Bunu
“Rename 6e93967577 binary-demo” komutuyla, “Interact
binary-demo” komutuyla da kurban sistemle iletişime geçebiliriz.
Ls ve whoami
komutlarının çalıştırıldığını ve çıktılarını
görüyoruz.
Bunların
dışında yine seçenekler içerisinde bulunan Mimikatz komutlarını
da çalıştırabiliyoruz. Mimikatz, Windows sistemlerde parolaları
bulmak ve çıkarmak için kullanılan bir araçtır. Genellikle
kırmızı takım faaliyetlerinde kullanılır. Covenant
kütüphanesinde Mimikatz komutlarından bazılarını hazır bir
şekilde barındırıyor. Barındırmadıkları komutları “Mimikatz
komut-adı” şeklinde çalıştırabiliriz. Aşağıdaki görselde
“LogonPasswords” komutuyla Mimakatz’in
“sekurlsa::logonPasswords” komutunu çalıştırmış oluyoruz.
Bu komut Covenant’ın içerisinde hazır halde bulunmaktadır.
Covenant’ın
sağladığı bir diğer fayda ise göstergeleri (Indicator) bize
sunması. Bunlar ağ trafiği, kullanılan dosyalar, hedef sistemler
vs. olabilir. Aşağdaki görselde Indicators sekmesinde bulunanları
görüyoruz.
Credentials
menüsü altında hedef sistemlerden şimdiye kadar toplanan bilgiler
(credentials adından da anlaşılacağı gibi) sunuluyor.
Sonuç
Bu
yazımızda Covenant’ı inceledik. Covenant çok güçlü ve açık
kaynak bir sistem olmasıyla ileride kırmızı takım
aktivitelerinde çok fazla kullanılabilecek bir araç. Şu an ki
versiyonu sadece HTTP üzerinden iletişimi de sağlasa, ilerleyen
zamanlarda daha fazla destek ile beraber daha da güçleneceğine
inanıyorum.
Kaynakça
-
Taxonomy of Botnet Threats: https://sites.cs.ucsb.edu/~kemm/courses/cs595G/TM06.pdf
-
Entering a Covenant: .NET Command and Control: https://cobbr.io/Covenant.html
-
Covenant Github reposu: https://github.com/cobbr/Covenant
-
Elite Github reposu: https://github.com/cobbr/Elite
Burak ÇARIKÇI
CT-Zer0
CRYPTTECH
CT-Zer0
CRYPTTECH
Yorumlar
Yorum Gönder