
1. はじめに
こんにちは、おまどん(@ommadawn46)です。
2024年7月13日、「OSEE (OffSec Exploitation Expert)」という資格試験に合格しました。この資格はOffSec社が提供しているExploit Dev系資格の中で現在のところ一番取得が難しいとされているものです。
この記事に書いてあること:
- OSEE試験の概要
- どのように試験に向けた準備を進めたか
- 試験当日の体験記
- 試験終了後の感想
想定読者:
- OSEE受験を検討している方
- OSEE試験の雰囲気を知りたい方
この記事は「EXP-401: Advanced Windows Exploitation (AWE) 受講記 - ommadawn46's blog」の続編です。AWEコースがどのような内容を含むのかについては前回の記事をご参照ください。
目次
2. OSEE試験の形式
OSEE試験はOffSec社の資格ラインナップの中でも少し特殊な扱いとなっている試験です。ここでは、試験の形式、問題の特徴について解説します。
2.1. 試験概要
公式ページに記載されている通りですが、OSEE試験は以下のような形式になっています:
- 試験時間:71時間45分
- レポート提出期限:試験終了後24時間以内
- 問題数:2問
- 配点:各問題50点満点(特定条件で25点の部分点あり)
- 合格ライン:75点
OSEE試験はOffSec社の資格ラインナップの中でも一番長い試験時間が設定されています。レポート執筆時間も含めると最大で丸4日間ぶっ続けの試験となっており、資格試験としては群を抜く長さと言えます。
また、最大の特徴は受験のために「対面でのライブトレーニング(EXP-401: AWE)への参加が必須」というところです。他のOffSec資格はいずれもオンライントレーニングでの取得が可能となっており、OSEEだけ特別な扱いがなされています(試験自体は他と同じくオンラインです)。
2.2. 問題の特徴
また、問題は全部で2問だけとなっています。72時間で2問だけを解くというのは想像しにくいかもしれませんが、「モダンなExploitコード(※)を3日間で2個書き上げるようなもの」と考えると具体的な内容がイメージできるかもしれません。
※: 例. VMWare環境でのゲストOSからホストOSへのエスケープ、Browser Sandboxのエスケープなど
以下のリポジトリは自分が試験対策として書いたExploitコードです。OSEE試験内で作成する必要があるのはまさにこういったExploitコードとなっています。
2.3. 公式情報
試験形式についての詳細は EXP-401: Advanced Windows Exploitation OSEE Exam Guide に書かれています。より詳しく知りたい方はご参照ください。
3. 筆者が行った試験対策
ここからは、筆者が前回の記事を書き終わった後、試験を受けるまでの間にやったことを振り返ります。
試験対策に充てることができた時間は大体2ヶ月間程度でした。
3.1. 試験対策開始
筆者は2月にAWEコースを受講したのですが、ちょうどその頃仕事上の役職に変化があり、勉強しないといけないことが山積みになっていました。結果、数ヶ月間は全く試験対策には手を付けずに過ごし、その後、落ち着いてOSEE試験に向けた対策に着手できるようになったのが前回の記事を書いた5月頃です。
ようやく本腰を入れて試験対策に打ち込む決心をつけたところで、試験勉強を始めるよりも先に試験の予約を入れることにしました。これは先に締め切りを定めてしまって、締め切りに追われるような状況を作って自分を追い込んだ方が効率が良いと思ったためです(そもそも、そういうやり方じゃないとエンジンが掛からないタイプの人間なだけというのもあります)。7月に試験予約を入れ、残り期間で集中的に試験対策をやりきることにしました。
次のセクションでは、その2ヶ月間、筆者が具体的にどのような試験対策を行ったのかについて説明します。
3.2. AWEコースの振り返り
前回の記事で紹介したとおり、AWEコースは以下の4つのモジュールがメインの内容となっています:
- VMware Workstation Guest-To-Host Escape: VMware Workstationの脆弱性を利用したゲストOSからホストOSへのエスケープ
- Microsoft Edge Type Confusion: Microsoft Edgeの脆弱性を利用したBrowser Sandboxからのエスケープ
- Driver Callback Overwrite: サードパーティ製のカーネルドライバの脆弱性を利用したローカル特権昇格
- Unsanitized User-mode Callback: Windows OSネイティブのカーネルサブシステムの脆弱性を利用したローカル特権昇格
これらのモジュールは、User-mode Exploit(VMWare、Edge)とKernel Exploit(Driver、Windows Kernel)の2つに分けることができます。
3.3. 教科書での学習
2月のAWEコース終了直後を振り返ると、正直のところ「試験対策に大して時間はかからないのでは」と少し楽観視していたところがありました。前回の記事に書いた通り、コース中にチャレンジコインを2枚獲得できていたことが過剰な自信に繋がっていた気がします。しかし、5月になって、改めて教科書のExploitコードを読み返してみると曖昧な理解のまま進めてしまっている部分が沢山あることが分かりました。
3.3.1. コースと試験のギャップ
コース中のチャレンジは、概ね他人が書いたExploitコードに手を加えて目標を達成するものです。しかし、これは一から自分でExploitコードを書くのとは全くの別物です。試験では一からExploitコードを完成させることが求められるため、コース中のチャレンジを達成したからといって試験の準備ができているわけでは全くありません。それとは別に、自力でExploitコードを書き上げることに主眼をおいた学習を行うことが必須のように思えました。
3.3.2. 具体的な学習内容
そういった状況を把握したところで、自分はAWEコースの教科書を用いて、モジュールごとに以下の流れで学習を進めることにしました:
- 教科書のExploitコードを隅々まで読み込み、デバッグを繰り返して曖昧な理解をしている部分を無くす
- 自分でExploitコードを一から書き直す
- 未着手のExtra Mile問題を全て解く
上記の流れで全てのモジュールを網羅するのに1ヶ月半程度掛かりました。
全体を通してスムースに進みましたが、とあるExtra Mile問題だけは飛び抜けて難しく、その1問だけで1週間以上の時間を費やすことになりました。ただし、自分はこの問題を解いている間が一番楽しかったです。
やっと解けた
— おまどん (@ommadawn46) 2024年6月26日
マジで難しかったなこの問題 pic.twitter.com/dUgLZBiwTO
また、Extra Miles以外のExercisesには手つかずの問題が結構ありましたが、自分は後述のKernel Exploit対策の方に熱が入ってしまったこともあり、教科書での学習はここまでとしました。
3.4. その他の学習
3.4.1. Kernel Exploit対策
その後、試験までの約2週間の間は、Kernel Exploitに焦点を絞り対策を行いました。具体的には、上記の一番難しかったExtra Mileに関連する技術を深堀りするような学習です。
学習の過程で作成したExploitコードは後日GitHubで公開しています:
このExploitコードを書いている期間が一番実力がついた実感がありました。やはり、自力でExploitを書く経験を積むことが試験対策として高い効果があるように思います。
3.4.2. User-mode Exploit対策
上記のKernel Exploitの学習に加え、本当はUser-mode Exploit(例えば、Chromeの脆弱性を使ったSandboxバイパスなど)も勉強をしたかったのですが、時間配分をミスって勉強時間が足りなくなってしまいました。
結果として、自分の試験対策は完全にKernel Exploitに偏った配分になってしまっていました。このUser-mode Exploitの勉強不足のせいで後に苦しい思いをすることになります。
自分は偏った勉強をしてしまいましたが、今後試験を受ける人はUser-mode ExploitとKernel Exploitの両方に同じ程度の時間を掛け、バランス良く準備することをおすすめします。どちらの学習にも同じくらいの時間を掛けているくらいが丁度良いと思います。
3.4.3. その他の参考資料
OSEE試験は他のOffSec試験と異なっている部分も多いです。試験を受ける前に公式ガイドを注意深く隅々まで読んでおくことをおすすめします。
特にサンプルレポートは事前に読んでおいて良かったと思いました。サンプルレポートから読み取れる情報は多く、試験についてある程度イメージを掴むことができます。
また、先人たちのOSEE受験体験記を読むことも試験のイメージを掴むための助けになります。
- OSEE review | Fluid Attacks
- Advanced Windows Exploitation (OSEE) Course Review: Part 2
- OffSec EXP-401 Advanced Windows Exploitation (AWE) – Course Review - VoidSec
- OSEE Review 2023
- Passing the New OSEE Exam After Forgetting Everything | Spaceraccoon's Blog
4. 筆者の受験体験
ここからは実際に自分が試験を受けている最中に感じたことについて書きます。ただし、試験問題の内容には触れず、基本的に筆者の感想のみを書いています。
最初に、結論として受験体験全体について感想を述べると「楽しかった!」になります。OffSec社の試験は全部楽しかったですが、その中でもOSEEは特に楽しかったですね。
4.1. 試験開始前
自分の試験は以下のスケジュールで予定されていました:
- 開始時間:7月13日 12:00
- 終了時間:7月16日 11:45
- レポート提出期限: 7月17日 11:45
当日、試験開始の15分前にProctoring Toolにログインし、順調にパスポートでのIDチェックや部屋のチェックなどを済ませました。いよいよ試験開始かな…というタイミングで監督官からの返信が遅れがちになり、不安な気持ちで待っていたところ、「サーバ側で技術的なトラブルが発生しているので、そのまま待って欲しい」というメッセージが返ってきました。
その後、自分には待つことしかできなかったので待ち続けましたが、カメラ・画面共有で監視されたまま、何もせず待ち続けるのには若干の苦痛を感じました。
実際に試験を開始できたのは13時を過ぎてからでした。試験開始時には若干疲れを感じ始めており、「幸先の悪いスタートだな」と思いました。
4.2. 試験中
試験開始直後、まずは約1時間かけて2問それぞれの問題について下調べをしました。どちらも難易度が高そうではありましたが、個人的には、2問のうちの片方の問題が特に難しそうに感じました。
どちらから手を付けるか少し迷いましたが、まずはより難しそうな問題から着手することにしました(どうせなら高いパフォーマンスが出せる序盤のうちに難しい問題を片付けた方が合格の可能性が高いと思ったためです)。
4.2.1. 先に着手した問題
予想通り、この問題は自分にとって難易度が高く、かなりの苦戦を強いられました。
以下は、問題に着手してから解き終わるまでのタイムラインです。
- 7月13日 14:00:着手開始
- 7月14日 04:40:部分点達成(25ポイント)
- 7月14日 04:50:就寝
- 7月14日 10:10:起床
- 7月14日 23:40:満点達成(50ポイント)
解き終わるまでに約34時間かかりました。振り返ると、この問題を解いている間はずっと目を瞑って手探りしているような気分だった気がします。少し進めば壁に突き当たり、それを越えたら別の壁に突き当たるという状況の繰り返しで、全て解き終わる瞬間まで、「本当にこの問題は解けるように作られているのか?」と疑問に思っていたような気がします。
初日は、そういった手探り状態を明け方まで続け、遅い進みではありましたが何とか部分点を取るところまで進みました。その後すぐに床に就きましたが、正直あまり休めず、良くない夢を見ながら浅い睡眠しか取れなかったように記憶しています。
起床後も順調には進みませんでした。何も成果が出ない時間もあり、「1問目が解けないまま試験が終了するのではないか…」という不安に襲われ続けました。その後、何とか糸口を掴み、2日目の夜中にようやく問題を解き終わりました。
受験中、その瞬間が一番嬉しかったです。しかし、喜びと同時に「もし2問目がこれ以上に時間が掛かるものだったら合格は危ういのではないか…」という、新たな不安に襲われ始めました。
正直1日目、2日目は心が休まる暇がありませんでした。
4.2.2. 後に着手した問題
不安な気持ちで着手しましたが、意外にもこちらの問題はあっさりと解くことができました。
2問目に取り組んだ際のタイムラインは以下の通りです:
- 7月15日 00:00:開始
- 7月15日 04:30:部分点達成(25ポイント)
- 7月15日 04:40:就寝
- 7月15日 11:40:起床
- 7月15日 16:50:満点達成(50ポイント)
解き終わるまでに約17時間かかりました。先程の問題とは打って変わり、こちらの問題は「やるべきと思ったことをやるだけ」という感じで終始順調に進みました。明け方まで作業を続けて部分点を達成し、あっさりと合格ラインへ到達できました。
その後、安心してベッドに入ることができ、前日よりは良く眠れたように思います。
起床後も特に詰まることはなく、無事に2問目を解き終わることができました。
これで全問完答です。7月13日13時頃に試験を開始したので、2問解き終わるまでに52時間程度掛かったことになります。
4.2.3. レポート作成
その後休憩を多めに挟みつつ、Exploitコードのリファクタリングと、レポート執筆のための材料(スクリーンショットなど)集めを行いました。
レポート作成のタイムラインは以下の通りです:
- 7月15日 17:00:リファクタリング & レポート材料集め開始
- 7月16日 00:20:レポート執筆開始
- 7月16日 07:20:レポート提出
レポート作成には約7時間を費やしました。最初は一度眠ってからレポートを完成させようと考えていましたが、書き始めると筆が乗ってしまい、結局徹夜で朝までレポートを書き続けました。
7月16日 07:20にレポート提出を完了させ、自分のOSEE試験は終了しました。
4.3. 結果通知
そこから結果通知を待つ日々が始まりました。
メールを受信するたびにスマホに飛びつく毎日でしたが、なかなか結果は届かず、「何か不備があったのでは無いか」と思い始めるなど、少しずつ不安な気持ちが募っていきました。
提出から2週間が過ぎたタイミングで、我慢できず試験の採点状況についてOffSec社に問い合わせました。結果、8月3日から6日にかけてBlack Hat USA 2024でAWEコースが開催されており、その準備のために採点が遅延していると説明してもらいました。
おそらく、OSEE試験の採点ができるのはAWEコースの講師に限られているなどの事情があり、Black Hatの準備と並行して採点作業を行うのは難しかったのではないでしょうか。コースの高度さや採点の難しさを考えると致し方ないことですね。これに関しては自分が試験を申し込んだ時期が悪かったです。
その後、レポート提出から3週間が経過した8月8日、ようやく合格通知が届きました。
#OSEE に合格しました!
— おまどん (@ommadawn46) 2024年8月8日
OSCP、OSCE3、OSEEと、これで取りたかったOffSecの資格を全て取り終えました!
OSEEは今までで一番の高難易度だったように思いますが、その分取り組んでいる間の楽しさも一番でした
次の目標が見つからないですが、一旦解放感を楽しみつつ積みゲーの消化でもしたいですね pic.twitter.com/jiktJ6dKK0
やりました。
5. 試験を終えて
ここからは、試験合格後の目線でAWE受講からOSEE合格までの経験を振り返ります。主に試験の内容やリアルワールドでのメリットについて意見を述べます。
5.1. 試験問題の設計
OSEE試験問題についての感想です。
問題を解いている間、試験対策で身につけた知識・スキルがフルに活かされており、自分の能力がしっかりとテストされているという感覚がありました。資格試験として満足感のある内容だったと思います。
問題の設計は、AWEで学んだ技術だけではなく、応用力が試されるように少し捻りが加わったものになっていたように思います。「OffSecの試験はこうでなきゃ」と思わせる手応えがありました。
5.2. 最新の環境への応用
OSEEが取り扱っている技術やコンセプトは、今日の環境でも十分通用すると自分は考えています。
VBS/HVCIが有効になった環境でのKernel Exploitや、VMやブラウザ等の多層的なSandbox化が施されたアプリケーションでのUser-mode Exploit。こういったExploit Dev技術は2024年現在のExploit Devで一番ホットな領域であり、コース/試験で学んだ技術は2024年現在、十分リアルワールドで通用するものであるように思います。
5.3. 他の環境への応用
5.3.1. OSEEはWindows x86_64特化
OSEEで学ぶExploit Dev技術はWindows x86_64アーキテクチャに特化しています。そのため、直接的に応用できるのはWindows x64環境のみです。更に言うと、OSEEで学ぶ技術は、直接的には特定のソフトウェアのExploitにしか応用できないものが多いです。
5.3.2. 汎用的ではないExploitテクニック
OSEDではROPを用いたDEPバイパスなど汎用的なExploitテクニックを学びます。
一方、OSEEでは、以下のような特定のソフトウェア固有の動作に強く依存した悪用方法を考えることに重点が置かれています。
- 構造体の各データの意味を理解する
- どう書き換えれば、ソフトウェアの動作にどのような影響が起こるのかを理解する
- その上で、どうすれば固有のセキュリティ機能やSandboxメカニズムを回避し、プリミティブを構築できるかを考察する
- 利用できるプリミティブを増やしていき、最終的に目的を達成する方法を模索する
どのようにしてプリミティブを構築し、どのようにして目的を達成するかはソフトウェアによって千差万別です。ある対象で成功した手法が、他の対象でそっくりそのまま通用することは多く無さそうに思います。
5.3.3. 汎用的な"分析力"
しかし、直接的な活用はできなくても、OSEEで身につく"分析力"は他のソフトウェアや環境でも応用可能であると自分は考えています。OSEEでは、ソフトウェアの内部動作を理解し、データ構造を分析し、どのようにデータを操作すればExploitのインパクトを最大化できるのかを考察します。こういったExploit Devの過程で学ぶ分析力は、抽象化すれば、Exploit DevどころかWeb系の脆弱性の悪用でも応用可能なのではないか?と自分は思っています。
というのは、Web、Binaryを問わず、Exploitで重要なのは、意図しない挙動を最大限に悪用する方法を考え抜くことであり、そのためにソフトウェアの内部動作をどこまで解像度高く理解できるかが鍵であると自分は思っています。そして、OffSec社のコース/資格の中で、OSEEほど深くこの点を考えさせるものはないように自分は感じています。
このExploitの鍵となる分析力を身につけるという意味ではOSEEが一番学びが大きいと思います。もちろん、新しい環境特有の知識は別途勉強が必要です。しかし、OSEEで培った思考プロセスは、どんなソフトウェアや環境においても強力な武器となると思います。
5.4. リアルワールドでの活用
5.4.1. レッド系業務全般
前述の通り、OSEEで身につく分析力はレッド系の業務全般で活きると思います。私自身はこれが一番のメリットを感じているところです。
5.4.2. ペネトレーションテスト
もう少し具体的なところでいうと、OSEEで身についたExploit Dev技術は、ペネトレーションテスト等での「最終兵器」としての活用が考えられます。ペネトレーションテストでは、稀にテスト対象となるスコープが狭すぎて途中で何もやることがなくなってしまうことがあります。通常の業務では、既知の脆弱性や設定ミスの発見が主な作業となると思いますが、OSEEで培ったスキルを用いれば、一見脆弱性の無いソフトウェアからでもゼロデイ脆弱性を発見・悪用することでゴール達成ができる可能性があります。そのように、OSEEのスキルは他の手段が尽きた後の最終兵器として活きるかもしれません。(まあ、実際にはそういう機会は滅多にないかもしれませんが…。)
5.4.3. 複雑な脆弱性の分析
後は、複雑な脆弱性の分析をする役割を担っている方であれば、学んだことを活かす機会は多いと思います。例えば、先日から世間を騒がせている CVE-2024-38063 のような脆弱性が公表された際に、Windows OSバイナリのdiffを取って脆弱性を分析し、悪用可能性を評価する。こういった高度な脆弱性分析のためのスキルは、まさにOSEE試験が要求するスキルそのものです。こういった分析を通して脆弱性のリスクを捉える役割というのは、最も分かりやすくOSEEのスキルを活かせる役割かもしれません。
6. おわりに
6.1. 振り返って
OSEEの合格通知を受け取ったときの達成感は相当のもので、今でも嬉しい気持ちで一杯です。
ただ、これ程時間を忘れ、没頭して打ち込める対象は中々出会えないものです。嬉しい一方で、打ち込める対象を失ったことの寂しさも感じています。バイナリに齧りつき、Exploitコードを書き、深夜までバグと格闘する。そんな毎日を思い出すと少し懐かしい気持ちすら感じます。
ここ数年、自分はOSEE資格の取得を目標としてきました。AWEコースを受講できる機会を虎視眈々と狙い続け、ようやく参加が決まった時は本当に嬉しかったことを覚えています。その後、コース/試験を通して久々にどっぷり技術に浸かることができ、心底楽しい日々を送らせて頂きました。
6.2. OSEEの活用
実のところ、自分自身の場合、こういった技術を直接的に活かす脆弱性分析のような最前線のセキュリティオペレーション業務からは徐々に遠ざかっています。自分の力で何とかするより、周囲が最大限に能力を発揮することを目指す業務、具体的にはマネジメントや戦略策定のような業務が今の中心です。
そういった非技術系の業務が中心となる中、OSEEは技術に没頭する時間を作り出してくれ、より深い技術的視点を得るための貴重な機会をくれました。OSEEで培った知識やスキルは今の役割においても必ず活きてくると思っています。
何にしても、OSEEの取得は自分にとって大きな自信となりました。
6.3. 謝辞
最後に、素晴らしいチャレンジを与えてくれたOffSec社、そして講師のMortenとSicknessに感謝します。
ここまで記事を読んでくれた皆さんにも感謝です。この記事が何か少しでも参考になれば嬉しいです。
それでは、また!