Attack&Defence in Fukuoka参加記録
先日のAttack&Defence in Fukuokaお疲れさまでした。
いつもはイベントに参加する側でしたが、今回初めて、イベント運営サイドにも若干関わらせていただきました。
準備
・前日
バイト終わりに集合し、貸出用・サーバー用PCのセッティング。電源オプションの変更と、貸出用の5台にはLinux環境のセットアップをして、当日になってPCが壊れた方が出ても大丈夫なように準備。
・当日
朝09:00頃に会場集合し、前日にセッティングを行った貸出用PCを会場に運び込む。同時に、コンセントの不足が予想されたので、あらかじめ借りておいた大量の電源タップも会場に運び込み、適切な位置にセット。(配置を考えないとブレーカーが落ちるぞ、と念を押されたので、若干大変でした。)次に、立て看板と窓に案内用の張り紙をして、会場周辺の準備完了。(ここで大体12時頃)
受付
12:00頃から、2人ずつ、前半30分・後半30分の二手に分かれて、片方受付、もう片方は昼食といった形で受付開始。自分は前半受付をしていましたが、どうやら後半30分に来場者が集中した模様?
本番
我々はチーム1で参戦。まずサーバーの脆弱性を探すため、試合開始10分はApacheを立ち上げず、ファイルごとの権限のチェック、および公開されるwebページのphpコードを確認。パスワードのハッシュ値を格納しているファイルが誰でも読み取れるようになっていたり、その他重要なデータも丸見えな状態でかなりガバガバだったので、見つけて即座に修正。
次にサーバーを立ち上げて、実際に攻撃状況を見つつ防衛開始。maintenanceのSLAポイントが入らないなと思ったら、手動でメンテナンス用ページのphpにあるコメントアウトを解除して、入力結果が表示できるようにしなければならなかった。また、途中でサーバーのデータが全削除されて「終わった・・・」と思ったが、チームメンバーの一人が全データのバックアップを取ってくれていたので復活。(本当にありがとうございます・・・!)
まとめ
最終的には攻撃を受けてポイントを奪われたりで、10チーム中8位という結果になってしまいましたが、なかなか楽しいイベントでした。機会があればまたやってみたいイベントではあります。・・・が、問題作成・会場設営ともに準備に手間がかかってしまうので、そう頻繁に開催できそうなイベントでもないのが現実という・・・
最後に、今回協力してくださった九州工業大学のSILGの方々、ありがとうございました。また機会があれば、その時はよろしくお願いします。
SECCON2016オンライン予選参加記
お久しぶりです。
今回、チーム FIT-HACKのメンバーとしてSECCON2016オンライン予選に参加してきました。チームとしての順位は62位でした(なお私はほとんどフラグ入力をしていない模様)。
Vegenere
ヴェジュネル暗号によって暗号化された文字列と、平文の一部(フラグフォーマット部分)、およびヴィジュネル方陣が渡され、そこから完全な平文に復号する問題。
とりあえず手作業で一文字ずつ、平文と暗号文を照らし合わせてKeyを探っていくと、8文字目(VEGENERE)まではKeyが特定できた。が、それと同時に、メンバーが先にフラグを入力したようだったので、ここで作業中断。
VoIP
何やらpcapファイルが渡された。何をキャプチャしたのか初めはわからなかったが、問題タイトルからVoIP(IP電話)のキャプチャファイルと推測。
Wiresharkの電話タブから、pcapファイルの音声を復元したところ、1文字ずつフラグを読み上げていた。
若干聞き取りづらいな・・・と思いながら解読作業を進めていたところ、メンバーが先に解読完了、またも作業中断。
Cheer msg
指定されたIPに接続してみると、こんなメッセージが。
どうやら、最初にメッセージの長さを、次に本文、最後にユーザ名(?)を求められている模様。
以前に同じような問題を見たような気がするのでそのWriteupを参考に応用すれば解けるのではと思ったが、そのうえで重要となるプログラムのメモリアドレスを特定することができず。
途中でタイプミスして、メッセージ長の指定に負数が使えてしまったのは、何かヒントになったのだろうか・・・
PNG over Telegraph
youtubeへのリンクで、3本の棒が一定の形になるように動く動画が渡された。
手旗信号のようなものだろうと思ってしばらく見ていたが、チームメンバーがちょうど形が一致するような信号の画像を発見。ほぼ1秒間隔で機械の動きが止まっていたので、そこを狙って動画を止めて、対応する文字をメモし・・・
を繰り返す予定だったが、動画時間が51分あり、作業を継続すると大幅なタイムロスになると判断し、一旦別の問題に移った。
単純作業が長く続くことが予想されるからか、Twitter等でも大分批判を受けていたようである。
ropsynth
配布ファイルを解凍し、とりあえずropsynth.pyを開いた。
それから、「サーバーから渡されるbase64コードをデコードすればいいのかな?」と思い、Pythonでコードを書いて実行してみたが、別にそう簡単にいくはずもなく。別のソースコードやバイナリファイルを読みながら解法を探ってみたが、今の私の力ではどうすればいいのか・・・
Backpacker's Capricious Cipher
暗号化のプログラムがRubyで渡され、とりあえずどんな処理をしているのか探ってみる。
分かったのは、このプログラムではpub_key.txt,priv_key.txt,enc.txtの3つを生成することと、pub_keyはpriv_keyを元に生成されることの二つ。
とりあえずpriv_keyを乱数によって生成して、問題のプログラムと同じアルゴリズムを用いて仮のpub_keyを生成し、元のpub_keyと比較した結果が等しければpriv_keyを出力するプログラムを組んでみたはいいものの、演算時間が足りずタイムアップ。
アルゴリズムの見直しもかねて、時間のある時にまた演算させてみようと思う。
まとめ
去年はSECCONオンライン予選に1人で参加して轟沈してきたので、今回こそは活躍したかったのだが、そうはいかなかった。フラグ入力の遅れについては、先に解法を見つけた人に解析を任せ、その間に別の問題を解いていくスタイルで今後改善していこうと思う。
余談だが、今回のイベントから、チーム内で試験的にTrelloを導入した。感想としては、CTFをやっていく中でもこれはなかなか有用なツールだった。リアルタイムに問題ごとの進捗状況の共有ができるのは非常に有り難い。
SECCON2016 大阪大会参加記
お久しぶりです。先日、SECCON2016の大阪大会に、チーム346として参加してきました。今更ながらその参加記録を書いておこうと思います。
今回の大会のテーマはバイナリ解析ということで、事前にバイナリ関係の本などを読み漁りつつ勉強してきたのですが、我々のチームでの結果は良かったといえるものではなく、非常に残念な結果になってしまいました。
問題内容としては、
・サーバーのポート4つ(問題ごとに一つずつ)開いている
・アクセスすると、それぞれから問題のバイナリが配布される
→二種類の問題と、二種類の難易度がある
→EasyとHard、Easyは5分ごとに、Hardは1秒ごとに問題が更新される
・問題ごとのExploitコードを解析し、それをBase64でエンコードしたものを投げる
→フラグ獲得
といった流れでした。
大会の公式アナウンスや今回の問題から、angrによるバイナリ解析の自動化が高得点のカギとなっていたようでしたが、それ以前に手動でのバイナリ解析すらおぼつかず・・・
問題の難易度は(自分にとっては)高く、手も足も出ませんでしたが、自分の実力を知る良い機会にはなったと思います。
それと、チームメンバーに後輩を2人ほど混ぜてましたが、彼らも途中で諦めたりすることなく問題と向き合っていて、「こいつらは今後絶対伸びるな・・・」と感心する面もありました。
ブログコンセプト変更のお知らせ
突然ですが、ブログのコンセプトを変更します。
CTFのWriteupを載せていくブログにする予定でしたが、
「外部での勉強会に参加してきた記録も載せていたほうが自分のためにもなる」というアドバイスを知人から頂きましたので、
今後は勉強会に参加した感想などについてもこのブログで取り扱っていきたいと思います。
IceCTF2016
お久しぶりです。
今回は、IceCTFというCTFの解法を載せていきたいと思います。
Stage1
(1)Hello World!
おなじみの、問題文にあるフラグをフォームに入力し、CTFでの回答方法を確認する問題。(英語が読めればそれでOK。)
A.IceCTF{h3l10_wr0ld}
(2)Spotlight
指定されたページに飛ぶと、マウスカーソルに追従して一部だけ灰色の背景が見えるようなwebアプリが動く。
問題文にある通り、全体をくまなく探しても、フラグは見つからない。
そこで、このページのソースコードを見てみる。
何やら、13行目が怪しいな・・・
見たところ、このアプリケーションのソースコードはspotlight.jsというファイルとしてアップロードされ、実行されているようである。
そこで今度は、このspotlight.jsというファイルがサイトに無いか確認。
発見。
少し長いが、このソースコードを読むと、フラグが見つかった。
それがこれだ。
A. IceCTF{5tup1d_d3v5_w1th_th31r_1095}
(3)All your Base belong to us
リンク先であるflag.txtを読むと、0と1が8桁ずつ、スペースと改行で区切られている文字列が与えられる。
0と1だけということは2進数、そして2進数8桁を変換して、文字列が得られると考えると、このテキストファイルの中身はASCIIコードなのでは?と推測できる。
ということで、今回は以下のサイトを使って変換してみる。
このツールの使い方だが、まず「変換ツール」のプルダウンメニューから、入力するデータの形式を選択する。(今回の場合は「2進数」を選ぶ。)
データの形式の選択とデータの入力が終わったら、
左下の「ASCII→文字列変換」をクリックする。
ただし、このサイトでは2進数8桁ごとに「スペースで」区切らねばならない。先ほどのファイルをそのままコピペして使うと、スペースではなく改行を入れている箇所がいくつかあるので、それをスペースに置き換える作業が必要になる。
では、以上の作業を、先ほどの2進数データに適用してみよう。
変換後のテキストボックスに、フラグが出現した。これがそのまま答えである。
A.IceCTF{al1_my_bases_are_yours_and_all_y0ur_bases_are_mine}
(4)Rotated!
問題文をざっくりと読むと、ROTだけ強調されているのが少し気になる。ROTとは、このブログで何度も扱ってきたシーザー暗号のようなもので、ズラす文字数が3文字とは限らない。
では、問題文をしっかり見ていこう。
5文字ズラした後8文字ズラした、とある。つまり、フラグとなる文字列「VprPGS{jnvg_bar_cyhf_1_vf_3?}」を、13文字ズラせばいいということになる。
では、いつものあのサイトを使って復号していこう。
さて、復号した結果がこれである。
あとはコレの「ICECTF」を「IceCTF」に、他の部分についてはすべて小文字に変更し、数字も問題文そのままのもの(1と3)に戻せば、答えとなる。
A.IceCTF{wait_one_plus_1_is_3?}
ちょっと雑談
どうも、アレイドです。
最近、Win10のAnniversary updateが配信され、windowsでもbashが使えるようになりました。
これは、いろいろな事情でPCに仮想環境が入れられなかったり、Linux等のデュアルブートにはなかなか手を出しづらい、という方にとって、少し嬉しいお知らせではないでしょうか。
bashを使えるようにする方法は、他のサイトのほうでも載せてる方がいらっしゃいますので、そちらを参考にしてください。
ただし、まだbeta版ということもあり、いくつか不具合もあります。
今のところ私が確認したものは、
・JISコードに対応してない(日本語は一部文字化けします。)
・一部ネットワークコマンドが使えない
といったところです。
デフォルトでも一部を除いて正常にLinuxコマンドが実行できますが、パッケージを別途インストールすることも可能なようです。
ただし、ディストリビューションはUbuntuという扱いになっているので、
「yum」等ではなく「apt-get」を使いましょう。また、「sudo」を頭につけることをお忘れなく。
HSCTF3 WriteUp
(2) There's Always One
変な文字列だが、英字しかない。ヒントの欄を見ると、後期のローマ人の男性が作った暗号、とある。ローマ人の男性が作った暗号といえば、カエサル(Caesar)のシーザー暗号が有名だろうか。
ということで、以前も紹介したシーザー暗号の解読サイトを用いて文字列を解読してみる。
暗号生成ツール - 暗号くん ←暗号解読のサイト
↓10文字ずらしたところで・・・
と、このように文章が完成する。
珍しく今回はフラグフォーマットが存在しないうえに、大文字と小文字の区別もしていないようなので、このままで正解である。
A.token_caesar_cipher_problem
(Q2.終了)
(3)Login 1
問題文のリンク先に飛ぶと、ログイン用のフォームが表示される。
とりあえずソースコードを確認してみる。
これを表示したところで、お気づきの方もいるだろう。
このサイトは、文字列を平文のまま送信し、if文によってログインの可否を判別している。
もっと簡単に言うと、なんとHTMLを見るとIDもパスワードも丸見えなのである。
ということで、ここで出たIDとパスワードを入力してログインしてみると、
このように、フラグが表示される。
A.super_secure_javascript_login
(Q3.終了)