Pre-Windows 2000 computers

当一个计算机账户在 AD 中被“预创建”(即在机器实际加入域之前,由管理员在 ADUC 中手动创建)并勾选了 “允许 Windows 2000 之前的计算机使用此账户” 选项时:其默认密码就是其计算机名字(不带$)
Pasted image 20260301142308.png

1. 利用

1.1. 枚举

查找那些"预创建"(即在 ADUC 中手动创建,而非机器加入域时自动添加)但从未使用过的计算机账户,可以通过筛选所有计算机账户的 UserAccountControl 属性并寻找值为 4128(32|4096)的记录来实现(可通过 UserAccountControl 标志推导得出)

1.2. 利用工具

1.2.1. nxc

nxc的pre2k模块 一键枚举+利用

┌──(root㉿kali)-[~/Desktop/htb/Pirate]
└─# nxc ldap  10.129.124.28 -u pentest -p 'p3nt3st2025!&' -M pre2k
LDAP        10.129.124.28   389    DC01             [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:pirate.htb) (signing:None) (channel binding:Never)
LDAP        10.129.124.28   389    DC01             [+] pirate.htb\pentest:p3nt3st2025!&
PRE2K       10.129.124.28   389    DC01             Pre-created computer account: MS01$
PRE2K       10.129.124.28   389    DC01             Pre-created computer account: EXCH01$
PRE2K       10.129.124.28   389    DC01             [+] Found 2 pre-created computer accounts. Saved to /root/.nxc/modules/pre2k/pirate.htb/precreated_computers.txt
PRE2K       10.129.124.28   389    DC01             [+] Successfully obtained TGT for ms01@pirate.htb
PRE2K       10.129.124.28   389    DC01             [+] Successfully obtained TGT for exch01@pirate.htb
PRE2K       10.129.124.28   389    DC01             [+] Successfully obtained TGT for 2 pre-created computer accounts. Saved to /root/.nxc/modules/pre2k/ccache

2. 介绍

2.1. 基本介绍

背景与用途:这是属于AD中的遗留配置,是一个内置的安全组,最初是为了确保 Windows 2000 之后的 AD 环境能与旧版 Windows NT 系统兼容
权限机制该组被授予了对域内所有用户和组对象的读取 (READ) 权限,包括各种细粒度的属性(如描述、职位、组成员关系等)

风险:过度枚举
在任何新的 Active Directory 部署中, Pre-Windows 2000 Compatible Access 组都会预先填充 Authenticated Users (所有已认证用户)组,即使现在的winserver 2025也是如此。这意味着任何拥有普通域账号的人都能查阅整个域的详细目录
特别是,如果 Anonymous Logon被错误的配置在该组中,攻击者甚至无需任何账号即可进行未经身份验证的枚举。
Pasted image 20260302233057.png

3. 常见的枚举漏洞

因为pre2k组具有对域内所有用户和组的READ权限。所以很容易受到下面这些枚举的利用

3.1.1. 介绍

SMB 空会话可用于从活动目录中检索数据,例如所有用户的列表和密码策略
以下是此漏洞的在不同版本下的默认配置

Windows 版本 SMB 空会话默认启用? 备注
Windows NT 4.0 传统默认设置
Windows Server 2000 是(如果在安装 AD 时选择了与 Windows 2000 之前版本兼容的权限) 管理员在 DCPROMO 期间选择
Windows Server 2003 是(如果在安装 AD 时选择了与 Windows 2000 之前版本兼容的权限) 管理员在 DCPROMO 过程中选择
Windows Server 2008 及更高版本 默认情况下未启用 必须手动启用让 Everyone 权限应用于匿名用户的组策略,并视需要修改 Pre-Win 2000 组
域控制器升级 (2003 -> 2008 -> 2012 等) 是(如果先前已启用,除非被移除,否则将保持原状) 空会话配置在就地升级期间会被保留,除非被清理

注: 如果这个设置之前被开启过,哪怕是 20 年前开启的,即使域控制器随着时间的推移进行了迭代升级,除非手动移除,否则该设置仍会保留

3.1.2. 修复:

通常从从 Pre-Windows 2000 Compatible Access 组中移除 Everyone 组即可解决问题。
此外还应该检查组策略中的 Default Domain Controllers Policy ,并确保 Network access: Let Everyone permissions apply to anonymous users 已禁用
检查流程: Computer Configuration --> Windows Settings --> Security Settings --> Local Policies --> Security Options 然后 gpupdate

3.2.1. 介绍

LDAP 匿名绑定是攻击者无需认证即可从 Active Directory 域获取信息的另一种方法。
这在 Windows Server 2000 域控制器上是默认开启的,之后的版本就不再默认开启了
但由于 Pre-Windows 2000 Compatible Access 组的缘故。从之前的版本迭代升级的域控仍然会保留之前的配置

3.2.2. 修复:

清除 AD 中目录服务对象内的 dsHeuristics 属性值。当该值设置为 0000002 时,允许匿名绑定。移除即可禁用匿名绑定
此外,还应确保 ANONYMOUS LOGON 对 Users CN 或其他对象(包括域对象本身)没有读取权限。
Pasted image 20260303001321.png

下面是一个修复脚本

# Obtain domain name, build LDAP path to the Directory Service object, connect as an ADSI object
$Dcname = Get-ADDomain | Select-Object -ExpandProperty DistinguishedName
$Adsi = 'LDAP://CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,' + $Dcname
$AnonADSI = [ADSI]$Adsi

# Clear the dSHeuristics attribute 
$AnonADSI.Properties["dSHeuristics"].Clear()
$AnonADSI.SetInfo()

# Remove ANONYMOUS LOGON read access on CN=Users
$ADSI = [ADSI]('LDAP://CN=Users,' + $Dcname)
$Anon = New-Object System.Security.Principal.NTAccount("ANONYMOUS LOGON")
$SID = $Anon.Translate([System.Security.Principal.SecurityIdentifier])
$adRights = [System.DirectoryServices.ActiveDirectoryRights] "GenericRead"
$type = [System.Security.AccessControl.AccessControlType] "Allow"
$inheritanceType = [System.DirectoryServices.ActiveDirectorySecurityInheritance] "All"
$ace = New-Object System.DirectoryServices.ActiveDirectoryAccessRule $SID,$adRights,$type,$inheritanceType
$ADSI.PSBase.ObjectSecurity.RemoveAccessRule($ace) | Out-Null
$ADSI.PSBase.CommitChanges()
  • 获取域 DN,构建指向配置分区中 CN=Directory Service 的 LDAP 路径,并以 ADSI 对象身份连接以实现读写访问
  • 清除 dSHeuristics 属性
  • 移除 CN=Users 上 ANONYMOUS LOGON 的显式 GenericRead 权限,以防止从未经身份验证的角度进行匿名 LDAP 绑定以读取用户对象

3.3.1. 介绍

RID 暴力破解是从未认证角度枚举 AD 用户和组列表的另一种技术。如果 Everyone 组被添加到 Pre-Windows 2000 Compatible Access 组(这种情况经常发生)
这通常在server 2000、2003上都有效,从2008开启就不再默认配置了。但仍会保留历史遗留配置

#利用案例
nxc smb  192.168.3.142   --rid-brute

这可以在默认域控制器策略的组策略级别进行设置,特别是当 Network access: Allow anonymous SID/name translation 启用时
此设置允许匿名用户请求域内用户和组的安全标识符(SID)属性

3.3.2. 修复

在组策略编辑器的默认域控制器策略中将 Network access: Allow anonymous SID/name translation 设置为 disabled(优先,并确认应用与林中的所有域控制器)

或将注册表项 HKLM\SYSTEM\CurrentControlSet\Control\Lsa\RestrictAnonymous 的值设为 1 或 2

4. 常见利用方式

4.1. LLMNR/NBT-NS Response Spoofing

4.1.1. 原理

LLMNR 和 NBT-NS(NetBIOS)欺骗/投毒是众所周知的内网攻击手段,至今仍在许多环境中有效。LLMNR 代表链路本地多播名称解析,而 NBT-NS 代表 NetBIOS 名称服务,NetBIOS 是网络基本输入/输出系统的缩写。这些遗留协议默认启用,并且像许多其他问题一样,即使在域控制器/域功能级别升级后,它们仍可能保留在网络中。

LLMNR 协议允许主机与同一内部网段上的其他主机进行名称解析,无需依赖 DNS。当 DNS 名称服务器请求失败时,如果未禁用 LLMNR 和 NBT-NS 协议,Windows 系统将尝试使用这两种协议进行备用名称解析。
LLMNR 和 NBT-NS 在内部网络广播的主要问题在于:如果 DNS 名称解析失败客户端(系统)会向整个本地网段发送未经身份验证的 UDP 广播,询问网段内是否有其他系统拥有其正在查找的名称。由于此广播过程未经身份验证即向整个网络发送,网络上的任何机器都可以代替被请求的机器进行响应。

攻击者可以使用诸如 Responder 之类的工具监听 LLMNR/NBT-NS 广播,并伪装成客户端试图进行身份验证的目标机器来发送欺骗性响应。在此身份验证过程中,客户端机器会发送 NTLMv2 密码哈希(如果网络中启用了此传统协议,有时也可能是 NTLMv1)
Pasted image 20260303003525.png

4.1.2. 利用场景

滥用案例 描述
用户输入错误 用户误输入 UNC 路径或主机名(如 \fileservr),当 DNS 解析失败且启用了 LLMNR/NBT-NS 广播时,恶意 Responder 服务器会响应,从而捕获 NTLMv2 哈希。
Windows 代理自动检测 (WPAD) 默认情况下,Windows 尝试通过 WPAD 发现代理。若 DNS 中未定义代理主机,客户端会通过 LLMNR/NBT-NS 请求 WPAD,Responder 响应后导致哈希被捕获。
Chrome 浏览器 在地址栏输入搜索词时,Chrome 会同时进行主机名解析。启动时解析随机主机名的行为也会激活名称解析,常导致密码哈希被捕获。
配置不当的应用程序/服务 某些程序自动发现网络资源(如打印机或文件共享)。若缺少正确 DNS 记录且启用了 LLMNR/NBT-NS,系统将回退使用这些协议。
未受管理/遗留设备 这些设备可能触发回退名称解析机制,使其容易受到欺骗性回复的影响,进而导致凭据泄露。
DNS 服务器配置错误 客户端或服务器端的 DNS 配置错误可能导致名称解析问题,从而使通过这些协议实施的投毒攻击获得成功。

4.1.3. 缓解措施

LLMNR 与 NBT-NS 响应欺骗攻击可通过禁用这两种协议相对容易地进行修复。若仅禁用 LLMNR,Windows 系统将转而依赖 NBT-NS 进行名称解析,因此攻击仍可能发生。

禁用LLMNR:
可以通过组策略禁用 LLMNR。理想的做法是创建一个新的 GPO,而不是通过默认域策略禁用它。创建一个专用的 GPO,例如 Disable LLMNR ,将使其更易于审计、更容易针对特定 OU、更容易回滚,并避免编辑域级基线策略。

禁用 NBT-NS
与 LLMNR 不同,NBT-NS 没有可全局应用的特定组策略对象设置,因此必须在主机级别进行配置
NBT-NS 可以通过每台主机的网络连接设置来禁用

4.2. mDNS Response Spoofing

4.2.1. 介绍

响应欺骗攻击的另一个潜在目标是多播 DNS(mDNS),
mDNS 随 Windows 10 1703 版本引入。是由苹果公司开发的,此协议旨在实现无需 DNS 服务器或用户交互的本地网络名称与服务发现。 它通过 UDP 端口 5353 应用于智能电视、打印机、机顶盒、无线音箱、无线屏幕镜像等领域

4.2.2. 修复 mDNS 响应欺骗

因为任何操作系统都可能同时运行多个 mDNS 解析器,且 mDNS 使用 UDP而非 TCP,因此可能有多个服务同时监听该端口。再加上很多第三方程序不依赖windows自带的mDNS,实现自己的mDNS堆栈,用于发现对等设备、共享内容、支持跨设备同步或投屏等。
所以即使禁用了windows内置的mDNS解析器,但其他应用程序仍可能发送 mDNS 查询或接受 mDNS 回复,只要其中任何一个执行 .local 查找并接受伪造的回复,它们仍然容易受到攻击(例如 Chrome)

微软的官方建议是使用防火墙。

  • 在 Windows Defender 防火墙中为所有配置文件(公共、专用、域)禁用入站 mDNS。这将阻止所有入站 mDNS 流量,但可能会给远程工作人员带来问题。
  • 仅在域配置文件中禁用 mDNS,这样不会影响远程工作人员,但会阻止企业网络内的 mDNS
  • 在 Windows Defender 防火墙中禁用出站流量的 mDNS。这仅在需要高安全性的情况下才必要,因为通常阻止入站 mDNS 流量已足够。

与 LLMNR/NBT-NS 不同,mDNS 通常是设备和服务正常运行所必须之物。现代计算机环境下,很多设备都使用mDNS,完全阻止入站mDNS流量是不可取的,他会影响如chrome、屏幕共享、协同办公等软件的正常工作

一种折衷方案可以是结合使用 Windows Defender 防火墙配置文件、应用程序白名单以及一些缓解措施,使得响应欺骗攻击难以或几乎不可能达成目标。这包括启用 SMB 签名、LDAP 签名、LDAP 通道绑定、强密码策略、网络分段、网络访问控制(使恶意设备难以接入网络)、最小权限原则、确保特权用户(如域管理员)拥有独立账户且不使用特权账户登录工作站、健全的监控和警报机制等。

4.3. 基于 IPv6 的 DNS 欺骗

4.3.1. 介绍

在 Windows 环境中,IPv6 默认启用且优先级高于 IPv4,但通常未被使用或配置。每当 Windows 计算机启动或连接到网络时,它会广播 DHCPv6 请求以获取 IPv6 地址。与 LLMNR 类似,DHCPv6 是一种多播协议,因此位于同一网段的攻击者可以通过称为 DHCPv6 欺骗的攻击来响应这些 DHCPv6 查询。攻击者的主机为客户端提供特定的 IP 配置,其中包括恶意 DNS 服务器的地址。一旦完成此操作,攻击者就可以通过强制每个客户端在每次 DNS 解析时查询攻击者的恶意 DNS 服务器来执行 DNS 欺骗。攻击者主机随后将这些客户端重定向到其他恶意服务器(如 ntlmrelayx),这些服务器随后用于捕获 NTLMv1/NTLMv2 密码哈希或将这些身份验证尝试中继到 SMB、LDAP 等。

这是一种很容易被忽略的攻击手段

4.3.2. 修复

修改以下注册表键值: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters\ 并将 DisabledComponents 设置为 0xFF 以禁用IPv6

下面是一个检测脚本

$regPath = "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters"
$key = "DisabledComponents"

try {
$val = Get-ItemProperty -Path $regPath -Name $key -ErrorAction Stop
if ($val.$key -eq 0xFF) {
Write-Host "✅ IPv6 is fully disabled (DisabledComponents = 0xFF)" -ForegroundColor Green
} else {
Write-Host "⚠️ IPv6 is partially enabled (DisabledComponents = $($val.$key))" -ForegroundColor Yellow
}
} catch {
Write-Host "⚠️ DisabledComponents not set — IPv6 is likely fully enabled" -ForegroundColor Yellow
}

禁用命令

Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters" -Name "DisabledComponents" -Value 0xFF

注意: 禁用IPv6有可能会破坏网络中依赖IPv6的一些功能

更多知识: