原文地址:
[url]https://blog.netspi.com/decrypting-mssql-database-link-server-passwords/[/url]
[url]https://blog.netspi.com/decrypting-mssql-credential-passwords/[/url]
(一)Linked Servers
MSSQL在数据库中hash本地SQL口令,而linked server口令则加密存储。如果MSSQL可以解密它们,那么你也可以使用PowerShell脚本来做相同的事。
MSSQL服务器允许user创建链接来连接到外部的服务去,典型的是其他的MSSQL服务器。如果使用MSSQL口令,那么账号和密码加密存储在数据库中,而且他们是可以逆向的格式。不可以使用单向hash,因为MSSQL必须使用明文口令来认证其他的服务器。
MSSQL存储服务器信息,包含加密密码在master.sys.syslnklgns表中。特别的是,加密的密码存储在"pwdhash"列(即使它不是一个hash)。
[img]http://dl2.iteye.com/upload/attachment/0106/9824/41bbfd3c-86d9-35d3-987e-67ee43906828.jpg[/img]
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的上下文中。我们选择第一个版本,它可以不需要伪装成服务账号来解密。
[img]http://dl2.iteye.com/upload/attachment/0106/9827/4d281195-b2c9-31f2-8ea2-4c6d4d9ea2e8.jpg[/img]
额外的熵可以用来强化加密,但是熵字节可以在注册表中找到:HKLM:SOFTWAREMicrosoftMicrosoft SQL Server[instancename]SecurityEntropy,需要本地管理员权限来访问注册表。
[img]http://dl2.iteye.com/upload/attachment/0106/9829/fbf45183-566a-38f4-81c9-49cb81d18e9b.jpg[/img]
根据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)成功结果如下[img]http://dl2.iteye.com/upload/attachment/0106/9834/39d63b1e-9da6-36e0-8b7e-b5696f49da4d.jpg[/img]
(二)MSSQL口令
MSSQL允许user往数据库中添加口令。这些口令,典型的windows用户名和密码,可以用来访问MSSQL服务器以外的资源。
一个例子就是MSSQL代理账户。当执行xp_cmdshell的时候,默认是使用MSSQL账户。但是如果配置代理账户,则可以使用权限较低的代理账户而不是MSSQL服务器账户来访问系统资源。
当往服务器中添加口令的时候,密码是可逆向的格式。
MSSQL存储口令密码在master.sys.sysobjvalues表中,可以使用下面的语句来确定加密的密码位置
[quote]
SELECT object_definition(OBJECT_ID('sys.credentials'))
[/quote]
Master.sys.sysobjvalues中有很多数据,但是口令信息的valueclass是28.加密的密码存在于imageval 列并且valclass=28 以及 valnum=2.
[img]http://dl2.iteye.com/upload/attachment/0106/9837/c68dd431-f571-3245-9dca-8b8621ff72a8.png[/img]
需要使用DAC来访问master.sys.sysobjvalues。
使用脚本 https://github.com/NetSPI/Powershell-Modules/blob/master/Get-MSSQLCredentialPasswords.psm1来解密密码
[quote]PS C:\> Get-MSSQLCredentialPasswords | out-gridview[/quote]
[img]http://dl2.iteye.com/upload/attachment/0106/9839/38f0922c-5199-36be-8df2-17a298e6be52.png[/img]
[url]https://blog.netspi.com/decrypting-mssql-database-link-server-passwords/[/url]
[url]https://blog.netspi.com/decrypting-mssql-credential-passwords/[/url]
(一)Linked Servers
MSSQL在数据库中hash本地SQL口令,而linked server口令则加密存储。如果MSSQL可以解密它们,那么你也可以使用PowerShell脚本来做相同的事。
MSSQL服务器允许user创建链接来连接到外部的服务去,典型的是其他的MSSQL服务器。如果使用MSSQL口令,那么账号和密码加密存储在数据库中,而且他们是可以逆向的格式。不可以使用单向hash,因为MSSQL必须使用明文口令来认证其他的服务器。
MSSQL存储服务器信息,包含加密密码在master.sys.syslnklgns表中。特别的是,加密的密码存储在"pwdhash"列(即使它不是一个hash)。
[img]http://dl2.iteye.com/upload/attachment/0106/9824/41bbfd3c-86d9-35d3-987e-67ee43906828.jpg[/img]
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的上下文中。我们选择第一个版本,它可以不需要伪装成服务账号来解密。
[img]http://dl2.iteye.com/upload/attachment/0106/9827/4d281195-b2c9-31f2-8ea2-4c6d4d9ea2e8.jpg[/img]
额外的熵可以用来强化加密,但是熵字节可以在注册表中找到:HKLM:SOFTWAREMicrosoftMicrosoft SQL Server[instancename]SecurityEntropy,需要本地管理员权限来访问注册表。
[img]http://dl2.iteye.com/upload/attachment/0106/9829/fbf45183-566a-38f4-81c9-49cb81d18e9b.jpg[/img]
根据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)成功结果如下[img]http://dl2.iteye.com/upload/attachment/0106/9834/39d63b1e-9da6-36e0-8b7e-b5696f49da4d.jpg[/img]
(二)MSSQL口令
MSSQL允许user往数据库中添加口令。这些口令,典型的windows用户名和密码,可以用来访问MSSQL服务器以外的资源。
一个例子就是MSSQL代理账户。当执行xp_cmdshell的时候,默认是使用MSSQL账户。但是如果配置代理账户,则可以使用权限较低的代理账户而不是MSSQL服务器账户来访问系统资源。
当往服务器中添加口令的时候,密码是可逆向的格式。
MSSQL存储口令密码在master.sys.sysobjvalues表中,可以使用下面的语句来确定加密的密码位置
[quote]
SELECT object_definition(OBJECT_ID('sys.credentials'))
[/quote]
Master.sys.sysobjvalues中有很多数据,但是口令信息的valueclass是28.加密的密码存在于imageval 列并且valclass=28 以及 valnum=2.
[img]http://dl2.iteye.com/upload/attachment/0106/9837/c68dd431-f571-3245-9dca-8b8621ff72a8.png[/img]
需要使用DAC来访问master.sys.sysobjvalues。
使用脚本 https://github.com/NetSPI/Powershell-Modules/blob/master/Get-MSSQLCredentialPasswords.psm1来解密密码
[quote]PS C:\> Get-MSSQLCredentialPasswords | out-gridview[/quote]
[img]http://dl2.iteye.com/upload/attachment/0106/9839/38f0922c-5199-36be-8df2-17a298e6be52.png[/img]