exploit paylaşım grubumuz: t.me/HTTPwnn

Malware'da Kalıcılık

  • Konu başlatıcı Konu başlatıcı sh3d0w
  • Başlangıç Tarihi Başlangıç Tarihi

sh3d0w

WarNight Member
Katılım
25 Haz 2026
Mesaj
65
Reaksiyon
39
Puan
18
xentr_thread_starter

0. Cargo.toml (Bağımlılıklar)​

Burada öncelikle cargo.toml dosyamızın sonuna
[profile.release]
opt-level = 'z'
lto = true
codegen-units = 1
panic = 'abort'
strip = true
bunu ekliyoruz tersine mühendislik, optimizasyon ve Hız konusunu burada halletik sayılır. (Tek başına yetmezler bu arada)

Bu, Windows'un en bilinen başlangıç klasörü kayıt defteri anahtarıdır. Kullanıcı oturum açtığında buradaki her şey çalışır.
rust
pub fn persistencep1(hedef_exe_yolu: &std::path::Path)
  • RegOpenKeyExA ile anahtarı açar (A = ASCII, yani Türkçe karakterlerde takılabilir, buna dikkat et).
  • RegSetValueExA ile buraya marina isminde bir değer yazar. Değeri, çalıştırmak istediği .exe dosyasının yoludur.
  • Sonra RegCloseKey ile kapatır, temiz işçi.
Sonuç: Bilgisayara her giriş yapıldığında bu EXE otomatik fırlar. Ama bu yöntem EDR'ler için çok bariz, hemen hepsinin izleme listesinde ilk sıradadır. Bu daha çok "ilk deneme" seviyesidir.



p1.rs ile aynı işi yapar ama çok daha profesyonel bir şekilde.

  • Burada RegOpenKeyExW ve RegSetValueExW kullanılmış (W = Wide / Unicode).
  • encode_utf16() ile stringleri Windows'un anlayacağı u16 dizilerine çeviriyor.
  • cb_data hesaplanırken mem::size_of::<u16>() kullanarak bayt sayısını doğru veriyor.
Farkı: Eğer EXE yolunda Türkçe (ğ, ü, ş) veya Çince karakter varsa, ASCII (A) versiyonu patlar. Bu (W) versiyonu ise sapasağlam çalışır. Tavsiye: Bu dosyayı kullan, p1.rs'yi çöpe at veya örnek kalması için sakla.



Bu anahtar, Windows 10/11'deki Görev Yöneticisi (Task Manager) > Başlangıç (Startup) sekmesinde gördüğünüz "Etkin" veya "Devre Dışı" durumlarını tutar.

rust
let data: [u8; 12] = [0x02, 0x00, ...];
İşte burada büyük bir tuzak var. Bu veri 0x02 ile başlıyor. Windows'ta:

  • 0x00 veya 0x01: Programın başlangıçta çalışması ETKİN (Enabled) demektir.
  • 0x02: Programın başlangıçta çalışması DEVRE DIŞI (Disabled) demektir. Yani bu kod, "marin" adlı programın otomatik başlatılmasını ENGELİYOR!
Bu dosyadaki mantık hatası:
Kalıcılık sağlamak için ya 0x00 yazmalıydın, ya da bu anahtarı hiç kurcalamamalıydın (çünkü Run anahtarı zaten varken, StartupApproved'da disable etmek, Run'daki kaydı işlevsiz hale getirir).
Eğer amaç "Task Manager'da gözükmesini engellemek" ise, bu farklı bir taktiktir ama burada yanlış uygulanmış. Belki ileride düzeltirsin, notunu al.
Bu, Run anahtarından çok daha kurnazcadır. Çünkü AV'ler registry'ye bakar ama scheduler'a bakmayabilir.
rust
let output = std::process::Command::new("cmd")
.args(&[
"/C", "schtasks", "/create", "/tn", "SubbyBackgroundUpdate",
"/tr", target_dir, "/sc", "onstart", "/ru", "SYSTEM", "/rl", "highest", "/f"
])
  • /sc onstart: Bilgisayar açılır açılmaz (kullanıcı oturumu açmadan) çalışır.
  • /ru SYSTEM: En yetkili Sistem (SYSTEM) hesabıyla çalışır. Yani admin'den bile üstündür.
  • /rl highest: En yüksek öncelikte çalıştır.
  • /f: Zaten varsa üzerine yaz (force).
Eksik Yanı: Kodda hedef_konum diye bir değişken kullanılmış ama tanımlanmamış. Sen bunu C:\Users\Public\... veya C:\Windows\Temp\marina.exe gibi bir yere çekmelisin. Aksi halde derlenmez.



Servisler, EDR'lerin genellikle "dokunma" dediği alanlardır çünkü çoğu Windows bileşeni servis olarak çalışır. Bu kod iki aşamalı:

  • Kendi EXE'sini C:\Windows\System32\smukx_service.exe olarak kopyalar (sistem klasörü, güvenilir alan).
  • sc create komutuyla SubbyAutomationService adında bir servis oluşturur.
  • binPath= kısmına kendi yolunu verir ve yanına --service argümanını ekler (kendini servis modunda çalıştırmak için).
  • sc start ile servisi hemen başlatır.
  • Sonra std::process::exit(0) diyerek kendi geçici process'ini öldürür. Geriye sadece SYSTEM yetkisinde çalışan servis kalır.
  • service_dispatcher::start ile Windows servis yöneticisine kaydolur.
  • service_control_handler::register ile "Durdur" komutlarını yakalar (ama burada sadece Stop'a "tamam" deyip geçiyor, aslında durmuyor bile).
  • Sonsuz bir loop içinde her 60 saniyede bir thread::sleep ile bekler.
  • Bu döngünün içine ileride C2 bağlantısı, shellcode çalıştırma veya veri sızdırma fonksiyonlarını eklersin. Şu an sadece boşta duruyor.

Eğer bu 5 dosyayı bir araya getirip ana main() içinde sırasıyla çalıştırırsan, şöyle bir savunma katmanı (aslında saldırı katmanı) oluşturmuş olursun:

  1. Servis oluştur (en sağlamı, sistem açılışında en önce gelir).
  2. Task Scheduler oluştur (yedekleme, eğer servis çökerse diye).
  3. Run anahtarına ekle (kullanıcı oturumu açtığında çalışsın, üçüncü yedek).
  4. StartupApproved'ı manipüle et (Ama burada disable yaptığın için şu anlık bunu es geç veya 0x00 yaparak düzelt).
Sonuç: Eğer sistem yöneticisi görev yöneticisinden process'i öldürürse, servis otomatik başlar. Servisi durdurursa, zamanlayıcı çalıştırır. Zamanlayıcıyı silerse, Run anahtarı çalıştırır. Hepsi giderse, zaten sistem çökmüştür :)


  • p2.rs'deki 0x02'yi mutlaka 0x00 ile değiştir, yoksa kendi ayağına sıkarsın.
  • schedule.rs'deki hedef_konum değişkenini doldurmayı unutma. Örneğin let target_dir = "C:\\Users\\Public\\marina.exe"; gibi.
  • service.rs'de servis durdurma kontrolünü düzgün yazmazsan, servisi durduramazsın (ama zaten amaç durdurulmamak, o yüzden sorun yok).
 

Ekli Dosyalar

Geri
En Üst