使用 chroot 建立沙盒环境

chroot 提供了更改当前进程及其子进程的可见根目录的操作,运行在此隔离环境中的应用程序无法访问新的目录树之外的文件和命令。这样的隔离环境称作 chroot 监狱chroot jail)。通常,chroot 用于建立沙盒环境,以及在单用户模式或救援模式下进行系统维护或重置密码等操作。

更多资料参见 chroot - ArchWiki

Usage

chroot 命令的语法如下:

chroot [option] newroot [command [args]]
# 以 ~/tmp 为新的根目录,执行 /bin/bash
# 这里 /bin/bash 是新目录下的路径
chroot ~/tmp /bin/bash

资源准备

显然,仅仅使用 mkdir 命令创建一个空目录就想在其中执行 chroot 进程是不可行的,因为我们还没有在新的目录下准备必要的资源。首先我们需要把 shell 工具装入该目录——当然,如果只是运行某一条命令,确实不必为其准备终端工具。此外,为了顺利执行大部分终端操作,我们还应将 /usr/bin 目录下的必要文件及其依赖库复制到新的根目录下,通常包括 ls/mkdir/mv/cp 等基本命令和其他一些可能需要用到的命令。

mkdir ~/tmp/{bin,lib,lib64}
cp /bin/* ~/tmp/bin -r
cp /lib/* ~/tmp/lib -r
cp /lib64/* ~/tmp/lib64 -r

除此之外,在/dev 目录下的一些必要节点有时也需要手动建立:

mkdir ~/tmp/dev
cd ~/tmp/dev
mknod -m 666 null c 1 3
mknod -m 666 tty c 5 0
mknod -m 666 zero c 1 5
mknod -m 666 random c 1 8

注:

  1. 要查看一个可执行文件的依赖库,执行 ldd 命令,如 ldd /bin/sh
  2. 请结合使用 chown/chmod 命令保证这些文件和目录的所属和权限与原文件系统一致。
  3. 这里不可使用软链接,因为在新的根目录下,软链接无法定位到外部原文件。
  4. 除了用于本地主机的维护外,chroot 监狱还可用于限制 SSH 用户根目录。

例题

题目来源:USTC Hackergame 2019

有一天,C 同学做了一个梦,他竟然搬进了大房子,只是似乎有些地方 C 同学不太满意……

注意:

  1. 此题考察的是对于 Linux 基础知识的掌握。尽管可以,但不建议使用逆向工程的方式完成。
  2. 在根目录(/)下的文件夹对 Linux 系统的运行十分重要,请不要为了完成此题目删除自己的 /usr/bin 等文件夹!

附件请从官方 GitHub 页面下载源代码编译。

这里我以 Alpine Linux 为例,简要介绍此题的一种解法。

下载题目源文件并简要分析

结合所给提示,使用 curl/wget 等工具下载题目附件,用 readelf/objdump 等工具分析得知该文件是一个 Unix 可执行文件,OK 先给上可执行权限并运行一下:

# 下载
wget http://url/IWantAHome
# 查看 elf 文件头
readelf -h IWantAHome
# 添加可执行权限
chmod +x IWantAHome
# 执行
./IWantAHome

输出:

$ ./IWantAHome
I just want a home. Please do what I say and I will give you a flag
Make sure I am running on Linux(Unix).
I want these directories in / : [/Kitchen /Lavatory /Bedroom /Living_Room]
Oh I can not find /Kitchen ,goodbye.

看来要创建这些目录,创建完再运行:

$ mkdir /Kitchen /Lavatory /Bedroom /Living_Room
$ ./IWantAHome
I just want a home. Please do what I say and I will give you a flag
Make sure I am running on Linux(Unix).
I want these directories in / : [/Kitchen /Lavatory /Bedroom /Living_Room]
Thanks, I find these directories.
I hate these directories [/home /root /boot /proc /sys /etc /bin] , Please delete them all!
Oh I found /home ,goodbye.

得,这是想让我删系统呢。

建立沙盒

删系统?抱歉,今天不行!我们直接挑个好地方建立起一个 newroot 目录,比如在 /root 下建立 tmp,然后先将 /bin 下的文件复制进 /root/tmp 中(注,这里要求删除 /bin 目录,故复制到 tmp/b 目录下):

# 创建目录
mkdir /root/tmp
mkdir /root/tmp/b
# 复制文件
cp /bin/* /root/tmp/b
cp IWantAHome /root/tmp
# 查看 /bin/sh 的依赖
ldd /bin/sh
# 复制依赖库
cp /lib /root/tmp -r
# 顺便把刚才建立的 Kitchen 等目录移进去
mv /Kitchen /Lavatory /Bedroom /Living_Room tmp

进入沙盒环境并再次执行文件:

# 进入 chroot 环境
chroot /root/tmp /b/sh
# 更改环境变量
export HOME=/
export PATH=/b
# 执行文件
./IWantAHome

这时程序输出表示要在 /Bedroom/Microphone 中写入文件并从 /Bedroom/Headset 中读出,这个容易,新建其中一个文件,然后在另一个位置建立一个链接就行。

# 建立新文件
touch /Bedroom/Microphone
# 建立符号链接(硬链接也可)
ln -s /Bedroom/Microphone /Bedroom/Headset

写时间脚本

再运行程序,提示要从 /Living_Room/Clock 中读取到 20:15:30 形式的北京时间,那只好写一个后台脚本不断向文件中写入当前时间……所以我选择先退出 chroot 环境(亦可直接在 chroot 进程内执行),先设置一下时区。

# 安装 tzdata 包以提供时区信息
apk add tzdata
# 在 /etc 下建立 /usr/share/zoneinfo/Asia/Shanghai 的链接
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 查看时间是否准确(如不准确,使用 date -s "20:15:30" 命令更改)
date
# 新建 time.sh 文件并赋予可执行权限
touch time.sh && chmod +x time.sh
# 编辑 time.sh
vi time.sh

写入以下脚本:

#!/bin/sh
while true
do
date +"%H:%M:%S" > /root/tmp/Living_Room/Clock
sleep 0.5
done

并让它在后台运行:

./time.sh &

重新进入 chroot 环境,设置好环境变量,再次运行 IWantAHome

$ ./IWantAHome
# 略去部分输出
Time is important, I need a clock in living_room
I will read Beijing time (eg: '20:15:30') in /Living_Room/Clock
Good, the clock works well.
It is late, tell me how to sleep 10 seconds in shell
>

要求输入 “sleep 10 seconds” 的命令……嗯,输入 sleep 10。这里有两个点,一是 sleep 命令并不一定需要用 shell 指令,可以自己写一个定时的程序;二是这里要用到一个 /dev/null 的设备,这个设备可以用 mknod -m 666 /dev/null c 1 3 创建,也可以只建立一个普通文件——反正附件程序不检查。

最终输出

完成这些操作后,再执行 IWantAHoome

$ ./IWantAHome
I just want a home. Please do what I say and I will give you a flag
Make sure I am running on Linux(Unix).
I want these directories in / : [/Kitchen /Lavatory /Bedroom /Living_Room]
Thanks, I find these directories.
I hate these directories [/home /root /boot /proc /sys /etc /bin] , Please delete them all!
Well done.
Now I want a telephone in Bedroom
I will write something to /Bedroom/Microphone and read the same thing in /Bedroom/Headset
Good, telephone works well.
Time is important, I need a clock in living_room
I will read Beijing time (eg: '20:15:30') in /Living_Room/Clock
Good, the clock works well.
It is late, tell me how to sleep 10 seconds in shell
> sleep 10
command is:'sleep 10'
I slept for 10.00281629s
flag{I_am_happy_now}

至此,flag 到手!

使用 chroot 建立沙盒环境的更多相关文章

  1. python - 沙盒环境 - virtualenv - 简明使用录

    1. 不讲安装,没意思 2. 使用 virtualenv ENV # 建立环境,ENV你可以随便定,看起来像是 mkdir ENV cd ENV # 进目录呗 source bin/activate ...

  2. Python沙盒环境配置

    一.简介 本文介绍配置python沙盒环境的方法步骤. 二.安装步骤 1.安装pyenv http://www.cnblogs.com/274914765qq/p/4948530.html 2.安装v ...

  3. python的沙盒环境--virtualenv

      VirtualEnv用于在一台机器上创建多个独立的python运行环境,VirtualEnvWrapper为前者提供了一些便利的命令行上的封装. 使用 VirtualEnv 的理由: 隔离项目之间 ...

  4. Python之virtualenv沙盒环境

    在开发Python应用程序的时候,系统安装的Python3只有一个版本:3.4.所有第三方的包都会被pip安装到Python3的site-packages目录下. 如果我们要同时开发多个应用程序,那这 ...

  5. [文章存档]如何检测 Azure Web 应用沙盒环境文件系统存储量

    链接:https://docs.azure.cn/zh-cn/articles/azure-operations-guide/app-service-web/aog-app-service-web-h ...

  6. python:沙盒(virtualenv)

    当电脑需要使用多个版本的python时,可以使用沙盒:或者使用docker: virtualenv是Python自带的,通过pip安装的 [root@centos7 public]# cd jinji ...

  7. SharePoint 沙盒解决方案 VS 场解决方案

    博客地址 http://blog.csdn.net/foxdave 最近看书正好看到了关于沙盒解决方案的介绍,便整理记录一下. 虽然沙盒解决方案已经在最新的SharePoint开发中被否决弃用了(被A ...

  8. python项目在无外网的生产环境解决沙盒依赖问题

    参考 https://yq.aliyun.com/articles/159599 https://www.jianshu.com/p/08c657bd34f1 缺点是 只能针对python的环境 做沙 ...

  9. 不信任的 .exe 怎么办,用 Windows 沙盒啊!

    简评:维基百科,在计算机安全领域,沙盒(sandbox)是种安全机制,为执行中的程式提供的隔离环境.通常是作为一些来源不可信.具破坏力或无法判定程序意图的程序提供实验之用. 微软正在尝试解决人们对运行 ...

随机推荐

  1. 21天学通 C++(第8版) 内涵目录

    21天学通 C++(第8版) 第1章 绪论 1 1.1 C++简史 1 1.1.1 与C语言的关系 1 1.1.2 C++的优点 1 1.1.3 C++标准的发展历程 2 1.1.4 哪些人使用C++ ...

  2. 使用swig在python中调用C++

    1.安装swig 下载链接: http://www.swig.org/survey.html tar -xvf swig-.tar.gz ./configure --prefix=/usr/local ...

  3. Ubuntu部署Docker容器环境

    1.首先切换到root用户 2.安装网卡报错 解决办法,删除锁住的文件: 再次安装成功. 4.ubuntu下面安装:apt-get install openssh-server  安装远程工具 5.设 ...

  4. Android组件化aar躺坑记:ButterKnife 报 元素值必须为常量表达式错误

    背景: 项目有需求,将自己写的模块作为一个module给到大项目使用,所以准备把自己的项目打包成aar包. 一.如何将独立项目打包成aar: 1.修改module下的application 为libr ...

  5. 编程语言与python介绍

    目录 一.编程语言的发展史 1.1 机器语言 1.2 汇编语言 1.3 高级语言 1.3.1 编译型 1.3.2 解释型 1.4 总结 2.python介绍 2.1 python解释器版 2.2 运行 ...

  6. 新唐NDA102EC1中更改UUART1作为调试串口打印输出调试信息

    新唐NDA102EC1中更改UUART1作为调试串口打印输出调试信息 参考网上STM32修改fputc(int ch, FILE *f),把串口打印函数printf()重定向到UUART1模块的端口输 ...

  7. intellij idea设置代码提示不区分大小写

    https://blog.csdn.net/csm0401/article/details/86306417

  8. 使用docker-compose快速搭建gitlab

    1. 准备工作: centos7 [root@dev_vonedao_95 gitlab]# docker -v Docker version , build 633a0ea [root@dev_vo ...

  9. Kaldi安装

    Kaldi是基于C++开发并遵守Apache License v2.0的一款语音识别工具包,是目前最流行的ASR工具之一,本文基于Ubuntu 18.04 LTS介绍了如何安装Kaldi. 首先按照官 ...

  10. Linux node.js安装

    1.下载地址 下载node 英文网址:https://nodejs.org/en/download/ 中文网址:http://nodejs.cn/download/ 2.下载下来的tar文件上传到服务 ...