[译]解密MSSQL密码

原文地址:
https://blog.netspi.com/decrypting-mssql-database-link-server-passwords/
https://blog.netspi.com/decrypting-mssql-credential-passwords/
(一)Linked Servers
MSSQL在数据库中hash本地SQL口令,而linked server口令则加密存储。如果MSSQL可以解密它们,那么你也可以使用PowerShell脚本来做相同的事。
MSSQL服务器允许user创建链接来连接到外部的服务去,典型的是其他的MSSQL服务器。如果使用MSSQL口令,那么账号和密码加密存储在数据库中,而且他们是可以逆向的格式。不可以使用单向hash,因为MSSQL必须使用明文口令来认证其他的服务器。
MSSQL存储服务器信息,包含加密密码在master.sys.syslnklgns表中。特别的是,加密的密码存储在"pwdhash"列(即使它不是一个hash)。
[译]解密MSSQL密码_第1张图片
master.sys.syslnklgns 不能通过普通的SQL连接访问,但是可以使用DAC*(http://technet.microsoft.com/en-us/library/ms178068%28v=sql.105%29.aspx),需要Sysadmin特权来开启一个DAC连接。但是管理员权限是必须的。如果本地管理员没有sysadmin权限,你将需要伪装成MSSQL 账户或本地管理员账户。https://www.netspi.com/blog/entryid/133/sql-server-local-authorization-bypass.
接下来的过程需要Service Master Key,Service Master Key是SQL服务器加密的根源。当第一次需要使用它加密密码的时候它将会被创建。SMK存储于master.sys.key_encryptions,通过key_id 102找到。SMK使用Windows Data Protection API加密并且有两个版本:一个加密为localmachine另一个在当前user的上下文中。我们选择第一个版本,它可以不需要伪装成服务账号来解密。
[译]解密MSSQL密码_第2张图片
额外的熵可以用来强化加密,但是熵字节可以在注册表中找到:HKLM:SOFTWAREMicrosoftMicrosoft SQL Server[instancename]SecurityEntropy,需要本地管理员权限来访问注册表。
[译]解密MSSQL密码_第3张图片
根据smk的长度或MSSQL的版本,我们可以确定加密算法:MSSQL2012使用AES,之前版本使用3DES
使用https://github.com/NetSPI/Powershell-Modules/blob/master/Get-MSSQLLinkPasswords.psm1来解密
脚本必须在MSSQL服务器本地运行(因为DPAPI需要访问local machin key)执行脚本必须有所有db的sysadmin权限以及本地管理员权限(来获得注册表中的熵)。如果UAC启动了,那么必须以管理员来运行脚本。
1)识别MSSQL 服务器的db
2)为每一个db尝试创建一个DAC连接
3)从master.sys.syslnklgns表中的pwdhash列选出linked服务器口令
4)从每个db的master.sys.key_encryptions表选出key_id为102的MSK。根据thumbprint列选出加密为LocalMachine的版本
5)从注册表中提取熵
6)解密SMK
7)脚本确定加密算法
8)使用SMK解密linked服务器口令
9)成功结果如下 [译]解密MSSQL密码_第4张图片

(二)MSSQL口令
MSSQL允许user往数据库中添加口令。这些口令,典型的windows用户名和密码,可以用来访问MSSQL服务器以外的资源。
一个例子就是MSSQL代理账户。当执行xp_cmdshell的时候,默认是使用MSSQL账户。但是如果配置代理账户,则可以使用权限较低的代理账户而不是MSSQL服务器账户来访问系统资源。
当往服务器中添加口令的时候,密码是可逆向的格式。
MSSQL存储口令密码在master.sys.sysobjvalues表中,可以使用下面的语句来确定加密的密码位置
引用

SELECT object_definition(OBJECT_ID('sys.credentials'))

Master.sys.sysobjvalues中有很多数据,但是口令信息的valueclass是28.加密的密码存在于imageval 列并且valclass=28 以及 valnum=2.
[译]解密MSSQL密码_第5张图片
需要使用DAC来访问master.sys.sysobjvalues。
使用脚本 https://github.com/NetSPI/Powershell-Modules/blob/master/Get-MSSQLCredentialPasswords.psm1来解密密码
引用
PS C:\> Get-MSSQLCredentialPasswords | out-gridview

[译]解密MSSQL密码_第6张图片

你可能感兴趣的:(MSSQL)