欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

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

来源:本站整理 作者:佚名 时间:2019-04-12 TAG: 我要投稿

在之前的文章《渗透测试中的Node.js——Downloader的实现》开源了一个使用Node.js实现Downloader的代码,简要分析在渗透测试中的利用思路。
Node.js的语法简单易懂,所以Node.js代码也很容易被分析。
为了增加Node.js代码被分析的难度,我的思路是利用Node.js的一个功能,将payload以C++插件的形式进行封装。
这样不但能够增加Node.js代码被分析的难度,而且可以用C++代码来实现payload,已有的C++代码经过简单的修改即可使用,减小二次开发的成本。
0x01 简介
本文将要介绍以下内容:
· C++插件简介
· 搭建C++插件的开发环境
· C++插件代码实例
· 利用思路
· 防御建议
0x02 C++插件简介
Node.js C++插件是用C++编写的动态链接库,可以使用require()函数加载到Node.js中。利用V8提供的API,可以实现JavaScript和C++的互相调用,打通JavaScript和C++之间的接口。
官方文档:
https://nodejs.org/api/addons.html
使用实例:
1.编译成功一个C++插件,导出方法为:hello
2.使用Node.js调用C++插件导出方法的代码如下:
const addon = require('./addon.node');
addon.hello();
3.执行代码
node.exe test.js
0x03 搭建C++插件的开发环境
1、Windows开发环境
测试系统:Win7sp1 x64
需要安装以下工具:
· .NET Framework 4.5.1或更高版本
· Python 2.7
· Visual Studio 2015或更高版本
具体搭建流程如下:
1.安装.NET Framework 4.5.1
https://www.microsoft.com/en-US/download/details.aspx?id=5842
2.下载Node.js
https://nodejs.org/en/download/
3.使用Windows-Build-Tools自动安装依赖工具
https://github.com/felixrieseberg/windows-build-tools
cd c:\
powershell
npm install --global windows-build-tools
如果安装失败,可选择手动安装以下工具:
· Python 2.7
· Visual Studio 2015或更高版本
4.安装node-gyp
https://github.com/nodejs/node-gyp
npm install -g node-gyp
2、Linux开发环境
wget https://nodejs.org/dist/v10.15.3/node-v10.15.3-linux-x64.tar.xz
tar xf node-v10.15.3-linux-x64.tar.xz
cd node-v10.15.3-linux-x64
cd bin
export PATH=/root/node-v10.15.3-linux-x64/bin:$PATH
./npm install -g node-gyp
注:需要添加环境变量指定node的位置(export PATH=/root/node-v10.15.3-linux-x64/bin:$PATH),否则在执行npm install会失败,提示/usr/bin/env: ‘node’: No such file or directory
实例演示:
1.hello.cc:
#include
namespace demo {
using v8::FunctionCallbackInfo;
using v8::Isolate;
using v8::Local;
using v8::NewStringType;
using v8::Object;
using v8::String;
using v8::Value;
void Method(const FunctionCallbackInfo& args) {
  Isolate* isolate = args.GetIsolate();
  args.GetReturnValue().Set(String::NewFromUtf8(
      isolate, "world", NewStringType::kNormal).ToLocalChecked());
}
void Initialize(Local exports) {
  NODE_SET_METHOD(exports, "hello", Method);
}
NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize)
}  // namespace demo
2.binding.gyp
{
  "targets": [
    {
      "target_name": "addon",
      "sources": [ "hello.cc" ]
    }
  ]
}
3.通过node-gyp编译,生成插件
node-gyp configure
node-gyp build
注:可以合并成一条命令:
node-gyp configure build
Node.js支持交叉编译,具体参数说明可参考:
https://www.npmjs.com/package/node-pre-gyp
Linux系统下生成Windows64位系统下使用的插件命令如下:
node-gyp configure build --target_arch=x64 --target_platform=win32
0x04 C++插件代码实例
在开发时,最好避免出现if这种的条件判断语句,直接使用会导致编译错误。
1. 释放文件
#include
#include
namespace demo {
 using v8::FunctionCallbackInfo;
 using v8::Isolate;
 using v8::Local;
 using v8::Object;
 using v8::String;
 using v8::Value;
 void Method(const FunctionCallbackInfo& args) {
  FILE* fp;
  fopen_s(&fp, "new.txt", "ab+");
  char *buf = "123456";
  fwrite(buf, strlen(buf), 1, fp);
  fseek(fp, 0, SEEK_END);
  fclose(fp);
 }
 void init(Local exports) {
  NODE_SET_METHOD(exports, "hello", Method);
 }
 NODE_MODULE(NODE_GYP_MODULE_NAME, init)
}
2. 执行命令:
#include
namespace demo {
 using v8::FunctionCallbackInfo;
 using v8::Isolate;
 using v8::Local;
 using v8::Object;
 using v8::String;
 using v8::Value;
 void Method(const FunctionCallbackInfo& args) {
  system("powershell start calc.exe");
 }
 void init(Local exports) {
  NODE_SET_METHOD(exports, "hello", Method);
 }

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载