python编写端口扫苗渗透测试工具port_scanner.py
2025-01-16 11:01 _天枢 阅读(59) 评论(0) 编辑 收藏 举报import socket import threading import queue import sys import time class PortScanner: def __init__(self, target, start_port=1, end_port=1024, timeout=1, thread_count=100): """ 初始化端口扫描器 :param target: 目标主机IP :param start_port: 起始端口 :param end_port: 结束端口 :param timeout: 超时时间(秒) :param thread_count: 扫描线程数 """ self.target = target self.start_port = start_port self.end_port = end_port self.timeout = timeout self.thread_count = thread_count self.queue = queue.Queue() self.results = [] def scan_port(self): """ 端口扫描方法,作为线程任务运行 检查端口是否开放并获取banner信息 """ while True: try: port = self.queue.get_nowait() except queue.Empty: break try: # 创建TCP套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(self.timeout) # 尝试连接目标端口 result = sock.connect_ex((self.target, port)) if result == 0: try: # 尝试获取服务banner信息 banner = self.get_banner(sock) self.results.append((port, "开放", banner)) print(f"端口 {port}: 开放 - Banner信息: {banner}") except Exception as e: self.results.append((port, "开放", "无法获取Banner信息")) print(f"端口 {port}: 开放 - 无法获取Banner信息") sock.close() except Exception as e: print(f"扫描端口 {port} 时出错: {str(e)}") finally: self.queue.task_done() def get_banner(self, sock): """ 获取服务banner信息 :param sock: 已建立连接的套接字 :return: banner信息字符串 """ try: # 尝试发送HTTP请求获取banner sock.send(b"GET / HTTP/1.1\r\n\r\n") banner = sock.recv(1024) return banner.decode().strip() except: # 如果HTTP请求失败,尝试直接接收数据 try: banner = sock.recv(1024) return banner.decode().strip() except: raise Exception("无法获取Banner信息") def run(self): """ 运行端口扫描 启动多个扫描线程并等待完成 """ print(f"\n开始扫描目标主机: {self.target}") print("=" * 60) # 将待扫描端口加入队列 for port in range(self.start_port, self.end_port + 1): self.queue.put(port) # 创建并启动扫描线程 threads = [] for _ in range(min(self.thread_count, self.end_port - self.start_port + 1)): t = threading.Thread(target=self.scan_port) t.daemon = True t.start() threads.append(t) # 等待所有端口扫描完成 self.queue.join() print("\n扫描完成!") print("=" * 60) return self.results def main(): """ 主函数,处理命令行参数并启动扫描 """ if len(sys.argv) < 2: print("使用方法: python port_scanner.py <目标IP> [起始端口] [结束端口]") sys.exit(1) target = sys.argv[1] start_port = int(sys.argv[2]) if len(sys.argv) > 2 else 1 end_port = int(sys.argv[3]) if len(sys.argv) > 3 else 1024 scanner = PortScanner( target=target, start_port=start_port, end_port=end_port, timeout=1, thread_count=100 ) scanner.run() if __name__ == "__main__": main()
- 多线程端口扫描
- 自动获取服务Banner信息
- 可自定义扫描端口范围
- 支持超时设置
- 可配置线程数量
使用方法:
- 基本扫描(扫描1-1024端口):python port_scanner.py 192.168.1.1
- 指定端口范围扫描:python port_scanner.py 192.168.1.1 80 100
作 者:
天枢
出 处:
http://www.cnblogs.com/yhleng/
关于作者:专注于软件自动化测试领域。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者
直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角
【
推荐】
一下。您的鼓励是作者坚持原创和持续写作的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~