
Многоступенчатый прокси-инструмент для пентестеров, обеспечивающий маршрутизацию трафика через несколько узлов, туннелирование SOCKS5/SSH, перенаправление портов, удалённую оболочку и зашифрованную связь между узлами.

Stowaway — это многоуровневый прокси-инструмент, написанный на Go, предназначенный для специалистов по тестированию на проникновение.
С его помощью вы можете направлять внешний трафик через несколько узлов во внутреннюю сеть, обходить ограничения доступа, создавать древовидную структуру узлов и легко управлять ими.
Спасибо всем за звёзды! Буду рад вашим вопросам и сообщениям об ошибках 😘
Пожалуйста, перед использованием внимательно прочитайте руководство и примечания в конце документа.
Данный проект предназначен исключительно для исследований в области кибербезопасности и учебных целей. Запрещается использовать его для любых незаконных действий. Перед использованием данного инструмента в любых тестах вы должны получить явное разрешение от целевой системы и строго соблюдать соответствующие законы и нормативные акты вашей страны/региона. Все прямые или косвенные последствия (включая, но не ограничиваясь потерей данных, повреждением системы, юридической ответственностью и т.д.) ложатся на пользователя. Автор проекта не несёт ответственности за любые злоупотребления или юридические последствия. Использование данного инструмента означает, что вы прочитали, поняли и согласны со всеми положениями данного отказа от ответственности.
make для сборки полной много платформенной версии или измените Makefile для сборки конкретных программ.Stowaway включает две роли:
admin — управляющий узел для пентестераagent — управляемый узел, развёртываемый пентестеромСледующие команды позволяют быстро запустить простейший экземпляр Stowaway:
./stowaway_admin -l 9999./stowaway_agent -c <IP_адрес_stowaway_admin>: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 Включить поддержание активности (heartbeat)
Параметры:
-l Адрес для прослушивания в пассивном режиме [ip]:<port>
-s Ключ шифрования связи узлов
-c Адрес целевого узла в активном режиме
--socks5-proxy Адрес SOCKS5-прокси
--socks5-proxyu Имя пользователя SOCKS5-прокси (опционально)
--socks5-proxyp Пароль SOCKS5-прокси (опционально)
--http-proxy Адрес HTTP-прокси
--reconnect Интервал переподключения (в секундах)
--rehost IP-адрес для повторного использования порта (reuse)
--report Порт для повторного использования (reuse)
--up Тип протокола восходящего потока (по умолчанию чистый TCP; опции: HTTP/WS)
--down Тип протокола нисходящего потока (по умолчанию чистый TCP; опции: HTTP/WS)
--cs Тип кодировки оболочки платформы (по умолчанию utf-8; опция: gbk)
--tls-enable Включить TLS для связи между узлами (при включении TLS шифрование AES отключается)
--domain Указать домен для TLS SNI/WebSocket (если пусто — по умолчанию адрес целевого узла)
Этот параметр одинаково используется admin и agent, только в пассивном режиме.
Если IP-адрес не указан, по умолчанию используется 0.0.0.0.
./stowaway_admin -l 9999 или ./stowaway_admin -l 127.0.0.1:9999./stowaway_agent -l 9999 или ./stowaway_agent -l 127.0.0.1:9999Этот параметр одинаково используется admin и agent, может применяться в активном и пассивном режимах.
Опционально. Если пусто, связь не шифруется; если задан, трафик шифруется с этим ключом.
./stowaway_admin -l 9999 -s 123./stowaway_agent -l 9999 -s 123Этот параметр одинаково используется admin и agent, только в активном режиме.
Указывает адрес узла, к которому нужно подключиться.
./stowaway_admin -c 127.0.0.1:9999./stowaway_agent -c 127.0.0.1:9999Эти четыре параметра одинаково используются admin и agent, только в активном режиме.
--socks5-proxy — адрес SOCKS5-прокси, --socks5-proxyu и --socks5-proxyp опциональны.
--http-proxy — адрес HTTP-прокси, используется аналогично SOCKS5.
Без имени/пароля:
./stowaway_admin -c 127.0.0.1:9999 --socks5-proxy xxx.xxx.xxx.xxx./stowaway_agent -c 127.0.0.1:9999 --socks5-proxy xxx.xxx.xxx.xxxС именем/паролем:
./stowaway_admin -c 127.0.0.1:9999 --socks5-proxy xxx.xxx.xxx.xxx --socks5-proxyu xxx --socks5-proxyp xxx./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.
./stowaway_admin -c 127.0.0.1:9999 --down ws./stowaway_agent -c 127.0.0.1:9999 --up ws или ./stowaway_agent -c 127.0.0.1:9999 --up ws --down wsТакже обратите внимание на два момента:
./stowaway_admin -c 127.0.0.1:9999 --down ws./stowaway_agent -l 9999 --up wsВ этом случае agent обязательно должен установить --up в ws, иначе будет ошибка сети.
То же самое между агентами: если agent-1 слушает на порту 10000 с --down ws, то agent-2 должен установить --up ws.
./stowaway_agent -c 127.0.0.1:10000 --up wsЕсли вам нужно передавать трафик через nginx или другие обратные прокси, используйте протокол WS вместе с TLS.
Этот параметр используется только в agent и только в активном режиме.
Опционально. Если не задан, узел не будет переподключаться после разрыва; если задан, узел будет пытаться переподключаться к родительскому узлу каждые x секунд.
./stowaway_admin -l 9999./stowaway_agent -c 127.0.0.1:9999 --reconnect 10В данном случае при разрыве соединения между agent и admin agent будет пытаться переподключиться к admin каждые 10 секунд.
То же для взаимодействия между агентами.
Параметр --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, только в активном режиме.
Позволяет задать опцию SNI при согласовании TLS или целевой хост WebSocket.
Пример:
./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 будет постоянно отправлять keep-alive пакеты первому узлу, поддерживая долгоживущее соединение при наличии обратного прокси.
Предположим, между 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 wsStowaway поддерживает повторное использование портов на основе SO_REUSEPORT/SO_REUSEADDR и iptables.
Режим 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 123Режим iptables
Предположим, agent использует повторное использование порта 22.
В этом случае agent должен установить параметры -l, --report и -s.
kill, программа автоматически очистит правила iptables. Но если убит с kill -9, очистка не произойдёт.
Поэтому во избежание ситуации, когда agent аварийно завершился, а правила iptables остались, и повторно используемый порт становится недоступен, при необходимости завершения нужно выполнить:
python reuse.py --stop --rhost xxx.xxx.xxx.xxx --rport xxx
Это отключит правила перенаправления, и исходный сервис снова станет доступен.-l.Из примеров выше видно, что участвуют только admin и один agent. Многоуровневая сеть — ключевая особенность.
В Stowaway для построения многоуровневой сети используются команды listen, connect, sshtunnel на admin.
Простой пример:
./stowaway_admin -l 9999 -s 123Агент-1 уже подключился к admin:
./stowaway_agent -c 127.0.0.1:9999 -s 123Теперь пользователь хочет подключить agent-2:
./stowaway_agent -l 10000 -s 123Пользователь может через admin ввести use 0 → connect IP_агента-2:10000, чтобы добавить его в сеть как дочерний узел для agent-1.
Предположим, пользователь хочет добавить agent-3, но через agent-1 до него не добраться.
Тогда через admin: use 0 → listen → выбрать 1.Normal Passive → ввести 10001. Теперь agent-1 слушает порт 10001 и ждёт подключения дочернего узла.
После этого agent-3 запускается:
./stowaway_agent -c 127.0.0.1:10001 -s 123Таким образом agent-3 становится ещё одним дочерним узлом agent-1.
Подробнее о командах listen и sshtunnel см. ниже в разделе команд.
Stowaway поддерживает несколько способов переподключения. Кратко:
Когда родительский узел отключается, только узлы, запущенные в активном режиме без параметра --reconnect, завершаются.
Если параметр --reconnect задан, узел будет пытаться переподключаться с заданным интервалом.
Узлы, запущенные в пассивном режиме, не завершаются, а продолжают слушать на заданном порту. Вы всё ещё можете использовать connect или sshtunnel, чтобы снова подключить эти узлы к сети.
connect или sshtunnel на node1, чтобы подключить node3 (даже если node1 также может достичь node4, не подключайтесь напрямую к node4; подключайте головной узел всей недостающей цепочки — node3). Если node1 не может напрямую достичь node3 (только через node2), сначала перезапустите node2 и подключите его к сети, затем на node2 используйте connect или sshtunnel для подключения к node3.В консоли admin можно использовать Tab для автодополнения команд, стрелки для истории/перемещения курсора.
Консоль admin имеет два уровня. Первый — главная панель с командами:
help: показать справку главной панели.(admin) >> help
help Показать справку
detail Показать подробную информацию о подключённых узлах
topo Показать топологию узлов
use <id> Выбрать целевой узел для работы
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: выбрать определённый агент.(admin) >> use 0
(node 0) >>
exit: выйти из Stowaway.(admin) >> exit
[*] Вы действительно хотите выйти из Stowaway?(y/n): y
[*] BYE!
Когда пользователь выбирает агента с помощью use, он переходит на второй уровень — панель узла, со следующими командами:
help: показать справку панели узла.(node 0) >> help
help Показать справку
status Показать состояние узла (socks/forward/backward)
listen Запустить прослушивание порта на текущем узле
addmemo <string> Добавить заметку для текущего узла
delmemo Удалить заметку текущего узла
ssh <ip:port> Запустить SSH через текущий узел
shell Запустить интерактивную оболочку на текущем узле
socks <lport> [username] [pass] Запустить SOCKS5-сервер
stopsocks Остановить SOCKS-сервисы
connect <ip:port> Подключиться к новому узлу
sshtunnel <ip:sshport> <agent port> Использовать SSH-туннель для добавления узла в топологию
upload <имя_локального_файла> <имя_удалённого_файла> Загрузить файл на текущий узел
download <имя_удалённого_файла> <имя_локального_файла> Скачать файл с текущего узла
forward <lport> <ip:port> Перенаправить локальный порт на удалённый ip:port
stopforward Остановить службы forward
backward <rport> <lport> Перенаправить удалённый порт (агента) на локальный порт (admin)
stopbackward Остановить службы backward
shutdown Завершить текущий узел
back Вернуться на родительскую панель
exit Выйти из Stowaway
status: показать состояние SOCKS/forward/backward текущего узла.(node 0) >> status
Socks status:
ListenAddr: 0.0.0.0:10000 Username: Password:
-------------------------------------------------------------------------------------------
Forward status:
[1] Listening Addr: [::]:20000 , Remote Addr: 192.168.1.1:22 , Active Connections: 0
[2] Listening Addr: [::]:30000 , Remote Addr: 192.168.1.1:22 , Active Connections: 0
-------------------------------------------------------------------------------------------
Backward status:
[1] Remote Port: 40000 , Local Port: 50000 , Active Connections: 0
listen: дать команду узлу прослушивать порт и ждать подключения дочерних узлов.(node 0) >> listen
[*] ВНИМАНИЕ! Если вы выбираете IPTables Reuse или SOReuse, вы ДОЛЖНЫ убедиться, что узел исходно был запущен соответствующим образом!
[*] При выборе IPTables Reuse или SOReuse узел будет использовать начальную конфигурацию (при запуске) для повторного использования порта!
[*] Пожалуйста, выберите режим (1.Normal passive / 2.IPTables Reuse / 3.SOReuse): 1
[*] Введите [ip:]<port> : 10001
[*] Ожидание ответа......
[*] Узел слушает на порту 10001
Обратите внимание, что listen — особая команда. У неё три режима:
Normal passive: узел будет слушать порт обычным образом и ждать подключения дочернего узла.IPTables Reuse: узел будет повторно использовать порт с помощью iptables и ждать подключения дочернего узла.SOReuse: узел будет повторно использовать порт с помощью SOReuse и ждать подключения дочернего узла.Первый режим — самый распространённый. Если родительский узел слушает таким образом, дочерний узел просто подключается с -c ip_родителя:port.
Второй и третий режимы — особые. Если пользователь выбирает их, он должен убедиться, что текущий узел сам был запущен с соответствующим методом повторного использования порта, иначе эти режимы не будут работать.
Во втором и третьем режимах пользователю не нужно вводить дополнительную информацию; узел автоматически использует свои параметры запуска для повторного использования порта и готов принять дочернее подключение.
Также listen принимает только одно дочернее подключение за раз. Для нескольких дочерних узлов выполните listen соответствующее количество раз.
addmemo: добавить заметку для текущего узла.(node 0) >> addmemo test
[*] Заметка добавлена!
(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
[*] Заметка удалена!
(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
[*] Выберите метод аутентификации (1.имя_пользователя&&пароль / 2.сертификат): 1
[*] Введите имя пользователя: ph4ntom
[*] Введите пароль: *****
[*] Ожидание ответа.....
[*] Подключение к целевому хосту через SSH успешно!
# ph4ntom @ ph4ntoms-MBP in ~ 👑 [17:03:56]
$ whoami
ph4ntom
# ph4ntom @ ph4ntoms-MBP in ~ 👑 [17:04:16]
$
В этом режиме клавиша Tab отключена.
shell: получить оболочку текущего узла.(node 0) >> shell
[*] Ожидание ответа.....
[*] Оболочка успешно запущена!
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
[*] Попытка прослушивания на 0.0.0.0:7777......
[*] Ожидание ответа......
[*] SOCKS успешно запущен!
(node 0) >>
Обратите внимание: порт 7777 открывается на admin, а не на agent.
Если нужно задать имя пользователя и пароль, измените команду на socks 7777 <ваше_имя> <ваш_пароль>.
Если нужно указать интерфейс прослушивания, измените на socks xxx.xxx.xxx.xxx:7777.
stopsocks: остановить SOCKS5-сервис на текущем узле.(node 0) >> stopsocks
Socks Info ---> ListenAddr: 0.0.0.0:7777 Username: <null> Password: <null>
[*] Вы действительно хотите остановить socks?(yes/no): yes
[*] Закрытие......
[*] Служба socks успешно остановлена!
(node 0) >>
connect: команда текущему узлу подключиться к другому дочернему узлу.agent-1: ./stowaway_agent -l 10002
(node 0) >> connect 127.0.0.1:10002
[*] Ожидание ответа......
[*] Новый узел онлайн! ID узла: 1
(node 0) >>
sshtunnel: команда текущему узлу подключиться к другому дочернему узлу через SSH-туннель.agent-2: ./stowaway_agent -l 10003
(node 0) >> sshtunnel 127.0.0.1:22 10003
[*] Выберите метод аутентификации (1.имя_пользователя&&пароль / 2.сертификат): 1
[*] Введите имя пользователя: ph4ntom
[*] Введите пароль: ******
[*] Ожидание ответа.....
[*] Новый узел онлайн! ID узла: 2
(node 0) >>
В строго ограниченной сети можно использовать SSH-туннель, чтобы замаскировать трафик Stowaway под SSH-трафик и обойти ограничения брандмауэра.
upload: загрузить файл на текущий узел.(node 0) >> upload test.7z test.xxx
[*] Передача файла, пожалуйста, подождите...
136.07 KiB / 136.07 KiB [-----------------------------------------------------------------------------------] 100.00% ? p/s 0s
download: скачать файл с текущего узла.(node 0) >> download test.xxx test.xxxx
[*] Передача файла, пожалуйста, подождите...
136.07 KiB / 136.07 KiB [-----------------------------------------------------------------------------------] 100.00% ? p/s 0s
forward: перенаправить порт admin на удалённый порт.(node 0) >> forward 9000 127.0.0.1:22
[*] Попытка прослушивания на 0.0.0.0:9000......
[*] Ожидание ответа......
[*] Перенаправление успешно запущено!
(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 , Active Connections : 1
[*] Вы действительно хотите остановить forward?(yes/no): yes
[*] Выберите, что закрыть: 1
[*] Закрытие......
[*] Служба forward успешно остановлена!
backward: обратное перенаправление порта agent на локальный порт admin.(node 0) >> backward 9001 22
[*] Попытка дать узлу команду слушать на 0.0.0.0:9001......
[*] Ожидание ответа......
[*] Backward успешно запущен!
(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 , Active Connections : 1
[*] Вы действительно хотите остановить backward?(yes/no): yes
[*] Выберите, что закрыть: 1
[*] Закрытие......
[*] Служба backward успешно остановлена!
shutdown: команда текущему узлу выйти из сети.(node 1) >> shutdown
(node 1) >>
[*] Узел 1 отключен!
back: вернуться на главную панель.(node 1) >> back
(admin) >>
exit: выйти из Stowaway.(node 1) >> exit
[*] Вы действительно хотите выйти из Stowaway?(y/n): y
[*] BYE!
ansicon.exe -i, иначе admin будет отображаться с искажёнными символами.UDP ASSOCIATE согласно RFC1928. При использовании SOCKS5 UDP-прокси убедитесь, что ваша программа (например, сканер) формирует пакеты в соответствии со стандартом RFC1928, и самостоятельно обрабатывайте потери пакетов.
Stowaway присоединился к проекту 404 StarLink
Благодарю следующих коллег и проекты за помощь в разработке Stowaway:
-l: порт, который не должен быть доступен нормально (реальный порт, на котором agent будет слушать).--report: порт для повторного использования.-s: ключ шифрования связи.Поддерживается только на Linux; agent автоматически изменяет iptables (требуются права root).
agent: ./stowaway_agent --report 22 -l 10000 -s 123
После запуска agent используйте скрипт reuse.py из каталога script.
Сначала задайте значение 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