オイオイオイ書くわアイツ

ほうクソブログですか……たいしたものですね

SECCONに参加しました。(Write Upその他)

はじめに

今年のSECCONに参加させていただきました。
まだまだ自分の技術力や知識が不足していることもあり、結果は誇れるようなものではありませんでしたが、自分の現状を評価する意味でも拙いながらwrite upを書くことに致しました。
CTF初心者として参加したSECCONということで、これからCTFを始めようと思っている人の参考になれば幸いです。

参加の経緯

二月ほど前、高校の同期がCTF for beginnersに参加した話を聞き、その時にCTFに興味を持ち、始めました。
しばらくCTFの勉強をしていたところ、大学の先輩から「SECCONというCTFの大会があるから参加してみないか」と誘われ、参加した次第です!!

SECCON・CTFとは

CTFとはCapture The Flagという競技のことで、主にセキュリティ面での情報技術を競います。 形式としては、以下の様なものがあるらしい。

  • 攻防戦型
    チーム毎にコンピュータが割り当てられ、自チームのコンピュータを守りつつ敵チームのコンピュータをハックしフラッグを手に入れる。
  • クイズ型
    問題を解き、フラッグを見つけ出す。

今現在CTFは、コーディング技術を競う競技プログラミング、Webアプリケーション高速化のISUCON、そして随分一般的になったハッカソンなどと並んで有名な情報系技術競技ではないでしょうか。
今回参加したSECCONは日本で行われるCTFの大会です。中でも、そのオンライン予選に参加しました。

Write up

今回解けた問題は次の3問のみでした。

  • Steganography 1
  • Steganography 3
  • 4042 (こちらは解けたものの時間切れ)

全体として簡単な問題しか解くことができず、実力不足を痛感しました。  

Steganography 1

この問題はCTFの中でもSteganoと呼ばれるジャンルの問題です。
一見すると変哲も無い画像ファイルですが、然るべき手順を踏むことで情報が浮かび上がる、というような問題が多いようです。
今回解析する画像ファイルはこちら。

f:id:Tak_Yaz:20151206171500p:plain

はい。
ただのGIF画像っぽいです。
手に入れるフラッグはSECCON{hogehoge}の形で与えられるので、それの頭の部分という感じでしょうか。
とりあえず情報を見てみましょう。

f:id:Tak_Yaz:20151206171722p:plain

8MB。言うまでもなく、内容に比して異様な重さです。
このことから、この画像ファイルには現在表示されている以上の情報が含まれているのではないか、と考えられます。
とりあえず、バイナリエディタで開いてみましょう。

f:id:Tak_Yaz:20151206172106p:plain

ASCII表示したバイナリ文字列の中にPNGという文字列があるのがわかるでしょうか。
PNG形式のファイルは16進数の"504E47"というバイナリ(すなわち、ASCIIでPNG)から始まることになっています。
どうやら、このファイルには他にもPNGなどの画像ファイルが埋め込まれていそうです。
そこで、いったん仮想環境のKaliにファイルを移して、Bin walkというツールで解析をしました。

f:id:Tak_Yaz:20151206172813p:plain

様々な形式の画像がこのファイルに埋め込まれていることがわかります。
あとは、ddコマンドを用いて各ファイルをコピーしてあげると、次のようにフラッグを示す画像群を得ることが出来ました。

f:id:Tak_Yaz:20151206173252p:plain

Steganography 3

この問題の画像ファイルはこちら。

f:id:Tak_Yaz:20151206173342p:plain

唐突にバイナリファイルです。とりあえずバイナリエディタで眺めてみますが、他のファイルが埋め込まれたりはしていなさそう。
そこで、画像内で開かれているページを検索してみると、どうやら「0000 + 0000 = 8888」みたいなクイズについてのページでした。
数字にある丸の数がどうの、というやつですね。
さらに、右下にはペイントが開かれています。なので、とりあえず塗ります。

f:id:Tak_Yaz:20151206173742p:plain

できちゃいましたね。以上です。

4042

2005年の古代遺跡から謎の暗号が発見されました。解いてね。

というような問題とともに、やたら長いテキストファイルが渡されます。テキストファイルには数字がずっと並んでいました。
(ファイルは本稿の最後に載せておきます。)

流石に意味がわからないので、ファイル名のno networkと問題名4042、さらに2005で検索をすると、RFC4042という仕様書がヒットします。

https://www.ietf.org/rfc/rfc4042.txt

調べた所、これは2005年のエイプリルフールに作られたもので、UTF-8にかわるUTF-9という文字コードを提案した内容になっています。
UTF-9という名前から分かるように、9bitを一塊として送るという意味の分からない仕様になっています。
上の仕様書を読めば分かっていただけると思いますが、ざっくりというと、

  1. UTF-8のコードポイントをビット列にして、8bit毎に分ける。
  2. 先頭のビットは継続フラグとし、コードポイントが8bitで収まらない場合、すなわち次の8bitと繋がっているときは1にする。

これを元に、UTF-9データ列を通常のunicodeのコードポイントに変換するプログラムを書きます。

int in(char *input) {
  int len = strlen(input);
  int seq_flag;
  int x = 0;
  for(int j = 0; j < len/3; j++){
    int buf = 0;
    for (int i = 0; i < 3; i++) {
      buf += input[i + 3*j] - '0';
      if(i < 3 - 1){
        buf <<= 3;
      }else{
        seq_flag = buf&256;
        buf = buf&255;
      }
    }
    x = x | buf;
    if(seq_flag == 256){
      x = x<<8;
    }
    if(seq_flag != 256){
      printf("%d\n",x);
      x = 0;
    }
  }
  return x;
}

ご覧のとおり、急いで書いたのとビット操作に慣れていないのもあって随分と汚いコードになってしまいました。
このプログラムに与えられたテキストファイルを渡して、得られたコードポイントを元にunicodeに直すと次のような文章が得られます。

Ꮮⲟrеⅿ ірѕ∪ⅿ ⅾοⅼοr ѕіt ɑⅿеt, сഠᥒѕᥱсtеtᥙr ɑԁⅰрⅰѕіⅽⅰᥒɡ еⅼіt,
ѕеԁ ⅾо ᥱіᥙѕⅿഠⅾ tеⅿрⲟr іᥒϲіԁіԁᥙᥒt ᥙt ⅼаbഠrе еt ⅾоⅼഠrᥱ ⅿɑɡᥒɑ ɑⅼіqᥙа.
Ut еᥒіⅿ ɑԁ ⅿіᥒⅰⅿ ⋁ᥱᥒіɑⅿ‚ qᥙіѕ ᥒοѕtrᥙԁ еⅹᥱrϲⅰtɑtіⲟᥒ ᥙⅼⅼɑⅿϲо ⅼаbοrⅰѕ ᥒіѕⅰ ᥙt ɑⅼⅰqᥙⅰр ᥱⲭ ᥱа сοⅿⅿоԁο ⅽഠᥒѕеqᥙаt․ 
ᗪᥙіѕ ɑᥙtе іrᥙrе ⅾഠⅼഠr ⅰᥒ rᥱрrᥱһеᥒԁеrіt іᥒ ⋁οⅼᥙрtɑtе ∨еⅼіt еѕѕᥱ ϲⅰⅼⅼᥙⅿ ԁοⅼοrе еᥙ fᥙɡіɑt ᥒᥙⅼⅼа рɑrⅰаt∪r.
Εⅹϲᥱⲣtеᥙr ѕіᥒt οсϲɑᥱⅽаt ϲ∪ⲣіⅾɑtаt ᥒⲟᥒ ⲣrഠіⅾᥱᥒt,
ѕᥙᥒt ⅰᥒ сᥙⅼра qᥙⅰ оffіⅽіɑ ԁеѕеrᥙᥒt ⅿоⅼⅼⅰt ɑᥒіⅿ іⅾ еѕt ⅼɑbⲟr∪ⅿ․
Τһᥱ fⅼɑɡ ⅰѕ᛬ ЅΕⅭⲤОΝ{Α_ԌᎡⲞUΡˍОᖴ⚊ΝⅠΝΕˍВⅠΤᏚˍⅠᏚ_СᎪⅬⅬᎬⅮˍΝОΝЕΤ﹜ΝᏴ; Ρⅼеɑѕе ѕеᥒⅾ tһе fⅼɑɡ іᥒ ᥒⲟrⅿɑⅼ АᏚϹІⅠ ϲоԁе ︔﹚

……??
なんだかよくわからないけども、文学っぽい感じの某が得られました!
UTF-8への変換プログラムに問題があったのか、若干文字化けしてしまっていますが、flagが得られています。

まとめ

拙いWrite upでしたが、如何でしたでしょうか。

初心者の目線からのSECCONということで、なにか皆様の参考になれれば嬉しい限りです。

問題の解、結果の是非は置いておくとして、今回のSECCONに参加した感想としては、楽しいの一言に尽きます。

尊敬できる先輩方と一緒に問題に取り組み、自分がチームに貢献できた時の喜びは当然の事ながら、出題される問題の範囲が幅広いため参加して問題に取り組むだけで色んな知識を身につけることが出来たと思います。
今回私が解いたような、ちょっとしたナゾナゾのような問題もいくつかあったので、セキュリティのことがわからないよ、という人も楽しみながら勉強できるのではないでしょうか。

逆に心残りなのは、セキュリティに関する問題を解ききれなかった点です。
特にEntry formという問題でPerl脆弱性を理解するところまで行きながらフラッグを得ることが出来なかったのは口惜しい限りです。
これはやはり幅広いプログラミングの経験が必要になってくるので、もっと勉強しなくてはならないな、と感じました。

余談ですが、先輩方が私よりも高度な問題を解きながら「やはりCTFは勉強になる」と仰っていたのが非常に印象的で、先輩方でそうならば、自分はよりいっそう勉強をしなければならないなと痛感します。
同時に、自分も同じように後輩にモチベーションを与えられるような高い能力を持つ先輩になりたいものだと強く思いました。

以上が今回のSECCONの結果です。
非常に良い経験になりましたので、重ね重ね先輩方にお礼を申し上げると共に、CTFをご存知でなかった方にも強くCTFをお勧め致します。

4042のUTF-9データ

423336454237162404065441177440057404126404100404125442052441177240441176403277441 174403277162440006404125404126164440005402121441177404065164777014440000404101415 040431122404125431161404101164404065164431131162440010402121405001441160404100441 160404125404126441175441160431122402141440012404065441174404126164777014440003404 125404065405001440002441176404076240431161404126431131404125441177415040441176240 164404065441177404100454237162440006012404126431122403362404126405001404126405001 431131431122164440006431131164440006441174404060142415040162404065440057404065164 440012441176404076441174415040162431161440000441177402121402141431122402121440007 402121441174404126161431131404060777016440007125164440003404065431122404126441177 440011402121405001440012441177404126431122441160441177440001442301431161431122404 126402121441177440032440012161431131404126404125440005012431122403277404125164162 431131405001440000404065441171431161162403362441160164402121164404126454237431122 440137431131441174441174402121441177403362404076440007441174404060142403277162441 160404125440057431122404126404125441160440137431131164440002402121441174441160161 431131441160404100440137431161454255440012431161404060440006404101403277441177441 177404076405001403277440137441175415040431122404125404065161431131404060164440044 440003012425352431131404126404125440011402121431131164404065240404126162431131162 404065440007441176415040441174415040162440002441160431122240162431161404100162431 161404273404065431122405001404065162404126164440137404126431122440007442301403277 441174431131404100164402121164404065440007442050404065441174404126164440001404065 404125404125431161440001403362441160441174441174431131441177440001405001403277441 174403277162404065440007404065431131440010012146431131402141404126402121164240431 122431131441174441174404060440012404100402121162441160404060164442052162777016440 006403225441171403362431161454243164404065431131162440007404125404126431122164440 005403277404101403362402121431161441175404060164440001403362442052454243404126441 176402121164404060164440005431122454237431122440011454243162415040404126441176431 161431122164777014440005404125431131431122164440007441160431122440011012404101431 131441174404100404060440002161431131441160440011404076146146404126441175404126402 121440007405001404065404125404065162431131431122164440011441177404076441174441174 441160164240402121431122404126441177240404126441176440001404065404125164440010441 174402121142454237162442052441177440044012012403244404273431161240146441174402121 402141440010441160404125426354440000404005403225441155454244404036403235777133403 221777077405014423241454236125403241402315404036425264446212403235441140403235403 225402315404022441140403244423332402315441140423332777077404041423252441154441154 423254441156402315403235404036403235404025403244776134012012403235423364777033240 403241441174404065402121404125404065440010404125404065431122441176440003164404273 404065440004146441174402121402141440003404126431122440011431122454237162441177402 121441174440011404020423332403371404006441140440002403362404076405001404065440010 7760247761320012