nusalr/port-scanner
GitHub: nusalr/port-scanner
一个基于 Python socket 和线程池实现的并行 TCP 端口扫描工具,用于快速探测目标主机指定范围内的端口开放状态。
Stars: 0 | Forks: 0
###实现方法###
1. socket 模块
为了确认端口连接,使用 socket 模块。创建 socket 对象,并通过 connect_ex 确认端口连接,保存返回的结果。如果连接成功(端口 OPEN 状态),则返回 0。在 socket 对象中,目标 IP 地址以 IPv4 为基准,为了缩短确认 closed 端口所需的时间,将 timeout 时间设置为 1 秒。
2. ThreadPoolExecutor
为了并行处理端口扫描任务,使用 concurrent.futures 模块中的 ThreadPoolExecutor。用户设置的端口范围内的任务结果会通过 executor.submit 作为 future 对象返回,并通过 result 访问每次扫描的结果值。(处理任务的线程数为 50 个)
3. argparse 模块
为了通过命令行接收并使用 argument 值,使用 argparse 模块。argument 包含目标 IP 和端口范围两个,且必须输入。(使用方法请参考执行方法)
将接收到的 argument 用作 IP 和 Port 范围变量(port_start , end)。
4. 异常处理
getserbyport(port) 是 socket 模块中用于将端口号转换为服务名称的方法。如果端口的服务名称不存在,则将其名称统一为 Not found。
5. time 模块
利用 time 模块中的 time.time() 来计算端口扫描任务所花费的时间。
###执行方法###
1. scanner.py
无 argument。文件执行后输入地址和端口范围
2.scanner_v2.py
必须输入 --host , --ports argument
--host : 要扫描的目标 IP 地址
--ports : 端口扫描范围(数字之间用 '-' 符号分隔) ex. 1-100
执行示例:python scanner_v2.py --host 127.0.0.1 --ports 1-1000
###核心检查点###
1. 3-way handshake
如果端口处于 OPEN 状态,可以认为 SYN / SYN + ACK / ACK 的 3 个阶段都已全部进行。但是,如果端口处于 CLOSED 状态,在第 2 阶段服务器会发送 RST 数据包而不是 SYN 数据包,因此在这种情况下可以认为只发生到了第 2 阶段。
2. socket.connect() 与 socket.connect_ex() 的区别
connect 在发生异常时会引发错误,而 socket.connect_ex 则会返回关于错误的 value 值。因此,为了输出 Open / Closed 状态,我们使用 connect_ex。
3. 多线程的数量
如果同时使用大量线程进行作业,打开的 socket 数量会增多,可能会超过文件描述符的限制值。在这种情况下会引发 OSError 错误。
此外,如果创建大量线程同时访问多个端口,服务器可能会将其判定为扫描行为并进行拦截。
如果在防火墙中连接尝试突然增多,可能会拒绝最初发送的 SYN 数据包。
标签:DNS查询工具, Python, 插件系统, 无后门, 端口扫描器, 网络安全, 网络工具, 逆向工具, 隐私保护