
Stowaway是一个利用go语言编写、专为渗透测试工作者制作的多级代理工具
用户可使用此程序将外部流量通过多个节点代理至内网,突破内网访问限制,构造树状节点网络,并轻松实现管理功能
谢谢各位的star,同时欢迎大家使用后提出问题&&Bug 😘
同时也请各位务必在使用前详细阅读使用方法及文末的注意事项
本项目仅供网络安全研究与教学用途,严禁用于任何非法用途。请确保在使用本工具进行任何测试之前,已获得目标系统明确的授权,并严格遵守您所在国家/地区的相关法律法规。 使用本工具所带来的任何直接或间接后果(包括但不限于:数据丢失、系统损坏、法律责任等),由使用者自行承担,本项目作者不对任何滥用行为或由此引发的法律责任负责。 本工具的使用即表示您已阅读、理解并同意本免责声明的全部内容。
Stowaway一共包含两种角色,分别是:
admin 渗透测试者使用的主控端agent 渗透测试者部署的被控端以下命令可以快速启动最简单的stowaway实例
./stowaway_admin -l 9999./stowaway_agent -c <stowaway_admin's IP>:9999参数:
-l 被动模式下的监听地址[ip]:<port>
-s 节点通信加密密钥,所有节点(admin&&agent)必须一致
-c 主动模式下的目标节点地址
--socks5-proxy socks5代理服务器地址
--socks5-proxyu socks5代理服务器用户名(可选)
--socks5-proxyp socks5代理服务器密码(可选)
--http-proxy http代理服务器地址
--down 下游协议类型,默认为裸TCP流量,可选HTTP/WS
--tls-enable 为节点通信启用TLS,在启用TLS后,AES加密将被禁用
--domain 指定TLS SNI/WebSocket域名,若为空,默认为目标节点地址
--heartbeat 开启心跳包
参数:
-l 被动模式下的监听地址[ip]:<port>
-s 节点通信加密密钥
-c 主动模式下的目标节点地址
--socks5-proxy socks5代理服务器地址
--socks5-proxyu socks5代理服务器用户名(可选)
--socks5-proxyp socks5代理服务器密码(可选)
--http-proxy http代理服务器地址
--reconnect 重连时间间隔
--rehost 端口复用时复用的IP地址
--report 端口复用时复用的端口号
--up 上游协议类型,默认为裸TCP流量,可选HTTP/WS
--down 下游协议类型,默认为裸TCP流量,可选HTTP/WS
--cs 运行平台的shell编码类型,默认为utf-8,可选gbk
--tls-enable 为节点通信启用TLS,在启用TLS后,AES加密将被禁用
--domain 指定TLS SNI/WebSocket域名,若为空,默认为目标节点地址
此参数admin&&agent用法一致,仅用在被动模式下
若不指定IP地址,则默认监听在0.0.0.0上
admin: ./stowaway_admin -l 9999 or ./stowaway_admin -l 127.0.0.1:9999
agent: ./stowaway_agent -l 9999 or ./stowaway_agent -l 127.0.0.1:9999
此参数admin&&agent用法一致,可用在主动&&被动模式下
可选,若为空,则代表通信不被加密,反之则通信基于用户所给出的密钥加密
admin: ./stowaway_admin -l 9999 -s 123
agent: ./stowaway_agent -l 9999 -s 123
此参数admin&&agent用法一致,仅用在主动模式下
代表了希望连接到的节点的地址
admin: ./stowaway_admin -c 127.0.0.1:9999
agent: ./stowaway_agent -c 127.0.0.1:9999
这四个参数admin&&agent用法一致,仅用在主动模式下
--socks5-proxy代表socks5代理服务器地址,--socks5-proxyu以及--socks5-proxyp可选
--http-proxy代表http代理服务器地址,与socks5使用方式相同
无用户名密码:
admin: ./stowaway_admin -c 127.0.0.1:9999 --socks5-proxy xxx.xxx.xxx.xxx
agent: ./stowaway_agent -c 127.0.0.1:9999 --socks5-proxy xxx.xxx.xxx.xxx
有用户名密码:
admin: ./stowaway_admin -c 127.0.0.1:9999 --socks5-proxy xxx.xxx.xxx.xxx --socks5-proxyu xxx --socks5-proxyp xxx
agent: ./stowaway_agent -c 127.0.0.1:9999 --socks5-proxy xxx.xxx.xxx.xxx --socks5-proxyu xxx --socks5-proxyp xxx
这两个参数admin&&agent用法一致,可用在主动&&被动模式下
但注意admin上没有--up参数
这两个参数可选,若为空,则代表上/下游流量为裸TCP流量
若希望上/下游流量为HTTP/WS流量,设置此两参数为http或ws即可
admin: ./stowaway_admin -c 127.0.0.1:9999 --down ws
agent: ./stowaway_agent -c 127.0.0.1:9999 --up ws or ./stowaway_agent -c 127.0.0.1:9999 --up ws --down ws
另外需要注意两点:
第一,当你设置了某一节点上/下游为TCP/HTTP/WS流量后,与其连接的父/子节点的下/上游流量必须设置为一致,如下
admin: ./stowaway_admin -c 127.0.0.1:9999 --down ws
agent: ./stowaway_agent -l 9999 --up ws
上面这种情况,agent必须设置--up为ws,否则会导致网络出错
agent间也一样
假设agent-1正在127.0.0.1:10000端口上等待子节点的连接,并且设置了--down ws
那么agent-2也必须设置--up为ws,否则会导致网络出错
./stowaway_agent -c 127.0.0.1:10000 --up ws第二,由于http是半双工的协议,并不是很适合stowaway全双工的通信性质,所以这里http协议仅实现了http消息格式,并不是完整功能的http工作流,所以你仍然可以使用这个协议,但是stowaway之间的流量在选择以http消息格式传输时无法通过nginx转发,这部分代码及功能保留一方面为了某些特殊情况下http协议的使用,另一方面也提供一个自定义流量的模版,方便用户自定义协议时拿来参考
如需通过nginx等反代,请使用ws协议,并搭配上TLS进行通讯
此参数仅用在agent,且仅用在主动模式下
参数可选,若不设置,则代表节点在网络连接断开后不会主动重连,若设置,则代表节点会每隔x(你设置的秒数)秒尝试重连至父节点
admin: ./stowaway_admin -l 9999
agent: ./stowaway_agent -c 127.0.0.1:9999 --reconnect 10
上面这种情况下,代表如果agent与admin之间的连接断开,agent会每隔十秒尝试重连回admin
agent之间也与上面情况一致
并且--reconnect参数可以与--socks5-proxy/--socks5-proxyu/--socks5-proxyp/--http-proxy一起使用,agent将会参照启动时的设置,通过代理尝试重连
这两个参数比较特别,仅用在agent端,详细请参见下方的端口复用机制
此参数仅用在agent,可用在主动&&被动模式下
主要旨在解决'shell'功能乱码问题,当用户将agent运行于控制台编码为gbk的平台上(例如一般情况下的Windows)并且同时admin运行于控制台编码为utf-8的平台上时,请务必将此参数设置为'gbk'
./stowaway_agent -c 127.0.0.1:9999 -s 123 --cs gbk这两个参数admin&&agent用法一致,可用在主动&&被动模式下
通过设置此选项,可以将节点间流量以TLS加密
示例如下
./stowaway_admin -l 10000 --tls-enable -s 123./stowaway_agent -c localhost:10000 --tls-enable -s 123注意,当此参数启用时,aes加密将被默认禁用,-s参数将仅用于节点间相互验证&端口复用功能
另外,当此参数启用时,请保证网络中每一个节点(包括admin)都启用此参数
这两个参数admin&&agent用法一致,仅可用在主动模式下
通过设置此选项,可以设置当前此节点TLS协商时的SNI选项或者WebSocket的目标Host
示例如下
./stowaway_admin -l 10000 --tls-enable -s 123./stowaway_agent -c xxx.xxx.xxx.xxx:10000 --tls-enable -s 123 --domain xxx.com这个参数仅用在admin端,可用在主动&被动模式下
通过设置此选项,可以使admin持续向第一个节点发送心跳包,从而在中间有反向代理的情况下维持长链接
假设admin和agent中有类似nginx的反向代理设备将8080端口代理至8000端口,示例如下
./stowaway_admin -l 8000 --tls-enable -s 123 --down ws --heartbeat./stowaway_agent -c xxx.xxx.xxx.xxx:8080 --tls-enable -s 123 --domain xxx.com --up ws当前Stowaway提供基于SO_REUSEPORT和SO_REUSEADDR特性的端口复用功能及基于IPTABLES的端口复用功能
在linux下可以大部分的功能端口
在windows下不可复用iis,rdp端口,可以复用mysql,apache服务的端口
SO_REUSEPORT和SO_REUSEADDR模式
假设agent端采用端口复用机制复用80端口
此时agent端必须设置--rehost&&--report&&-s参数
--rehost: 代表希望复用的IP地址,不可为0.0.0.0,普遍应当是网卡的外部地址
--report: 代表希望复用的端口
-s: 代表通信密钥
主要支持windows、mac环境下的复用,linux亦可,但限制较多
./stowaway_admin -c 192.168.0.105:80 -s 123./stowaway_agent --report 80 --rehost 192.168.0.105 -s 123IPTABLES模式
假设agent端采用端口复用机制复用22端口
此时agent端必须设置-l&&--report&&-s参数
-l: 代表无法被正常访问的端口,也就是你真正想让agent监听并接受连接的端口
--report: 代表希望复用的端口
-s: 代表通信密钥
仅支持linux环境下的复用,agent会自动修改IPTABLES,需要root权限
agent端: ./stowaway_agent --report 22 -l 10000 -s 123
在agent启动后,请使用script目录下的reuse.py
先设置SECRET的值(SECRET的值就是在启动各个节点时所设置的通信密钥),
之后执行:python reuse.py --start --rhost xxx.xxx.xxx.xxx --rport xxx
--rhost: 代表agent的地址
--rport: 代表被复用的端口,在本例中应当为22
此时admin端就可以连接:./stowaway_admin -c 192.168.0.105:22 -s 123
以上情况只是列举了admin以及agent之间的连接,agent与agent之间的连接亦同,并无差异
如果agent被ctrl-c或者kill命令杀死,程序将会自动清理iptables规则,但如果被kill -9 杀死,则无法自动清除
故而为了防止agent异常退出后,iptables规则没有被清理导致被复用的服务无法访问
所以当需要关闭时,需运行:python reuse.py --stop --rhost xxx.xxx.xxx.xxx --rport xxx
即可关闭转发规则,使得原服务能够被正常访问
如果使用IPTABLES模式下的端口复用模式,将会强制监听在0.0.0.0,无法由-l参数来指定ip
从上面的例子可以看到,只有admin和一个agent出场
而多级网络才是核心