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
虹科網絡安全
關鍵基礎設施安全應急響應中心
信息安全與通信保密雜志社
骨哥說事
看雪學苑
安全牛
網絡研究院
系統安全運維
一顆小胡椒
中國信通院CAICT
一顆小胡椒
HACK之道