EasyPersistent是一個用于windows系統上權限維持的Cobalt Strike CNA 腳本。腳本整合了一些常用的權限維持方法,使用反射DLL模塊可使用API對系統服務、計劃任務等常見權限維持方法進行可視化操作(強烈建議使用白名單進程進行操作)。

項目地址:

https://github.com/yanghaoi/CobaltStrike_CNA

0x01 腳本菜單功能

設置常用路徑:全局路徑參數設置
文件控制:文件屬性、文件權限的查看和修改、文件符號鏈接的創建
注冊表:注冊表的增加、刪除、查詢
系統服務:系統服務的創建、查詢、刪除、SDDL設置
用戶操作:系統用戶賬戶的添加、刪除、修改、查詢、克隆、激活、禁用
啟動目錄:系統啟動目錄文件的查詢、寫入
計劃任務:計劃任務的查詢、寫入、刪除
DLL加載:MSDTC服務、Explorer程序DLL劫持
BITS任務:BITS任務的添加、查詢、刪除
WMI事件:WMI事件訂閱的添加、查詢、刪除

0x02 使用方法

GUI界面參數根據理解填寫,可能部分位置有Bug,歡迎提交issues.

文件控制

主要是attrib、takeown、icacls、mklink幾個命令的使用。

注冊表

通過Reg命令執行操作,支持對以下位置進行操作:Run,RunOnce, RunOnceEx,Logon Scripts,Winlogon Shell,Winlogon Userinit

添加方法帶有/f選項,可用于更新鍵值:

查詢位置分為單個鍵查詢和一鍵查詢所有(選項里有的)啟動項位置,查詢所有比較暴力:

其他Tips:

針對x86和x64注冊表位置可使用下拉選項進行選擇;
使用時請注意HKLM和HKCU位置,x86和x64的不同;
HKLM位置可能需要管理員權限,SYSTEM權限在寫入HKCU位置會出現問題。

系統服務

系統服務主要使用SC命令和一些API進行操作

腳本中提供了兩個服務程序TransitEXE.exe和uinit.exe,其中uinit.exe為一個啟動后會返回服務失敗的程序,用于錯誤回調執行,TransitEXE.exe服務程序實現代碼參考[CreateService]主要進行了以下修改:

  • (https://github.com/uknowsec/CreateService)
1. 注釋RC4加密部分
2. 修改資源ID默認為100
3. 增加互斥體檢測退出服務功能
4. 增加進程守護功能
在ReflectiveDll的實現中,根據微軟文檔主要進行了以下功能開發:
1. 設置服務描述,設置多種啟動類型添加,設置SDDL安全描述符

服務守護進程

服務名稱和顯示名稱在SCM中的位置

添加服務時,為了方便測試,腳本對一些參數進行字符隨機化,并對各個流程進行了調試信息輸出:

添加服務后的顯示:

在這里,只需要選擇一個二進制文件上傳,點擊添加即可,之后腳本會根據需要上傳某個服務程序。如果是TransitEXE,反射DLL會將執行命令寫入到服務程序資源信息中,隨后啟動服務,服務程序落地后啟動后會提取出自身資源信息中的命令行,使用CreateProcess第二個參數來執行。

程序描述部分支持中文描述

觸發器啟動

在命令行中的觸發器使用了網絡觸發器:

sc triggerinfo ServiceName start/networkon

API中使用的是硬件接口觸發:

安全描述符設置

在API中通過ConvertStringSecurityDescriptorToSecurityDescriptor和SetServiceObjectSecurity設置服務的安全描述符,如果進行一些限制設置需要SYSTEM權限

注意如果在administrator權限下設置了SDDL限制,那么會導致OpenService Failed的情況

服務啟動失敗回調

啟動服務失敗后會有回調命令執行:

其他

  • 兩個服務程序可以寫成一個,只是uinit.exe是先寫的;
  • 其他設置SDDL、修改服務、查詢、刪除部分功能沒有完全強大,只能說是夠用。
  • 腳本中默認的目錄C:\360\不存在,會導致上傳文件失敗([-] could not upload file: 3),可以修改默認目錄,net helpmsg查詢詳細錯誤情況。

用戶操作

查詢用戶:

使用CS自帶命令bnet()

添加用戶:

集成了CMD命令、API、參數欺騙。API添加和查詢用戶:

自帶參數欺騙添加用戶:

克隆用戶:

通過ridhijack實現:

https://github.com/yanghaoi/ridhijack

賬戶激活與禁用:

這里的功能最初是為了激活Guest的,后面增加了不同組的添加、移除、賬戶激活禁用,主要就是使用api進行一些操作,然后我源碼找不到了...:

啟動目錄

主要就是兩個位置:

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
C:\Users\<User>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

程序可以寫入到目錄中進行自啟動,但是不能設置隱藏屬性。(一次測試不知道怎么搞的這個啟動目錄被搞成了其他位置C:\,啟動后會彈出該目錄下的文件夾,殺軟會毫無反應。記錄到了這個現象,還沒進行深入研究。)

在選項中可以設置遠程文件名和執行方式,為直接上傳和API重啟寫入:

API重啟寫入利用函數MoveFile設置在重啟后寫入,可以繞過一些AV程序對啟動目錄的監控。

計劃任務

計劃任務的操作可由SCHTASKS命令行和API來完成,由于命令行實現功能和API有差距(命令行無法設置描述和創建者)所以分開寫了兩個操作界面:

通過命令行注冊:

通過API注冊:

優化選項:

 - 添加任務時未對文件是否存在進行判斷,未增加文件上傳選項;
 - 命令行模式中的描述可以刪除。

其他:

 - API中使用\Everyone身份,如果沒有已登錄用戶,可能導致啟動失敗。

DLL加載

利用msdtc服務加載oci.dll和Explorer加載linkinfo.dll原理進行DLL劫持,系統啟動后可進行權限維持,通過禁用系統重定向不同位數下的system32目錄進行了操作,方便簡單:

msdtc

注意:在64位系統中生成的DLL要是64位的才能執行,在CobaltStrike4.3中要勾選x64 payload,其他版本中64位DLL+ x86 Payload上線的是x86的rundll32.exe,x64payload上線的是x64的msdtc.exe。

使用64位rundll32程序加載位于C:\windows\system32\下的32位dll,出錯:

那么使用C:\Windows\SysWOW64\rundll32.exe下的32位DLL加載C:\windows\system32\32.dll能成功嗎?

可以看到也是不行的,猜測因為windows的重定向機制,使用32位程序時,系統會去找32位的system目錄(SysWOW64),把C:\windows\system32\32.dll復制到SysWOW64那就可以加載了:

可以看到果然如此!

Explorer

會在用戶登錄后加載C:\windows\linkinfo.dll,同樣需要與系統位數對應的DLL。

Bitsadmin Jobs

簡單使用bitsadmin命令進行操作,據說僅適用于Windows7、8、Server 2008和Server 2012,還咩做實驗。

WMI事件訂閱

使用powershell腳本來進行WMI事件訂閱設置。

預置了6種觸發方式:移動設備、用戶登錄、進程啟動、時間間隔、某個時間、重啟:

0x03 免責聲明

  • 本項目實現中可能會對一些系統服務、底層API進行調用,實現過程中可能會導致系統異常,無法啟動,請自行測試;
  • 本項目僅用于作者進行代碼學習、系統研究等實驗目的,作者不承擔任何責任。

0x04 參考鏈接或源碼

https://github.com/uknowsec/CreateServicehttps://github.com/v1ncilazy/BypassAddUserhttps://github.com/An0nySec/ShadowUserhttps://github.com/Sw4mpf0x/PowerLurk