Мистер tails - IT блог

Проявляю IT активность в пределах третей от солнца планеты!

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

Многопоточный сканер портов по списку 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
37
38
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«. На этом уже можно остановится! Хватит…

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


Оставить комментарий