tcp - 如何让 nmap 优雅地关闭连接?
问题描述
我使用 nmap 的默认隐形扫描来确定客户端系统上的端口状态。最近引起我注意的是,由于在连接期间接收到 RST 数据包,这导致客户端记录错误。
我已将 nmap 修改为使用 tcp connect() (-sT 选项),但在查看数据包后,可以确认仍然发送 RST 数据包以关闭连接。
无论如何让nmap同时执行connect()并关闭与FIN的连接?
有关确切交换的更多信息:
默认扫描:
Source - SYN
Dest - SYN-ACK
Source - RST-ACK
TCP 连接扫描:
源 - SYN
目标 - SYN-ACK
源 - ACK
源 - RST
需要什么:
Source - SYN
Dest - SYN-ACK
Source - ACK
Source - FIN
Dest - FIN-ACK
Dest - FIN
Source - FIN-ACK
请注意,我只需要控制源上发生的事情。
解决方案
由于我在这里没有收到太多响应,因此我决定在假设即使使用 TCP connect() 扫描时,出于性能原因,nmap 也会与 RST 断开连接。
我的最终解决方案是混合两个单独的扫描:
FIN 扫描 - 区分关闭和开放|过滤
ACK 扫描 - 区分过滤和未过滤
我使用 bash 通过以下条件语句确定所有三种状态:
FSTATUS=$(sudo nmap -sF ${HL7_OUTBOUND_IP} -p ${HL7_OUTBOUND_PORT} -Pn 2>/dev/null | grep "^${HL7_OUTBOUND_PORT}" | awk '{print $2}')
if [[ $FSTATUS == "filtered" || $FSTATUS == 'open|filtered' ]]; then
ASTATUS=$(sudo nmap -sA ${HL7_OUTBOUND_IP} -p ${HL7_OUTBOUND_PORT} -Pn 2>/dev/null | grep "^${HL7_OUTBOUND_PORT}" | awk '{print $2}');
if [[ $ASTATUS == "unfiltered" ]]; then
PORT_STATUS="OPEN";
else
PORT_STATUS="FILTERED";
fi
else
PORT_STATUS="CLOSED";
fi
这区分了所有三种状态,并且没有发送 RST,让我得到与 SYN 扫描类似的结果。
推荐阅读
- c++ - C++:告诉用户输入 A、B 或 C,但如果他们输入不同的字符怎么办?
- node.js - 在 NODE-RED 处将 3 个输出转换为一个输入
- php - 发送带附件的 HTML 电子邮件 PHP
- android - Whatsapp上的图像共享不起作用
- jquery - Jquery单击和光标:指针仅针对一个元素
- mongodb - 删除 $sample 之后的重复项
- json - 不使用 json 模块将 JSON 文件读入数据帧
- excel - Excel VBA基于范围返回工作表的顶部单元格地址
- spring - 为什么当我添加安全弹簧依赖项时 Tomcat 不工作?
- javascript - href 中的 vue.js javascript 表达式