高林の雑記ブログ

こんにちは。

OSWE Review(受験記)

3/28に受けたOSWEに合格したので受験記書きます!
若干冗長に書いてますがそこは許してください。

OSWE

OSWEはOffensive Security Web Expertの略で、AWAEというコースを受講して試験に合格するとOSWEの認定がもらえます。名前の通り内容はWeb ApplicationのWhiteboxベースでのPenetration Testです。
Web Applicationのソースコードや動作環境が与えられた状態でソースコードを分析して脆弱性を見つけて、Authentication bypass(認証バイパス)とRCE(任意コマンド実行)を達成するのが目的です。
OSCPはBlackboxですがOSWEはWhiteboxで全て背景で動いているものがわかっている状態です。

自身のスキル

OSCPを2020 5月にとってますが、WhiteboxのPenetration Testとかやったことないし何もわからん状態からスタートしました。
Webに関しては正直ド素人で最初は「なんもわかんね~」ってなってました。
(OSCPっていろいろな知識や考え方が必要な分、Webに関してはあんまり詳しくなくても良かった…)

AWAEコース

Offensive Securityの資格では、コース名と認定名は別で、OSWE認定のコース名はAWAEです。OSCP認定の場合はコース名はPWKです。
AWAEコースのコンテンツは、400ページくらいの英語のPDFとそれに対応するビデオと動作環境(9台のマシン)、3台の演習用のラボマシンです。ラボマシンの2台はWhiteboxで1台はBlackboxです。OSCP同様解説はありません。
基本的にはPDFに沿って動作環境で脆弱性の発見手順、Exploit手順を確認しながら進めていくことになります。PDFは10章から構成されていて、
1章はBurpとかの事前準備、
2章はAtmailというPHPアプリのXSS/RCE、
3章はAtutorというPHPアプリのSQL Injection/RCE、
4章は同じくAtutorのTypeJuggling、
5章はManageEngineというJavaServletベースのアプリのPostgreSQLSQL Injection、
6章はBassmasterというNode.jsのパッケージのeval Injection、
7章はASP.NETDotnetnukeというアプリのDeserialization、
8章はErpnextというPythonアプリのSQL Injection/SSTI、
9章はopenCRXというJavaアプリのWeak Random/XXE/RCE、
10章はopenITCOCKPITというアプリのBlackboxアプローチによるDom Based XSS/Command Injectionです。
詳しくは公開されている以下のシラバスを参照してください。
https://www.offensive-security.com/documentation/awae-syllabus.pdf

PDFには軽い演習のExcerciseとは別にExtra Milesという若干難しめの演習があります。大体はそんなに難しくはないですが、2つめちゃくちゃ悩んだExtra Milesがありました。

必要な知識

以下怪しい表現が散見されると思いますが大目に見てください…。
- プログラミングに関して
PHP Java JavaScript C# Pythonの基本文法、オブジェクト指向をなんとなく知ってる、MySQL PostgreSQLの基本文法、MVCの何となくの理解、JavaServlet ASP.NET Node.js のフレームワーク(?)の何となくの理解、くらい(?)
言語によって記述の仕方が若干違うので、ふんわりわかってればいいのかな?基本的にやる操作(リクエストパラメータから値をとって、サニタイジングしてSQL文に結合して検索して結果を返してtemplateにrenderするとか)は大体同じ気がします。ここら辺はコースをやってるうちに慣れてきます。
JavaScriptについてはNode.jsとブラウザとで両方わかってるといいと思います。
まあCTFとかのwriteup読んでいればいろんな言語が出てくると思うのでそれ読めるなら十分な気がします。
自分はJavaC#を今まで触ったことがなかったので大学のプログラミング演習をC#で書いたりいろいろググったりして練習しました。

いろんな言語のオンライン実行環境。system系のコマンドも使えて便利!
https://paiza.io/ja/projects/new
いろんなPHPのバージョンで実行できるので便利。
https://sandbox.onlinephpfunctions.com/

オブジェクト指向とかは自分は正直あんまりわかってないけど、「このメソッドの定義元を探すとインターフェースが見つかって、そのインターフェースを実装してるクラスのメソッドを見る」「ここでインスタンス生成して(インスタンス名).(メソッド名)で実行してるから、インスタンスを作成したクラスを見てメソッドの定義を確認する」くらいの意味がわかればいいのかな?ってくらいです。
コース資料ではMySQLPostgreSQLが出てきます。基本的なSQL構文は同じですが、若干の違いがあってSQL Injectionするときに知ってると便利なのでふんわりわかってるといいと思います
以下でMySQL,SQLite,PostgreSQL,MSSQLのオンライン環境があるのでInjectionを組み立てるときに確認とかに使ってました。
https://sqliteonline.com/

あとは正規表現の簡単なやつは見れば何やってるかわかるくらいでいいと思います。見てもよくわからんやつは 以下のサイトで動作を確認して理解できる程度でいいと思います。
https://regex101.com/

MVCは自分は雰囲気くらいしかわかってないですがそれで問題なかったです。もし全然一ミリも知らない場合はRailsチュートリアルとかで理解するといいと思います。(コースにRubyは出てきませんが)

フレームワークについてはいろいろ触ることにはなるので知らないものを触ることにはなりますが、知識はあるに越したことはないと思います。JavaServletだと設定は大体web.xmlに書かれていて読めばどのルーティングでどのサーブレットを使用するか、どこに認証が必要か、とかが書かれているけど知っていれば時短になるしPDFの理解も深まると思います。
まあでも自分はコースをやりながらここら辺の知識を回収したので事前に知ってる必要はないかもです。
ただAWAEコースでは基本的に言語やフレームワークについての解説はないです。
あとは基本的にPythonでExploitを書くことになるのでrequestとかの使い方をわかってるといいと思います。
- 脆弱性について
XSS(Reflective/DomBased)、Deserialization(.net/Java/python)、SQL Injection(union query,blind,stack query)、XXE 、FileUpload、TypeJuggling、SSTI、Command Injection、Weak Random(Java)、Sandbox Escape(JavaScript) などは事前に理解したうえでやるといいと思います。
XSSはCTFではCSPバイパスとかが主ですが、OSWEではXSSした後にそれを使ってAuthentication bypassするJavaScriptをXHRとかで作成するのが主な気がします。
SQL Injectionはblindで動作する自分用の動作するスクリプトは持ってるといいと思います。
SSTI(Server Side Template Injection)はどのPayloadが動作するかとかを事前にある程度知ってるといいと思います。
基本的にこれらの基本的な脆弱性の発生する箇所、条件、Exploit手順、できることなどは事前に知っておくといいと思います。CTFのwriteup読んでわかれば十分だと思います。

コースの感想

自分の時は60日コースと90日コースがあって、春休み中に取りたかったので60日コースにしました。いろんなレビューを読んでる限り結構60日コースを選択してる方が多い印象です。
自分は結局開始してから42日で試験受けたので60日くらいがいい塩梅な気がします。
ただ自分はOSWEを春休みに取ると決意したのが9月くらいからでそこからCTFのwriteup読んだり常設やったりといろいろ準備してたので、実は準備期間はかなり長いです。VMwareにKali-Linux-2020.4入れてやってました。OSCPではVMが配布されましたがOSWEではされなかったです。

コースでは主に脆弱性の発見プロセスとかを勉強するのですが、それが超よかったです。CTFとは違って対象はかなり大きめのアプリケーションなので、リアルワードでの脆弱性発見にかなり近いと思います。
個人的には、仕事で触ってるとかじゃない初心者に対してもとても良い教材だと思います。CVEを取ってみたいけどどうやって発見するのか全然想像がつかないって人にかなりお勧めです!実際、コースの勉強のためにソースコード分析したPHPアプリケーションで脆弱性を見つけて報告することができました!
こういうのって慣れがすべてな気がしていて、慣れるための教材としてAWAEはかなり良いと思います!

あと、今回は学生フォーラム以外にもRocketChatっていうチャットアプリで質問しました。OSCPとは違ってフォーラムに投稿があんまりないので、labマシンが全然わからなくて詰んだときにRocketChatの#awae-osweというルームで「OOがわかりません、DMしてもいいですか?」みたいな投稿をするとOffsecの社員が巡回しているので質問に答えてくれます。自分の時はめちゃくちゃ丁寧に対応してもらいました。もし詰んだときはこういうコミュニティで質問するのもありです。(もうすぐDiscordに移行するとか云々の話が出てるので今後はDiscordかもしれません)

自分はSQL Blind InjectionとかSSTIとかの発見した後のExploit手順の方はある程度CTFのwriteup読んで事前にわかってたんですが、コード読んだりの発見手順の方が全然慣れてなくて、「え、そんなことあんの!?」とか「あー、そうやって探すのか」みたいな連続でとても新鮮でした。
ただ自分はコードレビュー・開発の経験がゼロだったので慣れるまではしんどかったです。(今も慣れてるかといえば微妙)。個人的には、開発とかの経験はある必要はないですが、あればあるほどいいと思いました。

あと、コースでカバーされてる箇所以外にも実は脆弱性があって、ATutor、ManageEngineで見つけました。なので別の章でカバーしている脆弱性発見プロセスを違う章で試してみると勉強になると思います。

自分のスケジュール

日程 内容
2021 2/14 コース開始
2021 3/7 1周してExcerciseと簡単なExtra Miles完了
2021 3/18 残りのExtra Milesと2周目完了
2021 3/24 3台のlabマシン完了
2021 3/28 試験開始
2021 4/1 合格メール

勉強方法

自分も他の方同様チートシートを作りながらPDFを進めてました。
チートシートには、grepするキーワードとか検証コードとかと、試験のために情報をいい感じに整理するように書きました。OSCPの時同様CherryTreeを使いました。
あとはホストのVScodeVMwareのKaliにSSHで接続してPythonスクリプトを作成してました。
試験ではスクリプトを作成する必要があるので、コピペして再利用できるようにPythonスクリプトはコースの勉強中は整理して段階ごとに作成するといいと思います。

試験

試験は47時間45分で、そのあとに24時間以内に試験レポート提出します。
OSCPではラボレポートが5点分加点されましたが、OSWEではそれはなくて試験だけです。
合格基準は100点中85点以上で、2台のマシンのAuthentication bypass(35)、RCE(15)なのでRCEは一個なら見つけられなくても耐えです。
試験では合計5台のマシンがあって、2つはlocal.txtとproof.txtを入手する攻撃対象マシンで、その完全なコピーのデバッガマシンに対してWhiteboxで脆弱性を探します。デバッガマシンではデバッグできるようになってます。local.txt、proof.txtの場所は試験開始直後にメールで送られてくる試験コントロールパネルのリンクに記載されてます。あと一つは予備のKali VMでここからExploitを実行すると通信速度が速いです。

試験の予定

相変わらず心配性なので以下のような予定をたてて自分を安心させてました。試験時間48時間を8時間くらいの5分割してその中でAuthentication bypassとかRCEを一つ見つければOKっていう風にすれば残り時間で焦ることなく落ち着いてできるかなって思いました。(実際は全然この通りやりませんでしたワロタ)

試験当日メモ(予定)
脆弱性を特定できた時点でレポート書くためのメモ忘れない!!
VMをもう一度リバートしてExploitスクリプトが動くか確認

3/28 11:30 試験前 トイレとか済ませてVMを起動しておく
3/28 11:45 試験監督ツールのセット
3/28 12:00 一つ目のマシン開始。Debug、ログの設定してルーティングとか理解。怪しいExploit列挙して、AuthBypassの探索開始
3/28 13:30  1つ目のAuthBypassを探す。うまく行かなければ次のやつにチェンジ。
3/28 15:30 2つ目のAuthBypassを探す。うまく行かなければ次のやつにチェンジ。
3/28 17:30 3つ目のAuthBypassを探す。うまく行かなければ次のやつにチェンジ。
3/28 19:30 4つ目のAuthBypassを探す。うまく行かなければ次のやつにチェンジ。
3/28 21:30 ここからごはん。ここまでで最初のマシンのAuthBypassを特定できればGood!
3/28 22:00 もしAuthBypassがなければ2つ目のマシンにチェンジする!RCEの怪しい実装 (Debug、ログの設定してルーティング)とか理解。怪しい個所列挙して、RCE(AuthBypass)の探索開始
3/28 23:30 1つ目のRCE(AuthBypass)を探す。うまく行かなければ次のやつにチェンジ。
3/29 01:30 2つ目のRCE(AuthBypass)を探す。うまく行かなければ次のやつにチェンジ。
3/29 03:30 3つ目のRCE(AuthBypass)を探す。うまく行かなければ次のやつにチェンジ。
3/29 05:30 ここまででRCEがあればVeryGood!!その場合は二つ目ちょっと見てから寝る。一つのAuthBypassがあればGood!寝る!
一つもなくてもまだ耐えてる(両方のマシン見てるから気づけばすぐのはず)。その場合は同じ操作を再度繰り返す!新たに気づくことがあるはず!
3/29 10:00 起きる。二つ目(再度一つ目)のマシン開始。列挙
3/29 11:30 1つ目のAuthBypass(RCE)を探す。うまく行かなければ次のやつにチェンジ。
3/29 13:30 昼ご飯。
3/29 14:00 2つ目のAuthBypass(RCE)を探す。うまく行かなければ次のやつにチェンジ。
3/29 16:00 3つ目のAuthBypass(RCE)を探す。うまく行かなければ次のやつにチェンジ。
3/29 18:00 4つ目のAuthBypass(RCE)を探す。うまく行かなければ次のやつにチェンジ。
3/29 20:00 ここまでで1つのマシンと1つのAuthBypassがあればVeryGood!ほぼ合格!一つのマシンならまだ全然耐えてる。一つのAuthBypassでもギリ耐えてるはず!ごはん
3/29 20:30 1つ目のRCE(AuthBypass)を探す。うまく行かなければ次のやつにチェンジ。
3/29 22:30 2つ目のRCE(AuthBypass)を探す。うまく行かなければ次のやつにチェンジ。
3/30 00:30 3つ目のRCE(AuthBypass)を探す。うまく行かなければ次のやつにチェンジ。
3/30 02:30 4つ目のRCE(AuthBypass)を探す。うまく行かなければ次のやつにチェンジ。
3/30 04:30 ここまでで85以上あれば合格!まだ足りてなくても何とかなる!その場合は今から寝ずに粘る!。粘り1
3/30 06:30 粘り2
3/30 08:30 粘り3
3/30 10:30 粘り4。あと1時間15分
3/30 11:45 ここで終了

試験の現実

日程 内容
3/28 11:30 試験開始30分前なのでVM起動して机の前に待機してリラックスしてました
3/28 11:45 監督用ツールにログインして試験監督とパスポート見せたり部屋見せたりの事前準備
3/28 12:00 試験開始
3/28 14:08 一つ目のAuthentication bypass特定
3/28 16:32 一つ目のRCEゲット
3/28 18:15 いろいろわかってなくててこずったけどPoC完成
3/28 20:30 ごはん食べる
3/28 22:05 二つ目のAuthentication bypassゲット
3/29 01:28 二つ目のRCEもゲット
3/29 03:31 二つ目のPoC完成。100点ゲット。あとはレポートだけ。いったん寝る
3/29 10:00 起床してレポート書き始める
3/30 04:00 レポート書き終わって何回も確認してOKそうだったので提出。ここで試験も自主終了

試験の感想とアドバイス

結局15時間で100点分ゲットしてかなり余裕のある試験となりました。二日目はずっとだらだらレポート書いてました。
難易度的には他の方と同じ意見で、そんなに難しくはなかったです。基本的にはPDFで学んだことが試験に出るのでOSCPみたいに何が出るかわからないって感じではないです。というかOSCP24時間って改めて思うとおかしいですね。36時間くらいあっていいのではって思います笑。PDFのExcercise, Extra Miles, Labマシンはすべて完了することを強くお勧めします。
コースの内容的にはOSCPよりも難しいですが、PDFを理解できてるなら試験は問題ないと思います。
アドバイスとしては、最終的に一つのPythonスクリプトを実行するだけでAuthentication bypassとRCEしてReverse shellが降ってくるようにする必要があるのですが、ローカルのKaliでは動作してるけど試験で与えられる予備のKali VMでは動かないみたいなことが起こりうるので基本的には予備のKali VMでPoCを実行するといいと思います。自分はローカルで127.0.0.1の8080のプロキシを経由するようにスクリプトを作成してBurpでデバッグできるように書いてたんですがそれを予備のKali上で実行すると動かなくてあぶねーとなりました。

あとはAnarkhさんの試験に対する取り組み方が非常に参考になりました!ガチのがちがちで参考になりました!試験では性質上Authentication bypassの後にRCEができるのでそれを考慮すると脆弱性がありえる箇所はかなり絞れます。自分が試験10日前くらいにこの受験記を読んだのでタイミングがめちゃくちゃよかったです。
https://tento.hatenablog.com/entry/2021/03/11/061921

自分は試験レポートは最終的に77ページとなりました。OSCPの時同様Wordで書きましたが、正直めちゃくちゃやりづらかったです。他の方が言ってるMarkdownで書いたものをPDFに変換するツールでやればよかったなって思いました。
あといきなり試験レポート書く前に、ラボマシンの一つで試しにレポート書く練習をしました。

OSCPの時は試験前はめちゃくちゃ緊張してましたが今回は2回目なのであんまり緊張することなく受けることができました。自分は10日前に試験を予約しましたが結構ガラガラでした。
試験中はOSCPの時同様ボカロ・アニソンメドレーを聴いてました。画面共有してるので画面に映るたびに気まずかったです。
f:id:kakyouim:20210402025401p:plain

自分は事前に作成していたチートシート通りの手順でチェックしていってたので脆弱性を特定するまではほぼ作業って感じでした。 脆弱性発見が試験の一番難しい部分ですが、特定さえしてしまえばExploitはできるので落ち着いて作業すれば大丈夫だと思います。

脆弱性発見手法(我流)

BlackboxとWhiteboxの両方の観点でメモしていきます。

Blackbox

  • loginが必要なページとそうでないページの確認。
  • Burp Suiteのリクエスト内容を確認。
  • loginページ、Password forgotページ、SQLを実行してるっぽいページの確認

    Whitebox

  • watch -n1 -d 'find /tmp /usr /var /etc /home /opt -mmin -5 2> /dev/null'
    logファイルの更新とかファイルをアップロードしたときにどこにアップロードされるかを監視できるコマンド。
    5分前までに更新されたファイルを2秒おきにチェックします。結構便利だけどコースでは特に触れられてません。自分はいいと思います。
  • find . -name '*.sql' *.ini .htaccess *.sh
    初期設定とかDBのクレデンシャルとかが書かれてるファイルがあるかもなので一応チェック。
  • DataBaseらへん
    DBにアクセスするユーザーの権限によってできることがわかる。
    PostgreSQLのバージョンによってできるExploitが違う。
    DBのクレデンシャル情報を特定してログインして、テーブル名とかその中身とかを確認。ユーザー当たりのテーブルは特に要チェック
  • サーバーまわり
    PHPならバージョン確認(TypeJugglingはバージョンによって挙動が違う)
    Javaならweb.xmlとかの設定ファイル読む。
    .envファイルとか読む。
    webrootの場所を確認、書き込み権限の確認(FileUpload)
    ロギングの設定とかPHPのerror出力とかを設定する。
  • loginまわり
    loginまわりのコードを読めばそのアプリでのコードの雰囲気が大体わかる気がするのでまずここから毎回調べました(試験でも)。
    まずブラウザからログインページにアクセスして、適当にユーザーとパスワードを送信してみて、そのリクエストをBurpでチェックして、/loginとかusername=aaa&password=aaaとかのキーワードをチェックして/login,username,passwordとかで検索してどのファイルでログイン処理されてるのか特定する。
    そこで、送信したリクエストパラメータをどうやって取り出してるのか($_REQUEST[],requestParameter(),requestParams[]とか)をチェックする。
    そこで取り出した値をどういう風に使ってSQLを実行してるのかチェック。
    ここら辺をまずチェックしておけば、ルーティング、リクエストパラメータの扱い、DataBase周辺を理解できるのでその後のコードレビューがはかどる気がします。

    grepキーワード

  • SQL Injection
    query,select.*from,select.*request.*parameter,update,insert,sql,doGet[\s\S]*?select.*?\+
  • Password Reset
    reset,token,key,(reset|change)pass(word|wd)
  • XXE
    xml,parse,(SAXParserFactory|DOM4J|XMLInputFactory|TransformerFactory|javax.xml\.validation\.Validator|SchemaFactory|SAXTransformerFactory|XMLReader|XMLStreamReader|SAXBuilder|SAXReader|javax.xml\.bind\.Unmarshaller|XPathExpression|DOMSource|DocumentBuilder|StAXSource),simplexml_load_string,loadXML,simplexml
  • Weak Random
    java.util.Random,new Random(
  • XSS
    document.write
  • SSTI
    .render,template,(smarty|twig|velocity|freemarker|eval|mako|jinja|tornado|jade|pug|nunjucks|dot|dust|marko|ejs),render_template_string,render_template
  • File Upload
    upload,request\..*upload,path,file,request\..*filename,FileOutputStream,.getFileName(),move_uploaded_file,\$_FILES\[,tmp_name,extract,zip,extension,str_replace
  • Eval (Command) Injection
    eval(
  • Deserialize
    deser,readObject(,Type.GetType(,xmlSerializer,(readExternal|readUnshared|XStream),pickle.loads(,unserialize

参考資料

OSWEはOSCPと違って勉強方法がよくわからんくてやりづらいと思うのでもし何やればいいか何もわからん人は以下の資料を読むといいと思います。
基本は自分が確認した過去CTFの問題名とか解説記事、常設のリンクを載せてます。
他にもhackerOneのレポートはコードレビューの練習にいいと思います。

whiteboxについての資料

https://pentesterlab.com/exercises/codereview/course
https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html
https://github.com/softwaresecured/secure-code-review-checklist
https://alex-labs.com/my-awae-review-becoming-an-oswe/
https://stacktrac3.co/oswe-review-awae-course/

grepベースの脆弱性発見

https://littlemaninmyhead.wordpress.com/2019/08/04/dont-underestimate-grep-based-code-scanning/
https://github.com/dustyfresh/PHP-vulnerability-audit-cheatsheet
https://github.com/wireghoul/graudit
https://find-sec-bugs.github.io/bugs_ja.htm

SQL Injection

Directry Traversal

InterKosenCTF 2020 miniblog(Docker環境有り)

SSTI

XSS

CTFでのXSSはCSPバイパスとかが主でXSS自体は簡単に見つかることが多いので、そういうやつは省略してますm(__)m
HackerOne CTF:Micro-CMS v1(常設)
Intigriti's December XSS Challenge 2020
以下のXSSまとめみたいな常設が良い。
http://bogus.jp/xsssample/
http://xss-quiz.int21h.jp/
https://domgo.at/cxss/example
XSS Challenge(セキュリティ・ミニキャンプ in 岡山 2018)(ただもう動いてなさそう…)
https://www.pentesteracademy.com/course?id=11

Deserialize

XXE

ASIS CTF Quals 2020 Treasury #1 #2
SHARKY CTF 2020 XXEXTERNALXX
FireShell CTF 2019 - Bad Injections
BsidesSF CTF 2019 - svgmagick
Nuit du Hack CTF Quals 2017 No Pain No Gain
Securinets CTF Quals 2019 Feedback
HamaCTF xmlvalidator
VolgaCTF-quals Shop quest

Command Injection

HackTheBox

HTBは基本的にBlackboxなのであんまりOSWEとは違うかなとは思いますが、Exploitを自分で書く練習としては良いかなと思います。
falafel
help
holiday
unattended
zipper
Celestial

以下のリンクにOSWEライクなマシンがまとまっています。BlackboxですがExploitの練習には使えると思います。
https://docs.google.com/spreadsheets/d/1dwSMIAPIam0PuRBkCiDI88pU3yzrqqHkDtBngUHNCw8/htmlview#

最後に

最後まで読んでいただいてありがとうございます!
以前は脆弱性発見とかなんか難しそうで自分にはかなり先の話しそうだな…と思ってたんですが、OSWEの勉強をすることでそこら辺の必要な知識とかが明確になっていって驚きました。OSCPはTryHarderって感じの資格ですが、OSWEはそれよりKeepTryingって感じな気がします。慣れてるか慣れてないかの世界なのでやり続ければいずれ必ず到達できる資格だと思います。
自分のような初心者に向けて、脆弱性発見とかCVE取得への道の参考になれば幸いです!
なにかわからないこととか不明な点があればTwitterのDMで相談に乗ります!