作者:知道創宇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 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1894/