25 Haziran 2015 Perşembe

Python ile Host ve Port Tarama Scripti

Merhaba Arkadaşlar,

Bu yazıda python script dili ile kendi host ve port tarama scriptimizi nasıl hazırlayacağımızı anlatacağım. Bir önceki yazımda scapy programı ile tarama işlemlerinin nasıl gerçekleştirildiğinden bahsetmiştim. Aşağıdaki bağlantıdan bu yazıma ulaşabilirsiniz.

http://msesli.blogspot.com.tr/2015/06/scapy-ile-host-ve-port-tarama.html


Bu scripti hazırlarken scapy programının python dili için hazırlanmış kütüphanesinden faydalandım.

1 #!/usr/bin/python
2
3 from scapy.all import *
4
5 def hostresult(answer):
6  if answer ==None:
7    print"%s might be down" % target
8  else:
9    print"%s is up" % target
10
11def portresult(answer):
12  if answer ==None:
13    print"%d port is open" % port
14  else:
15    print"%d port is closed" % port
16
17def tcpsynresult(answer):
18  if int(answer[TCP].flags)==18:
19    print"%d port is open" % port
20  else:
21    print"%d port is closed" % port
22
23
24if (len(sys.argv)< 2) & (len(sys.argv) > 5) :
25
26   print"Usage - ./scanner.py [scan type][target ip address] ?[first port]?[last port]"
27
28   print"Example for Host Scan with ARP - ./scanner.py -a 192.168.2.1"
29   print"Example for Host Scan with ICMP - ./scanner.py -p 192.168.2.1"
30   print"Example for UDP port Scan - ./scanner.py -u 192.168.2.1 53"
31   print"Example for UDP port Scan - ./scanner.py -u 192.168.2.1 1 100"
32   print"Example for TCP SYN Scan - ./scanner.py -s 192.168.2.1 80"
33   print"Example for TCP SYN Scan - ./scanner.py -s 192.168.2.1 1 100"
34   print"Example for TCP FIN Scan - ./scanner.py -f 192.168.2.1 80"
35   print"Example for TCP FIN Scan - ./scanner.py -f 192.168.2.1 1 100"  
36   sys.exit()
37
38target=sys.argv[2]
39if len(sys.argv)>3:
40    port=int(sys.argv[3])
41
42if len(sys.argv) ==5:
43  start=int(sys.argv[3])
44  end=int(sys.argv[4])
45
46if sys.argv[1] =="-a":
47  answer=sr1(ARP(pdst=target),timeout=1,verbose=0)
48  hostresult(answer)
49
50if sys.argv[1] =="-p":
51  answer=sr1(IP(dst=target)/ICMP(),timeout=1,verbose=0)
52  hostresult(answer)
53
54if (sys.argv[1] =="-u")&(len(sys.argv)==5):
55   for port in range (start,end):
56     answer=sr1(IP(dst=target)/UDP(dport=port),timeout=5,verbose=0)
57     time.sleep(1)
58     portresult(answer)
59elif (sys.argv[1] =="-u")&(len(sys.argv)!=5):
60  answer=sr1(IP(dst=target)/UDP(dport=port),timeout=5,verbose=0)
61  time.sleep(1)
62  portresult(answer)
63
64
65if (sys.argv[1] =="-s")&(len(sys.argv)==5):
66   for port in range (start,end):
67     answer=sr1(IP(dst=target)/TCP(dport=port),timeout=1,verbose=0)
68     tcpsynresult(answer)
69elif(sys.argv[1] =="-s")&(len(sys.argv)!=5):
70  answer=sr1(IP(dst=target)/TCP(dport=port),timeout=1,verbose=0)
71  tcpsynresult(answer) 
72
73
74if (sys.argv[1] =="-f")&(len(sys.argv)==5):
75   for port in range (start,end):
76     answer=sr1(IP(dst=target)/TCP(dport=port,flags="F"),timeout=5,verbose=0)
77     portresult(answer)
78elif (sys.argv[1] =="-f")&(len(sys.argv)!=5):
79  answer=sr1(IP(dst=target)/TCP(dport=port,flags="F"),timeout=5,verbose=0)
80  portresult(answer)

Yukarıdaki scriptimizi satır satır incelemektense gerçekleştirdiğimiz işlemleri anlatacağım. Genel olarak scriptten bahsedecek olursak, kullanıcıdan tarama tipini, hedef IP adresini, eğer port tarama yapılacaksa port numarası ya da port numaraları alıyoruz. Eğer bu parametreler eksik veya fazla girilirse, konsola örnek kullanımlarla ilgili ipuçlarını yazdırıyoruz.

İlk olarak scriptin Host tarama işlemini ARP protokolünü kullanarak nasıl gerçekleştirdiğine bakalım. Kullanıcı -a parametresini girdiğinde, script 46. satırdaki if sorgusuna giriyor. 47. satırda "sr1" isimli methodla bir ARP istek paketi oluşturuyoruz. "pdst" parametresine "target" değişkeninde tuttuğumuz hedef IP adresini atıyoruz. "timeout" parametresine 1 değerini girerek "sr1" methodunun cevap için ne kadar beklemesi gerektiğini belirliyoruz. "verbose" parametresini 0 yapıyoruz çünkü scapy'nin çıktılarını değil kendi çıktılarımızı ekrana yazdıracağız. Bu işlemi, "answer" değişkeninde tuttuğumuz "sr1" methodunun çıktısını "hostresult" methodumuza göndererek yapıyoruz. 5. satırda yer alan "hostresult" methodumuzu incelediğimizde, eğer answer değişkeninde bir cevap paketi yer almıyor ise taradığımız host'un kapalı olabileceğini ekrana yazdırıyoruz. Net bir ifade kullanmamın sebebi, paketin gelmemesinin birden fazla sebebinin olabileceğinden dolayı yani host aktif olabilir ama bize cevap paketinin ulaşmamış olma olasılığı da var. Eğer "answer" bir cevap paketi içeriyorsa taradığımız host aktif mesajını ekrana yazdırıyoruz.

ICMP'yi kullanarak host tarama işlemini de benzer şekilde yapıyoruz. Kullanıcı tarama tipini "-p" olarak girdiyse script 50. satırdaki if sorgusuna giriyor. Bu sefer "sr1" methodunda bir IP paketini oluşturuyoruz ve bu paketin içine ICMP paketini ekliyoruz. Hedef IP adresini "target" değişkeninden alıyoruz. "sr1" methodunun "timeout" ve "verbose" parametrelerini girdikten sonra "answer" değişkenini "hostresult" methoduna gönderiyoruz. Bu methodun cevap paketini nasıl yorumladığını yukarıda bahsetmiştim.

UDP port taraması ise şu şekilde gerçekleşiyor. Kullanıcı tarama tipini "-u" olarak belirlediyse ve "last port" parametresi de girildiyse belirli bir aralıktaki UDP portları tarayacağımızdan script, 54. satırdaki if sorgusuna düşüyor. Bu sorgunun içinde yer alan for döngüsü ile girilen değerler arasındaki bütün portlar için tarama işlemini gerçekleştirmiş oluyoruz. Burada "sr1" methoduna bir IP paketi ve bu paketin içine de bir UDP paketi oluşturuyoruz. "target" değişkenindeki hedef IP adresini "dst" parametresine atıyoruz. UDP paketinin "dport" parametresine "port" değişkenini atarak taramak istediğimiz portu belirlemiş oluyoruz. UDP port taramasının sağlıklı sonuç vermesi için "timeout" parametresini 5 olarak belirledik ve scripti sleep mod'a aldık. "answer" değişkenini analiz etmesi için 11.satırda yer alan "portresult" methoduna yolladık. Bu method cevap almadığında portu açık olarak belirleyip ekrana ilgili mesajı yazdırıyor. Eğer cevap alıyor ise bu portun kapalı olduğu anlamına geliyor. Kullanıcı eğer "last port" parametresini girmediyse script sadece "first port" parametresine girilen değer için tarama işlemini gerçekleştiriyor.

Scriptimiz TCP port taraması için iki farklı modu destekliyor. Bunlar SYN tarama ve FIN tarama. SYN taramasını 65. satırdaki if sorgusu, FIN taramasını ise 74. satırdaki if sorgusu gerçekleştiriyor. Sonuçları yazdırma işlemini farklı methodlarla(tcpsynresult, portresult) yapıyoruz çünkü SYN tarama açık port için bir cevap paketi bekler, FIN tarama ise kapalı port için bir cevap paketi bekler.

Şimdi scripti deneme vakti. Kali'de çalıştıracağım ve Metasploitable işletim sistemine sahip hostun portlarını tarayacağım. Kali'de konsola "nano scanner.py" komutunu girerek bir dosya açıyoruz ve yukarıdaki kodu dosyaya kopyalıyoruz. Daha sonra " chmod +x scanner.py" komutuyla dosyamıza çalıştırılabilme yetkisini veriyoruz.

Sırasıyla yukarıda bahsettiğim işlemleri gerçekleştirelim.


Ekran Görüntüsü 1: ARP Tarama

Yukarıdaki ekran görüntüsünde aktif bir host ile pasif durumdaki bir hostun tarama işleminin, scriptimizi kullanarak nasıl yapıldığını görebiliriz.

Benzer şekilde, aşağıdaki komut ile ICMP ile host taramasını gerçekleştirebiliriz.

#./scanner.py -p 192.168.200.130


Ekran Görüntüsü 2: ICMP Tarama

UDP port taraması için belli bir portu veya belirli bir port aralığını tarayabiliriz. Bunun için aşağıdaki komutları kullanıyoruz.

#./scanner.py -u 192.168.200.130 53
#./scanner.py -u 192.168.200.130 1 10


Ekran Görüntüsü 3: UDP Port Tarama

Yukarıdaki görüntüden scriptin UDP tarama sonuçlarını görebiliriz.

TCP port taramasını ise tarama tipini SYN tarama için "-s", FIN tarama için "-f" olarak belirleyerek kullanabiliriz.

#./scanner.py -s 192.168.200.130 80
#./scanner.py -s 192.168.200.130 1 10


Ekran Görüntüsü 4:TCP SYN Tarama

#./scanner.py -f 192.168.200.130 80
#./scanner.py -f 192.168.200.130 1 10



Ekran Görüntüsü 5:TCP FIN Tarama

Yukarıdaki ekran görüntülerinden SYN ve FIN tarama sonuçlarını görebiliriz.

Bugün kendi host ve port tarama aracımızı python script dili ile nasıl hazırlayabileceğimizi gördük. NMAP kadar profesyonel bir araç olmasa da en azından bir başlangıç yapmış olduk. Bir sonraki yazıda görüşmek üzere.

Yararlandığım Kaynak:
Justin Hutchens, "Kali Linux Network Scanning Cookbook"

16 Haziran 2015 Salı

Scapy ile Host ve Port Tarama

Merhaba Arkadaşlar,

Bu yazıda, scapy programı ile host ve port tarama işleminin nasıl gerçekleştirildiğini anlatacağım. "NMAP varken neden Scapy ?" diye sorduğunuzu duyuyorum şimdiden. Python ile kendi tarama araçlarımızı nasıl yazabileceğimizi anlatan birkaç yazı paylaşmayı planlıyorum. Bu araçların nasıl çalıştığını anlatmadan böyle bir işe başlamak istemedim. Nmap, oldukça profesyonel bir araç(araç demek bile hakaret aslında) ancak scapy ile TCP,UDP,IP gibi yeni başlayanlar için soyut kavramların, nasıl detaylı bir şekilde incelenip, bu paketlerin hazırlanabildiğini göstermeye çalışacağım.

Bugün host tarama işlemini ve port tarama işlemini gerçekleştireceğiz. Host tararken katman 2 yada katman 3'te çalışabiliriz. Bunu şu şekilde gerçekleşecek; elimizdeki IP adresinin ağda aktif olup olmadığını ARP paketleri göndererek veya ICMP paketleri göndererek öğrenebiliriz. Port tarama işleminde ise Katman 4'te çalışacağız. TCP ve UDP paketleri hazırlayıp, hedef IP adresinden gelen veya gelmeyen cevap paketlerini yorumlayarak taradığımız portun açık olup olmama durumunu öğreneceğiz.

Scapy programını Kali'de konsola scapy yazarak başlatıyoruz.

Ekran Görüntüsü 1: Scapy programının başlatılması

Scapy programı başlattığımızda bizi programın shell'i karşılıyor. ARP protokolüyle host tarama işlemine geçmeden önce bir ARP paketinin hangi parametrelere sahip olduğunu inceleyelim. Bunun için Scapy programının shell'inde şu komutu giriyoruz.

>>ARP().display()

Ekran Görüntüsü 2: ARP Paketi Parametreleri

Paketi incelediğimizde, "hwsrc" bizim MAC adresimizi, "psrc" ise bizim IP adresimizi temsil ediyor. Benzer şekilde "hwdst" hedef MAC adresini, "pdst" ise hedef IP adresini temsil ediyor. Kısaca ARP protokolünden bahsedecek olursak bir bilgisayar ağda başka bir bilgisayarla haberleşebilmek için IP adresinin yanında MAC adresini de bilmesi gerekir. MAC adresini öğrenebilmek için bütün ağa haberleşmek istediği bilgisayarın IP adresinin hangi MAC adresli cihaza ait olduğunu soran ARP Request paketleri yayınlar. Bu paketi alan hedef IP adresine sahip cihaz kendi MAC adresini bildiren paketi, isteği yapan bilgisayara gönderir. Böylece bilgisayarların haberleşmesi için gerekenler sağlanmış olur. Host tararken bu protokolü şu şekilde kullanacağız. Ağda aktif olup olmadığını öğrenmek istediğimiz IP adresini "pdst" parametresine gireceğiz, "hwdst" yani hedef MAC adresini boş bırakarak bu paketi bütün ağa yayınlayacağız. Eğer bize bir cevap paketi gelirse yani taradığımız bilgisayar kendi MAC adresini bize gönderirse, burdan anlayacağız ki bu IP adresine ait bilgisayar ağda aktif. Şimdi uygulamaya geçelim.

>> arp_request=ARP()
>> arp_request.pdst="192.168.2.5"
>> arp_request.display()

Yukarıdaki komutlar şu anlama geliyor. İlk komutla bir ARP paketi oluşturuyoruz ve arp_request adıyla bu paket üzerinde işlem yapabiliyoruz. İkinci komut, ARP paketinin hedef IP adresi parametresine, taramak istediğimiz IP adresini atıyoruz. Son olarak yayınlamaya hazır paketi gözlemlemek için display methodunu kullanıyoruz.


Ekran Görüntüsü 3: ARP paketinin hazırlanması

>> response=sr1(arp_request)
sr1 methodu paketi gönderip, cevabı almamızı sağlıyor. Bu methodun döndürdüğü değeri response isimli değişkende tutuyoruz.
>> response.display()

Dönen cevap paketini incelediğimizde, taradığımız IP adresini ve sahip olduğu MAC adresini görebiliyoruz. Aslında bu paketin varlığı bile hostun aktif olduğu anlamına geliyor.

Ekran Görüntüsü 4: ARP cevap paketi

Bu işlemi  gerçekleştirirken, bir IP paketi oluşturacağız ve bu paketin içine bir ICMP paketi yerleştireceğiz. Taramak istediğimiz IP adresine bu paketi gönderip bir cevap bekleyeceğiz. Bu cevap paketi, bu IP adresinin ağda aktif olduğunu kanıtlamış olacak.

>> ip = IP()
>> ip.dst="192.168.2.12"
>> ping= ICMP()
>> ping_request = (ip/ping)
>> ping_request.display()

IP ve ICMP paketlerini oluşturup, ICMP paketini IP paketinin içine atıyoruz ve paketi göndermeden önce display methoduyla paketi görüntülüyoruz. Taramak istediğimiz IP adresini IP paketinin "dst" parametresine atadık.

Ekran Görüntüsü 5: ICMP paketinin hazırlanışı

>> ping_reply=sr1(ping_request)
>> ping_reply.display()

Komutları ile paketi gönderiyoruz ve dönen cevabı görüntülüyoruz. Taramak istediğimiz IP adresinden gelen bu cevap paketi hostun aktif olduğunu gösteriyor.

Ekran Görüntüsü 6: ICMP cevap paketinin gözlenmesi

Scapy ile UDP port tarama işlemini gerçekleştirirken, IP paketinin içine UDP paketini yerleştirip, taramak istediğimiz IP adresinin aktif olup olmadığını öğrenmek istediğimiz portuna gönderiyoruz. Eğer ICMP port-unreacheable cevap paketi gelirse bu port kapalıdır, eğer bir cevap gelmezse port açıktır. Bu yaklaşım çok sağlıklı bir yaklaşım olmasa da, bu yöntemi kullanan araçların nasıl çalıştığını görmek açısından faydalı olduğunu düşünüyorum.

Uygulamayı Vmware ortamında Kali ve Metasploitable2 işletim sistemlerini kullanarak gerçekleştireceğim.

Kalide konsola scapy komutunu girerek programı başlatıyoruz ve aşağıdaki komutları giriyoruz.

>> i= IP()
>> i.dst="192.168.200.130"
>> u=UDP()
>> u.dport=123
>> request=(i/u)
>> request.display()

IP paketimizi hazırladık ve hedef IP adresimizi girdikten sonra UDP paketimizi oluşturup hedef portu 123 (NTP) olarak belirledik. "request" değişkeni, IP paketinin içine UDP paketimizi yerleştirilmiş halini temsil ediyor. Display methoduyla paketimizi inceleyebiliriz.

Ekran Görüntüsü 7: UDP paketinin hazırlanması

>> response = sr1(request)
>> response.display()

Komutları ile paketi gönderip, cevap paketini incelediğimizde IP paketinin içinde bir ICMP paketinin geldiğini görüyoruz. Bu paketin "port unreachable" mesajı bize taradığımız portun kapalı olduğunu gösteriyor. Eğer bir cevap almasaydık portun açık olduğunu varsayabilirdik.

Ekran Görüntüsü 8: ICMP port unreachable paketi

TCP port tarama işleminde de, yine bir IP paketi oluşturacağız ve bu TCP() paketini içine yerleştireceğiz. Bu paketi hedef IP adresimize göndermeden önce TCP paketinde "flags" parametresini hangi taramayı yapmak istiyorsak ona göre ayarlayacağız ve cevap paketindeki "flags" parametresini yorumlayarak taradığımız portun açık olup olmadığını anlayacağız.

>> i=IP()
>> i.dst="192.168.200.130"
>> t=TCP()
>> request= (i/t)
>> request.display()

Daha öncekilere benzer şekilde paketimizi hazırladık. Varsayılan olarak TCP paketinin "flags" parametresi "S", "dport" parametresi de http(80) olarak ayarlanmıştır. 

Ekran Görüntüsü 9: TCP paketinin hazırlanması

>> response =sr1(request)
>> response.display()

Komutları ile paketi gönderip, gelen cevap paketini incelediğimizde, TCP cevap paketindeki "flags" parametresinin "SA" olarak ayarlanmış olduğunu görüyoruz. Bu bize taradığımız portun (80) açık olduğunu gösteriyor.

Ekran Görüntüsü 10: TCP cevap paketi

Bu şekilde TCP paketinin "flags" parametresini "F" olarak ayarlayarak FIN taramasıda yapabiliriz. FIN tarama ters mantıkla çalıştığı için kapalı porttan cevap bekleriz. Gelen paketin "flags" parametresi "RA" olarak ayarlanmışsa port kapalı olduğunu anlarız.

Ekran Görüntüsü 11: FIN tarama
Yukarıdaki ekran görüntüsünü incelediğimizde, hedefin 511 nolu portuna FIN taraması gerçekleştirdiğimizde, cevap paketinin "flags" parametresi "RA" olarak ayarlanmış yani port kapalı. Açık bir porta bu taramayı yaptığımızda bir cevap paketi almayız.

Toparlayacak olursak, host ve port tarama işlemlerinin gerçekleştirilmesinde ilk tercih olarak genelde nmap programı kullanılıyor olsa da scapy programı bu işlemlerin ağ trafiğinde nasıl gerçekleştiğini anlamamıza yardımcı oluyor. Wireshark programı ile tarama sırasında ağ trafiğini inceleyerek de bu işlemler takip edilebilir. Bundan sonraki yazılarımda, python'da kullanacağım scapy kütüphanesinin methodlarını ve parametrelerini de tanımış olduk. Umarım faydalı bir yazı olmuştur. Bir sonraki yazıda görüşmek üzere.



Yararlandığım Kaynak:

Justin Hutchens,"Kali Linux Network Scanning Cookbook"










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"



1 Haziran 2015 Pazartesi

802.1Q Protokolüne Saldırı(VLAN Hopping)

Merhaba Arkadaşlar,

Bu yazıda, 802.1Q protokolüne yapılan bir saldırı tipi olan VLAN hopping'i anlatacağım. Daha önceki yazılarımda da adını anmak zorunda olduğum VLAN'ı bu yazımda daha ayrıntılı açıklamaya çalışacağım.

Saldırıdan önce VLAN(Virtual Local Area Network) nedir, sorusunu cevaplayalım. Bir switch'e bağlı cihazlar aksi bir yapılandırma yoksa aynı VLAN'dadırlar(Native VLAN) bu da demek oluyor ki broadcast olarak yayınlanan paketler switch'in bütün portlarından yayınlanırlar. Bu trafikten bütün cihazların ve bağlantıların etkilenmemesi için sanal yerel alan ağı yani VLAN'lar kurulur, böylece güvenli bir ortamda sağlanmış olur.(Hatırlayacak olursak MAC Flood, ARP Spoof, DHCP Spoof saldırılarını gerçekleştirebilmemiz için aynı VLAN'da olmamız gerekir.) Her VLAN kendi IP bloğuna ve ağ geçidine sahiptir. VLAN'ların birbirleriyle haberleşebilmeleri için Router'da gerekli yapılandırmaların yapılmış olması gerekir.

802.1Q protokolünden önce belli bir VLAN'a ait paket, bir switch'ten diğer switch'e gönderilirken kendisine özel bir bağlantı tahsis edilirdi. Bu durum kablo karmaşasını da beraberinde getirirdi. Bu durumun kullanılmasının zorunlu olduğu durumlar olsa da, birden fazla VLAN'a ait paketler artık tek bir bağlantı üzerinden gönderilebilmektedir. Bu da 802.1Q protokolü (Trunking) sayesinde gerçekleşmektedir. Bu protokol, paketlerin hangi VLAN'a aitse o VLAN'ın etiketiyle paketlenmesini sağlar. Yani bir switch'e VLAN 10 'a ait bir paket geldiğini farzedelim, bu paket switch'in VLAN 10 'a tahsis edilmiş bağlantılarından ve trunk olarak yapılandırılmış bağlantılarından gönderilir. Aşağıdaki iki örnek ağı incelersek, 802.1Q protokolü olan ve olmayan ağlar arasındaki farkı daha net görebiliriz.

Ekran Görüntüsü 1: 802.1Q Protokolü kullanılmayan ağ

Ekran Görüntüsü 2: 802.1Q Protokolü kullanılan ağ


VLAN Hopping saldırısını gerçekleştirebilmemiz için bağlı olduğumuz switch arayüzünün herhangi bir VLAN'a atanmamış olması yani native VLAN arayüzünde olmamız gerekir. Bizim bilgisayarımız dan gönderilen paket iki VLAN etiketi taşır. Birincisi hedef VLAN'ın etiketi, ikincisi switch tarafından eklenen native VLAN etiketi. Hedef bilgisayarın bağlı olduğu switch, bizim çift etiketli paketimizin, native VLAN etiketini çıkartıcak. Paketimiz switch'e hedef VLAN'ın etiketiyle ulaşacağı için paketimiz switch'in o VLAN'a ait portlarından yayınlanacak. Böylece giriş iznimizin olmadığı bir VLAN'a paket yollamış olacağız.

Bu saldırı tekniğini de daha önce kullandığım GNS3 ortamında gerçekleştireceğim. Daha önce kullanmamış olanlar, bu programı tanıttığım yazıdan faydalanabilirler. Aşağıdaki bağlantıdan bu yazıya ulaşabilirsiniz. 

http://msesli.blogspot.com.tr/2015/05/gns3-ile-sanal-network-laboratuvar.html

Aşağıdaki network'ü kurup başlatalım.

Ekran Görüntüsü 3: Saldırının gerçekleştirileceği network

Cihazları başlattıktan sonra, Cisco EtherSwitch Router'larda birkaç yapılandırma yapmamız gerekiyor. Switchlerin konsoluna ulaşmak için switch'in üstünde sağ klik'ten sonra "console" 'u seçiyoruz. Aşağıdaki komutları sırasıyla giriyoruz.
R1 için;

#vlan database
(vlan)#vlan 10 name account
(vlan)#vlan 1 name management
(vlan)#apply
(vlan)#exit
#configure terminal
(config)#interface fastethernet 1/14
(config-if)#switchport mode trunk
(config-if)#no shutdown
(config-if)#exit
(config)#exit
#copy running-config startup-config

R2 için;

#vlan database
(vlan)#vlan 10 name account
(vlan)#vlan 1 name management
(vlan)#apply
(vlan)#exit
#configure terminal
(config)#interface fastethernet 1/14
(config-if)#switchport mode trunk
(config-if)#exit
(config)#interface fastethernet 1/15
(config-if)#switchport mode access
(config-if)#switchport access vlan 10
(config-if)#no shutdown
(config-if)#exit
(config)#exit
#copy running-config startup-config

Bu yapılandırma şu anlama geliyor. R1 switch'inin 1/15 nolu arayüzü Kali'ye bağlı ve native VLAN'da, 1/14 nolu arayüzü ise trunk mode'da. R2 switch'inin 1/14 nolu arayüzü trunk mode'da ve 1/15 nolu arayüzü Windows cihazına bağlı VLAN 10 olarak yapılandırılmış. 

Senaryomuz ise şu şekilde bir şirket ağının native VLAN'ı yönetim için VLAN 10 ise muhasebe departmanı için ayrılmış. Yönetim VLAN'ına bir şekilde dahil olan saldırganın, giriş hakkı olmayan muhasebe departmanının bilgisayarlarına paket gönderebilmesini işliyeceğiz.("Yönetimdekilerin nasıl muhasebe departmanına giriş izni olmaz?" demeyin senaryo işte :) ).

Windows bilgisayarının IP adresini 10.10.10.10, ağ maskesini 255.255.255.0 ve ağ geçidini 10.10.10.1 olarak ayarlıyoruz. Paketin ulaşıp ulaşmadığını gözlemlemek için Windows'ta Wireshark'ı açıyoruz ve icmp filtre seçeneğini aktif ediyoruz.

Ekran Görüntüsü 4: Windows'ta Wireshark ile trafiğin gözlenmesi

Daha önce, paketin çift VLAN etiketi taşıması gerektiğinden bahsetmiştim. Bunu Yersinia aracı ile sağlayacağız. Kali'de konsola "yersinia -I" komutunu girerek programı başlatıyoruz. İlgili ağ arayüzünü seçtikten sonra "g" tuşuna basarak saldırı hazırlayacağımız paketin protokolünü seçiyoruz.

Ekran Görüntüsü 5: Yersinia programında 802.1Q protokolünün seçilmesi

Şimdi paketin parametrelerini şu şekilde ayarlıyoruz. Edit mode 'a geçmek için "e" yi tuşluyoruz.

Source IP =10.10.10.1
Netmask=255.255.255.0
VLAN 1=0001
VLAN 2=0010

Bu parametrelerle, paket hedefin ağ geçidinden geliyormuş gibi gözükücek. VLAN1 ve VLAN2 de etiketleyeceğimiz VLAN'lar. Enter'ı tuşlayıp, edit mode'dan çıkıyoruz. Şimdi saldırı tipini seçmek için "x" i tuşluyoruz ve 1.seçenek olan "sending 802.1Q double enc. packet" 'i seçiyoruz. Böylece paketi göndermiş oluyoruz.

Ekran Görüntüsü 6: Çift etiketli paketin gönderilmesi

Şimdi Windows bilgisayarında açtığımız Wireshark'a dönüyoruz. Yakaladığımız paketin MAC adresini kontrol ettiğimizde, paketimizin VLAN 10'a ulaştığını görebiliriz.

Ekran Görüntüsü 7: VLAN 10'a ulaşan paketin Windows'ta gözlenmesi

Bu saldırı ile VLAN 10'dan cevap paketini alamayız çünkü bizim bağlı olduğumuz switch bu paketi VLAN 10'a tahsis edilmiş bağlantı olmadığı için düşürür. Tek yönlü bir saldırıdır. UDP portlarını kullanan servislere istenmeyen paket gönderilmesinde kullanılabilir.(Log sunucuya sahte kayıt girilmesi)

VLAN nedir, 802.1Q protokolü ne işe yarar, VLAN Hopping saldırısı nasıl gerçekleştirilir sorularını cevaplandırmaya çalıştım. Umarım başarılı olabilmişimdir. Bir sonraki yazıda görüşmek üzere.
  

Yararlandığım Kaynak:
Gökhan USTA,"BİLGİSAYAR AĞLARINDA SALDIRI ve SAVUNMA"