You need to enable JavaScript to run this app. 简易UDP套接字扫描器运行失败:已知开放端口下recvfrom无预期响应
优惠活动
大模型
产品
解决方案
定价
更多

简易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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 00:45:04