Giter Site home page Giter Site logo

ph4ntonn / stowaway Goto Github PK

View Code? Open in Web Editor NEW
2.4K 38.0 382.0 46.91 MB

👻Stowaway -- Multi-hop Proxy Tool for pentesters

License: MIT License

Go 98.38% Python 0.44% Makefile 1.18%
golang ssh tunnel ecc pentesting security-tools encrypt stowaway socks5 security

stowaway's Introduction

stowaway.png

Stowaway

GitHub issues GitHub forks GitHub stars GitHub license

English

Stowaway是一个利用go语言编写、专为渗透测试工作者制作的多级代理工具

用户可使用此程序将外部流量通过多个节点代理至内网,突破内网访问限制,构造树状节点网络,并轻松实现管理功能

PS:谢谢大家的star,同时欢迎大家使用后提出问题&&Bug 😘。

PPS:请务必在使用前详细阅读使用方法及文末的注意事项

此工具仅限于安全研究和教学,用户承担因使用此工具而导致的所有法律和相关责任! 作者不承担任何法律和相关责任!

特性

  • 管理端更加友好的交互,支持命令补全/历史
  • 一目了然的节点树管理
  • 丰富的节点信息展示
  • 节点间正向/反向连接
  • 节点间支持重连
  • 节点间可通过socks5/http代理进行连接
  • 节点间可通过ssh隧道连接
  • 节点间流量可选择TCP/HTTP/WS
  • 多级socks5流量代理转发,支持UDP/TCP,IPV4/IPV6
  • 节点支持ssh访问远程主机
  • 远程shell
  • 上传及下载文件
  • 端口本地/远程映射
  • 节点可端口复用
  • 自由开关各类服务
  • 节点间相互认证
  • 节点间流量以TLS/AES-256-GCM进行加密
  • 相较于v1.0,文件体积减小25%
  • 支持各类平台(Linux/Mac/Windows/MIPS/ARM)

编译及演示

  • 使用make直接编译多平台完整程序,或参看Makefile编译特定程序
  • 不想编译的盆油可以直接用release下编译完成的程序
  • 演示视频:Youtube

使用方法

角色

Stowaway一共包含两种角色,分别是:

  • admin 渗透测试者使用的主控端
  • agent 渗透测试者部署的被控端

名词定义

  • 节点: 指admin || agent
  • 主动模式: 指当前操作的节点主动连接另一个节点
  • 被动模式: 指当前操作的节点监听某个端口,等待另一个节点连接
  • 上游: 指当前操作的节点与其父节点之间的流量
  • 下游:指当前操作的节点与其所有子节点之间的流量

参数解析

  • admin
参数:
-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域名,若为空,默认为目标节点地址
--heartbeat 开启心跳包
  • agent
参数:
-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域名,若为空,默认为目标节点地址

参数用法

-l

此参数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

-s

此参数admin&&agent用法一致,可用在主动&&被动模式下

可选,若为空,则代表通信不被加密,反之则通信基于用户所给出的密钥加密

  • admin: ./stowaway_admin -l 9999 -s 123

  • agent: ./stowaway_agent -l 9999 -s 123

-c

此参数admin&&agent用法一致,仅用在主动模式下

代表了希望连接到的节点的地址

  • admin: ./stowaway_admin -c 127.0.0.1:9999

  • agent: ./stowaway_agent -c 127.0.0.1:9999

--socks5-proxy/--socks5-proxyu/--socks5-proxyp/--http-proxy

这四个参数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

--up/--down

这两个参数admin&&agent用法一致,可用在主动&&被动模式下

但注意admin上没有--up参数

这两个参数可选,若为空,则代表上/下游流量为裸TCP流量

若希望上/下游流量为HTTP/WS流量,设置此两参数为httpws即可

  • 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,否则会导致网络出错

  • agent-2: ./stowaway_agent -c 127.0.0.1:10000 --up ws

--reconnect

此参数仅用在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将会参照启动时的设置,通过代理尝试重连

--rehost/--report

这两个参数比较特别,仅用在agent端,详细请参见下方的端口复用机制

--cs

此参数仅用在agent,可用在主动&&被动模式下

主要旨在解决'shell'功能乱码问题,当用户将agent运行于控制台编码为gbk的平台上(例如一般情况下的Windows)并且同时admin运行于控制台编码为utf-8的平台上时,请务必将此参数设置为'gbk'

  • Windows: ./stowaway_agent -c 127.0.0.1:9999 -s 123 --cs gbk

--tls-enable

这两个参数admin&&agent用法一致,可用在主动&&被动模式下

通过设置此选项,可以将节点间流量以TLS加密

示例如下

  • admin: ./stowaway_admin -l 10000 --tls-enable -s 123
  • agent: ./stowaway_agent -c localhost:10000 --tls-enable -s 123

注意,当此参数启用时,aes加密将被默认禁用,-s参数将仅用于节点间相互验证&端口复用功能

另外,当此参数启用时,请保证网络中每一个节点(包括admin)都启用此参数

--domain

这两个参数admin&&agent用法一致,仅可用在主动模式下

通过设置此选项,可以设置当前此节点TLS协商时的SNI选项

示例如下

  • admin: ./stowaway_admin -l 10000 --tls-enable -s 123
  • agent: ./stowaway_agent -c xxx.xxx.xxx.xxx:10000 --tls-enable -s 123 --domain xxx.com

注意,此参数启用必须配合--tls-enable参数,否则此参数无效

--heartbeat

这个参数仅用在admin端,可用在主动&被动模式下

通过设置此选项,可以使admin持续向第一个节点发送心跳包,从而在中间有反向代理的情况下维持长链接

假设admin和agent中有类似nginx的反向代理设备将8080端口代理至8000端口,示例如下

  • admin: ./stowaway_admin -l 8000 --tls-enable -s 123 --down ws --heartbeat
  • agent: ./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亦可,但限制较多

    • admin端:./stowaway_admin -c 192.168.0.105:80 -s 123
    • agent端:./stowaway_agent --report 80 --rehost 192.168.0.105 -s 123
  • IPTABLES模式

    假设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出场

而多级网络才是核心

在stowaway中,组成多级网络需要借助admin中的listenconnectsshtunnel命令来实现

举一个简单的例子

  • admin: ./stowaway_admin -l 9999 -s 123

此时agent-1已经连上admin

  • agent-1: ./stowaway_agent -c 127.0.0.1:9999 -s 123

此时用户还想连接agent-2,如下

  • agent-2: ./stowaway_agent -l 10000 -s 123

那么,此时用户可以通过admin,输入use 0 -> connect agent-2的IP:10000来将其加入网络,并成为agent-1的一个子节点

假如此时用户还希望连入一个节点agent-3,但是通过agent-1无法访问agent-3

那么,此时用户可以通过admin,输入use 0 -> listen -> 选择1.Normal Passive -> 输入10001 从而使得agent-1监听在10001端口上,并等待子节点的连接

等admin操作完成后,agent-3启动如下

  • agent-3: ./stowaway_agent -c 127.0.0.1:10001 -s 123

就可以将agent-3作为agent-1的另一个子节点加入网络了

关于listen以及sshtunnel的详细介绍,可以参看下方的命令解析

如何重连?

Stowaway当前支持多种方式的重连,简单概括如下

首先,当父节点掉线后,只有一种节点会主动退出,那就是启动时为主动模式且没有设置重连的节点

如果设置了重连,那么节点将会在指定的时间间隔中尝试重连

另外,所有被动模式启动的节点都不会主动退出,而是会基于启动时的参数重新监听在指定端口上,此时用户仍然可以通过connectsshtunnel来将这些节点连回网络

注意

  1. 如因网络波动或中间节点掉线,导致某一个分支断开,在主动重连时请务必连接缺失链的头节点,举个例子,admin后接着node1,node1后分为两支,一支是node1->node 2 -> node 3 -> node 4, 一支是node1->node 5 ->node 6,那么如果node2掉线,node3及node4将不会掉线,而是继续保持存活。此时用户若想将node3及node4重新加入网络,那么用户有两种选择,一种是假如node1可以直接访问node3,那么用户可随时在node1将node3用connect或者sshtunnel命令重新加入网络(切记,就算node1同时也可以访问node4,也请不要直接连接node4,请连接整个缺失链(node3->node4)的头节点node3),这样就可以将node3及node4重新加入网络;另一种选择是当node1无法直接访问node3时(即必须经过node2),那么请先将node2重启并加入网络,之后再在node2上使用connect或者sshtunnel命令连接node3,从而将node3及node4加入网络

  2. 当有节点掉线时,那么此时与此节点及其子节点有关的所有socks,backward,forward服务都会被强制停止

命令解析

在admin控制台中,用户可以用tab来补全命令,方向键上下左右来查找历史/移动光标

admin控制台分为两个层级,第一层为主panel,包含的命令如下

  • help: 展示主panel的帮助信息
(admin) >> help
  help                                     		Show help information
  detail                                  		Display connected nodes' detail
  topo                                     		Display nodes' topology
  use        <id>                          		Select the target node you want to use
  exit                                     		Exit Stowaway
  • detail: 展示在线节点的详细信息
(admin) >> detail
Node[0] -> IP: 127.0.0.1:10000  Hostname: ph4ntoms-MBP.lan  User: ph4ntom
Memo:
  • topo: 展示在线节点的父子关系
(admin) >> topo
Node[0]'s children ->
Node[1]

Node[1]'s children ->
  • use: 使用某个agent
(admin) >> use 0
(node 0) >>
  • exit: 退出stowaway
(admin) >> exit
[*] Do you really want to exit stowaway?(y/n): y
[*] BYE!

当用户使用use命令选择了一个agent后,进入第二层node panel,其包含的命令如下

  • help: 展示node panel的帮助信息
(node 0) >> help
  help                                            Show help information
  listen                                          Start port listening on current node
  addmemo    <string>                             Add memo for current node
  delmemo                                         Delete memo of current node
  ssh        <ip:port>                            Start SSH through current node
  shell                                           Start an interactive shell on current node
  socks      <lport> [username] [pass]            Start a socks5 server
  stopsocks                                       Shut down socks services
  connect    <ip:port>                            Connect to a new node
  sshtunnel  <ip:sshport> <agent port>            Use sshtunnel to add the node into our topology
  upload     <local filename> <remote filename>   Upload file to current node
  download   <remote filename> <local filename>   Download file from current node
  forward    <lport> <ip:port>                    Forward local port to specific remote ip:port
  stopforward                                     Shut down forward services
  backward    <rport> <lport>                     Backward remote port(agent) to local port(admin)
  stopbackward                                    Shut down backward services
  shutdwon                                        Terminate current node
  back                                            Back to parent panel
  exit                                            Exit Stowaway 
  • listen: 命令agent监听某个端口并等待子节点的连入
(node 0) >> listen
[*] MENTION! If you choose IPTables Reuse or SOReuse,you MUST CONFIRM that the node was initially started in the corresponding way!
[*] When you choose IPTables Reuse or SOReuse, the node will use the initial config(when node started) to reuse port!
[*] Please choose the mode(1.Normal passive / 2.IPTables Reuse / 3.SOReuse): 1
[*] Please input the [ip:]<port> : 10001
[*] Waiting for response......
[*] Node is listening on 10001

注意,listen是比较特殊的一个命令,可以看到,listen命令有三种模式

  1. Normal passive: 此选项意味着agent将会以普通的方式监听在目标端口,并等待子节点连入
  2. IPTables Reuse:此选项意味着agent将会以IPTables Reuse的方式复用端口,并等待子节点连入
  3. SOReuse:此选项意味着agent将会以SOReuse的方式复用端口,并等待子节点连入

第一个模式是最普遍使用的,若父节点以这种方式监听,那么子节点仅需要-c 父节点ip:port就可以加入网络

第二个和第三个模式是比较特殊的,若用户选择第二或第三个模式,那么用户必须保证当前操作的节点本身就是以端口复用的方式启动的,否则将无法使用这两个模式

第二和第三个模式将不需要用户输入任何信息,节点将会自动使用其自身启动时的参数来复用端口,并准备接受子节点的连接

另外,listen一次只能接受一个子节点的连入,若需要多个子节点连入,请执行相应次数的listen命令

  • addmemo: 为当前节点添加备忘
(node 0) >> addmemo test
[*] Memo added!
(node 0) >> exit
(admin) >> detail
Node[0] -> IP: 127.0.0.1:10000  Hostname: ph4ntoms-MBP.lan  User: ph4ntom
Memo:  test
  • delmemo: 删除当前节点的备忘
(node 0) >> delmemo
[*] Memo deleted!
(node 0) >> exit
(admin) >> detail
Node[0] -> IP: 127.0.0.1:10000  Hostname: ph4ntoms-MBP.lan  User: ph4ntom
Memo:
  • ssh: 命令节点以ssh方式连接目标机器
(node 0) >> ssh 127.0.0.1:22
[*] Please choose the auth method(1.username&&password / 2.certificate): 1
[*] Please enter the username: ph4ntom
[*] Please enter the password: *****
[*] Waiting for response.....
[*] Connect to target host via ssh successfully!
 # ph4ntom @ ph4ntoms-MBP in ~ 👑 [17:03:56]
$ whoami
ph4ntom
 # ph4ntom @ ph4ntoms-MBP in ~ 👑 [17:04:16]
$

在此模式下,tab键将被禁止

  • shell: 获取当前节点的shell
(node 0) >> shell
[*] Waiting for response.....
[*] Shell is started successfully!

bash: no job control in this shell

The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
bash-3.2$ whoami
ph4ntom
bash-3.2$

在此模式下,tab键将被禁止

  • socks:在当前节点上启动socks5服务
(node 0) >> socks 7777
[*] Trying to listen on 0.0.0.0:7777......
[*] Waiting for response......
[*] Socks start successfully!
(node 0) >>

注意一点,此处的7777端口不是在agent上开启的,而是在admin上开启

若需要设置用户名密码,可将上方命令改为socks 7777 <your username> <your password>

若需要指定监听的接口,可将上方命令改为socks xxx.xxx.xxx.xxx:7777

  • stopsocks: 停止在当前节点上的socks5服务
(node 0) >> stopsocks
Socks Info ---> ListenAddr: 0.0.0.0:7777    Username: <null>    Password: <null>
[*] Do you really want to shutdown socks?(yes/no): yes
[*] Closing......
[*] Socks service has been closed successfully!
(node 0) >>
  • connect: 命令当前节点连接至另一个子节点
agent-1: ./stowaway_agent -l 10002
(node 0) >> connect 127.0.0.1:10002
[*] Waiting for response......
[*] New node come! Node id is 1

(node 0) >>
  • sshtunnel: 命令当前节点以ssh隧道的方式连接至另一个子节点
agent-2: ./stowaway_agent -l 10003
(node 0) >> sshtunnel 127.0.0.1:22 10003
[*] Please choose the auth method(1.username&&password / 2.certificate): 1
[*] Please enter the username: ph4ntom
[*] Please enter the password: ******
[*] Waiting for response.....
[*] New node come! Node id is 2

(node 0) >>

在严格受限的网络环境下,可以利用ssh隧道的方式来将stowaway的流量伪装为ssh流量,从而避开防火墙的限制

  • upload: 向当前节点上传文件
(node 0) >> upload test.7z test.xxx
[*] File transmitting, please wait...
136.07 KiB / 136.07 KiB [-----------------------------------------------------------------------------------] 100.00% ? p/s 0s
  • download: 下载当前节点上的文件
(node 0) >> download test.xxx test.xxxx
[*] File transmitting, please wait...
136.07 KiB / 136.07 KiB [-----------------------------------------------------------------------------------] 100.00% ? p/s 0s
  • forward: 映射admin上的端口至远程端口
(node 0) >> forward 9000 127.0.0.1:22
[*] Trying to listen on 0.0.0.0:9000......
[*] Waiting for response......
[*] Forward start successfully!
(node 0) >>
$ ssh 127.0.0.1 -p 9000
Password:
 # ph4ntom @ ph4ntoms-MBP in ~ 👑 [17:19:51]
$
  • stopforward: 关闭当前节点的远程映射
(node 0) >> stopforward
[0] All
[1] Listening Addr : [::]:9000 , Remote Addr : 127.0.0.1:22 , Current Active Connnections : 1
[*] Do you really want to shutdown forward?(yes/no): yes
[*] Please choose one to close: 1
[*] Closing......
[*] Forward service has been closed successfully!
  • backward: 反向映射当前agent上的端口至admin的本地端口
(node 0) >> backward 9001 22
[*] Trying to ask node to listen on 0.0.0.0:9001......
[*] Waiting for response......
[*] Backward start successfully!
(node 0) >>
$ ssh 127.0.0.1 -p 9001
Password:
 # ph4ntom @ ph4ntoms-MBP in ~ 🌈 [17:22:14]
$
  • stopbackward: 关闭当前节点的反向映射
(node 0) >> stopbackward
[0] All
[1] Remote Port : 9001 , Local Port : 22 , Current Active Connnections : 1
[*] Do you really want to shutdown backward?(yes/no): yes
[*] Please choose one to close: 1
[*] Closing......
[*] Backward service has been closed successfully!
  • shutdown: 命令当前节点下线
(node 1) >> shutdown
(node 1) >>
[*] Node 1 is offline!
  • back: 退回到主panel
(node 1) >> back
(admin) >>
  • exit: 退出stowaway
(node 1) >> exit
[*] Do you really want to exit stowaway?(y/n): y
[*] BYE!

TODO

  • 修复bug
  • 支持TLS
  • 支持多startnode的形式

注意事项

  • 此程序仅是闲暇时开发学习,结构及代码结构不够严谨,功能可能存在bug,请多多谅解
  • admin不在线时,新节点将不允许加入
  • admin仅支持一个直接连接的agent节点,agent节点则无此限制
  • 如果用户使用windows下的admin端,请先下载ansicon,或者在这里下载,之后进入对应系统位数的文件夹,执行ansicon.exe -i即可,不然admin端会出现乱码的问题
  • 本程序仅支持标准的基于RFC1928所阐述的UDP ASSOCIATE,请在使用socks5 udp代理时注意您所使用的程序(例如扫描器等),包构造方式必须遵守标准的RFC1928,并且需要自行处理丢包状况。

404星链计划

Stowaway 现已加入 404星链计划

致谢

感谢所有为此项目贡献代码以及建议的师傅们~

参考项目

stowaway's People

Contributors

mm0x00 avatar ph4ntonn avatar r0ck3rt avatar testwill avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

stowaway's Issues

## bug

bug

finallshell ./linux_x64_admin -h 后,输入命令没有显示
kali ./linux_x64_admin -h 无法使用ctrl+c

windows agent出现问题

今天我从releases 下载windows64 agent ,使用出现了错误

image
image
image

同样的环境使用之前我下的windows64 agent 就没问题。。。。

关于编译免杀

agent 使用garble编译可以过大部分杀软但是使用时连接主控端会弹出这个异常
2023-05-07_14-33-26

UDP特性

想问一下是否支持UDP流量的代理呢?

startnode主动结束进程之后,再想连接admin会显示refuse

startnode主动结束agent进程之后,再想连接admin会显示refuse,只能通过结束admin进程重新开启新的监听再次连接

agent端:
C:\Users\xxx\Desktop>windows_x64_agent.exe -c xx:7000
2020/10/27 16:24:01 Node starting......
[Ctrl+C]
C:\Users\xxx\Desktop>windows_x64_agent.exe -c xx:7000
2020/10/27 16:24:11 Node starting......
2020/10/27 16:24:21 [*]Connection refused!

admin端:
C:\Users\xxx\Desktop>windows_x64_admin.exe -l 7000
(admin) >> 2020/10/27 16:24:00 [*]StartNode connected from xxxxx:53019!

(admin) >> tree
StartNode[1]'s child nodes:
There is no child node for this one.
agent结束进程后
(admin) >> 2020/10/27 16:24:09 [*]StartNode seems offline
再次尝试连接
(admin) >> tree
(admin) >>
(admin) >> tree
(admin) >>

注:admin端的7000端口检测是开放的,但是就是连不了,貌似port在被连接一次后即使开放也无法使用

某个节点开启端口转发之后,在切换到其他节点开启端口转发bug

某个节点开启端口转发之后,在切换到其他节点开启端口转发的话,manager.forwardMap会被重新make,导致之前的记录被删掉,并且listener没有被关掉,会导致addconn函数爆空指针异常。

manager.forwardMap = make(map[string]map[string]*forward)

建议注视掉这一行,在新建manager的时候就已经make了,不需要重新make

backward使用问题

使用场景:本机Windows11为admin,使用vps作为agent节点0,内网一台win11作为节点0的子节点1,在admin上use1,
如下将节点1的3389端口转发到本机的43389
image

实际效果并没有转发成功,是我都操作有问题吗。。

bug

进入shell之后,无法中断命令

image

使用control + c 根本没办法中断,,,,输入exit 也退出不了 永久卡死在这里了

image

希望listen能支持多个子节点连入

根据文档描述,listen每次只能接受一个子节点的连入,假如存在大量目标需要连入的情况则非常不方便,希望能支持多个子节点连入

No encryption when the secret is too long

When the secret exceeds 32 bytes, the data is not encrypted.

Steps to reproduce

# on admin
./admin -c 1.1.1.1:1111 -s abcdefghijklmnopqrstuvwxyz0123456789

# on agent
./agent -l 1111 -s abcdefghijklmnopqrstuvwxyz0123456789

Reason

  • In protocol/protocol.go, the error returned by crypto.KeyPadding is ignored
  • In KeyPadding (crypto/aes.go), when the key is too long, it is returned as nil with an error
  • In AESEncrypt (crypto/aes.go), when the key is nil, it does not perform encryption

Solution

As few users would use such kind of key, instead of handling this error I think it's better to just slice the key into 32 bytes. Besides, it's recommended to use stronger encryption mode like AES-256-GCM rather than the insecure CBC mode.

I'm working on resolving this issue before creating a pull request.

Bug

agent版本:gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)
无法上线,admin端报错
图片

一个端口无法上线多个目标

./agent -c x.x.x.x:7500 -s cqmyg --reconnect 120
2023/05/15 00:17:40 [] Starting agent node actively.Connecting to x.x.x.x:7500.Reconnecting every 120 seconds
2023/05/15 00:17:47 [
] Error occured: dial tcp x.x.x.x:7500: connect: connection refused

一个目标上线后,其他目标无法上线,需要重开其他端口才能上线

代理支持

请问是否会考虑添加代理支持呢?例如在 admin 连接 agent 或 agent 连接 admin 时,可以用 --proxy 选项来使用 SOCKS 或者 HTTP 代理。

一个小问题

在建立起s5隧道后,使用过程中相对frp感觉不是很稳定,有时候会出现隧道突然断开、过一会又能用的情况。这种情况在不同的目标内网环境我遇到了4次,不排除是我遇到的环境问题。

有概率无法退出shell

在Centos用screen运行linux_x64_admin,在节点运行shell,有时候会卡住退不出来,只能kill进程。
image

隐藏工具进程参数

请问师傅有无隐藏agent进程的功能,防守方可查看ps aux和history查看到-c 的ip与端口还有-s秘钥,有什么方法能隐藏这些参数吗

异常退出

在vps 开启服务端: admin -l 9999 -s 123
然后再目标1上运行agent -c vps_ip:9999 -s 123
目标2 运行:agent -l 10000 -s 123 等于在目标2开了一个10000端口
admin,输入use 0 -> connect agent-2的IP:10000来将其加入网络,并成为agent-1的一个子节点
那么目标2 和目标3 网络互通 想在访问目标3的网络
目标3 运行:agent -l 10000 -s 123 等于在目标3开了一个10000端口
admin,输入use 2 -> connect agent-3的IP:10000来将其加入网络,并成为agent-2的一个子节点
问题怎么自己退出了啊????
还有主动连接的前提是对方防火墙不拦截你 就相当于cs里面的正向bind_tcp监听器把 没有cs里面的反向监听器吗reverse_tcp和管道监听器smb bind_pipe吗

2

Bug-Report[reuse-port]fail to bind port in some device

in win7 with services VNCServer running on 5900,run following will sometimes get error.

Stowaway_agent_win_x64.exe --rehost xxx.xxx.xxx.xxx --report 5900 -s ciper@here

Error occured: listen tcp xxx.xxx.xxx.xxx:5900: bind: attempt was made to access a socket in a way forbidden by its access permissions

win2019和win11上agent问题

测试agent跑在2019或者win11、win10上,无论是socks还是forward,代理访问http的时候都会出现时断时续的问题。
就是打开内网web时,第一次无法访问,多刷新几次才能正常显示,我测试了在win7上倒是没出现过这个问题。
用的是最新的源码编译的。

shell模式下显示问题

shell模式下,命令回显内容多的话,前面的内容没法显示,也没法上滚查看
(测试环境:admin为Ubuntu18下使用)

admin 长时间运行有概率退出

最近的使用中,搭建了多级代理,但平均两天管理端就会退出掉线,重新运行又会加入节点。
在screen下执行的./linux_x64_admin -l 11111 -s 123 ,每次都是发现socks代理无法访问才知道admin掉线了。
因为没有日志,所以无法提供详细说明😭
另外在攻防中发现在某些特定环境(比如有安全设备)下 agent在连接admin时会被(不知名力量)强制断开连接,admin也会收到报错信息,但是使用frp socks代理能正常连接。

bug

测试时:当客户端使用重连参数后,ubuntu admin端 shutdown 后,kali 客户端无法使用ctrl+c,linux我只测了kali,没测其他的,不知道其他的linux是否也存在这个问题,windows 客户端则不存在这个问题

编译和建议

我在win32下编译的时候,编译出来命令要加空格再回车才能用
我打出来命令前面有个]不知道为什么
use 1这种 因为代码里面是"1",所以用字符串截取才能用
用手机上的termux编译,则没有上面的问题,还好go是交叉编译的,编译好放win32下就没有上面的问题
你有个注释,main.go 里面 如果要编译admin的话,除了把agent注释了,admin不注释,上面的import的agnet要改成admin吧。
这个玩意要是能把节点端口监听流量转发回来监听就更好了,虽然可以frp,感觉用了这个再用frp总是有些麻烦,ssh虽然也行,但也不是什么平台上都有的。

agent 监听指定IP

agent 不管是命令行的-l还是进去之后的listen,希望可以指定IP
例如agent -l 192.168.1.1:9211 -s 1234 -r
listen 192.168.1.1:9211

希望大佬可以加一下这个功能。

端口转发功能可能存在的问题

师傅,这个端口转发的功能可能存在些许问题。事情是这样的,我打算模拟一个环境,把listener_1本地监听端口(8017)转发到服务器(18017)上,然后再在本地配置一个listener_2(IP填服务器IP,监听端口填18017),这样生成攻击载荷的时候选择listener_2也可以成功上线。

但是我发现如果我先配置了listener_2,再使用stowaway转发端口,stowaway就会报错
1

而如果先使用stowaway转发端口,再配置listener_2,CS就会报错端口占用。
2

经过测试,发现功能类似Stowaway的另一位师傅的工具Venom可以在上文的这种环境下成功转发端口(先配置listener,后转发端口以及先转发端口,后配置listener都是可以成功的)
3

麻烦师傅修修BUG啦!

建议加入睡眠及唤醒设置

东西很不错的,实战中有时为避免惊动,需要设置sleep,避免流量过多,同时因为设置sleep后,必然需要唤醒,或者调整sleep为0,。

当agent以后台进程运行时,执行shell命令会导致一直等待

admin端:admin: ./stowaway_admin -l 9999 -s 123
agent端: ./stowaway_agent -s 123 -c 192.168.1.102:9999 &
(admin) >> use 0
(node 0) >> shell
[*] Waiting for response.....

如果是手工复现,在agent端手动运行fg命令后可以正常,但在实际的环境中,如Docker容器中java 反序列化场景命令执行,则会一直卡住,没办法解决,请问这种情况要如何处理。

bug

使用场景:admin为本机win11,node 0 为公网VPS,node 1为内网一台win 11,使用VPS agent被动监听,本机admin主动连接VPS,再node 0 listen 40081,内网win11 agent 主动连接node 0节点,上线成功,此时再次使用node 0 listen后上线内网其他机器失败如下:

image

(网络非常坚挺,排除网络问题),测试内网win11,win10,在此情况下都无法上线

一些问题

基本配置:主节点监听端口,服务端主动连接主节点;主节点开启listen,子节点主动连接

1.listen 监听的端口无法关闭,在主节点上开启的监听端口无法连接或连接中断后,无法删除不需要的listen

2.socks通道代理不稳定,使用二级子节点创建socks通道,连接1分钟后服务器直接断开,再次登录发现,主节点已经连接不上
CleanShot 2022-02-24 at 10 43 39@2x
登录主节点查看后发现,主节点的进程正常,端口也开放,time wait

mac启动不了

abc% ./macos_admin -l 9999 -s 123
zsh: segmentation fault ./macos_admin -l 9999 -s 123

多级反向socks5代理

Hi,感谢师傅做出了这么好用的工具!

我注意到当goto某个节点之后,运行socks [lport]会在该节点启动socks服务器,然后将admin端lport的流量转发过去。请问是否会有一个反向的类似功能呢?即在admin端启动socks服务器,然后将某个agent节点某端口的流量转发到admin端。

(这个应该算enhancement吧)

新功能

师傅是否考虑在agent控制端添加一个info命令呢,主要是想显示当前agent listen了那些端口,socks服务的端口是多少。(虽然也可以通过addmemo 命令备注)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.