Ещё одна статья о сканере на питоне. Хоть бы че то новое было и интересное. А так - статья ради статьи. Останется в песочнице.
СТАТЬЯ
Создание простого сканера портов на Python для анализа сети
[ обложка статьи ]
Режим чтения
Прежде чем перейти к коду, стоит понять, как наш сканер работает «под капотом». В отличие от nmap с его десятками техник, самый простой TCP-сканер использует очевидный принцип: он пытается установить полноценное соединение с каждым портом из списка. Если целевой хост отвечает флагом SYN-ACK — трёхэтапное рукопожатие (TCP-handshake) завершается успешно, и порт считается открытым. Если приходит RST или ответа нет вовсе (таймаут) — порт закрыт или отфильтрован. Именно это и делает наш код: socket.connect() запускает handshake, а мы лишь интерпретируем результат. Понимание этой механики поможет вам дальше улучшать сканер — например, добавить многопоточность или полускрытые SYN-сканирования.
Комментарии к коду стараюсь делать на каждом шагу, чтобы было просто и понятно. Далее мы создаем каркас, что будет держать нашу программу:
А вот здесь будет более подробное описание. Именно в этом моменте мы используем методы и контейнеры.
Метод - функция связанная с определенным типом данных. Пример:
Контейнер - место для хранения информации в определенном порядке. Пример:
В нашем случае мы используем кортеж, это контейнер, который хранит объекты в неизменяемом порядке. Именно в нем мы сможем сохранить порты для сканирования. Теперь давайте сделаем красивый ввод и дополнительную функцию для распознавания ip-адреса сайта.
Совет: использовать изменения цвета вместе с функцией input() не советуется (отображение не будет).
Следом нам нужно создать цикл, который будет производить подключение к сайту по IP и порту. Для этого печатаем следующее:
А вот дальше я пошел более трудным путем и решил создать часть кода, что будет распознавать тип открытого порта (все что приведены у нас в кортеже). Внимание, дальше будет очень много кода (делаете отступ после s.close() и пишите туда):
Я предупреждал, метод достаточно нестандартный к решению задачи. Простыми словами данный код берет из нашего контейнера ports каждое число и сравнивает его с тем числом, что ему задали. То есть если ports равен 80, то выводим такой текст, в противном случае пропускаем. Я добавил для четкости немного цветов, чтобы было проще отличить нужное от ненужного. Нам остается только теперь завершить нашу программу кодом:
Чтобы все работало как нам нужно мы воспользуемся конвертацией. При помощи pyinstaller собираем программу в единый exe-файл командой:
Совет: если хотите добавить иконку воспользуйтесь флагом -i перед --onefile указав путь до вашего .ico файла.
Введение
В течении нескольких месяцев при активных тестах на проникновения я очень часто сталкивался с проблемой наличия под рукой быстрых программ. Чтобы можно было не запуская вторую OS (linux) быстро провести анализ. В моем случае это сканирования. Поэтому для решения данной проблемы пришлось прийти к написанию своей программы. Да, скорее всего таких софтов будет очень много, но у каждого есть свое преимущество. В нашем случае, что будет рассмотрен далее это скорость и постоянное наличие под рукой. Данная статья крайне полезна новичкам и тем кто не знаком с Python. Приступим.Что это и зачем мне нужно?
Представим ситуацию. Вы спокойно гуляете по интернету, посещаете нужные сайты и ищите полезную информацию. Но тут приходит идея посмотреть безопасность одного из сайта. Ваша операционная система (основная) Windows и провести какие либо действия связанные с анализом займут достаточно много времени. А точнее узнавание поткрытых портов и ip адреса сайта. Но что если можно сделать все в один клик и получить нужные данные не отходя далеко от ПК? Именно эту задачу мы будем решать. Постараемся создать такую вещь.От теории к практике!
Основную цель этой статьи мы разобрали, теперь приступим к реализации. Использовать мы как всегда будет старый, добрый Python в связке с PyCharm. Сразу скажу, что наш код будет на удивление очень прост но эффективен. Похожий код вы можете найти на сайтах, но здесь все же будут отличия, что сделают работу уникальной. Давайте начнем с простого. Импорта библиотек:
Python:
import socket # Основная библиотека
from datetime import datetime # Нужно для отслеживания времени
from colorama import Fore, init # Создает оформление
Python:
init() # Требуется для цветокоррекции
start = datetime.now() # Начинает отсчет времени
ports = [20, 21, 22, 23, 25, 42, 43, 53, 67, 69, 80, 115, 123, 137, 138, 139, 143, 161, 179, 443, 445, 514, 515, 993,
995, 1080, 1194, 1433, 1723, 3128, 3268, 3306, 3389, 5432, 5060, 5900, 8080, 10000, 20000]
# | Порты для сканирования |
Метод - функция связанная с определенным типом данных. Пример:
Python:
"Hello, World!".upper()
Python:
h = ["Hello, World!"]
print(h)
Python:
ip = input("Site Name / IP Address: ") # Ввод текста
print(f"{Fore.LIGHTGREEN_EX}IP address:", socket.gethostbyname(ip)) # Распознаем IP
print(f"{Fore.LIGHTRED_EX}<===============>") # Украшение
print(f"{Fore.WHITE}Loading Ports...")
print(f"{Fore.LIGHTGREEN_EX}##################")
Следом нам нужно создать цикл, который будет производить подключение к сайту по IP и порту. Для этого печатаем следующее:
Python:
for port in ports: # Создаем цикл
s = socket.socket() # Обозначаем переменную для подключения
s.settimeout(1) # Создаем задержку между подключениями
try:
s.connect((ip, port)) # Подключаемся
except socket.error: # Пропускаем ошибки неудачного подключения
pass
else:
s.close()
Python:
if port == 20:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/FTP-DATA")
elif port == 21:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/FTP")
elif port == 22:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SSH")
elif port == 23:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/Telnet")
elif port == 25:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SMTP")
elif port == 43:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/WHOIS")
elif port == 53:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/DNS")
elif port == 80:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/http")
elif port == 115:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SFTP")
elif port == 123:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/NTP")
elif port == 143:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/IMAP")
elif port == 161:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SNMP")
elif port == 179:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/BGP")
elif port == 443:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/HTTPS")
elif port == 445:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/MICROSOFT-DS")
elif port == 514:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SYSLOG")
elif port == 515:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/PRINTER")
elif port == 993:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/IMAPS")
elif port == 995:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/POP3S")
elif port == 1080:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SOCKS")
elif port == 1194:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/OpenVPN")
elif port == 1433:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SQL Server")
elif port == 1723:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/PPTP")
elif port == 3128:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/HTTP")
elif port == 3268:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/LDAP")
elif port == 3306:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/MySQL")
elif port == 3389:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/RDP")
elif port == 5432:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/PostgreSQL")
elif port == 5060:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SIP")
elif port == 5900:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/VNC")
elif port == 8080:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/Tomcat")
elif port == 10000:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/Webmin")
else:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/unknown")
Python:
print(f"{Fore.LIGHTGREEN_EX}##################") # Украшение
ends = datetime.now() # Останавливаем таймер
print(f"{Fore.LIGHTRED_EX}" + "<Time:{}>".format(ends - start)) # Выводим время сканирования
print("Scan completed!") # Делаем задержку, чтобы программа не закрылась после завершения сканирования
input("Press Enter to the exit....")
Код:
pyinstaller -F --onefile имя_программы.py
Вывод
Надеюсь данный код было полезен вам. Если хотите скачать уже готовую программу без каких-либо заморочек, то рекомендую заглянуть сюда. Так же ниже я оставлю свой код с полным оформлением.
Python:
# -*- coding: utf-8 -*-
import socket
from datetime import datetime
from colorama import Fore, init
init()
print(f'''{Fore.LIGHTRED_EX}
Сюда поместите картинку
''')
print(f"{Fore.LIGHTCYAN_EX} [#=>] Coded by ваш_никнейм")
start = datetime.now()
ports = [20, 21, 22, 23, 25, 42, 43, 53, 67, 69, 80, 115, 123, 137, 138, 139, 143, 161, 179, 443, 445, 514, 515, 993,
995, 1080, 1194, 1433, 1723, 3128, 3268, 3306, 3389, 5432, 5060, 5900, 8080, 10000, 20000]
print(f"{Fore.LIGHTYELLOW_EX}")
ip = input("Site Name / IP Address: ")
print(f"{Fore.LIGHTGREEN_EX}IP address:", socket.gethostbyname(ip))
print(f"{Fore.LIGHTRED_EX}<===============>")
print(f"{Fore.WHITE}Loading Ports...")
print(f"{Fore.LIGHTGREEN_EX}##################")
for port in ports:
s = socket.socket()
s.settimeout(1)
try:
s.connect((ip, port))
except socket.error:
pass
else:
s.close()
if port == 20:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/FTP-DATA")
elif port == 21:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/FTP")
elif port == 22:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SSH")
elif port == 23:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/Telnet")
elif port == 25:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SMTP")
elif port == 43:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/WHOIS")
elif port == 53:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/DNS")
elif port == 80:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/http")
elif port == 115:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SFTP")
elif port == 123:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/NTP")
elif port == 143:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/IMAP")
elif port == 161:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SNMP")
elif port == 179:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/BGP")
elif port == 443:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/HTTPS")
elif port == 445:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/MICROSOFT-DS")
elif port == 514:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SYSLOG")
elif port == 515:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/PRINTER")
elif port == 993:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/IMAPS")
elif port == 995:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/POP3S")
elif port == 1080:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SOCKS")
elif port == 1194:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/OpenVPN")
elif port == 1433:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SQL Server")
elif port == 1723:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/PPTP")
elif port == 3128:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/HTTP")
elif port == 3268:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/LDAP")
elif port == 3306:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/MySQL")
elif port == 3389:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/RDP")
elif port == 5432:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/PostgreSQL")
elif port == 5060:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SIP")
elif port == 5900:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/VNC")
elif port == 8080:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/Tomcat")
elif port == 10000:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/Webmin")
else:
print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/unknown")
print(f"{Fore.LIGHTGREEN_EX}##################")
ends = datetime.now()
print(f"{Fore.LIGHTRED_EX}" + "<Time:{}>".format(ends - start))
print(f"{Fore.MAGENTA}Scan completed!")
input("Press Enter to the exit....")
AI-выжимка
сгенерировано ИИ
Тезисы статьи скоро
Статья читается полностью. Тезисы со ссылками на разделы появятся позже.
Содержание
Codeby Academy
Практика и мастерство
От основ до продвинутого — программы для практиков Codeby.
Перейти к курсу →
Комментарии
19