使用 chroot 創建沙盒環境

使用 chroot 創建沙盒環境

chroot 提供了更改當前進程及其子進程的可見根目錄的操做,運行在此隔離環境中的應用程序沒法訪問新的目錄樹以外的文件和命令。這樣的隔離環境稱做 chroot 監獄chroot jail)。一般,chroot 用於創建沙盒環境,以及在單用戶模式或救援模式下進行系統維護或重置密碼等操做。
更多資料參見 chroot - ArchWikiphp

Usage

chroot 命令的語法以下:linux

chroot [option] newroot [command [args]]
# 以 ~/tmp 爲新的根目錄,執行 /bin/bash
# 這裏 /bin/bash 是新目錄下的路徑
chroot ~/tmp /bin/bash

資源準備

顯然,僅僅使用 mkdir 命令建立一個空目錄就想在其中執行 chroot 進程是不可行的,由於咱們尚未在新的目錄下準備必要的資源。首先咱們須要把 shell 工具裝入該目錄——固然,若是隻是運行某一條命令,確實沒必要爲其準備終端工具。此外,爲了順利執行大部分終端操做,咱們還應將 /usr/bin 目錄下的必要文件及其依賴庫複製到新的根目錄下,一般包括 ls/mkdir/mv/cp 等基本命令和其餘一些可能須要用到的命令。git

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

除此以外,在/dev 目錄下的一些必要節點有時也須要手動創建:github

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

注:shell

  1. 要查看一個可執行文件的依賴庫,執行 ldd 命令,如 ldd /bin/sh
  2. 請結合使用 chown/chmod 命令保證這些文件和目錄的所屬和權限與原文件系統一致。
  3. 這裏不可以使用軟連接,由於在新的根目錄下,軟連接沒法定位到外部原文件。
  4. 除了用於本地主機的維護外,chroot 監獄還可用於限制 SSH 用戶根目錄。

例題

題目來源:USTC Hackergame 2019
有一天,C 同窗作了一個夢,他居然搬進了大房子,只是彷佛有些地方 C 同窗不太滿意……
注意:bash

  1. 此題考察的是對於 Linux 基礎知識的掌握。儘管能夠,但不建議使用逆向工程的方式完成。
  2. 在根目錄(/)下的文件夾對 Linux 系統的運行十分重要,請不要爲了完成此題目刪除本身的 /usr/bin 等文件夾!

附件請從官方 GitHub 頁面下載源代碼編譯。app

這裏我以 Alpine Linux 爲例,簡要介紹此題的一種解法。dom

下載題目源文件並簡要分析

結合所給提示,使用 curl/wget 等工具下載題目附件,用 readelf/objdump 等工具分析得知該文件是一個 Unix 可執行文件,OK 先給上可執行權限並運行一下:curl

# 下載
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 到手!

相關文章
相關標籤/搜索