SECCONを専門じゃない人に紹介してみる

ちょっと気分転換もかねて、難しいことをわかりやすく?話す練習。

SECCONとは

きっとSecurytyContestの略。ようはハッキングからみんなを守る人材を発掘するべく、競技会をやりましょう。っていう催しです。
総務省後援で、国内のいろんな企業もスポーンサーになっている(http://2013.seccon.jp/sponsor.html)かなり規模のでかいイベントです。
競技会がなんで人材発掘になるの?どんな競技なの??ってのはこのあと。。。

競技について

とりあえず一言「ハッキング」と言ってましたが、もうちょい詳しく。。。
 
全国大会では、

「このパソコン好きにしていいから、以下の3つのことを達成しろ」

的な問題が(ヒントといっしょに)出ます。

といっても渡されるのはパソコン本体じゃなくネット上のアドレスなので、各チーム、ネット経由で攻略することになります。

そこで僕らは主に、以下の3つのことを目指します。

1) パソコン上隠された情報を盗み出す。
やり方はいろいろですが、パスワードで守られたページを無理やり開くとか、HPに公開してないファイルをダウンロードするとか、そういうことをやります。
僕達はそのパソコンを直接操作できないし、IDもパスワードも知らないので、ネット経由で何とか侵入して、ドロボーするのです。
ドロボーした情報の価値に応じて、ポイントが入ります。

2)自分たちの足跡を書き込む
普通おけない場所にファイルを置いたり、HPを書き換えたりして、「俺達このサーバー自由に操れるんだぜ」アピールをします。アピールするためには、ほんとに操れないといけないので、頑張って乗っ取ります。
足あとが残っていた時間と比例して得点が入りますが、他チームも足跡を残していたら、得点は折半です。

3)他のチームの邪魔をしろ
他のチームの足跡を消したり、自分たちが入ってきた穴(バグ)を修理してしまったり、果ては他チームの人がログインしてきた瞬間に無理やりログアウトさせたり、問題のパソコンの電源を落としたり(!)して、相手チームを妨害します。でも相手チームも邪魔してくるので、ここはもう戦争です。
(ここが一番競技っぽいですねw)
邪魔しても得点は入りませんが、他チームが1や2を達成できなくなる&2で特典を折半せず独り占めできる ので、結果的に順位が上がります。

一言でまとめると
「1番に乗っ取って、可能な限り他チームから守れ」
ですね。

攻撃も防御も両方できないと高得点が得られないので、なかなかシビアな競技です。

どうやって攻撃するの?
どうやって防御するの?

みたいな話は、ちょっとまだうまく説明できないので、おいおい。

SECCON 2013 Final WriteUP(2.kaku and hanoi.tower)

できたことより出来なかった事のほうが多いけれど。。。

2.taku

つーてんかく。

問題把握まで

問題サーバ上で動いているプログラムの実行ファイルとソースコード、そして設定ファイルが渡される。

正直、最初何をすればよいのかわからなかった。
とりあえずソースを読む。
 
ざっと見、子プロを立ててその中で任意のコードを実行できるプログラムらしかった。
また、設定ファイルは確かxinedの設定がこんなだったはず(うろ覚え)

つまり、「サーバ上でこのプログラムが動いているから、任意のコードを実行してFlagをとってみろ。」ってことじゃね?と思い至る。

ここまでで1時間以上費やしている。
おそらく、他チームは初見でこの結論に至っていたのではないだろうか。
経験値不足が悔やまれる。

シェルコード調達

んで、とにかくシェルコードを用意して実行してみよう。という段階に。
実行ファイルが x86-ELFだったので、多分サーバもx86なんだろうと想像。
 
xinetdでうまく動かす自信がなかったので、ローカルで動くテストプログラムを書いて、動くであろうシェルコードの準備をした。

・・・つっても書いたんじゃなくてググったんですけどね。

スクリプトキディには辛いぜと思いながら、shellを実行するshellcode(なんか若いヤングマンみたいな表現ですいません)を入手、ローカルで実行に成功。

サーバに投げてみるが、プロンプトが返ってこない。
が、コピペで送ってるので原因解析なんてできるわけがない。

仕方ないので、1からまじめに勉強して徹夜で考えよう。と結論づけ、他の問題に着手。

この時点で日は傾きつつあり、諦めた直後に新問題が開放される。
(すでにチームはビリから2番め)

夜のお勉強

競技終了後、他のチームメンバーの助言も踏まえてシェルコードを自分で書いてみた。
といってもこれもかなりよそからのパクリなのだが。。。

global _start

section .text
_start:

; PUSH the first null dword
xor eax, eax
push eax


push 0x736c2f6e
push 0x69622f2f

mov ebx, esp ;ebx points to the //bin/ls


mov edx, eax ;mov 0 into eax

;create the arguments array argument for ls
push eax ;push 0 onto the stack
push 0x6c
push 0x6d74682f
push 0x7777772f
push 0x7261762f ;push -l onto the stack
mov esi,esp ;mov the address of the top of the stack into esi

;prepare the argurments array for execution
push eax
push esi ;address of where our arguments are
push ebx ;address of where //bin/ls is
mov ecx, esp
mov al, 11
int 0x80

あまり深く考えたわけではないが、shから別コマンドを呼ぼうとしていたことが行けなかったのではないかと考え、lsと、catを実行できるようなコードにした。
結果これは正しかった(子プロからのforkが禁止されていたので)

上記の通り、sysexecve (http://man7.org/linux/man-pages/man2/execve.2.html)にパスと引数を食わせて動かすプログラムを用意。
ここまでやって3時を回っていたので、2日目の思考力を保つために仮眠。
(自宅から会場が遠いので6時前に起きる必要があったのです)

stage0 攻略

朝イチ、昨夜書いたコードを投入。
見事最初のフラグの取得に成功。
とりあえずチーム内の人権は獲得したが、もはやチーム自体が最下位なので、チームごとミジンコレベルの存在になりつつあった。

stage1

次のステージ。
isalnumでシェルコードがフィルタされるので、英数しか使えない。
 
metasploitの msfencode コマンドを使えばできるらしいことは知っていた。
しかし使うのは初めて。使い方をググって調べてみたのだが、おかしい。

msfencode -e x86/alpha_mixed -b '\x00' -i ./lscode.bin -t c
[*] x86/alpha_mixed succeeded with size 130 (iteration=1)

unsigned char buf[] =
"\x89\xe6\xda\xc7\xd9\x76\xf4\x5f\x57\x59\x49\x49\x49\x49\x49"
"\x49\x49\x49\x49\x49\x43\x43\x43\x43\x43\x43\x37\x51\x5a\x6a"
"\x41\x58\x50\x30\x41\x30\x41\x6b\x41\x41\x51\x32\x41\x42\x32"
"\x42\x42\x30\x42\x42\x41\x42\x58\x50\x38\x41\x42\x75\x4a\x49"
"\x70\x31\x59\x50\x70\x50\x65\x38\x50\x6e\x66\x4f\x72\x4c\x51"
"\x63\x61\x78\x36\x4f\x54\x6f\x32\x42\x35\x39\x6d\x59\x38\x63"
"\x6e\x69\x39\x52\x46\x30\x71\x78\x46\x4d\x30\x6c\x45\x50\x73"
"\x30\x6d\x59\x4b\x56\x72\x70\x53\x66\x63\x63\x6c\x49\x39\x71"
"\x78\x30\x66\x6b\x7a\x6d\x4d\x50\x41\x41";

どう見ても出力に 英数字以外を含んでいる。
(最初の7バイト)

きっと使い方が違うか、オプションが間違っているのだろうと調べてみたものの、わからず時間切れ。

他チームのwrite-upを見ると

alpha_mixedエンコーダは シェルコードのアドレスが入ったレジスタを指定しないとシェルコードの全てが英数字にならない。
シェルコードへのアドレスがEAXに残っているので、
msf> set BufferRegister EAX
msf> generate -e x86/alpha_mixed

(team 0x0 http://labs.scaltinof.net/memo2/seccon2013-writeup より引用)

とのこと。
今あらためてググっても出てこない/(^o^)\ 
ツールとかは普段から使えるようになってないとダメってことですね。
 
さらには

Metasploitにできて俺にできないわけがない
て事で自分で書いた

(Team Epshiron Delta http://epsilondelta.hatenablog.jp/entry/2014/03/05/213632 よr引用)
 
もうかっこいいとしか言いようが無い。
書くのなんて最初から諦めたわけで、その時点で意識が違いすぎました。
 

のこりのstage

ちなみに、stage2は、アセンブラ短歌。
stage3は、他チームとの妨害合戦(フィルタに任意の値を指定可能)だったようで。
どのみち、スクリプトキディな私にはstage1を超えても次は超えられなかったように思えます。
 
結論 使えなきゃダメ。書けなきゃダメ。

hanoi

ハノイの塔。
WEB系は苦手なのだが、うまい具合にflagが1つとれてしまい担当に。

1つめのフラグ

ファイル内容を表示するphpがあったので、そのphpソースコード自体を表示させてみた。
ファイルのアクセスキーがファイル名のMD5なのはチームメンバが初見で見破ってくれた。
ちなみにおれはMD5なんじゃねーのと思いつつ、末尾の改行文字を取り忘れてコケていた。アホ。
神様の確認結果: cat -n "filename" | md5sum
アホの確認結果: cat "filename" | md5sum

で、表示できるファイルが4つあることが判明。
4つ目のファイル(トップページを表示するphp)にキーワードが。
 

2つめのフラグどこだ

 
トップページの画像末尾に、dnsの問い合わせクエリが隠されていた。
オンライン予選と一緒じゃねーかと逆引きクエリを送ってみると
hanoi.
としか返ってこない。
ここで詰んだ。
 

実際の答え

 
公開された問題サーバは xxx.xxx.xxx.1
隠されていたDNSサーバは xxx.xxx.xxx.3
 
そして、stage2以降の問題は xxx.xxx.xxx.2
にあったらしい。

1と3がある時点で、2もいることを想像するのがハッカーらしい。
うーん経験不足。

そこから先はファイルに情報隠している問題だったようで、うまく行けば解けた可能性もあり、とても悔しい。
 
相手を「標的ネットワーク」という立体的な存在ではなく、「問題サーバとDNS」という2点で捉えていたことが敗因だと思う。
実際何かしようと思ったら、ほかに脆弱なホストがないか探すのが筋なわけで、それができなかったのはもう反省しか無い。
現場力不足。
 
 
ちなみに、他メンバーが担当した korin についても同じことが言える。
反射型XSS自体は知識としてあったのに、それを使う発想に至れなかった。
懇親会で言われてやっちまったと思いました。

総論

前に感想を書いたけど、いい経験になりました。
本業がセキュリティじゃないので、防御も攻撃も現場ではほとんど経験することがなく、まだまだガッコのオベンキョれべるにとどまっているな〜ということを痛感させられました。
 
足りないことだらけですが、足りないことすら見えてなかった参加前よりは進歩したってことで、基礎から出直します。

SECCON 2013 WriteUp まとめ

自分で書けるネタが少ないので。。。
見つけたら随時追加。

チームで分類します。

        • 3/8 追加 ----

Epsilon Delta
http://epsilondelta.hatenablog.jp/entry/2014/03/05/213632

???
http://inaz2.hatenablog.com/entry/2014/03/06/160415

        • 3/5 ----

0x0
http://labs.scaltinof.net/memo2/seccon2013-writeup
http://d.hatena.ne.jp/waidotto/20140303


urandom
http://aquarite.info/2014/03/seccon-ctf-2013-final/


よめない(********)
http://yagihashoo.com/archives/631


dodododo
http://akiym.hateblo.jp/entry/2014/03/04/172235


Takedashi
http://math314.hateblo.jp/entry/2014/03/03/210318


?
http://d.hatena.ne.jp/kusano_k/touch/20140302/1393776401


?
http://tech.aquarite.info/blog/2014/03/04/seccon-2013-final-druaga/
http://tech.aquarite.info/blog/2014/03/04/seccon-2013-final-auto-flagword/
http://tech.aquarite.info/blog/2014/03/04/seccon-2013-final-pisa/

SECON2013 全国大会 結果と課題のメモ

korin
 見当つかず・・・WriteUp待ち
 課題:WriteUp待ち
 
2.kaku
 シェルコードを実行できる箱庭環境。
 ステージ0 制限なし。 クリア
 ステージ1 isalnumを通過することが条件。 死亡
 ステージ2 不明
 ステージ3 不明(フォルダ構造探った限りここがラスト)
 
 フラグ:シェルコードで設置できないか試すが権限的に無理そうだった。
     きっと別の脆弱性があるはず。あるいは権限昇格?
     
 課題:つぶしの効くアセンブリング力
 

hanoi
 1つ目のキーワード入手。
 2つ目で詰む。
 DNSの問い合わせクエリが画像に隠蔽されていたが、そこから着想を得られなかった。
 実際はターゲットサーバーが3つあったらしい。
 → 192.168.1.1と1.3があった時点で、2もあると想像すべき??
 
 課題:総合的な分析力?
 
 
バベル
 format String脆弱性があることまでは気づいたが、突破できず。
 
 やった人たちの話
  /tmpにbusyboxを投下して呼び出し
  さらにsetuid。
  自分が置いたらパーミッション変えて封鎖
 
ドルアーガ
 組み込み系のROMを展開
 ン万枚の画像を文字認識→アセンブラとして実行→結果を評価 っていうのを早々にする必要があった。
 
ピサ
 XSS脆弱性
 他チームの妨害が死ぬほどってか死んだ
 CPAPCHAを解析する必要があったらしい??
 
 課題:HTML、Javascript
 
 
アセンブラかるた
 チャレンジせず。
 
 課題:目Grep力。バイナリアン
 
 
宿題
 ・unicode-proof (a-z,A-Z,0-9のみ)でshellcode書く
 ・formatStrings脆弱性を叩ける解析力
 
 ・armの実行環境
 ・任意のビット列を任意のポートから任意の宛先に送れるツール
 ・具体的な攻撃、防御手段をテンプレ化する

個人的、セキュコンの意義

うまくまとめられない気がするけど、今のうちに書いておきたい。
主にスタッフとスポンサーの方に伝えたいこと。
あと、俺個人の思いと決意。



まず、結論から言うと、我々のチームは最下位でした。
正直、手も足も出ませんでした。



でも、自信を持って言えるのは SECCON全国大会に出場できてよかったということです。


正直に言うと、最近の俺は現状に甘んじて、鍛錬を怠り始めた、ありがちな中だるみエンジニアでした。
会社ではそこそこなんとか仕事をこなせて、とりあえずスキルレベルも下の方ではない(と思っている)。
日常生活レベルでは、そこまで必死で勉強したりしなくても、なんとかなってしまう。
SECCONに出ていなかったら、きっとそれで向上心を失って、数年後に後悔していたパターンだったと思います。



でも今回、「俺、それなりにできる方じゃね?」という過信を粉々に打ち砕かれ、危機感を得られました。



これから行動しなかったら同じなんだけど、とりあえずきっかけを得られたことは、
俺の人生においてすごく大きな収穫だったんじゃないかという気がしています。



出来る人達(=上位チームの人達)にとってのSECCONの意義は正直わからない。
楽勝だったのか、勉強になったのか、あるいは俺に想像もつかないような意義を見出しているのか。



ただ、できなかったチームなりに感じたこととして、自信を持って断言できることがあります。



「昔燃えていたのに、いま現状に甘んじてくすぶっている、アラサーエンジニア。
 そういう連中を再び燃え上がらせるためには、SECCONはすごくいい。」


実際俺は社会人になってから一番燃えたし、悔しくてこれから取り戻そうと思った。
あと、後輩に同じような轍を踏ませないように、育て方教え方を考えなおすことにした。
今具体的にはうまくまとめられないけれど、必ずやる。



実はこれって、SECCONの意義、日本のICT技術力の向上って意味ではすごく意味あることな気がしました。



すごく失礼な言い方だけれど、今は飛ぶ鳥を落とす勢いで成長している上位チームの学生さんたち、
社会人になって、いろいろあってからも、今のモチベーションを維持できるのだろうか。
(もちろん、俺とはレベルが違うから、できるのかもしれない。でも、俺みたくくすぶってしまう奴もいると思う)



もし、そういう連中すべてを再び燃え上がらせたら、(あるいは、燃え上がらせ続けられたら)
今よりもっとすごい世界が拓けるんじゃないだろうか。
それなりの素地があって、その素地を活かして後輩をそれなりに指導して育成している、中堅なりかけエンジニア層。
ここがレベルアップしたら、育て方もレベルアップして、後輩もレベルアップする。
それってすごい世界だと思います。



・・・



もう一つ別の角度で話す。
今思い返すと、自分は学生時代も中途半端だった。
でもその理由の一つとして、トップレベルを見られなかったことがあると思う。
すごく言い訳の責任転嫁ですが、 私は、ぎりぎりセキュリティ・キャンプに参加できなかった世代です。
だからってアンテナ立てれば情報はいくらでも入ってくるし、実際そうやってのし上がった同世代もちゃんといると思う。
だからこれは言い訳でしか無いんだけれど、そういう、アンテナを立てきれなかった奴らに燃料を投下できたら、
きっと、投下しないよりもいい結果が生まれると思う。
何がきっかけで変わるかはわからない。なら、きっかけは多いほうがいい。
そのきっかけの一つは、「こいつらやべえ。でも追い付きたい」と思える目標を見せることだと思う。
SECCONに出るような連中にとっては、上位チームこそ、その目標になり得る。
でも、俺が学生時代の頃は、SECCONはなかった(あるいは、俺の耳に届かなかった)し、目標も見つけられなかった。
たらればでしか無いけど、昨日今日の経験を20歳でしていたら・・・という思いは(不毛だし無意味だけど)少なからずある。
将来性のあるエンジニアの卵達が、ちゃんと孵化するためのプロセス、目標を見つけられる、そんな環境づくりとしても、
SECCONは有意義だと思った。




1ミリもWriteUPになってないけれど、今じゃないと書けなそうな思いがあったので、
残しておくことにしました。




スポンサー、スタッフ、後援の皆さんにぜひとも伝えたい思いです。
長くなって、うまくまとまってない気がするので、最後に一番言いたいことだけ。


「SECCON すごくいいっす。 俺たちエンジニア一丸となって、来年と言わず、来世紀まで続くイベントにしましょう。」



まずはスタッフか、参加者か、参加者集める側か、どんな形かわからないけど、できることから協力します。
そして将来、攻殻機動隊みたく、電脳ハックが現実化する時代になったら、俺、喜んで課題人間(?)に志願します。
んで、俺に侵入できなくて凹んでる最下位チームに向かって、「いいぞ。その悔しさをバネに来年帰って来い」なんてエールを贈る老後を過ごしたいです。
すげー妄想ですけど、30近くにもなった男を、ここまで熱くしてくれた。
そんだけ、SECCONには力があったってことです。


最後になりましたが、 ここまですごい経験をくださった大会関係者の皆様。
ありがとうございました。


あと、直接も言いたいけど、きっと色々思うことあっただろうに、
笑顔で俺たち4人を送り出してくれた5人目のチームメイト。
ほんとありがとう。


明日朝起きて忘れてしまうこともありそうなので、以上 自分への覚書。

レジスタの種類

  • EAX

計算用。関数の戻り値格納

  • EDX

EAXの拡張。乗算、除算

  • ECX

カウンタ。ループ処理

  • ESI

ソースインデクス。入力データ。

  • EDI

デスティネーションインデクス。出力データ

  • ESP

スタックポインタ。スタックの先頭。

ベーシスポインタ。スタックの最下部。

  • EBX

なんでもあり。