还是netspi博客中的提到的思路,可以在DAC登录后导出sqlserver后期添加的凭据。由msdn所述,这些凭据多数情况下是windows用户名和密码,在内网渗透时可能会有用。
原文提供的powershell脚本依旧不能在中文(也可能是所有多字节操作系统如鬼子语)上运行,所以进行了修正,顺便改成了exe和AspxSpy插件方便调用。
工具与源码见附件,其中Get-MSSQLCredentialPasswords.psm1为修改后的powershell脚本,调用方式:
import-module Get-MSSQLCredentialPasswords.psm1 Get-MSSQLCredentialPasswords
注意:不能显示中文,超长密码只能显示一部分。
lscredpwd.exe为一键获取工具,直接执行即可。lscredpwd.js为源码,编译命令行:
jsc /r:system.xml.dll lspwd.js
GetMSSQLCredentialsPasswordPlugin.cs为AspxSpy插件源码,编译命令行:
csc /t:library GetMSSQLCredentialsPasswordPlugin.cs PluginDeflater GetMSSQLCredentialsPasswordPlugin.dll #压缩插件以防止拦截
jsc和csc在.net安装目录下面,为保证兼容性建议用.net 2.0版本的编译器编译。
GetMSSQLCredentialsPasswordPlugin.GetMSSQLCredentialsPasswordPlugin.dll.Deflated分别为未压缩和压缩后的插件。插件信息如下:
TypeName:Zcg.Test.AspxSpyPlugins.GetMSSQLCredentialsPasswordPlugin MethodName:Run HTML Result:true Params:null
输出:当前服务器所有能成功连接的sqlserver实例中所有凭据信息。
测试环境搭建:
执行以下sql用于添加凭据:
CREATE CREDENTIAL cred1 WITH IDENTITY = '管理员1A', SECRET = '密码asdc12xe1CVYR%#^BG(G*$FW$XSZFDXtgfgfsrtx'; CREATE CREDENTIAL cred2 WITH IDENTITY = '管理员1B', SECRET = '密码asdc12x密码SZFDXt密码tx';
测试一键获取工具:在非DAC连接的查询中用xp_cmdshell执行lscredpwd.exe
测试AspxSpy插件:为iis应用程序域和sqlserver的服务进程设置成同一账户(如network service),之后在AspxSpy中加载插件。
测试截图:
已知错误信息:
已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: TCP 提供程序, error: 0 - 指定的网络名不再可用。)
原因:DAC只支持单用户,出现此错误说明当前已经有一个活动的DAC连接。
不允许所请求的注册表访问权。
原因:当前用户不是sqlserver服务进程用户或administrator。
原文地址:https://blog.netspi.com/decrypting-mssql-credential-passwords/
msdn关于sqlserver凭据的信息:https://msdn.microsoft.com/zh-cn/library/ms189522.aspx
下载地址: mssql_credentials_pwd.zip
百度网盘:http://pan.baidu.com/s/1eQGPy98
解压密码见注释。