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

Stowaway는 Go 언어로 작성된, 침투 테스트 작업자를 위해 제작된 다중 계층 프록시 도구입니다.
사용자는 이 프로그램을 사용하여 외부 트래픽을 여러 노드를 통해 내부 네트워크로 프록시하고, 내부 네트워크 접근 제한을 우회하며, 트리 형태의 노드 네트워크를 구성하고 손쉽게 관리 기능을 구현할 수 있습니다.
별 눌러주셔서 감사합니다. 사용 후 문제점이나 버그를 제보해 주시면 감사하겠습니다. 😘
또한 사용 전에 반드시 사용 방법과 문서 끝부분의 주의사항을 자세히 읽어주시기 바랍니다.
본 프로젝트는 오직 네트워크 보안 연구 및 교육 목적으로만 제공되며, 불법적인 목적으로 사용하는 것을 엄격히 금지합니다. 본 도구를 사용하여 테스트를 수행하기 전에 반드시 대상 시스템의 명시적인 승인을 받고, 해당 국가/지역의 관련 법률 및 규정을 엄격히 준수하시기 바랍니다. 본 도구 사용으로 인해 발생하는 모든 직간접적 결과(데이터 손실, 시스템 손상, 법적 책임 등 포함)는 사용자 본인에게 있으며, 본 프로젝트 제작자는 어떠한 오용이나 이로 인한 법적 책임도 지지 않습니다. 본 도구를 사용함으로써 귀하는 본 면책 조항의 전체 내용을 읽고, 이해하고, 동의한 것으로 간주됩니다.
make를 사용하여 바로 다중 플랫폼 전체 프로그램을 컴파일하거나, Makefile을 확인하여 특정 프로그램을 컴파일하세요.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 하위 프로토콜 유형, 기본값은 Raw 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 상위 프로토콜 유형, 기본값은 Raw TCP 트래픽, HTTP/WS 선택 가능
--down 하위 프로토콜 유형, 기본값은 Raw TCP 트래픽, HTTP/WS 선택 가능
--cs 실행 중인 플랫폼의 쉘 인코딩 유형, 기본값 utf-8, gbk 선택 가능
--tls-enable 노드 통신에 TLS 활성화, TLS 활성화 시 AES 암호화는 비활성화됨
--domain TLS SNI/WebSocket 도메인 지정, 비어 있으면 기본값은 대상 노드 주소
이 인자는 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
이 인자는 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 인자가 없습니다.
이 인자들은 선택 사항이며, 비어 있으면 상위/하위 트래픽이 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로 설정해야 하며, 그렇지 않으면 네트워크 오류가 발생합니다.
./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는 10초마다 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이 첫 번째 노드에 지속적으로 하트비트 패킷을 전송하여 중간에 리버스 프록시가 있는 경우에도 긴 연결을 유지할 수 있습니다.