1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

WebSocketCat(wscat) の代替としての StreamRelay.jar

Last updated at Posted at 2017-11-15

java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar

StreamRelay.bat

「-Proxy」オプションにある「WebSocket」スキームを指定する事で、「Remote」と呼称する側の相手をWebSocket-APIとする事ができる


相手

WebSocketでリモートシェルを作ったので、それを相手とする

ws://192.0.2.1:9999/shellでWebSocket-APIが待機しているものとする


WebSocket へのアップグレード

「-Proxy」オプションの「WebSocket」スキームを使う事で、「Remote」と呼称する相手に対して、WebSocketへのアップグレードを依頼するHTTPリクエスト・メッセージを送ることができる

java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -RemotePort 9999 -RemoteHost 192.0.2.1 -Proxy WebSocket://192.0.2.1:9999/shell?Origin=http://192.0.2.1:9999/,Sec-WebSocket-Key=AAAAAAAAAAAA

こんな感じで、「Local」と呼称する側(コンソール)と、「Remote」と呼称する側(ws://192.0.2.1:9999/shell)とWebSocketプロトコルで会話する事ができる。
ただし、これでは、WebSocketへのアップグレードだけで、WebSocketプロトコル内部で用いるWebSocketデータグラム(リクエストはマスクする等)は、自分で作る必要がある。


WebSocketデータグラムも符号化

次は、

java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -RemotePort 9999 -RemoteHost 192.0.2.1 -Proxy WebSocket://192.0.2.1:9999/shell?Origin=http://192.0.2.1:9999/,Sec-WebSocket-Key=AAAAAAAAAAAA -RemoteRequestWebSocket=text,mask -RemoteResponseWebSocket

とすると、WebSocketプロトコルへアップグレード後、WebSocketデータグラムの符号化(送信時は、テキストモード、マスクを実施)と、符号化解除(受信時はテキストモード)を実施する。

下記の文字コードの話を考えると、textモードより、binモードの方が適切かもしれない。


WebSocketの文字コード

WebSocket-APIが、特に何もしていなければ、シェル側とコンソール側で同じ文字コードを使っていれば、上記で問題はない。

しかし、WebSocketは文字コードが UTF-8なので、WebSocket-APIが文字コードをUTF-8に変換しているなどの場合、そして、コンソールの文字コードがUTF-8でない場合、文字コード変換が必要になってくる。

java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -RemotePort 9999 -RemoteHost 192.0.2.1 -Proxy WebSocket://192.0.2.1:9999/shell?Origin=http://192.0.2.1:9999/,Sec-WebSocket-Key=AAAAAAAAAAAA -RemoteRequestWebSocket=text,mask -RemoteResponseWebSocket -LocalCharset shift_jis -RemoteCharset utf-8

とすると、「Local」と呼称する側の文字コードは「Shift-JIS」で、「Remote」と呼称する側のWebSocket-APIに対しては文字コードUTF-8に変換する。という事ができる。


Sec-WebSocket-Key

「Sec-WebSocket-Key=AAAAAAAAAAAA」を「Sec-WebSocket-Key-Auto」にする事で、Sec-WebSocket-Keyを適当な乱数にする事ができる


目次へ戻る

目次というか最初の一歩

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?