我使用nmap的默认隐身扫描作为确定客户端系统上端口状态的方法。最近引起我注意的是,由于在连接期间接收到RST数据包,这导致在客户端记录错误。
我已经将nmap修改为使用tcp connect()(-sT选项),但是在查看数据包后,可以确认RST数据包仍在发送以关闭连接。
反正有没有让nmap进行connect()和使用FIN关闭连接的方法?
有关确切交易的更多信息:
默认扫描:
来源-SYN
目的地-SYN-ACK
来源-RST-ACK
TCP Connect扫描:
来源-SYN
目的地-SYN-ACK
来源-ACK
来源-RST
需要什么:
来源-SYN
目的地-SYN-ACK
来源-ACK
来源-FIN
目的地-FIN-ACK
目的地-FIN
来源-FIN-ACK
请注意,我只需要控制源代码中发生的事情。
答案 0 :(得分:0)
由于我在这里没有收到太多答复,因此我决定在这样的假设下运行:即使使用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扫描相似的结果。