OffSec Web Expert 受験レポート

Tsubasa Irisawa October 03, 2023

主に腕試し目的で 2023 年の 9 月末頃に OffSec Web Expert (OSWE) という Web セキュリティに関する試験を受けました。 そして本日 (2023/10/03) 合格通知が届きました。

https://www.credential.net/16baebe1-71fe-4a55-87a8-4592bbff3d22

この記事では OSWE 自体の紹介、自分が受験した感想などの共有を行います。

OffSec Web Expert (OSWE) とは

準備

メモ (及びレポート作成) のツールとして Notion と Obisidian のどちらを使うかどうかで迷っていて、最終的に Obsidian を使うことにしました。 メモ用のツールには以下の要件を求めていましたが、 Obisidian はこれを全て満たしていました。

本番では PoC の作成に Python と VSCode を使いました。

自分が最も慣れている言語は Go です。PoC に関する言語の指定はないため Go を使うという選択肢もありました。 ただし、 OSWE の教材内で使われる言語は Python なのでそれに合わせておくほうが無難だろうと判断しました。

演習を部分的に Go で書くということもしてみたのですが、これはこれでアリだとは思います。 ブルートフォース系の攻撃を書いてみて、あとから雑に goroutine として包んで並列化して高速化するのは楽です。 しかし、明示的な返り値ベースでのエラーハンドリングを強いられる Go の文化は、 OSWE の試験のように時間にシビアな環境とは食い合わせが悪いように感じました。

推奨環境としては VMWare 上で Kali Linux を実行して、そこで PoC を書いて対象マシンに攻撃するというものでした。 しかし、自分は普段は Mac を使っていて Kali VM 上では各種ショートカットキーの使い勝手が違ってストレスを感じました。

そこで Visual Studio Code Remote - SSH を使って、 Mac 上の VSCode から Kali VM に SSH で接続して、基本的には Mac 上で PoC を書くことにしました。 ターミナルへのアクセスも Mac 標準の Terminal.app から Kali VM に SSH 接続して行いました。 Kali VM には使い慣れた tmux.conf をセットアップしておきました。 これらの設定によってかなり快適に作業できました。

なお、 対象アプリケーションが動いているマシンに対して Visual Studio Code Remote - SSH を行うと規約違反で不合格になると思われます。 対象アプリケーションへのリモートマウント及びファイルダウンロードが禁止されており、 rdesktop コマンドなどで RDP で繋いで VSCode, jd-gui, dnSpy などを起動する必要があります。 Kali VM に対しての SSH は問題ないはずです。

Visual Studio Code Remote - SSH で接続して閲覧/編集ができるのはあくまで PoC であって、対象アプリケーションに関しては話が別という点に関しては注意する必要があります。

Firefox, Burp Suite に関してはさほどショートカットキーを操作することも多くないので素直に Kali VM 上で動かしました。 X11 forwading することもできましたが、少し試してみたところ何かウィンドウ操作がぎこちない感じがして快適ではなかったです。 設定をいじくれば快適にすることもできそうですが、 Firefox と Burp Suite だけなら Kali 内での作業でも妥協できるかなと判断して、これは深追いせずに諦めました。

推奨環境を無視して素直にホストマシンからアクセスすることも可能ではありましたが、これは避けました。 ラボマシンや試験環境には VPN でアクセスすることになるので、ホストマシンをこういった環境の VPN に繋ぎにいくことを避けたかったことが理由です。 OSCP や HTB では実際に VPN に繋ぎに行く際、他のユーザとネットワークを共有することに関して注意されると思います。 OSWE に関しては恐らく隔離されているのでこういった実際は問題無いと思われるますが、今後 OSCP などを受けることも見越して無闇矢鱈にホストマシンを信用できないネットワークに繋ぎに行く癖を減らしておきたいという考えがありました。

タイムライン

07/22 申し込み前

OSWE とは関係ない話ですが、この日に BSCP を受験しました。 合否通知は後日なのですが、全てのタスクを完了したため不正を疑われなければ合格だろうという状況でした。 (実際に合格していました)

BSCP とは Burp Suite を作っている PortSwigger 社の提供する Web セキュリティに関する試験です。 以前 BSCP の受験レポート も書いたので、興味がある方は読んでいただけたら嬉しいです。

07/23 申し込み

BSCP の次の目標として OSWE を受験することにしました。 あまり間を開けたくなかったのでこの日に申し込みをしました。

ラボのアクセス期間として 60 日か 90 日か選べました。 他の人の受験レポートを参考にしつつ、 60 日を購入しました。

自分は普段はフルタイムで仕事をしていますが、これから少ししてから転職することが決まって、有給消化期間の日中を勉強時間に割り当てることができました。

09/27 06:30 頃 起床

いつもこういうときは緊張してあまり眠れないのですが、最近の生活は (比較的) 規則正しいものだったのでぐっすり眠れました。 ここしばらくは 19:00~20:00 頃に夕食を始めて、20:00 ~ 21:00 から1時間ほどゆっくり入浴をして、 22:00 ~ 23:00 頃にめぐりズムを使いつつ VTuber の配信を聞きながら眠り、翌朝 06:00 ~ 07:00 頃に起きるという生活を続けていました。

09/27 07:00 頃 試験開始

監督ツールへのログインも特に問題なく予定通り試験を始めました。

09/27 09:00 頃 1 台目の Auth Bypass 発見

一通りコードを眺めて怪しい箇所を洗い出したあと、5~15 分くらい悩んだあと悪用方法を思いつきました。 OSWE の PDF で紹介された脆弱性と全く同じではないけれど、そこそこ似ているパターンの脆弱性でした。

09/27 13:00 頃 1 台目の PoC の実装完了

Auth Bypass のためにコード全体を眺めていたときに、 RCE 候補の API も見つかりました。 なので RCE はスムーズに見つかりました。

Auth Bypass ~ RCE までを実行する PoC を書くために 1~2 時間くらい使ったと思います。

09/27 22:30 頃 就寝

実技に費やせる時間は 48 時間あるが、 6 時間程度で 1 台目の攻略を完了できたため、ここまではスムーズでした。

しかし、2 台目の攻略で手間取りました。 結局 13:00 ~ 20:00 頃まで Auth Bypass を探したが効果的なものは見つかりませんでした。 危なっかしい箇所は複数発見できていましたが、どれもイマイチ悪用には至らないものでした。

多少の焦りは感じつつも、1 台目の攻略がスムーズだったのでまだ 24 時間以上の時間が余っています。 そのため概ね落ち着いて一日を終えることができました。 いつも通り夕食を食べ、入浴をして、 めぐりズムと VTuber の配信を活用しながら眠りました。

09/28 06:30 頃 起床

2 台目の攻略を再開しました。

まず前日のメモを見ながら怪しい箇所を再度箇条書きで簡単にまとめて、思考をリフレッシュすることにしました。 それでも Auth Bypass を見つけることができず、かなり手こずりました。

この Auth Bypass ができないと合格点に達しないため、精神的に厳しい状況でした。

09/28 13:00 頃 2 台目の Auth Bypass 完了

コードを見てエスケープされているから安全だと思っていた箇所にダメ元でペイロードを送ってみたところ、不思議とそのペイロードが刺さりました。 このタイミングでエスケープ処理の挙動を勘違いしていたことに気がつきました。

そこからはスムーズに Auth Bypass の PoC を書いてハッシュの提出まで進めました。

この段階で「レポートに減点がなければ合格」という状況になったので一安心しました。 しかし、レポートに減点が多少あっても合格できるラインまで持っていきたかったので引き続き RCE を探しました。

09/28 19:00 頃 レポートを書き始める

2 台目の RCE を探し続けるが、イマイチ成果が上がらない状態が続きました。 今夜の食事、入力、睡眠の時間を含めた上で、残りの時間を悲観的に見積もると 2 時間くらいという状況です。

RCE が見つけられないのは悔しいし、レポートで減点が許されないのは厳しいが、 レポートを書き始めることにしました。 見つかるかどうか分からない RCE を探し続けるより、レポートを少しでも確実なものにするほうが堅実だろうという判断をしました。

09/28 22:30 頃 就寝

2 時間くらいレポートを書き続けました。 この日の夜は徳丸本を読み返しながら夕食を取って、入浴をして、 めぐりズムと VTuber の配信を活用しながら眠りました。

試験終了は翌日の 07:00 なので、ちょっと早めに起きてレポートを見直したり RCE 探しの続きを行うことにしました。

09/29 05:30 頃 起床

予定通りちょっと早い時間に起きました。 レポートを軽く見直して今のままでも概ね問題だろうと判断しました。

09/29 06:00 頃 2 台目の RCE 完了

ダメ元で残り 1 時間くらいを最後の RCE 探しに使うことにしたが、意外にも一瞬で RCE を見つけることができました。 正確には前日の試行錯誤で実は RCE は刺さっていたが、それを確認する手段が誤っていてそれに気づいていないというだけでした。 このタイミングで確認手段の誤りと、正しい確認手段に気づきました。

急いで RCE を PoC にしてリバースシェルを獲得しました。

09/29 07:00 頃 試験終了

全てのハッシュを提出できました。 ギリギリまで RCE 探しに時間を使ってしまったこともあって、レポートに含めるためのスクショ撮影に漏れがないかやや不安だでしたが、恐らく大丈夫でしょう…。

09/29 09:00 頃レポート提出

前日の夜にほとんどレポートは書き終えていたので、レポート提出にはあまり時間がかかませんでした。

PDF にすると 25 ページくらいでした。 他の人の受験レビューを見ると 40~70 ページくらいであることが多かったので、かなり少ない部類だと思います。 これだとレポートで減点がありそうですが…ハッシュは全て提出できているので、ハッシュ提出で稼いだ得点のバッファに収まることを祈りました。

感想

BSCP ではサーバ上のファイルを読み出せれば OK でしたが、 OSWE ではそれでは不十分で RCE まで繋げる必要があります。 RCE のやり方を学ぶ過程で今まで気づいてなかった攻撃方法を知ることができて、より正確に脆弱性の影響度を見積もることができようになったと思います。

BSCP はより網羅的なトピックに対して基本的なことを理解しているか試す試験でした。 一方、 OSWE ではトピックは絞られるが、複数の脆弱性を連鎖させて RCE を実現させる応用的な能力が試される試験だったと感じました。

自分のように Web 開発に関してある程度の知識があって Web セキュリティに詳しくなりたい場合は、 BSCP で基礎をまんべんなく学んでから OSWE で深掘りするというのは結構良いロードマップなのではないかと思います。

個人の事前の習熟度によりますが…自分の場合は Lab のアクセス期間は 60 日だと短いと感じました。 自分はたまたま転職が重なって有給消化を勉強時間に割り当てることができたました、それでもギリギリだったという感覚でした。 日中にフルタイムで仕事をしているなら 90 日にするべきだったと思います。

今後についてはやりたいことが沢山あって何をするべきか迷っています。

いずれにせよ、何かしら新しい成果が出たらまたブログを書くつもりです。