Многопоточный сканер портов по списку IP на Python
Чего, nmap? Нет, не слышала))) А вообще я прекрасно знаю о существовании nmap и это не отбило желание написать свой многопоточный сканер портов. Поскольку он пишется для получения опыта, это в первую очередь.
И вообще, если брошен «Вызов самому себе» то я уже врятле угомонюсь пока не добьюсь того, чего хочу.
Вот так и тут. Изучать Python на каких-то примерчиках не интересно и скучно, хотелось написать более-менее реальную программу… И пофигу что подобных «Велосипедов» на каждом углу полно. Короче возникло желание написать многопоточный сканер портов. И при этом он должен сканировать список IP адресов, а не так, что 1 IP програн по диапазону портов до 1500 и все!
Многопоточный сканер портов на Python.
Как я сказал выше, сканируется именно список IP, а не отдельно взятый IP. Берётся IP прогоняется по диапазону портов, в данном случаи до 1500-того порта, поле чего берётся следующий IP и снова прогоняется до 1500-того порта, и так далее.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
import threading import socket import time from datetime import datetime start_time = datetime.now() ports = [] for i in range(1500): ports.append(i) with open("hosts") as file: host_list = [row.strip() for row in file] def scan_ip(host, port): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(0.5) try: s.connect((host, port)) print("IP: " + host + " Open port: " + str(port)) s.close except: pass count = 0 for ip in host_list: count = count + 1 print('=' * 50) print("Сканирую: ", ip) print('-' * 50) for port in ports: time.sleep(0.0005) t = threading.Thread(target=scan_ip, args=(ip, port)) t.daemon = True t.start() if count == 3: print("\nTIME OUT") count = 0 time.sleep(10) print('=' * 50, "\n") t.join() end_time = datetime.now() print('Прошло: {}'.format(end_time - start_time)) input("happy end : ") |
Собственно что получается в итоге? Сканируется 14 IP адресов до 1500-того порта, и на весь процесс скана ушло всего 32 секунды! Я хз норм результат или нет. Так же в конец IP списка я добавляла IP адрес на котором я знаю каждый открытый порт, как свои 5 пальцев. Сканер не пропустил не одного порта, что конечно же хорошо и прекрасно!
Но сразу скажу, если вдруг кто захочет раздуть из этого кода, так скажем «полноценный» многопоточный сканер портов. Дело в том что, если запихенить дахера айпишников, то программа загнётся, либо создаться слишком дахера потоков.
Именно по этому в коде можно видеть «time.sleep(0.0005)» и «time.sleep(10)» Эти значения я подобрал методом тыка. В таком виде сканер проверял 65535 портов и 186 IP. Проблем не возникло, сканер отработал корректно, но на скорости все эти манипуляции с time.sleep() конечно же отразились, да и насрать… )))
А что если замутить, как-то вот так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
import threading import socket import time from datetime import datetime start_time = datetime.now() # ports = [] # for i in range(65535): # ports.append(i) with open("hosts") as file: host_list = [row.strip() for row in file] def scan_ip(host, port): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(0.5) try: s.connect((host, port)) print("IP: " + host + " Open port: " + str(port)) s.close except: pass count = 0 for ip in host_list: count = count + 1 # print('=' * 50) # print("Сканирую: ", ip) # print('-' * 50) #for port in ports: time.sleep(0.05) t = threading.Thread(target=scan_ip, args=(ip, 22)) t.daemon = True t.start() # if count == 3: # print("\nTIME OUT") # count = 0 # time.sleep(10) #print('=' * 50, "\n") t.join() end_time = datetime.now() print('Прошло: {}'.format(end_time - start_time)) input("happy end : ") |
В файл с ипами я запихенил 12 000 IP адресов и запустил сканер, как видно из кода на один порт. В итоге скан окончил работу через 0:10:04.897297
Я решил поменять тайм на «time.sleep(0.01)» и тогда терминал просто полетел ))) А 12 000 адресов просканировались за 0:02:04.514192. Но на этом я не остановился
Вот таков вот )))
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
import threading import socket import time from datetime import datetime start_time = datetime.now() with open("hosts") as file: host_list = [row.strip() for row in file] def scan_ip(host, port): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(0.4) try: s.connect((host, port)) print("IP: " + host + " Open port: " + str(port)) s.close except: pass threads = [] for ip in host_list: threads.append(threading.Thread(target=scan_ip, args=(ip, 22))) for thread in threads: time.sleep(0.001) thread.start() for thread in threads: thread.join() end_time = datetime.now() print('Прошло: {}'.format(end_time - start_time)) # input("happy end : ") |
Результат. Сканировал уже не 12к а 50 000 адресов на 1 порт и на это ушло «Прошло: 0:01:12.104565«. На этом уже можно остановится! Хватит…
Я думаю такой скорости вполне хватит. А большее от программы выжимать не стоит, либо какому дебилу придёт в голову сканить огромное количество компов? Только мутной стороне общества, а они и без меня найдут инструмент в сто раз лучше.