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