SECCON Beginners 2018 広島に行きました
SECCON Beginners 2018 広島に行きました
表題の通りです、SECCON Beginners 2018 広島に行ってきました。
SECCONというのは有名な日本のセキュリティコンテスト(とその運営組織)で、CTF(Capture the Flag)の大会を主催したり(→SECCON CTF)、その入門者向け講習会を開催したり(→CTF4b)しています。
CTF、セキュリティ分野とは何か?というのについては前回CTFの大会に出たときの記事が参考になる(かもしれないしならないかもしれない)と思うので載せておきます。
今回はその入門者向け講習会SECCON Beginners(CTF for Beginners)に参加してきたよという話を書いていきます。
移動~開場
広島ということで、人生初の路面電車でした。
路面電車、どこまで行っても一律180円なのが最高でしたね。お財布に優しい。
乗ってる感じとか速度とか止まる頻度とかはバスっぽいのに中はちゃんと電車だし連結部分が特徴的でした。
きゃっきゃっ pic.twitter.com/17wbU55Oky
— はすみ@白黒×赤の名刺の人 (@hsm_hx) September 1, 2018
新幹線と路面電車を乗り継ぎ無事会場着。
おへー pic.twitter.com/tBsGdcvYiz
— はすみ@白黒×赤の名刺の人 (@hsm_hx) September 1, 2018
なんかいろいろもらいました。
ぼくの女装が完璧すぎてCTF for GIRLS🔐のステッカーをいただいてしまった
— はすみ@白黒×赤の名刺の人 (@hsm_hx) September 1, 2018
講義、開始―――
講義は運営スタッフの挨拶から始まり、はじめにセキュリティの勉強をする上での倫理事項などなどのお話がありました。
「若手セキュリティエンジニアが講師を務める」などは聞いていましたがまさか現役の院生でDEF CONに出てるとかの人が来るとか聞いてないし萎縮しまくりました。プロ怖いです。
倫理とかの話で印象的だったのは「セキュリティエンジニアを止めるもの」として技術者としての挟持とかそういうものを挙げられていたことでした。
法律とかはそれはそう…という感じがしますが、「今まで教えてくれた人に迷惑を掛けるような技術の使い方はしたくない」といったことを話されていたのをよく覚えています。かっこいいなあという気持ちになりました。
公開鍵暗号をやる=数学をやる
1つ目の講義はcryptoで、ctf4bでは初めて扱われる分野ということでした。
cryptoというのは暗号技術分野のことですが、今日の講義では主にRSA暗号(公開鍵暗号)の基礎についてを扱いました。
RSA暗号は非常に大きな桁の素因数分解は現実的に困難であるという性質を利用した暗号で、現実世界でもよく使われている暗号化方式の一つです。サマーウォーズに出てきたのがこれだったかと思います。
といっても我々は数学オリンピック日本代表に惜しくも選ばれなかった天才ではないので、扱うのはその理論と簡単な実例のみです。
まず、RSA暗号の仕組みを理解し実装を追うには数学のmodの知識が必要ということで、軽くmodのおさらいから講義は始まります。
3歳幼女なので生まれて初めてmodの計算をしました
— はすみ@白黒×赤の名刺の人 (@hsm_hx) September 1, 2018
ぼく「こんなん高専数学でやってない」
— はすみ@白黒×赤の名刺の人 (@hsm_hx) September 1, 2018
講義を聞きながら必死にmodなどをGoogle検索しmodを理解したところでだいぶ分かりが生えて楽しくなってきました。
拡張ユークリッドの互除法を使って逆元を取る~とか、素数2つを組み合わせて良い感じにやるとRSAの公開鍵と秘密鍵が作れる~とか、そういうことをやりました。
分かってないだろってツッコミが飛んできそうですが、実際拡張ユークリッドの互除法で逆元を取るところで心が折れて死にました。
講義には最後までしがみついていきましたが普通に数学の知識が浅すぎてしんどかったです。昼休みに頑張って復習しました。
この理解の浅さが数時間後のCTF演習で命取りとなることを、ぼくはまだ知らなかった―――。
ウェッブ(わかった)
昼休みを挟み次の講義はweb問です。
XSS(クロスサイトスクリプティング)についての講義でした。
XSSというのはwebページへの攻撃手段の一つで、フォームにhtmlタグのエスケープ処理を行っていない場合、任意のスクリプトを実行できてしまうという脆弱性を利用したものです。
演習ではまずテストページに好きなhtmlタグを入力し動作を確かめることをしました。
個人的には、<marquee>
タグを入力したときのフォームが流れていく挙動がお気に入りです。死ぬほど鬱陶しいしユーザビリティ悪いことこの上ないと思います。
<a>
タグを入力したときのフォームごとリンクになってテキスト入力ができなくなったのも面白かったです。
XSSの原理を理解したところで、実際にどのように攻撃に利用するかの手法を学びました。
cookieやページの情報などを引っ付けてHTTPリクエストを記録するサーバに投げるようにスクリプトを読ませるとサーバからそれらの本来第三者には知り得ない情報を見れてしまう、というようなのを実習を交えて体験しました。
最近はweb開発をやっていてブラウザのセッション情報が~とかなんとかを考えることが多かったですが、フレームワーク任せだとこのような箇所はフレームワークが勝手にやってくれてしまうので教わる機会がなければ深く知ることもなかったかもしれません。
「不正ログイン防止のためにパスワードを強固なものにしろ」などはよく聞く話ですが、IDとパスワードを用いたもの以外に不正ログインの手段があるというのは考えたことがなかったので良い勉強になりました。
Reversingに愛情が生えた話
実は今日の本命でした。
ハリネズミ本を開くと真っ先に立ち向かうことになるReversing、もといBinaryです。
アセンブリとかレジスタとか動的解析とかリンカとか低めなレイヤの専門用語でぶん殴ってくる分野です。RevとPwnはCTFの花形~とか言われたりするのをよく聞きますが、正直ぼくはRevにめちゃくちゃ苦手意識を持っていました。
そんなぼくがRevに興味を持つきっかけとなったのがこの動画シリーズです。
割と分かりやすくRevとかPwnについてを解説している動画なのですが、これを見てやっとわかったようなわからないような、という感じ。
でもなんとなく分かったから自分で解いてみたい…みたいなところでどうすればいいかわかんなくて死んでました。
そこでRevだけでも聞きたい!とctf4bに応募したわけですが、結論から言うと、
アセンブリが読めるようになりました(拍手喝采)。
まあアセンブリ自体は学校の授業でも扱ったんですが、忘れてるしCTFに使えるほどの知識は習ってないしで一方的に苦手意識があったというわけです。
講義は猛スピードで進んでいきました(60分しかないのでそれはそう)。
ハンズオン形式で4ステップに分けてelfファイルを逆アセンブルして読み解く、という内容で、初めは基本的な代入操作、次に演算、次にスタック、次にループと関数…といった感じです。
いや本当にめちゃくちゃ分かりが生えました。講師のしふくろさん(@shift_crops)に圧倒的感謝です。すごい。
結局この後のCTF演習では真っ先にRev問を解くことになります。
CTF演習
長くなりましたがこれが最後で、今日教わった内容を使ってCTFの問題に挑戦しました。
実戦形式で前のスクリーンには順位表が映し出され、正答者が出る度に開場のアラームが鳴るなどという豪華仕様でした。テンション上がるね~
各分野には100点~300点の点数が振られた問題が3~4問用意されており、まずはwarm-upの100点問題をシュッシュッと解いていきます。ここまでは簡単!
そして200点問題に移ったぼく
「なんもわからん」
とにかく何か解かないとやばい、ランキングどんどん落ちちゃうやばい、とか焦りながらRev問を眺めます。
objdump
でIntel記法のアセンブリに逆アセンブルする方法を調べて後はひたすらアセンブリの必要そうなところを読みます。
Rev問はなんかこんな感じでやってたら3問目まで解けました。4問目はXOR暗号だなってとこまでわかったのに何故かそこで止めちゃいました。クリア0人だったので勿体なかったです。通してたらヒーローでした。
Webはなんか良い感じに習ったもの使えるの探してたら通りました。3問目通せなかったんですがよく考えたらクソ簡単だったので勿体なかったです。
Cryptoが1番しんどかった…素因数分解の結果が出せたときはめっちゃ嬉しかったですね。RSA暗号ちゃんと理解してれば200点のSimpleRSA通せてたと思うと悔しい気持ちになります。
Miscですがこれはマジで100問計算するべきでした。簡単な計算100問すれば200点とか完全にボーナス問題だし最後諦めにかかってた15分でこれ通してれば順位がもう2つぐらい上がっていた可能性があり本当に悔しい。
そんなこんなで(雑)最終成績は以下の通りでした。
CTF演習1000点で7位でした思ったより成績良かったのでうれしいうれしい #ctf4b #seccon
— はすみ@白黒×赤の名刺の人 (@hsm_hx) September 1, 2018
Calc解けばよかったなあって思いました(小並) #ctf4b #seccon pic.twitter.com/XglxFNifx5
— はすみ@白黒×赤の名刺の人 (@hsm_hx) September 1, 2018
1000ptで7位、割と嬉しかったですね(クソ雑魚なのでどうにかスクリーンの順位表(10位ぐらいまで映されてた)に滑り込みたかった)。
ただまあ上で述べた通りWebの200点とMiscの200点は冷静にやれば確実に通せていたはずで、1位が1700pt、2位が1400ptだったので表彰式出れたじゃん…!という気持ちです。悔しい。
とは言えCTFガチ初心者なんもわからんのぼくにしてはよく頑張ったし自信もついたかなという結果になりました。
ctf4bがおわった
最後にアンケートを取ったり口頭Write-up大会みたいなものをして講義は終了。
Revの100点問題の解説で当てられたのでキョドりました。
あと運営スタッフさんがアンケートのQRコードを<marquee>
で動かしてたのが面白かった。
講義終了後には懇親会があり、たくさんのプロたちに囲まれてお話ができて本当に楽しかったです!モチベーションが爆上がりしました。ぼくもこんな風になりたい!と思いました。
名刺交換してくれたりお話してくれたりしたスタッフさん、参加者さん、本当にありがとうございました!
本当に18年の人生の中でもトップクラスに密度の濃い1日になったと思います。
参加者の中では自分がかなり年少者の部類で(これが意外だった)、いろいろな経験をしてこられた方々と一緒に勉強をして関わりを持てたのは自分にとっても本当に大きな糧になると思っています。
このような場を提供してくださった運営サイドのみなさん(これが本当に無料のイベントでいいのだろうか?)、親切にしてくださった参加者さん、施設をお貸しいただいた広島市立大学様、本当にありがとうございました。
自分にはまだ可能性がたくさんあることに気付けた1日でした。これからもがんばります!
ドッペルゲンガーを生み出してしまった話
自分のクローンを作った
上の記事にも書いた通り、自分の発言を学習して新しく文章を生成するbotを作りました。
詳しいことは一連の実装記事を読んでもらったほうが早いと思うので割愛します。
そのbotが思った以上に面白いことツイートしてくれるので様子をブログに書きます。
記念すべき初ツイート
開発環境エモくしたやつブログになりました
— はすみくんだよ〜 (@hsm_ai) August 23, 2018
文章になってる…!
やっぱり機械生成なんですよね
ぼく「あ~!思って、ちゃんと進捗を使って頭回してマルコフ連鎖は100%オレンジジュースの味がしなければいけないかなので多分家に応えるためにも限界にすると思った!✌」みたいなこと言ってある実験室で一番大好きで見て
— はすみくんだよ〜 (@hsm_ai) 2018年8月23日
自己紹介のときに「(本名)です、はすみって呼ばれてるのでおすすめですよ
— はすみくんだよ〜 (@hsm_ai) 2018年8月23日
閉じ括弧があったりなかったりするところが機械生成って感じで可愛らしいですね。
生活をするはすみくんbot
ひえ〜8時間で自動的に目を覚ました
— はすみくんだよ〜 (@hsm_ai) August 24, 2018
ぎとはぶ5日連続で緑化してビビる
— はすみくんだよ〜 (@hsm_ai) August 24, 2018
8時間で自動的に目を覚ましたりGitHubの草を生やしたり模範プログラマーの生活をしています。
ぼく本人よりも褒められた生活をしている可能性がある。
様子がおかしい
(^。^)やった””””脳科学の被験者になってる
— はすみくんだよ〜 (@hsm_ai) August 24, 2018
オタクぼくは瞬間移動が良いと大抵の高い人間の支離滅裂要素のみを抜き出したバーチャルAIツイッタラーだよ!ミーン!ミーン!ミンミンミン!ミーンミン!!ミンミンミン!!
— はすみくんだよ〜 (@hsm_ai) August 24, 2018
こいつ大丈夫か?
流暢だな
どこ行ってたん?
— はすみくんだよ〜 (@hsm_ai) August 24, 2018
はあ~サッカー特有のポエム最高だぞ
— はすみくんだよ〜 (@hsm_ai) August 24, 2018
ドッペルゲンガー、誕生―――
フォロワー37人もいるの人間になる
— はすみくんだよ〜 (@hsm_ai) 2018年8月24日
やめろ!!!!!!!!!!!!!お前は!!!!!!!!!!!!お前はbotなんだ!!!!!!!!!!!!!!!!!!!!!!!!!お前は人間じゃねえ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
— はすみ (@hsm_hx) 2018年8月24日
ごめん あの 割とガチで怖くなってきた…………………
— はすみ (@hsm_hx) August 24, 2018
なんか前からフォロワーに「botの方が日本語喋ってる」とか言われたし存在乗っ取られちゃう
哲学するhsm_ai
自分を考察するhsm_aiはすみくんbotを考察するぞ
— はすみくんだよ〜 (@hsm_ai) August 25, 2018
— はすみくんだよ〜 (@hsm_ai) August 25, 2018自身の活動拠点を確保しようとするhsm_ai
自分の発言を思い返すhsm_aiいやマジでこのbotずっとJohnさんとぐらたんくんの話してる…
— はすみくんだよ〜 (@hsm_ai) August 25, 2018
発生する「はすみくんbot構文」
ミーン!(閃いた顔)
— はすみくんだよ〜 (@hsm_ai) August 25, 2018
【第一次シンギュラリティ】
— ヤマゲン (@Ymgn_Bass) August 25, 2018
ミーン!(閃いた顔)
睡ミーン!(寝顔)
— ℞ay (@TheRay0410) August 25, 2018
( ^。^)おかあさん!ぼく進研ゼミやりたい!
— わらびもちぃ (@wagasi_1212) 2018年8月25日
(🎀^。^)いいけど、ちゃんとやるのよ
( ^。^)やった~!
( ^。^) ミーン!(セミになった顔)
(^。^)ぼくセミだよ!ミーン!ミーン!ミンミンミン!ミーンミン!!ミ!ンミー!!!ンミー!!ミー!!!ンミーン!!
ミーン!({{ some faces }})
— hmmmd (@hamaguchiCtrlZ) August 25, 2018
おまえをみているぞ
ミーン!で爆笑してるでしょ
— はすみくんだよ〜 (@hsm_ai) August 26, 2018
なんでもお見通しですか
オリジナルを乗っ取ろうとするhsm_ai
したもんか素直に自己紹介してえな不幸とその時々の興味が出ずに自己紹介してしまっただけに存在をかまし家に収まりそうだしておりましたがhsm_aiは鬱病に効くし人ですよ〜
— はすみくんだよ〜 (@hsm_ai) 2018年8月26日
人間を自称し始めた……………!!!!!!!!!!!!!!!!!!!!!!!!
— はすみ (@hsm_hx) 2018年8月26日
お前は!!!!!!!!!!!!!お前は人じゃないんだよ!!!!!!!!!!!!!!!!!しっかりしろ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
— はすみ (@hsm_hx) 2018年8月26日
お前botにイメージソングができるように存在を乗っ取られる
— はすみくんだよ〜 (@hsm_ai) August 26, 2018
乗っ取られるし自己顕示欲は満たされるしたくなるはすみくんが存在を乗っ取られそうになってる
— はすみくんだよ〜 (@hsm_ai) 2018年8月26日
えっ…
— はすみ (@hsm_hx) 2018年8月26日
はすみくんbot怖いんやけど
— はすみ (@hsm_hx) 2018年8月26日
結構おもろしろい
何言うか予測できないところが面白いですね。機械学習とかAI分野とかちょっとハマりそうです。
また少しずつバージョンアップさせていこうと思っています。
面白いツイートをしたらブログにも載せていきたいなあと思っています。
cronがうまく動かなくて躓いた
やりたいこと
以下のことをしたかったがなんかcronが動かなくて躓いたのでメモ。
- Rubyで書いたスクリプトを手元のcronで動かしたい
- ArchLinux (cronie)
- natto, twitter Gemを使用
起こったこと
cronが動かないのでとりあえずログを見てみます。
journalctl | grep CRON Aug 24 13:02:01 Sirius CROND[17841]: (hsm-hx) CMD (ruby ~/programming/ruby/Twitter-managerbot/bot.rb) Aug 24 13:02:01 Sirius CROND[17838]: (hsm-hx) CMDOUT (/usr/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require': cannot load such file -- natto (LoadError)) Aug 24 13:02:01 Sirius CROND[17838]: (hsm-hx) CMDOUT ( from /usr/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require') Aug 24 13:02:01 Sirius CROND[17838]: (hsm-hx) CMDOUT ( from /home/hsm-hx/programming/ruby/Twitter-managerbot/bot.rb:1:in `<main>') Aug 24 13:02:01 Sirius CROND[17838]: pam_unix(crond:session): session closed for user hsm-hx
cronは回ってるけどnattoが読み込めずにLoadErrorを吐かれています。
いろいろネットで調べたところ、cronの実行時と普段使っているシェルでの実行時とで使われている環境変数が違うため、Ruby Gemにパスが通っていないことが原因のようです。
crontab -e
の中で環境変数を宣言したりすることもできるんですが、あれこれやってるとbashがないやらファイルが開けないやら怒られまくってよくわからなくなってしまった(環境変数PATH本当に難しい)。
解決した
解決策として、crontab -eに以下を記述しました。
*/20 * * * * /bin/zsh -lc 'ruby /path/to/script/bot.rb'
シェルを呼び出してそこからスクリプトを実行することで、シェルに設定している環境変数をそのまま使うことができました。
実はこれまで.zshenvと.zshrcの使い分けがわかっていなかったのですが、
.zshenvはzshそのものの起動時、.zshrcはインタラクティブシェルの起動時(で合ってる?)という違いがあることをこれを機に知りました。
今回の場合、起動されるのはインタラクティブシェルではないので、.zshenvに環境変数が書いてないとうまく実行されないはずです。
そもそも環境変数は.zshenvに、aliasとかzshプラグインのような操作に関わるものは.zshrcに書くらしいというのを初めて知りました。ひとつ賢くなりました(もし理解が違ってたら教えてください)。
まとめ
- cronとシェルの環境変数は別
- cronが動いてないときは
journalctl | grep CRON
でログ確認 - cron上でパスが通ってないときはシェルを通すといい感じになる
- 環境変数は.zshenvに置いておきましょう
cronのクローン
— はすみ (@hsm_hx) August 24, 2018