Муню

X
//
Главная » All » Многопоточный сканер портов по списку IP на Python

Многопоточный сканер портов по списку IP на Python

Время чтение: 4 минуты 2018-12-09

Чего, nmap? Нет, не слышала))) А вообще я прекрасно знаю о существовании nmap и это не отбило желание написать свой многопоточный сканер портов. Поскольку он пишется для получения опыта, это в первую очередь.

И вообще, если брошен «Вызов самому себе» то я уже врятле угомонюсь пока не добьюсь того, чего хочу.

Вот так и тут. Изучать Python на каких-то примерчиках не интересно и скучно, хотелось написать более-менее реальную программу… И пофигу что подобных «Велосипедов» на каждом углу полно. Короче возникло желание написать многопоточный сканер портов. И при этом он должен сканировать список IP адресов, а не так, что 1 IP програн по диапазону портов до 1500 и все!

Многопоточный сканер портов на Python.

Как я сказал выше, сканируется именно список IP, а не отдельно взятый IP. Берётся IP прогоняется по диапазону портов, в данном случаи до 1500-того порта, поле чего берётся следующий IP и снова прогоняется до 1500-того порта, и так далее.

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() конечно же отразились, да и насрать… )))

А что если замутить, как-то вот так:

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. Но на этом я не остановился

Вот таков вот )))

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«. На этом уже можно остановится! Хватит…

Я думаю такой скорости вполне хватит. А большее от программы выжимать не стоит, либо какому дебилу придёт в голову сканить огромное количество компов? Только мутной стороне общества, а они и без меня найдут инструмент в сто раз лучше.

X