使用 chroot 建立沙盒環境

来源:https://www.cnblogs.com/lost-melody/archive/2019/10/22/11721514.html
-Advertisement-
Play Games

使用 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

註:

  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 到手!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、背景 最近在精讀 《CLR Via C 》和 《Effective C 》 的時候,發現的一個問題點。一般來說,我們實現 介面,是為了釋放托管資源和非托管資源。不過在 C 類型定義裡面有一個功能類似的東西,那就是 終結器 。 最開始我是學 C++ 的,之後學 C 的時候發現這玩意兒不論是寫法和作 ...
  • 名詞: IWorkspaceFactory 工作空間工廠 ShapeFileWorksapceFactory 矢量文件工作空間工廠 IWorkspce 工作空間 IFeatrueWorkspace 要素工作空間 IFeatureClass 要素類 IFeatureLayer 要素圖層 Feature ...
  • 一、WPF的Image控制項中設置ImageSource 還可以使用: 還可以使用: 二、Bitmap轉BitmapImage 先將Bitmap儲存成memorystream,然後指定給BitmapImage 三、Bitmap轉BitmapSource 四、BitmapSource轉Bitmap ...
  • 前言 現在.net core跨平臺了,相信大部分人都把core的程式部署在了linux環境中,或者部署在了docker容器中,與之對應的,之前都是部署在windows環境中,在win中,我們可以用windbg來調試。但是在linux環境下 我們可以採用lldb(這隻是一種,還有其他方式) 環境 li ...
  • 強制刪除文件(夾)的方法,不問原理,簡單粗暴! 在桌面右鍵新建一個.txt文件,不妨命名為del.txt,把下麵兩行代碼複製進去,保存,關閉。 DEL /F /A /Q \\?\%1 RD /S /Q \\?\%1 將del.txt另存為del.bat(註意:新的尾碼是.bat)。 最後,把想要刪除 ...
  • (以下內容親手完成,如果需要搬走記得把寫博的小白的名字和郵箱一起搬走) 出來玩(學習),總是要還的! 有不明的問題的時候,都來博客園轉轉,總能找到答案或者靈感,開博3個月都沒發一篇帖(不曉得管理員有何感想,不會封我的號吧),不能只是索取沒有付出。小白一枚琢磨了半天才扒拉明白Telnet服務搭建(照葫 ...
  • 在安裝Shutter軟體之前,先安裝依賴包,下載地址: 1、libgoocanvas-common_1.0.0-1_all.deb http://launchpadlibrarian.net/226687719/libgoocanvas-common_1.0.0-1_all.deb 2、libgoo ...
  • 剛安裝完系統後,採用的是樹莓派通過網線連接筆記本wifi共用方式聯網,後面考慮不使用網線,讓樹莓派使用wifi聯網。 一、配置無線網路 1、通過ssh登錄樹莓派,輸入用戶名和密碼後,輸入如下命令進入圖形界面設置: 2、在配置界面選擇網路 3、輸入wifi的ssid和passwd 4、重啟樹莓派,在筆 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...