OSCP合格までの道のりとそこから学んだこと

OSCPというペネトレーションテストの資格試験に合格しました。合格までの道のりとそこからの学びです。

Satoshi Tajima

先日、OSCPというペネトレーションテストの資格試験を受けて無事に合格できました!
合格までの間、多くの先人の方々のブログを参考にさせてもらっていたので、私もこれからOSCPを取ろうと思っている人たちのために、合格までの道のりと、そこから学んだことをまとめておこうと思います。細かいTips等も含めています。

ちなみに私は、セキュリティ企業で働いている(もしくは働いていた)というわけではなく、どちらかというと、インターネットサービスを開発をする会社のインフラ・セキュリティを担当するという立場で働いている者です。なので、OSCPでペネトレーションテストのテクニックを学ぶことで、システムを保護するためのスキル向上につなげたいというモチベーションがありました。この点については、もう少し詳しく後述します。

OSCPとは

すでに多くの紹介ブログがあるのでここでは簡単な説明にとどめますが、

  • Offensive Securityという、Kali Linuxを提供していることで有名な企業によるペネトレーションテストの資格。
  • OSCPの前に、PWK(最近はPEN-200という名称も使われている模様)というオンライントレーニングを受ける。
  • PWKは主に 約850枚のPDFのテキスト・約17時間の動画・Labと呼ばれるネットワーク・マシンの攻略 で構成される。
  • PDFと動画で学んだ攻撃のテクニックを、Labのネットワーク・マシンに対して実行し、マシンの管理者権限を取得することを目指す。
  • 試験は実技試験で、23時間45分で5台のマシンを攻略し、続く24時間でその攻撃手順をまとめたレポートを書く
  • 試験はオンラインで受けられるが、前半のマシン攻略中はWebカメラと画面共有によって監視を受ける。

というなかなかハードな試験です。

テキスト・動画・試験・レポートと、すべてのコンテンツは英語です。
が、そこまで難しい英語が使われるわけではないので、普段英語のドキュメントを読んでいたり、海外旅行に行けたりしている方ならそこまで問題にはならないと思います。(それ以外の要素のハードルのほうがよっぽど大きいです。)

ちなみに、今回の受験にあたっての費用($1,349)は、会社のキャリア形成支援の制度で全額支払ってもらえたのでとてもありがたかったです。

作業環境

PWKは、公式にはVMware + Kali Linuxという構成で進めていくことが推奨されています。そのとおりに進めてもよかったのですが、最近の仕事ではほとんどDocker/コンテナを使っているので、今回はコンテナベースで環境を作りました。

ブラウザでのサイトアクセスのためにsocat等で通信を中継したり、GUIのアプリケーションはホストのMac側にインストールしたXQuartzに飛ばしたりとちょっと面倒な点もあるのですが、必要なパッケージやソフトウェアはすべてDockerfileに書かれていて、軽量で気軽にスクラップアンドビルドできるようになっているというのは便利でした。

コンテナベースの環境は、トレーニング~試験までほぼ問題なく使えていたのですが、試験のとある局面で(対応不可能ではないがちょっと面倒な)不都合が生じ、その一場面だけ用意していたVirtualBoxベースのKali Linuxに切り替えました。

これからOSCPを目指す人達に向けては、こだわりがあればコンテナを使うことは(多少の不都合がはあるが)不可能ではないというのをお伝えできればなと思います。特にこだわりがなければおとなしくVMwareを使いましょう。

試験に向けたトレーニング

Hack The Box

PWKの登録をする前、2020年の9月末から2021年の1月末くらいまでの間は、主にHack The Boxをやりました。
Easy, Mediumのマシンを中心に30台ちょっとを攻略し、Pro Hackerになりました。

PWK PDF/Video

シラバス を見るとわかるのですが、このテキストのPDFとVideoには、基本的なLinuxコマンドの使い方や、シェルスクリプトの書き方といった、かなり初歩的な内容も含んでいます。私の場合は、ざっとまず目次を見て自分の理解がうすそうな部分だけを拾い読み・視聴しつつ、並行してPWK Labも進め始めました。

その後、最終的にはビデオは初歩的なところも含めてすべての章を流し見したのですが、無理して見る必要はなかったかなとは思っています。逆に、理解の薄かった章は、Labの攻略の際に何度か読み直したりもして参考にしました。

PWK Lab

PWK Labは、90日を選びました。事前情報で、Labには66台のマシンがあるということがわかっていたので、普通に仕事をしながらこれを1日1台以上のペースで解くのはきびしいだろうなという判断でした。本当はHack The Boxでもっと多くのマシンを攻略してから始めようと思っていたのですが、もろもろの検討の結果、2021年のゴールデンウィーク中に試験を受験するのが都合良さそうということがわかり、そこからの逆算で1月の末に始めることにしました。

Labの進捗の管理やNote Takingは、PenTest.WS というサイトを使いました。 単純にメモが書けるだけでなく、ポートスキャンの結果や、攻略の最中に見つけたクレデンシャルの管理ができるのでとても便利でした。

最終的に、ネットワークはすべて開放し、マシンは57台攻略しました

pentestws.png pwk-lab.png

Buffer Overflow対策

Buffer Overflowのマシンは、試験で必ず出るかつ25ポイントという非常に大きな要素なので、しっかりと対策をしておく必要があります。

Buffer Overflowに必要なバイナリやアセンブリの知識は、全く無かったわけではないのですが、ほぼ忘れ去っていたため、PWKの前に本を2冊読みました。

どちらもかなりわかりやすく解説してくれている本で、事前知識のない状態から読んでも大丈夫そうな感じでした。 これらの本を読んで基本的なことを思い出せている状態で、PWKの演習とLabのマシン攻略をやりました。
しかし、PWKの演習だけだと試験のBuffer Overflowマシンの対策としては不十分という情報をよく見たので、さらに TryHackMeのBuffer Overflow Prep をやりました。

結果として、これはとても大事な練習になりました。この演習に出てくる mona.py の使い方は確実に習得しておくのがおすすめです。ただ、全部で11のTaskがあるのですが、どれも攻略の手順は同じみたいなので、手順が理解できればすべてやる必要はなさそうでした。

Buffer OverflowのExploitは、Immunity DebuggerではなくGDB+PEDAでやるほうが楽な気もしたのですが、ここは変なアレンジをせずに教科書どおりにやりました。

試験準備

レポート記述用のツール

試験ではPDFでレポートを提出する必要があるので、その記述用のツールを選定する必要があります。
公式には、 Microsoft Word形式OpenOffice/LibreOffice形式 のテンプレートが用意されています。

また、有志が公開しているテンプレートも何種類か存在していて、Markdownで書いたものをPandocでPDFにしてくれるものもあったりします。

普段の仕事でドキュメントを書くときはほとんどMarkdownを使うので、OSCPのレポートもMarkdownで書こうと思っていたのですが、事前に何度か試しにレポートを書いてみたところ、このレポートに関してはマークダウン+Pandocだとちょっと大変かもしれないなと思い、最終的にはGoogle Docsを使うことにしました

大変そうと思ったポイントとしては

  • MarkdownからPDFへの変換の際、さくっと意図通りの見た目にならないことが多くて、その微調整が面倒だった
  • 記述が完了している箇所とまだ修正が必要な箇所の区別がつけづらい
  • コメント(/* */)を書くと、それが本文と区別しにくくなる
  • 画像は一度ファイルとして保存してからそのファイルパス記述する必要がある

あたりです。普段ドキュメントを書くときにはそもそもPDFの変換はしない、GitHub/Kibela等のエディタであれば画像はドラッグアンドドロップで埋め込めるといった事情によりそれほど問題ないのですが、今回は状況が違いました。

色々検討した末に、今回はGoogle Docsを使うことにしました。
これによって、

  • PDFに変換したときの見た目のギャップはほぼなくなった
  • テンプレ文言なので特に修正が必要ない部分・記述が完了していない部分・記述が完了した部分をそれぞれハイライトしておき区別しやすくした
  • コメントもGoogle Docsの機能を使うことで本文とは明確に区別できるようになった
  • 画像もクリップボードから直接貼り付けられる

という形でレポート記述の体験が向上しました。

スクリーンショットの残し方

レポートの中には、攻撃の手順の説明のために何枚ものスクリーンショットを埋め込む必要があります。
前述の通り、Google Docsにクリップボードから貼り付けられるようにしたので、シンプルな方法としては、Macでは [shift][command][4] + [control] が使えます。

この方法でも十分ではあるのですが、レポートをあとから見直したときに、「思った通りの範囲のキャプチャが取れてなかった」「実はDocsにペーストができていなかった」などの想定外があったときに困ります。あと、今回のように相当枚数のスクリーンショットを取らないといけない状況で毎回4キーを押すのはちょっと面倒でした。

理想としては、

  • より簡単な操作で
  • 意図した範囲のキャプチャをクリップボードに入れつつ
  • 同時にスクリーン全体のキャプチャをファイルとして保存

ができるとうれしいなと思っていました。

Macに内蔵のAutomatorや、Sketch等を色々試してみたのですが、最終的にはscreencaptureコマンドを叩く素朴なシェルスクリプトを書くところに落ち着きました。

#!/bin/bash

DATE=$(date +"%Y%m%d-%H%M%S")

screencapture \
	~/Desktop/OSCP_Screenshots/entire_display/${DATE}_screenshot_display1.png \
	~/Desktop/OSCP_Screenshots/entire_display/${DATE}_screenshot_display2.png

screencapture -i -c \
	~/Desktop/OSCP_Screenshots/parcial/${DATE}_screenshot_parcial.png 

これを /usr/local/bin/ssに置いておき、ss[Enter] もしくは [↑][Enter] と叩くだけでいいようにしておきました。

バックアップ

1回の受験の負担が相当大きいので、万が一手元の端末が壊れても試験を継続できるように準備している方が多いようです。
私の場合は、

  • 作業用ディレクトリに残すコマンド結果のログやスクリーンショットのファイルはGoogleのBackup and Syncを使ってGoogle Driveに同期
  • レポートはGoogle Docsで書いているので自動的にGoogle Drive上に保存される
  • 端末は1世代前に使っていたMacを使えるようにしておく

という準備で臨みました。

これは特に狙ってなかったのですが、Google Driveにスクリーンショットを置くことで、OCRで画像の文字列も解析されて、検索でひっかかるようになるので、レポートを書くときに必要なスクリーンショットを見つけるのがとても楽になるという効果がありました。

LinPEASによる不合格事件

この件についてはTwitterにも書いたのですが、それだけだと今後試験を受ける人の目に止まらないかなと思うのでこの記事にも改めて書いておきます。

試験の数日前、偶然Twitterでこんな不穏な投稿を目にしました。

内容としては、「linpeasが自動Exploitと判定されて試験に落ちた」というものです。
たしかに、OSCPの試験ガイドには、以下のように自動Exploitを禁止するレギュレーションが記載されています。

You cannot use any of the following on the exam:
Automatic exploitation tools (e.g. db_autopwn, browser_autopwn, SQLmap, SQLninja etc.)

LinPEAS というのはLinuxの権限昇格につながる設定の不備やシステムの使われ方等を膨大な数の観点で自動チェックしてくれるツールです。公式には案内されていないものの、多くの人が利用していて、デファクトスタンダードとなっていました。自動でチェックはするものの、Exploitまでは行わずあくまでExploitの糸口を探すだけのツールなので、nmap等と同じように問題なく利用できるツールのはずでした。

この出来事はDiscordなどで大きな議論を呼ぶことになりました。
公式の説明を要約すると、

  • LinPEASにはsudo tokenを利用した自動Exploitが含まれていて、これが違反と判定された。(Discord)
  • (該当のコード自体は2020年の8月からLinPEASに含まれていたにも関わらず)今までは問題なくて、今回だけ違反と判定された理由は、この自動Exploitが動作したのは今回が初めてだったから。 (Discord)
  • ペンテスターは自身の利用するツールが自動Exploitを含むかどうか等の内部挙動を把握しておくべきである。(Discord)

という話でした。
この説明に対して、「とはいえ膨大な量のすべてのコードを読みきるのは現実的ではない」「LinPEASはExploitのない探索ツールであるという認識は公知の事実だった」等の様々な反対意見も寄せられました。

最終的に、Offensive Securityは「UNDERSTANDING THE TOOLS/SCRIPTS YOU USE IN A PENTEST」という記事を公開しました。

この記事には、

  • LinPEASは非常に有名な列挙ツールであり、これに自動Exploitが入っていることは広く知られていることではない。
  • 今回の受験者に試験のチートを行う意図や悪意はないことは明白である。
  • よって今回は特例として該当者を合格にする。
  • しかし、ペンテスターが自身の利用するツールの内部挙動を把握する必要があるというスタンスに変更はないので、今後同様の事象があっても救済措置をとることはない。

ということが書かれていました。

尚、LinPEASはsudo tokenを暗黙的に利用していた箇所が修正され、現時点ではOSCPで利用しても安全(なはずである)という状態になりました。 トレーニングではLinPEASはかなり便利につかっていたので、これが使えなくなるとかなり辛い感じでしたが、結果としては引き続き使えるようになってよかったです。

試験当日

Proctoring Tool

前述の通り、OSCPの試験中はWebカメラと画面共有による監視を受けます。
そのために、Proctoring ToolというChrome+Extensionベースのツールを使うのですが、これが他の人達も書いている通りなかなか不安定でした。
画面共有がいつの間にか切れていること数回、ブラウザがクラッシュすること数回、OSごと落ちてしまうこと1回という感じで、なかなか厳しかったです。 MacBook ProのIntel Core i7・メモリ32GBのマシンで受けてこれだったので、スペック以外の観点でなにか問題があるみたいです。

タイムマネジメント

事前にスプレッドシートに時間の使い方の計画を書いておき、当日はそこに実際のタイムラインをメモしていくというやり方をしました。当日の分も記載したシートがこちらです。

timeline.png

見ての通り、当初予定していた休憩・睡眠はほぼ取らずにぶっ通しで試験を受けてました。
最終的に5台中4台を攻略し、(発表はされないので推定ですが)80ポイントで終了となりました。

(推定)70ポイントを獲得した時点で、減点のリスクを少しでも低くするためにその時点で解けていたマシンのレポートは全て書いていました。その結果、試験終了後のレポート記述はスムーズに進められ、約29時間経過時点で提出することができました。 レポートは、全部で62ページになりました。枚数はとても多いですが、中身にはスクリーンショットやテンプレ文言も多く含まれているので、純粋に62ページ分の文章を書くほどの大変さはないです。(が、すべて英語で書くのでそこはちょっと大変です。)

テキストにするとかなりあっさりしてますが、当日はとてもとてもしんどかったです。同じく深夜に渡る長時間の作業として、ハッカソンや深夜メンテナンス等の経験は何度かありますが、OSCPの試験は息抜きで話ができるチームメイトや同僚はいないので、かなり孤独な戦いになります。本当に魂が削られている感じがしました。

試験の難易度

試験のマシンを攻略するためのExploitは、それほど難しいものではなく、Labのトレーニングの範囲内でした。
しかし、Rabbit Hole(と呼ばれる一見穴に見えるが攻撃成立に結びつかない罠要素) が様々な箇所に散りばめられているので、その見極めに苦労しました。それ以外にも、攻撃成立を地味に難しくする要素もいくつかあり、全体的にいじわる(だが理解度を測るためには正しい)な構成な印象でした。

試験後

合格通知

レポート提出後、3日ほど待ったところで合格通知が届きました。 獲得ポイントは合格水準ではありましたが、直前でLinPEASの件もあったのでまったく安心はできていなかったので本当によかったです。

result.png

ちなみに、OSCPの合格はISC2の40 CPEとしてカウントできます。
今回の合格と、事前練習のHack the Boxのおかげで、CISSP維持に必要なCPEはかなり貯金ができました。

セキュリティ担当者としての学び

最初に書いた通り、私はセキュリティ企業ではなく、インターネットサービスを開発をする会社のインフラ・セキュリティを担当する立場で働いています。よって、今回の資格取得の経験においては、攻撃のテクニックだけでなく、それをどう防ぐことができるのかというのも考えながら勉強をすすめていました。

合格した今思うこととしては、OSCPで扱われるテクニックの範疇においては、

  • パスワードを使い回さない(使い回させない)、自動生成された複雑なものを使う
  • 十分な強度のハッシュアルゴリズムを使う
  • 最小権限の原則に従う
  • ソフトウェアのパッチをちゃんと適用する
  • ネットワーク・ホスト共にファイアウォールを有効化し、不要なポート開放をしない
  • Web・ファイル等のログを監視して、不審な大量アクセスの兆候に気付く

という、特別でもない普通の対策をやりきるだけでほとんどが防げるものであるということがわかりました。(これをやりきるのが難しいという話は当然あるのですが。) また、Security by DesignとしてサーバーをSSH less/Disposableに運用することの強力さも再認識できました。他にも細かい学びはたくさんあったのですが、長くなりすぎるので今回は割愛しておきます。

欲を言うと、昨今の現実環境に合わせて、

  • macOSのマシン
  • ActiveDirectoryの代わりにMDMを使っている環境
  • シグニチャ型のアンチウィルスだけでなくNGAVやEDRが使われている環境

あたりも追加されるとより嬉しいなというのはありました。(環境を用意するのが大変そうというのはなんとなくわかる。)

今後の予定

PG Play and PG Practice

PWK/OSCPにかかる費用は決して安くはないので、気軽にちょっとやってみるというのは難しいかもしれません。
そんなとき、Hack the Boxは1つの選択肢なのですが、Offensive Securityも PG Play / PG Practice という気軽に使えるサービスを提供しています。PG Playは、1日3時間までという制約があるようですが、無料です。まだ登録しかしてないのですが、後日やってみようと思っています。

OSWE

これだけ苦労して合格したOSCPですが、なんとOffensive Securityの資格の中ではエントリークラスに分類されています。
今のところ、時期は未定ですが次は OSWE というWebアプリケーションに特化したプログラムを受けようと思っています。

最後に

とても長くなりましたがOSCP合格までの道のりそこから学んだことでした。
この記事がこれからOSCPを受ける人の参考になったり、新たに興味を持つきっかけになってくれたら嬉しいです!気になること等あればTwitterでご連絡ください!