「-RemoteProxy」オプションにある「WebSocket」スキームを指定する事で、「Remote」と呼称する側の相手をWebSocket-APIとする事ができる
相手
WebSocketでリモートシェルを作ったので、それを相手とする
ws://192.0.2.1:9999/shellでWebSocket-APIが待機しているものとする
WebSocket へのアップグレード
「-RemoteProxy」オプションの「WebSocket」スキームを使う事で、「Remote」と呼称する相手に対して、WebSocketへのアップグレードを依頼するHTTPリクエスト・メッセージを送ることができる
StreamRelay.NET.exe -LocalPort 0 -RemotePort 9999 -RemoteHost 192.0.2.1 -RemoteProxy WebSocket://192.0.2.1:9999/shell?Origin=http://192.0.2.1:9999/^&Sec-WebSocket-Key=AAAAAAAAAAA%3d
こんな感じで、「Local」と呼称する側(コンソール)と、「Remote」と呼称する側(ws://192.0.2.1:9999/shell)とWebSocketプロトコルで会話する事ができる。
ただし、これでは、WebSocketへのアップグレードだけで、WebSocketプロトコル内部で用いるWebSocketデータグラム(リクエストはマスクする等)は、自分で作る必要がある。
WebSocketデータグラムも符号化
次は、
StreamRelay.NET.exe -LocalPort 0 -RemotePort 9999 -RemoteHost 192.0.2.1 -RemoteProxy WebSocket://192.0.2.1:9999/shell?Origin=http://192.0.2.1:9999/^&Sec-WebSocket-Key=AAAAAAAAAAAA -RemoteProxy netstream:///?WebSocketEncode=text%26mask%3d00000000 -RemoteProxy netstream:///?WebSocketDecode
とすると、WebSocketプロトコルへアップグレード後、WebSocketデータグラムの符号化(送信時は、テキストモード、マスクを実施)と、符号化解除(受信時はテキストモード)を実施する。
maskは「00 00 00 00」だけど、ここで、
mask%26"乱数アルゴリズム名"
とか(例:mask%26random
)乱数プラグインの指定をする事で、任意の乱数アルゴリズムを指定できる
下記の文字コードの話を考えると、textモードより、binモードの方が適切かもしれない
この符号化は、Plugin.BaseFilterStream.dllに実装しているので、これをプラグインとして読み込む必要がある
WebSocketの文字コード
WebSocket-APIが、特に何もしていなければ、シェル側とコンソール側で同じ文字コードを使っていれば、上記で問題はない。
しかし、WebSocketは文字コードが UTF-8なので、WebSocket-APIが文字コードをUTF-8に変換しているなどの場合、そして、コンソールの文字コードがUTF-8でない場合、文字コード変換が必要になってくる。
StreamRelay.NET.exe -LocalPort 0 -RemotePort 9999 -RemoteHost 192.0.2.1 -RemoteProxy WebSocket://192.0.2.1:9999/shell?Origin=http://192.0.2.1:9999/^&Sec-WebSocket-Key=AAAAAAAAAAAA -RemoteProxy netstream:///?WebSocketEncode=text%26mask=00000000 -RemoteProxy netstream:///?WebSocketDecode -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を適当な乱数にする事ができる
例えば、
「Sec-WebSocket-Key-Auto=6-7%2cCryptoRandom」とすると、アルゴリズムCryptoRandomで、バイト数=6~7の範囲の乱数となる
乱数の指定方法
乱数アルゴリズムの試用ツールとしてのStreamRelay.NET.exe