SigFlip - Authenticode İmzalı PE Dosyalarına (Exe, Dll, Sys ..Etc) Mevcut İmzayı Geçersiz Kılmadan veya Kırmadan Yama Yapan Bir Araç
SigFlip, kimlik doğrulama imzalı PE dosyalarına (exe, dll, sys ..vb) mevcut kimlik doğrulama imzasını etkilemeyecek veya bozmayacak şekilde yama yapmak için bir araçtır, başka bir deyişle, verileri gömerek PE dosyası sağlama toplamını/karmasını değiştirebilirsiniz ( yani kabuk kodu) dosya imzasını, bütünlük kontrollerini veya PE dosya işlevselliğini bozmadan.SigInject, kabuk kodunu bir PE dosyasının [WIN_CERTIFICATE] sertifika tablosuna şifreler ve enjekte eder; şifreleme anahtarı, temel bir BOF/C/C# yükleyici (SigLoader) ile kullanım için yazdırılır, SigInject, değişiklikleri değiştirilmiş bir PE dosyasına kaydeder ve imzasını ve sertifikasını korur geçerlilik bozulmamış.
SigLoader, SigInject tarafından oluşturulan değiştirilmiş bir PE dosya yolunu ve parametre olarak şifre çözme anahtarını alan, ardından tercih edilen bir kabuk kodu enjeksiyonuyla kullanım için gömülü kabuk kodunu çıkaran ve şifresini çözen temel bir yükleyicidir.
SigFlip, PE karma değerinin başarıyla değiştirilip değiştirilmediğini kontrol edecek ve ayrıca uç noktaların bu tür yaygın yanlış yapılandırmaya karşı sertleştirilmesi durumunda incelikle kontrol edip çıkacaktır. ("Ayrıntılar" bölümüne bakın).
Hızlı Not: SigFlip, SigInject ve SigLoader, BOF komut dosyaları ve .NET derlemeleri olarak mevcuttur, tek fark, BOF'ler yerine .NET yapılarını kullanmayı seçmeniz durumunda SigInject işlevinin SigFlip'in (-i) bir parçası olarak uygulanmasıdır.
Niye ya ?
Esas olarak kalıcılık, yanal hareket veya kod/komut yürütme için kullanılabilir ve şu konularda yardımcı olabilir:
Uygulamanın beyaz listeye alınması , imzayı bozmadan PE dosyası karmasını (örn. msbuild.exe) değiştirerek atlanır.
Kötü amaçlı kod/komut yürütme algılaması için belirli LOLBIN'lerin karmalarına dayanan EDR'leri atlama.
İmzalı sürücüleri farklı bir karma kullanarak yükleyin, önceden tanımlanmış bir karma listesi kullanarak ortak güvenlik açığı bulunan imzalı sürücüleri izleyen herhangi bir EDR'yi atlatmaya yardımcı olabilir.
Şifreli kabuk kodunu imzalı bir PE dosyasına gömün ve ayrıştırmak, şifresini çözmek, yüklemek ve yürütmek için tercih ettiğiniz bir aşamalayıcı (sigloader) kullanın.
Uç nokta güvenlik sağlayıcıları, çoğu zaman imzalı PE dosyalarını iyi huylu olarak sınıflandırma eğilimindedir, imzasız kodunuzu (kabuk kodu ..vb.) imzalı bir PE dosyasına gömmek, onu algılamayı/işaretlemeyi biraz zorlaştırır.
İmza doğrulaması için esas olarak varsayılan WinVerifyTrust'a güvenen uç nokta güvenlik sağlayıcılarını atlamak.
PE dosyalarının kimlik doğrulama imzasını doğrulamak için yalnızca signtool, sigcheck, Get-AuthenticodeSignature ..etc gibi tipik imza doğrulama yardımcı programlarına dayanan OPSEC ve zorlu savunucuları geliştirmek.
Kullanım ve Örnekler:
Derleme/Derleme:
Bu projede önceden derlenmiş BOF'lar sağlanmaz, Mingw-w64 kullanılarak derlenebilir, .NET için VS veya csc.exe kullanarak .NET projelerini (SigFlip, SigLoader) derleyin, BOF kontrol adımları için aşağıdaki;
- ➜i686-w64-mingw32-gcc -c sigflip.c -o sigflip.x86.
➜ x86_64-w64-mingw32-gcc -c sigflip.c -o sigflip.x64.o
➜ x86_64-w64-mingw32-gcc -c SigLoader/sigloader.c -o sigloader.x64.o
➜ i686-w64-mingw32-gcc -c SigLoader/sigloader.c -o sigloader.x86.o
Tüm nesne dosyalarının sigflip.cna ile aynı dizinde bulunduğundan emin olun, ardından sigflip.cna betiğini kobalt grevine yükleyin.
Kısa Not: önceden derlenmiş BOF'ler test edilmiştir ve mingw-64 v8.0.0_3 ile uyumludur, mingw-64 >= v9 kullanılarak çalışabilir ancak aktif işaretçileri çökebilir , https://github.com/med0x2e/SigFlip/issues/ adresini kontrol edin. Daha fazla ayrıntı için 2 .
Kobalt Grevi:
Yürütme-Montaj
execute-assembly SigFlip.exe -h
execute-assembly SigLoader -h
BOF
- >Kobalt vuruşuyla kullanım için, SigFlip.cna betiğini yüklediğinizde, iki yeni komut kaydedilecektir; SigFlip ve SigInject, ardından aşağıdaki gibi kullanın;
>SigFlip: İmzayı veya sertifikanın geçerliliğini bozmadan bir PE dosyasını (DLL, EXE, SYS, OCX ..etc) değiştirin:
SigFlip "<PE\_FILE\_PATH>" "<OUTPUT\_PE\_FILE\_PATH (with extension)>"
>SigInject: Kabuk kodunu bir PE dosyasının [WIN_CERTIFICATE] sertifika tablosuna şifreler ve enjekte eder, şifreleme anahtarı temel bir C/C# yükleyici ile kullanım için yazdırılır, ayrıca imza ve sertifika geçerliliğini olduğu gibi tutar:
SigInject "<PE\_FILE\_PATH> <OUTPUT\_PE\_FILE\_PATH (with extension)>" "<SHELLCODE\_FILE>"
>SigLoader: SigInject tarafından oluşturulan PE dosyalarından şifrelenmiş kabuk kodunu yükler, ardından bir kurban işlemine sc spawn/enjekte etmek için Early Bird tailuserapc kullanın, kabuk kodu enjeksiyon mantığı özelleştirilebilir veya tercih edilen herhangi bir başka kod enjeksiyon tekniği ile değiştirilebilir:
SigLoader <PE_FILE_PATH_WITH_SH> <DECRYPTION_KEY> <SPAWNTO_PROCESS_PATH> <PARENT_PROCESS_ID>
Örnekler
BOF:
- >Rastgele verileri msbuild.exe'ye enjekte edin (diğer adıyla bit çevirme msbuild.exe):
SigFlip "C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" "C:\lolbins\modified-msbuild.exe"
- >Kabuk kodunu kernel32.dll'ye enjekte edin (Argümanların sırası farklıdır ve şifre çözme anahtarını not ettiğinizden emin olun):
SigInject "C:\Windows\System32\kernel32.dll" "C:\random\modified-kernel32.dll" "C:\shellcode\cobaltstrike_or_msf_shellcode.bin"
Sigloader "C:\random\modified-kernel32.dll" "DECRYPTION_KEY" "C:\Windows\System32\werfault.exe" 6300
- >Rastgele verileri msbuild.exe'ye enjekte edin (diğer adıyla bit çevirme msbuild.exe):
Yürütme-Montaj:
- >Rastgele verileri msbuild.exe'ye enjekte edin:
execute-assembly SigFlip.exe -b C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe -o C:\Temp\MSBuild.exe
- >Kabuk kodunu kernel32.dll'ye enjekte edin (Argümanların sırası farklıdır ve şifre çözme anahtarını not ettiğinizden emin olun):
execute-assembly SigFlip.exe -i C:\Windows\System32\kernel32.dll -s C:\Temp\x86shellcode.bin -o C:\Temp\kernel32.dll -e TestSecretKey
execute-assembly SigLoader.exe -f C:\Temp\modified-kernel32.dll -e TestSecretKey -pid 2354
- >Rastgele verileri msbuild.exe'ye enjekte edin:
- Sertifika tablosu RVA ve Boyut:
İmzalı bir PE dosyası isteğe bağlı başlık yapısı , RVA ve Size olmak
üzere iki alana sahip IMAGE_DIRECTORY_ENTRY_SECURITY girişini içeren
bir dizi veri dizini içerir .
- RVA: öznitelik sertifikası tablosuna
göre bir dosya ofseti (bir bellek ofseti değil).
- Boyut: nitelik sertifikası tablosu
boyutu.
- Nitelik Sertifika Tablosu: imza
ve sertifikaları kapsayan ve aşağıdaki alanlara
sahip olan bir WIN_CERTIFICATE veri
yapısı :
- dwLength: sertifika tablo boyutu.
- wRevision: "revizyonu" WIN_CERTIFICATE.
- wCertificateType: kapsüllenmiş sertifika verilerinin
türü.
- bCertificate: gerçek sertifika
verileri. için WIN_CERT_TYPE_PKCS_SIGNED_DATA,
bu SignedDatayukarıda
bahsedilen PKCS#7 yapısıdır (PE hash değerini, imzayı ve x.509
sertifikasını içerir), bu tam olarak SigFlip'in rastgele rastgele veri
veya kabuk kodunu gömdüğü yerdir.
Tüm bunları göz önünde bulundurarak, şimdi
SifFlip aşağıdakileri yapıyor:
- Sistem yapılandırmasını kontrol edin
- PE Dosyası Yükleniyor ve PE dosyası
imzasının doğrulanması ve Sha1 karmasını hesaplayın
- "e_lfanew" ofsetini alın
(PE DOSYA BAŞLIĞI -> IMAGE_NT_HEADERS'ı işaret ederek)
- IMAGE_NT_HEADERS'tan
IMAGE_OPTIONAL_HEADER alın
- IMAGE_OPTIONAL_HEADER'den
IMAGE_DATA_DIRECTORY alın
- IMAGE_DIRECTORY_ENTRY_SECURITY
alanını alın ve Nitelik Sertifikası Tablosunun (WIN_CERTIFICATE) RVA ve
SIZE değerini alın.
- Sertifika Tablosunu isteğe bağlı
ekstra bayt (rastgele/kabuk kodu) ile doldurarak PE Dosya blobunu
yamalayın.
- İsteğe bağlı başlığı güncelleyin
-> IMAGE_DIRECTORY_ENTRY_SECURITY veri dizini Boyut
- WIN_CERTIFICATE (Sertifika Tablosu)
dwLength güncellemesi
- Yeni PE cheksum'u oluşturun ve
güncelleyin. (OPT Başlık Sağlama Toplamı)
- Son PE'yi yeni boyutla kaydedin.
- Değiştirilmiş PE dosya imzasını
doğrulayın
İlk adım, sistemin kimlik doğrulama imzalı
PE dosyalarına kabuk kodu eklemeye ve enjekte etmeye izin verecek şekilde
yanlış yapılandırılıp yapılandırılmadığını doğrulamak için gereklidir, bu
nedenle aşağıdaki akıl sağlığı kontrolleri gerçekleştirilir:
- MS13-098 düzeltmesinin kurulu olup
olmadığını kontrol edin (KB2893294), YÜKLENEBİLİR AMA KAYIT
ANAHTARLARININ DOĞRU AYARLANMADIĞINI, YAMANIN KULLANILAMAZ
OLDUĞUNU UNUTMAYIN
- Kayıt defteri anahtarlarını kontrol
edin
- X86:
- Olmadığını kontrol edin kayıt defteri anahtarı ": \ Software
\ Microsoft \ Kriptografi \ WinTrust \ Yapılandırma HKLM"
kullanılamaz
- -> varsa "EnableCertPaddingCheck" kayıt defteri
değerinin mevcut olup olmadığını kontrol edin
- X64:
- "HKLM:\Software\Wow6432Node\Microsoft\Cryptography\Wintrust\Config"
kayıt defteri anahtarının mevcut olup olmadığını kontrol edin
- -> varsa "EnableCertPaddingCheck" kayıt defteri
değerinin mevcut olup olmadığını kontrol edin.
Değiştirilen PE bir modül olarak kendi adres
alanına veya diğer süreçlerin adres alanına yüklendiğinde neden enjekte edilen
verileri okuyamıyor?
Windows yükleyici, sertifika verilerini
işlem adres alanına yüklemez, bu nedenle, kabuk kodu gibi verileri çıkarmak ve
kullanmak için özel bir yükleyiciye ihtiyaç duyarsınız (örn:
SigLoader). bu ayrıca IMAGE_DIRECTORY_ENTRY_SECURITY veri
dizini girişi RVA'nın neden tipik bir bellek kayması
yerine bir dosya kayması olduğunu da açıklamalıdır .
Algıla/Önle:
- https://docs.microsoft.com/en-us/security-updates/SecurityAdvisories/2014/2915720?redirectedfrom=MSDN
- Yama yüklendikten ve uygun kayıt
defteri anahtarları ayarlandıktan sonra, Sistemin yeniden başlatılması
gerekmez, yalnızca Şifreleme Hizmetlerini yeniden başlatmanız
gerekir. Applocker hizmeti de kriptografik hizmetlere bağlı olduğu
için yeniden başlatılacaktır.(@p0w3rsh3ll)
- Adrien'ın Yara kuralı; https://twitter.com/Int2e_/status/1330975808941330432
Referanslar
- https://docs.microsoft.com/en-us/security-updates/SecurityBulletins/2013/ms13-098?redirectedfrom=MSDN
- https://docs.microsoft.com/en-us/security-updates/SecurityAdvisories/2014/2915720?redirectedfrom=MSDN
- http://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/authenticode_pe.docx
- https://msrc-blog.microsoft.com/2013/12/10/ms13-098-update-to-enhance-the-security-of-authenticode/
- https://www.specterops.io/assets/resources/SpecterOps_Subverting_Trust_in_Windows.pdf
- https://p0w3rsh3ll.wordpress.com/2014/05/24/testing-ms13-098-certificate-padding-check/
- http://jsac.jpcert.or.jp/archive/2021/pdf/JSAC2021_202_niwa-yanagishita_en.pdf