Active Directory Hacking; Havoc C2, AMSI Bypass, Antivirus Evasion, Pass the Hash, Lateral Movement

Selamlar, bloga yazı girmeyeli uzun zaman olmuştu. Ülkece hem yaşadığımız deprem, hem de bunun getirdiği çeşitli zorluklar nedeniyle bir türlü yeniden başlamaya niyet edip yapamamıştık. Nihayet fırsat bulabildim ve güzel bir yazıyla tekrardan karşınıza geleyim istedim. Başından uyarayım çay kahvenizi hazırlayın, hazırlamadıysanız ocağa koyun zira gayet uzunca olacak.

Genel olarak şu başlıklarda elimizden geldiğince, dilimiz döndüğünce bir şeyler yapmaya ve anlatmaya çalışacağım:

  • Havoc da Nedir? Başımıza İcat Çıkarma
    • Adım Adım Havoc C2 Kurulumu, TeamServer Yapılandırması ve İlk Bakış
  • Active Directory Hacking ve Red Teaming Senaryosu
    • Zafiyetli Active Directory LAB Hazırlığı (WazeHell Vulnerable-AD)
    • İstemcileri Active Directory Yapısına Dahil Etme Aşamaları
  • Post Exploitation: AMSI Bypass, Antivirus Evasion, Pass to Hash, PsExec/WmiExec.py
    • Amsi.dll Debugging ve AmsiScanBuffer, AmsiOpenSession Bypass Metodu
    • Basit Antivirus Atlama Teknikleri: İmza Tabanlı, DLL Sideloading, Normalizasyon
    • Pass the Hash Saldırıları ve PsExec/WmiExec.py ile Domain Controller’a Sıçrama

Günümüzde bir sistemi hacklemeye çalışıyorsanız özellikle de hedefiniz büyük bir sistem ise muhtemelen karşılaşacağınız yapı Active Directory üzerinde olacaktır. Bu nedenle başlamadan önce hiç yoktan nasıl bir şeydir, yenir mi, acı mı tatlı mı biraz bu konular hakkında ön bilgi sahibi olmanızda fayda var. “ula ben yazıyı zorla okuyorum sen aktif direktori mirektori diyorsun hiç gugıl amcaya soramam üşeniyorum” diyorsanız yazıda üstü körü ayrıca o mevzuya da gireceğiz, nasıl güvenli bir şekilde yapılandırabiliriz falan detaylarına da nasip olursa ilerideki yazılarda değiniriz.

Havoc da Nedir? Başımıza İcat Çıkarma

Havoc, siber güvenlik uzmanları ve red team ekiplerinin kullanmaları için teamserver tarafı Golang, kullanıcı arayüzü/istemci kısmı C++ ve QT, Demon olarak adlandırılan payload/malware tarafı ise C ve ASM ile geliştirilmiş bir C2 framework’ü diye basitçe ifade edebilirim. Cobalt Strike, Brute Ratel C4 ne yapıyorsa hepsini yapabiliyor hatta arayüz olarak da daha basit bir kullanım sunuyor. İçerisinde lazım olabilecek birçok özellik beraber geliyor, her şeyin kontrolünü çok temiz bir panelden yapabiliyorsunuz.

Adım Adım Havoc C2 Kurulumu, TeamServer Yapılandırması ve İlk Bakış

Daha fazla tanımlara boğulmadan hemen saldırgan makinemize/takım sunucumuza kurmaya başlayalım ve GitHub sayfasını ziyaret edelim. Burada program hakkında ek duyurular yer alıyor mu, değişiklikler var mı diye ara sıra bakmanızda yarar var.

https://github.com/HavocFramework/Havoc

Ben teamserver ve client olarak Kali Linux kurulu bir makine tercih ettiğim için kurulum adımlarını buna göre uygulayacağım. Eğer siz farklı bir dağıtım kullanıyorsanız uygun olan işlemleri Havoc C2’nun dökümantasyonundan yararlanarak gerçekleştirebilirsiniz. Hemen onun bağlantısını da aşağıya bırakmış olalım.

https://havocframework.com/docs/installation

Maalesef hazır derlenmiş versiyonu bize sunulmadığı için framework’ü kaynağından kendimiz el ile derlemek zorundayız. Bunun için ön hazırlık olarak gereken kütüphaneleri ve derleme araçlarını kurmak için aşağıdaki komutu terminalinize kopyalayıp yapıştırın. İlerleyen aşamalarda sıkıntı yaşamamak için paketlerin hatasız bir şekilde kurulduğundan emin olun.

sudo apt install -y git build-essential apt-utils cmake libfontconfig1 libglu1-mesa-dev libgtest-dev libspdlog-dev libboost-all-dev libncurses5-dev libgdbm-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev libbz2-dev mesa-common-dev qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools libqt5websockets5 libqt5websockets5-dev qtdeclarative5-dev golang-go qtbase5-dev libqt5websockets5-dev python3-dev libboost-all-dev mingw-w64 nasm

Daha sonra GitHub üzerinden Havoc reposunu git aracılığıyla makinemize klonlayalım ve ilgili dizine derleme işlemlerini yapmak için geçiş yapalım.

Havoc C2, önceden de bahsettiğimiz üzere 3 parçadan oluşan bir mimariye sahip. Bunlar; zararlı yazılımın bizimle bağlantı kuracağı ve takım arkadaşlarımızla çalışma yürütebileceğimiz bir Teamserver, buraya erişebilmek için Client ve zararlı yazılımın kendisi olan Demon’dan oluşuyor. Sonuncuyu Cobalt Strike’daki Beacon gibi düşünebilirsiniz, aynı mantık. Sırayla gidelim ve Teamserver’ımızı oluşturmaya başlayalım.

cd Teamserver ile ilgili dizine geçiş yaptıktan sonra gerekli Musl derleyicisini indirmeye yarayan hazır Bash scriptini chmod +x Install.sh ile yürütülebilr hale getirelim.

./Install.sh ile Bash scriptini çalıştırdıktan sonra tamamlanması indirme işlemi nedeniyle internetinize bağlı olarak biraz uzun sürebilir, lütfen sabırla bitmesini bekleyin aksi halde kurulumun ilerleyen evrelerinde sorunlar yaşamanız işten bile değil.

Gerekli Go kütüphanelerini de aşağıdaki komutlarla indirelim.

go mod download golang.org/x/sys
go mod download github.com/ugorji/go

Artık sorunsuz bir şekilde build edebiliriz. Dikkat, cd .. ile bir üst dizine yani Havoc ana dizinine geçiyoruz. make ts-build komutunu burada vermemiz gerekiyor. Adımları eksiksiz uyguladıysanız herhangi sorunla karşılaşmamalısınız.

./havoc server diyerek doğru çalışıp çalışmadığının kontrolünü sağlayalım. Sıkıntı gözükmüyorsa make client-build ile istemciyi de derleyelim. Bununki C++ ve Qt ile geliştirildiği için biraz daha renkli 🙂

Client’ımızı da ./havoc client komutunu girip test edelim. Başarıyla çalışıyor gibi gözüküyor. Şu anda herhangi bir teamserver yapılandırıp başlatmadığımız için Connect olamıyoruz.

TeamServer bağlantısının sağlanabilmesi için Havoc/profiles/havoc.yaotl yolunda yer alan yapılandırma dosyasının aşağıdaki gibi düzenlenmesi gerekir. Burada teamserver’ın host IP bilgisi ve kullanılacak Port belirlenip, login olabilecek operatörlere ait kullanıcı adı ve parola bilgileri belirlenmelidir.

./havoc server --profile ./profiles/havoc.yaotl -v --debug diyerek TeamServer’ı artık başlatabiliriz. Sonundaki debug parametresi olası bir sorun yaşanması durumunda nerede olduğunu anlayabilmemizde yardımcı olacaktır.

Diğer bir terminal penceresinden ./havoc client diyerek istemciyi çalıştırıyoruz. Buradaki isim kısmına herhangi bir şey girebilirsiniz, Host ve Port kısmını yapılandırma dosyasında belirlediğiniz gibi girip, operatöre ait kullanıcı ve parolayı da yazdıktan sonra Connect olabiliriz.

Burada şunun da altını çizmekte fayda var, teamserver ile istemciniz illa aynı makinede olmak zorunda değil. Teamserver’ı uzak sunucuya kurup kendi bilgisayarınızdan bağlanabilirsiniz, ben burada mantık aynı olduğu için ayrı makinelere kurmaya uğraşmadım.

Yep, Havoc C2 karşımızda. Demon’lardan (az sonra ona da değineceğiz) gelen bağlantı isteklerini kabul edebilmesi için hemen bir listener oluşturarak işe başlayalım. Sol üst köşede “View” sekmesi altına geldiğimizde Listeners kısmına tıklayalım. Altta bizim için bir menü açılacak. Burada “Add” butonuna basalım.

Ek olarak Armitage ve Cobalt Strike’da olduğu gibi ele geçirdiğimiz cihazların liste halinde değil de simgelerle şekilde gösterilmesi için “Session View” kısmından “Graph”i seçmeniz gerekiyor.

Bunların dışında ilk bakışta dikkatimi çeken güzel bir özellik mevcut, Teamserver Chat. Böylece birden fazla kişiyle red team süreci yürütürken haberleşebileceğiniz hızlı ve güvenli bir iletişim kanalına sahip olmuş oluyorsunuz.

Daha sonra oluşturacağınız Demon’a uygun şekilde gereken ayarları seçerek kaydedelim. Ben aşağıdaki gibi “Hosts” eklemek dışında başka bir değişiklik yapmadan varsayılan olanı kullanmayı tercih ediyorum. Burada kurban cihaz ile teamserver’ınız arasında olan veri akışının biraz daha zor izlenebilmesi için HTTPS olarak seçili bırakmanızı tavsiye ederim.

Not: Listener isminde Türkçe karakterler kullandıysanız, kullandığınız dağıtıma göre sorun yaşayabilirsiniz. Bu durumda uygun ve istenmeyen karakterler bulunmayan başka bir isim belirleyebilirsiniz.

Sıra geldi zararlımızı oluşturmaya. Bunun için de Attack menüsü altındaki Payload‘a tıklıyoruz. Burada normal EXE dosyası, DLL dosyası ve shellcode olacak şekilde 3 Demon yükü oluşturabiliyorsunuz. Ben doğrudan “.exe” olarak oluşturmayı tercih ettim, injection yapılacak süreçleri de değiştirmedim siz yine kendinize göre yapılandırmak hususunda tabii ki özgürsünüz.

Zararlı hedef tarafından çalıştırıldığında sağdaki “Event Viewer” kısmında bağlantı sağlandığı görülür. Bilgisayar ikonuna sağ tıklanıp “Interact” denilerek red team süreçlerini yürütebileceğimiz konsola erişilir ve checkin komutuyla sistem hakkında genel bilgiler elde edilir. Kullanabileceğiniz komutlar hakkında bilgi edinmek için help yazabilirsiniz.

Her neden olduğunu anlamasam da bilgisayar ikonuna sağ tıklayınca gözüken menüden “Process List” ve “File Explorer” özelliklerini kullanmaya çalıştığınızda hedefinizle bağlantınız kopabiliyor veya problem yaşanbiliyor. Buna testlerinizde çok ama çok dikkat etmenizi tavsiye ederim.

Active Directory Hacking ve Red Teaming Senaryosu

Kurumsal yapılar ve bilişim ağlarında sıklıkla karşılaşmanız muhtemel Active Directory yapısının nasıl hackleneceğine dair bir şeyler anlatmadan hemen öncesinde, bu servisin ne iş yaptığına hızlıca değinmekte oldukça yarar var diye düşünüyorum.

AD, aslında basitçe ağda yer alan birden fazla cihazı tek bir merkezden yönetebilmenize yarayan bir hizmet diye sanırım tanımlayabiliriz. Bir şirkette bilgi işlem bölümünde çalıştığınızı düşünün, eğer 3-5 bilgisayar varsa bunları geleneksel uzak masaüstü araçlarıyla yönetebilirsiniz ama binlerce bilgisayardan ve cihazdan oluşan bir ortam söz konusu olduğunda bunların toplu yönetimi oldukça zor hale gelecektir.

Dolayısıyla Active Directory yapısından yararlanılarak bütün cihazlar tek bir merkeze bağlanıyor ve program yüklenmesinden tutun da hangi cihazın nerelere erişebileceğine, yetkilerinin ne olacağına kadar her şey daha kolay bir şekilde kontrol ediliyor.

Active Directory ve Domain yapısını gösteren bir diyagram.

Bu nedenle gerek etik gerek de etik olmayan siyah şapkalı abilerimizin ilk hedefi bütün cihazlarda söz sahibi olan bu yapıyı/Domain Controller’ı ele geçirmek oluyor. Bunun için önce genellikle ilgili AD üzerinde yer alan bir makine hackleniyor, daha sonra bunun üzerinden daha yetkili olanlara geçebilmek için “Pivoting” ve “Lateral Movement” olarak tanımladığımız işlemler yerine getiriliyor. Ana hedef her zaman sistemin tamamını veya çoğunluğunu ele geçirmek.

Her şeyin yönetildiği mekanizma olduğu için Active Directory yapısının güvenli bir şekilde dizayn edilmesi oldukça önemli. Bu yazımızda en başlarda Havoc C2’muzu kurmuştuk. Şimdi de kurumsal pentestlerde olduğu gibi bir Active Directory ortamını hedefleyecek, oluşturduğumuz zararlılarla cihazları ele geçirip zayıflıklardan faydalanarak en yetkili kullanıcı olmaya çalışacağız.

Tekrar ediyorum, Active Directory oldukça faydalı olduğu kadar düzgün yapılandırılmadıysa çok ciddi şekilde tehlikeli olabilir. Örneğin birçok ransomware çetesinin hedeflere sızdıktan sonra AD üzerindeki misconfiguration’lardan yararlanarak hedeflerinin SoC kullanıcılarını cihazlardan kaldırdıkları ve böylece güvenlik ekipleri tarafından saldırıların saatlerce fark edilmesini ve müdahaleyi engelledikleri bilinmektedir. Bu durum tam anlamıyla bir faciadır.

Zafiyetli Active Directory LAB Ortamı Hazırlama

Yazıda uygulamalı olarak göstereceğimiz için kendimiz AD ortamımızı kuracağız ve çeşitli red team operasyonlarını uygulayabilmek için WazeHell (Twitter: @safe_buffer) tarafından hazırlanan “Vulnerable-AD” adındaki PowerShell scriptinden yararlanacağız.

https://github.com/WazeHell/vulnerable-AD

Aşağıdaki komutları sırasıyla kopyalayıp PowerShell’e yapıştırarak hızlı bir şekilde ninelights.local adında bir AD oluşturabilirsiniz. Eğer daha önceden kendi başınıza bu hizmeti Windows Server’ınıza eklediyseniz buna gerek yok doğrudan “Vulnerable-AD” çalıştırabilirsiniz.

Not: Domain Controller olarak belirleyeceğiniz yani Active Directory yapısını üzerine kuracağınız sanal makinenin IP adresini sabitlemeyi unutmayın.

Install-windowsfeature AD-domain-services
Import-Module ADDSDeployment
Install-ADDSForest -CreateDnsDelegation:$false -DatabasePath "C:\\Windows\\NTDS" -DomainMode "7" -DomainName "ninelights.local" -DomainNetbiosName "NineLightsDC" -ForestMode "7" -InstallDns:$true -LogPath "C:\\Windows\\NTDS" -NoRebootOnCompletion:$false -SysvolPath "C:\\Windows\\SYSVOL" -Force:$true

İşlemlerden hemen sonra sistem gerekli değişiklikleri uygulamak için yeniden başlayacak. Oturum açma ekranında belirlediğiniz DC adını görüyorsanız başarıyla kurdunuz demektir.

Oturum açtıktan hemen sonra WazeHell Vulnerable-AD kurulumunu yapmak için PowerShell’e gelip sırasıyla aşağıdakileri de yapıştırıyoruz. Herhangi bir problem çıkmazsa aşağıdaki gibi bir görünümle karşılaşmalısınız.

IEX((new-object net.webclient).downloadstring("https://raw.githubusercontent.com/wazehell/vulnerable-AD/master/vulnad.ps1"));
Invoke-VulnAD -UsersLimit 100 -DomainName "ninelights.local"

Oluşturulan kullanıcıları “Server Manager” üzerinden “Active Directory Users and Computers” kısmından görebiliriz. Eğer bu özellik de yoksa şu komutu da uygulayarak ekleyebilirsiniz. Kontrol ettiğimizde Vulnerable-AD bizim için kullanıcıları başarıyla oluşturmuş.

add-windowsfeature -name rsat-adds

İstemcileri Active Directory Yapısına Dahil Etme Aşamaları

WazeHell Vulnerable-AD kurduktan sonra ilgili zafiyetleri deneyebilmeniz için kurban bir istemciye ihtiyacınız var. Bunun için de başka bir sanal makine kurup, hangi işletim sistemi olduğu fark etmeksizin Domain’e dahil etmeniz gerekiyor. Hedefleyeceğimiz makine ilk olarak bu olacak.

İnternette araştırdığımda Vulnerable-AD kurulumu sonrası bunun nasıl gerçekleştirileceğine dair bir rehber göremediğim için burayı da anlatmaya karar verdim.

İlk olarak yapmanız gereken kurban makine (benim durumumda güncellemeleri tamamlanmış bir Windows 10) ve Domain Controller (Windows Server 2019 Standart) aynı anda ayağa kaldırmak ve oturum açmak. İstemci makineyi domaine dahil edebilmemiz için öncelikle domaini çözümleyebilmesi gerekiyor, bu nedenle DNS adresini Windows Server 2019 makinemizin IP adresi olacak şekilde tanımlıyoruz.

İşlem sonrası CMD üzerinden ninelights.local adresine ping atıldığında yanıt verdiği görülmelidir.

Daha sonra “Gelişmiş Sistem Ayarlarını Görüntüle” kısmından “Bilgisayar Adı” sekmesine gelinir ve “Değiştir” butonuna basılıp “Etki alanı” yazan ayar seçilir ve domain adı girilmelidir. Bilgisayar adı ise yapıda hatırlaması kolay bir şey ile değiştirilebilir.

Tamam’a bastıktan sonra karşınıza istemciyi bağlayabilmek için yapıda yer alan bir kullanıcıya ait bilgileri girmeniz gerekiyor. Vulnerable-AD’nin bizim için oluşturduğu bir user’ı ve parolasını yazıyorum.

Artık bilgisayarımız ninelights.local adındaki domaine bağlı. Bu işlemden sonra yeniden başlatma isteyecek.

Unutmamanız gereken şu ki, ilk oturum açışta istemci daha önceden yüklenirken var olan kullanıcıyla oturum açarsanız domainde değil localde olursunuz. Bu nedenle AD üzerinde tanımlı bilgilerle giriş yapmanız gerekiyor. CMD üzerinden kontrol ettiğimizde bilgisayarın başarıyla domainde yer aldığını görebiliriz.

Post-Exploitation: AMSI Bypass, Antivirus Evasion, Pass to Hash, PsExec/WmiExec.py

Amsi.dll Debugging ve AmsiScanBuffer, AmsiOpenSession Bypass Metodu

Başta sistem yöneticileri ve programcıların yapacaklarını daha hızlı ve kolay şekilde yapabilmeleri için geliştirilen bir çeşit terminal olan PowerShell, zaman içerisinde hackerların da 1 numaralı yardımcısı haline geldi. Çeşitli dillerde kodlar yürütebilme, herhangi bir 3. partiye ihtiyaç kalmadan birçok işi yapabilme ve scripting desteği sayesinde Windows sistemlerdeki post-exploitation evrelerinde sık sık yararlanıyoruz.

Bundan dolayı olsa gerek, Microsoft AntiMalware Scan Interface (AMSI) adında geliştirdiği güvenlik teknolojisini kötüye kullanılabilecek çeşitli sistem bileşenlerine dahil etti. Normal şartlarda amacı herhangi bir programın çağırarak virüs taramaları ve güvenlik kontrolleri yapmasını sağlayan bir arayüz sunmak iken aşağıdakiler çalıştırıldığında doğrudan AMSI aktif hale gelir. (Kaynak: Microsoft)

  • Kullanıcı Hesabı Denetimi veya UAC (EXE, COM, MSI veya ActiveX kurulumları için istenen izinler)
  • PowerShell processlerinde
  • Windows Komut Dosyası Arabirimi (wscript.exe ve cscript.exe)
  • JavaScript ve VBScript
  • Office VBA makroları

AMSI çalışma mantığına göz atacak olursak, çağırıldığı süreçlere bir .dll dosyası olarak inject edilir. Inject edildiği process üzerinde yer alan çeşitli girdileri çeşitli şekillerde işleyerek kontrole tabi tutar. Eğer ilgili girdi veya dosya zararlı ise engelleme işlemi gerçekleştirilir.

Örnek verecek olursak, Invoke-Mimikatz girdisi şüpheli olarak işaretlenmiştir. AMSI ypass edilmeden bunu yazarsanız antivirüs yazılımı tarafından bloklandığına dair bir uyarıyla karşılaşacaksınız. Bunu işte yukarıda bahsettiğimiz ve Powershell.exe üzerine inject olmuş amsi.dll yapıyor.

System Informer (eski adıyla Process Hacker) kullanarak bunu rahatlıkla görebilirsiniz.

Peki bunu nasıl geçebiliriz zira bir şekilde bunu halletmemiz lazım ki PowerShell üzerinde istediklerimizi yapabilelim. Tabi PowerShell 2.0 kullanmak, stringleri bölmek, Base64 ile encode etmek gibi birçok yolu olsa da bunlar ne yazık ki işlevsel ve kullanışlı çözümler değiller. Örneğin PS 2.0 kullandığınızda bazı scriptleri çalıştıramayabilirsiniz veya stringleri ne kadar bölüp encode ederseniz edin sıkıntılar yaşayabiliyorsunuz.

Benim genellikle kullandığım ve sevdiğim metod ise Rasta Mouse tarafından 2021 yılında yazısı yazılan Memory Patching AMSI Bypass. Bu teknik AMSI’nin çalışma mantığına dayanıyor. Yukarıya bıraktığım şemadan da anlayabileceğiniz üzere AMSI, AmsiScanBuffer ve AmsiScanString şeklinde iki ana fonksiyona sahip. Bu fonksiyonlar sonuçlara göre belirli bir değer döndürüyor ve işlem buna göre engelleniyor. Bypass tekniği ise buradan dönecek değeri uygun olanla değiştirerek sorunsuzca zararlı scriptlerimizi çalıştırabilmemizi amaçlıyor.

Diğer bir yöntem ise Rasta Mouse’un tekniğinin biraz daha farklı hali olarak ve şu andaki en güncel yöntem olan AmsiOpenSession bypass’a dayanıyor. Mantık yine aynı fakat burada değeri farklı döndürmek yerine AMSI daha devreye girmeden önce koşulları uygun şekilde patchleyerek çalışmasını engelliyoruz.

Debugger üzerinden hemen daha iyi anlaşılabilmesi için gösterelim. Daha önceden çalıştırdığımız PowerShell’i x64dbg’a attach ediyoruz ve “Symbols” kısmından amsi.dll aratıp AmsiOpenSession kısmına geliyoruz.

Buradaki algoya dikkat ederseniz başlangıçtan itibaren çeşitli koşullarla dallanmalar ve karşılaştırmaların yer aldığını göreceksiniz. En sonda yer alan mov eax, 80070057 ise Windows sistemlerde hatalı parametre girildiğinde döndürülen bir kod. Biz burada koşulu değiştirerek AMSI’nin başlamasını engelliyoruz. Böylece artık ne yaptığımızla ilgilenemiyor :=)

Tabi red team çalışmalarında bir makineyi ele geçireceğiniz zaman debugger açıp uğraşmak pek işimize gelmez. Bunu halihazırda yapan bir kod yazılmış, bu aracı kullanabilirsiniz.

https://github.com/surya-dev-singh/AmsiBypass-OpenSession

Basit Antivirus Atlama Teknikleri: İmza Tabanlı, DLL Sideloading, Normalizasyon

Bir Active Directory ortamını ele geçirmeye çalışıyorsak, bilmemiz gereken en temel şeylerden biri istemcilerde muhtemelen işimize engel olabilecek güvenlik yazılımları kurulu olduğudur. Halen birçok şirket ve kuruluş ağını ve ağda yer alan cihazları korumak için üçüncü parti antivirüs/EDR yazılımlarını tercih ediyor.

Eğer red team çalışması yürütüyorsak, çalışmamızın amacına ulaşabilmesi için mutlaka önümüzdeki ilk ve en büyük engellerden biri olan antivirüslerin en azından temel seviyede nasıl atlatılabileceğini bilmemiz gerekiyor. Burada çok ileri düzey tekniklere yazı zaten yeterince uzun olduğu için girmeyeceğim lakin birkaçına değinmeye çalışacağım.

Tekniklerden ilki herkesin bildiği imza manipülasyonuna dayanıyor. Şöyle ki, veritabanı yardımıyla çalışan antivirüs yazılımları bir programı zararlı olarak tanımlarken halihazırda kendilerinde var olan pattern ve koşullarla uyuşup uyuşmadığına bakarlar. Buna göre zararlı veya zararlı değil şeklinde bir sonuç döner. Bunun için genellikle kötü amaçlı yazılımın daha önceden tanımlanmış olması veya bu şekilde tanımlanmış özel değerlerin dosyada yer alması gerekir.

Oldukça eski ve günümüzde kimi zaman artık yeterli bulunmayan bir algılama teknolojisi olsa da birçok güvenlik yazılımları veritabanlarına yani imza tabanlı tespit sistemine güvenerek çalışmaya devam etmekte. Dolayısıyla eğer red team/kırmızı takım çalışmalarınızda daha önceden tespit edilmiş ve bilinen bir araç kullanmanız durumunda başarısız olmanız çok daha muhtemel. Bu da gösteriyor ki duruma özgü şekilde kendi aracınızı, initial access (ilk erişim) zararlınızı geliştirmeniz oldukça önemli bir beceri olarak karşınıza çıkıyor.

Kaynak: ResearchGate

Diyelim zararlıyı en baştan kendiniz geliştirdiniz fakat yine de zararlı olarak algılandı veya yeterli zaman bulamadığınız için hazır olanlardan yararlanmak istediniz, bu durumda ne yapmanız gerekli? Aslında mantığı tahmin edebileceğiniz üzere oldukça basit, programı parçalara bölüp zararlı olarak algılanan değerleri değiştireceksiniz. Sevgili Gökhan Muharremoğlu’nun PwC Türkiye’de yayınladığı Sızma Testlerinde İmza Manipülasyonu Yöntemiyle Antivirüslerin Kolay Yoldan Atlatılması makalesi bu hususta oldukça faydalı olacaktır, okumanızı tavsiye ediyorum. Belki tam olarak antivirüsleri bypass etmenizi sağlayamasa bile büyük oranda ilerleme kaydetmiş olursunuz.

Diğer bir tekniğimiz ise APT gruplarının kullanmayı oldukça sevdiği DLL Sideloading. İlginç derecede basit bir teknik olmasına karşın halen EDR/Antivirüs çözümlerinin bypass edilebiliyor olması garipsenebilir. Çalışma prensibini biraz daha açacak olursak, Windows sistemlerde standalone olmayan (tek başına çalışamayan) programlar (günümüz programlarının neredeyse tamamına yakını standalone değildir) yürütme esnasında “eğer kendisine tam yol belirtilmediyse” ihtiyacı olan kütüphaneleri yani Windows sistemlerde DLL’leri belirli sıralarla aramaya başlar.

  • Önce programın bulunduğu dizin
  • Var olan dizin veya sistem dizini (SafeDllSearchModule aktifliğine göre değişir)
  • 16-bit sistem dizini
  • Windows dizini
  • Ortam değişkeni (PATH) dizinleri

Ne yazık ki dediğim gibi birçok program standalone değildir, geliştiriciler tarafından da çoğu zaman ihtiyaç olunan kütüphanelerin yolu tam olarak işaret edilmez. Bu durum saldırganların DLL Hijacking/Sideloading adı verilen tekniği gerçekleştirebilmesine imkan tanır. Aynı dizin içerisine bir “proxied DLL” yerleştirirsek, program yürütülme esnasında DLL’leri ararken bizim yerleştirdiğimiz kötü amaçlı proxy DLL’i çalıştıracak ve sistemde zararlı kod yürütülmeye başlanacaktır.

Proxy bir şekilde yerleştirmemizin nedeni, yürütme esnasında programın kötü amaçlı kodumuzdan sonra ihtiyacı olan kitaplıkları da kullanabilmesini sağlamak. Aksi halde doğrudan proxy olmayan zararlı bir DLL koyduğunuzda program hata verecektir.

Kaynak: Cihansol.com

Normalde bu teknik Privilege Escalation amaçlı da sıkça kullanılır. Yüksek yetkilere sahip bir process’in yazma yetkiniz olan bir dizine yerleştirdiğiniz DLL’i kullanmasını sağlayabilirseniz o sürecin yetkilerinde bir oturum elde edebilirsiniz.

E bu kadar laf yaptın da, bununla antivirüs nasıl atlanıyor diye sorabilirsiniz. Aslında cevap çok basit, antivirüs/antimalware’lerin birçoğu güvenilir olarak kabul edilen bazı yazılımların ne yaptığıyla sorun çıkmaması adına ilgilenmemek gibi bir çalışma şekli vardır. Örneğin çeşitli sistem bileşenlerine ait süreçler, çok bilindik üreticilerin geliştirdiği bazı yazılımlar ve dijital imzalılar genellikle beyaz listededir. Bunlar düşük riskli veya risksiz görülür.

Eğer siz bu şekilde risksiz görünen bir yazılımı alırsanız, DLL Sideloading yöntemini yaparsanız haliyle zararlınız da programa ait bir parça olduğundan zararlı olarak görülmeyecek ve antivirüsü atlatmış olacaksınız. Tek yapmanız gereken buna uygun masum bir programı bulmak, onunla aynı dizine proxy DLL yerleştirmek ve kurbana tıklatmak/tıklamak oluyor.

Özellikle APT grupları çeşitli Windows bileşenlerini örneğin calc.exe, notepad.exe gibi çeşitli süreçleri hedeflerin antivirüslerini atlatmak amacıyla kullanabiliyorlar. DLL’ler neden zararlı olarak tespit edilmiyor derseniz eğer scantime evresini atlatabilecek şekilde tasarladıysanız runtime’da büyük oranda zaten başarılı oluyorsunuz.

Proxy DLL oluşturmak için manuel yöntemlerden faydalanabilir veya Cybereason tarafından geliştirilen Siofra aracını kullanabilirsiniz.

https://github.com/Cybereason/siofra

Siofra aracını çalıştırdıktan sonra DLL hijacking’e uygun kurban programı bulmak için mimarisine uygun olarak aşağıdaki komutu kullanabilirsiniz.

Siofra64.exe --mode file-scan -f "PE dosya yolunuz buraya gelecek" --enum-dependency --dll-hijack

Aşağıdaki gibi bir sonuç görmelisiniz.

Eğer DLL hijacking yapmanız mümkün değilse veya buna karşı önlem alınmışsa çıktı şu şekilde olacaktır:

Proxy DLL oluşturmak için de birçok yolu mevcut, senaryonuza bağlı olarak aracın GitHub sayfasından yardım alabilirsiniz.

Anlatacağım son antivirüs atlama yöntemi ise normalizasyon. Günümüz güvenlik çözümleri genellikle sezgisel analiz, davranışsal analiz ve makine öğrenimi gibi yöntemler kullanarak tespitlerde bulunduğu için programınızın oldukça meşru bir şekilde hareket ediyormuş gibi gözükmesi önemli. Ne kadar şüpheden uzak durursanız, ne kadar risksiz kabul edilen üçüncü parti yazılımları kullanırsanız o kadar tespit edilme ihtimaliniz azalır.

Örneğin uzak masaüstü ihtiyacınız varsa geliştirdiğiniz malware’e bunu dahil etmeyin. AnyDesk, Teamviewer gibi meşru araçlardan yararlanın. Red Team sürecinin başarıyla yürütülebilmesi için çalışmanın başarısı kadar tespit edilememezliği de oldukça kritik.

Doğrudan TCP soket bağlantısı açmayın, SMB bağlanmayın, eğer bir C2 ihtiyacınız söz konusuysa bunu web üzerinden hatta mümkünse meşru servisler üzerinden gerçekleştirmeye çalışın. Bakış açınızı genişletmeniz bu tekniği anlayabilmeniz için elzem.

Pass the Hash Saldırıları ve PsExec/Wmiexec.py ile Domain Controller’a Sıçrama

Diyelim ki bir şekilde “initial access” yani hedefinize ilk erişim sağlamış bulunuyorsunuz. Ne yapmanız gerekiyor, elbette ihtiyacımız olan yerlere de nüfuz edebilmek için diğer kullanıcılara da ulaşabilmek. Normal şartlar altında Windows sistemlerde oturum açma ve kullanıcı oturumlarının yönetimi gibi faaliyetler iki process üzerinde gerçekleşir; LSASS ve Winlogon.

Winlogon genellikle oturum açma ekranındaki faaliyetleri ve bunun neticesi olarak gerçekleşen RPC isteklerini yönetirken, LSASS yani Local Security Authority Subsystem Service doğrudan kullanıcıların güvenlik özelliklerini ve politikalarını yönetir. Kullanıcı kimlik bilgilerini doğrulamak, bunları değiştirmek veya oluşturmak gibi etkinlikler burada gerçekleşir.

Normal şartlar altında LSASS, eğer Domain Controller ortamıyla yaşanabilecek herhangi bir bağlantı kopması durumunda sorun yaşanmaması adına kullanıcıların parolaları ve bunların hashleri gibi çeşitli bilgileri önbellekli bir şekilde saklar. Güncel işletim sistemlerinde cleartext olarak parola verilerini elde edemesek de, ilgili process’i dump edip inceleyerek gereken hash değerlerini rahatlıkla görebiliyoruz.

Pass the Hash saldırıları, lsass.exe bellek dökümündeki bu hash değerleri yardımıyla hedef user olarak oturum açmaya veya CMD ekranı başlatmaya imkan tanır. Mesela diyelim ki A istemcisinde B ve C isimli iki kullanıcı giriş yapmış olsun ve C kullanıcısı Domain üzerinde daha yetkili olsun. B kullanıcısını en az “yerel yönetici” seviyesinde ele geçiren saldırgan, birtakım araçlar kullanarak C’ye erişim sağlayacak ve C’nin yetkilerini kullanarak bütün alanı tehlikeye atacaktır.

Bu işlemi manuel birtakım tekniklerle yapabileceğimiz gibi, red team çalışmalarında işi kolaylaştırması bakımından Mimikatz ile yapmayı tercih ediyoruz. Uygulamalı olarak bir senaryo üzerinden Pass The Hash saldırılarının gerçekleştirilişini gösterelim.

Hatırlarsanız yazıda zafiyetli bir Active Directory ortamı kurmuş ve bir istemciyi bağlamıştık. Bu istemcideki yerel kullanıcıyı yönetici yetkileriyle ele geçirdiğimizi ve aynı Windows’ta Domain üzerinde Administrators grubuna eklediğimiz Alexi.Cherry kullanıcısıyla daha önceden birinin oturum açtığını kabul edelim. Yazıda LAB kurarken Administrators grubuna nasıl ekleneceğine değinmedim, kendiniz Alexi.Cherry veya başka herhangi bir user’ı ekleyebilirsiniz, maksat genel işleyişi kavramak.

Elimizde var olan kullanıcı Revolution. Burada elde ettiğimiz yerel yönetici yetkilerini kullanarak Mimikatz’ı başlatıyoruz ve sırasıyla şu komutları giriyoruz. İlk komut aracılığıyla bellekte erişim yetkisine sahip olmadığımız alanlara erişebilmek için bir Windows debug API’sini kullanacağımızı belirtiriz.

privilege::debug

İkinci komutumuz her zaman gerekli olmamakla beraber, sonraki komutların daha düzgün çalışması için localdeki haklarımızı NT AUTHORITY\System olarak yükseltir.

token::elevate

Komutları doğru girdiyseniz ve Mimikatz’ın çalışmasında herhangi bir problem olmazsa böyle bir sonuç elde etmemiz gerekiyor.

LSASS üzerinden gerekli credential’ları elde edebilmek için de aşağıdaki komutu girerek devam ediyoruz. Karşımıza uzunca bir çıktı gelecek, burada işimize yarayabilecek kullanıcıları kendiniz seçmelisiniz.

sekurlsa::logonpasswords

Çıktıda alexi.cherry’e ait NTLM hash bilgisini görüyoruz. Bu hash bilgisini kullanarak böyle bir oturum açabiliriz, ama nasıl? Mantığını ufakça özetleyelim. Normal şartlarda kimlik doğrulama süreci aşağıdaki şemada gördüğünüz gibi ilerler. Gönderilen parola bilgisinin hash değeri alınır ve doğrulamaya tabi tutulur. Buradan yola çıkarak başarılı veya başarısız olarak işlem gerçekleşir.

Pass The Hash saldırılarında ise biz kendimiz doğrulama evresinde kullanılacak hash değerini sağladığımız için, elimizde parola bilgisi yer almasa bile istediğimizi yapabilmekteyiz. Artık devam edebiliriz. Bu hash’i isterseniz kırmaya çalışabileceğiniz gibi (NTLM hashler NTLMv2’ye göre zayıftır) benim hedeflediğim kullanıcının parola politikası güçlü olduğundan böyle bir zahmete girmeyeceğim.

Bilgilerini elde ettiğimiz user üzerinden bir CMD elde etmek için aşağıdaki gibi bir komut girmemiz gerekli. NTLM kısmına mutlaka kullanıcının hash’i gelmeli.

sekurlsa::pth /user:alexi.cherry /domain:ninelights.local /ntlm:140a2a30cf417a38daad417c3a0f1a5d

Unutmamalıyız ki halen localdeyiz yani istemci bilgisayarımızdayız. Domain’e sıçrayabilmek için PsExec veya Impacket Wmiexec.py kullanmalıyız. PsExec, sistem yöneticilerinin bilgisayarları uzaktan yönetebilmeleri için SMB 445 portu üzerinden haberleşen ve Microsoft SysInternals tarafından geliştirilmiş bir araç. Aynı zamanda antimalware çözümleri tarafından da çoğunlukla zararlı algılanmaması nedeniyle red teamerların da en sevdiklerinden.

Masaüstüne daha önceden indirdiğimizi varsaydığımız PsExec’i açılan ekranda aşağıdaki komutla çalıştırıyoruz.

PsExec64.exe \\ninelights.local cmd

Sol tarafta normal kullanıcının hostname bilgisini görürken, sağdaki komut ekranında Domain Controller makineye başarıyla eriştiğimizi görüyoruz.

Emin olmak için systeminfo yardımıyla sistem bilgilerini sorguladığımızda localimizin değil, yine DC makinemizi görüyoruz. Bu noktadan sonrası saldırgan olarak hayal gücünüze kalmış, ister kalıcılık sağlayın ister diğer kullanıcıları yönetin fark etmez.

Elinizdeki hash bilgisini kullanarak aynısını Impacket WmiExec.py aracılığıyla da yapabilirsiniz. Girmeniz gereken komut şu şekilde:

./wmiexec.py -hashes 00000000000000000000000000000000:140a2a30cf417a38daad417c3a0f1a5d NineLightsDC/[email protected]

Aslında bu yaptığımız ile bir nevi “lateral movement” de yapmış olduk. Tehlikeye attığımız makine üzerinden Domain Controller’a eriştik, oradan da Domain Admin kullanıcısına sahip olduğumuz için bütün yapıyı ele geçirebildiğimizi gördük.

Pivoting mevzularına da aslında değinecektim lakin yazı şu haliyle bile aşırı uzun oldu, onu da inşallah ilerleyen zamanlarda detaylı br şekilde ele almak üzere geleceğe saklayalım. Başından sonuna kadar sabırla okuyup uyguladıysanız umuyorum ki Active Directory ve red teaming çalışmaları hakkında birçok temel şeyi öğrenmiş oldunuz.

Sürç-ü lisan ettiysek lütfen affola, gördüğünüz eksikleri veya merak ettiğiniz hususları gerek yorum gerek de mail yoluyla belirtirseniz çok müteşekkir olurum.

Allah’a emanet olun. – M. Akil Gündoğan (0xr3act0r)

4 yorum

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir