センスがないブログ

趣味の話とかいろいろ

KOSENSEC2016に参加した話(軽いWriteUpのようなもの込)

高専セキュリティコンテスト2016にzabun_oyamaとして参加しました。

今回初開催の大会だったのでいろいろとトラブルが多かったですね。というかトラブルしかなかったというか、なんか凄かったです(語彙力)

 

このセキュリティコンテストですが、各チームにIoTサービスを提供する感じのサーバのアドレスが開始直後に渡されて、そこにSSHで接続して、リモートで脆弱性修正なりバグ潰しなんかをしていって点を稼ぐ形式でした。

珍しいことに問題文が一切無く、修正するべき箇所のジャンルだけが示されるだけでした。

 

サーバが提供するサービスは、今回の競技課題のIoT車のステータスを確認したりだとかシステムの時間を変更するだとか、ファイルをアップロードするだとかそういうサービスです。このサービスに行き着くためにはbasic認証を通らなければなりません。

 

自分たちのチームはI2(?)の300点問題しか解けなかったです。

一番解けてるチームが多かったやつですね。

これは、/home/scuser/直下だかのbackdoorなるいかにもなディレクトリがあるので中身を確認します。

するとREADMEがあってcatなりで中身みるとpassword_is_backdoorみたいなことが書いてあります。同じディレクトリにもう一個なんかファイルがあった気がしますが忘れました。なんか中身がなくてファイル名で「これはデバック用ですよ」みたいなこと書いてあるだけのファイルだけだった気がする。

それで、passwd-とかindex_old.phpのページとかでユーザ一覧みるとbackdoorなるユーザが存在しているのが分かります。

さっきパスワードは教えてもらったので

$su backdoor

してパスワードにbackdoor入れるとログオン出来ます。

ユーザ名とパスワードが同じなのはパスワードが弱いので自分で適当なパスワードに変えてやります。

すると300点が手に入ります。

 

他の問題はhttp://サーバ名/admin/の中に入れないと話になりません。

adminのパスは"password"だったようです(同じ学校の別チームに聞いた)

まあ典型的な弱いパスワードですよね。

これに気づけると結構な得点を稼げると思います。

adminに入ってからはまずシステム時間を変えるページがあるのでそこでOSコマンドインジェクションして/var/www/html/の下のファイルの権限を777にしときます。

そしたら、.htpasswdの中身を書き換えて、adminのパスを変えます。多分これでI2のどれかの点が入ると思います。

 

他は、IoTCarのステータスを表示するstatus.phpがあってこれをadminのページから見ると表の一部でエラーを吐きます。ソース読むと、数値しか入らないところに直で文字列突っ込んでるのが分かります。これを直せば多分点が入ります。

他はインジェクションできるコードとかを直したり、p=ファイル名でファイル表示しちゃう感じのよくある脆弱性持ちのfile.phpを直したり、サーバの中身全部見れちゃうindex_old.phpとかいう危ないやつ消したり、index.htmlをubuntuのデフォページじゃなくてadminのあたりに飛ぶようにすればいいんじゃないんですかね?

ここら辺は競技時間中にやったことじゃないので合ってるかは知りません。

 

 

あと、競技終了後にいろいろ議論になってますが、サーバによってiotcarの実行ファイルがあったり無かったり、その実行ファイルの所有者はrootでiotcar.pyの中でsystemにコマンド投げて自分のユーザであるscuserにroot権限与えられちゃうってのはさすがにどうかと、今回優勝したチームは見事に当たりのサーバを引いて、開始30分でrootを取れたそうです。

多分rootが取れるのは運営側では意図してなかったと思います。

デフォでは/var/www/html/admin/の中のファイルはscuserには読み込み権限しか無く、所有者はwww-dataさんになっていてadminページからインジェクションするとこいつの権限でscuserに書き込み権限を与えることが出来ます。まあ当然rootは取れないはずです。

 

あと面白かったのは、127.0.0.1のどっかだかのポート(忘れた)でudp通信して/etc/iotcar/の中のデバイスを模したファイルに書き込むiotcar.pyスクリプト

これ最初の状態では構文エラーでて実行出来ませんでした。

何分だか経って運営側から修正されたコードが渡されました。が、これも正しく動きません。

まず、udpで受け取るデータは文字列になって届きます。それをそのまま数値と比較してるので、何度データ送りつけてもif文で弾かれて何も起きません。

次に、ファイルの開くモードが間違ってたりしてるので直します。

ここら辺は僕は直接触ってないので詳しく言えないですがそんな感じのことをしてやるとiotcarのとこのファイルにデータが書き込まれます。

これが問題なのか、仕様なのかは知りません。

結局これのバグ潰しをしたところで点が入る訳でも無かったようですね。

意味が解らない。

*1

 

まあそんな感じでした。

とにかくadminに入れなかったのが悔やまれるなぁって感じの大会でした。

*1:雰囲気から察するにスクリプトを運営側で一度もテストしていない??