2022年 11月 3日

Python实现端口扫描

什么是端口扫描

定义:对一段端口或指定的端口进行扫描。

目的:通过扫描结果可以知道一台计算机上都提供了哪些服务,然后就可以通过所提供的这些服务的己知漏洞就可进行攻击。

原理:当一个主机向远端一个服务器的某一个端口提出建立一个连接的请求,如果对方有此项服务,就会应答,如果对方未安装此项服务时,即使你向相应的端口发出请求,对方仍无应答。

利用:对所有熟知端口或自己选定的某个范围内的熟知端口分别建立连接,并记录下远端服务器所给予的应答,便可知道哪些端口是开放的。

 

最强端口扫描神器:Nmap:https://nmap.org/

Python Socket实现端口扫描器

原理:socket.connect_ex((ip, port)),端口开放则返回0,否则返回错误代码

  1. from os import name
  2. import threading
  3. from socket import *
  4. import tqdm # 进度条,可自行加上
  5.    
  6. lock = threading.Lock()     # 确保 多个线程在共享资源的时候不会出现脏数据
  7. openNum=0                   # 端口开放数量统计
  8. threads=[]                   # 线程池
  9. def portscanner(host,port):
  10.     global openNum
  11.     try:
  12.         s=socket(AF_INET,SOCK_STREAM)
  13.         s.connect((host,port))
  14.         lock.acquire()
  15.         openNum+=1
  16.         print(f"{port} open")
  17.         lock.release()
  18.         s.close()
  19.     except:
  20.         pass
  21. def main(ip,ports=range(65535)):   # 设置 端口缺省值0-65535
  22.     setdefaulttimeout(1)
  23.     for port in ports:
  24.         t=threading.Thread(target=portscanner,args=(ip,port))
  25.         threads.append(t)
  26.         t.start()
  27.     for t in threads:
  28.         t.join()
  29.     print(f"PortScan is Finish ,OpenNum is {openNum}")  
  30. if __name__ == '__main__':
  31.     ip='10.0.11.11'
  32.     # main(ip,[22,101,8080,8000])       # 输入端口扫描
  33.     main(ip)                           # 全端口扫描