CRTO II GadgetToJScript

关于这节课程的一点内容补充

GadgetToJScript

整半天没用明白这个工具,然后搜到了RastaMouse的Blog

https://rastamouse.me/d-invoke-gadgettojscript/
NOTE: I had some wild issues where creating new *.cs files in the project would just cause the serialised gadget to not execute. Simply moving the classes into a single .cs file made everything work again.

把Win32.cs的内容复制到Class Program里得了

直接上P/Invoke

x86 & x64

本地的Word能运行宏

准备丢虚拟机里面测一下ASR绕过的,结果发现不能运行

调试半天发现虚拟机装的是x86的Office

想着创建个x64进程应该就能注入x64 Shellcode了,结果不行

整体测试了一遍

测试结果如下

Gadget CSharp_PE Word Process Shellcode Result
x86 x86 x86 x86 x86 TRUE
x86 x86 x86 x86 x64 FALSE
x86 x86 x86 x64 x86 FALSE
x86 x86 x86 x64 x64 FALSE
x86 x86 x64 x86 x86 FALSE
x86 x86 x64 x86 x64 FALSE
x86 x86 x64 x64 x86 FALSE
x86 x86 x64 x64 x64 TRUE
x64 x64 x86 FALSE
x64 x64 x64 x86 x86 FALSE
x64 x64 x64 x86 x64 FALSE
x64 x64 x64 x64 x86 FALSE
x64 x64 x64 x64 x64 TRUE
x86 x64 FALSE
x64 x86 FALSE

测试结论如下

  1. Gadget和编译的Loader PE架构必须一致,否则不能生成VBA代码
  2. x86的Office在宏里不能运行x64的二进制序列化PE的反序列化对象
  3. x64的Office创建x86进程无法执行x86 Shellcode

感觉还是有点问题,拿CSharp和CPP的Loader再测了以下
只有以下情况能够执行ShellCode

CSharp Process Shellcode
x86 x86 x86
x64 x64 x64
CPP Process Shellcode
x86 x86 x86
x64 x86 x86
x64 x64 x64

CPP比CSharp多了一种x64 Loader创建x86进程并注入x86 Shellcode的情况
估计是语言底层的问题

也就是说CSharp只有在Loader,创建进程和Shellcode三者的架构一致的情况才能执行ShellCode

再反推在开始的测试结果

Gadget CSharp_PE Office Process Shellcode Result
x86 x86 x64 x64 x64 TRUE

这一条就显得有些令人疑惑
但是根据结果来反推原因就可以得出以下猜测

CSharp所编译得到的PE其实也还是IL,并不是机器码,最终的执行在.NET框架的CLR中
而编译的PE是x86还是x64其实没有本质上的区别,所以x64的Word能够运行x86的二进制序列化PE
由于自身运行环境是x64,所以只能执行x64的ShellCode

上述猜测未经验证,给自己一个停止折腾的理由罢了

Arch Identifying

1
IntPtr.Size == 8

根据返回结果来分别写x86和x64时的执行语句

二进制序列化PE用x86的就行了,反正x86跟x64的Word都能用

File System Redirector

x86进程访问C:\Windows\System32\时会被重定向到C:\Windows\SysWOW64\

需要使用C:\Windows\sysnative才可以访问C:\Windows\System32\

使用函数CreateProcessW()的时候ApplicationName跟CommandLine都填的sysnative,结果CommandLine是system32,调用的程序还是SysWOW64

只能禁用重定向了

1
2
Wow64DisableWow64FsRedirection()
Wow64RevertWow64FsRedirection()

但是x86进程没办法往x64进程注入x64 ShellCode

然并卵


Update

看OSEP教材的时候说CSharp可以以用x64进程向x86进程注入ShellCode

跟着试了一下用CreateRemoteThread函数确实可以跑

想了一下应该是当时测试的时候CSharp程序创建远程线程用的是QueueUserAPC函数

而CPP则是使用CreateRemoteThread函数

在CPP用QueueUserAPC函数从x64进程向x86进程创建线程

果然失败


EOF