Категория > Новости > Сканим на 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-адрес. Для это­го скор­мим пер­вый аргу­мент коман­дной стро­ки нашего ска­нера фун­кции socket.gethostbyname(string) — бонусом получим раз­решение DNS, если переда­но домен­ное имя, а не 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, исполь­зуй коман­ду python3, что­бы слу­чай­но не нар­вать­ся на уста­рев­ший Python.



Са­мо собой, вмес­то IP в при­мере мож­но ука­зать любой хост.


Да­вай пос­мотрим, как это выг­лядит со сто­роны сер­вера. Для это­го вос­поль­зуем­ся ста­рич­ком Netcat. Ска­чай его и запус­ти сле­дующим обра­зом:


ncat.exe -lnvp 123


warning


Netcat может понадо­бить­ся внес­ти в белый спи­сок анти­виру­са или сог­ласовать уста­нов­ку с кор­поратив­ной служ­бой безопас­ности. Netcat час­то исполь­зуют хакеры, что­бы под­нять шел­лы в ском­про­мети­рован­ных сис­темах, так что ругань анти­виру­са впол­не оправдан­на.



В сосед­нем тер­минале запус­каем наш ска­нер изу­чать наш собс­твен­ный IP-адрес. Пос­мотреть его мож­но в выводе коман­ды ipconfig /all. В резуль­тате в окне с Netcat про­изой­дет сле­дующее.


Ре­акция Netcat на ска­ниро­вание

На скрин­шоте вид­но, что было уста­нов­лено пол­ноцен­ное соеди­нение, и, конеч­но, в реаль­нос­ти любая прог­рамма тоже это уви­дит, то есть незамет­но прос­каниро­вать кого‑то таким обра­зом не получит­ся.


Так­же давай теперь прос­каниру­ем сер­вер scanme.nmap.org (имен­но его IP был в пер­вом при­мере). Резуль­таты будут выг­лядеть при­мер­но так:


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.


Да­вай луч­ше поп­робу­ем сде­лать ска­нер, который не ста­нет так палить­ся и работать будет куда быс­трее.



Перейти обратно к новости