GadgetToJscript 代码修改利用

Page Ready

发现一个不错的项目 GadgetToJscript,该项目演示了如何将.NET assembly 转换为可被WSHWindows Scirpt Host)引擎调用的脚本。

为什么要改?

该项目仅仅是为了演示,所以代码中直接集成了一个测试的payload,运行后弹一个MessageBox,如下图:

如果放到真实环境去用的话,需要在代码里修改 payload 内容,修改完还要编译,太麻烦,所以改成通过参数获取 payload 的形式。

最后并以 Covenant 生成的 payload 为例,进行测试!

项目地址:

反序列化加载 .NET Assembly 思路

  1. 利用 ObjectSerializedRef
    ObjectSerializedRef 看起来似乎支持所有类的反序列化,包括没有 Serializable 标记的类。查找引用该类的SurrogateSeletor,找到一个:

所以(反)序列化的时候,使用 ActivitySurrogateSeletor 中的 ObjectSurrogate 作为序列化代理使用就可以支持 Assembly.Load 的序列化和反序列化操作。

  1. ObjectSurrogate中的类型检查

    可以将 DisableActivitySurrogateSelectorTypeCheck 设置为true,即可禁用这个功能。

主体代码逻辑

主体代码在 Program.cs 中。

首先,有两个枚举类型 EWSHENC,从他们的定义中可以看出已经支持的 WSH 引擎有 jsvbsvbahta,支持的加密方式有base64hex

这是所有参数,其中 -w 参数指定 WSH 引擎,-o指定输出位置,-e指定 stage 加密方式。


之后,要生成两段 stage,第一段的作用主要是用来禁用ActivitySurrogateSeletor 的类型检查,否则无法对之后的 Assembly.Load 进行反序列化。

为什么要禁用ActivitySurrogateSeletorTypeCheck

因为新 4.8+ 版本中在 GetObjectData 中加入了类型检查,只有 ActivityBindDependencyObject可以通过,参考:Re-Animating ActivitySurrogateSelector


然后关闭当前程序的类型检查,否则无法序列化之后的stage


生成第二段stage,这个才是需要加载的.NET Assembly


最后将模版文件中的 stage1stage2对应替换,写出到 -o 指定的文件内。

具体分析,参考:GadgetToJScript 利用分析

修改方法

第一步:添加用来指定 payload 文件和所需 dll 的参数

第二步:向生成 Assembly 的函数传参

第三步:修改生成 Assembly 的函数

利用

首先,打开 Covenant,生成Grunt 代码。

复制后,存储到 payload.txt,在目标机器cmd 中执行 GadgetToJScript.exe -w js -f payload.txt -d System.Core.dll -o cc
生成的 js 文件保存在 cc.js 中,执行 cscript cc.js 加载运行.

此时,在 Covenant 可以看到该机器已经上线。

执行 whoami /priv 返回执行结果。





root@kali ~# cat 重要声明
本博客所有原创文章,作者皆保留权利。转载必须包含本声明,保持文本完整,并以超链接形式注明出处【Techliu】。查看和编写文章评论都需翻墙,为了更方便地获取文章信息,可订阅RSS,如果您还没有一款喜爱的阅读器,不妨试试Inoreader.
root@kali ~# Thankyou!