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

基于图论的网络攻击路径分析:从建模到关键节点识别

基于图论的网络攻击路径分析:从建模到关键节点识别 ★ FEATURED ARTICLE
干了这么多年安全分析我越来越觉得“攻击路径”这个词被说滥了。很多汇报里把攻击路径画成一条顺滑的曲线但从防火墙日志里拉几条告警串在一起那不叫路径分析那叫拼接。真正要回答“攻击者到底怎么一步步从边界摸到核心库”这个问题必须用图论把网络拓扑、漏洞利用条件、权限变化这些零散信息抽象成一张图然后在这张图上做计算。这就是今天要聊的基于图论的网络攻击路径分析。这套方法不是学院派的纸上谈兵而是安全运营、红队评估、攻防演练里真的能拿来用的技术。它适合三类人一是做渗透测试想输出更严谨报告的人二是蓝队同学想从海量告警里找出真正致命路径的人三是搞安全产品的朋友想设计攻击面分析模块的人。我会把建模思路、算法选型、实操步骤和踩坑经验一次讲明白。1. 为什么用图论来建模攻击路径1.1 攻击链的线性叙事不够用传统思维里攻击过程经常被描述成一条链侦查、武器化、投放、利用、安装、命令控制、目标达成。这个模型适合讲故事适合做安全意识培训但真拿它去指导防护时你会发现两个问题。第一真实攻击不是一个严格的单向顺序。攻击者可能同时横向移动多条线可能在某台机器上待很久等待一个时机甚至可能从内网反打一跳回到边界。用一条线性链去描述会漏掉大量“分支”和“回环”。第二攻击链没有把“环境条件”放进去。同一个漏洞在一台有杀软和EDR的终端上利用和在一台裸奔的旧服务器上利用难度完全不一样。攻击链模型里这些信息无处安放。图论模型天然适合处理这些复杂关系。把每个“攻击者能到达的状态”看成顶点把“从一个状态到另一个状态的跳转”看成边整张网络里的所有可能攻击线索就变成了一张有向图。这时候路径分析就从“拼情报”变成了“算图”。1.2 图论视角能带来什么增量价值用图模型之后最大的变化是你终于能回答“攻击者最有可能怎么打”这个问题了。举个例子内网有100台服务器漏洞扫描报告显示300个漏洞。按常规思路你会先修高风险漏洞但风险高不代表它能被利用到核心。真正的分析应该先把所有主机、漏洞、访问关系画成攻击图然后你可能会发现一台高危漏洞的测试机根本不与任何核心网段连通它是死角而另一台中危漏洞的文件服务器处在多个子网的交汇点上它才是关键一跳。没看图之前你很难凭直觉做出这个判断。图论还能算出很多有攻击性的指标。比如“所有路径都经过的节点”也就是割点堵住这个点攻击者就过不去了。比如“介数中心性高的节点”它不一定是最开始的入口也不是最终目标但它是大量路径的中转站值得重点盯防。这些都是传统渗透报告里不会出现的视角。2. 数据采集与攻击图建模要素2.1 节点定义状态、资产、还是漏洞利用建图之前先得回答一个重要问题节点的粒度是什么我见过两种主流建模方式一种偏状态机一种偏资产关系。状态机模型源自MulVAL这类工具。它把节点分成两类一类是攻击者当前拥有的权限状态比如“root权限在某台机器上”“普通用户在域控上”另一类是漏洞利用动作比如“利用Web服务的远程代码执行漏洞提升权限”。节点之间用有向边连接表达“拥有某个权限状态之后通过某个利用动作可以到达新的权限状态”。这个模型的优点是严谨能表达复杂的逻辑前提缺点是图会非常复杂一个中型网络就能生成上万个节点。资产关系模型更务实。每个主机是一个节点每条可用漏洞利用是一条边边的方向是攻击者可跨越的方向。再加上访问控制关系、信任关系作为边的存在条件。比如Web服务器可以访问数据库服务器的3306端口而且数据库存在弱口令那就有一条指向数据库的边。这个模型更粗一点但更贴合安全运营人员的思维习惯也更容易和漏洞扫描器、网络拓扑的数据对齐。我的建议是做日常风险分析用资产关系模型就够了做深入推演或合规级评估才需要状态机模型。不要一上来就追求最细的粒度图爆炸之后你会崩溃的。2.2 边的权重与属性设计图论算法需要量化边的“代价”或“可能性”所以每条边不能只画个箭头必须给它附上属性。我常用三组属性来表征一条利用边。第一是难度。这个可以基于CVSS基础分数换算但不能直接照搬。CVSS 10分的漏洞如果没人能写出利用代码那它在实战中的可利用性其实低于一个CVSS 7但已有成熟利用代码的漏洞。所以难度建议改写成“可利用性等级”公开武器化利用是1分有概念验证代码是2分只有理论分析是3分数值越小越容易。第二是隐蔽性。这个边一旦被利用被安全设备发现的概率高不高。比如利用Web应用漏洞发起命令执行很容易被边界设备记录隐蔽性就差而利用内网Windows域信任关系横向移动大多数传统设备不会拦隐蔽性就好。隐蔽性也是数值越小越有利。第三是前置条件。比如边A要求“攻击者已经获得了Web服务器www权限”边B要求“时间窗口内目标存在一个已登录的管理员会话”。建模时这些条件可以作为边的约束或逻辑判断存在。在简化模型里我会把它们转换成边的一个布尔属性置为false就表示当前不满足。综合起来边的代价可以用一个加权公式算比如 总代价 0.6×难度系数 0.4×隐蔽性系数。数值越低攻击者越倾向走这条路。后面算最短路径时这个代价就直接作为图的权重用。2.3 常见图类型的取舍攻击路径分析领域有几种相似的图很多人分不清。先说攻击树它是以一个最终目标为根把达成目标的攻击手法分解成与或树。攻击树适合做单目标的威胁建模比如“我要攻破某台数据库服务器”但它不适合表达多个网络位置之间的传递关系。攻击图则是有向图可以有多个起点、多个目标能表达横向移动和分支路径是最适合做全网络路径分析的。攻击图又分为状态攻击图和属性攻击图上文已经提到过。还有一种贝叶斯网络本质上是给攻击图加上条件概率的强化版。边上的权重不再是固定代价而是利用成功的概率和后验影响。遍历整张图能算出某个节点被攻陷的综合概率。这种模型更精细但需要大量概率先验数据实战中很难拿到准确值所以我通常只在评估少量高价值路径时使用不会全网都用。3. 核心算法路径求解与关键节点识别3.1 从最短路径到最可能路径图建好、权重定好之后最常见的问题是攻击者从外部入口到域管这台主机有哪几条路哪条路最“经济”计算机最擅长的是求最短路径。经典算法BFS可以处理无权图Dijkstra可以处理非负权重图。但很多人踩过一个坑把“最短”理解成“最可能”。在攻击图里边数最少的路径不一定是最容易被利用的路径。可能一条五步的路径每一步都是成熟利用工具而一条两步的路径其中一步需要难度极高的0day。所以正确的做法是把边的权重定义成攻击者的“成本”或“阻力”然后用加权最短路径算法求出来的才是攻击者最可能采用的路径。具体实现上我用Python的networkx库比较多。图结构是一个有向带权图节点用hostname和权限级别命名边带weight属性。调nx.shortest_path或nx.dijkstra_path就行。如果图特别大可以换用heapq自己写A*用目标节点的语义距离做启发式能快很多。还要注意一点不要只求一条最短路径要输出前K条备选路径。因为攻击者不是一定能走上那条“最优”的有些装备、经验差异会导致他们选次优方案。用networkx的shortest_simple_paths可以枚举所有简单路径配合权重排序取前K条。我在实际项目中一般取前10条再人工筛选效果很好。3.2 拓扑属性割点、桥、中心性最短路径能回答“哪条路最可能”接下来要回答“我该堵哪里”。这时候要看图的拓扑结构。割点是指如果把该点去掉图会分裂成多个不连通部分。在攻击图里割点就是攻击路径的必经之路。举个例子攻击者想从外部到数据库不管是经过A主机还是B主机最终必须经过挑板机C那C就是割点。只要给C做加固或网络隔离攻击者就过不去。桥同理是一条删了就会断路的边。介数中心性衡量一个节点在多少对节点之间的最短路径上。中心性高的节点往往不是高危漏洞最多的机器而是网络里承担“摆渡”功能的机器。比如一台没有上任何漏洞榜单的老旧文件服务器但所有子网热数据都会通过它访问那么它是各种攻击路径的高频中转载机更需要被盯牢。计算这些指标同样可以用networkxC nx.biconnected_components可以找割点nx.betweenness_centrality算介数。但注意攻击图的节点数量通常不是特别大这些算法都能跑完。如果图有几万个节点介数中心性计算会非常慢可以先只对最短路径经过的节点子集计算效率高得多。3.3 多起点、多目标的图搜索真实网络不是只有“攻破一台机器”这个单一目标。攻击者可能从多个入口进入最终目标列表也可能有多台数据库、多个域控。这时候可以把所有入口节点连接到一个超级源点所有目标节点连接到一个超级汇点再把整个图当成单源单汇来做路径分析。这样处理之后图的语义变成“从任意边界可达点到任意核心资产的最可能路径”这正好是一个可量化的“攻击暴露面”的度量。我经常把这个超级汇点设为“域控”“数据库服务器集群”“备份系统”很实用。4. 手把手实操从资产梳理到路径分析落地4.1 数据采集的四个来源图里的节点和边不会从天上掉下来必须靠数据喂。我把它归纳成四类。第一网络拓扑数据。至少要有网段划分、子网之间的路由和ACL控制关系。这一步解决“能否访问”的问题。可以从防火墙规则、交换机VLAN配置、代理服务器的白名单配置里抽。网络配置越复杂抽数据的痛苦越大但这步不能省。第二资产指纹数据。主机类型、操作系统、开启的服务端口。可以用扫描器加登录脚本采集也可以从配置管理数据库CMDB里拉。关键是别只拿IP列表要把主机开放端口和运行服务搞清楚。第三漏洞数据。扫描器会把IP、端口对应到CVE、CNNVD等漏洞编号。这里的难点是去重同一个IP和漏洞在多轮扫描中会重复出现建模时按主机服务漏洞编号唯一化。第四凭据与身份数据。这个问题很多人忽略。比如某台机器上了双网卡一边连办公网一边连服务器网或者域控有一个可匿名访问的共享可以提取用户列表又或者运维在每台服务器上用了同一把管理密码。这些信息都是攻击者横向移动的“燃料”必须画进图里。如果拿不到精确实凭据数据至少要标注“存在弱口令风险”这样的布尔前提。4.2 建图的步骤与脚本结构我在实际项目中不会手工画图而是写一个脚本输入是上面四类数据的结构化表格输出是一个带权有向图的JSON或者直接落成networkx的可序列化格式。整个流程分四步。第一步定义节点集合。每个节点用“主机ID_权限级别”表示权限级别可以是“匿名”“用户”“管理员”“SYSTEM”等。权限级别不同要拆成不同节点。第二步定义边集合。过程是从一个节点出发读取该主机上存在的漏洞利用关系和信任关系如果满足前置条件就添加一条指向目标主机某个权限级别的边。比如Web服务器上有Apache的一个远程命令执行漏洞攻击者只要达到该Web服务器的匿名用户权限就能利用那么添加一条从“Web服务器_匿名”到“Web服务器_Root”的边再根据ACL数据知道Web服务器可以访问内网文件服务器的SMB端口于是再加一条从“Web服务器_Root”到“文件服务器_用户”的边。第三步给边赋权重。利用漏洞的边按照漏洞利用等级填难度和隐蔽性利用信任关系的边填弱口令或域信任关系的代价ACL通道本身不是漏洞没有攻击代价但可以作为路径的一部分权重通常给一个很小的值表示可达性。第四步求解图算法。跑最短路径、关键节点识别把结果输出成报告和可视化图谱。我习惯把可视化也做出来用邻接表配合布局算法导出SVG不用GraphViz也可以直接用networkx自带的spring_layout贴近真实感。4.3 一个模拟演练复盘用一个常见的场景把整个过程串起来。假设有一个模拟企业网络外部访问区一台Web服务器DMZ区有一台邮件网关办公网有域控DC和几台终端研发网有一台代码服务器和一个数据库服务器。防火墙规则限制研发网只能由办公网特定IP访问。漏洞情况大致是这个样子Web服务器存在某个上传组件越界写入漏洞邮件网关存在远程命令执行漏洞但需要认证DC存在老旧的永恒之蓝类漏洞代码服务器部署了GitLab版本有账号接管漏洞数据库用了MySQL弱口令办公网某台终端上有人安装了向日葵远程控制软件并且没有改默认ID。把这些数据都喂进模型后生成第1条路径外部攻击者→Web服务器上传漏洞→拿到www权限→利用跳板Access到邮件网关因为邮件网关被Web服务器信任→利用DC漏洞→域管权限→通过域策略远程执行到数据库服务器→撞上MySQL弱口令→拿到数据。这条路径权重最小是最亮眼的攻击主线。第2条路径外部攻击者→邮件网关远程命令执行好吧需要认证那换个入口→从有账号接管的GitLab进入研发网→绕过ACL击中数据库服务器。这条路径更短但因为GitLab需要破解账号且数据库在独立网段边权重较大排第二。有了这两条路径修复优先级就清楚了。首先修Web服务器的上传漏洞因为它是两个主线的共同起点其次给数据库配上强口令和访问白名单然后给邮件网关做补丁升级最后是DC的漏洞虽然它只出现在第一条路径但影响足够深。这个排序和单纯按CVSS排序的结果完全不同因为图的全局信息把中间跳板的价值计算进去了。5. 这些坑我替你踩过了经验与排查5.1 图爆炸问题规模失控怎么办第一次做全网攻击图的时候很容易把图建得巨大无比。一个500台主机的网络如果把每个权限级别都拆开可能得到5000个节点。再算上漏洞利用边和信任边两三万条边也打不住。这个规模下可视化已经没法看计算也会变慢。对策是分层聚合。先把网络按业务域分成几个子图比如办公网、研发网、公共DMZ。每个子图内部可以粗粒度建图子图与子图之间重点建模边界转移关系。经常出现“内网内部的路径”被一条边直接跳过的情况这没关系你需要关注的是跨域传递而不是所有细节。另一个对策是裁剪边把权重特别大几乎不可能利用的边先忽略比如没有公开利用代码且需要物理接触的漏洞直接不建边。这样能把图缩小一个数量级。5.2 误报和漏报的来源总会有人质疑攻击图结果“不准”。我听到最多的说法是这个路径现实里根本走不通。这通常是三个原因造成的。第一个原因是数据源可信度问题。漏洞扫描器可能报了某个服务漏洞但服务其实只在非生产网段或者防火墙已经封了对应端口。解决办法是在建图前对着防火墙规则和主机防火墙状态做交叉验证。第二个原因是利用前提没有建模完整。比如虽然Web服务器能被外部访问但该服务器上的中间件版本是修复后的扫描器却用了旧版本指纹。这个问题光靠交叉验证还不够最好从CMDB里核对补丁情况。没有补丁数据时宁可把这类边标记为“低置信度”不要让它们混在强路径里。第三个原因是忽略了对攻击者身份属性的约束。攻击者是外部黑客还是内鬼其初始权限和图上的起点完全不同。分析前必须先定义场景。如果做的是外到内的链式攻击起点就只能从边界资产出发如果是内鬼场景起点就要从普通域用户出发。很多人把这两个场景揉在一张图上算出的路径四不像。我建议一张图只对应一个明确起点集合必要时拆两张图分析。5.3 结果如何落地而不只是画饼图分析做完不落地就真的成了“画饼”。我在实际工作中把分析结果和三类防护动作联动。一类是优先级修复清单。把割点节点和top-k路径经过的节点捞出来形成一份“关键路径阻断建议”交给运维侧。比如给某台主机加WAF、关闭某台中转机的双向转发、给某内网账号配置访问告警。这份清单要比漏洞扫描原始报告有说服力得多因为每条建议都能指向具体路径。二类是检测规则增强。既然知道路径会经过某跳板就在那条边所在的位置部署针对性监测。比如检测到从Web服务器到文件服务器的SMB低权限访问行为就触发告警。这比泛泛的“异常横向移动检测”更有命中率。三类是模拟演练复盘。攻防演练结束后把红队的真实攻击记录还原成图路径和预测路径对照看差了哪些边和权重。这个迭代过程会让你建的图越来越准。我通常会把每次演练的数据都存档三个月之后回看权重修正特别有价值。最后再分享一个我个人的习惯拿到一张新攻击图先别急着写报告先问自己三个问题——图的规模是否被我拍脑袋裁剪过边的权重到底依据什么数据有多少边是“我猜测的”而非“我看见的”想清楚这三个问题再决定要不要给结论。图论分析的价值在于它把攻击路径变成了结构化的数据但你喂进去的数据质量永远决定了图模型的底限。
阅读完成 · 觉得有帮助?
咨询建站