Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
Stowaway — 침투 테스터를 위한 다중 홉 프록시 도구로, 여러 노드를 통한 트래픽 라우팅, SOCKS5/SSH 터널링, 포트 포워딩, 원격 셸 및 암호화된 노드 통신을 지원합니다. | Kitploit
도구/GitHubGitHub/ph4ntonn/stowaway
Encryption/Decryption ToolsLateral MovementNetwork Access ControlPenetration TestingCommand and ControlRed Teaming
GitHubph4ntonn/stowaway

Stowaway

침투 테스터를 위한 다중 홉 프록시 도구로, 여러 노드를 통한 트래픽 라우팅, SOCKS5/SSH 터널링, 포트 포워딩, 원격 셸 및 암호화된 노드 통신을 지원합니다.

저장소 보기
3.4k4425개월 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

stowaway.png

Stowaway

GitHub issues GitHub forks GitHub stars GitHub license

English

Stowaway는 Go 언어로 작성된, 침투 테스트 작업자를 위해 제작된 다중 계층 프록시 도구입니다.

사용자는 이 프로그램을 사용하여 외부 트래픽을 여러 노드를 통해 내부 네트워크로 프록시하고, 내부 네트워크 접근 제한을 우회하며, 트리 형태의 노드 네트워크를 구성하고 손쉽게 관리 기능을 구현할 수 있습니다.

별 눌러주셔서 감사합니다. 사용 후 문제점이나 버그를 제보해 주시면 감사하겠습니다. 😘

또한 사용 전에 반드시 사용 방법과 문서 끝부분의 주의사항을 자세히 읽어주시기 바랍니다.

선언

본 프로젝트는 오직 네트워크 보안 연구 및 교육 목적으로만 제공되며, 불법적인 목적으로 사용하는 것을 엄격히 금지합니다. 본 도구를 사용하여 테스트를 수행하기 전에 반드시 대상 시스템의 명시적인 승인을 받고, 해당 국가/지역의 관련 법률 및 규정을 엄격히 준수하시기 바랍니다. 본 도구 사용으로 인해 발생하는 모든 직간접적 결과(데이터 손실, 시스템 손상, 법적 책임 등 포함)는 사용자 본인에게 있으며, 본 프로젝트 제작자는 어떠한 오용이나 이로 인한 법적 책임도 지지 않습니다. 본 도구를 사용함으로써 귀하는 본 면책 조항의 전체 내용을 읽고, 이해하고, 동의한 것으로 간주됩니다.

특징

  • 관리자 측의 더욱 친숙한 상호작용, 명령어 자동 완성/히스토리 지원
  • 한눈에 보이는 노드 트리 관리
  • 풍부한 노드 정보 표시
  • 노드 간 정방향/역방향 연결
  • 노드 간 재연결 지원
  • 노드 간 socks5/http 프록시를 통한 연결
  • 노드 간 SSH 터널을 통한 연결
  • 노드 간 트래픽 TCP/HTTP/WS 선택 가능
  • 다중 계층 socks5 트래픽 프록시 전송, UDP/TCP, IPv4/IPv6 지원
  • 노드의 SSH를 통한 원격 호스트 접속 지원
  • 원격 쉘
  • 파일 업로드 및 다운로드
  • 포트 로컬/원격 매핑
  • 노드 포트 재사용 가능
  • 각종 서비스 자유롭게 켜고 끄기
  • 노드 간 상호 인증
  • 노드 간 트래픽 TLS/AES-256-GCM 암호화
  • v1.0 대비 파일 크기 25% 감소
  • 다양한 플랫폼 지원(Linux/Mac/Windows/MIPS/ARM)

컴파일 및 데모

  • make를 사용하여 바로 다중 플랫폼 전체 프로그램을 컴파일하거나, Makefile을 확인하여 특정 프로그램을 컴파일하세요.
  • 컴파일하기 싫으신 분은 release에서 이미 컴파일된 프로그램을 바로 사용할 수 있습니다.
  • 데모 영상: YouTube

사용 방법

역할

Stowaway는 두 가지 역할이 있습니다.

  • admin 침투 테스터가 사용하는 메인 컨트롤러
  • agent 침투 테스터가 배포하는 피제어단

용어 정의

  • 노드: admin || agent를 의미
  • 능동 모드: 현재 조작 중인 노드가 다른 노드에 능동적으로 연결
  • 수동 모드: 현재 조작 중인 노드가 특정 포트를 리스닝하고 다른 노드의 연결을 기다림
  • 상위: 현재 조작 중인 노드와 부모 노드 간의 트래픽
  • 하위: 현재 조작 중인 노드와 모든 자식 노드 간의 트래픽

빠른 시작

다음 명령어로 가장 간단한 Stowaway 인스턴스를 빠르게 시작할 수 있습니다.

  • admin: ./stowaway_admin -l 9999
  • agent: ./stowaway_agent -c <stowaway_admin's IP>:9999

인자 설명

  • admin
root@kitploit:~
인자:
-l  수동 모드의 리스닝 주소 [ip]:<port>
-s  노드 통신 암호화 키, 모든 노드(admin&&agent)가 일치해야 함
-c  능동 모드의 대상 노드 주소
--socks5-proxy socks5 프록시 서버 주소
--socks5-proxyu socks5 프록시 서버 사용자명 (선택)
--socks5-proxyp socks5 프록시 서버 비밀번호 (선택)
--http-proxy HTTP 프록시 서버 주소
--down  하위 프로토콜 유형, 기본값은 Raw TCP 트래픽, HTTP/WS 선택 가능
--tls-enable  노드 통신에 TLS 활성화, TLS 활성화 시 AES 암호화는 비활성화됨
--domain  TLS SNI/WebSocket 도메인 지정, 비어 있으면 기본값은 대상 노드 주소
--heartbeat  하트비트 패킷 활성화
  • agent
root@kitploit:~
인자:
-l  수동 모드의 리스닝 주소 [ip]:<port>
-s  노드 통신 암호화 키
-c  능동 모드의 대상 노드 주소
--socks5-proxy socks5 프록시 서버 주소
--socks5-proxyu socks5 프록시 서버 사용자명 (선택)
--socks5-proxyp socks5 프록시 서버 비밀번호 (선택)
--http-proxy HTTP 프록시 서버 주소
--reconnect  재연결 시간 간격
--rehost  포트 재사용 시 재사용할 IP 주소
--report  포트 재사용 시 재사용할 포트 번호
--up  상위 프로토콜 유형, 기본값은 Raw TCP 트래픽, HTTP/WS 선택 가능
--down  하위 프로토콜 유형, 기본값은 Raw TCP 트래픽, HTTP/WS 선택 가능
--cs  실행 중인 플랫폼의 쉘 인코딩 유형, 기본값 utf-8, gbk 선택 가능
--tls-enable  노드 통신에 TLS 활성화, TLS 활성화 시 AES 암호화는 비활성화됨
--domain  TLS SNI/WebSocket 도메인 지정, 비어 있으면 기본값은 대상 노드 주소

인자 사용법

-l

이 인자는 admin과 agent 모두 동일하게 사용되며, 수동 모드에서만 사용됩니다.

IP 주소를 지정하지 않으면 기본적으로 0.0.0.0에서 리스닝합니다.

  • admin: ./stowaway_admin -l 9999 또는 ./stowaway_admin -l 127.0.0.1:9999

  • agent: ./stowaway_agent -l 9999 또는 ./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 인자가 없습니다.

이 인자들은 선택 사항이며, 비어 있으면 상위/하위 트래픽이 Raw 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 또는 ./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

둘째, HTTP는 반이중 프로토콜이므로 Stowaway의 전이중 통신 특성에 적합하지 않습니다. 따라서 여기서 HTTP 프로토콜은 HTTP 메시지 형식만 구현했을 뿐 완전한 기능의 HTTP 워크플로는 아닙니다. 따라서 이 프로토콜을 여전히 사용할 수는 있지만, Stowaway 간 트래픽이 HTTP 메시지 형식으로 전송될 경우 nginx를 통해 전달할 수 없습니다. 이 코드와 기능의 일부는 특정 상황에서 HTTP 프로토콜을 사용하기 위해 유지되었으며, 다른 한편으로는 사용자 정의 프로토콜을 참조할 수 있는 사용자 정의 트래픽 템플릿을 제공하기 위함입니다.

nginx 등의 리버스 프록시를 통해 통신해야 하는 경우 ws 프로토콜을 사용하고 TLS와 함께 사용하시기 바랍니다.

--reconnect

이 인자는 agent에서만, 그리고 능동 모드에서만 사용됩니다.

선택 사항이며, 설정하지 않으면 노드는 네트워크 연결이 끊어져도 자동으로 재연결을 시도하지 않습니다. 설정하면 노드는 설정된 x초마다 부모 노드에 재연결을 시도합니다.

  • admin: ./stowaway_admin -l 9999

  • agent: ./stowaway_agent -c 127.0.0.1:9999 --reconnect 10

위의 경우, agent와 admin 간의 연결이 끊어지면 agent는 10초마다 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 옵션 또는 WebSocket의 대상 Host를 설정할 수 있습니다.

예시:

  • 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

--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가 실제로 리스닝하고 연결을 수락하길 원하는 포트를 나타냅니다.

참고

  • 위의 예시는 admin과 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의 listen, connect, sshtunnel 명령을 사용해야 합니다.

간단한 예를 들어 보겠습니다.

  • 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-2를 네트워크에 추가하고 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는 현재 여러 가지 방식의 재연결을 지원합니다. 간단히 요약하면 다음과 같습니다.

먼저, 부모 노드가 연결이 끊어지면 오직 한 가지 유형의 노드만 자동으로 종료됩니다. 바로 시작 시 능동 모드였고 재연결이 설정되지 않은 노드입니다.

재연결이 설정된 경우, 노드는 지정된 시간 간격으로 재연결을 시도합니다.

또한, 수동 모드로 시작된 모든 노드는 자동으로 종료되지 않고 시작 시의 인자를 기반으로 지정된 포트에서 다시 리스닝합니다. 이때 사용자는 여전히 connect, sshtunnel을 사용하여 이러한 노드를 네트워크에 다시 연결할 수 있습니다.

참고

  1. 네트워크 변동이나 중간 노드의 연결 끊김으로 인해 특정 분기가 끊어진 경우, 능동 재연결 시 반드시 누락된 체인의 헤드 노드에 연결해야 합니다. 예를 들어, admin 다음에 node1이 있고, node1에서 두 개의 분기(node1->node2->node3->node4, node1->node5->node6)가 있다고 가정합니다. node2가 연결이 끊어지면 node3과 node4는 연결이 끊어지지 않고 계속 살아 있습니다. 이때 사용자가 node3과 node4를 다시 네트워크에 추가하려면 두 가지 선택지가 있습니다. 하나는 node1이 node3에 직접 접근할 수 있다면, 사용자는 언제든지 node1에서 connect 또는 sshtunnel 명령을 사용하여 node3을 다시 네트워크에 추가할 수 있습니다(기억하세요, 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 콘솔은 두 가지 레벨로 나뉩니다. 첫 번째 레벨은 메인 패널이며, 다음 명령어를 포함합니다.

  • help: 메인 패널의 도움말 정보 표시
root@kitploit:~
(admin) >> help
  help                                     		도움말 정보 표시
  detail                                  		연결된 노드의 상세 정보 표시
  topo                                     		노드 토폴로지 표시
  use        <id>                          		사용하려는 대상 노드 선택
  exit                                     		Stowaway 종료
  • detail: 온라인 노드의 상세 정보 표시
root@kitploit:~
(admin) >> detail
Node[0] -> IP: 127.0.0.1:10000  Hostname: ph4ntoms-MBP.lan  User: ph4ntom
Memo:
  • topo: 온라인 노드의 부모-자식 관계 표시
root@kitploit:~
(admin) >> topo
Node[0]'s children ->
Node[1]

Node[1]'s children ->
  • use: 특정 agent 사용
root@kitploit:~
(admin) >> use 0
(node 0) >>
  • exit: Stowaway 종료
root@kitploit:~
(admin) >> exit
[*] Do you really want to exit stowaway?(y/n): y
[*] BYE!

사용자가 use 명령어로 agent를 선택하면 두 번째 레벨인 node 패널로 진입하며, 다음 명령어를 포함합니다.

  • help: node 패널의 도움말 정보 표시
root@kitploit:~
(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     <local filename> <remote filename>   현재 노드에 파일 업로드
  download   <remote filename> <local filename>   현재 노드에서 파일 다운로드
  forward    <lport> <ip:port>                    로컬 포트를 특정 원격 ip:port로 전달
  stopforward                                     포워드 서비스 종료
  backward    <rport> <lport>                     원격 포트(agent)를 로컬 포트(admin)로 역방향 전달
  stopbackward                                    백워드 서비스 종료
  shutdown                                        현재 노드 종료
  back                                            상위 패널로 돌아가기
  exit                                            Stowaway 종료 
  • status: 현재 노드의 socks/forward/backward 상태 표시
root@kitploit:~
(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: agent가 특정 포트를 리스닝하고 자식 노드의 연결을 기다리도록 명령
root@kitploit:~
(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: 현재 노드에 메모 추가
root@kitploit:~
(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: 현재 노드의 메모 삭제
root@kitploit:~
(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 방식으로 대상 머신에 연결하도록 명령
root@kitploit:~
(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: 현재 노드의 쉘 획득
root@kitploit:~
(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 서비스 시작
root@kitploit:~
(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 서비스 중지
root@kitploit:~
(node 0) >> stopsocks
Socks Info ---> ListenAddr: 0.0.0.0:7777    Username: <null>    Password: <null>
[*] Do you really want to shut down socks?(yes/no): yes
[*] Closing......
[*] Socks service has been closed successfully!
(node 0) >>
  • connect: 현재 노드에 다른 자식 노드로 연결하도록 명령
root@kitploit:~
agent-1: ./stowaway_agent -l 10002
root@kitploit:~
(node 0) >> connect 127.0.0.1:10002
[*] Waiting for response......
[*] New node online! Node id is 1

(node 0) >>
  • sshtunnel: 현재 노드에 SSH 터널 방식으로 다른 자식 노드로 연결하도록 명령
root@kitploit:~
agent-2: ./stowaway_agent -l 10003
root@kitploit:~
(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 online! Node id is 2

(node 0) >>

엄격히 제한된 네트워크 환경에서는 SSH 터널 방식을 사용하여 Stowaway 트래픽을 SSH 트래픽으로 위장하여 방화벽 제한을 우회할 수 있습니다.

  • upload: 현재 노드에 파일 업로드
root@kitploit:~
(node 0) >> upload test.7z test.xxx
[*] File transmitting, please wait...
136.07 KiB / 136.07 KiB [-----------------------------------------------------------------------------------] 100.00% ? p/s 0s
  • download: 현재 노드의 파일 다운로드
root@kitploit:~
(node 0) >> download test.xxx test.xxxx
[*] File transmitting, please wait...
136.07 KiB / 136.07 KiB [-----------------------------------------------------------------------------------] 100.00% ? p/s 0s
  • forward: admin의 포트를 원격 포트로 매핑
root@kitploit:~
(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) >>
root@kitploit:~
$ ssh 127.0.0.1 -p 9000
Password:
 # ph4ntom @ ph4ntoms-MBP in ~ 👑 [17:19:51]
$
  • stopforward: 현재 노드의 원격 매핑 종료
root@kitploit:~
(node 0) >> stopforward
[0] All
[1] Listening Addr : [::]:9000 , Remote Addr : 127.0.0.1:22 , Active Connections : 1
[*] Do you really want to shut down forward?(yes/no): yes
[*] Please choose one to close: 1
[*] Closing......
[*] Forward service has been closed successfully!
  • backward: 현재 agent의 포트를 admin의 로컬 포트로 역방향 매핑
root@kitploit:~
(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) >>
root@kitploit:~
$ ssh 127.0.0.1 -p 9001
Password:
 # ph4ntom @ ph4ntoms-MBP in ~ 🌈 [17:22:14]
$
  • stopbackward: 현재 노드의 역방향 매핑 종료
root@kitploit:~
(node 0) >> stopbackward
[0] All
[1] Remote Port : 9001 , Local Port : 22 , Active Connections : 1
[*] Do you really want to shut down backward?(yes/no): yes
[*] Please choose one to close: 1
[*] Closing......
[*] Backward service has been closed successfully!
  • shutdown: 현재 노드를 오프라인으로 전환
root@kitploit:~
(node 1) >> shutdown
(node 1) >>
[*] Node 1 is offline!
  • back: 메인 패널로 돌아가기
root@kitploit:~
(node 1) >> back
(admin) >>
  • exit: Stowaway 종료
root@kitploit:~
(node 1) >> exit
[*] Do you really want to exit stowaway?(y/n): y
[*] BYE!

TODO

  • 버그 수정
  • TLS 지원
  • 다중 startnode 형태 지원

주의사항

  • 이 프로그램은 여가 시간에 개발 및 학습용으로 작성된 것으로, 구조 및 코드 구조가 엄격하지 않으며 기능에 버그가 있을 수 있습니다. 양해 부탁드립니다.
  • admin이 온라인 상태가 아닐 경우 새 노드는 추가할 수 없습니다.
  • admin은 직접 연결된 agent 노드 하나만 지원하며, agent 노드에는 이러한 제한이 없습니다.
  • Windows에서 admin을 사용하는 경우 먼저 ansicon을 다운로드하거나 여기에서 다운로드한 후, 해당 시스템 비트 수의 폴더로 이동하여 ansicon.exe -i를 실행하십시오. 그렇지 않으면 admin에서 글자가 깨질 수 있습니다.
  • 본 프로그램은 RFC1928에 명시된 표준 UDP ASSOCIATE만 지원합니다. socks5 UDP 프록시를 사용할 때는 사용하는 프로그램(예: 스캐너 등)이 표준 RFC1928을 준수하여 패킷을 구성해야 하며, 패킷 손실 상황은 직접 처리해야 합니다.

404星链计划

Stowaway는 이제 404星链计划에 합류했습니다.

감사의 말

Stowaway 개발 과정에서 도움을 주신 다음 분들과 프로젝트에 감사드립니다.

  • lz520520
  • SignorMercurio
  • MM0x00
  • r0ck3rt
  • Termite
  • Venom
도구 다운로드
  • --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