ptunnel を使ってみる part1

セキュリティミニキャンプ in 沖縄の実習で使用した ptunnel の復習です。

ptunnel

ICMP echo request/reply を使用して、TCPコネクションを確立する奴です。詳細はこの公式ページを御覧ください。

クライアント(ブラウザを想像してください)がプロキシ(ここでは ICMP echo requestを送る相手)に対して、ICMP echo request/replyを使用して、 TCP データを送り、プロキシがデスティネーション(ブラウザで接続したいサーバを想像してください)とTCPコネクションを確立する仕組みです。

f:id:ryouta768:20131228163110p:plain

ファイアウォールなどで、TCP パケットが遮断されていても、 ICMP echo request/reply さえ通れば、プロキシからTCPコネクションが確立出来るということですね。

Windows7などでは、外部からの ICMP をブロックするようにファイアウォールが動作していますよね。でも、ptunnel は内部から ICMP が通れば OK と。

環境

VirtualBox 上の VM 2 台を使って、検証を行いました。

トポロジ的には以下の様な感じです。

      client                                server
vm1(192.168.56.101) ----------------- vm2(192.168.56.102)

ptunnel の使い方

基本的にはクライアントとプロキシで ptunnel コマンドを動作させます。

クライアント側で使うオプションは以下

#proxy のアドレス
-p <proxy-address>
#待ち受けポート
-lp <listen port>
#destination のアドレス
-da <destination-address>
#destination のポート
-dp <destination-port>

検証1

以下の様な感じで検証を行いました。

*vm1(192.168.56.101)
    *client
        *待ち受けポート
            *8888
    *telnet
        *8888に接続
*vm2(192.168.56.102)
    *proxy
    *server
        *Apache2(80)


#vm1で打った ptunnel コマンド
ptunnel -p 192.168.56.102 -lp 8888 -da 192.168.56.102 -dp 80
#vm2で打った ptunnel コマンド
ptunnel

ここで、 vm1 上で telnet コマンドを使用して、クライアント側のリッスンポートである 8888 に接続します。

root@twhs:~# telnet localhost 8888
Trying ::1...
Trying 127.0.0.1...
[inf]: Incoming connection.
[evt]: No running proxy thread - starting it.
Connected to localhost.
Escape character is '^]'.
[inf]: Ping proxy is listening in privileged mode.
GET / HTTP/1.0

HTTP/1.1 200 OK
Date: Sat, 28 Dec 2013 06:45:30 GMT
Server: Apache/2.2.22 (Debian)
Last-Modified: Fri, 27 Dec 2013 16:32:45 GMT
ETag: "5fb3d-b1-4ee86a4dd8019"
Accept-Ranges: bytes
Content-Length: 177
Vary: Accept-Encoding
Connection: close
Content-Type: text/html

<html><body><h1>It works!</h1>
<p>This is the default web page for this server.</p>
<p>The web server software is running but no content has been added, yet.</p>
</body></html>
[inf]: Received session close from remote peer.
[inf]:
Session statistics:
[inf]: I/O:   0.00/  0.00 mb ICMP I/O/R:       17/       3/       0 Loss:  0.0%
[inf]:
Connection closed by foreign host.

vm2 の apache に対して、 HTTP リクエストを送信し、 200 OK が帰って来ていることがわかります。

この時、 vm2 上でパケットキャプチャを行った結果が以下です。

f:id:ryouta768:20131228162729p:plain

vm1 と vm2 で ICMP request/reply のやりとりが行われています。

そのやりとりを見ると、通常の ICMP request 1 つに対して複数の reply が返ってきていることがわかります。また、request を送信するごとに、 seq はインクリメントされています。

パケット長が他のものよりも大きい物を詳しく見てみると、データ部分に HTTP リクエストやHTTPレスポンスが格納されていることがわかります。

HTTP リクエスト

f:id:ryouta768:20131228163020p:plain

HTTPレスポンス

f:id:ryouta768:20131228163021p:plain

よく見てみると、ICMP のデータ部分の GET ... の前に何か他のデータが格納されていることがわかります。

これは ptunnel がセッションを識別するために使用する情報が入っているのでしょうか。

まとめ

ptunnel を使うと TCP over ICMP が出来るよ!

次は ssh で暗号化してみるよ!

参考にしたページ

Ping Tunnel