SEC CON2013 オンライン予選 Write-up

忘れないうちにメモー。

自分が担当したところだけ。

network 100 Repeat After Me (未完)

問題文はただのpcapファイル。

中身を見ると、telnetのキャプチャログだとわかるので、何をしているのか調べる。

echoが煩いので、 telnet && tcp.dstport==23 でフィルタ。

中を見ると

  • nslookup
  • ssh
  • ログイン処理
  • (ログイン後)ls

を行っているのがわかる。

あとはキーストロークを読み取って同じことを実行すればOK。

楽勝!

・・・とおもいきや、コントロールシーケンス(バックスペースとか、Ctrl-Uとか)の扱いで手こずり、回答できずじまい。

どうも、Ctrl-Wの挙動を勘違いしているようなのだが、まだよくわからず。

network 200 Find the Key

icmp echo/reply のデータ部分にHTTPのメッセージが乗っているので、こいつを切りだす。

最初は プログラム書いてやろうとしたのだが、実質数パケットだったので、デバッグする手間を考えて手作業で実施。

つまり目Grep、手コピペ

ICMPのヘッダまでは問題なく排除。
HTTPのBODY部からファイルを切り出す手段については、以下の2アプローチ。

ファイル全体が落ちてきている場合

2OO OK でレスポンスが来ているので、Content-Lengthを参考に、
それ以降のパケット(MTUの関係で分割されているっぽい)を切りだす。

また content-type が png だったので、マジックバイトとIENDフィールドがあることも合わせて確認した。

ファイルの一部が落ちてきている場合

Get時にbytesオプショを使い、ファイルの途中からDLしているリクエストもあった。

こいつらは、206 Partial Content で落ちてきている。

まずは同様に、 Content-length、IEND を参考に切り出し。


切り出したら、 Content-range を参考にして、前者のファイルに結合(というか開始ビット以降を上書き)する。


ちなみに全体としては、200OK 2つ、 206 3つがやりとりされていたが、
200OK 1つと、206 1つ扱えればKEYは手に入った。

HTTPヘッダとBODYの境目を見極めるのにちょっと苦労した。

network 300 Hidden Message

pngファイル(やるお)が問題。

Hexdumpで中を見ると、末尾にDNSの逆引きクエリが見える。

また、JPGの終端バイトを探すと、その直後にPCAPファイルのヘッダがある。

この2点から、 バイナリエディタで切り出して、Wiresharkへ。

DNSのクエリを投げていたので、 当該のIPアドレスに当該のクエリを投げたらキーが帰ってきた。

この問題が一番楽だったwww

network 400 SECCON競馬 (未完)

WEBSOCKETでリアルタイム更新される競馬ページ。
レースの結果を予想して答えるのが問題。

きっと何かの脆弱性とかで結果を不正取得できるのだろう、と想像。

Wiresharkでキャプチャしながら操作したり、javascriptを直接実行したりして、
更新時に実施されるコマンドとレスポンスを調査、列挙。
(ここは主にチームメイトの先輩に助けてもらいました)

その後、パラメータを変えて試行錯誤。

KIAIで2時間ぐらいぐらいやったところ、 get_result という、競馬の結果を手に入れるコマンドがSQLエラーを返してくることを発見。
コマンドの性質的にもこいつが狙い所だろうと判断して的を絞る。

・・・が、エスケープ処理が強固で結局突破できず。。


あとは細々HELPに入ったりしたが、メインはNETWORK問題のみ。


チーム全体の成績は 3300点(12位タイ)

6人チームで、独力で500点、協力して800点。まあ、役にはたったかな?

所感

NETWORK以外の知識がなさすぎるのが反省点。
できる問題終えたあと(手詰まり含む)は、ほとんど役立たずだった。
せめてもうひとつぐらい得意分野を作っておくことにする。

でも久々に徹夜でPC打ち込んで楽しかった。

Inspiron 700m に Kali Linuxをインストール

備忘録。

とりあえずインストールして起動するまでは問題なし。
起動後、無線LANカードを認識しない。

Inspiron 700mの無線LANカードは Intel PRO/Wireless 2100
dmesgを見ると

[ 10.604219] ipw2100: Intel(R) PRO/Wireless 2100 Network Driver, git-1.2.2
[ 10.604220] ipw2100: Copyright(c) 2003-2006 Intel Corporation
[ 10.605179] ipw2100: Detected Intel PRO/Wireless 2100 Network Connection
[ 10.621238] ipw2100 0000:02:01.0: firmware: failed to load ipw2100-1.3.fw (-2)
[ 10.927717] ipw2100: eth%d: ipw2100_get_firmware failed: -2
[ 10.927718] ipw2100: eth%d: Failed to power on the adapter.
[ 10.927719] ipw2100: eth%d: Failed to start the firmware.


どうもファームウェア周りの問題の模様。
で、
debian ipw2100 firmware
とかでググルト
https://wiki.debian.org/ipw2200
こんなサイトにヒット。
ここを読んで以下の作業を実施
apt-get install firmware-ipw2x00
modprobe -r ipw2100; modprobe ipw2100

これで 無線LANカードを eth1 として認識した。
dmesg

[ 1836.482282] ipw2100: Intel(R) PRO/Wireless 2100 Network Driver, git-1.2.2
[ 1836.482288] ipw2100: Copyright(c) 2003-2006 Intel Corporation
[ 1836.483041] ipw2100: Detected Intel PRO/Wireless 2100 Network Connection
[ 1836.483389] ipw2100 0000:02:01.0: firmware: direct-loading firmware ipw2100-1.3.fw

クライアントとサーバ

ずいぶん偉そうな言い方だが、違う人達に3回ほど同じことを指摘したので4回目以降のためにまとめることにした。
 

俺にこのURLはられた人へ

よくあるミスだから、気にしないでおk。
たくさんの人が間違えることだからブログに書いたのです。
でも大事なことだからちゃんと覚えてね。
 
 

本文

ソフトウェア設計で気を付けないといけないことの一つ。
「クライアントはリクエストなしにサーバからパケットを受けることはできない」
 
これは大原則。気をつけることというか、「してはいけないこと」かな。
一応言葉の定義をしておくと

  • サーバ:常駐し、リクエストを受信して応答を返送するプロセス
  • クライアント:リクエストを送信し応答を受信するプロセス

 
NW的な言い回しに言い換えると、パケットをlistenするのがサーバ。
そのlistenしている相手にパケットを送るのがクライアント。
 
クライアントのプロセスは常駐しないし、ポートの監視も行っていないので、いつ来るかわからないパケットを待つことはできない。(リクエストを送ったときのみ、応答を受信するまでポートの監視を行う)
一方でサーバは常駐し随時ポートを監視しているので、突然リクエストが来ても応答を返送できる
 
言い換えると、リクエストなしにパケットを送りたいのなら、受信側にもサーバとなるプロセスが必要。
それ(受信側へのサーバプロセス配置)を意図していないなら、シーケンス図が間違っていることになる。
 

具体例 その1

Webアプリケーションのシーケンス図の一部。
つまりクライアント=Webブラウザ、サーバ=Webサーバ。
(リダイレクトやjavascriptによる自動更新で)ユーザの操作なしに画面遷移する場合です。
クライアントは操作せず、サーバ側から更新後の画面がでるので

 |クライアント|                    |サーバ|
   |               |
   |   自動更新された画面   |
   |<-----------------------------|
   |               |

と書きたくなるけれど、これは間違い。
Webブラウザは、サーバプロセスではないのでWebサーバから突然パケットを受けることはできない。
(必ず、対応するリクエストが存在する)
つまりは、裏側で(ユーザに見えないだけで)リクエストを送っているので

 |クライアント|                    |サーバ|
   |               |
   |   画面の自動更新要求   |
   |----------------------------->|
   |               |
   |   自動更新された画面   |
   |<- - - - - - - - - - - - - - -|
   |               |

と、するべき。

具体例 その2

おなじく、Webアプリケーションのシーケンス図の一部。
認証機能で、パスワードを要求する場合。
サーバ側からパスワード要求が行われるので

 |クライアント|                    |サーバ|
   |               |
   |   パスワード入力画面   |
   |<-----------------------------|
   |               |
   |     パスワード     |
   |- - - - - - - - - - - - - - ->|
   |               |
   |      認証結果     |
   |<- - - - - - - - - - - - - - -|
   |               |

と書きたくなるけれど、これは間違い。
この場合の間違いは2点

  • パスワード入力画面は、パスワード入力画面表示を要求されて初めて表示される
  • 認証結果をいきなりおくっているが、これに対応するリクエストがない

理由は具体例1と同じ。
クライアントには、要求に応答する機能はないので、入力画面にパスワードを返すことはできない。
また、呼び出しなしに応答があるのはシーケンス図としておかしい。
(関数呼び出ししていないのに返り値が帰ってくるようなもん。異次元w)
なので、

 |クライアント|                    |サーバ|
   |               |
   | パスワード入力画面表示要求 |
   |----------------------------->|
   |               |
   |   パスワード入力画面   |
   |<- - - - - - - - - - - - - - -|
   |               |
   |  パスワード(認証要求)  |
   |----------------------------->|
   |               |
   |     認証結果      |
   |<- - - - - - - - - - - - - - -|
   |               |

と、するべき。
 
偉い人から見たら、突込みどころ満載&何を今更 かもしれないけれど、現場でこの説明が必要だったのです。ご勘弁を。
 
(でも、有識者による変なところへの指摘は大歓迎です。 よろしくご鞭撻ください)
 

SailFin Sample Applications - OnlineBank

べつのサンプルを動かしてみる。

こっちは手順通りで動いた。

どうも、Registerが正しく受理されないときがある模様。
5xxも4xxも帰らないところを見ると、そもそもSIPの処理系にパケットが届いていないか、処理系にバグが潜んでいる気がする。
とはいえサンプルコードなので後者の可能性は低い。
厳密に探るならデバッグログ取ったりなんだりする必要があるのだが、ちょっとそこまで手を出す気にはなれないので一旦保留。

SailFin Sample Applications - Basic3pcc

書かれた手順だけだと若干情報不足なのでメモ。

Webと同じ情報が
$HOME_SAILFIN/samples/sipservlet/index.html

$HOME_SAILFIN/samples/sipservlet/Basic3pcc/README.html
にあった。

3pccのデモはユーザIDやドメインがCallSetupと若干違った。
それにより、X-Liteの設定が変わる。
具体的には以下の通り。
 ID: 一文字目が大文字 e.g. Alice, Bob
 Domain: sailfin.org

でもやっぱり動かない。何故だ

glassfish / sailfin install - Eclipse

SIPサーブレット動かしてごにょりたいので備忘録。
ちなみにWindowsXP

glassfish

Eclipseはよくわからんのでごった煮のパッケージで導入
GlassFish Tools Bundle for Eclipse v1.2 (December 17, 2009)
http://dlc.sun.com.edgesuite.net/glassfish/eclipse/

これでGlassFish設定済のEclipseが入った。

sailfin

jarファイルをダウンロード
http://sailfin.java.net/downloads/download_windows.html
今回はv2の多言語版にした。

ここの手順を参考に導入
http://docs.sun.com/app/docs/doc/820-4277/abrat?a=view

jarファイルを実行
java -Xmx256m -jar sailfin-installer-v2-b31g-windows-ml.jar

sailfinディレクトリが出来るので移動して
lib\ant\bin\ant -f setup.xml

ロケールが日本語にならなかったモノの、ビルド成功。


samples

Eclipseでsailfinプロジェクトを作ろうとするが
ウィザードの設定項目に何を入れたらよいのか分からず詰まる。
Eclipse自体がよく分からん。
サンプルが存在するNetBeansの方がいいのか?

・・・とおもいきや、いかのURLを見つけた
http://sailfin.java.net/downloads/sampleinstructions.html

そもそもサンプル動かすだけならコマンドラインでいけそう。


コレの通りにやったら、一点だけ問題(後述)があったものの、成功。
X-Liteが唸った。うるさかった。
とりあえず、sailfinとsip softphoneの連携は問題なさそう。
あとは開発環境か・・・

つぎはこれ動かす予定↓
http://weblogs.java.net/blog/bhavanishankar/archive/2009/09/21/new-basic3pcc-sample-application-addition-sailfin

サンプルを動かしたときに起きた問題

SIPサーブレットが送信する initial-inviteに対して、クライアントが400を返してしまう事象にぶつかった。

エラーレスポンスとしては
400 malformed topmost via header
要するにviaヘッダが異常というレスポンス。
そこで中身を見たところ、viaヘッダにIPv6アドレスが載っていた。
どうもこいつをX-Liteがパース出来なかった模様。
そこで、Servletが動作するマシンのIPv6アドレス設定を削除して試したところ、解決した。
現状IPv6環境は想定していないので特に問題はないが、一応参考までに。