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]:
  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.
  2. Peer-to-peer C&C: Her istemcinin, aslında sunucu da olabileceği mimari türüdür. Yazması daha zordur.
  3. 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 buildkomutu 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-adresikomutu 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-adresikomutu 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 yapmamı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

  1. Taxonomy of Botnet Threats: https://sites.cs.ucsb.edu/~kemm/courses/cs595G/TM06.pdf
  2. Entering a Covenant: .NET Command and Control: https://cobbr.io/Covenant.html
  3. Covenant Github reposu: https://github.com/cobbr/Covenant
  4. Elite Github reposu: https://github.com/cobbr/Elite

Burak ÇARIKÇI
CT-Zer0
CRYPTTECH



Yorumlar

Bu blogdaki popüler yayınlar

1. Geleneksel Stajyer CTF Soru ve Cevapları

B*-Tree (BTree, BPlusTree) Veri Yapısı ile Veri İndeksleme

2. Geleneksel Stajyer CTF Soru ve Cevapları - 2017