作者:知道创宇404实验室 Longofo
时间:2022年05月11日

不久前拿到一个使用.NET目标的任务,有段时间exchange连续出了n次洞,一直想系统学下.NET相关的东西,这次遇到了,趁热补一下。能找到入门.NET WEB的并不多或者真不适合入门,还有大部分已经有经验的大佬大多直接进入反序列化或者漏洞分析阶段,好在部门有个搞过.NET的大佬@HuanGMz带了一手,相对没有那么折磨,Java和.NET相似之处太多,从Java上手.NET或者从.NET上手Java应该都挺快。

调试

根据之前弄Java的经历,要研究漏洞,调试必不可少的。这次首先就是研究怎么调试和反编译dll这些东西。

调试又分为学习漏洞时的调试和审计时的调试:

  • 学习漏洞时的调试:适用于有源码或者要写代码的情况,我这里使用的vs studio,官方提供的东西,应该没有比这更适合用来研究源码和写代码的了。

  • 审计时的调试:直接审计系统,没有源码,全是dll这些东西,目前最好用的应该是dnspy, 可惜不能在dnspy里面写代码,如果dnspy集成了vs studio那些东西,或者vs studio能集成dnspy进去,就更牛逼了,类似Intellij IDEA,应该会更方便。vs studio也可以用来当作dnspy进行远程调试,也可以进行一些配置来实现,不过看大家都用的dnspy,应该vs studio作为远程调试没有dnspy方便。

学习漏洞时的调试(vs studio)

例如学习ysoserial.net的利用链,有源码,可以导入到vs studio,然后还可以自己写一些代码来测试和加深对利用链的理解。

下载ysoserial.net源码,点击解决方案ysoserial.sln,在vs studio打开项目,等待NuGet下载完依赖包(NuGet相当于Java中maven那样的包管理器)。

加载完成之后,此时随意点击几个Generators下面的几个利用链,会看到有的命名空间标红,但是引用中又存在这些包,这里需要f5快捷键生成一下,然后就不会标红了,整个项目就导入成功了:

主要是ysoserial项目,其他两个ExploitClass和TestConsoleApp_YSONET没有用。下面列几个vs studio中常用到的配置或小技巧。

主题themes

好的体验可以稍微提升下效率和干下去的动力,官方也提供了一些themes,一直很喜欢monokai这个花里胡哨的主题,上面那个截图里面的就是monokai主题,字体和界面看起来极其舒适。

反编译和调试的配置

工具->选项->文本编辑器->C#->高级:

工具->选项->调试->常规:

允许调试.net Framework以及禁用JIT优化,JIT优化会影响调试,禁用。

工具->选项->调试->符号(先清除之前的符号文件缓存,添加一个符号文件服务器):

符号简单说指的是源码和行号对应的信息,如果要调试代码,需要pdb符号文件,不然没法调试。这里我使用了本地的符号服务器,是JetBrains提供的一个叫Dotpeek的,使用这东西有几个好处:

  • 从Microsoft或者NuGet获取的符号文件,是根据最新的源代码生成的pdb文件,而本地的.net Framework版本经常不是最新版或者会切换使用,这样就会不对应导致无法调试
  • Dotpeek会自动根据当前dll的版本,自动拉取对应版本的pdb文件或者生成对应版本的pdb文件,十分方便

之前尝试了很多办法,调试.net Framework的代码十分的蛋疼,要么无法调试,要么调试的行号和代码不对应,还有有的类可以调试有的不行。折腾了一两天,最后发现Dotpeek很方便,每次运行调试都会为你处理成正确的pdb符号文件。

.NET版本和切换

右键ysoserial->属性,这儿可以看到系统安装的所有.net Framework版本(注意区分.net Framework和.net Core,这两个不一样,不要混淆了,.net Framework才存在需要的利用链,换成.net Core就没有那些利用链的class了),相当于切换Java中的JDK版本:

添加引用

引用相当于Java中给项目添加lib包:

右键引用,浏览添加三方包,审计项目时,可以把目标的一些dll包添加进去,写代码测试。

对象浏览器

类似IDEA中搜索类,但是感觉很不方便这东西,特别是搜索三方dll中的类或者Framework中的类,无法直接跳转到反编译中,只能看命名空间和所在的程序集,要看代码还要去写个类声明代码然后点击跳转到反编译中,不过也没找到其他方便的方法,凑合用:

debug时动态执行代码

测试代码:

注意下面那一排,有几个比较有用的地方。

调用堆栈:双击栈就可以回到之前的栈帧查看

模块:这里可以看到当前应用加载的dll和exe等文件信息,还有符号文件是否加载,版本,以及加载路径等信息

即时窗口:调试时可以在这里执行一些表达式代码,计算和查看值等,不过这里从vs2017之后,只能执行表达式了,不能写多行代码片段,后面我测试可以使用lambda,在lambda中写片段进行一些更方便的测试(这个即时窗口很丑陋,没idea中那个执行代码片段用着舒服):

总的来说,使用vs stuido没有idea体验那么好,听一个C#老开发说因为vs studio体验好的插件都收费去了...

审计时调试(dnspy)

查找dll

假设应用目录中有Newtonsoft.Json.dll这个dll文件,使用Process Hacker,以管理员身份查找运行,查找这个dll文件(这个才是运行时使用的dll文件):

附加到进程调试

将上面那个dll拖到dnspy中,可以看到上面使用了这个dll的进程是w3wp.exe,进程id为6536,在dnspy中附加到这个进程:

打下断点,如果断点为实心的红点,就没问题了。

无法调试的情况

禁用编译优化,在需要调试的exe或者dll下新建一个同名的ini文件:

禁用JIT优化禁用加载本地映像,在环境变量中设置:

COMPlus_ZapDisable=1
COMPlus_ReadyToRun=0

批量反编译

在dnspy目录下有个dnspy.Console.exe,直接控制台运行可以查看帮助:

将要反编译的dll放在一个目录下,使用dnSpy.Console.exe -o C:\out\path C:\some\path即可,然后就可以愉快的搜索了。

三种web开发方式

ASP.NET 文档中已经清楚的列出了三种开发方式:

想要了解哪一种,点进去看细节就可以了。

区别,文档中说:

所有三个 ASP.NET 框架都基于 .NET Framework,并共享 .NET 和 ASP.NET 的核心功能。例如,所有三个框架都提供基于成员身份的登录安全模型,并且所有三个框架都共享相同的设施来管理请求、处理会话等,这些都是核心 ASP.NET 功能的一部分。此外,这三个框架并不完全独立,选择一个并不排除使用另一个。由于这些框架可以共存于同一个 Web 应用程序中,因此使用不同框架编写的应用程序的各个组件并不罕见。例如,应用程序的面向客户的部分可能在 MVC 中开发以优化标记,而数据访问和管理部分在 Web 窗体中开发以利用数据控制和简单的数据访问

在实际的审计过程中,会遇到三种方式混和开发的系统,因此三种方式都有必要了解下。

如何找漏洞案例和审计函数

微软文档的安全规则里面很详细,算是最好的去处了,也十分贴心的给了demo和危险用法:

后续

通过以上操作,在最开始的目标上拿到了rce。

后续想深入,就是跟漏洞,看漏洞分析,exchange的漏洞可以好好跟下。

参考链接

ysoserial.net

vs studio

vs studio themes

dnspy

Dotpeek

Process Hacker

ASP.NET 文档

禁用编译优化

禁用JIT优化

禁用加载本地映像


Paper 本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/1894/