tryhackmeのOWASP Juice shopでセキュリティを学ぶ

## owasp juice shopとは？

owaspとはどういう団体かを調べてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622760/9817e5f6-a5ac-46e5-9e6a-6911df343685.png)

([引用](https://owasp.org/www-chapter-japan/))

このowaspが提供している、脆弱性があるやられサイトがowasp juice shopです。
これを実際に攻撃してみて、webセキュリティを学ぼう、という趣旨のものみたいです。

## 利用方法

owasp juice shop自体はさまざまな方法で遊べるらしいのですが、
今回はtryhackmeというセキュリティが学べるサービスがあるのでこれを使いました。
tryhackmeはさまざまなコースが提供されていて、いろいろな攻撃手法を学べるらしいです。
サブスク登録しないとできないコースもありましたが、owasp juice shopは無料で遊べます。

https://tryhackme.com/room/owaspjuiceshop

## はじめ方(openvpn接続)

tryhackmeでは他の環境に迷惑かけないようにopenvpnでtryhackme側と接続する必要があるらしいので接続してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622760/eda636e7-0485-488c-bc20-aa7a137e1c14.png)

configファイルをダウンロードして、

```
sudo openvpn --config <username>.ovpn
```

で簡単に接続できました。

openvpn自体はmacを使っているのでbrewでとってきました。

## やられサイトを立ち上げる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622760/3dd5ca70-f6ca-401a-a21b-47d7ff160dfa.png)


owasp juice shopのルームに参加して、start machineを押して1分程度で専用のipが払い出されました。
どうやら1時間限定で自分専用のインスタンスが立つみたいです。
`add 1 hour`というボタンがあったので押してみたら、期限を伸ばせました。
延長自体は無料でできるみたいです。

openvpnにつないだ状態でアクセスしてみると無事サイトを見ることができるようになりました！


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622760/6562b4ff-4db8-48c4-9256-1db7efcaa189.png)


タスクが用意されていたのでタスクに沿って進めていくことにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622760/7395e815-641c-4060-a2db-0d703fbb890d.png)


## Task1

やられサイトを立ち上げましょうというチュートリアル的なものだったので終わっていました。

## Task2

サイト内を探索すれば見つかるadminのメールアドレスとかを探すタスクでした。
あまり紹介することもないので省略します。

## Tasks3

### Question #1: Log into the administrator account!

Task2で見つけたadminのメールアドレスを使ってadminでログインしてみましょう、というもの。
タスクにSQLインジェクションを使いましょう！とかいてくれていたので、素直にやったらログインできてしまった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622760/28ce393a-2dff-4d67-be1e-8f13e02e39e7.png)

これはユーザーを引っ張ってくるSQL文が

```SQL
SELECT * FROM Users WHERE email = '<email>' and paddword = '<password>'
 ```

となっているときに上のように入力すると

```SQL
SELECT * FROM Users WHERE email = 'admin@juice-sh.op'--' and paddword = '<password>'
```

となって、passwordの入力がコメントアウトされて実行されてしまうのを利用した手法ですね。

### Question #2: Log into the Bender account!

↑と全く同じようにしてログインできました。


## Task4

### Question #1: Bruteforce the Administrator account's password!

adminのパスワードを総当たり攻撃しよう！というものです。
まずはリクエストフォーマットを見てみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622760/a62de9c6-3837-43fd-91a7-c1aeae5ff3e6.png)

このbodyのpasswordフィールドで含めているパスワードを変えてリクエストを投げ続ければ良さそうです。
タスクの中に便利なツールとして、burp suiteというものが紹介されていたので使ってみました。

https://portswigger.net/burp

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622760/aeccb517-9fc0-4a6b-8b89-dd6f8bd3a8b7.png)

これを使うと↑のようにPayload configurationに設定した辞書で総当たりリクエストしてくれるみたいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622760/cc43ae22-c71c-4591-ad20-8e5a3af812f5.png)

↑パスワードが違うので401が帰ってきていますね。

辞書はSecListsというものを使いました。

https://github.com/danielmiessler/SecLists

そして10分ほど待っていたらstatusCodeが200が返ってくるものがきました！
ウキウキでパスワードを見てみると`admin123`という何とも弱々しいパスワードだということがわかりました...

## Task5

### Question #1: Access the Confidential Document!

/aboutから踏める/ftp/legal.md で利用規約がマークダウンファイルそのまま公開されています。
さらに、/ftpも公開されてしまっていて、これをふむと色々なデータを確認することができてしまいます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622760/1b430528-5dbf-47ef-bd39-44ce602128ab.png)



acquisitions.mdを取得したらフラグがもらえました。

### Question #3: Download the Backup file!

package.json.bakがあることが確認できるので、これをダウンロードしたいです。
そのままクリックすると↓の画面になってしまいます。
どうやら.mdファイルか.pdfファイルしかダウンロードできない設定らしいです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622760/b20595db-3b35-4312-9bfe-8b8d94931827.png)

しかし、これはpoison null byteという手法を使って
`/ftp/package.json.bak%2500.md`
をgetすることで入手可能でした。

nullbyte攻撃は
文字列処理でnull byte（`\0`）が文字列の終わりを意味してその後ろの文字列を切り捨てることを利用したものです。

- クライアントサイドでpackage.json.bak%2500.mdをサーバーにリクエストするとデコードされて、package.json.bak%00.mdとなる。
- その後、URLのデコード処理を走らせるとpackage.json.bak\0.mdとなる。

webサーバー側でURLのデコードしてくれているのにプログラムでもデコード処理をしてしまっている時にプログラム内で.pdfと.md以外は弾く、みたいな処理をしていると、
そのフィルタ段階ではpackage.json.bak%00.mdをみてOKになって、
ファイル読み込み部ではヌルバイト以降が切り捨てられ `package.json.bak` がダウンロードできるようになってしまう

みたいな挙動(のはずです)

無事ダウンロードできて、フラグが取得できました。

--- 

今回はここまでタスクが完了しました。

## 余談

自分が進められたところまでのタスクにはまだ出てきていなかったが興味本位でXSSしてみたらできてフラグがもらえました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622760/ce62bcf5-76bb-4418-b7dc-22231ab1f67e.png)

どんなパスがあるかを調べるためにdirbコマンドで見ようとしたらなんかフラグが2個もらえました(なぜもらえたかよくわかってないです)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622760/46df9904-22de-4725-8a44-036ece9f8d68.png)

## 感想・おわりに

今回は少ししか時間がとれなかったので初歩の初歩しかできなかったがowasp juice shopにはまだまだ先はあるので引き続きやっていきたいと思っています
web開発をする以上、セキュリティはついて回るものなので、セキュリティについて理解し、開発で活かしていきたいです