Python Ağ Tarayıcısı
Bağlantı noktası taraması, belirli bir ana bilgisayarda bulunan açık bağlantı noktalarını bulmak için kullanılan bir gözetim tekniği olarak tanımlanabilir. Ağ yöneticisi, sızma testi uzmanı veya bir bilgisayar korsanı bu tekniği kullanabilir. Hedef sistemden maksimum bilgi almak için port tarayıcıyı gereksinimlerimize göre yapılandırabiliriz.
Şimdi, bağlantı noktası taramasını çalıştırdıktan sonra alabileceğimiz bilgileri düşünün -
Açık bağlantı noktaları hakkında bilgiler.
Her bağlantı noktasında çalışan hizmetler hakkında bilgiler.
Hedef ana bilgisayarın işletim sistemi ve MAC adresi hakkında bilgiler.
Bağlantı noktası taraması, bir eve her kapıyı ve pencereyi kontrol ederek hangisinin açık olduğunu görmek isteyen bir hırsız gibidir. Daha önce tartışıldığı gibi, İnternet üzerinden iletişim için kullanılan TCP / IP protokol paketi, TCP ve UDP olmak üzere iki protokolden oluşur. Her iki protokol de 0 ila 65535 bağlantı noktasına sahiptir. Sistemimizin gereksiz bağlantı noktalarının kapatılması her zaman tavsiye edildiğinden, esasen kilitlenecek 65000'den fazla kapı (bağlantı noktası) vardır. Bu 65535 bağlantı noktası aşağıdaki üç aralığa ayrılabilir -
Sistem veya iyi bilinen bağlantı noktaları: 0'dan 1023'e
Kullanıcı veya kayıtlı bağlantı noktaları: 1024'ten 49151'e
Dinamik veya özel bağlantı noktaları: tümü> 49151
Soket Kullanan Port Tarayıcı
Önceki bölümümüzde, soketin ne olduğunu tartışmıştık. Şimdi, soket kullanarak basit bir port tarayıcısı yapacağız. Aşağıda, soket kullanan bağlantı noktası tarayıcısı için bir Python betiği verilmiştir -
from socket import *
import time
startTime = time.time()
if __name__ == '__main__':
target = input('Enter the host to be scanned: ')
t_IP = gethostbyname(target)
print ('Starting scan on host: ', t_IP)
for i in range(50, 500):
s = socket(AF_INET, SOCK_STREAM)
conn = s.connect_ex((t_IP, i))
if(conn == 0) :
print ('Port %d: OPEN' % (i,))
s.close()
print('Time taken:', time.time() - startTime)
Yukarıdaki komut dosyasını çalıştırdığımızda, ana bilgisayar adını soracaktır, herhangi bir web sitesinin adı gibi herhangi bir ana bilgisayar adı sağlayabilirsiniz, ancak dikkatli olun çünkü bağlantı noktası taraması bir suç olarak görülebilir veya yorumlanabilir. Hedeflediğiniz sunucunun veya bilgisayarın sahibinin açık, yazılı izni olmadan herhangi bir web sitesine veya IP adresine karşı asla bir bağlantı noktası tarayıcısı çalıştırmamalıyız. Bağlantı noktası taraması, birinin evine gidip kapılarını ve pencerelerini kontrol etmeye benzer. Bu nedenle, localhost'ta veya kendi web sitenizde (varsa) bağlantı noktası tarayıcı kullanmanız önerilir.
Çıktı
Yukarıdaki komut dosyası aşağıdaki çıktıyı üretir -
Enter the host to be scanned: localhost
Starting scan on host: 127.0.0.1
Port 135: OPEN
Port 445: OPEN
Time taken: 452.3990001678467
Çıktı, 50 ila 500 aralığında (komut dosyasında belirtildiği gibi), bu bağlantı noktası tarayıcısının iki bağlantı noktası bulduğunu gösterir - bağlantı noktası 135 ve 445, açık. Bu aralığı değiştirebilir ve diğer portları kontrol edebiliriz.
ICMP kullanan Port Tarayıcı (bir ağdaki canlı ana bilgisayarlar)
ICMP bir bağlantı noktası taraması değildir, ancak ana bilgisayarın çalışıp çalışmadığını kontrol etmek için uzak ana bilgisayara ping atmak için kullanılır. Bu tarama, bir ağdaki bir dizi canlı ana bilgisayarı kontrol etmemiz gerektiğinde kullanışlıdır. Bir ana bilgisayara bir ICMP ECHO İsteği göndermeyi içerir ve bu ana bilgisayar canlıysa, bir ICMP ECHO Yanıtı döndürecektir.
Yukarıdaki ICMP isteği gönderme işlemine, işletim sisteminin ping komutu tarafından sağlanan ping taraması da denir.
Ping Süpürme Kavramı
Aslında şu veya bu anlamda, ping taraması aynı zamanda ping süpürme olarak da bilinir. Tek fark, ping taramasının, belirli bir ağ aralığında birden fazla makine kullanılabilirliği bulma prosedürü olmasıdır. Örneğin, IP adreslerinin tam listesini test etmek istediğimizi ve ardından ping taramasını kullanarak, yani işletim sisteminin ping komutunu kullanarak IP adreslerini tek tek taramak çok zaman alıcı olacaktır. Bu yüzden ping süpürme komut dosyası kullanmamız gerekiyor. Aşağıda, ping taramasını kullanarak canlı ana bilgisayarları bulmak için bir Python betiği verilmiştir -
import os
import platform
from datetime import datetime
net = input("Enter the Network Address: ")
net1= net.split('.')
a = '.'
net2 = net1[0] + a + net1[1] + a + net1[2] + a
st1 = int(input("Enter the Starting Number: "))
en1 = int(input("Enter the Last Number: "))
en1 = en1 + 1
oper = platform.system()
if (oper == "Windows"):
ping1 = "ping -n 1 "
elif (oper == "Linux"):
ping1 = "ping -c 1 "
else :
ping1 = "ping -c 1 "
t1 = datetime.now()
print ("Scanning in Progress:")
for ip in range(st1,en1):
addr = net2 + str(ip)
comm = ping1 + addr
response = os.popen(comm)
for line in response.readlines():
if(line.count("TTL")):
break
if (line.count("TTL")):
print (addr, "--> Live")
t2 = datetime.now()
total = t2 - t1
print ("Scanning completed in: ",total)
Yukarıdaki komut dosyası üç kısımda çalışır. Önce parçalara bölerek ping taraması için IP adresi aralığını seçer. Bunu, işletim sistemine göre ping süpürme komutunu seçecek olan fonksiyonun kullanılması takip eder ve son olarak, ana bilgisayar ve tarama işleminin tamamlanması için geçen süre hakkında yanıt verir.
Çıktı
Yukarıdaki komut dosyası aşağıdaki çıktıyı üretir -
Enter the Network Address: 127.0.0.1
Enter the Starting Number: 1
Enter the Last Number: 100
Scanning in Progress:
Scanning completed in: 0:00:02.711155
Yukarıdaki çıktı hiçbir canlı bağlantı noktası göstermiyor çünkü güvenlik duvarı açık ve ICMP gelen ayarları da devre dışı. Bu ayarları değiştirdikten sonra, çıktıda sağlanan 1 ila 100 aralığında canlı portların listesini alabiliriz.
TCP taramasını kullanan Port Tarayıcı
Bir TCP bağlantısı kurmak için, ana bilgisayarın üç yönlü bir anlaşma yapması gerekir. İşlemi gerçekleştirmek için şu adımları izleyin -
Step 1 − Packet with SYN flag set
Bu adımda, bir bağlantı başlatmaya çalışan sistem, SYN bayrağı ayarlanmış bir paket ile başlar.
Step 2 − Packet with SYN-ACK flag set
Bu adımda, hedef sistem SYN ve ACK bayrak setlerine sahip bir paket döndürür.
Step 3 − Packet with ACK flag set
Sonunda, başlatma sistemi, ACK bayrak ayarlı orijinal hedef sisteme bir paket geri gönderecektir.
Bununla birlikte, burada ortaya çıkan soru, ICMP yankı isteği ve yanıt yöntemini (ping taraması tarayıcısı) kullanarak bağlantı noktası taraması yapabilirsek, neden TCP taramasına ihtiyacımız var? Bunun arkasındaki ana neden, ICMP ECHO yanıt özelliğini kapatırsak veya ICMP paketlerine bir güvenlik duvarı kullanırsak ping tarama tarayıcısının çalışmayacağını ve TCP taramasına ihtiyacımız olduğunu varsaymaktır.
import socket
from datetime import datetime
net = input("Enter the IP address: ")
net1 = net.split('.')
a = '.'
net2 = net1[0] + a + net1[1] + a + net1[2] + a
st1 = int(input("Enter the Starting Number: "))
en1 = int(input("Enter the Last Number: "))
en1 = en1 + 1
t1 = datetime.now()
def scan(addr):
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
socket.setdefaulttimeout(1)
result = s.connect_ex((addr,135))
if result == 0:
return 1
else :
return 0
def run1():
for ip in range(st1,en1):
addr = net2 + str(ip)
if (scan(addr)):
print (addr , "is live")
run1()
t2 = datetime.now()
total = t2 - t1
print ("Scanning completed in: " , total)
Yukarıdaki komut dosyası üç kısımda çalışır. Parçalara bölerek ping taraması için IP adresi aralığını seçer. Bunu, adresi taramak için soketi daha fazla kullanan bir işlev izler. Daha sonra, ana bilgisayar ve tarama işleminin tamamlanması için geçen süre hakkında yanıt verir. Sonuç = s. connect_ex ((addr, 135)) ifadesi bir hata göstergesi döndürür. İşlem başarılı olursa hata göstergesi 0'dır, aksi takdirde errno değişkeninin değeridir. Burada 135 numaralı bağlantı noktasını kullandık; bu tarayıcı Windows sistemi için çalışıyor. Burada çalışacak diğer bir bağlantı noktası 445'tir (Microsoft-DSActive Directory) ve genellikle açıktır.
Çıktı
Yukarıdaki komut dosyası aşağıdaki çıktıyı üretir -
Enter the IP address: 127.0.0.1
Enter the Starting Number: 1
Enter the Last Number: 10
127.0.0.1 is live
127.0.0.2 is live
127.0.0.3 is live
127.0.0.4 is live
127.0.0.5 is live
127.0.0.6 is live
127.0.0.7 is live
127.0.0.8 is live
127.0.0.9 is live
127.0.0.10 is live
Scanning completed in: 0:00:00.230025
Verimliliği artırmak için Dişli Bağlantı Noktası Tarayıcı
Yukarıdaki durumlarda gördüğümüz gibi, bağlantı noktası taraması çok yavaş olabilir. Örneğin, soket bağlantı noktası tarayıcı kullanılırken 50'den 500'e kadar bağlantı noktalarını taramak için geçen sürenin 452.3990001678467 olduğunu görebilirsiniz. Hızı artırmak için diş açmayı kullanabiliriz. Aşağıda, iş parçacığı kullanan bir bağlantı noktası tarayıcısı örneği verilmiştir -
import socket
import time
import threading
from queue import Queue
socket.setdefaulttimeout(0.25)
print_lock = threading.Lock()
target = input('Enter the host to be scanned: ')
t_IP = socket.gethostbyname(target)
print ('Starting scan on host: ', t_IP)
def portscan(port):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
con = s.connect((t_IP, port))
with print_lock:
print(port, 'is open')
con.close()
except:
pass
def threader():
while True:
worker = q.get()
portscan(worker)
q.task_done()
q = Queue()
startTime = time.time()
for x in range(100):
t = threading.Thread(target = threader)
t.daemon = True
t.start()
for worker in range(1, 500):
q.put(worker)
q.join()
print('Time taken:', time.time() - startTime)
Yukarıdaki betikte, Python paketinde yerleşik olan threading modülünü içe aktarmamız gerekiyor. Dişli kilitleme konseptini kullanıyoruz,thread_lock = threading.Lock()bir seferde birden fazla değişikliği önlemek için. Temel olarak threading.Lock (), tek bir iş parçacığının aynı anda değişkene erişmesine izin verir. Bu nedenle, çift değişiklik olmaz.
Daha sonra, çalışmayı (bağlantı noktasını) worker for döngüsünden alacak bir threader () işlevi tanımlarız. Ardından bağlantı noktasına bağlanmak ve sonucu yazdırmak için portscan () yöntemi çağrılır. Bağlantı noktası numarası parametre olarak aktarılır. Görev tamamlandığında q.task_done () yöntemi çağrılır.
Şimdi yukarıdaki betiği çalıştırdıktan sonra, 50 ila 500 bağlantı noktasını taramanın hız farkını görebiliriz. Yalnızca 1.3589999675750732 saniye sürdü, bu da 452.3990001678467'den çok daha az, yerel ana bilgisayarın aynı sayıda bağlantı noktasını taramak için soket bağlantı noktası tarayıcısı tarafından geçen süre.
Çıktı
Yukarıdaki komut dosyası aşağıdaki çıktıyı üretir -
Enter the host to be scanned: localhost
Starting scan on host: 127.0.0.1
135 is open
445 is open
Time taken: 1.3589999675750732