探索基於.NET下實現一句話木馬之ashx篇

来源:https://www.cnblogs.com/Ivan1ee/archive/2019/01/10/10251961.html
-Advertisement-
Play Games

0x01 前言 在滲透測試的時候各種PHP版的一句話木馬已經琳琅滿目,而.NET平臺下的一句話木馬則百年不變,最常見的當屬下麵這句 筆者感覺有必要挖坑一下.NET平臺里的一句話木馬,經過一番摸索填坑終於可以總結出了.NET下的三駕馬車,於是乎有了這個系列的文章。今天是第一篇著重介紹一般處理程式 (A ...


0x01 前言

在滲透測試的時候各種PHP版的一句話木馬已經琳琅滿目,而.NET平臺下的一句話木馬則百年不變,最常見的當屬下麵這句

筆者感覺有必要挖坑一下.NET平臺里的一句話木馬,經過一番摸索填坑終於可以總結出了.NET下的三駕馬車,於是乎有了這個系列的文章。今天是第一篇著重介紹一般處理程式 (ASHX)下的工作原理和如何實現一句話木馬的介紹,當然介紹之前筆者找到了一款ashx馬兒 https://github.com/tennc/webshell/blob/master/caidao-shell/customize.ashx 

 

這個馬兒已經實現了菜刀可連,可用,還是挺棒的,但因為體積過大,並且在服務端實現了大多數功能,其實更像是一個大馬,只是對客戶端的菜刀做了適配可用,所以不能說是一句話木馬了,至於要打造一款居家旅行必備的菜刀馬,還得從原理上搞清楚 ashx的運行過程。

0x02 簡介

從Asp.Net 2.0開始,Asp.Net提供了稱為一般處理程式的處理程式,允許我們使用比較簡單的方式定義擴展名為ashx的專用處理程式。對於Asp.Net應用來說,網站最快的處理結果就是HTML網頁,生成網頁的工作通常使用擴展名為Aspx的Web窗體來完成。對於處理結果不是HTML的請求,都可以通過一般處理程式完成。例如生成RSS Feed、XML、圖片等。 一般處理程式是Asp.Net應用中最為簡單、高效的處理程式,在處理返回類型不是HTML的請求中有著重要的作用。通常是實現IHttpHandler介面,因為不必繼承自Page類,所以沒有那麼多事件需要處理,不必消耗太多資源,所以性能方面要比Aspx高。

Http請求進入 Asp.Net Runtime以後,它的管道由托管模塊(NOTE:Managed Modules)和處理程式(NOTE:Handlers)組成,並且由管道來處理這個 Http請求。

HttpRuntime將Http請求轉交給 HttpApplication,HttpApplication代表著程式員創建的Web應用程式。HttpApplication創建針對此Http請求的 HttpContext對象,這些對象包含了關於此請求的諸多其他對象,主要是HttpRequest、HttpResponse、HttpSessionState等。這些對象在程式中可以通過Page類或者Context類進行訪問,而接下來的一句話木馬就是通過Context類進行請求交互的。

0x03 一句話的實現

3.1、同步處理:IHttpHandler

首先可以打開C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\CONFIG\ 目錄下的web.config 文件,找到httpHandlers結點,應該可以看到如下這樣的代碼

.Net Framework在處理Http請求時的所採用的預設Handler。而如果我們要用編程的方式來操控一個Http請求,我們就需要實現IHttpHandler介面,來定製我們自己的需求。IHttpHandler的定義是這樣的:

由上面可以看出IHttpHandler要求實現一個方法和一個屬性。其中 ProcessRequest,從名字(處理請求)看就知道這裡應該放置我們處理請求的主要代碼。IsReusable屬性,MSDN上是這樣解釋的:獲取一個值,該值指示其他請求是否可以使用 IHttpHandler 實例。也就是說後繼的Http請求是不是可以繼續使用實現了該介面的類的實例。如果返回true,則HttpHandler能得到重用,或許某些場合下,是可以達到性能優化的目的。但是,它也可能會引發新的問題:HttpHandler實例的一些狀態會影響後續的請求,也正是由於這個原因在預設情況下,都是不重用的。在通常情況下,當實現IsReusable時返回false,雖然性能上不是最優,但卻是最安全的做法。

瞭解了基本原理後,筆者開始手動打造一句話小馬,這個馬兒要和PHP或者同胞兄弟Aspx一樣,僅僅在服務端存放體積很小的一段代碼,參考Aspx一句話木馬的實現原理,發現是基於Jscript.Net語言中的eval方法去執行任意字元串的,所以首當其衝考慮用Jscript,並且需要實現IhttpHandler這個介面,查詢資料後得到在Jscript.Net和VB.Net中均採用implements去實現,最終寫出一句話木馬服務端代碼:

這裡有必要簡單的介紹一下Jscript.Net的語法;和大多數語言類似導入命名空間也是通過Import,以下摘自微軟描述

 

 

script簡單語法就介紹到這裡,更多的語法可參考微軟官方文檔:https://docs.microsoft.com/zh-cn/previous-versions/visualstudio/visual-studio-2010/z688wt03(v%3dvs.100)

萬事俱備,打開瀏覽器輸入 context.Response.Write(DateTime.Now.ToString()) 成功列印出當前時間

3.2、非同步處理:IHttpAsyncHandler

在ASP.NET程式中,適當地使用非同步是可以提高服務端吞吐量的。 這裡所說的適當地使用非同步,一般是說:當伺服器的壓力不大且很多處理請求的執行過程被阻塞在各種I/O等待(以網路調用為主)操作上時, 而採用非同步來減少阻塞工作線程的一種替代同步調用的方法。 反之,如果伺服器的壓力已經足夠大,或者沒有發生各種I/O等待,那麼,在此情況下使用非同步是沒有意義的。那麼在HttpHandler的介面里要想支持非同步,則必須使用另一個介面:IhttpAsyncHandler

這個介面也很簡單隻有二個方法,在.net中,非同步都是建立在IAsyncResult介面之上的,而BeginProcessRequest / EndProcessRequest是對這個介面最直接的使用方式。筆者通過創建一個C#的Demo來演示非同步處理的過程

值得註意的是ProcessRequest方法和IsReusable屬性可以不實現它們,但必須要保留下來,因為這個方法也是介面的一部分。核心方法是BeginProcessRequest,其中參數asyncCallback是一個內部委托,那麼就需要定義一個委托,將來通過非同步的方式回調自定義的方法writeFile 來寫入文件。知道原理後就開始著手打造非同步調用的一句話木馬,和IhttpHandler一樣需要通過Jscript.Net的eval方法去實現代碼執行,有點遺憾之處筆者查詢資料後發現Jscript.Net暫時不支持委托類型,不過只需要在BeginProcessRequest方法里增加HttpContext.Current.Response.End();就可以實現功能並且不讓程式拋出異常,實現的代碼如下:

打開瀏覽器,測試效果如下

0X04 菜刀連接

圈內常說武功再高,也怕菜刀;那麼就有必要瞭解一下菜刀在連接ASPX的時候會發送什麼數據了,經過抓包得到下圖的請求

 

 對於.NET平臺的應用程式預設連接後發送的可執行字元串是Response.Write,而這樣的輸出需要繼承的對象是Page類,所以至今為止,在菜刀的層面.NET下僅支持ASPX,再來看一般處理程式中已經繼承了HttpContext對象實例化後的變數context,由此可以構造出

修改好後用菜刀連接成功,如下圖

基於優化考慮將HandlerSpy.ashx進一步壓縮體積後只有531位元組,而AsyncHandlerSpy.ashx也才719位元組。

 

0x05 防禦措施

通過菜刀連接的方式,添加可以檢測菜刀關鍵特征的規則;對於Web應用來說,儘量保證代碼的安全性;

0x06 小結

 文章中不足之處在於Jscript非同步處理的時候沒有能夠用委托的方式去調用,這是一個遺憾,如果有同學提出了更好的解決方法,歡迎多多交流;還有本文提供了兩種方式實現ashx一句話的思路,當然還有更多編寫一句話的技巧有待發掘,下次將介紹另外一種姿勢,敬請期待;文章的代碼片段請點這裡

0x07 參考鏈接

https://docs.microsoft.com/zh-cn/previous-versions/visualstudio/visual-studio-2010/e2h4yzx6%28v%3dvs.100%29

http://www.freebuf.com/articles/web/11687.html

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 題意 "題目鏈接" Sol $n \leqslant 16$可以想到狀壓 我們可以預處理出任意兩行之間每列的最小值以及相鄰兩列的最小值 然後枚舉一個起點,$f[sta][i]$表示走過了$sta$這個集合內的元素,當前在$i$點的$k$的最大值 轉移的時候枚舉接下來走哪個位置即可 時間複雜度$n^3 ...
  • 1. 問題 假設我在Windows10的環境新建一個4.6的WPF項目,添加一個ComboBox,並用Blend在這個ComboBox上右鍵“編輯模板” “編輯副本”,Blend不僅幫我創建了模板,還會自動引用PresentationFramework.Aero2這個DLL,即使用Aero2這個主題 ...
  • 1.Kafka相關知識 Broker:即Kafka的伺服器,用戶存儲消息,Kafa集群中的一臺或多台伺服器統稱為broker。 Message消息:是通信的基本單位,每個 producer 可以向一個 topic(主題)發佈一些消息。 Kafka中的Message是以topic為基本單位組織的,不同 ...
  • static void Main(string[] args) { Console.WriteLine("請輸入你要的數字:"); long flag = Convert.ToInt64(Console.ReadLine()); long result = MakeRusult(flag); Con ...
  • win10操作就是把文件夾隱藏的對勾勾上 然後就可以看見一個.SVN的文件夾 把他直接刪除即可 然後刷新 自己親測的 win10 家庭版 ...
  • 具體實現:1.在解決方案目錄上點右鍵2.在烏龜SVN菜單中找到"屬性"點開 3.在彈出窗中點 新建--其他 4.在彈出窗中的"屬性"中選擇"svn:ignore"5.然後取值中填上bin和obj各一行 6.確認並提交目錄更新然後每次提交解決方案目錄的時候就會忽略掉bin和obj目錄 求知若飢,虛心若 ...
  • 1. 單一職責原則(Single Responsibility Principle) 每一個類應該專註於做一件事情。降低類的複雜度,一個類只負責一項職責.提高類的可讀性,提高系統的可維護性, 2. 里氏替換原則(Liskov Substitution Principle)超類存在的地方,子類是可以替 ...
  • wpf中的WebBrowser相比之前的winform閹割了不少東西,也增加了不少東西,但是msdn對wpf也沒有較好的文檔 WebBrowser可以說是一個.NET控制項,相對於WPF中的控制項,不在同一線程,它們不可重疊,相當於兩個獨立的視窗`(window ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...