Sızma testleri için temel Python

Python programlama dili Guido von Rossum tarafından temelleri atılmış, yorumlanan, kullanımı kolay bir betik programlama dilidir. Özellikle hemen hemen tüm ihtiyaçlar için dahili yada üçüncü parti bir kütüphaneye sahip olması sebebiyle günümüzde başta web ve sistem programlama olmak üzere pek çok amaç için kullanılır olmuştur.

Python'a giriş sb_float

Bu bölümde Python programlama diline hızlı bir giriş yaparak özellikle sızma testleri sırasında ihtiyaç duyacağımız bazı temel kullanımlara göz gezdireceğiz. Çalışmalarımız boyunca Python’un 2.X sürümlerini kullanıyor olacağız. Kodların sorun çıkarma ihtimali olan bir kısmı, çok ufak değişikliklerle, 3.X sürümlerde de çalışacaktır.

Not: Örneklerin tamamı Linux için anlatılmıştır

Python’u çalıştırmak

Python’u kullanabilmek için konsolda python yazarak Python yorumlayıcısını başlatabilirsiniz.

Eğer yazdığınız kodun sonradan da kullanılabilir olmasını istiyorsanız bir metin editörü ile istediğiniz dosyayı Kali dağıtımınız altındaki uygun bir klasöre kaydedip sonradan da kullanabilirsiniz. Bu noktada dikkat etmeniz gereken iki nüans mevcut.

1- Kodunuzun ilk satırı her zaman #!/usr/bin/python ile başlamalı.
2- Kodunuzu .py uzantısı ile kaydettikten sonra Linux altında chmod +x dosyaismi.py şeklinde gireceğiniz komutla onu, kaydettiğiniz klasörde ./dosyaismi.py şeklinde çalışabilir kılmak.

Dilin bir parçası olarak boşluklar

Python’u diğer dillerden ayıran en büyük etkenlerden birisi boşlukları da dilin syntax’ının bir parçası olarak kullanmasıdır. Bu özellik okunabilirliği arttırması adına büyük bir imkandır.

Örneğin bir koşullu ifade kurgulayalım;

while c<12:  
    if a==5:
         b=4
        a=a-1

Görüldüğü üzere, if ve while ifadelerinin gövdelerini yazarken diğer dillerde parantezlerle sağladığımız gruplamayı burada bir tab boşluk (yada 4 space) bırakarak yapıyoruz. PEP-8 yazılan Python kodunun şekil şartları konusunda referans kaynaktır.

Değişkenler

Python programlama dili değişken tipleri konusunda esnek bir yapıya sahiptir.

yas=30 seklinde bir tanımlamayla örneğin türünde yani integer (tamsayı) bir değişkene otomatikman sahip olabilirsiniz. Yine tip belirtmeden yapacağınız ad=”Süreyya” şeklinde bir tanımla ise size türünde yani string bir değişken oluşturur.

[email protected]:~# python  
Python 2.7.3 (default, Mar 13 2014, 11:03:55)  
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.  
>>> yas="30"
>>> type(yas)
<type 'str'>  
>>> ad="Merhaba ben Python"
>>> type(ad)
<type 'str'>  
>>> piSayisi=3.1415
>>> type(piSayisi)
<type 'float'>  
Temel veri yapıları
Listeler

Python’un dahili veriyapılarından ilk akla gelen listelerdir. Yapı olarak klasik programlama dillerindeki dizi yapılarına benzerler fakat daha fazla esnekliğe sahiptir. Eleman erişimleri için index numaraları 0’dan başlar.

[email protected]:~# python  
Python 2.7.3 (default, Mar 13 2014, 11:03:55)  
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.  
>>> a=[1,2,3,"python",3.14]
>>> print a
[1, 2, 3, 'python', 3.14]        
>>> print a[3]    # Dizi index’leri 0’dan başlıyor!
Python  
>>> a[2]="test"
>>> print a
[1, 2, 'test', 'python', 3.14]
>>> a.append(78)
>>> a
[1, 2, 'test', 'python', 3.14, 78]
>>> temp=a.pop()
>>> print temp
78  
>>> a
[1, 2, 'test', 'python', 3.14]
>>> a.remove(2)
>>> a
[1, 'test', 'python', 3.14]
Sözlükler

“Etiket” : “Değer” şeklinde kullanım sağlanabilen bir veriyapısıdır.

[email protected]:~# python  
Python 2.7.3 (default, Mar 13 2014, 11:03:55)  
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.  
>>> taramaSonucu={"ip":"10.1.6.4","port":"443"}
>>> taramaSonucu["ip"]
'10.1.6.4'  
>>> taramaSonucu["port"]
'443'  
Döngüler

Döngüler tekrarlanan işlemler için kullanılabilecek yapılardır. Sızma testi çalışmalarınız sırasında benzer ihtiyaçlarınız için kodunuzu aşağıdaki gibi kurgulayabilirsiniz.

[email protected]:~# python  
Python 2.7.3 (default, Mar 13 2014, 11:03:55)  
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.  
>>> for i in range(1,254):
...     print "192.168.5.%s" % i  # %s her turda döngü değişkeni (i)
...                                  # değeri ile güncellenir
192.168.5.1  
192.168.5.2  
192.168.5.3  
192.168.5.4  
192.168.5.5  
192.168.5.6  
192.168.5.7  
192.168.5.8  
192.168.5.9  
192.168.5.10  
...
Dosya işlemleri

Elimizde içinde IP adresleri ve karşısında port durumları olan bir dosya olduğunu varsayalım. Python’un kullanımı son derece kolay olan dosya fonksiyonları sayesinde bu dosyadan bilgileri okuyup ekrana basalım. Bunun için öncelikle aşağıdaki gibi bir txt dosyamız olsun. dosya.txt olarak kaydedelim bu dosyayı.

10.1.2.103 8080
192.168.2.4 443
212.45.24.119 80

Aşağıda ise dosya.txt isimli bu dosyayı satır satır okuyup ekrana basan okuyucu.py isimli dosyamız mevcut.

fo = open("dosya.txt", "r+")  
for i in fo.readlines():  
    print i

Görüldüğü üzere, öncelikle dosya.txt’yi r+ (okuma) modunda açıp bu dosya işaretçisini fo isimli değişkene atıyoruz. Daha sonra ise bu işaretçi üzerinde kurduğumuz döngüyle satır satır verileri ekrana basıyoruz

Kütüphanelerle çalışmak

Python’un en güçlü taraflarından birisi de dahili ve harici zengin kütüphane (library) desteğidir.

Sızma testlerinde Python’a ait sys, os ve socket modülleri sıklıkla kullanılan built-in modüllerdir. Bununla beraber scapy gib üçüncü parti kütüphanelere de zaman zaman ihtiyaç duyulabilmektedir.

Herhangi bir kütüphane import kutuphaneadi şeklinde koda eklenebilir. Herhangi bir modülün içeriğini görmek istenmesi takdirde dir(kutuphaneadi) yazımı kullanılabilinir. Yine bir modül yada fonksiyona ait kullanım detaylarını öğrenmek için help(kutuphaneadi) yada help(kutuphaneadi.fonksiyonadi) ifadelerini kullanabilirsiniz.

sys modülü örneğin sisteme özgü parametreler ve fonksiyonları içeren ve Python ile beraber gelen bir kütüphanedir.

>>> import sys
>>> sys.maxint
9223372036854775807  
>>> sys.version
'2.7.3 (default, Mar 13 2014, 11:03:55) \n[GCC 4.7.2]'  
>>> sys.path
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old'
...

os modülü işletim sistemi bağımlı fonksiyon ve parametlere ev sahipliği yapan modürdür.

>>> import os
>>> os.name
'posix'  
>>> os.stat("/")
posix.stat_result(st_mode=16877, st_ino=2, st_dev=65025L, st_nlink=24, st_uid=0, st_gid=0, st_size=4096, st_atime=1427739993, st_mtime=1426998024, st_ctime=1426998024)  
>>> os.rmdir("/tmp/silinecekKlasor")
>>> os.getcwd()
'/root’  
>>> help(os.getcwd)
Help on built-in function getcwd in module posix:

getcwd(...)  
    getcwd() -> path
Socket programlama

Network iletişimin temel yapı taşları socket’lerdir. Sunucu ve istemci arasındaki iletişim sağlanır. Sunucu belirli bir porttan hizmet sunar. İstemci sunucu IP’sine ilgili porttan bağlanarak hizmeti alır.

Sunucu kodu:

import socket  
s = socket.socket()  
host = socket.gethostname()  
port = 12345  
s.bind((host, port))  
s.listen(5)  
while True:  
   c, addr = s.accept()
   print 'Bağlantı gelen adres:', addr
   c.send('Bağlandığınız için teşekkürler.’)
   c.close()

İstemci kodu:

import socket  
s = socket.socket()  
host = socket.gethostname()  
port = 12345  
s.connect((host, port))  
print s.recv(1024)  
s.close  

Furkan ÇALIŞKAN

Read more posts by this author.