Введение
В течении нескольких месяцев при активных тестах на проникновения я очень часто сталкивался с проблемой наличия под рукой быстрых программ. Чтобы можно было не запуская вторую 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....")