CTFのすゝめ

チーフ・カラアゲ・オフィサー 兼 エンジニア
(s.nishi || Akashi_SN)

Who am I?

チーフ・カラアゲ・オフィサー

はい

  • 西 総一朗
  • 明石高専4年電気情報工学科情報工学コース
  • ヘマタイトではCTFKitのサーバーサイドをGolangで書いてる
  • 普段使う言語はPython 3
  • CTF大好き

そもそもCTFってなに?

Capture The Flagを略したもので、コンピュータ
セキュリティの技術を競う競技のこと

いろんな方法で隠された文字列(FLAGと呼ぶ)を提出して得点の合計を競うゲーム

CTFには色々な形式がある

  • Jeopardy形式
  • 一般的なCTFの形式といえばこれ

    各問題ごとに隠されたFLAGを探して
    スコアサーバーに提出する

    (Read only)

  • King of the Hill (KoH)形式
  • いくつかの問題サーバーがあり、そこに隠されているFLAGを探してスコアサーバーに提出して得るサブミットポイントと、 問題サーバーの特定の箇所に各チームのキーワドを書き込むと得られるフラッグポイントがあり、その合計を競う。

    (Read and Write)

  • Atack and Defence (A&D)形式
  • 各チームにサーバーが割り当てられており、そのサーバーで稼働しているサービスを維持しつつ他チームのサーバーに攻撃をする形式。 サービスが稼働しているかや、攻撃が成功したかに応じて得点が加算される。

    (Read and Write)

    これからはJeopardy形式をメインに説明していく

    CTFのすゝめ

    いろんな知識が身につく

  • 情報処理技術に関する幅広い技術・知識
  • 高度な情報セキュリティに関する技術・知識
  • 問題解決能力(デバッグ力)
  • で、どんな問題がでるの?

    問題のジャンル

    • Binary / Reversing
    • Exploits / Pwn
    • Web
    • Network
    • Forensic
    • PPC
    • Misc

    Binary / Reversing

    一般にリバースエンジニアリングと呼ばれているもので、ソースコードのないプログラムを解析

    例:マルウェア解析等で、悪意のある
    プログラムの動作を特定する

    どうやってやるか

    • デバッガでプログラムを実行して解析する
      →(動的解析)
    • コンパイルされた機械語(マシンコード)からアセンブリ言語に変換して挙動を解析する(逆コンパイル・逆アセンブル)
      →(静的解析)
                                

    hello.c

    #include <stdio.h> int main(void){ printf("Hello World\n"); return 0; }
                                

    コンパイル&逆アセンブル

    $ gcc hello.c -o hello $ objdump -d -M intel ./hello
                                

    アセンブラ(main関数)

    000000000000063a <main>: 63a: 55 push rbp 63b: 48 89 e5 mov rbp,rsp 63e: 48 8d 3d 9f 00 00 00 lea rdi,[rip+0x9f] # 6e4 <_IO_stdin_used+0x4> 645: e8 c6 fe ff ff call 510 <[email protected]> 64a: b8 00 00 00 00 mov eax,0x0 64f: 5d pop rbp 650: c3 ret 651: 66 2e 0f 1f 84 00 00 nop WORD PTR cs:[rax+rax*1+0x0] 658: 00 00 00 65b: 0f 1f 44 00 00 nop DWORD PTR [rax+rax*1+0x0]

    Exploits / Pwn

    プログラムの脆弱性をつき、本来アクセスできないメモリ領域に値を書き込んだりして正規の認証を回避したりしてFLAGを取得する

    どんな攻撃があるか

    • バッファオーバーフロー
    • フォーマットストリング攻撃
    • Return-to-libc攻撃

    バッファオーバーフロー

    C言語のstrcpyなど、確保されたバッファ以上に書き込んでしまうことにより任意の値を任意のアドレスに書き込むことができる脆弱性

                                

    overflow.c

    #include <stdio.h> #include <stdlib.h> #include <string.h> void vuln(char *input){ char buf[16]; int secret = 0; strcpy(buf, input); if (secret == 0xc0deface){ puts("flag is FLAG!"); } else{ printf("The secret is %x\n", secret); } } int main(int argc, char **argv){ if (argc > 1) vuln(argv[1]); return 0; }

    このプログラムはsecretの値が0xc0defaceであるときにFLAGを出力する

                                if (secret == 0xc0deface){
        puts("flag is FLAG!");
      }
                            

    しかし、secretの値は宣言されてから一度も変更されてない。よって、FLAGが出力されることはないはず...

                                int secret = 0;
                            
    だがしかし、魔の関数strcpyが使われているので、 buf[16]に16文字以上書き込むと上位アドレスにあるsecretの値も書き換えることができる
                                  char buf[16];
      int secret = 0;
      strcpy(buf, input);
                            
                                

    gccは標準でオーバーフロー保護機能があるのでそれを無効化してコンパイル(32bit環境)

    $ gcc overflow.c -fno-stack-protector -o overflow
                                

    検証コード(リトルエンディアンに注意)

    $ ./overflow hoge The secret is 0 $ ./overflow `python3 -c "print('A'*20)"` The secret is 41414141 $ ./overflow `python3 -c "print('A'*16 + '\xce\xfa\xde\xc0')"` flag is FLAG!

    Web

    Webアプリケーションの脆弱性を突いて、
    認証を回避したりしてflagを取得する

    例:SQLインジェクションの脆弱性があり
    顧客情報が流出してしまう

    どんな攻撃があるか

    • SQLインジェクション
    • XSS
    • ディレクトリトラバーサル
    • OSコマンドインジェクション
    • セッションハイジャック

    SQLインジェクション

    SQL文発行の際のエスケープ漏れにより発生する。変数内の特殊文字も制御文字として認識されることに起因してる

    ヤバイ

                                $r = $db->query("SELECT * FROM user WHERE id='$id' AND pass='$pass'");
        $login = $r && $r->fetch();
        if (!$login){
            ログイン失敗
        }else{
            ログイン成功
        }
        
                            

    idに'OR 1=1--が渡されたときに

                                $r = $db->query("SELECT * FROM user WHERE id=''OR 1=1--' AND pass='$pass'");
                            

    と展開されてしまいWHERE句が真になり、すべてのデータが選択されるのでfetchした際に真になりログインが成功する

    Network

    ネットワーク上に流れるパケットからflagを探す

    Forensic

    大量にあるデータの中からflagを探したり、
    独自のファイルシステムの中からflagを探す

    Q. やってみたいんだけど何から始めたらいい?

    A. 常設CTFとイベント型CTFがある

    常設CTF

    期間制限なく開催されているCTF。下に行くほど難しい

    イベント型CTF

    2日間等の期間を決めて行われるCTFでオンラインでもやってる。終了後は解法が公開されて勉強になる。

    CTFtimeというサイトに開催情報がまとまっている

  • https://ctftime.org/
  • とにかくCTF人口を増やしたい〜

    CTFライフを楽しもう!