2 Haziran 2015 Salı

Python ile Socket Programlama

Merhaba Arkadaşlar,

Bu yazıda, python script dili ile socket programlamanın nasıl yapıldığını anlatacağım. Neden python diye soracak olursanız, güvenlik dünyasında script dillerinin ne kadar işleri kolaylaştırdığı malum. Oldukça fazla modül ve kütüphane desteğiyle ilgimi cezbeden python, daha önceki yazılarımda kullandığım, tarama ve trafik dinleme araçlarının bu işlemleri nasıl gerçekleştirdiğini anlamamda bana çok yardımcı oldu. Bundan sonraki yazılarımda, basit anlamda host ve port tarama, sniffer gibi araçların yazılmasından bahsedeceğim için python ile socket programlamanın bu konulara girmeden önce iyi bir giriş olacağını düşünüyorum.

Socket programlama, istemci(client) ve sunucu(server) olarak hazırlanan programların birbirleriyle haberleşmesini sağlar. Bugün, TCP istemcisi, UDP istemcisi ve son olarak da TCP sunucusu olarak çalışan programlar(scriptler) hazırlayıp, birbiriyle haberleştireceğiz.

TCP istemcisi ile başlayalım. Aşağıdaki kodlar, basit bir TCP istemcisine ait.

import socket
target_host=input('Enter the target host')
target_port=input('Enter the target port')
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect((target_host,target_port))
message=input('Enter your message')
client.send(message)
response=client.recv(4096)
print response


Satır satır inceleyecek olursak, ilgili modülü import ederek başladıktan sonra hedefin yani sunucu IP adresi veya host adını ve haberleşeceğimiz portu kullanıcıdan istiyoruz. Socketi oluştururken kullandığımız socket.AF_INET parametresiyle script'in IP versiyon 4 ile çalışacağını, socket.SOCK_STREAM parametresiyle de script'in TCP kullanacağını belirlemiş oluyoruz. Ardından socket'i hedefe bağlıyoruz. Kullanıcıdan mesajı aldıktan sonra gönderiyoruz. Sunucudan aldığımız cevabı "response" değişkeninde tutup, yazdırıyoruz.

UDP istemcisini de şu şekilde yapabiliriz.

import socket
target_host=input('Enter the target host')
target_port=input('Enter the target port')
client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
client.sendto("Enter your message here",(target_host,target_port))
data,addr=client.recvfrom(4096)
print data

Koddan da anlaşılacağı gibi oldukça benzer yapılar. Farkları açıklayacak olursak, socket'i oluştururken socket.SOCK_DGRAM parametresini kullandık. Socket'i bağlanması gibi bir durum yok çünkü 3'lü el sıkışması (3 Way Handshake) TCP'ye özgü bir durum. Mesajımızı, bağlanacağımız sunucunun adresi ve port bilgileriyle birlikte gönderdik. Aynı şekilde cevap paketi de sunucunun bağlantı bilgileriyle beraber sunucunun mesajını beraber getirdi. Paketin hepsini değilde ilgili kısmı yazdırarak programı bitirdik.

Şimdi bir TCP sunucu scripti oluşturalım.

import socket
import threading
bind_ip="0.0.0.0"
bind_port="10002"
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind((bind_ip,bind_port))
server.listen(5)
print " Server is listening on %s:%d" % (bind_ip,bind_port)
def handle_client(client_socket):
     request=client_socket.recv(1024)
     print "Received Message : %s" % request
     client_socket.send(" Your message has been delivered")
     client_socket.close()
while True:
     client,addr = server.accept()
     client_handler=threading.Thread(target=handle_client,args=(client,))
     client_handler.start()

Biraz daha karmaşık görünse de oldukça basit bir sunucu scripti. İstemciden farklı olarak "threading" modülünü de import ediyoruz. Bu modül, çoklu görevi(multitask) mümkün kılan Thread yapısını kullanmamız için gerekli. TCP istemcidekine benzer şekilde sunucu socketini oluşturuyoruz. Sunucu socketini belirlediğimiz bağlantı bilgilerine(IP adresi ve port) bağlıyoruz ve sunucuyu dinleme moduna alıyoruz. 5 parametresi kabul edilecek maksimum bağlantı sayısını belirtmektedir. Sunucumuzun dinlemeye başladığını ekrana yazdırıyoruz. "handle_client" isimli methodumuz istemciden gelen bilgilerle ne yapacağımızı belirlediğimiz methoddur. Bu methodda, istemciden aldığımız mesajı ekrana yazdırıyoruz ve mesajı aldığımıza dair istemciye mesaj yolladıktan sonra socket'i kapatıyoruz. Sunucumuzun ana döngüsünde ise istemciden aldığımız bilgileri thread yardımıyla hangi methoda gideceğini belirledikten sonra thread'i başlatıyoruz.

Şimdi bu scriptleri çalıştıralım. Ben Kali'de çalıştıracağım, python yüklü herhangi bir işletim sisteminde çalıştırabilirsiniz. Metin editörüyle iki farklı dosya açıp, kodları bu dosyalara yazıyoruz. Scriptlerin çalışabilir duruma gelmesi için şu komutları giriyoruz.

#chmod +x tcpclient.py
#chmod +x tcpserver.py

Ardından sırayla scriptleri çalıştırıyoruz.


Ekran Görüntüsü 1: Kali'de Sunucu Scriptinin Çalıştırılması

Ekran Görüntüsü 2:Kali'de İstemci Scriptinin Çalıştırılması

İstemci scriptini çalıştırdığımızda, program bizden gerekli bilgileri istiyor. Bağlantı bilgilerini ve mesajımızı yazıp, gönderdiğimiz de sunucudan mesajımızın alındığına dair mesaj ekranda belirdi.
Sunucu tarafına döndüğümüzde ise istemci mesajının ekrana yazdırıldığını görüyoruz.

Ekran Görüntüsü 3: Sunucuya ulaşan mesajın görülmesi

Bugün, TCP ile UDP protokollerini kullanarak haberleşen programların bu işlemleri nasıl gerçekleştirdiği konusunda fikir vermesi açısından socket programlama konusunu inceledik. Pyhton ile ilgili bundan sonra paylaşacağım yazılar için de bir giriş yapmış olduk. Bir sonraki yazıda görüşmek üzere. 

Yararlandığım Kaynak:
Justin SERTZ,"BLACK HAT PYTHON"



Hiç yorum yok:

Yorum Gönder