OSWE Examをpassした話, 名状しがたいCase Studyのようなもの
9月末にOffensive Security社Certifiedな資格の一つ, OSWEの試験を通ったのでそのWrap upとCase Study.
Offensive Security is 何, OSWE is 何, な人はこの辺参照. 他のブログは適当にググってどうぞ.
- OSWE Web Application Security Training, WEB-300 | Offensive Security
- OSWE認定試験の紹介と受験記: NECセキュリティブログ | NEC
- OSWE合格までの道のり
- OSWE Review(受験記) - 高林の雑記ブログ
- OSWE 2020 review - Qiita
試験の内容を要約すると, Web appのソースコードに対する脆弱性診断+悪用(実際にWeb appが動いているマシンのshellを奪取するとこまで)を2台(50点 * 2), 合計100点満点中80点以上を取れば合格できる. 50点/台の点数配分は以下:
- Authentication Bypass - Web app admin奪取: 35 pt
- Remote Code Execution - Machine Shell奪取: 15 pt
ということで, 2台のAuthentication Bypassが必須(計70 pt)+どちらかのマシンでRCEができれば(15 pt)合格ライン到達, その後のレポーティングでミスらなければOK, というもの.
ここで書いてること
- 事前準備に関すること, 特に"やっときゃもっと楽だった"
- 試験中に関すること, "やらない方が良かった"
- やらかしたこと, "残しといて良かった"
事前準備
バックグラウンドとして経験を書いておく:
- 仕事: 日本でのWebアプリ脆弱性診断が6年ちょっと, ペネトレ・RedTeam経験が3年ほど
- 資格: OSCP取得済み
- 趣味: 普通のと, 脆弱性検証用(他人に攻撃検証させる目的)のWebアプリ開発が少し(Python, PHP, Ruby, JavaScript, MySQL, SQLite, 各言語のフレームワークぼちぼち), プライベートでのCTF作問(Electron関連)少し
- その他: 脆弱性診断サービス, マルウェア解析経験, 資格取得等はボチボチあるが, OSWEには直接的に関係がないので省略.
試験に向けてやったことは以下.
- 報告書のテンプレ作成
- ハイレベルサマリの記載 - 達成具合で文言を削除すれば提出できる程度
- 各マシンに関する報告枠, ざっくり以下のような感じ
- X. < Machine Name >
- X.1. Flags
- X.2. Exploitation Summary and Steps
- X.3. Authentication Bypass - < Vulnerability Name >
- X.4. PoC for Authentication Bypass
- X.5. Remote Code Execution - < Vulnerability Name >
- X.6. PoC for RCE
- X.7. Full PoC
- 各種脆弱性の解説枠テンプレ
- 脆弱性名, 解説, 影響, 推奨改善策, 該当箇所, 参考リンク, 検証例の記載枠, 検証例の記載テンプレ
- Cheatsheet作成
- ドキュメントの流し見とHands-onをちょっと
- 流し見は最後(11章...だっけ?)まで
- Hands-onは4章ぐらいまで
Cheatsheetは以下のような感じ. 「脆弱性が見つかればなんとかできるだろ」という見込みで「どういう方針でどう探すか」というメモと, 「いちいち覚える気がないもの」を軸に作った. 作成にはvscode-mindmapを使用.
やっときゃよかったと反省した(やらなかった)ことは以下.
- 試験週の睡眠不足解消
- (ブログ主がロングスリーパーなだけだがそれはそれとして)睡眠不足はすべての敵
- 試験日を艦これのイベント時期と被せたせいなので完全に自業自得
- 一通りのPythonスクリプト準備
- requests.Session, urlencoded/multipart request, content-type customize, HTTP Server, Parameter Parser and Server Thread Handling
- PoCはすべてPythonで実装したが, 上記を試験中に公式のドキュメントやら誰かのブログを見ながら実装するハメになった(タヒ)
- ドキュメントのExercise, Labs
- Exercise/Labが重要ということではなく, それらをやった結果として残るPoCのコード/スクリプトが大事, という話
- 艦これやってる時間あったんだからLabもできたんじゃないですかねぇ(名推理)
この段階での他の反省点は, 試験を(金〜日の三連休で)金曜の0時スタートにしたことぐらい. 単純に仕事疲れを解消できずに試験に臨んだ, ということなので, 三連休初日の朝9時〜昼12時スタートとかであればいいかもしれない.
報告書のテンプレをある程度整えたこともあり, スクショ撮り忘れだとかコード書き漏れだとかのやらかしがなければまあレポーティングフェーズは問題なかろう, というフラグを立てて挑んだ.
試験中
時間経過はメモできるほど余裕がなかったので記憶ベースでのざっくり感しか書けないが, 以下のような状況だった.
- 1日目終了(24時間経過)時点, 35 pt
- Machine A - Authentication Bypass: 手の込んだタイプだったものの, コーディングは完了
- Machine A - RCE: いくつか候補を見つけるものの, 悪用できず
- Machine B - Authentication Bypass: 候補を一切発見できず. トリッキーなものも一部確認してみたが, Bypassには至らず. コードの脆弱な部分はいくつか発見した
- Machine B - RCE: 候補は発見したものの, Authentication Bypass優先で深堀せず
- 自身が混乱状態にあると判断したので, いったん寝ることに. 仕事疲れ&睡眠不足もあって6時間爆睡
- 2日目12時(36時間経過)時点, 50 pt
- Machine A - RCE: スッキリ目が覚めて神降臨. これも手の込んだタイプだった. コーディングまで完了. クリア.
- Machine B - Authentication Bypass: 一通り考え切ってダメだった.
- 試験前に考えていた設問前提(問題作成フェーズに対するスーパーメタ読み)をひっくり返して, 諦め半分でもう一度探し始める.
- 2日目15時(39時間経過)時点, 85 pt
- Machine B - Authentication Bypass: あっさり見つけてコーディングも完了.
- 合格ラインを突破したのでレポーティングに移行
- 2日目21時(45時間経過)時点, 85 pt
- レポーティングの説明部分に多少日本語が残っているものの, 検証の流れ, 各種説明用の画像は取得完了. 合格ラインには達しているだろうと一息つく
- 2日目23時(47時間経過)時点, 85 pt
- Machine B - RCE: 最後のあがき(?)兼勉強目的で調査. 怪しい場所は見つけたものの, 悪用までは至らず. そのまま終了
準備段階にも書いたが, スクリプト+ペイロードをほぼ1から書かないといけないような状態だったので非常にしんどかった, というのが最初にくる所感. あと艦これの遠征を3時間目安で小休止を入れる目的(イベント中だったので資源回復目的含め)でポチポチやっていたのだが, 遠征時間の関係で時間ずれが発生して逆に集中が妨げられた. 素直に12時間とかの遠征に出しとくべきだった.
一方で, 良かったと思う点は以下:
- 要所(1日目終了時点, 2日目12時時点)で思い切った選択ができたこと(寝る, 調査の前提条件をひっくり返す).
- 2台目のAuthentication Bypassを達成後, レポーティングフェーズにすぐに移行したこと(枠を用意していたものの予想以上に時間がかかった).
やるべきことはやったと判断して, 就寝した.
最終日 - レポーティング
やらかし太郎「お ま た せ」
レポーティングの日(3日目), 目が覚めた瞬間に「あれ?2台目Authentication Bypassのコード,一部しか実装してなくね?」と気が付く. そんなわけで3日目は机上デバッグから開始した. 幸いレポートを提出するまではKali VM, VM内のVSCode, Burp等々試験で使用したツールは閉じないようにしていたこともありログは残っていたので, 該当リクエストをRepeater(保存用)とComparer(比較用)に突っ込んでPythonで該当リクエストの再現を行った. 机上デバッグの観点は以下:
- リクエストフォーマット, urlencoded or multipart
- Content-Type, header, multipart parameter
- Session
やらかした部分のスクリプト作成, および日本語解説部分の和訳は午前中に終わったので, 最終レビューののち「机上デバッグのとこのスクリプトが動けばpassすんだろ, なるようにな〜れ」と開き直って昼12時過ぎにレポートを提出, OSEPの勉強を始めた.
翌日の月曜日, 22時過ぎに"passしたよ"という連絡がきていた. 火曜の朝にメールを見て, 「お, あのスクリプト動いたのか. よかったー」という感じだった.
振り返り
ざっくりポイントは以下:
- (全体)試験はレポート提出までなので, アプリを閉じる, VMをシャットダウンするのはレポート提出後にする
- (準備)レポートテンプレの作成は引き続き事前にやった方が良さそう
- (準備)Exercise/Labs(coding)は必ずやる
- (最中)気分転換・思考整理・睡眠は大事
- (終了前)抜け漏れ対策として, 自分が採点する側になってレポートを見直す
- (その他)Cheatsheetは今回あまり役に立たなかったけど, 作ること自体は思考整理にアリよりのアリ
- 確認項目をCheatsheetに入れとくといいかも
まとめ
ぶっつけ本番, (心臓に)いくない