记一次.NET程序的数据库密码解密

 

简单的.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方法

image-20211103204708152

接着查看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类,发现确实是这个接口的实现,那就对了

image-20211103211610653

继续查看,发现终于找到了加密处理的地方

Utility.GetMD5XXX.common.dll中实现,最终发现其会在md5处理前的数据加上一段估计字符

最后就可以指定这个盐让hashcat去跑密码了。


程序二

大体也非常简单,也是有解密数据库密码的需求,随便翻目录翻到文件AddUser.aspx

直接打开看旁边的.cs源文件,这个一目了然,直接看SecurityMgr中的CreateUser方法就行

找到对应的BizEngine.Security.dll,反编译

密码进入到Encryption.Encrypt(),然后找到对应的DLL跟过去就看到了

进行了DES,我们只需要把这个方法原模原样拿出来就行。

编写解密程序:

成功解开密码


两个案例是这两天项目中遇到的,比较简单