☰
网络攻击链五步拆解:从端口扫描到蠕虫传播的检测与应急
2026/11/3 10:57:42 网站建设 项目流程

简介:《最常见网络攻击详细分析》是一份面向网络安全初学者、运维人员和相关课程学习者的专题课件,聚焦常见网络攻击的识别与防范,帮助读者建立从攻击链到防护措施的整体认知。压缩包内共1个PPT文件,约2.28MB,以章节化幻灯片呈现,便于课堂讲授或自学翻阅。课件围绕网络攻击步骤展开,系统梳理预攻击探测、漏洞扫描、木马攻击、拒绝服务攻击、欺骗攻击与蠕虫病毒攻击等类型,并对Ping探测、端口扫描、操作系统识别、资源与用户信息查找等环节作重点说明;其中开放扫描、半开放扫描、秘密扫描及TCP connect、SYN、FIN、XMAS、FTP反弹等扫描方式均有涉及。内容还结合典型攻击流程,讨论防火墙、入侵检测、防病毒与漏洞扫描等防护思路。目前已有2676人学习,适合希望系统了解常见攻击手法与基础防护体系的读者参考。

1. 一次完整的入侵只有五步:把攻击链拆开,防守才有落点

复盘过一次真实的网络攻击之后,我对「安全」这两个字的理解变了不少。那个团队买了检测设备、装了防病毒、每季度做一次漏洞扫描,最后被打穿的那台机器,在事发前两周就被人用最原始的方式 ping 了上千次,日志一直躺在那里,没人翻。事后大家一起看时间线,从第一次探测到拿到数据,中间隔了十一天,五步走完,一步没落下。

这篇要讲的就是这五步:探测、渗透、驻留、传播、瘫痪。每一步我都会说清楚攻击方在这个阶段想拿到什么、防守方在这个阶段能看见什么、以及怎么在自己的环境里复现一次验证。刚接手安全运营的人可以照着搭建检测点,做过几年的人能看到每一步的判断依据在哪里。真正的门槛从来不是工具,是知道该盯哪个位置。

2. 预攻击探测:从一次 ping 到一张完整的端口地图

攻击链的第一段最不起眼,也最容易被放过。探测阶段的全部目的只有一个:把「一片未知的网段」压缩成「几台有名字、有端口、有系统类型的机器」。这个过程不需要任何漏洞,也不需要任何权限,用的全是协议本身允许的正常交互。防守方如果在这一段没有感知,后面四步基本只能被动挨打。

2.1 Ping sweep:最便宜的踩点,也是最早的暴露点

Ping 的原理没什么可讲的,发 ICMP Echo,等 Echo Reply,通就是活的。真正值得说的是它的成本:一条命令、一秒钟、覆盖一个 C 段,攻击方几乎零成本就能拿到一份存活主机清单。我在做资产梳理的时候经常反过来用这件事,先自己 ping 一遍自己的网段,看看有多少台机器是我不知道的。

下面这段循环是存活探测最常见的写法,注意它只能在自有实验网段里跑,参数含义我会逐条解释:

# 在自有实验网段内复现存活探测,观察它会产生什么痕迹 # 192.168.10.0/24 替换成你自己的实验网段,禁止对非授权网段使用 for i in $(seq 1 254); do ping -c 1 -W 1 192.168.10.$i > /dev/null 2>&1 && echo "192.168.10.$i alive" done

-c 1表示只发一个包,-W 1表示最多等一秒回包,这两个参数决定了整轮扫描的耗时。254 个地址按一秒超时算,最坏情况四分多钟跑完;如果把-W调到 0.2,一分钟内就能出结果。这个时长直接决定了它在日志里长什么样:单源 IP 在极短窗口内对整段地址发起 ICMP,这就是扫描的典型指纹。

Ping 不通不代表机器不存在,这一点新手最容易判断错。路由没配、网卡没起来、防火墙直接丢了 ICMP,都会表现为「不通」。所以成熟的探测不会只用 ping,而是 ping 加端口加 ARP 一起看,任何一个维度有回应都算存活。

防守侧对应三条动作:在边界和核心区记录 ICMP 的源地址、目的地址和频次;把「单源对多目的」的组合单独拉一条告警规则;对不提供服务的网段直接关掉 ICMP 响应,减少可利用的信息面。

提示:历史上有过用超大尺寸 ICMP 包打崩老旧系统的做法,现代系统基本已经免疫,但它提醒了一件事——协议实现的边界值永远是风险点,老设备尤其如此。

2.2 端口扫描的三种姿势:开放、半开放、秘密差在哪

端口扫描的分类不是学术问题,它直接决定了你在日志里能不能看见。三种类型对应三种连接状态,我整理成一张表,这个对比在排查时非常有用:

类型连接是否建立典型特征日志可见性需要的权限
开放扫描完整三次握手每条记录都能看到一次正常连接高,服务端必留痕普通用户即可
半开放扫描只到 SYN|ACK,随即 RST大量 SYN 后紧跟 RST,连接未完成中,需抓包或防火墙日志构造原始包需要高权限
秘密扫描不带标准握手字段FIN/ACK/NULL 等异常标志位组合低,易被中间设备丢弃同上,且结果不稳定

开放扫描最笨也最诚实。调用一次正常的连接函数,端口开着就连上,关着就失败,实现简单、结果准确,代价是服务端会把每一次尝试都记下来。同一个源轮流连接几百个端口,这在任何运维眼里都是一眼假。

半开放扫描的关键在于「不把连接走完」。发一个 SYN,收到 SYN|ACK 就说明端口开着,此时直接回 RST 掐断,三次握手永远停在第二步。很多系统只记录完整建立的连接,所以这一招能绕开一部分审计。它在协议层留下的痕迹是明确的:大量只有 SYN 没有后续 ACK 的首包。

秘密扫描更极端,连标准握手都不带,靠目标对不同标志位组合的响应差异来推断端口状态。隐蔽性上去了,代价是可靠性下来了——中间任何一台设备把异常包丢掉,你就会得到错误的结论,把开着的端口判成关闭。

2.3 把扫描痕迹抓出来:一份可复现的检测脚本

与其纠结攻击方用哪种扫描,不如直接把判定逻辑写出来。端口扫描的行为特征在数据层面非常稳定:单源、短窗口、多端口。把这三个维度做成统计,误报率能压到很低。

import re from collections import defaultdict # 从防火墙日志中抽取「源IP + 目的端口」,统计每个源覆盖了多少个不同端口 # 日志样例:2024-05-11 10:22:31 DROP SRC=10.0.0.9 DST=10.0.0.20 DPT=445 pat = re.compile(r"SRC=(\S+).*?DPT=(\d+)") hits = defaultdict(set) with open("fw.log", encoding="utf-8") as f: for line in f: m = pat.search(line) if m: hits[m.group(1)].add(m.group(2)) # 阈值 20 是起步值:单源在观察窗口内命中 20 个以上不同端口,判为疑似扫描 for src, ports in sorted(hits.items(), key=lambda x: -len(x[1])): if len(ports) >= 20: print(f"{src} 命中 {len(ports)} 个端口 -> 疑似端口扫描")

正则里的SRC和DPT要换成你自己设备实际输出的字段名,这一步不统一,脚本必然跑空。阈值 20 不是标准答案,业务系统如果本身就有大量短连接,得往上调;反过来,如果只关心高危端口,可以只保留 22、445、3389、3306 这几个做定向统计,灵敏度会高很多。

误报主要来自三类正常流量:监控探针的周期探测、负载均衡的健康检查、资产测绘系统的定期扫描。处理方式不是调高阈值,而是把这些合法源做成白名单台账,扫描告警只对台账外的源生效。这个台账我一般要求跟资产清单同步更新,否则半年后一定变成一锅粥。

抓包那条路也值得备一手,尤其是怀疑自己设备日志不全的时候:

# 抓 60 秒的 TCP 首包:只要 SYN 不要 ACK,半开扫描会大量命中这条规则 timeout 60 tcpdump -i eth0 -nn \ 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack == 0' -c 200

-c 200是抓到 200 个包就停,timeout 60是兜底,防止在低流量环境里一直挂着。这条过滤表达式的作用是筛出所有「连接发起包」,正常情况下它的数量和新建连接数同量级;如果某台源地址在几十秒里贡献了几百个,基本可以直接定性。

3. 从探测到渗透:扫描结果怎么变成一条可走的攻击路径

拿到端口地图只是原料,渗透阶段要做的是把原料加工成一条能走通的路。这一段的核心动作有三个:把开放端口映射到具体服务和版本、在版本上匹配已知问题、找到一条从普通权限到高权限的路径。整个过程里,攻击方最想要的东西是「确定性」——他要清楚知道哪一步会成功,而不是挨个试。

3.1 综合漏洞扫描:把端口结果变成一份可执行的清单

端口扫描只告诉你门开着,综合扫描才告诉你门后面有没有人。它做的事情可以拆成四层:先识别服务指纹,再匹配版本对应的已知问题,然后做无害化的验证请求,最后按可利用性排序输出。这个排序很关键,一份按严重程度排的清单和一份按「能直接打穿」排的清单,处置效率差好几倍。

自查的时候我一般按这个顺序推进:先拿资产清单和扫描结果做比对,找出「扫描到了但清单里没有」的机器,这类影子资产优先级最高,因为没人认领就没人打补丁;再看同一服务版本在整个网段里的分布,一个版本出现二十次意味着一次修补能消掉二十个风险点;最后才看单台的漏洞列表。

扫描本身也有风险,这一点经常被忽略。带验证 payload 的扫描对老旧系统可能造成服务中断,我曾经见过一次针对老旧打印服务的扫描直接把设备打挂,业务那边过了半小时才发现。所以生产环境的扫描要分两批:第一批只做指纹识别,不发送任何可能触发异常的请求;第二批在维护窗口里对确认的资产做深度验证。

扫描器的结果不能直接当结论用。误报和漏报同时存在:误报多半来自版本号识别错误,把打了补丁的新版本认成老版本;漏报多半来自设备把请求拦掉了,扫描器以为端口关闭。判断一份报告可不可信,我的做法是抽三条出来人工验证,一条对得上就继续看,对不上就整份重扫。

3.2 口令与权限:从普通账号到高权限的那几级台阶

真实环境里,口令问题造成的失守比例一直排在前面,原因很朴素:它不需要任何漏洞,只需要一个弱密码。攻击方在这一步的常用手法是拿一批常见用户名去撞常见口令,撞开一个普通账号之后再想办法提权。

这里的关键认知是:拿到普通账号不等于结束,反而是开始。攻击方接下来的动作通常是翻本机的配置文件找数据库连接串、翻历史命令找运维习惯、看本地有哪些服务是以高权限跑的、检查有没有可写的定时任务。一条路径走不通就换一条,直到拿到管理员权限。

防守方在这件事上的自查可以做得很具体。把系统账号导出来,和人事的在职名单对一遍,离职没删的账号是最常见的入口;把口令策略的复杂度要求和实际最短长度对一遍,很多地方策略写着十二位,实际执行的是八位;把「同一口令在多台机器复用」的情况统计出来,这个数字往往比想象中高得多。

注意:口令强度评估要在授权范围内做,导出的凭据文件不要落地到个人终端,评估完成后立即清理,别留成新的风险点。

3.3 缓冲区溢出与提权:老问题为什么还在生效

这是整个渗透阶段技术含量最高的一块,也是很多年没变过的一块。原理说白了就是程序往一块固定大小的内存里写数据,写超了就会覆盖到相邻区域,如果被覆盖的恰好是控制程序跳转的地址,攻击方就能让程序去执行他自己准备的指令。

这个手法老到什么程度?上世纪八十年代末就有公开的系统性论述,三十多年过去,防护手段堆了一堆:栈保护、地址随机化、不可执行内存。但它在真实攻防里依然有效,原因不是防护没用,而是总有程序没编译进去这些保护,尤其是那些跑了十年没人动过的内部系统、第三方提供的闭源组件、以及各种嵌入式设备的管理界面。

自查思路比攻击思路更实用。第一,把所有对外暴露的服务版本拉出来,和厂商的安全公告对一遍,重点看那些已经停止维护的版本,这类版本不会有新补丁,只能靠隔离。第二,检查编译选项,自己团队开发的对外服务如果没开栈保护和地址随机化,这就是一个明确的待办项。第三,也是最容易被跳过的一步——排查那些「只在内部用」的服务,攻击方一旦拿到一台内网机器,这些内部服务立刻变成对外服务。

权限提升的思路同理。攻击方拿到低权限账号之后,会系统性地检查三类东西:有没有配置错误的高权限服务、有没有可写的高权限文件或目录、有没有内核层面的已知问题。前两类属于配置问题,改起来成本低见效快;第三类只能靠补丁节奏。

4. 驻留与传播:木马、后门与蠕虫各自的落脚点

渗透成功只是拿到了当下的控制权,攻击方要的是「下次还能进来」。驻留阶段做的就是这件事,而传播阶段则是把单点失守放大成一片。这两个阶段是防守方最有机会翻盘的地方,因为驻留必然留下痕迹,传播必然产生异常流量。

4.1 后门与木马最爱的几个落点

后门和木马的区别在于有没有伪装和远程控制能力,但在落脚点上它们高度重合。多年的应急现场看下来,高发位置就那么几个,做成一清单逐项排查,效率比盲目扫盘高得多:

落点具体形式排查方式
账号层新增账号、被加入管理组的既有账号定期导出账号与权限组做基线比对
凭据层授权公钥文件、保存的会话凭据检查授权文件的修改时间和内容
启动层开机启动项、注册表启动键、系统服务与出厂或装机基线做差异对比
调度层计划任务、定时器检查非业务时段的周期任务
应用层Web 目录下的异常脚本文件文件完整性监控 + 修改时间排序
通道层反弹连接、隐蔽隧道检查异常外联和长连接

这张表的价值在于它把「找后门」这件听起来很玄的事,变成了六个可以逐项确认的动作。我的习惯是每季度按这张表走一遍,每次不超过两小时,比出事之后熬夜翻日志划算得多。

木马的投递方式也值得说一句。邮件附件和伪装安装包至今仍是主流,原因不是技术高明,而是它绕过了所有技术防护,直接对人下手。一个伪装成发票的压缩包,里面的可执行文件带个文档图标,仍然有人双击。这块唯一的解是持续的安全意识训练,而且要带演练,光发通知没用。

4.2 拒绝服务与欺骗:不打穿你,只让你不可用

这两类攻击的思路和其他攻击完全不同:它们不追求拿到权限,只追求让你的系统不可用,或者让错误的信息流向正确的地方。

拒绝服务的实现路径分三层。流量型是靠体量压垮带宽,几十万个请求同时涌进来,链路先饱和,后面什么都谈不上;连接型是靠半开连接占满连接表,每个连接占一个位置又不释放,等表满了正常用户就进不来;应用层最刁钻,请求量不大但每一个都极耗资源,比如一次触发全表查询的搜索请求,几百个并发就能把数据库拖死。

防守上,流量型只能靠上游清洗,本地设备再强也扛不住链路被打满;连接型靠连接数限制和超时回收;应用层靠限流、缓存和查询优化。三类要分开治,混在一起做方案必然失效。

欺骗攻击的核心是「让接收方相信一个假的身份」。地址欺骗让回复流向别处,域名欺骗把用户引到仿冒站点,链路层欺骗则在局域网内冒充网关截获流量。这类攻击的防守重点在接入层:静态绑定、端口安全、动态检测,把「谁是谁」这件事在交换机和网关上都固定下来,冒充的成本就会大幅上升。

4.3 蠕虫式传播:自动化代码把单点失守放大成面

蠕虫和前两类最大的不同是「不需要人」。它会自己找下一个目标、自己完成投递、自己执行,整个过程没有人工介入。这个特性决定了它的破坏曲线:前几小时可能只有几台,一天之后可能是整个网段。

历史上造成过大范围影响的自动复制型恶意代码,传播逻辑基本一致:扫描随机或邻近网段的同一端口、尝试同一个利用点、成功后在本机复制自身并继续扫描。这个模式有一个天然的检测优势——扫描行为本身极其规律,同一个源在极短时间内对大量地址的同一端口发起连接,这个特征在流量层面非常显眼。

防守的关键不是杀毒软件,而是分段。把网络切成足够小的区域,让一台机器失守最多影响一个区域;在区域边界上做端口方向的限制,让横向移动无法完成;对共享目录和移动存储做写入限制,这两条是蠕虫最爱的传播路径。

补丁节奏同样重要。蠕虫利用的几乎全是「补丁已经发布但没打」的问题,从公告到大规模利用之间的窗口期,就是这个病毒的黄金传播期。把高危补丁的落地时间从「季度」压到「两周」,能挡掉相当一部分。

5. 排查与避坑:五条从应急现场捡回来的教训

下面这五条,每一条都对应一次真实的翻车现场。写出来不是为了说谁做得不好,而是这些坑太普遍,几乎每个团队都会踩一遍。

5.1 告警天天响,真出事那天没响

现象:扫描类告警日均几百条,值班同事早就麻木了,真被打的那天,告警淹没在噪音里没人看。

原因:只设了阈值没设白名单。监控探针、健康检查、资产测绘系统每天都在扫,它们贡献了 95% 的告警量,真正的异常被稀释掉了。

解决:给所有合法扫描源建台账,告警规则只对台账外生效。台账要跟资产系统联动,新增探针自动登记,避免人工维护滞后。做完这一步,告警量通常会掉一个数量级,剩下的每一条都值得看。

5.2 日志里全是成功登录,看不出异常

现象:事后回溯时发现,攻击方用的是合法账号密码登录,日志记录的是「登录成功」,没有任何异常标记。

原因:审计策略只关注失败登录,成功登录不做基线。攻击方用一个撞开的普通账号登录,从日志角度看完全正常。

解决:给成功登录也建基线——哪些账号在什么时段、从哪些网段登录是正常的。偏离基线的成功登录(异地、非工作时段、非惯用设备)比失败登录更有价值。这个改动不增加任何成本,只是把审计的视角换了一下。

5.3 封了源地址,第二天换个地址又来了

现象:应急时封了一批攻击源 IP,第二天攻击从同网段的其他地址继续,封禁名单越拉越长。

原因:只做单 IP 封禁,没有做行为维度的识别。地址可以换,但扫描的节奏、使用的工具指纹、请求的特征很难同时换掉。

解决:封禁分两层,IP 层做短期阻断,行为层做长期识别。对同一网段的高频异常统一在边界做限速,对特征明确的请求直接丢弃。封禁名单要设过期时间,否则半年后会积累上千条无效规则,反过来拖慢设备性能。

5.4 补丁打完了,还是被打穿

现象:操作系统补丁按时打,应急时发现入口是一个第三方组件的老版本,压根不在补丁管理范围里。

原因:补丁管理只覆盖了操作系统,中间件、数据库、开源组件、容器基础镜像全在视野之外。而这些恰恰是暴露面最大的部分。

解决:把资产清单从「主机维度」改成「组件维度」,一台机器上跑的每一个对外服务都要单独列一行,带上版本号和维护责任人。组件清单的维护成本比主机清单高,但它是唯一能覆盖真实暴露面的做法。

5.5 应急时抓不到包,回溯全靠猜

现象:事件发生后想还原攻击过程,发现关键节点的流量没有留存,只能靠零散的应用日志拼凑,结论站不住。

原因:流量留存周期太短,或者只在核心出口留了,东西向流量完全没记录。

解决:全量留存成本太高,务实做法是分层——关键边界留完整会话元数据(五元组、时间、字节数),保留周期拉到九十天;核心业务区做抽样留存;东西向流量至少留下连接记录。元数据的体积远小于全流量,但定位问题时能回答「谁在什么时候连了谁」这个最核心的问题。

6. 收口:一张攻击链对照表和一套 30 分钟自检流程

五步走完,回头再看,最值得记住的不是某个具体手法,而是每一步在防守侧都对应一个明确的观测点。我把这张对照表放在手边,做方案评审或者应急复盘时对着看,很少会漏项:

阶段攻击方目标防守侧观测点优先级
探测拿到存活主机与端口地图ICMP 频次、单源多端口、异常标志位包高
渗透拿到一个可用权限漏洞扫描差异、口令撞库失败峰值、异常提权高
驻留保证下次能进来账号基线、启动项差异、外联长连接最高
传播从一台扩到一片同源对多目的的同端口连接、共享目录写入中
瘫痪让服务不可用流量突增、连接表占用、慢查询堆积中

表里「驻留」的优先级我标了最高,这是有原因的。探测和瘫痪都是一次性的,驻留是持续的——一个没被清掉的后门,意味着前面所有的清理工作都白做。应急时把最多的精力放在确认「有没有第二个入口」上,比急着恢复业务更重要。

具体到一个能立刻执行的动作,我给一个 30 分钟的自检流程,按顺序走:

第一步,十分钟,从边界设备导出最近 24 小时的连接记录,按源地址聚合,看有没有单源对超过 20 个目的端口的情况。有就记下来,逐个确认是不是合法扫描源。

第二步,十分钟,从核心系统导出账号列表和权限组,和人事名单对一遍,重点看三类:离职未删、长期未登录、权限组超出岗位需要。这三类每一类都是入口。

第三步,十分钟,把对外暴露的服务清单拉出来,只看版本号,和厂商公告对一遍,标出所有已经停止维护的版本。这类服务不需要知道具体漏洞,直接规划隔离或替换就行。

这套流程不能替代完整的安全建设,但它的好处是当天就能做,当天就有结论。我带队的时候要求每个季度至少走一遍,坚持下来最大的收获不是发现了多少问题,而是让团队对「自己管的东西长什么样」始终保持一个准确的认知。

从那以后我每次接手一个新环境,第一件事不是看设备清单,而是自己跑一遍这三步——先知道有什么,再谈防什么。这个习惯救过我很多次,也让我少说了不少没底气的判断。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询