前言

  1. 技术背景:在现代网络攻防体系中,红队面临的挑战日益严峻。攻击面持续扩大,防御体系(如 EDRNDRSIEM)日益智能化,导致手动渗透测试的效率和成功率面临瓶颈。将人工智能(AI),特别是规划算法(Planning Algorithms)强化学习(Reinforcement Learning),整合到攻击决策流程中,是提升红队作战能力、实现规模化与自动化攻击的关键一步。这项技术处在攻击路径发现与漏洞利用决策的核心位置,是连接“信息收集”与“权限提升”的智能大脑。

  2. 学习价值:掌握本篇 AI辅助红队决策教程 后,你将能够解决以下核心问题:

    • 自动化规划:从海量资产和漏洞信息中,自动推导出一条或多条可行的攻击路径,告别人工“连连看”。
    • 最优决策:在多条潜在攻击路径中,根据自定义的成本(如时间、风险、隐蔽性)和收益(如目标价值),智能选择最优的攻击策略。
    • 效率提升:将原本需要数天甚至数周的人工分析时间,缩短到分钟级别,极大提升渗透测试的效率和覆盖面。
    • 知识沉淀:将攻击经验和战术(TTPs)固化为AI模型可以理解的规则,实现团队知识的传承与复用。
  3. 使用场景:这项技术的使用方法非常明确,主要应用在以下场景:

    • 大型内网渗透测试:面对成千上万的资产,快速找到通往核心目标的“黄金路径”。
    • 持续性渗透与攻击模拟(BAS):定期、自动化地检验企业防御体系是否存在可被利用的攻击路径。
    • 红蓝对抗演练:作为红队的“智能参谋”,实时分析战场态势,动态调整攻击计划。
    • 安全教学与培训:为初学者提供一个可视化的攻击路径学习工具,理解攻击者思维。

一、AI辅助红队决策是什么

精确定义

AI辅助红队决策是一种利用人工智能技术,特别是自动规划(Automated Planning),来模拟攻击者思维,分析已知网络环境信息(如资产、漏洞、连接关系),并自动生成从起点到目标的最优攻击路径的技术。它将复杂的渗透测试过程抽象为一个状态空间搜索问题,AI负责寻找解决方案。

一个通俗类比

这就像是为红队配备了一个“攻击导航系统”。

  • 当前位置:你控制的一台边缘Web服务器。
  • 目的地:域控服务器的管理员权限。
  • 地图数据:Nmap扫描出的网络拓扑、Nessus发现的漏洞、人员信息等。
  • 交通规则:ATT&CK框架中的攻击技术(TTPs),例如“利用永恒之蓝”、“哈希传递”、“Kerberoasting”等。
  • 导航系统(AI):分析所有可能的路线(攻击路径),并根据你的偏好(“最快到达”、“最隐蔽”、“风险最低”),推荐一条最佳路线,并给出每一步的具体操作指南。

实际用途

  • 攻击路径可视化:将抽象的攻击思路转变为清晰的、可执行的步骤图。
  • 决策支持:在关键节点,当面临多个攻击选项时,提供数据驱动的决策建议。
  • “What-if”分析:模拟如果某个漏洞被修复,或者某个资产下线,攻击路径会发生什么变化,辅助蓝队进行防御优先级排序。
  • 自动化渗透测试:与Metasploit、Cobalt Strike等工具联动,实现从路径规划到漏洞利用的全流程自动化。

技术本质说明

这项技术的原理本质上是基于模型的规划(Model-Based Planning)。我们首先需要用一种形式化的语言来“建模”整个攻击世界:

  1. 状态(State):描述网络环境的一个快照。例如,“用户A在主机1上拥有普通用户权限”就是一个状态。
  2. 动作(Action):描述一个攻击技术。每个动作都有其前置条件(Preconditions)效果(Effects)
    • 示例动作exploit_ms17_010(attacker_host, target_host)
    • 前置条件attacker_host可达target_host的445端口,且target_host存在MS17-010漏洞。
    • 效果attacker_host获得target_host的系统权限。
  3. 目标(Goal):我们希望达成的最终状态。例如,“在域控服务器上拥有管理员权限”。

AI规划器(Planner)的任务就是,在给定初始状态和目标状态后,利用已知的动作库,寻找一个能够从初始状态到达目标状态的动作序列。这个序列,就是我们所说的攻击路径

为了实现这一过程,我们通常使用**规划领域定义语言(PDDL - Planning Domain Definition Language)**来描述这个模型。

核心机制Mermaid图

下图清晰地展示了AI辅助红队决策的完整工作流程:

Phase 3: 结果输出与执行

Phase 2: AI规划与决策

Phase 1: 数据输入与建模

资产信息 csv

模型转换器

漏洞报告 xml

网络拓扑 json

领域模型 Domain.pddl (定义攻击动作)

问题模型 Problem.pddl (定义网络状态与目标)

AI规划器 (Fast Downward 等)

攻击计划 plan

路径可视化与解析器

1. 利用 MS17-010
2. Mimikatz 抓取密码
3. 哈希传递

达成目标: 域控权限

自动化执行模块 (MSF / Cobalt Strike)

这张图独立地解释了整个机制:首先,将各类安全工具的输出数据通过模型转换器统一为AI能理解的PDDL格式;然后,AI规划器基于这些模型计算出攻击计划;最后,解析器将计划转化为人类可读的步骤或机器可执行的指令。


二、环境准备

我们将使用一个开源的AI规划器 Fast Downward 和一个专门为渗透测试设计的PDDL建模工具 SecGen 的概念来构建我们的环境。

  • 工具与版本

    • 操作系统:Ubuntu 22.04 LTS 或其他Linux发行版
    • AI规划器:Fast Downward (最新版)
    • 依赖库:Python 3.8+, git, cmake, g++
    • Docker (推荐):Docker 20.10+
  • 下载方式
    我们将通过Git克隆Fast Downward的官方仓库。

  • 核心配置与构建命令

    # 1. 安装编译依赖
    sudo apt-get update
    sudo apt-get install -y git cmake g++ python3-dev
    
    # 2. 克隆Fast Downward仓库
    git clone https://github.com/aibasel/fast-downward.git
    
    # 3. 进入目录并构建规划器
    cd fast-downward
    ./build.py
    

    构建成功后,你会在 fast-downward 目录下看到一个名为 fast-downward.py 的可执行脚本。

  • 可运行环境命令(Docker方式,强烈推荐)
    使用Docker可以避免繁琐的环境配置,一键启动。

    # 警告:以下命令将下载并运行一个包含渗透测试规划工具的Docker镜像。
    # 请确保您已获得在当前网络环境中进行此类操作的明确授权。
    
    # 拉取包含Fast Downward的镜像(这是一个示例,实际中你可能需要自己构建)
    # docker pull aibasel/downward:latest
    
    # 假设我们已将包含PDDL文件的目录映射到容器中
    # docker run -it --rm -v /path/to/your/pddl_files:/pddl aibasel/downward:latest /bin/bash
    

    为简化本次实战,我们假设 fast-downward.py 已经构建完成并可在本地直接运行。


三、核心实战

我们将模拟一个简化的内网场景,从一台被控的Web服务器开始,目标是获取域控服务器的管理员权限。

场景描述

  • 初始权限:Web服务器(192.168.1.10)的www-data用户权限。
  • 网络环境
    • Web服务器(192.168.1.10):存在一个提权漏洞(CVE-2021-3156),可从www-data提权到root
    • 数据库服务器(192.168.1.20):Web服务器可以访问其3306端口,并且Web应用配置文件中存有其明文密码。
    • 域控服务器(192.168.1.5):数据库服务器上运行着一个特权进程,该进程的内存中缓存了域管(Administrator)的凭据。
  • 目标:获取域控服务器(192.168.1.5)的Administrator权限。

步骤一:定义攻击领域(domain.pddl)

这是我们的“交通规则”,定义了所有可用的攻击动作。

; domain.pddl - 定义红队攻击动作
; 警告:本文件描述了模拟攻击行为,仅可用于经授权的教育和测试环境。

(define (domain redteam-planning)
  (:requirements :strips :typing)

  (:types
    host user credential - object
  )

  (:predicates
    ; 网络连接
    (connected ?h1 - host ?h2 - host)
    ; 主机上的漏洞
    (has_vuln ?h - host ?vuln_name - object)
    ; 用户在主机上的权限级别
    (has_access ?u - user ?h - host ?level - object)
    ; 凭证信息
    (is_credential_for ?c - credential ?u - user)
    ; 在主机上找到凭证
    (credential_on_host ?c - credential ?h - host)
  )

  ; 动作1: 本地提权
  (:action local_privilege_escalation
    :parameters (?h - host ?u_low - user ?u_high - user ?vuln - object)
    :precondition (and
      (has_access ?u_low ?h 'user)
      (has_vuln ?h ?vuln)
    )
    :effect (and
      (not (has_access ?u_low ?h 'user))
      (has_access ?u_high ?h 'admin)
    )
  )

  ; 动作2: 利用配置文件中的凭证访问其他主机
  (:action use_credential_from_config
    :parameters (?h_source - host ?h_target - host ?u - user ?c - credential)
    :precondition (and
      (has_access 'attacker' ?h_source 'admin') ; 假设攻击者需要高权限读取敏感配置
      (connected ?h_source ?h_target)
      (credential_on_host ?c ?h_source)
      (is_credential_for ?c ?u)
    )
    :effect (and
      (has_access ?u ?h_target 'user')
    )
  )

  ; 动作3: 从内存中抓取凭证
  (:action dump_credentials_from_memory
    :parameters (?h - host ?u_victim - user ?c_victim - credential)
    :precondition (and
      (has_access 'attacker' ?h 'admin') ; 需要高权限才能dump内存
      (is_credential_for ?c_victim ?u_victim)
    )
    :effect (and
      (credential_on_host ?c_victim ?h)
    )
  )
)

步骤二:定义问题实例(problem.pddl)

这是我们的“地图数据”,描述了当前的具体网络状态和目标。

; problem.pddl - 定义当前网络状态和攻击目标
; 警告:本文件描述了模拟攻击场景,仅可用于经授权的教育和测试环境。

(define (problem simple-attack-path)
  (:domain redteam-planning)

  (:objects
    web_server db_server dc_server - host
    www_data root_user db_user domain_admin - user
    db_password dc_admin_credential - credential
    cve_2021_3156 - object
  )

  (:init
    ; 初始权限
    (has_access 'attacker' web_server 'user') ; 我们用'attacker'代表我们控制的用户

    ; 网络拓扑
    (connected web_server db_server)
    (connected db_server dc_server)

    ; 漏洞信息
    (has_vuln web_server cve_2021_3156)

    ; 凭证信息
    (credential_on_host db_password web_server) ; 数据库密码在web服务器的配置文件里
    (is_credential_for db_password db_user)
    (is_credential_for dc_admin_credential domain_admin) ; 域管凭证定义
  )

  (:goal (and
    ; 最终目标:拥有域控的管理员权限
    (has_access domain_admin dc_server 'admin')
  ))
)

步骤三:运行AI规划器生成攻击路径

现在,我们使用fast-downward.py来解决这个问题。

命令说明

  • ./fast-downward.py:执行规划器脚本。
  • domain.pddl problem.pddl:传入我们的领域和问题文件。
  • --search "astar(lmcut())":指定使用的搜索算法。astar是经典的A*算法,lmcut()是一种高效的启发式函数,非常适合用于寻找最优解。这是性能优化的一个体现。
# 确保你在 fast-downward 目录下,并且 pddl 文件也在当前目录
# 运行规划器
./fast-downward.py domain.pddl problem.pddl --search "astar(lmcut())"

步骤四:分析输出结果

规划器会输出计算过程,如果找到解决方案,最后会生成一个名为 sas_plan 的文件,内容如下:

(local_privilege_escalation web_server www_data root_user cve_2021_3156)
(use_credential_from_config web_server db_server db_user db_password)
(dump_credentials_from_memory db_server domain_admin dc_admin_credential)
(use_credential_from_config db_server dc_server domain_admin dc_admin_credential) ; 假设use_credential可以复用
; --- 此处为了简化,我们假设抓到凭证后,可以直接用一个类似use_credential的动作来访问DC
; --- 在一个更复杂的模型中,这里可能是 pass_the_hash(db_server, dc_server, dc_admin_credential)

输出结果解读:AI规划器成功地为我们找到了一条攻击路径!

  1. local_privilege_escalation:在Web服务器上,利用cve_2021_3156漏洞进行本地提权,从www-data权限提升到root权限。
  2. use_credential_from_config:在Web服务器上,利用root权限读取配置文件,找到数据库密码,并用它成功登录数据库服务器。
  3. dump_credentials_from_memory:在数据库服务器上,利用高权限从内存中抓取到了域管的凭证。
  4. use_credential_from_config(或其他类似动作):利用刚刚抓取到的域管凭证,成功登录域控服务器,达成目标。

自动化脚本示例

以下是一个Python脚本,它能自动调用Fast Downward,并解析结果,将技术性的计划翻译成人类可读的报告。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
attack_planner.py - 自动化调用AI规划器并解析攻击路径的脚本

警告:本脚本用于执行攻击模拟和路径规划。
在未获得明确书面授权的情况下,严禁在任何生产或非测试环境中使用。
所有操作后果自负。
"""

import subprocess
import sys
import os
import argparse

# --- 配置区 ---
# Fast Downward可执行文件的路径
FD_PATH = './fast-downward/fast-downward.py'
# 默认的搜索算法
DEFAULT_SEARCH_ALGORITHM = "astar(lmcut())"

def run_planner(domain_file: str, problem_file: str, search_algorithm: str) -> bool:
    """
    调用Fast Downward规划器来生成攻击计划。

    :param domain_file: PDDL领域定义文件路径。
    :param problem_file: PDDL问题定义文件路径。
    :param search_algorithm: 使用的搜索算法。
    :return: 如果成功找到计划,返回True,否则返回False。
    """
    if not os.path.exists(FD_PATH):
        print(f"[错误] Fast Downward 执行文件未找到: {FD_PATH}")
        print("请确保已正确构建Fast Downward,并配置正确的FD_PATH。")
        return False

    command = [
        sys.executable,  # 使用当前python解释器
        FD_PATH,
        '--plan-file', 'sas_plan', # 指定输出文件名
        domain_file,
        problem_file,
        '--search',
        search_algorithm
    ]

    print(f"[*] 正在执行规划器命令: {' '.join(command)}")

    try:
        # 使用subprocess.run来更好地控制执行和错误处理
        result = subprocess.run(command, capture_output=True, text=True, check=True)
        
        if "Solution found." in result.stdout:
            print("[+] 成功找到攻击路径!")
            return True
        else:
            print("[-] 未找到解决方案。可能是目标不可达或模型定义有误。")
            print("规划器输出:\n", result.stdout)
            return False

    except FileNotFoundError:
        print(f"[错误] 命令 '{sys.executable}' 或 '{FD_PATH}' 未找到。")
        return False
    except subprocess.CalledProcessError as e:
        print(f"[错误] 规划器执行失败,返回码: {e.returncode}")
        print("--- STDOUT ---")
        print(e.stdout)
        print("--- STDERR ---")
        print(e.stderr)
        return False
    except Exception as e:
        print(f"[严重错误] 执行规划器时发生未知异常: {e}")
        return False

def parse_and_display_plan(plan_file: str = 'sas_plan'):
    """
    解析sas_plan文件并以人类可读的格式显示。

    :param plan_file: 规划器生成的计划文件路径。
    """
    if not os.path.exists(plan_file):
        print(f"[*] 未找到计划文件 '{plan_file}',无需解析。")
        return

    print("\n" + "="*20 + " 攻击路径报告 " + "="*20)
    try:
        with open(plan_file, 'r') as f:
            for i, line in enumerate(f):
                # 去掉括号和分号
                clean_line = line.strip().replace('(', '').replace(')', '').replace(';', '')
                if not clean_line:
                    continue
                
                parts = clean_line.split()
                action_name = parts[0]
                params = parts[1:]
                
                print(f"步骤 {i+1}:")
                print(f"  - 行为: {action_name}")
                print(f"  - 参数: {', '.join(params)}")
                print("-" * 40)
        print("="*58)

    except IOError as e:
        print(f"[错误] 读取计划文件 '{plan_file}' 失败: {e}")
    finally:
        # 清理生成的计划文件
        if os.path.exists(plan_file):
            os.remove(plan_file)
            print(f"[*] 已清理临时计划文件: {plan_file}")


def main():
    """主函数,处理命令行参数并执行工作流。"""
    parser = argparse.ArgumentParser(
        description="AI驱动的红队攻击路径规划器。仅限授权测试环境使用。",
        formatter_class=argparse.RawTextHelpFormatter
    )
    parser.add_argument("domain", help="PDDL领域定义文件 (e.g., domain.pddl)")
    parser.add_argument("problem", help="PDDL问题定义文件 (e.g., problem.pddl)")
    parser.add_argument(
        "--search",
        default=DEFAULT_SEARCH_ALGORITHM,
        help=f"Fast Downward的搜索算法。\n默认: '{DEFAULT_SEARCH_ALGORITHM}'"
    )
    
    args = parser.parse_args()

    if run_planner(args.domain, args.problem, args.search):
        parse_and_display_plan()

if __name__ == '__main__':
    main()

如何运行此脚本
python3 attack_planner.py domain.pddl problem.pddl


四、进阶技巧

常见错误

  1. 模型不一致problem.pddl 中使用的对象或谓词在 domain.pddl 中未定义,导致规划器无法解析。
  2. 前置条件过严/过松:动作的前置条件定义得太严格,导致没有动作可以被执行;定义得太松,则会产生不切实际的攻击路径。
  3. 死循环或状态空间爆炸:如果动作定义不当(例如,一个动作的效果是另一个动作的直接前置条件,反之亦然),可能导致规划器在两个状态间无限循环。对于大型网络,状态数量可能呈指数级增长,导致规划时间过长。

性能 / 成功率优化

  1. 选择合适的启发式函数astar(lmcut()) 是一个很好的起点,但不是万能的。对于某些特定问题,astar(blind())(盲搜,当启发式计算开销大时)或贪心算法如 eager_greedy(ff()) 可能更快,尽管不保证最优。这是典型的空间换时间或质量换时间的权衡
  2. 分层规划(Hierarchical Planning):将一个大的攻击目标(如“攻陷域控”)分解为多个子目标(“获取Web服务器权限”、“进入内网”、“获取域管凭证”)。先为高层抽象目标规划,再对每个抽象步骤进行细化规划。这能极大减小搜索空间。
  3. 引入成本(Cost):在PDDL中,可以为每个动作定义一个成本(例如,时间消耗、被发现的概率)。规划器可以被配置为寻找“总成本最低”的路径,而不仅仅是“步骤最少”的路径。这使得决策更加贴近实战。
    ; 在domain定义中增加
    (:functions (total-cost))
    ; 在action中增加effect
    (:action exploit_ms17_010 ...
     :effect (and ... (increase (total-cost) 10)) ;假设这个动作成本为10
    )
    ; 在problem中定义优化目标
    (:metric minimize (total-cost))
    

实战经验总结

  • 模型是核心资产:PDDL文件的质量直接决定了AI决策的质量。一个经验丰富的红队专家,其价值在于能将隐性的攻击知识,转化为精确、完备的PDDL动作模型。
  • 从简单开始,逐步迭代:不要试图一次性构建一个覆盖所有ATT&CK技术的完美模型。从最核心、最高频的10-20个动作开始,验证其有效性,然后逐步扩展。
  • 与现有工具链集成:AI规划的价值在于指导行动。最好的方式是将其输出与BloodHound(用于生成拓扑)、Metasploit/Cobalt Strike(用于执行)等工具深度集成,形成自动化闭环。

对抗 / 绕过思路

蓝队同样可以利用这项技术来“反向思考”。

  • 攻击路径预测与加固:蓝队可以运行同样的规划器,来预测攻击者最可能采用的路径。然后,针对路径上的关键节点(Choke Points)进行加固,例如给某个关键服务器打上补丁,或者增加访问控制。
  • 欺骗(Deception):在网络中故意放置一些带有“漏洞”的蜜罐资产,并将其加入到AI规划模型中。这些蜜罐可以被设计成高价值、低成本的攻击目标,从而将自动化攻击引向陷阱,为蓝队争取预警时间。AI规划器只会基于你给它的“地图”导航,如果地图是假的,导航结果自然也是错的。

五、注意事项与防御

错误写法 vs 正确写法

  • 错误:在PDDL中定义一个泛泛的hack(host)动作。这过于模糊,AI无法理解其具体要求和后果。
  • 正确:定义具体的、基于TTP的动作,如pass_the_hash(source_host, target_host, credential),并明确其前置条件(如:在source_host上拥有高权限并获取了credential)和效果(如:在target_host上获得了credential对应用户的权限)。

风险提示

  • 自动化风险:将AI规划与自动化利用框架(如Metasploit)直接连接,而未进行人工审核,可能导致对生产环境造成不可预见的破坏。始终保持“人在回路”(Human-in-the-loop)
  • 模型偏差:如果你的PDDL模型只包含了你知道的攻击技术,那么AI也永远无法发现利用未知技术的攻击路径。模型的完备性至关重要。
  • 法律与合规风险再次强调,所有描述的技术和工具,必须、也只能在获得明确书面授权的渗透测试或研究环境中使用。

开发侧安全代码范式

防御AI规划出的攻击路径,根本在于消除其依赖的“动作”。

  • 最小权限原则:避免配置文件中出现高权限数据库账户的凭证。use_credential_from_config动作的前提就不成立了。
  • 输入验证与参数化查询:防止SQL注入,切断从Web应用到数据库的初始入口。
  • 凭证保护:在代码中避免硬编码密码。使用安全的密钥管理服务(KMS)或Vault。

运维侧加固方案

  • 补丁管理:及时修复高危漏洞,如CVE-2021-3156,消除local_privilege_escalation动作的可能性。
  • 网络隔离:严格限制服务器之间的访问策略。Web服务器不应该能直接访问域控服务器。这会破坏connected(web_server, dc_server)这样的前提。
  • 凭证安全:启用Windows Defender Credential Guard等技术,防止dump_credentials_from_memory这类内存抓取攻击。定期更换高权限账户密码。

日志检测线索

AI规划出的每一步,都会在系统中留下痕迹。

  • local_privilege_escalation:检测到异常的进程创建,特别是www-data用户启动了sudo或具有SUID权限的程序。
  • use_credential_from_config:监控到来自Web服务器IP的数据库登录成功事件,但该登录时间点与正常业务逻辑不符。
  • dump_credentials_from_memory:EDR检测到对lsass.exe(Windows)等敏感进程的内存读取行为。
  • 路径关联分析:SIEM可以将这些独立的告警事件关联起来。如果短时间内,在Host A上发生提权,随后Host A登录了Host B,接着Host B上发生了内存抓取,这高度疑似一条正在进行的攻击链。

总结

  1. 核心知识:AI辅助红队决策的核心是自动规划,它将渗透测试转化为一个状态空间搜索问题,通过形式化的PDDL语言对攻击动作和网络环境进行建模,最终由AI规划器自动寻找攻击路径。
  2. 使用场景:最适合用于大型、复杂的网络环境中的渗透测试、攻击模拟(BAS)和红蓝对抗演练,能极大地提升效率和决策的科学性。
  3. 防御要点:防御的关键在于破坏攻击路径的成立条件。这包括:及时打补丁(消除漏洞)、严格网络隔离(切断连接)、保护凭证安全(移除凭证),并利用SIEM/EDR对路径上的关键行为进行关联检测。
  4. 知识体系连接:这项技术是网络安全知识图谱ATT&CK框架的逻辑应用层。它将零散的TTPs串联起来,形成了有向的、可执行的攻击图(Attack Graph)。
  5. 进阶方向:未来的发展方向包括:结合强化学习动态适应环境变化、引入博弈论进行红蓝双方的策略推演、以及利用**大型语言模型(LLM)**自动从威胁情报报告中生成PDDL模型。

自检清单

  • 是否说明技术价值?
  • 是否给出学习目标?
  • 是否有 Mermaid 核心机制图?
  • 是否有可运行代码?
  • 是否有防御示例?
  • 是否连接知识体系?
  • 是否避免模糊术语?
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐