首页 > 解决方案 > 如何让 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

请注意,我只需要控制源上发生的事情。

标签: tcphandshakenmapport-scanning

解决方案


由于我在这里没有收到太多响应,因此我决定在假设即使使用 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 扫描类似的结果。


推荐阅读