İçeriğe geç

Python NMAP Kütüphanesi

Çok önceden NMAP hakkında detaylı bir yazı yazmıştım, fırsatını bulabilirsem yeniden yazacağım yada yazıyı düzenleyip buraya taşıyacağım. Bu yazımızda ise NMAP yazılımını Python ile beraber kullanacağız. Ayrıca yazının sonunda basit birde Port Scanner yazacağız.

NMAP Kütüphanesi Nedir?

NMAP kütüphanesi, NMAP yazılımının Python üzerinde ki bir modülüdür. NMAP yazılımı ile yapabileceğiniz hemen hemen her şeyi NMAP kütüphanesi ile de yapabilirsiniz.

NMAP Kütüphanesi Nasıl Kurulur?

Linux kullanıcıları, kullandıkları dağıtımın paket deposundan kurulumu gerçekleştirebilirler.

~$ apt-get install python-nmap

Eğer dağıtımın paket deposunda yoksa easy_install yazılımı ile kütüphane sisteme kurulabilir.

~$ easy_install python-nmap

Hata almazsanız kurulum başarılı demektir. Artık diğer modüller gibi  import nmap diyerek kütüphaneyi programımıza dahil edebiliriz.

Hata vermeden bir alt satıra indiyse kurulum başarılı demektir.

NMAP Kütüphanesi Nasıl Kullanılır?

Kütüphane diğer modüllerde de olduğu gibi sınıflar değişkenlere aktarılarak çalışma alanı oluşturulur. Kütüphane içerisinde çeşitli sınıflar bulunuyor, bunları görmek için dir fonksiyonunu kullanabilirsiniz.

Görüldüğü gibi tüm sınıf ve fonksiyonlar ekrana döküldü.

Port Taraması

Çeşitli sınıfların bulunduğunu söylemiştik, bizim amacımız Port taraması olduğu için PortScanner sınıfını kullanacağız.
Öncelikle kütüphanedeki PortScanner() sınıfını bir değişkene aktarıyoruz ve daha sonra scan() diyerek tarama başlatıyoruz.

Evet, sırasıyla  import nmap  diyerek kütüphaneyi programa aktardık. Daha sonra PortScanner sınıfını nm değişkenine aktardık. Hemen ardından da scan fonksiyonunu kullanarak 192.168.133.129 IP adresinin 22 ile 443 arasında ki portlarını taradık. Biraz bekledikten sonra ekrana bilgiler dökülmeye başladı.

{‘nmap’: {‘scanstats’: {‘uphosts’: ‘1’, ‘timestr’: ‘Wed Sep 23 17:06:30 2015’, ‘downhosts’: ‘0’, ‘totalhosts’: ‘1’, ‘elapsed’: ‘110.53’}, ‘scaninfo’: {‘tcp’: {‘services’: ’22-443′, ‘method’: ‘syn’}}, ‘command_line’: ‘nmap -oX – -p 22-443 -sV 192.168.133.129’}, ‘scan’: {‘192.168.133.129’: {‘status’: {‘state’: ‘up’, ‘reason’: ‘reset’}, ‘hostnames’: [], ‘vendor’: {}, ‘addresses’: {‘ipv4’: ‘192.168.133.129’}, ‘tcp’: {139: {‘product’: ‘Samba smbd’, ‘state’: ‘open’, ‘version’: ‘3.X’, ‘name’: ‘netbios-ssn’, ‘conf’: ’10’, ‘extrainfo’: ‘workgroup: WORKGROUP’, ‘reason’: ‘syn-ack’, ‘cpe’: ‘cpe:/a: samba: samba:3’}, 111: {‘product’: ”, ‘state’: ‘open’, ‘version’: ‘2’, ‘name’: ‘rpcbind’, ‘conf’: ’10’, ‘extrainfo’: ‘RPC #100000’, ‘reason’: ‘syn-ack’, ‘cpe’: ”}, 80: {‘product’: ‘Apache httpd’, ‘state’: ‘open’, ‘version’: ‘2.2.8’, ‘name’: ‘http’, ‘conf’: ’10’, ‘extrainfo’: ‘(Ubuntu) DAV/2’, ‘reason’: ‘syn-ack’, ‘cpe’: ‘cpe:/a:apache:http_server:2.2.8’}, 53: {‘product’: ‘ISC BIND’, ‘state’: ‘open’, ‘version’: ‘9.4.2’, ‘name’: ‘domain’, ‘conf’: ’10’, ‘extrainfo’: ”, ‘reason’: ‘syn-ack’, ‘cpe’: ‘cpe:/a:isc:bind:9.4.2’}, 22: {‘product’: ‘OpenSSH’, ‘state’: ‘open’, ‘version’: ‘4.7p1 Debian 8ubuntu1’, ‘name’: ‘ssh’, ‘conf’: ’10’, ‘extrainfo’: ‘protocol 2.0’, ‘reason’: ‘syn-ack’, ‘cpe’: ‘cpe:/o:linux:linux_kernel’}, 23: {‘product’: ‘Linux telnetd’, ‘state’: ‘open’, ‘version’: ”, ‘name’: ‘telnet’, ‘conf’: ’10’, ‘extrainfo’: ”, ‘reason’: ‘syn-ack’, ‘cpe’: ‘cpe:/o:linux:linux_kernel’}, 25: {‘product’: ‘Postfix smtpd’, ‘state’: ‘open’, ‘version’: ”, ‘name’: ‘smtp’, ‘conf’: ’10’, ‘extrainfo’: ”, ‘reason’: ‘syn-ack’, ‘cpe’: ‘cpe:/a:postfix:postfix’}}}}}

Görüldüğü gibi komutu verdikten sonra bize sözlük yapısı içerisinde bilgileri sundu. Normal sözlük yapısını öğrenerek dahi işin mantığını çözebilirsiniz. Bir kaç basit örnek gösterelim.

Sözlük içeriğini incelemeye başladık. Öncelikle command_line() fonksiyonunu kullanarak, modülün hangi komut ile çalıştığını öğreniyoruz. Bize -oX diyerek XML şeklinde çıktı ürettiğini -p 22-443 diyerek 22-443 arası portları taradığını ve -sV diyerek versiyon kontrolü yaptığını söyledi. Daha sonra scaninfo() fonksiyonu ile taramaya dair bilgiler aldık. Çıkan sonuçta ise TCP üzerinden 22-443 servislerini (portlarını) taradığını ve method olarak ise SYN Scan seçeneğini kullandığını söyledi.

Burada ise all_hosts() fonksiyonunu kullanarak tarama yapılan IP adreslerini ekrana döktü. Ancak biz sadece tek 1 IP adresi verdiğimiz için çıkan sonuçta tek bir veriden ibaret. Eğer bir blok halinde tarama yapmasını isteseydik bu defa bize birden fazla ögeden oluşan bir liste sunacaktı. Bundan sonra ki kısım ise bu liste ögeleri üzerinden devam edecek. IP adresimiz 192.168.133.1 biz bu IP adresi hakkında bilgi edineceğiz.

Dediğimiz gibi sözlük yapısında olduğu için kullanımı da aynen sözlük kullanımı gibidir. Yine biz IP adresini tararken hangi protokolü kullandığını öğrenmek için all_protocols() fonksiyonunu, bu protokolün erişim numaraları (bağlantı numaraları) için ise keys() fonksiyonunu kullandık. Sözlüğümüz iç içe sözlüklerden oluştuğu için kullanımı da  degisken["ip"]["protokol"]  şeklinde, yani IP adresinde ki protokol şekilde işliyor.

Portların durumu hakkında bilgi almak ise oldukça kolay.

host_tcp() fonksiyonu verilen argümanda ki portun durumu hakkında bilgi olup olmadığını denetler. İlk örnekte 50. port için bilgi olmadığı için False değerini ekrana döktü. Ancak ikinci örnekte 53. port hakkında bilgi oluğu için (önceki resim) True değerini ekrana dökerek olumlu yanıt verdi. Daha sonra tcp sözlüğünün içinde ki 53 anahtarını kullanarak bilgi aldık. Gördüğünüz gibi statüsünü, versiyonunu, ismini vs hemen hemen tüm kullanılabilir bilgileri bize verdi.

Eğer istenirse aşağıda ki komut verilerek yine port hakkında bilgi alabilirsiniz.

Çıktısı yine aynı olacaktır. Portun durumunu öğrenmek için ise

Open cevabını ekrana döktü. Yani 22. port açık!

Parametre Kullanımı

Parametre kullanmak için scan() fonksiyonuna arguments parametresini eklemek yeterlidir. Bu parametreye değerler girilecektir. Ayrıca IP bloku girilmek istenirse normal taramada ki ki slach (/) konulması yeterlidir.

Görüldüğü gibi parametre vererek basit bir tarama yaptık. Bize temiz bir tarama yaptı ve öncekine benzer sonuçlar elde etti. Tabi ki tek IP adresi buldu yinede. Verdiği komutu ise inceleyelim.

Kayda Değer Komutlar

cvs() komutu ise gerçekten sevdiğim bir komuttur, sıralamayı karıştırınca bu komutu vererek nereye hangi parametreyi koyacağımızı görüyoruz. Yeniler için oldukça ideal.

Görüldüğü gibi bize net bir liste sundu.

Küçük Bir Program

Python öğrenen hemen hemen herkes ilk etapta socket modülünü kullanarak bir Port Scanner yazar. Mantık basittir, ping at cevap gelirse port açıktır gelmezse kapalı. Bu basit bir programdır ve çoğu kez işe yaramaz. Şayet yavaş çalışır, servis ve versiyon tespiti yapamaz… Biz öğrendiklerimizi kullanarak daha net bir program yazalım.

Açıklamalar zaten mevcut, sorularınızı konu altında sorabilirsiniz. Basit bir script yazmış olduk.

Görüldüğü gibi standart yazılımlardan farklı olarak bize hızlı bir dönüşte bulundu. Biz eklemeler yaparak daha detaylı bir tarama ortaya çıkartabiliriz. Böylece NMAP yazılımının bize sunduğu nimetlerden bir kaz daha faydalanmış olduk.

Kolay gelsin arkadaşlar, yakın zamanda NMAP programını tanıtan yazıyı da buraya eklerim.

Tarih:Python Programlama

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.