首页 / 资讯中心 / 文章详情

Nmap内网隐蔽扫描实战:从SYN半开到源端口欺骗的全流程指南

Nmap内网隐蔽扫描实战:从SYN半开到源端口欺骗的全流程指南 ★ FEATURED ARTICLE
用Nmap做内网隐蔽扫描这件事网上写的人不少但大多数教程要么停在“扫一下端口”的入门水平要么罗列一堆参数让你背看完仍然不知道怎么在自己的内网环境里组合使用。这篇我打算换个讲法直接从“为什么要隐蔽”“隐蔽的原理是什么”“具体怎么操作”三条线往下拆把我自己做过授权内网评估时积累的一些心得也一并放进来。零基础的读者可以先看前两章建立概念有经验的可以直接跳到第三章对照命令。先说清楚文中所有手法只适用于你有权测试的内网设备比如自家公司分配给你的评估任务、实验室环境一定要守住“先授权、再扫描”的底线。1. 内网隐蔽扫描为什么是刚需1.1 内网扫描和互联网扫描的差别很多人习惯把Nmap当成“扫外网IP的工具”一上来就扫一个公网段这种思路搬到内网里很容易翻车。内网环境和公网的根本区别在于信任模型公网上你面对的是未知的设备互相之间本身就是隔离的而内网里设备之间默认是互通的域控、文件服务器、打印机的IP大家基本都知道。正因如此安全团队在内网做评估时隐蔽性的优先级非常高——你不想在真正确认漏洞之前就被运维侧的安全设备盯上更不想因为误扫导致业务中断。还有一点容易被忽视内网流量会经过交换机和网关很多企业内网都部署了流量审计、主机入侵检测这类东西。你在外网用默认配置扫一下没关系但在内网里大张旗鼓地发海量探测包不出五分钟就会被安全告警淹没。所以“隐蔽扫描”不是炫技而是内网安全评估的基本生存技能。它要解决的核心问题只有一个在你摸清网络拓扑和存活主机的过程中如何尽可能少地留下痕迹减少对目标系统的干扰。1.2 谁需要掌握这套技能内网隐蔽扫描的受众比想象中广。最早我接触这个场景是因为某公司要做内部红蓝对抗演练我在蓝队负责流量监测需要先搞懂攻击队可能用哪些扫描手段才能在交换机侧做针对性的告警规则。这个经历让我明白就算你不做红队只要你在安全或者运维岗理解隐蔽扫描的原理也有实际价值——你要防守就得知道对手长什么样。另外网络管理员自查也经常用到。比如公司把一段内网IP分配给了新部门你可以用Nmap快速梳理哪些IP在线、哪些端口对外开放判断是否有私自搭建的服务。这种场景下你不希望打扰到正常业务隐蔽模式就比默认扫描更合适。对于刚入门的学习者来说这套内容更是从脚本小子走向正规安全从业者的必经门槛它逼着你去理解TCP协议细节而不是傻乎乎地输入一个IP就回车。2. 隐蔽扫描到底是怎么隐藏自己的2.1 不完成握手就拿到答案SYN半开扫描讲隐蔽扫描之前得先搞明白常规TCP连接扫描为什么容易被发现。默认情况下Nmap的-sT会与目标端口完成一次完整的TCP三次握手客户端发SYN服务端回SYN/ACK客户端再回ACK连接建立后立刻断开。整个交互过程是“正常”的但问题是它太正常了在内网里你和每个端口都建立一次完整连接行为特征非常明显。SYN半开扫描-sS的思路是只发送SYN包收到SYN/ACK就认定端口开放然后直接发RST断开根本不进入第三步握手。这样一来目标系统上不会有完整的连接记录很多应用日志里根本不知道你曾经来过。这条命令在业内几乎是内网扫描的默认首选因为它速度快又有一定的隐蔽效果。我实测下来在一个几百台主机的网段里-sS的耗时是-sT的二分之一左右而且不会触发那些只统计“完整连接”的应用层告警。2.2 不走寻常路FIN、NULL、XMAS扫描半开扫描虽然没有建立完整连接但它还是发送了一个SYN包而SYN包本身就是连接请求的信号一些敏感的入侵检测规则会针对SYN做告警。这时候可以用更“异类”的探测方式。TCP协议里有一个特性如果目标端口是关闭的那么收到任何不带SYN标志的探测包时按规范应该回复RST如果端口是开放的则会直接丢弃该包不产生任何响应。基于这个特性Nmap提供了三种不发送SYN的扫描方式FIN扫描-sF发送只带有FIN标志的包模拟连接结束后主动关闭的场景。NULL扫描-sN不设置任何TCP标志位发一个“裸”包。XMAS扫描-sX同时设置FIN、URG、PUSH三个标志位让包头看起来像圣诞树一样挂满标志。这三种方式在目标系统上是“非法”包如果目标没有启用严格协议校验这些包会被直接丢弃你收不到任何反馈只能通过“有没有响应”来区分端口状态。它们的好处是足够冷门很多安全设备默认不检测这类包坏处也很明显Windows系统对这类探测包一律回复RST所以它们对Windows目标的扫描结果基本不可靠。我在做跨平台内网评估时通常只把它们用作辅助不会作为唯一依据。2.3 让目标误以为攻击来自别人诱饵与空闲扫描真正把隐蔽性提升一个层次的是“借刀”或者“藏身”的思路。Nmap的诱饵扫描参数-D可以实现一种很巧妙的效果你在探测目标时同时往诱饵IP发送同样特征的探测包目标的日志里就会记录一串攻击来源真IP夹在其中混在一群假目标里。实操中常见用法是nmap -sS -D 192.168.1.10,192.168.1.11,RND:5 目标IP意思是除了真实来源外再随机生成5个诱饵源。这个做法的代价是扫描时间变长因为每个探测包都要加上诱饵副本。更进阶的是空闲扫描-sI。它的执行思路是先找一台几乎所有端口都关闭的“僵尸机”然后通过伪造它的IP去扫描目标再观察僵尸机的IPID序列变化来判断目标端口是否开放。整个过程里目标看到的扫描源是僵尸机而不是你。这个手法隐蔽性极强但实现条件苛刻首先你需要在内网里找到一台足够“空闲”的主机其次要保证僵尸机的网络行为非常单一否则IPID预测就失效了。我实际用过几次之后的感觉是它在教学和演习环境中很有价值但在真实内网中容易被各种因素干扰不值得为了提高隐蔽性而牺牲结果的可靠性。2.4 用魔术手法绕过防火墙分片扫描与源端口欺骗内网里往往有主机防火墙默认策略可能是允许DNS流量53端口出站于是--source-port 53这个参数就成了一个很好用的技巧它让Nmap从53端口发出探测包很多配置不严格的防火墙会认为这是DNS响应流量而直接放行。这个思路说起来简单但在真实内网里命中率相当高我用它绕过了不止一台主机的入站限制。分片扫描-f则是把探测包拆成更小的分片比如将TCP头拆成两段发送。有些防火墙的规则是基于重组后的完整包来匹配的看到受损的分片包会直接放行或无法正确判定。不过分片扫描在今天的效果已经大不如前因为现代防火墙大多具备分片重组能力而且分片包本身在网络上就是一个异常特征。我把这个方法列为“了解即可”的级别新手不需要花太多时间研究它。3. 内网隐蔽扫描实操从踩点组合到结果分析3.1 第一步先摸清内网拓扑不要急着扫端口进入一个受权的内网评估环境后我做的第一件事从来不是直接nmap -sS 一堆IP而是先确认自己的网络位置。这听起来基础但决定了后续扫描策略。假设你拿到的是一台可以出网的跳板主机第一步建议确认自己的IP、网关、DNSip addr # Linux环境下查看本机IP和网段 ip route # 查看路由信息确认网关位置 cat /etc/resolv.conf # 确认内网DNS服务器拿到本机IP后你就知道自己处在哪个网段。比如本机是192.168.10.33/24那么最优先扫描的就是192.168.10.0/24这个广播域内的存活主机。对于内网中同一广播域的设备Nmap有一个非常推荐的做法使用ARP扫描-PR因为它基于ARP协议不经过IP路由速度快且不会触发网络层入侵检测对“大量IP探测”的告警。一条命令就能列出一个网段内所有在线主机及其MAC地址nmap -sn -PR 192.168.10.0/24-sn表示只看存活主机不做端口扫描。这一步跑完之后你的目标清单就出来了后续所有端口扫描都集中在这些明确存活的IP上避免盲目扫全段浪费时间也大幅减少无关噪声。3.2 第二步用低速半开扫描规避阈值告警拿到存活主机清单后再进入端口扫描阶段。这里我强烈建议设置合理的时序参数低强度慢慢推进。Nmap的时序参数从-T0到-T5默认是-T3。-T4以上适合外网带宽充足的场景内网隐蔽扫描中我一般用-T2起步它会对每个探测包之间引入固定延时避免汹涌的SYN包被安全设备识别为扫描行为。一个典型的内网隐蔽端口扫描命令是nmap -sS -T2 --source-port 53 -Pn -n --top-ports 1000 192.168.10.5参数拆开来说-sSSYN半开扫描留下最少痕迹。-T2降低发包速率规避阈值型告警。--source-port 53伪装为DNS源端口配合状态防火墙的宽松策略。-Pn跳过主机存活探测直接进行端口扫描。因为在上一步已经确定了目标存活这里不再额外发包。-n不做DNS反向解析避免DNS查询记录暴露扫描行为。--top-ports 1000只扫描最常用的1000个端口覆盖绝大多数服务又比全端口扫描省时得多。这套组合我在多次内网评估中实测比默认扫描的告警触发率低非常多。需要注意--source-port 53并不是对所有防火墙都有效如果你发现目标主机本身在Windows防火墙规则里明确限制了来源IP那么伪造源端口也帮不上忙它只对“基于端口可信度”的防御有效。3.3 第三步识别服务版本和操作系统指纹端口扫描只能告诉你某个端口开着真正的漏洞评估还需要确定端口后面跑的是什么服务。这一步用-sV做服务版本检测用-O做操作系统指纹识别。这里有一个内网场景的特殊考量这两个功能会主动向目标发送大量特征探测包隐蔽性比纯端口扫描差不少所以在严格的安全评估中会先以低强度完成发现任务确认值得深入的目标后再针对性做版本识别。命令示例nmap -sS -sV -O -T3 -Pn -p 22,80,443,445,3389 192.168.10.5-p指定端口列表这里只取最有可能对外开放的几个。这样做的意义是把探测集中在少数目标端口上减少全端口扫描配合版本检测造成的海量流量。结果出来后你会看到类似22/tcp open ssh OpenSSH 8.9这样的输出这些信息足够支撑后续的隐患分析。如果目标跑的是非标准端口服务-sV也能通过指纹库识别出真实应用对排查内网里的影子服务很有帮助。3.4 第四步组合参数完成一次全流程隐蔽扫描把前面几个步骤连起来实际执行时我不会拆成太多轮次而是结合现场情况组合。比如在确认目标存活、且明确目标是Linux服务器后我会选择一次完成端口发现和版本识别nmap -sS -sV -T2 --source-port 53 -Pn -n -p- --exclude-ports 1-100,5060 192.168.10.0/24这个命令做了全端口扫描但排除了一些通常不用且容易产生误报警的区间。全端口扫描意味着每个目标65535个端口逐个探测时间成本很高发行这种扫描我一般只针对资产量少的小网段而且一定要搭配-T2控制速率。如果你在内网评估中追求隐蔽又一个网段动辄几十台机器建议还是先--top-ports 1000走一遍把真正开放的端口找出来后续再对重点机器做全量扫描。扫描结果中常见的端口状态有open、filtered、open|filtered。做内网分析时我最关注的是open端口特别是那些映射到内网服务但没经过正规审批的端口。filtered多半意味着防火墙参与了拦截有可能是规则的正常拦截这种情况下我会换个探测方式来确认目标端口是开放还是被隐藏。3.5 内网专属技巧ARP欺骗下的网络层隐身如果目标机和你处在同一个二层网络还有一个平时很少被提到的选项直接在ARP层面做手脚把自己伪装成网关或其他主机再发出扫描流量。用nmap --spoof-mac可以伪造MAC地址配合ARP缓存投毒的思路让目标认为你是可信的网关设备。这个操作隐蔽性强但它已经是高级攻击手法我在这里只作知识性说明它要求你对目标网络非常了解且必须在授权书中允许的范围内操作否则极易触及法律边界。对于一般的安全自查和蓝队演练我建议还是把重点放在前面那些基于TCP协议特性的隐蔽手段上性价比更高风险更可控。4. 实战中的坑常见问题与排查技巧4.1 明明内网在线Nmap却显示所有端口都被过滤这是内网扫描中最常见的问题。原因通常是目标机的防火墙默认策略丢弃入栈探测包。排查思路分三步走先用ping确认主机是否存活如果ICMP不通但ARP能解析到说明主机在线且屏蔽了ICMP。尝试-Pn跳过主机存活探测直接扫描端口确认是否有端口是open状态。如果仍是filtered换一种探测方式交叉验证用-sA发ACK包来判断防火墙策略再用-sS对比结果。我印象很深的一次是排查一个Windows主机的445端口默认-sS显示过滤但用-sA发现它能回RST说明端口实际开放只是SYN包被前置的防火墙设备拦截了。这种时候你直接判断“端口被过滤就等于端口关闭”是会出大错的因为内网里常常有多层防护扫描结果反映的是链路策略不是服务状态。4.2 隐蔽扫描速度太慢如何提速而不暴露用-T2扫描一个大网段时等到天荒地老也是常有的事。提速的思路不是把T2改成T4而是缩小扫描面。先把目标按照业务重要性排序只扫关键的几十台机器再用--min-rate和--max-rate精确控制发包速率让Nmap能维持一个既不超过告警阈值又不至于龟速的发送节奏。比如nmap -sS -Pn --min-rate 50 --max-rate 200 192.168.10.0/24这个命令把探测速率限制在每秒50到200包之间比起纯-T2的默认延时快得多又不会像-T4那样一口气打出上千个包。在多个内网项目中我用这个参数组合能让整个C段扫描在十几分钟内完成而默认的-T2可能要一小时以上。除了速率还可以按端口分组并发比如同时启动三个Nmap实例分别扫不同端口段但要注意本机的网络带宽和防火墙会不会先把你自己的流量告警了。4.3 如何判断自己是否被ID扫描到蓝队视角看完前面的隐蔽手法很多人会问一个问题既然扫描方能这样隐蔽防守方是不是完全看不见答案是否定的。-sS半开扫描虽然没有完整连接但它的SYN包在短时间内大量涌向不同端口这个频率特征本身就是破绽。我守蓝队时经常在核心交换机上做端口镜像然后用抓包工具统计每个源IP每秒发出的SYN包数量只要超过阈值就丢进可疑名单。所以如果要检测内网里是否有人在用Nmap扫描你重点看“频率异常”而不是“连接是否成功”。流入的SYN包带着不同的目标端口但来源IP集中在同一个地址且不产生后续的数据流这种模式几乎就是半开扫描的实锤。还有一个特征是用-sV做版本探测时目标会收到大量带有特殊TCP选项的探测包和真实业务流量有明显区别。4.4 结果误判open|filtered状态到底信不信端口扫描最让人头疼的就是open|filtered这个状态。它意味着Nmap收到了响应但无法判断是端口真正开放还是防火墙拦截后返回的应答。我不是吓唬你在一个实际项目里我曾把一批open|filtered当成开放端口去深挖结果浪费了大量时间在防火墙规则上后来发现那批IP都是同一台虚拟化宿主机上的虚拟机它们共享同一个外网口所有流量都由宿主机防火墙统一处理导致状态模糊。针对open|filtered我的标准处理方法是先检查这个端口是否在上一步的存活主机清单上出现过服务特征再用-sV强制做一次版本探测如果仍然无法确定就直接用nc手工尝试连接一次。手工验证的结果永远比自动判断可靠尤其是涉及445、139、22、3389这些常见入侵面时值得多花这几秒钟。5. 合规边界与个人心得最后必须说一句可能扫兴但极其重要的话以上所有技巧都建立在“你有权对这个网络执行扫描”的前提下。在国内未经授权对任何非自有网络进行扫描都可能构成违法哪怕是内网里的设备也要看你有没有书面授权。公司分配给安全团队的评估任务、教学实验室里的多机环境、你在自己搭的虚拟网络里练习——这些是我建议你使用这些技能的全部场景。我自己在带新人时往往会让他们用虚拟机搭一个小型内网一台装标准服务、一台装防火墙、一台用Snort收集告警然后用自己的Nmap扫描自己的网络观察告警怎么产生、怎么绕过、怎么被检测。这个过程跑一遍比背一百条命令都管用。说到底Nmap是一个放大你安全理解的工具你越清楚它怎么被防守方看见越能真正驾驭它的隐蔽能力而这一步只能靠你亲手敲命令、看结果来积累。
阅读完成 · 觉得有帮助?
咨询建站