gosstp
https://docs.google.com/document/d/1YZkjqnd39suDhv-_AX7w_OmdhoWwZvZRzQYn8UMfdzg/edit#
AVTOKYO内ハンズオン!
golang で VPN プロトコルにチャレンジ!!
ハンズオンテキスト
https://openhardsecurity.connpass.com/event/264964/
全体ミッション:
パケットを読みながら avtokyo.net (自宅サーバ)への HTTP アクセスを成功させよう!
ミッション1
以下の GitHub からコードを clone して、 SSTP サーバへ接続しましょう。
https://github.com/tamx/gosstp.git
SSTP サーバは以下のアドレスで動いています。
SSTP サーバ: ???.???.???.???
ポート番号: 443番
ミッション2
パケットとコードを見比べて、どこがマズいのか探りましょう。
つながるけれど、途中で失敗しますね。コードの最初の方にある debug を true にすると、 SSTP 内のパケットが出力されます。パケットとコードを見比べて、どこを直さないといけないのかを見つけましょう。
*** 見つけるだけでいいです。 ***
見つけたら、接続するための情報をチューターさんから聞いてください。
ヒント1
パケット番号 0xC023 とは?
ヒント2
パケット番号 0xC023 の最初のバイト 0x03 の意味は何でしょうか?
ミッション3
HTTP サーバからの情報を取得しましょう。
HTTP サーバは以下で走っていますので、コードを修正して、つながるようにしてください。
HTTPサーバ:???.???.???.???
HTTPポート: 8080番
これを設定しても、まだ出力が出ずに途中で止まってしまいますね。どこを直さないといけないのかを見つけて、直しましょう。
ヒント1
3handshake
ヒント2
3handshake は SYN → SYNACK → ACK の順番でパケットをやり取りします。
ヒント3
3handshake の流れは以下のようになります。
- クライアントからサーバへ SYN パケットを送る。
- SYN パケットを受け取ったサーバはクライアントへ SYNACK パケットを送る。
- SYNACK パケットを受け取ったクライアントは ACK パケットをサーバへ送る。
- TCP コネクション確立!
ヒント4
ヒント3の 3番の処理をどこで行っているかを探し、この処理が正しく行われているかを確認しましょう。
ミッション4
HTTP サーバから正しい情報を取得しましょう。
今回取得したい情報は以下のものです。
HTTP/1.1 200 OK
Date: Mon, 31 Oct 2022 09:51:37 GMT
Server: Apache/2.4.41 (Ubuntu)
Vary: Accept-Encoding
Content-Length: 129
Connection: close
Content-Type: text/html; charset=UTF-8
<html>
<head><title>Bingo!</title></head><body>
<h1> Welcome to Goal! </h1>
20221031 18:51:37<p>
192.168.42.26<p>
</body></html>
でも、実際は違うものが返ってきてますね。どこを修正しなければいけないのかを見つけましょう。
HTTP/1.1 200 OK
Date: Mon, 31 Oct 2022 09:43:43 GMT
Server: Apache/2.4.41 (Ubuntu)
Vary: Accept-Encoding
Content-Length: 128
Connection: close
Content-Type: text/html; charset=UTF-8
<html>
<head><title>Boo!Boo!Boo!</title></head><body>
<h1> akkan be- </h1>
20221031 18:43:43<p>
192.168.42.26<p>
</body></html>
ヒント1
VirtualHost
ヒント2
今回の接続先は avtokyo.net:8080 (自宅サーバ)です。