21Ağustos

iSMET (A)Symmetric Meterpreter Encryption Tool

Sızma testleri için birçok araca ihtiyaç duymakta ve kendi özelleşmiş araçlarımızı geliştirmekteyiz. Bu araçların en başında istisnasız “Zararlı Yazılım Geliştirme” ya da diğer bir yaklaşımla “Anti-Malware ürünlerini atlatma” için kullanacağımız araçlar gelmektedir. Siber güvenlik en hızlı gelişen sektörlerden biridir. Her geçen gün daha derinleşen ve alt uzmanlık alanlarına ayrılan siber güvenlik sektörü, çeşitli atak vektörleri için bir takım koruma önlemleri de geliştirmektedir. Nitekim bu gelişmelerden en önemlisi Microsoft Defender’ın artık Windows 10 ve Server 2016 işletim sistemleri ile bundan sonra yayınlanacak versiyonlarda gömülü olarak gelmesidir. Bu çok önemli bir gelişmedir çünkü anti-malware sektörüne Microsoft dahil olarak Microsoft Defender’ı işletim sistemlerinde gömülü hale getirmiştir. Microsoft Defender’ın Gartner Magic Quadran’daki başarısı ile ilgili olarak yazdığımız yazıya bu linkten ulaşabilirsiniz. https://www.priviasecurity.com/microsoft-defenderin-gartner-magic-quadrandaki-basarisi/

Microsoft Defender, Metasploit içerisinde yer alan payloadların tamamını tanımaktadır. Aynı zamanda Metasploit içerisinde yer alan ve payloadların şifrelenmesi için kullanılan encryption modülleri de yine Defender tarafından tanınmaktadır. Basit bir örnekle durumu şöyle özetleyebiliriz, birkaç sisteme çeşitli yöntemler kullanarak sızma işlemi gerçekleştirdik. Post-Exploitation için de Mimikatz’den yararlandık. Elde edilen hesap bilgilerini kullanarak da diğer sistemlere sıçramak için Psexec’den yararlanmak istiyoruz. Maalesef bu noktada kullanacağımız tüm payloadlar Microsoft Defender tarafından tespit edileceği için başarıya ulaşamayacağız. Bu ve bunun gibi birçok sebepten dolayı, sızma testleri ve Red Teaming testlerinde kullanabileceğimiz araçlar geliştirmeye karar vermiştik. iSMET aracını da uzun bir süre önce geliştirerek testlerde kullanmaya devam ediyoruz. Hala oldukça başarılı olan bu Red Teaming aracımızı yakın bir zamanda açık kaynak kod olarak yayınlama kararı aldık.

GitHub: https://github.com/Privia-Security/iSMETv2.0 iSMET hem “asymmetric” hem de “symmetric” şifreleme teknikleri kullanabilen bir araçtır. iSMET aşağıdaki tabloda yer alan uygulama, payload ve encryption türlerinde meterpreter ajanı üretebilmektedir.

Yukarıdaki tabloda görüleceği üzere iSMET, 12 ayrı türde meterpreter payloadu için 8 ayrı şifreleme tekniği ve 2 farklı uygulama türünden ajan üretebilmektedir. iSMET en çok kullanılan meterpreter ajanları için şifreleme desteği sunmaktadır. Şifreleme modüllerinin detaylarına geçmeden önce iSMET’in kullandığı modülleri aşağıdaki tabloda görebiliriz.

Modül İsmiModül Detayı
iSMETiSMET arabirimi (UI)
iSMET.CSharp.CollectionString, Byte, Array gibi sık kullanılan fonksiyon kütüphanesi
iSMET.EncryptionŞifreleme algoritmalarına ait kütüphane
iSMET.PackerBellek Yönetim ve ileri seviye saklama fonksiyon kütüphanesi
iSMET.ShellCodeMeterpreter ajanlarının yer aldığı shellcode kütüphanesi

iSMET çalışmak için 4 ana modüle ihtiyaç duymaktadır. Bu modüllerden “iSMET” kullanıcıdan gelen verilerin diğer modüllere aktarılmasını sağlayan UI (kullanıcı arabirimi)’dır.

“iSMET.Csharp.Collection” kütüphanesi “Encryption” kütüphanesinde yer alan ve symmetric şifreleme için kullanılacak parolanın çalışma anında random olarak üretilmesi, byte dizilerinin string türüne çevrilmesi yada random dosya adı oluşturmak gibi birçok işlemi gerçekleştirmek için kullanılmaktadır.

“iSMET.Encryption” kütüphanesi DES, TripleDES, RC2, Rinjdael, RSA, AES-CBC ve Blowfish gibi şifreleme algoritmalarının kullanılmasını sağlamaktadır.

“iSMET.ShellCode” kütüphanesi ise yukarıdaki tabloda yer alan meterpreter ve shell (cmd) payloadlarına ait shellcodeların yer aldığı dinamik bir kütüphanedir. Bu kütüphane sayesinde oluşturmak istediğimiz zararlının IP ve port bilgileri dinamik olarak değiştirilerek uygulama arabirimi üzerinden Compiler kütüphanesine iletilerek meterpreter ya da shell ajanı oluşturulur.

iSMET yukarıda görüleceği üzere basit bir arabirimden oluşmaktadır. Arabirim “Modern UI” temelli Windows Presentation Foundation projesidir. IP adresi kısmı ters bağlantı yapılacak IP adresini, port ise ters bağlantı yapılacak port numarasını temsil etmektedir. Type olarak belirtilen kısım, oluşturulacak zararlı yazılımın hangi uygulama türünde oluşturulması gerektiğini belirtir. Console Application seçilirse klasik bir konsol uygulaması içerisinde çalışan paylod oluşturacaktır. Eğer Windows Form Application seçilirse Windows için Form Application türünde çalışan bir payload oluşturacaktır. Her iki tekniğin kendine göre avantaj ve dezavantajları mevcuttur. Örneğin Console Application türünde bir payload oluşturulur ve uygulama hedefte çalıştırılırsa klasik bir cmd.exe çalışmış gibi, payload siyah bir konsol ekranında çalışacaktır. Form Application seçildiğinde paylaod kendini arka planda gizleyen bir uygulama üzerinden çalışacaktır. Her iki uygulama türünün de anti-malware ürünlerine yakalanma olasılıkları birbirinden farklı olacaktır.

iSMET.ShellCode kütüphanesi içerisinde yer alan MeterpreterShellCode sınıfı uygulamanın meterpreter ve shell ajanı oluşturmak için ihtiyaç duyduğu ana fonksiyonların bulunduğu kütüphanedir. Bu kütüphane içerisinde ReverseTcp, ReverseTcpRc4, BindTcp gibi birçok meterpreter ve shell ajanlarını hem x86 hem de x64 formatında saklanır. Sınıf içerisinde yer alan her değişken string türünden bir IP ve yine string türünden port bilgisi ile tetiklenmektedir.

Her meterpreter ve shell ajanına iletilen IP ve port bilgisi shellcode içerisinde dinamik olarak değiştirilir ve shellcode byte array türünden yeniden oluşturularak, derleyiciye iletilir. Yukarıdaki örnekte görüleceği üzere meterpreter/reverse_tcp payloaduna ait 283 byte’lık shellcode yer almaktadır. Bu 283 byte’lık array içerisinde dinamik olarak IP ve port bilgilerinin değiştirilmesi için bir hesaplama yapılmaktadır. Meterpreter ajanı için oluşturulan 283 byte’lık array’in 176,177,178 ve 179’uncu satırları ters bağlantı sağlanacak olan IP adresini temsil etmektedir. Dinamik olarak gönderilen IP adresinin oktetlerine ayrılarak 4 ayrı parçaya bölünmesi sağlanmaktadır. Daha sonra her oktetin kendine karşılık gelen byte array içerisine eklenmesi için Convert.ToByte metodu çağrılarak, oktetlerin byte’a çevrilmesi ve array içerisinde değiştirilmesi sağlanmaktadır. Ayrıca aynı işlemin bir benzeri de port hesaplaması için kullanılmaktadır. Meterpreter shellcode’unun 183 ve 184’üncü byte’ları portu temsil etmektedir. Port bilgisi de byte array içerisinde dinamik olarak değiştirildikten sonra shellcode’un güncel hali byte array türünden arabirime iletilir.

Not: x86ShellString isimli sınıfta yer alan ReverseTcp isimli string uygulama içerisinde geliştirme yapmak isteyenler için eklenmiştir. Sınıf herhangi bir şekilde uygulamada kullanılmamaktadır. Geliştiricilerin her seferinde metasploit ve kali karmaşası, koplayama vb. problemler ile uğraşmaması için uygulama içerisine eklenmiştir. Non-Encryption, Base64, Rinjdael/AES, DES, 3DES ve RSA algoritmaları kullanılarak oluşturulan shellcodelar, iSMET tarafından dinamik olarak oluşturulan ve hedefe gönderilecek çalıştırılabilir uygulama (exe) içerisine gömülmektedir. RC2, AES-CBC ve Blowfish algoritmaları kullanılarak oluşturulacak olan shellcode ise “Stub.bin” isimli dosyaya yazılmaktadır. iSMET tarafından kullanılan, Shellcode’un uygulama içerisinden ayrılarak şifrelenmiş bir şekilde farklı bir dosyaya yazılması anti-malware ürünlerini atlamakta oldukça etkili bir yöntemdir.

iSMET.Csharp.Collection kütüphanesi içerisinde yer alan BuildCode sınıfı kendi içerisinde 3 ayrı sınıftan meydana gelmektedir. Console, Form ve Powershell isimli bu sınıflar, dinamik olarak meterpreter zararlısını çalıştıracak olan C# tabanlı exe’lerin oluşturulmasını sağlayan kodları içermektedir. Powershell sınıfında yer alan teknikler hali hazırda Red Teaming testlerimizde kullandığımız için public olarak yayınlanmamıştır.

Yukarıdaki örnekte BlowFish algoritmasını kullanarak çalışacak olan meterpreter/shell zararlısına ait C# kodları yer almaktadır. iSMET dinamik olarak değiştirilen ve şifrelenen shellcode’a ait parola, private key ve IV gibi verilerin C# kodu içerisine yerleştirilmesini sağlayarak, uygulamanın çalıştığı sistemde shellcode’un deşifre edilmesini sağlar. BuildCode sınıfındaki her metodda yer alan timeOut değeri ise uygulama oluşturulurken seçilen time out (zaman aşımı) değerini belirler. iSMET arabiriminde zararlı oluşturulurken belirlenen time out değeri bulunur. Bu değer varsayılanda 5000 milisaniyedir. Uygulama hedef sistemde çalıştırılırken, çalışma anında zararlı kodun çalışacağı Thread’i 5 saniye boyunca suspend durumuna alır. Bu değeri zararlı yazılım oluştururken değiştirebiliriz. Bazı anti-malware ürünleri bir uygulamanın çalışır çalışmaz bir porta bağlantı yapmasını yada bir portu dinleme moduna almasını zararlı bir aktivite olarak değerlendirir. Anti-malware ürünlerinin sezgisel motorları bu durumu kontrol eder. Ayrıca iSMET.Packer ve içerisinde bulunan MemoryFunction modüllerini bir başka versiyonda public etmeyi planlıyoruz.

iSMET’de yer alan Compiler isimli sınıf ise şifrelenmiş C# meterpreter kodlarının compile (derleme) edilmesini sağlamak üzere oluşturulmuştur. İçerisinde yer alan “NetFrameWorkDirectory” ve “X64NetFrameWorkDirectory” isimli metodlar, .NET Framework’de yer alan “csc.exe” isimli C# derleyicisinin dizinini tespit etmektedir. iSMET çalıştığı sistemde zararlı yazılım oluşturabilmek için csc.exe isimli C# derleyicisine ihtiyaç duymaktadır. Aynı işlem MSBuild ile de gerçekleştirilebilmektedir. Ancak biz csc.exe isimli C# derleyicisini kullanmaktayız. Aynı zamanda csc.exe birçok .NET Framework versiyonunda bulunabileceği gibi yukarıdaki metodlar en son .NET Framework’ün dizinini tespit ederek dizinde bulunan compilerı (derleyiciyi) kullanmaktadır.

Compiler dizini ilgili metodlar tarafından tespit edildikten sonra arabirim üzerinden seçilen uygulama tipine göre derleyici parametrelerini ayırmak için “Console” veya “Form” isimli metodlar kullanılır. Bu metodların her ikisi de derlenecek uygulamanın hangi mimaride (x86 ya da x64) derleneceğini belirledikten sonra C# compilera derlenecek kodu göndererek (BuildRunMeterpreter isimli method) çalıştırılabilir dosya (exe) haline getirmektedir.

Derleme işlemi tamamlandıktan sonra çalışma dizininde oluşturulan “*.cs” dosya tiplerini “DeleteCsFileInDirectory” metodunu kullanarak temizler ve uygulama hazır hale getirilir.

GlobalVariable isimli sınıf içerisinde de uygulamanın çalışmak için ihtiyaç duyduğu mimari, şifreleme türü ve uygulama türü gibi sabitler yer almaktadır.

iSMET arabirimi üzerinden 192.168.208.128 IP adresinin 4444 portuna bağlantı gönderecek meterpreter/reverse_tcp isimli payload, Console Application türünde ve Blowfish şifreleme algoritması kullanılarak “oy2a8.exe” ismi ile oluşturulmuştur. Oluşturulan uygulama çalıştırılacak olan shellcode’u “Stub.bin” isimli dosya içerisine Blowfish şifreleme algoritması ile şifreleyerek oluşturmuştur. Şimdi her iki dosyanın da virustotal sonuçlarını ayrı ayrı inceleyelim.

“oy2a8.exe” isimli oluşturduğumuz zararlı 6 ürün tarafından tespit edilmiştir. Bunun sebebi de uygulama içerisinde kullanılan ve shellcode’un belleğe yüklenmesini sağlayan Windows API’lerinden kaynaklanmaktadır.

VirtualAlloc, CreateThread ve WaitForSingleObject isimli çağrılar yukarıdaki gibidir. iSMET bu çağrıları kullanarak shellcode’un belleğe yüklenmesini ve çalıştırılmasını sağlar. Virustotal sonuçları aşağıdaki gibidir.

https://www.virustotal.com/gui/file/fa2f356f8eb0f30a4e13f0bec327383b55b4292541cd4b28b45b699381bc56bb/detection

Esas zararlı olan shellcode’un şifrelenmiş halinin yer aldığı “Stub.bin” dosyasının virustotal sonuçları yukarıdaki gibidir. Görüleceği üzere shellcode hiçbir ürün tarafından tanınmamaktadır. Stub dosyasına ait virustotal sonuçları aşağıdaki gibidir.

https://www.virustotal.com/gui/file/5187d1e0ea49b8edfe67aaccfa9df29d9cac92d63e057f78eec7bf559ea0619c/detection