【Hacker101】Postbook_日本語WalkThrough

# 1. Hacker101とは

https://ctf.hacker101.com/

>About
Hacker101 CTF（Capture The Flag）は、安全で報酬のある環境でハッキングを学ぶために設計されたゲームです。Hacker101は、HackerOneによって運営されるハッカー向けの無料教育サイトです。このCTFは、世界を少しずつ良くするための計画の中で別の重要な要素です。一つのバグずつ、世界を改善することを目指しています。

バグバウンティなどで知られるHackerOneの運営するハッキング技術の学習環境です。
Web系の問題を中心にCTF形式の問題がそろっており、登録は必要ですが無料でできます。
自身で特別な環境を準備しなくてもいい問題もあるので始めやすいです。

一定のポイントを取るとHackerOneのバグバウンティでプライベートプログラムに招待される権利を得られます。
（権利が得られるだけですぐに招待されるわけではないです。）


# 2. 対象問題
今回はWebのEazy問題である**Postbook**のwriteupになります。

# 3. 環境
今回は特別な環境はいりません。
ブラウザがあればOKです。
わたしはEdgeで実施しました。

# 4. Writeup
## 4.0 対象サイトのチェック
まずはターゲットサイトの中身を確認していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/eade832c-074f-76e8-ea60-8aca3d7e9722.png)

>With this amazing tool you can write and publish your own posts. It'll allow you to write public and private posts. Public posts can be read by anyone that signs up. Private posts can only be read by you. See it as your own diary. We'll make sure that your private posts are safe with us.

なにやらポストというものを投稿できるサイトで、プライベートポストとパブリックポストを作成することができ、プライベートポストは自分しか確認できないらしいです。

Sign in , Sign upのページも見てみます。
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/ab5898e8-ac39-b9df-3a43-13cb2571feaa.png)
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/e799d3c3-d4f1-e451-cd22-4d9d0d035f2d.png)

UsernameとPasswordを登録し、その情報でサインインするようです。
適当に登録してサインインしてみましょう。
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/d235a2bd-56b8-e2e6-1cf6-1f27ae696970.png)
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/51e790ae-36a7-fb6b-a14b-8784db416cfa.png)
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/74bfaf2e-e3b4-5030-7938-2a3fa4949800.png)
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/6ab9c80a-d32b-a714-4210-b2766e48eb27.png)

他の人のポストが見れるようになり、自分も投稿できるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/ba27b952-4d60-6fc9-3a51-85c762a4bac2.png)

ポストは自由に内容を記載できそうです。

## 4.1 Flag 0
まずはサインインの画面での攻撃を試してみましょう。
以下のような組み合わせは試してみる価値があります。

- Username
    - admin
    - administrator
    - user
    - user01
    - anonymous
    - test
    - などなど
- Password
    - password
    - passwd
    - p4ssword
    - p@ssw0rd
    - test
    - (Null)
    - などなど

ツールなどを使って辞書攻撃を仕掛けてもいいです。
Kali linuxなどからhydraなどを使うのもいいでしょう。
今回はHacker101で見れるヒントを参照します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/19bd8079-ad6e-a8e9-3fe6-c6a850a5f7c1.png)

**↓**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/ba1b9e84-7e96-1e02-fb18-5be83c8b2616.png)

どうやら「user」という名前のユーザは簡単なパスワードが設定されているようです。

試しに
- Username -> user
- Password -> password

でサインインしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/3e86b988-507d-0499-35e8-1a441abce0f0.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/95a8cb44-8b6d-694f-8008-066da4c4c2db.png)

サインインすることができ、Flagも入手できました！

## 4.2 Flag 1
次はuserのポストを見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/c75a6ad8-8ea2-b742-f96e-74bed53a32bd.png)
プライベートポストはなさそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/b51e719f-99b4-3a32-8bcb-35e304810ec0.png)
ポスト自体は普通ですが、URLでidのパrメータを指定していることがわかります。
URLでパラメータを見つけたら変更してリクエストしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/c9733c26-cd5a-97a8-88a0-ade5a4f0c690.png)
id=1はadminの公開ポストです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/520785df-676d-8b69-e822-ab627e727794.png)

id=2でadminのプライベートポストを確認できました！
Flagを入手しました！

## 4.3 Flag 2
続いて、新しいポストの作成画面を確認します。
ブラウザの開発者ツールでhtmlを確認するとhiddenフィールドが設定されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/7a26e1f2-4bd5-a3a9-d09a-3888cf14468f.png)
user_idに2が設定されています。
一度サインアウトして自分で作成したユーザのhiddenフィールドも確認してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/4855388c-1d0f-e62a-0cb6-e2a3583e5781.png)
こちらはuser_idに3が設定されています。
そうなるとおそらくadminのuser_idは1でしょう。
valueを1に変更して適用にPOSTを作成してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/b3d03a3d-f015-8731-163a-9c926e065bb5.png)

**↓**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/6ccb9124-e6fc-f485-0e64-45420fc16081.png)

adminとしてPOSTを作成でき、Flagを入手できました！

## 4.4 Flag 3
Flag 3のヒントを見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/1a2b786c-4802-ddc6-13cf-c03c4478b1ca.png)
謎の計算式…
数字を入力する一番最初に思いつく箇所はPOSTのURLにあるidパラメータです。
- 189 * 5 = 945

ということでPOSTのURLにあるidパラメータを945にしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/4a0323ab-85f7-e3fd-33df-92ef50228f8f.png)

Flagが入手できました！

## 4.5 Flag 4
testユーザでなにかPOSTを作成してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/e50bebf8-2180-4ad7-1457-555ba7ea7e5b.png)

作成後にHOMEに戻るとPOSTのeditボタンで自分のポストが容易に編集できることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/a898ddf6-2a5d-0505-10b7-fc80ec84e8a4.png)
editページ移動するとこのページでもURLでidをしていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/e41c6d18-ea23-2e82-556b-700989a80e12.png)

idを変更してリクエストを送れば他人のPOSTも編集できてしまいそうです。
id=3のuserのポストを勝手に編集してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/383e96b3-4a99-e915-e0e6-4b099e7efaec.png)
**↓**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/74b7276a-a096-02c6-3fbe-9d85321e1475.png)

Save postするとFlagが入手できました！

## 4.6 Flag 5
これまで、一時的にadminのPOSTを確認したり編集したりすることはできても、adminでのログイン自体はできていません。
ユーザのログイン情報はCookieに保存されていることが多いため、ブラウザの開発者ツールでCookieを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/647ddc9d-0ceb-36ed-0d2e-f8bb599363dd.png)
Cookieの中にidがセットされています。
ハッシュ値っぽい感じがするのでオンラインのハッシュ値decryptツールに入れて確認してみましょう。

https://10015.io/tools/md5-encrypt-decrypt

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/ba125cd6-fa00-a392-041e-33aad36da305.png)
3という文字のMD5ハッシュ値であることがわかりました。
つまりこのCookieのidを1という文字のハッシュ値に変更してやればadminでアクセスできそうです。

先ほどのツールで1をMD5ハッシュ値に変換します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/c4e2c6fd-d702-e7ea-5d3f-7883f4140518.png)

>c4ca4238a0b923820dcc509a6f75849b

これを問題のページのCookieのidにセットしてページを更新します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/2ca7ccc6-14ef-9925-e68a-fb337ad332c5.png)
**↓**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/aaef1130-8a2b-1334-5d7d-a39c86dd0b9c.png)

adminとしてログインでき、Flagを入手できました！

## 4.7 Flag 6
HOMEを確認すると、editだけではなく、deleteの操作も可能です。
Flag 4の際には他人のPOSTを勝手に編集しましたが、他人のPOSTを勝手に削除することもできるのではないでしょうか。
いま、adminでログインできているので、adminのポストのdeleteボタンが押せます。
開発者ツールでボタンにセットされている処理を確認すると、idにハッシュ値らしきものをセットしており、そのidのページを削除するような処理に見えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/10183a60-8326-5be3-b1cb-83153c3afa1b.png)
ハッシュ値の解析は先ほどのツールで可能です。

いまセットされているのは該当のPOSTのidです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/4f69848f-e654-91cf-721d-17e659d98e74.png)

このハッシュ値をuserのPOSTのidである3に変更しuserのPOSTを勝手に削除してみましょう。
3のはハッシュ値は以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/eb48b745-6d9c-7241-1453-20ad85a69d05.png)

> eccbc87e4b5ce2fe28308fd9f2a7baf3

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/4e1bbcb5-73a8-3143-edc2-57cb6ae22376.png)
**↓**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475030/f617e0e1-6627-8de6-ad87-5544c4544db5.png)

最後のFlagが入手できました！

# 5. まとめ
Hacker101のPostbookを解いてみました。
脆弱な設定が重大な悪用につながることが理解できるいい問題だと思います。

この記事が皆さんのCTFライフの一助になっていれば幸いです。

# 6. 参考
- [Hacker 101](https://ctf.hacker101.com/)
- [HakcerOne](https://www.hackerone.com/)
- [Online MD5 Encrypt/Decrypt](https://10015.io/tools/md5-encrypt-decrypt)