开始协议处理句柄_基于smb协议的wmiexec浅析
前言
之前研究過Crackmapexec這款工具,對這個工具基于smb協議的wmiexec執行方法產生的流量進行了分析,網上似乎還沒有相關的文章,這里旨在拋磚引玉,簡單梳理下整個過程,以初學者的視角,探索流量當中存在的奧妙之處。
前序知識
OPC協議
OPC協議:OPC是一種利用微軟的COM/DCOM技術來達成自動化控制的協定,采用典型的C/S模式,針對硬件設備的驅動程序由硬件廠商完成,提供統一OPC接口標準的Server程序,軟件廠商只需按照OPC標準接口編寫Client程序就訪問Server程序進行讀寫,即可實現與硬件設備的通信。與大多數應用層協議不同,OPC的基礎協議DCOM協議使用動態端口機制,在真正建立數據連接之前通訊雙方還需要協商需要使用的端口。
用一張網上的圖來表示下:
上圖中,OPC客戶端使用5568作為源端口首先向OPC服務器的135端口發起連接,連接成功后再經過OPC服務器分配新端口1118,并通過接口ISystemActivator的方法RemoteCreateInstance的應答報文返回給客戶端,之后客戶端使用5569作為源端口向服務器的1118端口發起新的連接用來后面的真正數據的傳輸。為什么會是這個流程那是因為在Windows當中有一個運行在135端口的rpcss服務也就是dcom的激活服務負責協調本機所有com對象的激活,當本機激活時采用通過內核通信,無法捕獲數據包,屬于內部操作,只有當遠程激活或遠程重定向到本機激活這種方式才可以捕獲到數據包.遠程激活有2種方式,一種是采用CoCreateInstanceEx方式指定遠程服務器和激活身份等參數調用rpscss的IRemoteSCMActivator接口的RemoteCreateInstance方法激活,或者CoGetClassObject等于調用rpscss的IRemoteSCMActivator接口的RemoteGetClassObject方法激活同樣可選指定遠程服務器和激活身份等參數,這里就是采取了調用rpscss的IRemoteSCMActivator接口的RemoteCreateInstance方法激活的方式
DCERPC
RPC是一種編程模型,主要用于應用程序實現遠程過程調用,微軟的DCEPRC即是對遠程過程調用的一種實現和擴展,實際上Windows上的很多服務以RPC的形式對外提供調用接口,外部應用程序可以通過調用這些PRC接口來實現對特定服務的訪問。DCERPC有多種不同的承載方式,如TCP、UDP、HTTP、SMB命名管道等,客戶端通過不同的承載協議連接到指定的服務端,由UUID綁定(Bind)到需要使用的終端接口(endpoint/interface)上,再傳遞所需參數來調用接口上指定的方法(operation),服務端隨后將執行結果封裝到協議數據包中返回。當使用TCP作為承載協議時DCERPC的知名端口號為135。
在RPC中,不同的終端定義了各自的一系列操作方法以供被調用,這些終端由各自唯一的UUID作為標識,在DCERPC的Bind操作中指定UUID,以告訴服務端使用哪個終端接口,TCP三次握手連接建立之后,例如DCERPC的綁定操作中通過指定UUID為367ABB81-9844-35F1-AD32-98F038001003,該UUID對應的終端是SVCCTL(ServiceControl,與服務管理相關的調用)。
SMB協議可以由多種命令來承載DCE/MS RPC層數據,同樣是139、445/TCP上的通信,因不同的SMB命令而導致不同的SMB層解碼。
環境
攻擊者:MAC-192.168.56.1受害者:Win7-192.168.56.3
執行命令方式
sudo cme smb 192.168.56.3 -u Administrator -p '123456' --exec-method wmiexec -x whoami
流量特征簡要分析
1、Crackmapexec基于wmiexec執行命令,首先也是先建立smb連接,首先攻擊者發送一個SMB negotiate protocolrequest請求數據包
在用戶級共享(與之相對的是共享級共享)中"NTLM 0.12"是首選SMB dialect,也就是NTLM版本為0.12,如果在NEGTIATE Request中說了,我可以支持Dialect:202、210、300、302、311,對應版本即為SMB 2.02 2.1 3.0 3.0.2 3.1.1
在下圖當中我們看到首選的確實為NTLM 0.12
2、攻擊者機器發起認證協商請求
3、受害者機器發起響應,返回一個NTLM Server Challenge
4、然后攻擊者機器發送User Name、Host Name、Domain Name和response給受害者機器
5、然后服務端返回,沒有提示出錯信息,說明成功建立連接了
6、我們會發現它是先進行了smb v1的認證之后,然后又進行了smb v2的認證
7、當攻擊者和受害者完成了磋商和認證之后,它會發送一個tree connect andx rerquest SMB數據報并列出它想訪問網絡資源的名稱
8、受害者機器會發送一個tree connect andx response應答數據報以表示此次連接是否被接受或拒絕,下圖可以看到沒有提示錯誤,說明連接成功
9、下面是攻擊者去告訴受害者這臺機器,它想去連接svcctl服務
10、下面是響應內容
11、接下來我們的攻擊者機器開始進行DCERPC的綁定操作,通過指定UUID為367ABB81-9844-35F1-AD32-98F038001003,該UUID對應的終端是SVCCTL(ServiceControl,與服務管理相關的調用)
12、接著我們攻擊者機器收到了Bindack(12)報文,但是并不意味著BIND操作成功,要檢查Ack result字段,解析Bindack報文時,務必判斷Ack result字段是否 等于Acceptance(0),此時意味著BIND操作成功,Bind_ack(12)報文的RPC層大小與協議序列有關
13、綁定操作完成后,將對選用的終端接口執行指定方法調用,調用方法通過opnum指定,調用SVCCTL中編號為15的方法,即OpenSCManagerW(調用參數已經過編碼加密)
14、然后受害者機器返回相應的響應信息,這里還沒有用到OpenSCManagerW的返回的句柄只是流量當中存在這個過程所以做了下分析
15、AUTH3之前的Bind的UUID為ISystemActivator(000001a0-0000-0000-c000-000000000046)代表協商的服務為IRemoteSCMActivator方式,因為后面將會調用RemoteCreateInstance就是屬于IRemoteSCMActivator當中的方法
16、然后攻擊者機器給受害者機器傳遞NTLM認證參數
17、然后攻擊者機器使用RemoteCreateInstance(Opnum 4)方法為實際對象創建對象引用
18、接下來查看下受害者機器的響應,此處回復加密數據當中回復1030端口
19、所以后面我們的攻擊者機器開始于受害者機器利用1030端口進行通信
20、然后再去進行了DCERPC的綁定操作進行綁定相應的UUID:f309ad18-d86a-11d0-a075-00c04fb68820也就是我們的IWbemLevel1Login
21、接著我們攻擊者機器收到了Bindack(12)報文,但是并不意味著BIND操作成功,要檢查Ack result字段,解析Bindack報文時,務必判斷Ack result字段是否 等于Acceptance(0),此時意味著BIND操作成功
22、進行了傳遞NTLM認證參數
23、然后調用了IWbemLevel1Login接口當中的Opnum為6的NTLMLogin方法,下面可以看到我們傳遞的參數的//./root/cimv2命名空間
HRESULT NTLMLogin( [in, unique, string] LPWSTR wszNetworkResource, [in, unique, string] LPWSTR wszPreferredLocale, [in] long lFlags, [in] IWbemContext* pCtx, [out] IWbemServices** ppNamespace );
24、下面是返回響應的內容
25、接著調用了alter_context進行添加新的安全上下文,其實也就是新綁定了一個IRemUnknown UUID: 00000131-0000-0000-c000-000000000046
26、下面就是alert_context回復以及我們受害者機器發送AUTH3包進行認證
27、然后調用了RemRelease方法請求在對象的指定接口數量上遞減指定數量的引用計數,此處對我們之前引用的IWbemLevel1Login接口對象進行了銷毀
HRESULT RemRelease( [in] unsigned short cInterfaceRefs, [in, size_is(cInterfaceRefs)] REMINTERFACEREF InterfaceRefs[] );
28、接著又去添加新的安全上下文,Interface UUID: 9556dc99-828c-11cf-a37e-00aa003240c7,這個接口對象其實就是IWbemServices,然后下面日常的響應、認證等操作
29、然后之后調用了Opnum為6的方法也就是GetObject方法,GetObject方法檢索CIM類或CIM實例。此方法必須從與當前IWbemServices接口關聯的名稱空間中檢索CIM對象,取得我們想要調用的Provider類型實例,他以一個IWbemClassObject類型指針返回,微軟在WMI核心部件和微軟WMI軟件開發工具中包括了很多提供程序。我們最常用的是Win32提供程序(核心WMI),他用于處理Win32系統特征。CIM存儲庫把這些信息存儲為以"Win32"為前綴的類中,他包含在root\CIMV2名字空間中。例如,Win32BIOS、Win32Service、Win32Process等等,所以下面的圖當中可以看到,我們傳入的是Win32_Process類
HRESULT GetObject( [in] const BSTR strObjectPath, [in] long lFlags, [in] IWbemContext* pCtx, [out, in, unique] IWbemClassObject* ppObject, [out, in, unique] IWbemCallResult* ppCallResult );
30、下面就是受害者機器給攻擊者機器返回相應的響應結果
31、然后我們就會調用Opnum為24的ExecMethod來調用函數,下面可以看到調用的參數傳遞,之后在我們的Windows當中就會利用Wmiprvse來調用cmd執行命令
HRESULT ExecMethod( [in] const BSTR strObjectPath, [in] const BSTR strMethodName, [in] long lFlags, [in] IWbemContext* pCtx, [in] IWbemClassObject* pInParams, [out, in, unique] IWbemClassObject* ppOutParams, [out, in, unique] IWbemCallResult* ppCallResult );
總結
此處通過對自己使用Crackmapexec的wmiexec模式過程當中產生的流量分析,對于DCOM激活的過程,以及基于DCERPC調用WMI程序的流程進行了梳理,如有錯誤之處還請指出,喜歡我們就關注我們吧
參考文章
https://www.anquanke.com/post/id/167057
總結
以上是生活随笔為你收集整理的开始协议处理句柄_基于smb协议的wmiexec浅析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 碧玉妆成一树高,万条垂下绿丝绦的意思
- 下一篇: 笛卡尔的名言名句160个