简易UDP套接字扫描器运行失败:已知开放端口下recvfrom无预期响应
UDP扫描器核心问题排查
1. 端口遍历范围存在致命错误
当前代码的循环写法for port in (start, end):本质是创建了一个仅包含两个元素的元组,循环只会先后读取start和end两个值,完全不会遍历两个数值之间的端口区间。如果测试用的开放端口不在这两个端点位置,代码根本不会向该端口发送测试数据包,自然会出现udpsock.recvfrom(1024)从未在目标端口分支执行的现象。
正确写法需要用range实现连续遍历,注意range是左闭右开规则,要覆盖到end值需要调整为:
for port in range(start, end + 1):
2. 代码顺序错误,部分逻辑为永久无法执行的死代码
当前收到有效响应后的代码执行顺序为:
if len(data) > 0: udp_ports_found += 1 print(data) print("UDP Port {}: Open".format(port)) break # 执行到这里立刻跳出while循环 # *下方的写报告代码永远不会被触发* if report == 'y': with open("udpfindings.txt", "w+") as f2: ...
只要执行到break语句,程序会直接跳出内层循环,后续的报告生成逻辑完全没有运行机会。
3. 报告生成的文件操作存在硬伤
就算把写报告的代码移到break语句之前,当前的文件操作逻辑依然无法正常工作:
- 用
w+模式打开文件时,每次打开都会直接清空文件内的所有历史内容,多次扫描的结果会被反复覆盖,无法完整留存 w+模式刚打开文件时,文件指针位于开头且内容已被清空,此时执行f2.read()读不到任何历史记录,属于无意义操作
正确的文件写入逻辑应该使用追加模式a+,避免清空历史内容。
4. 接收数据的判断逻辑无实际校验价值
recvfrom(1024)的返回值是固定长度为2的元组,结构为(接收到的字节内容, 发送方地址)。你写的len(data) > 0判断,只要函数没有超时抛错就永远成立,完全无法校验收到的数据包是否是目标端口返回的有效响应,甚至可能把其他网络链路的冗余数据包误判为目标端口开放。
5. 异常捕获与资源释放存在漏洞
当前代码仅捕获了KeyboardInterrupt和socket.timeout两类异常,覆盖不足:
- 向未开放UDP端口发数据包时,目标返回的ICMP端口不可达报文会被系统内核关联到对应socket,此时执行
recvfrom会抛出ConnectionResetError,现有代码未做捕获,会直接导致程序中断 - 捕获到超时异常时,代码直接执行pass跳转,没有执行预先定义的
udpsock.close()释放资源,长时间扫描会累计大量未释放的socket文件描述符,触发系统上限后导致扫描中断
内容的提问来源于stack exchange,提问作者CyberMan
相关产品推荐
相关产品推荐

