做项目过程中遇到的,关于简单的.NET程序的数据库解密流程过程记录,学习,阿巴阿巴
PS: MAC反编译.NET的DLL可以直接在VSCODE
下载插件ILSPY
,然后打开VSCODE
的命令行输入>Decompile
,即可选择DLL反编译。
程序一
进入正题,打开webshell管理工具,连接小伙伴给的shell,切换至根目录查看到存在文件ClientService.svc
这里面有两个重要的参数:Service
和CodeBehind
。
-
Service
是属性值是WCF的服务实现类的完全限定名。 -
CodeBehind
是服务实现类所在的文件名。
在运行的时候,宿主程序从svc文件中的Service属性得到WCF服务的完全限定名,然后从配置文件中找到同名的servicce,进而找到所有的EndPoint,并根据其属性进行实例化。
这说明此WEB服务为WCF服务,直接进入/bin下打开ClientService.svc.cs
,查看到存在UserLogin接口方法的实现
可以看到会根据登陆类型的不同进入不同的处理,登陆类型为2时,进入Business.AnonymousUsers.JudgeUserLogin()
方法处理;登陆类型为0时,进入Business.AnonymousUsers.UserLogin()
处理,我们只关注第二个登陆类型就好。
Business.AnonymousUsers.UserLogin()
在XXX.ASystem.Business.dll
中实现,
发现其会实例化以下结构的user,这里不必关注,然后进入GlobalParameters.PlatformUrl
中的UserLogin方法
接着查看GlobalParameters.PlatformUrl
为
到Web.Config中查看,此配置为本地15801开启的WEB服务,
发现上面实例化user的时候调用的DLL名字就与我们开始反编译的DLL不一样了,开始的为XXX.ASystem.Business.dll
,而实例化user的时候声明的类型为XXX.BSystem.SDK.dll
中实现的。
在这个WEB目录同级看到以BSystem命名的目录,那就是这个WEB又会去本地的15801
端口进行进一步的登陆处理(套娃?)。
进入此目录再次查看ClientService.svc
文件,bin目录又没有这个ClientService.svc.cs
文件了,所以就直接打开Service参数指定的XXX.BSystem.WEB.dll
文件,查看UserLogin()
方法,发现明显处理逻辑有点不一样
又进入了AnonymousUsers.UserLogin()
,处理,虽然和上面第一层的名字一样,但这次是进入到XXX.BSystem.Business.dll
中的AnonymousUsers
类,继续跟过去看
我们关注的字符串password
又进入了globalParameters.UserLogin()
,再往上两行globalParameters
是由IGlobalCache
这个接口声明的,后面的AccessFactory.GetGlobalParameters()
我也没找到在哪。
日了个DJ了,给爷整麻了,找不动了。
直接去IGlobalCache
看发现确实有UserLogin方法,再去XXX.BSystem.Cache.dll
中的GlobalCache
类,发现确实是这个接口的实现,那就对了
继续查看,发现终于找到了加密处理的地方
Utility.GetMD5
在XXX.common.dll
中实现,最终发现其会在md5处理前的数据加上一段估计字符
最后就可以指定这个盐让hashcat去跑密码了。
程序二
大体也非常简单,也是有解密数据库密码的需求,随便翻目录翻到文件AddUser.aspx
直接打开看旁边的.cs源文件,这个一目了然,直接看SecurityMgr
中的CreateUser
方法就行
找到对应的BizEngine.Security.dll
,反编译
密码进入到Encryption.Encrypt()
,然后找到对应的DLL跟过去就看到了
进行了DES,我们只需要把这个方法原模原样拿出来就行。
编写解密程序:
成功解开密码
两个案例是这两天项目中遇到的,比较简单,.NET程序看着也比较简单,漏洞也多,那么话说回来,你打上单出什么装备?
原文始发于微信公众号(黑客在思考):「学习记录」.NET程序的数据库密码解密