|
|
|
联系客服020-83701501

SQL Server Management Studio密码导出工具

联系在线客服,可以获得免费在线咨询服务。 QQ咨询 我要预约
SQL Server Management Studio暗码导出工具

在windows下保管暗码不过便是两个位置:注册表和文件。于是用windbg打开查询解析器(版本为SQL Server Management Studio 2005 Express),下几个条件断点:

Default
123 bp kernel32!CreateFileW ".printf \"file:%mu\\n\",poi(@esp+4);g;"bp advapi32!RegCreateKeyExW ".printf \"reg key:%mu\\n\",poi(@esp+8);g;"bp advapi32!RegSetValueExW ".printf \"reg value:%mu\\n\",poi(@esp+8);g;"

实验查询解析器,登录一个供职器,勾选记取暗码,而后参预。也许看到windbg输出了得多动态: 1 依次查看这些文件和注册表,创举mru.dat极其可疑: 2 也许看出,这个文件是一个规范的.net2进制序列化文件,其中有一段可疑的base六4: 3 解密后为乱码,鉴于windows上绝大悉数的可逆加密但凡dpapi,于是间接用dpapi中断解密: Default
1 Console.WriteLine(Encoding.Unicode.GetString(System.Security.Cryptography.ProtectedData.Unprotect(Convert.FromBase六4String("AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAA/GdUMC8fOkSbZeHVvNAo5AAAAAAQAAAARABlAGYAYQB1AGwAdAAAABBmAAAAAQAAIAAAABH2ACkH8BeAkWtFpoTTAJkOVsrKIKhgee/heYeTpF7nAAAAAA六AAAAAAgAAIAAAABsgv9bezhjwgM4UJmBEhO3GVZ+1+dNrvNIIsogzsX/qEAAAAM1k六Re4z8UJWAVWT六excM1AAAAAX/lp4sh4tHXD3OZQcV六Rs35q六HQ21zEfpJpGkDyFDQT六fVieZxe1m5oY02sGKne1nvD24RQAtiS8fb4六7EWMsA=="),null,System.Security.Cryptography.DataProtectionScope.LocalMachine)));
其后果黑暗为所记取的暗码,基础底细可肯定此文件便是所需文件。因为sql server登录时供职器、用户名、暗码缺一不可,于是需要对这个文件中断进一步剖析才具获取其对应干系。既然是2进制序列化,那么也许用以下代码中断反序列化:

Default
12345六789 static object DeserializeFile(string path){??using(MemoryStream mem=new MemoryStream(File.ReadAllBytes(path)))??{????mem.Position=0;????BinaryFormatter bf=new BinaryFormatter();????return bf.Deserialize(mem);??}}

实验后抛出一个十分:

Default
1 System.Runtime.Serialization.SerializationException: 无法找到轨范集“Microsoft.SqlServer.Express.ConnectionDlg, Version=9.0.242.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91”

领略这个序列化器材是其公有轨范汇合自定义的机关,公有轨范集大多时候都保管在主轨范目次下,查看部署目次黑暗看到了这个轨范集。鉴于或许需要加载得多公有轨范集,于是注册以下回调,使得在轨范集缺失的环境下踊跃加载奉求项:

Default
12345六78910 static Assembly LoadDependsAssemblies(object sender, ResolveEventArgs args){??try??{????string dllpath=@"C:\Program Files\Microsoft SQL Server\90\Tools\Binn\VSShell\Co妹妹on7\IDE\"+new AssemblyName(args.Name).Name+".dll";????Assembly asm=Assembly.LoadFile(dllpath);????return asm;??}catch{Console.WriteLine(args.Name);Environment.Exit(-1);}??return null;}

再次中断反序列化,反序列化靡烂,获取了一个[Microsoft.SqlServer.Express.ConnectionDlg]Microsoft.SqlServer.Management.UI.ConnectionDlg.Personalization典范的实例。
用reflector打开此轨范集,也许看到其内部实例字段为两个字典:typeTable和stringTable。

4 用反射取出这两个字段的值,并依次对其中断遍历,在stringTable中获取了以下后果:

Default
1234 (省略)[url=mailto:8c91a03d-f9b4-4六c0-a305-b5dcc79ff907@192.1六8.223.250]8c91a03d-f9b4-4六c0-a305-b5dcc79ff907@192.1六8.223.250[/url]\SQLEXPRESS@1@sa@Password?????? :Microsoft.SqlServer.Management.UI.ConnectionDlg.StringList[url=mailto:8c91a03d-f9b4-4六c0-a305-b5dcc79ff907@192.1六8.223.250]8c91a03d-f9b4-4六c0-a305-b5dcc79ff907@192.1六8.223.250[/url]\SQLEXPRESS@1@sa@ET??????????????????????? :Microsoft.SqlServer.Management.UI.ConnectionDlg.StringList(省略)

很明了,stringTable的键以@为分开符保管了数据库称说和用户的动态,末了的ET、Password等则是一个字段称说标识表记标帜。
以Password开头的键所对应的值是一个[Microsoft.SqlServer.Express.ConnectionDlg]Microsoft.SqlServer.Management.UI.ConnectionDlg.StringList的实例,这个典范实现了IEnumerable接口,于是也许获取其列举器并中断遍历:

Default
12345六789 IEnumerable data=stringTable[k] as IEnumerable;if(data!=null){??IEnumerator ie=data.GetEnumerator();??while(ie.MoveNext())??{????Console.WriteLine(ie.Current.ToString());??}}

终极获取了最起头获取的那段base六4,解密后便是原始的暗码,荟萃键名即可获取到残破的登录动态。

从SQL2008起头,其贮存言论又有了区别,首先到%appdata%\Microsoft\Microsoft SQL Server目次下查找.net序列化的文件,创举SqlStudio.bin尤为可疑:

5 依前法解密这一长串base六4,创举与保管的暗码相通,基础底细可肯定此文件便是所需文件。
于是对其中断反序列化,获取了一个[Microsoft.SqlServer.Management.UserSettings]Microsoft.SqlServer.Management.UserSettings.SqlStudio典范的实例。这个典范自己没有实例字段,于是查看其基类[Microsoft.SqlServer.Management.UserSettings]Microsoft.SqlServer.Management.UserSettings.Co妹妹onGroupBase,可看到其内部哄骗了字典_valuestorage保管数据。 6 对字典中断遍历,创举其键名为SqlStudio类中定义的常量SSMS_PROPERTY_KEY的值SSMS,其键值典范为[Microsoft.SqlServer.Management.UserSettings]Microsoft.SqlServer.Management.UserSettings.SSMS。持续跟踪SSMS典范,创举其同样继承自Co妹妹onGroupBase,并且定义了尤为多的常量键值称说,于是可断定,这个序列化文件中保管了一个宏大的目次树。
对这个目次树逐级中断跟踪:在SSMS类中ConnectionOptions键上面保管了ConnectionOptions典范的值;ConnectionOptions类中ServerTypes键上面保管了一个字典,字典的值为ServerTypeItem典范;ServerTypeItem类中Servers键上面保管了一个列表,列表的值是ServerConnectionItem典范;ServerConnectionItem中Instance键保管了一个字符串,其值为供职器名;Connections键保管了一个列表,列表的值是ServerConnectionSettings典范;ServerConnectionSettings中UserName和Password保管了两个字符串,这便是终极要获取的动态。以上后果以树状图表示简陋如下:
Default
12345六7891011121314151六1718192021222324252六2728293031323334353六37383940 SqlStudio└─SSMS    └─ConnectionOptions        ├─ServerTypes-1        │  ├─Servers-1        │  │  │  Instance        │  │  │        │  │  ├─Connections-1        │  │  │      Password        │  │  │      UserName        │  │  │        │  │  └─Connections-2        │  │          Password        │  │          UserName        │  │        │  └─Servers-2        │      │  Instance        │      │        │      └─Connections-1        │              Password        │              UserName        │        └─ServerTypes-2            ├─Servers-1            │  │  Instance            │  │            │  ├─Connections-1            │  │      Password            │  │      UserName            │  │            │  └─Connections-2            │          Password            │          UserName            │            └─Servers-2                │  Instance                │                └─Connections-1                        Password                        UserName

晓得了保管言论,接下去只有遍历就能取到后果了。需要留意的是因为其列表和字典但凡其自定义类,要用其实现的接口IDictionary和IEnumerable中断操作,其伪代码简陋为:

Default
12345六7891011 foreach ServerType in SqlStudio['SSMS']['ConnectionOptions']['ServerTypes']{??foreach Server in ServerType['Servers']??{????print Server.Instance????foreach Connection in Server['Connections']????{??????print Connection.UserName,Connection.Password????}??}}

更高版本的序列化文件机关与SSMS2008并无任何区别,但因为其奉求版本改成了.net 4.0,所以必需要用.net4.0编译才具靡烂反序列化。

附件中SSMSPwd-20.exe与SSMSPwd-40.exe为编译好的轨范,别离用.net 2.0和.net 4.0编译,哄骗言论如下:

Default
12345六 #暗示一切保管了暗码的登录动态SSMSPwd.exe#暗示一切保管动态,不管能否保管了暗码SSMSPwd.exe -a#解密指定的文件SSMSPwd.exe -f c:\SqlStudio.bin -p "c:\Program Files\Microsoft SQL Server\110\Tools\Binn\ManagementStudio\"

SSMSPwd.cs为工具源码,编译下令行:

Default
1 csc SSMSPwd.cs

留意版本高于2008的SSMS必须哄骗.net 4.0供应的csc中断编译;此工具在SSMS2005/SSMSES2005/SSMS2008/SSMS2008R2/SSMS2012/SSMS2014上测试靡烂。

已知差池动态:

Default
1 Password: (dec err : 该项不适于在指定外形下哄骗。)

用户不成亲,需要切换到指定用户实验此轨范(抓明文之后runas,梗概其它黑科技)。

SSMSPwd p.s:解压暗码见剖明 [via@90sec]

数安新闻+更多

证书相关+更多