Категория > Новости > Сканим на Python. Как написать и улучшить собственный сканер портов - «Новости»
Сканим на Python. Как написать и улучшить собственный сканер портов - «Новости»26-10-2023, 08:14. Автор: Gustman |
официальной документации. Запомним время запуска программы — в дальнейшем это пригодится, чтобы узнать время сканирования. start = datetime.now() Хранить пары из портов и названий сервисов будем прямо в коде. При желании можешь проапгрейдить этот метод, например до файлов JSON. Читайте также - Подошва из ТПУ гарантирует отличное сцепление с поверхностью. Контроль Мяча - Текстурированный верх для отличного чувства мяча - бутсы сороконожки для футбола по доступным ценам. ports = { 20: "FTP-DATA", 21: "FTP", 22: "SSH", 23: "Telnet", 25: "SMTP", 43: "WHOIS", 53: "DNS", 80: "http", 115: "SFTP", 123: "NTP", 143: "IMAP", 161: "SNMP", 179: "BGP", 443: "HTTPS", 445: "MICROSOFT-DS", 514: "SYSLOG", 515: "PRINTER", 993: "IMAPS", 995: "POP3S", 1080: "SOCKS", 1194: "OpenVPN", 1433: "SQL Server", 1723: "PPTP", 3128: "HTTP", 3268: "LDAP", 3306: "MySQL", 3389: "RDP", 5432: "PostgreSQL", 5900: "VNC", 8080: "Tomcat", 10000: "Webmin" } Преобразуем переданный аргумент в IP-адрес. Для этого скормим первый аргумент командной строки нашего сканера функции host_name = sys.argv[1] ip = socket.gethostbyname(host_name) Теперь в цикле обойдем все порты из списка и проверим возможность подключения к ним. Если порт закрыт, будет вызываться исключение, которое мы перехватим, и программа не вылетит. В конце работы сохраняем время окончания и выводим на экран длительность сканирования. ends = datetime.now() print("<Time:{}>".format(ends - start)) input("Press Enter to the exit....") for port in ports: cont = socket.socket() cont.settimeout(1) try: cont.connect((ip, port)) except socket.error: pass else: print(f"{socket.gethostbyname(ip)}:{str(port)}is open/{ports[port]}") cont.close() Теперь, чтобы протестировать работу нашего сканера, откроем терминал, перейдем в папку со сканером и выполним команду python.exe socket.py 45.33.32.156 infoЕсли ты работаешь на Linux, используй команду Само собой, вместо IP в примере можно указать любой хост. Давай посмотрим, как это выглядит со стороны сервера. Для этого воспользуемся старичком Netcat. Скачай его и запусти следующим образом: ncat.exe -lnvp 123 warningNetcat может понадобиться внести в белый список антивируса или согласовать установку с корпоративной службой безопасности. Netcat часто используют хакеры, чтобы поднять шеллы в скомпрометированных системах, так что ругань антивируса вполне оправданна. В соседнем терминале запускаем наш сканер изучать наш собственный IP-адрес. Посмотреть его можно в выводе команды Реакция Netcat на сканирование На скриншоте видно, что было установлено полноценное соединение, и, конечно, в реальности любая программа тоже это увидит, то есть незаметно просканировать кого‑то таким образом не получится. Также давай теперь просканируем сервер Address: 45.33.32.156 45.33.32.156:22 is open/SSH 45.33.32.156:80 is open/http Сканер нашел два открытых порта — 22 и 80. Но если просканировать этот же хост при помощи Nmap, увидим, что открытых портов намного больше. Nmap scan report for scanme.nmap.org (45.33.32.156) Host is up (0.22s latency). Not shown: 994 closed ports PORTSTATE SERVICE 22/tcp open ssh 80/tcp open http 1720/tcp open h323q931 5060/tcp open sip 9929/tcp open nping-echo 31337/tcp open Elite Nmap done: 1 IP address (1 host up) scanned in 5.02 seconds Почему так? Nmap проходит по значительно большему списку портов, чем наш сканер, и, соответственно, видит больше. Если мы добавим эти порты в наш сканер, он тоже их найдет. Понятно, что такой сканер вряд ли применим в реальных условиях, кроме совсем уж экзотических: например, когда сканировать надо с машины, на которую невозможно доставить полноценный сканер, но на которой уже есть Python. Давай лучше попробуем сделать сканер, который не станет так палиться и работать будет куда быстрее. Перейти обратно к новости |