Pemindai Jaringan Python

Pemindaian port dapat didefinisikan sebagai teknik pengawasan, yang digunakan untuk menemukan port terbuka yang tersedia pada host tertentu. Administrator jaringan, penguji penetrasi atau peretas dapat menggunakan teknik ini. Kami dapat mengkonfigurasi pemindai port sesuai dengan kebutuhan kami untuk mendapatkan informasi maksimal dari sistem target.

Sekarang, pertimbangkan informasi yang bisa kita dapatkan setelah menjalankan pemindaian port -

  • Informasi tentang port terbuka.

  • Informasi tentang layanan yang berjalan di setiap port.

  • Informasi tentang OS dan alamat MAC dari host target.

Pemindaian port seperti pencuri yang ingin masuk ke sebuah rumah dengan memeriksa setiap pintu dan jendela untuk melihat mana yang terbuka. Sebagaimana dibahas sebelumnya, rangkaian protokol TCP / IP, yang digunakan untuk komunikasi melalui internet, terdiri dari dua protokol yaitu TCP dan UDP. Kedua protokol memiliki 0 hingga 65535 port. Karena selalu disarankan untuk menutup port yang tidak perlu dari sistem kami, maka pada dasarnya, ada lebih dari 65000 pintu (port) untuk dikunci. Port 65535 ini dapat dibagi menjadi tiga rentang berikut -

  • Sistem atau port terkenal: dari 0 hingga 1023

  • Port pengguna atau terdaftar: dari 1024 hingga 49151

  • Port dinamis atau pribadi: semua> 49151

Port Scanner menggunakan Socket

Di bab sebelumnya, kita membahas apa itu soket. Sekarang, kita akan membangun pemindai port sederhana menggunakan soket. Berikut ini adalah skrip Python untuk pemindai port menggunakan soket -

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)

Ketika kami menjalankan skrip di atas, ia akan menanyakan nama host, Anda dapat memberikan nama host apa pun seperti nama situs web mana pun, tetapi berhati-hatilah karena pemindaian port dapat dilihat sebagai, atau ditafsirkan sebagai, kejahatan. Kami tidak boleh menjalankan pemindai port terhadap situs web atau alamat IP apa pun tanpa izin tertulis yang eksplisit dari pemilik server atau komputer yang Anda targetkan. Pemindaian port mirip dengan pergi ke rumah seseorang dan memeriksa pintu dan jendela mereka. Itulah mengapa disarankan untuk menggunakan pemindai port di localhost atau situs web Anda sendiri (jika ada).

Keluaran

Skrip di atas menghasilkan output berikut -

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

Keluarannya menunjukkan bahwa dalam kisaran 50 hingga 500 (sebagaimana disediakan dalam skrip), pemindai port ini menemukan dua port - port 135 dan 445, terbuka. Kami dapat mengubah rentang ini dan dapat memeriksa port lain.

Port Scanner menggunakan ICMP (Live host dalam jaringan)

ICMP bukanlah scan port tetapi digunakan untuk melakukan ping ke host jarak jauh untuk memeriksa apakah host sudah aktif. Pemindaian ini berguna ketika kita harus memeriksa sejumlah host langsung di jaringan. Ini melibatkan pengiriman Permintaan ICMP ECHO ke host dan jika host itu hidup, itu akan mengembalikan Balasan ICMP ECHO.

Proses pengiriman permintaan ICMP di atas juga disebut pemindaian ping, yang disediakan oleh perintah ping sistem operasi.

Konsep Ping Sweep

Sebenarnya dalam satu atau lain pengertian, ping sweep juga dikenal sebagai ping sweeping. Satu-satunya perbedaan adalah bahwa penyapuan ping merupakan prosedur untuk menemukan lebih dari satu ketersediaan mesin dalam jangkauan jaringan tertentu. Sebagai contoh, misalkan kita ingin menguji daftar lengkap alamat IP maka dengan menggunakan scan ping, yaitu perintah ping sistem operasi akan sangat memakan waktu untuk memindai alamat IP satu per satu. Itulah mengapa kita perlu menggunakan skrip ping sweep. Berikut ini adalah skrip Python untuk menemukan host langsung dengan menggunakan ping sweep -

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)

Skrip di atas bekerja dalam tiga bagian. Ini pertama-tama memilih kisaran alamat IP untuk melakukan ping sweep scan dengan membaginya menjadi beberapa bagian. Kemudian dilanjutkan dengan menggunakan fungsi yang akan memilih perintah ping sweeping sesuai sistem operasi, dan terakhir memberikan respon tentang host dan waktu yang dibutuhkan untuk menyelesaikan proses scanning.

Keluaran

Skrip di atas menghasilkan output berikut -

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

Keluaran di atas menunjukkan tidak ada port langsung karena firewall aktif dan pengaturan masuk ICMP juga dinonaktifkan. Setelah mengubah pengaturan ini, kita bisa mendapatkan daftar port langsung dalam kisaran dari 1 hingga 100 yang disediakan dalam output.

Port Scanner menggunakan scan TCP

Untuk membuat koneksi TCP, host harus melakukan jabat tangan tiga arah. Ikuti langkah-langkah ini untuk melakukan tindakan -

Step 1 − Packet with SYN flag set

Pada langkah ini, sistem yang mencoba untuk memulai koneksi dimulai dengan paket yang memiliki set flag SYN.

Step 2 − Packet with SYN-ACK flag set

Pada langkah ini, sistem target mengembalikan paket dengan set flag SYN dan ACK.

Step 3 − Packet with ACK flag set

Akhirnya, sistem yang memulai akan mengembalikan paket ke sistem target asli dengan set tanda ACK.

Namun demikian, pertanyaan yang muncul di sini adalah jika kita dapat melakukan pemindaian port menggunakan metode permintaan dan balasan echo ICMP (ping sweep scanner) lalu mengapa kita memerlukan pemindaian TCP? Alasan utama dibaliknya adalah misalkan jika kita mematikan fitur ICMP ECHO reply atau menggunakan firewall ke paket ICMP maka ping sweep scanner tidak akan berfungsi dan kita membutuhkan TCP scan.

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)

Skrip di atas bekerja dalam tiga bagian. Ini memilih kisaran alamat IP untuk melakukan ping sweep scan dengan membaginya menjadi beberapa bagian. Ini diikuti dengan menggunakan fungsi untuk memindai alamat, yang selanjutnya menggunakan soket. Kemudian, ini memberikan tanggapan tentang tuan rumah dan waktu yang dibutuhkan untuk menyelesaikan proses pemindaian. Hasilnya = s. connect_ex ((addr, 135)) pernyataan mengembalikan indikator kesalahan. Indikator kesalahan adalah 0 jika operasi berhasil, jika tidak, itu adalah nilai variabel errno. Di sini, kami menggunakan port 135; pemindai ini bekerja untuk sistem Windows. Porta lain yang akan berfungsi di sini adalah 445 (Direktori Microsoft-DSActive) dan biasanya terbuka.

Keluaran

Skrip di atas menghasilkan output berikut -

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

Pemindai Port Berulir untuk meningkatkan efisiensi

Seperti yang telah kita lihat pada kasus di atas, pemindaian port bisa menjadi sangat lambat. Misalnya, Anda dapat melihat waktu yang dibutuhkan untuk memindai port dari 50 hingga 500, saat menggunakan pemindai port soket, adalah 452.3990001678467. Untuk meningkatkan kecepatan kita bisa menggunakan threading. Berikut adalah contoh pemindai port menggunakan threading -

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)

Pada skrip di atas, kita perlu mengimpor modul threading, yang ada di dalam paket Python. Kami menggunakan konsep penguncian utas,thread_lock = threading.Lock()untuk menghindari beberapa modifikasi sekaligus. Pada dasarnya, threading.Lock () akan memungkinkan satu utas mengakses variabel sekaligus. Karenanya, tidak ada modifikasi ganda yang terjadi.

Nanti, kita mendefinisikan satu fungsi threader () yang akan mengambil pekerjaan (port) dari pekerja for loop. Kemudian metode portscan () dipanggil untuk menghubungkan ke port dan mencetak hasilnya. Nomor port dikirimkan sebagai parameter. Setelah tugas selesai, metode q.task_done () dipanggil.

Sekarang setelah menjalankan skrip di atas, kita dapat melihat perbedaan kecepatan untuk memindai 50 hingga 500 port. Hanya membutuhkan waktu 1.3589999675750732 detik, yang sangat kurang dari 452.3990001678467, waktu yang dibutuhkan oleh pemindai port soket untuk memindai jumlah port yang sama dari localhost.

Keluaran

Skrip di atas menghasilkan output berikut -

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