OSWE 2020 review

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253111/152f89b9-aac1-6636-230a-66b25afd8817.png)

## はじめに
この記事は<a href="https://qiita.com/advent-calendar/2020/ipfactory">IPFactory Advent Calendar 2020</a>の9日目の記事です

今年の10月に<a href="https://www.offensive-security.com/awae-oswe/">OSWE</a>を受験したので、その感想を書いていこうと思います。


## OSWEとは
Webアプリケーションのペネトレーションテストに特化した試験です。
ソースコードとその実行環境を使用して、グレーボックスで脆弱性を見つける方法が学べます
公式によると、OSCPより難易度が一つ上ですが個人的には変わらないと思います。
あと、OSWEを取得する前にOSCPを取ることを推奨されていますが、OSCPの知識はほとんど使わないのでWebペンテスターになりたい人はOSWEからでも問題ないと思います。
OSCPは、既知の脆弱性を使用してシェルを取って、権限昇格するのをメインでやるのに対して、OSWEでは脆弱性を自分で見つけてExploitコードを作成するのがメインになっています。
何が学べるかは<a href="https://www.offensive-security.com/documentation/awae-syllabus.pdf">シラバス</a>をご参照ください

### 試験内容
試験には4台のマシーンがあり、2台のターゲットとそれらのデバッグ用マシーンが2台与えられます
各マシーンには、異なる言語で作られたWebアプリケーションがあり、デバッグ用マシーンでアプリケーションをデバッグしながら脆弱性を見つけてそれらをチェーンさせて、最終的に実行するだけでシェルが降ってくるようなExploitコードを作成する必要があります。
試験時間は47時間45分で、その後24時間以内に攻略手順を詳細に英語で書いてレポートを提出する必要があります。
100点中85点とれば合格です。OSCPと違って、ラボレポートによる加点はありません。
また、OSCP同様、Webカメラでの監督者による監視と画面共有があります。



### 受験料

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253111/9d72c27b-8c67-4a87-3245-c79e29d0ece4.png)
OSCPより高いのは、多分ラボが共有ではなく一人一人に与えられるからだと思います。
自分は2ヶ月のラボを申し込みました。
OSCPに比べると量が少ないですが、2020年の7月にアップデートされ量が増えたのと、ExtraMilesという演習問題が中々難しかったのでちょうど良かったです。


## OSWEを受ける前に勉強したこと
<details><summary>以下の技術と脆弱性について理解しているとラボがスムーズに進めます<br>（リンクは自分が勉強に使用したサイトです）</summary><div>

- **XSS**
 - https://portswigger.net/web-security/cross-site-scripting
 - https://pentesterlab.com/exercises/xss_and_mysql_file/course
- **CSRF**
 - https://portswigger.net/web-security/csrf
- **ファイルアップロードRCE**
 - https://www.root-me.org/en/Challenges/Web-Server/File-upload-Double-extensions
 - https://www.root-me.org/en/Challenges/Web-Server/File-upload-MIME-type
 - https://www.root-me.org/en/Challenges/Web-Server/File-upload-null-byte
- **SQL Injection**
 - https://portswigger.net/web-security/sql-injection
 - https://pentesterlab.com/exercises/from_sqli_to_shell_II/course
 - https://pentesterlab.com/exercises/from_sqli_to_shell_pg_edition/course
- **PHPの緩い比較**
 - https://www.root-me.org/en/Challenges/Web-Server/PHP-Loose-Comparison 
- **PHPのタイプジャグリング**
 - https://www.root-me.org/en/Challenges/Web-Server/PHP-type-juggling 
- **Server Side Template Injection**
 - https://portswigger.net/web-security/server-side-template-injection 
- **XXE**
 - https://portswigger.net/web-security/xxe
- **安全でないデシリアライゼーション**
 - PHP
     - https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-arbitrary-object-injection-in-php
     - https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-developing-a-custom-gadget-chain-for-php-deserialization
     - https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-exploiting-php-deserialization-with-a-pre-built-gadget-chain
     - https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-using-phar-deserialization-to-deploy-a-custom-gadget-chain
     - https://pentesterlab.com/exercises/api_to_shell/videos
     - https://www.root-me.org/en/Challenges/Web-Server/PHP-Serialization
     - https://www.root-me.org/en/Challenges/Web-Server/PHP-Unserialize-overflow
 - Java
     - https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-developing-a-custom-gadget-chain-for-java-deserialization
     - https://pentesterlab.com/exercises/objectinputstream/course
     - https://pentesterlab.com/exercises/jserialize_01/scoring
     - https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-exploiting-java-deserialization-with-apache-commons
 - C#
     - https://buuoj.cn/challenges#%5BWindows%5D%5BHITCON%202018%5DWhy-So-Serials  
- **WebSocket**
 - https://portswigger.net/web-security/websockets 
- **なにか一つ適当なスクリプト言語**
 - Exploitコードを作る際に必要
 - PDFの解説ではpython2が使われてます。自分はpython3を使用しました。
- **正規表現**
- **Webアプリケーション**
 - 基本的な文法とオブジェクト指向と各言語でのルーティングがわかっていれば、後は雰囲気で読めます
 - PHP
 - Java Servlet
 - ASP.NET(C#)
 - NodeJS
 - flask(python)


</div></details>



## AWAEの進め方
何が正解かはわからないですが、自分はExtraMilesという難しめの演習は飛ばしてとりあえず一周しました。
2周目は復習しつつExtraMilesと解説のないボックス3台を攻略するという進め方をしました。
結果的に、1周目よくわからなかった箇所がわかったり、新たな発見があったりと2周したおかげで脳内により内容が入ってきた感じがしました。



## 良かった点
AWAEの良かった点をあげていこうと思います。

**【 大規模なソースコードを読むのに少し抵抗がなくなった 】**
解説に使われているWebアプリケーションが実在するCMSで、かなりソースコードの量が多くて最初の方しんどかったのですが、読んでいるうちに慣れてきて、着眼点などがわかってきて少し抵抗がなくなりました
あと、なんとなくサーバ側の処理が想像できるようになったのも良かったです。

**【 XSSの脅威を再認識できた 】**
OSWEを受けるまで、XSSの脅威がいまいちわかっていなくてCookie盗んだり、ホームページを改竄することができるくらいかと思っていたのですが、XSSでここまでできるんだーっていうのが学べたのは自分の中で大きかったです。
あと、小さい脆弱性が連鎖すると大きい脅威につなげることができるというのを実践を通して学ぶことができたのも良かったです。


**【 デバッグ/ログ 】**
各種言語でのデバッグや、ツール（VSCode,JD-GUI,dnSpy）を用いてのデバッグ・デコンパイル
ログの出力なども知らないことだらけだったのでこれも良かったです。


**【 攻撃の知見 】**
PostgreSQLのラージオブジェクトによるリバースシェルなど、知らない攻撃の知見がいくつか得られました。



**【 CVEチャレンジ 】**
OSWEで得た知見で、某CMSの脆弱性報告ができました





## いまいちだった点

**演習のボックスが3台しかない**
OSCPみたいにたくさん演習のボックスがあるわけではなく、ホワイトボックスが2台とブラックボックスが1台しかないので、自分は<a href="https://github.com/rkhal101/Hack-the-Box-OSWE-Preparation">この表</a>のHackTheBoxを解いて補いました。


**解説でよくわからない箇所がある**
OSCPの時は、なかったのですが途中解説が『???』なところが何ヶ所がありました。
ただ、動画で詳しく解説されているので困ったら動画を見るようにしてください


ということで、Webペンテスト入門したいけど、何からやっていいかわからないという方にはおすすめです。
ただ、CTFをやりまくってる人にとっては物足りないかも。


## 試験のタイムライン
当日の試験のスケジュールです。


**[12:00]**
試験開始
一台目のボックスに取りかかる
デバッグマシンにはRDPで接続するのですが、動作がモッサモッサしてて非常にやりづらかったです。

**[21:00]**
認証バイパスに成功
ルーティングがよくわかってなくて苦戦しました。


**[22:00]**
シェル取得
2台目のボックスをチラ見して、休憩しました。

**[9:00]**
2台目のボックスに取りかかる
こちらはサクサク動いて、とてもやりやすかった。


**[16:00]**
認証バイパスに成功


**[21:00]**
シェル取得 & 休憩


**[22:00]**
スクリプトを作成したり、スクリーンショットを取ったりレポートを作成したりし始めました。


**[11:45]**
試験終了
なんとか試験中にレポート提出までいけました。
OSCPより時間に余裕があると思うので、ゆっくり取り組んでいいと思います。


## レポート
レポートについては<a href="https://qiita.com/Howtoplay/items/2145ffea1ebf1b653cf7#%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88">OSCPの時と同じ</a>なので割愛させていただきます
レポートの枚数は70ページくらいになりました。



## 最後に
まだまだ、ペンテスターと名乗るには程遠いですが、成長できたことは間違いないので
この小さな成長を積み上げていつかペンテスターになれるよう頑張りたいと思います。