webcat - netcat for websockets
Connect to a websocket server:
webcat ws://example.com:3000/
Start a websocket server listening on port 3000:
webcat -l 3000
The server only accepts one client at a time. The client auto-reconnects.
Setting up a MITM debugging proxy
By redirecting the standard input/output streams of webcat you can turn it into a man-in-the-middle proxy, particularily useful for debugging stateful protocols on top of websocket.
[some client] <-> [webcat server] <-> [webcat client] <-> [some server]
FIFOs
All it takes to set this up is four commands, for example:
mkfifo client-in server-in
webcat ws://example.com:3000/ < client-in > server-in
webcat -l 4000 < server-in > client-in
echo > server-in # unblock the FIFO deadlock
You can now connect your client to ws://localhost:4000/
and inject messages by writing to the named pipes:
echo "Hello from webcat" > client-in
Webcat does two tricks to make this setup even more convenient:
When redirecting stdout, the messages are automatically printed to stderr, so you can still observe what's happening.
When the client recognizes the server output
accepted new client
, it automatically disconnects and reconnects its server connection to prevent stateful application protocols from becoming out of sync.
Limitations
no support for binary messages
no support for messages containing newlines (cannot send them, cannot distinguish them from separate messages)
no support for WebSocket Secure (
wss://
) (webcat is meant for local testing & debugging, wss is out of scope)