所以?我只好來挑剔...........他的文筆吧!
重點是【他的解題方式,並不完全正確;看文的人請自己斟酌吧!】
https://www.google.com/search?q=windows中常見後門持久化方法總結
--------------------------------------------------------------------------------------------------
windows中常見後門持久化方法總結
前言
當我們通過各種方法拿到一個服務器的權限的時候,我們下一步要做的就是後滲透了,而後門持久化也是我們後
滲透很重要的一部分,下面我來總結一下windows下常見的後門持久化的方法
後門持久化
我的操作環境是:
無AV、管理員權限(提權、免殺等是後門持久化的鋪墊,當然有的方法也並不是全部需要這些鋪墊)
操作系統:win7,windows server 2008R2,xp
shift後門
這個是比較老的方式了,這裡簡單講一下,在windows中有一些輔助功能,能在用戶未登錄系統之前可以通過組
合鍵來啟動它,類似的輔助功能有:
C:\Windows\System32\sethc.exe 粘滯鍵,啟動快捷鍵:按五次shift鍵
C:\Windows\System32\utilman.exe 設置中心,啟動快捷鍵:Windows+U鍵
在低版本的windows中,我們可以直接把setch.exe替換成我們的後門程序,下面我們把setch.exe替換為cmd.exe
換成cmd.exe並沒有更安全哦!所以?他這是哪抄來的?
映像劫持
這個和shift後門差不多,只不過在低版本的windows中,我們可以簡單地替換程序,但是在高版本的windows版
本中替換的文件受到了系統的保護,所以這裡我們要使用另外一個知識點:映像劫持。
"映像劫持",也被稱為"IFEO"(Image File Execution Options)
就是Image File Execution Options(其實應該稱為"image Hijack"。)是為一些在默認系統環境中運行時可能
引發錯誤的程序執行體提供特殊的環境設定。由於這個項主要是用來調試程序用的,對一般用戶意義不大。默認
是只有管理員和local system有權讀寫修改。
PS:來自百度百科
簡單來說就是當目標程序被映像劫持時,當我們啟動目標程序時,啟動的是劫持後的程序而不是原來的程序
操作也很簡單,在註冊表的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File
Execution Option下添加一個項sethc.exe,然後在sethc.exe這個項中添加debugger鍵,鍵值為我們惡意程序的
加入為【 debugger 名稱 RES_SZ 數值 可執行命令】並沒有結束問題!而且他還是可運行,這樣甚至會干擾執行。
路徑,如下圖
效果如下
註冊表自啟動項 這個是很常見的問題,沒啥毛病!
MSF的Persistence模塊利用的就是寫註冊表自啟動項來實現的,一般自啟動項是這兩個鍵:Run和RunOnce,兩者
的區別如下
Run:該項下的鍵值即為開機啟動項,每一次隨著開機而啟動。
RunOnce:RunOnce和Run差不多,唯一的區別就是RunOnce的鍵值只作用一次,執行完畢後就會自動刪除
常見註冊表啟動項鍵的位置:
用戶級
\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
系統級
\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run
\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\RunOnce
修改一下:
執行結果:
定時任務
windows下定時任務的命令有兩個分別是:at和schtasks,他們兩者主要區別是at命令在win7、08等高版本的
windows中是不能將任務在前台執行的,也就是只會打開一個後台進程,而schtasks是將定時的任務在前台執行
,下面我們逐個看看
at的一些參數
AT [\\computername] time [/INTERACTIVE]
[ /EVERY:date[,...] | /NEXT:date[,...]] "command"
at的執行如下:
schtasks一些參數:
schtasks /create /tn TaskName /tr TaskRun /sc schedule [/mo modifier] [/d day] [/m month
[,month...] [/i IdleTime] [/st StartTime] [/sd StartDate] [/ed EndDate] [/s computer [/u [domain
\]user /p password]] [/ru {[Domain\]User | "System"} [/rp Password]] /?
schtasks的執行如下:
用戶登陸初始化
Userinit的作用是用戶在進行登陸初始化設置時,WinLogon進程會執行指定的login scripts,所以我們可以修
改它的鍵值來添加我們要執行的程序
註冊表路徑為:HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit,我們添加一個我
們啟動的程序,多個程序用逗號隔開
效果如下:
Logon Scripts
Logon Scripts優先於av先執行,我們可以利用這一點來繞過av的敏感操作攔截
註冊表路徑為:HKEY_CURRENT_USER\Environment,創建一個鍵為:UserInitMprLogonScript,其鍵值為我們要
啟動的程序路徑
效果如下:
屏幕保護程序
在對方開啟屏幕保護的情況下,我們可以修改屏保程序為我們的惡意程序從而達到後門持久化的目的
其中屏幕保護的配置存儲在註冊表中,其位置為:HKEY_CURRENT_USER\Control Panel\Desktop,關鍵鍵值如下
:
SCRNSAVE.EXE - 默認屏幕保護程序,我們可以把這個鍵值改為我們的惡意程序
ScreenSaveActive - 1表示屏幕保護是啟動狀態,0表示表示屏幕保護是關閉狀態
ScreenSaverTimeout - 指定屏幕保護程序啟動前系統的空閒事件,單位為秒,默認為900(15分鐘)
設置如下:
效果圖:
自啟動服務 這個是很常見的問題,沒啥毛病!
自啟動服務一般是在電腦啟動後在後台加載指定的服務程序,我們可以將exe文件註冊為服務,也可以將dll文件
註冊為服務
為了方便起見我們可以直接用Metasploit來註冊一個服務
meterpreter > run metsvc -A
運行之後msf會在%TMP%目錄下創建一個隨機名稱的文件夾,然後在該文件夾裡面生成三個文件:metsvc.dll、
metsvc-server.exe、metsvc.exe
同時會新建一個服務,其顯示名稱為Meterpreter,服務名稱為metsvc,啟動類型為"自動",默認綁定在31337端
口。
如果想刪除服務,可以執行
meterpreter > run metsvc -r
影子用戶 這個是很常見的問題,沒啥毛病!
影子用戶顧名思義就是一個隱藏用戶,只能通過註冊表查看這個用戶,其它方式是找不到這個用戶的信息的
在用戶名後面加一個$可以創建一個匿名用戶,創建完畢後我們再把這個用戶添加到administrator組
net user test$ test /add
net localgroup administrators test$ /add
可以看到net user是看不到我們創建的用戶,但是計算機管理-用戶和組中可以看到
所以這時候我們就需要修改一下註冊表,其鍵位置為:HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users
這個解法,會造成另外一種漏洞,而且嚴重性頗高。
注意:SAM鍵值默認是只能system權限修改的,所以我們要修改一下SAM鍵的權限,給予administrator完全控制和讀取的權限
然後我們將administrator用戶對應的項中的F值複製到test$對應xiang中的F值,然後保存
然後我們將test$刪除掉
net user test$ /del
然後再雙擊導出的註冊表文件,然後我們再看一下
net user和計算機管理-用戶和組中都查看不到用戶了,但是我們可以用net user test$查看用戶信息
這個時候我們再用net user test$ /del是刪除不掉這個用戶的,只能通過註冊表來刪除。
waitfor
關於waitfor手冊中是這麼解釋的:
在系統上發送或等待信號。 waitfor可用於跨網絡同步計算機。
waitfor的語法
waitfor [/s
waitfor [/t
參數解釋:
/s
/u [
/p
/si 發送指定激活信號。
/t 指定等待信號的秒數。默認為無限期等待。
關於waitfor更多的信息可以看一下微軟提供的手冊:鏈接
我們來測試一下看看
waitfor test && calc 表示接收信號成功後執行計算器
waitfor /s 192.168.163.143 /u qiyou /p qiyou /si test
結果如下
但是這樣只能執行一次,這對我們後門持久化很不利,所以我們得想辦法讓它持久化。
這裡就要藉用一下三好師傅的powershell腳本:鏈接,三好師傅的分析:鏈接
執行效果如下:
該方法的優點就是能主動激活,但是缺點也明顯就是只能在同一網段才能接收和發送激活信號、服務器重啟之後
就不行了。
CLR
CLR的簡述(來自百度百科)
CLR(公共語言運行庫,Common Language Runtime)和Java虛擬機一樣也是一個運行時環境,是一個可由多種編程
語言使用的運行環境。 CLR的核心功能包括:內存管理、程序集加載、安全性、異常處理和線程同步,可由面向
CLR的所有語言使用。並保證應用和底層操作系統之間必要的分離。 CLR是.NET Framework的主要執行引擎。
需要注意的是CLR能夠劫持系統中全部.net程序,而且系統默認會調用.net程序,從而導致我們的後門自動觸發
,這是我們後門持久化的一個好的思路,下面來實現一下
修改一下註冊表,註冊表路徑:HKEY_CURRENT_USER\Software\Classes\CLSID\,新建子項{11111111-1111-
1111-1111-111111111111}(名字隨便,只要不與註冊表中存在的名稱衝突就行),然後再新建子項
修改一下註冊表,註冊表路徑:HKEY_CURRENT_USER\Software\Classes\CLSID\,新建子項{11111111-1111-
1111-1111-111111111111}(名字隨便,只要不與註冊表中存在的名稱衝突就行),然後再新建子項
InProcServer32,新建一個鍵ThreadingModel,鍵值為:Apartment,默認的鍵值為我們dll的路徑
然後在cmd下設置一下:
PS:要註冊為全局變量,不然只能在當前cmd窗口劫持.net程序
SETX COR_ENABLE_PROFILING=1 /M
SETX COR_PROFILER={11111111-1111-1111-1111-111111111111} /M
然後執行一波,效果如下,可以看到已經成功劫持了
Hijack CAccPropServicesClass and MMDeviceEnumerator
什麼是COM(來自WIKI)
這個解釋得太淺了,比較深入的說詞是引起的命令行為,無限擴大。
組件對像模型(英語:Component Object Model,縮寫COM)是微軟的一套軟件組件的二進制接口標準。這使得
跨編程語言的進程間通信、動態對象創建成為可能。 COM是多項微軟技術與框架的基礎,包括OLE、OLE自動化、
ActiveX、COM+、DCOM、Windows shell、DirectX、Windows Runtime。
這個和CRL劫持.NET程序類似,也是通過修改CLSID下的註冊表鍵值,實現對CAccPropServicesClass和
MMDeviceEnumerator的劫持,而係統很多正常程序啟動時需要調用這兩個實例,所以這個很適合我們的後門持久
化。
經測試貌似64位系統下不行(或許是我姿勢的問題),但是32位系統下可以,下面說一下32位系統利用方法:
在%APPDATA%\Microsoft\Installer\{BCDE0395-E52F-467C-8E3D-C4579291692E}\下放入我們的後門dll,重命名
為test._dl
PS:如果Installer文件夾不存在,則依次創建Installer\{BCDE0395-E52F-467C-8E3D-C4579291692E}
然後就是修改註冊表了,在註冊表位置為:HKCU\Software\Classes\CLSID\下創建項{b5f8350b-0548-48b1-
a6ee-88bd00b4a5e7},然後再創建一個子項InprocServer32,默認為我們的dll文件路徑:C:\Users\qiyou
\AppData\Roaming\Microsoft\Installer\{BCDE0395-E52F-467C-8E3D-C4579291692E},再創建一個鍵
ThreadingModel,其鍵值為:Apartment
然後就是測試了,打開iexplore.exe,成功彈框
PS:{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7}對應CAccPropServicesClass,{BCDE0395-E52F-467C-8E3D-
C4579291692E}對應MMDeviceEnumerator
劫持MruPidlList
在註冊表位置為HKCU\Software\Classes\CLSID\下創建項{42aedc87-2188-41fd-b9a3-0c966feabec1},再創建一
個子項InprocServer32,默認的鍵值為我們的dll路徑,再創建一個鍵ThreadingModel,其鍵值:Apartment
該註冊表對應COM對象MruPidlList,作用於shell32.dll,而shell32.dll是Windows的32位外殼動態鏈接庫文件
,用於打開網頁和文件,建立文件時的默認文件名的設置等大量功能。其中explorer.exe會調用shell32.dll,
然後會加載COM對象MruPidlList,從而觸發我們的dll文件
當用戶重啟時或者重新創建一個explorer.exe進程時,就會加載我們的惡意dll文件,從而達到後門持久化的效
果。這裡我們直接結束一個explorer.exe進程再起一個進程來看一下效果
office系列
Word WLL
把dll文件保存在%APPDATA%\Microsoft\Word\Startup,然後把後綴名改為wll
PS:Startup支持啟動多個wll
打開word,成功彈框
Excel XLL
Excel dll的編寫可以參考三好師傅這個項目:鏈接
用三好師傅powershell腳本生成現成的Excel dll:鏈接
將生成的DLL文件複製到%appdata%\Microsoft\AddIns目錄下,然後再修改一下註冊表,office版本對應的註冊
表位置如下:
office2003 — HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\
office2007 — HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\
office2010 — HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\
office2013 — HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\
office2016 — HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\
我這裡使用的2010的,所以我們要修改的是HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel
\Options,添加一個鍵OPEN,鍵值為:/R test.dll
然後打開Excel,發現成功彈出計算器
PowerPoint VBA add-ins
用三好師傅powershell腳本生成現成的PowerPoint dll:鏈接
將生成的DLL文件複製到%appdata%\Microsoft\AddIns目錄下,然後參考前面我給出的office版本對應的註冊表
位置,在HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\PowerPoint下新建一個子項:AddIns,然後在
AddIns下面新建一個子項test,新建一個鍵為Autoload,類型為DWORD,鍵值為:1;新建一個鍵為Path,類型為
SZ,鍵值為我們dll文件的路徑
打開PowerPoint成功彈出計算器
文件關聯
這個是很常見的問題,沒啥毛病!
什麼是文件關聯
文件關聯就是將一種類型的文件與一個可以打開它的程序建立起一種依存關係。一個文件可以與多個應用程序發
生關聯。可以利用文件的“打開方式”進行關聯選擇。
舉個例子來說,位圖文件(BMP文件)在Windows中的默認關聯程序是“圖片”,如果將其默認關聯改為用ACDSee
程序來打開,那麼ACDSee就成了它的默認關聯程序。
PS:來自百度百科
我們可以用assoc命令顯示或修改文件擴展名關聯,我們可以看一下.txt文件的關聯
我們可以用ftype命令顯示或修改用在文件擴展名關聯中的文件類型
相關註冊表
HKEY_CURRENT_USER\Software\Classe //保存了當前用戶的類註冊和文件擴展名信息
HKEY_LOCAL_MACHINE\Software\Classe //保存了系統所有用戶用戶的類註冊和文件擴展名信息
HKEY_CLASS_ROOT //HKEY_CLASSES_ROOT項提供合併來自上面兩個的信息的註冊表的視圖
我們以.txt為例,通過文件關聯來修改它默認打開的程序。
修改\HKEY_CLASS_ROOT\txtfile\shell\open\command的默認值為我們要執行的程序
效果如下:
AppInit_DLLs
User32.dll被加載到進程時,會讀取AppInit_DLLs註冊表項,如果有值,調用LoadLibrary() api加載用戶dll。
其註冊表位置為:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
\AppInit_DLLs,把AppInit_DLLs的鍵值設置為我們dll路徑,將LoadAppInit_DLLs設置為1
效果如下:
Netsh helper
netsh(全稱:Network Shell) 是windows系統本身提供的功能強大的網絡配置命令行工具,它可以添加自定的
dll從而拓展其功能,我們可以使用netsh add helper yourdll.dll來添加拓展功能,添加了之後,在啟動netsh
的時候就會加載我們dll文件
添加自定義helper dll
關於helper dll的編寫可以參考這個項目:鏈接
我們可以使用兩種方式來添加helper:
通過cmd添加helper
netsh add helper test.dll
通過註冊表添加helper
其位置為:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NetSh,創建一個鍵,名稱隨便,鍵值為我們dll的路
徑
效果如下:
利用BITS
這個是很常見的問題,沒啥毛病!
BITS (後台智能傳送服務) 是一個 Windows 組件,它可以在前台或後台異步傳輸文件,為保證其他網絡應用程
序獲得響應而調整傳輸速度,並在重新啟動計算機或重新建立網絡連接之後自動恢復文件傳輸。
bitsadmin是一個命令行工具,用於創建下載或上傳任務並監視其進度。你可以執行bitsadmin /?或bitsadmin
/HELP獲取幫助列表。
常見的bitsadmin命令
bitsadmin /create [type] DisplayName //創建一個任務
bitsadmin /cancel
bitsadmin /list /allusers /verbose //列出所有任務
bitsadmin /AddFile
bitsadmin /SetNotifyCmdLine
bitsadmin /Resume
bitsadmin /cancel
bitsadmin /reset /allusers //刪除所有任務
bitsadmin /complete
下面我們來測試一下:
bitsadmin /create test
bitsadmin /addfile test c:\windows\system32\calc.exe c:\Users\qiyou\Desktop\calc.exe //為了方便起見我們直接複製本地文件
bitsadmin /SetNotifyCmdLine test cmd.exe "cmd.exe /c calc.exe"
bitsadmin /resume test
效果如下:
重啟電腦之後任務還是存在
重啟電腦之後任務會再一次被激活,大概幾分鐘之後我們的命令會再次執行(由於時間太長了就不錄製gif了)
如果我們想讓任務完成,可以執行bitsadmin /complete test,calc.exe也會復製到桌面上
利用inf文件實現後門
inf文件
這個是很常見的問題,沒啥毛病!
INF文件或安裝信息文件是Microsoft Windows用於安裝軟件和驅動程序的純文本文件。 INF文件最常用於安裝硬
件組件的設備驅動程序。 Windows包含用於創建基於INF的安裝的IExpress工具。 INF文件是Windows安裝程序API
及其後續版本Windows Installer的一部分。
PS:來自WIKI
inf文件的結構
想了解更多可以看一下微軟的手冊:https://docs.microsoft.com/en-us/previous-versions/windows/it-
pro/windows-2000-server/cc939869(v=technet.10)#information-inf-file-entries
1. DefaultInstall節(來自WIKI)
INF文件的結構與INI文件的結構非常類似; 它包含用於指定要復制的文件,對註冊表的更改等的各個部分。所有
INF文件都包含一個[Version]帶有Signature 鍵值對的部分,用於指定INF文件所針對的Windows版本。簽名通常
是$CHICAGO$(對於Windows 9x)或$WINDOWS NT$(對於Windows NT / 2K / XP)。其餘大多數部分是用戶定義
的,並且包含特定於要安裝的組件的信息。
2. DefaultInstall節(來自微軟的手冊)
RunPreSetupCommands-本節中指定的命令在安裝服務配置文件之前運行。
RunPostSetupCommands-本節中指定的命令在安裝程序完成服務配置文件後運行。
RunPreUnInstCommands-本節中指定的命令在卸載程序開始之前運行。
RunPostUnInstCommands-本節中指定的命令在卸載程序運行後運行。
下面舉一個calc.inf彈計算器的例子
[Version]
Signature="$CHICAGO$"
AdvancedINF=2.5,"test"
[DefaultInstall]
RunPreSetupCommands=Command1
[Command1]
C:\windows\system32\calc.exe
命令行下執行:
rundll32.exe advpack.dll,LaunchINFSection calc.inf,DefaultInstall
效果如下:
後門實現:
在註冊表HKEY_CURRENT_USER\Software\Microsoft\處依次新建子項\IEAK\GroupPolicy\PendingGPOs,然後再新
建幾個鍵,如下:
鍵:Count,類型:REG_DWORD,鍵值:1
鍵:Path1,類型:REG_SZ,鍵值:C:\Users\Administrator\Desktop\test\calc.inf //這個為我們inf文
件的路徑,這里以上面那個inf文件例子為例
鍵:Section1,類型:REG_SZ,鍵值:DefaultInstall
如下圖所示:
重啟電腦之後成功彈出計算器
但是重啟之後PendingGPOs該項就會被清除,需要我們重新修改註冊表
後記
以上就是我所總結後門持久化的所有內容了,當然還有很多方法沒有在文章內提及,雖然有的方法都是老生常談的了,但是還是在一些實戰環境中屢試不爽,有一句話說的好(這句話忘記是哪位師傅說的了=。=):知識面寬度決定攻擊面廣度,知識鏈深度決定攻擊鏈的長度 Reference
https://github.com/Ridter/Intranet_Penetration_Tips
https://paper.seebug.org/1007/
https://3gstudent.github.io/
--------------------------------------------------------------------------------------------------
沒有留言:
張貼留言
歡迎討論