SECCON Beginners 広島行ってきた
きっかけ
先日セキュリティ・キャンプに行ってきて、そこで別の選択トラックの人達と話すうちにCTFやっていこうぜ!という機運が高まっていました。詳しくはこちら。
すると、今度SECCON Beginnersが広島という比較的近い(?)ところで開催されるということで、他にも2人ほどTLの人を誘って申し込むことにしました。
(まさか参加できるとは思っていなかった)
イベント開始前
夜行で早朝入りしたため、カラオケに行ったりしていました。広島駅前のネカフェ最高すぎでは?
— しゅういち (@hideh_1231) August 31, 2018
少し開催場所を勘違いしていて遅刻するところでしたが、なんとか間に合いました。
イベント
オリエンテーション
講師関係者の強い自己紹介があり、その後CTFとは?ということで、CTFの概要や法律面のお話がありました。
Crypto
今回がSECCON Beginnersでは初のCrypto講義とのことでした。
内容としては、まずイントロダクションとして
- Cryptoとは?
- 解くために必要なスキル(プログラミング力と数学をやる「気持ち」)
- 暗号の種類
- 暗号に関する用語(復号=平文化なので復号化ではない!)
がありました。講義では、
- 公開鍵暗号の基礎
- RSA
- 暗号全般の話
の3本立てでした。主に前2つが対象でした。
公開鍵暗号の基礎
公開鍵と秘密鍵のお話から始まり、次に暗号化のために必要なmod(剰余)と逆元、また逆元を求めるために必要な拡張ユークリッドやフェルマーの小定理のお話がありました。
やはり拡張ユークリッド難しすぎません???
拡張ユークリッドhttps://t.co/0RRWbKp76M
— しゅういち (@hideh_1231) September 1, 2018
フェルマーの小定理https://t.co/mV56XA8NwQ#ctf4b #seccon
RSA
素因数分解の困難性を根拠にした公開鍵暗号らしいです。開発者の名前の頭文字を取られてこの名前がつけられたらしいですね。
CTFでは最もよく見る暗号アルゴリズムで、現在2048bitが主流だそうです。(700bit程度は解かれたとか言ってはった気がする)
そしてここでは先ほどのお話であった数学を用いて、RSAの鍵生成、暗号化、復号の話がありました。
- 鍵生成
まず素数を2つ(p, q)準備する(これはランダムな素数生成アルゴリズムを使えばいいらしい)。
次にed≡1(mod φ(N=p*q))となるようなeを設定し(φ(N)と互いに素であるようなeが設定され、通常e=65537が多いらしい)(φは、オイラーのφ関数)、そこからdを求める(eの逆元なので、拡張ユークリッドで求める)
こうして秘密鍵(N, e)と公開鍵(d)を得れた(難しい)
- 暗号化・復号
平文を M、暗号文を C とすると、
暗号化: C = Me mod N
復号: M = Cd mod N
となる。平文はもちろん全て数値化してから暗号化する。
ここでどうして復号ができるのかを、フェルマーの定理を使って説明されていたが、何故できるのかいまいちわからなかったです。数学難しい...。 この後演習として簡単な数値を与えられて、それを用いて平文の暗号化・復号を実際に手を動かして計算しました。 やはり、手を動かして実際に流れを見てみることで、少し脳に入りやすくなりました(わかったとは言っていない)。
この後脆弱なRSAのお話があり、例えばランダムな素数の生成時のハッシュが衝突して同じ素数が使い回されていると、そこから計算しやすくなるらしい。 他にもbitが小さければ計算機でぶん回したり、p, qの関係式が導き出せると脆弱性になるらしいです。 他の暗号の紹介も少しありました(DSAはSECCON Beginnersで出たらしいですね)
暗号全般の話
CSPRNGでない暗号生成器は脆弱なので、ツールを使って解ける!みたいなお話がありました。 OpenSSLやPyCrypto、Sageなどがよく使われるらしい。Pythonが標準なんだなって思いました(小並感)。
おわりに
Cryptoは楽しい! 使うところから知識を拡大していこう!
ctfの暗号の勉強は、応用から入っていって、基礎に戻っていくのでって言葉がいろんな分野でも適用されるよなって思った
— しゅういち (@hideh_1231) September 1, 2018
お昼フェーズ
オタクなのでラーメン食べてる pic.twitter.com/YzyKpL3V4B
— しゅういち (@hideh_1231) September 1, 2018
Web
内容としては、
- Introduction
- XSS
- Origin
- CORS (✖︎CROS)
- Conclusion
という構成でした。
まず何を勉強するか、やHTMLやJavaScriptはできますよね?といった煽り、そして現実世界での脆弱性をつくのはダメ絶対といった話がありました。BugBoutyをしましょう。 また、CTFでのWeb問題はブラックボックス問題となりがちなので、実際にリクエストを投げてみようとか、知識と経験が大事()だよねといったお話がありました。
XSSについての話では、Webサイトでページが表示される仕組みと、そこからわかる脆弱性となりやすいところの話から始まりました。要するにHTMLタグをformの入力に入れたらあっ...というやつです(<marquee>が可愛い)。 リクエスト投げた後、ページのソースを見て、実際に確認したりしていました。 こんな感じにformに入力としてタグを与えてXSSすることを反射型XSSというそうですなるほど。 次はここから少し高度になって、JSを使って自分のサーバにflagとなる(=現実世界では個人情報)情報をpostするようなスクリプトをformに入れて、実際に確認したりしました楽しい。
同じドメイン(=オリジン)のものしか情報を引っこ抜けないのが通常で、あるドメインAに脆弱性があったとしても、ドメインB、Cからはアクセスできないと言ったことです。これは後述のCORSでうまくやれるっぽい。
ここで、requestsbinを使って攻撃者サーバを準備し、演習に入りました。実際に情報が得れてとても楽しかったです。 その後軽くCORSの話もありました。HTTP Headerに情報与えると別ドメインからもそのドメインのリソースにアクセスできるっぽい? まとめとして、問題を紹介されました解けるようになりたいです...。
Binary
内容としては、
- はじめに
- プログラム実行の仕組み
- アセンブリ入門
- おわりに
といった構成でした。
はじめに
BinaryやReversingとは?というお話や、Linux系などで使われるELFバイナリの紹介などがありました。
プログラム実行の仕組み
大学の授業であるようなプログラムの実行の仕組みの話から始まり、レジスタの種類のお話(汎用レジスタ、特殊用途のレジスタ)やメモリマップのお話がありました。プログラムそのものを格納するtext領域と、stack領域について主に話していました。
アセンプリ入門(amd64)
アセンブリについての概要と記法のお話がありました。AT&TではなくIntel記法がCTFでは主に使われる模様。
"趣味の問題でintel記法が好きなので"
— しゅういち (@hideh_1231) September 1, 2018
宗教戦争が起きそう#ctf4b #SECCON
Intel記法は、命令 転送先 転送元の順で書くらしいです。
この先、
- 代入命令
- 算術命令
- スタックの利用
- 条件分岐
- 関数
について話がありました。それぞれの話が終わるごとに1つの演習問題がありました。
代入命令
movとlea命令のお話がありました。movではメモリ→メモリはできないので注意です。 leaとmovでは、引数同じ形でも、意味が違うので注意が必要です。leaではlea dst srcでsrcはメモリアドレスだが、メモリに参照品らしいです。メモリアドレス計算のために使うらしいですね。 また、QWORDは8バイトずつ読み込むという意味らしいですね。
算術命令
add、subなどの命令について話がありました。idiv難しすぎでは???
"In 64-bit mode when REX.W is applied, the instruction divides the signed value in RDX:RAX by the source operand. RAX contains a 64-bit quotient; RDX contains a 64-bit remainder."https://t.co/UN9SoE5V3V#ctf4b #SECCON
— しゅういち (@hideh_1231) September 1, 2018
スタックの利用
メモリマップを意識しながら使っていきました。スタック領域はアドレスが低い方に伸びていくという罠があるので注意が必要です。 push、pop、sub、movを使った領域確保などの話がありました。何バイトずつ読み込むかや、16進数であることに気をつけていました。
条件分岐
cmpやtest命令でフラグレジスタを更新し、jmp系命令でフラグの値を参照して条件分岐を実現するといった話がありました。 cmp命令が実は値を返さないsub命令だというのが興味深かったです。ループもうまく実現できていてかっこよかったです!
cmpはsubした結果を"全てのフラグに対して"反映させているのかなるほど#ctf4b #SECCON
— しゅういち (@hideh_1231) September 1, 2018
関数
call命令についての話がありました。引数はレジスタやスタックに改めて格納してから呼び出します。 その時関数から戻った後の次のアドレス、つまりリターンアドレスを自動でpushしています。 関数に入ると、その前までいた関数でのスタックのベースポインタをスタックにバックアップを取ってあとで戻れるようにしています。賢い。その時ベースポインタをスタックポインタに移して、スタックポインタを減算することでメモリ確保をしています。 関数終了時は、先ほどの逆のことをしていきます。leaveという命令で、スタックポインタを先ほどのベースポインタに移してその後元のベースポインタに戻し、次の命令アドレス(リターンアドレス)をインストラクションレジスタに移動させます。この時ポイントなのは、関数終了時の返り値はraxに格納されます。
まとめ
バイナリを読んでいこうというお話がありました。また、gdbなどを使った動的解析にも慣れましょう。
自作Cコンパイラ作れる気がしてきた...!(厳しい)
— しゅういち (@hideh_1231) September 1, 2018
CTF演習&解説
コンテストみたいなものがありました。詳しい内容は他の人のブログを見てください(あまり解けず復習まだのため)
最終順位25位/39位でめっちゃ悔しんですが...Cipher解こうとしたら闇が訪れて時間が食われすぎたのが敗因に違いないつらい#ctf4b #SECCON pic.twitter.com/KRYMjzmK7W
— しゅういち (@hideh_1231) September 1, 2018
やはり、どの問題から解くかといった戦略的に考えることが必要ですし、難しい問題から解くと時間が無限に溶けるのみなのでいけません。 ただ、個人的にはバイナリがとても楽しかったです。今後は主にその方面で勉強していけたらなってお気持ちです。 解説フェーズではなるほどなぁというお気持ちと、これ解けたのでは...?というお気持ちになっていました(Cipherは無理)。 Pythonでスクレイピングして自動化することはよくあるらしいので、Python勉強しないとな〜となっていました。書き捨てできるようになりたいです。
交流会
楽しかったです。セキュキャン勢(なおその時には話していない)ともお話ができましたし、色々と人々と仲良くなれて嬉しかったです。
交流会フェーズ#ctf4 #seccon pic.twitter.com/NSHkAu4z2P
— しゅういち (@hideh_1231) September 1, 2018
終わってから
広島市立大学の愉快な仲間達と、はいひるさんと広島焼きを食べてきました。みなさんとても個性的で話が面白く、楽しい時間を過ごせました。
プレステ2を20台以上持ってたりDSを50台ぐらい持ってる人と、意識高そうな団体入ってる人と、病んでるらしい人と、はいひるさんと広島焼き食べてる pic.twitter.com/zQx1Rr1aKR
— しゅういち (@hideh_1231) September 1, 2018
まとめ
やっぱり技術系イベントは楽しい!今後も積極的に参加していきたいです! みなさんありがとうございました。運営の方や講師の方、お疲れ様でした。次は名古屋のやつ行きたいのでよろしくお願いします←