使用 chroot 建立沙盒環境 chroot 提供了更改當前進程及其子進程的可見根目錄的操作,運行在此隔離環境中的應用程式無法訪問新的目錄樹之外的文件和命令。這樣的隔離環境稱作 chroot 監獄 ( chroot jail )。通常, chroot 用於建立沙盒環境,以及在單用戶模式或救援模式下 ...
使用 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
註:
- 要查看一個可執行文件的依賴庫,執行
ldd
命令,如ldd /bin/sh
。- 請結合使用
chown
/chmod
命令保證這些文件和目錄的所屬和許可權與原文件系統一致。- 這裡不可使用軟鏈接,因為在新的根目錄下,軟鏈接無法定位到外部原文件。
- 除了用於本地主機的維護外,
chroot
監獄還可用於限制SSH
用戶根目錄。
例題
題目來源:USTC Hackergame 2019
有一天,C 同學做了一個夢,他竟然搬進了大房子,只是似乎有些地方 C 同學不太滿意……
註意:
- 此題考察的是對於 Linux 基礎知識的掌握。儘管可以,但不建議使用逆向工程的方式完成。
- 在根目錄(
/
)下的文件夾對 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 到手!