wmic遠程執行與go版本wmiexec的bug修復
首先,簡單介紹一下WMI, WMI是Windows 2K/XP管理系統的核心;對于其他的Win32操作系統,WMI是一個有用的插件。WMI以CIMOM為基礎,CIMOM即公共信息模型對象管理器(Common Information Model Object Manager),是一個描述操作系統構成單元的對象數據庫,為MMC和腳本程序提供了一個訪問操作系統構成單元的公共接口。 總的來說,就是一個很方便我們獲取系統信息的接口。
在進入內網后,如果沒有防火墻的話,基本135端口都是開放的,如果我們知道UID為500的用戶或者域管理員的密碼,就可以通過wmic遠程執行命令:
wmic /node:192.168.1.1 /user:administrator /password:abc123!@# process call create "cmd.exe /c whoami > c:\test.txt"
但是,目前來說這種方法存在三個缺點:
1.不支持通過hash執行命令。
2.如果密碼中有逗號“,”,無論是直接在cmd中執行還是寫成bat,都會報錯:

3.無法在linux下面執行。
這樣就給我們的滲透過程帶來不少阻礙。但是有大神已經寫出各種語言的wmiexec,不過最方便的應該算golang版的,支持交叉編譯,地址是這個:
https://github.com/C-Sto/goWMIExec
經過測試,發現一個問題, 當在普通環境中用500用戶執行的時候,沒有任何問題:


但是我查看它的代碼,里面雖然存在domain參數,但是沒有設置獲取,那么把它修改一下。 修改前:

修改后:

但是執行出錯,爆拒絕訪問錯誤(也就是錯誤5):

我開始以為是域名輸入錯誤,但是嘗試test.com也不行。所以我懷疑是作者有些地方寫錯了。 拿出Wireshark,抓包看看。
首先用正常的wmic執行一次:

可以看到ntlmssp是正常地傳送了域名和用戶名:

接著用goWMIExec.exe執行一次:

發現域名無法正常傳送,而且域名不為unicode字符:

那么大概的問題已經知道了,作者在進行ntlm認證的時候,沒有將go默認的utf-8編碼轉換為windows的unicode編碼,導致數據包在認證時無法正常識別。 嘗試一下修改作者的代碼。
一步一步跟進執行函數:


在NewExecConfig里面domain沒有經過變換就返回:

下一步進入NewExecer函數,我們直接跟進鑒權函數:

可以看到問題所在了,domain在這里沒有轉為unicode就直接轉成byte[]進入NewSSPAuthenticate:

那么我們可以在所有調用到NewSSPAuthenticate函數的地方,將domain先轉為unicode再傳入,就可以把問題解決了。 有的小伙伴就要問了,為什么不在NewExecConfig里面直接把domain轉化呢?這里就說明一下,也順便說明為什么我們能通過hash就可以登陸smb:
windows在采用ntml遠程鑒權的時候,不是用明文對照,而是先把密碼轉成unicode,然后用md4加密成hash(這個加密出來的就是我們經常用到的hash),最后用這個hash作為hmac的md5的密鑰,加密大寫用戶名+域名,最后得出的結果要是跟儲存的一樣,就當你鑒權通過。
所以這個域名不能先轉化為unicode,否則到了最后一步就會出錯。
好了,回到代碼里面,作者寫了一個toUnicodeS的代碼,順便拿來一用,給所有調用到NewSSPAuthenticate函數的地方都加上,原代碼有兩處:


編譯之后測試一下:

成功執行命令:

只用hash也可以:
