使用 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 到手!
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/160733.html
標籤:Linux
