SlideShare a Scribd company logo
初心者向け
CTFのWeb分野の強化法
2019/10/16
パナソニック株式会社
製品セキュリティセンター 検証対策部
前田 朋久
『Mix Leap Study #52 - サイバーセキュリティ最前線』
自己紹介
■氏名
前田 朋久(Maeda Tomohisa)
Twitter: @kazkiti_ctf
■経歴
機械工学研究科卒
パナソニック株式会社 入社
・設計/製造品質コンサルタント 9年
・システムエンジニア(SIer) 2年
・セキュリティエンジニア 5.5年
(現職)脆弱性診断、脅威分析、設計支援などに従事
CTFなどの経歴と実績
■CTFなど経歴と実績
準優勝 準優勝 優勝
2016 2017 2018 20192015
SECCON
国内決勝進出
医療セキュリティハッキングコンテスト
国内CTFを開始
海外CTFを開始
バグ
バウンティ
開始
弊社CTFチーム(Pwnasonic)発足
アンケート
1.CTFを知っている方?
2.CTFに参加したことがある方?
なぜCTFをやろうと思ったのか?
セキュリティエンジニアになってから
0年目~ 実は、Cookieすら知らなかった初心者…
↓
脆弱性診断業務を通じて一通りの基礎技術力を習得
1年目~ 脆弱性診断業務を1人で推進していて…
『脆弱性を漏らしていないだろうか?』と常に不安だった
『Webアプリ脆弱性診断は奥が深い』と感じていた
↓
さらなる技術向上が必要!
Webアプリにリソース集中が必要!(選択と集中)
↓
『楽しく技術向上し、業務に活かすため』に
CTFのWeb分野を手段として選択した
CTFのWeb分野をやり始めたころ
■CTFのWeb分野の特徴
・出題範囲が広すぎる!
・脆弱性の種類も多すぎる!
↓
・故に、どこから着手していいのかわからない!
PHP Python
Node.js
MySQL
SQLite
postgresql
SSTI
XSS
Apache
nginx
LFI
RFI
SSRF
html css
javascript
XXE
LDAP
SQL
OAuth2.0
SAML
Ruby
java
CVE
OIDC
JSON
windows
Linux
IIS
Perl
serialization
XML
MSSQL
oracleSSO JWT
NoSQLXPATH
AWS S3
Cloudfront
Lambda
とりあえずやってみた勉強法(失敗談)
■私の失敗談
・とりあえず、出題頻度が高い
『SQLインジェクション問題を100%解けるようになろう!』
と勉強を始めた。
↓
・しかし、SQLインジェクションは奥が深く、泥沼に陥った…
CTFを本気で始める
(2017年~)
■目的
目的/手段/リソース確保
■リソースの確保
毎週土日をCTFに捧げる覚悟
※CTFは土日開催がほとんど
数をこなすため海外CTFをやる
世界各地のCTFの開催日程まとめサイト
http://ctftime.org
■戦略
技術力を向上させて業務に活かす
■目標の数値化 ※どこまで解けるようになりたいか?
目標設定/数値化
その問題の難易度(正解率[%])=
その問題を解いたチーム数
全体で1問以上解いたチーム数
0~1%問題を解く技術力
1~5%問題を解く技術力
5~10%問題を解く技術力
10~20%問題を解く技術力
20~40%問題を解く技術力
40~100%問題を解く技術力
世界TOP10
日本トップクラス
上級者
中級者
初心者
CTF未経験者
■現在(当時)の実力把握 ※数回参加して測定
当時の私の実力は、難易度(正解率30%)なら全て解けていた
⇒初心者レベル
■技術力と難易度のおよその関係 ※数回参加して測定して定義
write-up(解法)にも正解率を記入、自分の実力把握をする
このように
正解率を記載するようにし、
自分の実力把握を日々していった
【メリット】
・得意/不得意分野が客観的指標でわかるようになったため、
対策がしやすくなった
難易度別の対策
正解率40~100%の問題
CTF未経験者
(正解率40~100%)を解けるようになるには?
■CTF未経験者
・セキュリティ技術については、そこまで保持していない
・開発技術などのIT関連技術は保持している
(開発技術の一例)
・Webサイトの基本の理解(html、css、javascriptなど)
・プログラミング言語を読み解く力
・gitの使い方
・HTTPサーバ(Apache/nginxなど)の設定
問題例:TokyoWesterns CTF 4th 2018 (1/2)
URLにアクセスすると、下記のPHPソースコードを得られる
【ゴール】Flagが表示される
問題例:TokyoWesterns CTF 4th 2018 (2/2)
【突破ポイント】
コードを読み解く力
・actionパラメータに、authにしておく
・hashed_passwordパラメータを、c019f6e5cd8aa0bbbcc6e994a54c757eにしておく
・userもしくはpassパラメータを、empty(空)にしておく( hashed_passwordを上書きさせない)
【ゴール】Flagが表示された
(詳細解説)https://ctftime.org/writeup/10891
正解率20~40%の問題
初心者
(正解率20~40%)を解けるようになるには?
■セキュリティの知識力/調査力を問われる問題
・初心者向けCTF(picoCTFなど)
・過去問と同じ問題(write-upをチェックする)
※一度出題された問題は難易度が高くても既知の問題になる
・書籍(セキュリティコンテストチャレンジブックetc…)
・既知の有名な脆弱性
※CVEが付与された脆弱性の攻撃方法を調査し、時間内に解く力
※インシデントレスポンス業務担当の方は得意
問題例:ENCRYPT CTF 2019 (1/2)
URLにアクセスすると、下記のhtmlレスポンスが得られる
【突破ポイント】
セキュリティの基本知識
・16進数32桁なので、ハッシュ値のMD5である
・MD5は逆算できないので辞書的に検索する必要がある。
問題例:ENCRYPT CTF 2019 (2/2)
先ほどの値が100だったので、
0~101のMD5値を計算して送信してみよう!
【ゴール】Flagが得られた
(詳細解説)https://ctftime.org/writeup/14332
この辺りで止まっていませんか?
そろそろ次のレベルを目指してみましょう!
正解率10~20%の問題
中級者
(正解率10~20%)を解けるようになるには?
■環境構築力
1.環境を持っていないと解けない問題
(例1)SSRF ⇒ DNSRebinding問題 ※DNSサーバが必要
(例2)XSS問題 ※HTTPサーバが必要
2.環境構築し試行錯誤すれば難易度が下げられる問題
(例1)ソースコードが与えられる問題⇒サーバ立てて試行錯誤できる
※PHP,Python,Node.jsなど
(例2)SQLインジェクション⇒SQLサーバを立てて試行錯誤できる
■対策
・AWSアカウントを持って、EC2サーバを立てる ※1年間無料
・DNSにドメイン登録する ※年間100円程度
・コンテナ技術(Dockerなど)で様々な言語のサーバの立て方を知る
日ごろからいろんなサーバを立てて試行錯誤する!
問題例:angstromCTF 2019 (1/1)
【突破ポイント】
・一度、Node.jsサーバを立てて、
NoSQLインジェクションの環境にて試行錯誤していた
(詳細解説)https://ctftime.org/writeup/14922
正解率5~10%の問題
上級者
(正解率5~10%)を解けるようになるには?
■網羅力
1.BlackList‐Bypass問題
・SQLインジェクションで使用関数制限がある
・OSコマンドインジェクションで使用関数制限がある
・SSTI(Server Side Template Injection)で使用関数制限がある
・PHP任意コード実行で使用関数制限がある
■対策
・網羅的に、事前に関数などを調べておく
・仕様書/RFCなどを事前に調べておく
問題例:TokyoWesterns CTF 4th 2018(1/2)
問題例:TokyoWesterns CTF 4th 2018(2/2)
【突破ポイント】
・SSTIから任意コード実行できる関数を網羅的に調べていた
【ゴール】Flagが得られた
Blacklist
(詳細解説)https://ctftime.org/writeup/10895
正解率1~5%の問題
日本トップクラス
(正解率1~5%)を解けるようになるには?
■攻撃シナリオを列挙する力
・稀な脆弱性(発見しづらい)
・相対パス上書き攻撃によるXSSやCSSインジェクション
・Cache-PoisoningによるXSS
・LDAPインジェクション
・バイナリ/暗号など他分野との複合問題
■対策
・全ての脆弱性は一通り知っていて発見できる状態にしておく
・日頃の最先端情報の収集
問題例:Meepwn CTF Quals 2019 (1/2)
問題例:Meepwn CTF Quals 2019 (2/2)
【ゴール】Flagが得られた
最終的な攻撃用URL
【突破ポイント】
・稀な脆弱性である相対パス上書き攻撃によるXSSを理解
※後は条件に合わせて、攻撃用URLを作成していく
(詳細解説)https://ctftime.org/writeup/10442
正解率0~1%の問題
世界TOP10
(正解率0~1%)を解けるようになるには?
人生で重要な何かを捨てる!
日々、ひたすら突き詰めて
精進する
始めはどこかの脆弱性に絞って
1点突破する
XSS Payload
<script>alert(1)</scrip>
XSTとは…
問題例:Tokyo Westerns CTF 3rd 2017 (1/2)
Proxyサーバ経由でHTTPサーバにアクセスしており、
下記のようにソースコードが与えられている
また、flagの場所は、Webサーバのネットワーク配下の
別のローカルサーバに置かれている
【突破ポイント】
・ひたすらXSSに絞って日々勉強&情報収集を2年間
・この問題を1問解くのに14時間かかった…
・人生で重要な何かを失ったような気がする…
問題例:Tokyo Westerns CTF 3rd 2017 (2/2)
▼最終攻撃コード完成までの流れ
Pythonコードが与えられていたので読む
↓
RefererヘッダにXSSの脆弱性を発見
※通常はRefererヘッダはURLエンコードされるので
XSSはありえないのだが、特殊なproxyを挟んでいるため、
XSSが発生
↓
Flagの場所は、ローカルIPアドレスなので、
XSSを利用してローカルIPアドレスをブルートフォースして
ネットワーク調査し、192.169.0.4が存在することがわかる
↓
再度XSSで、192.168.0.4のflag取得用の
最終攻撃コードを完成させる
(詳細解説)https://ctftime.org/writeup/7461
まとめ
CTFをうまく活用して
楽しみながら
技術力を向上させていきましょう!
初心者向けCTFのWeb分野の強化法

More Related Content

初心者向けCTFのWeb分野の強化法