今回は、HTB(Hack The Box)Labの「Starting Point」のTier 1マシン「Sequel」を攻略していきます。

「Sequel」は、SQLをテーマにしたマシンです。

マシンを攻略する前に、SQLについて簡単に調べておくと、効率的に学習を進められます。


なお、本記事では、Kali LinuxからHTBへVPN接続して、マシンを攻略します。

まだ、環境構築が済んでいない方は、以下の記事をご覧ください。


サイバーセキュリティ入門‐環境構築編1|VirtualBoxの導入

サイバーセキュリティ入門‐環境構築編2|Kali Linuxの導入と初期設定

サイバーセキュリティ入門‐環境構築編3|HTBのアカウント作成とVPN接続


※本サイトでは、HTBの記事作成ガイドラインに沿って、記事を作成しています。


1.「Sequel」の学習準備

まずは、以下の手順に従って、「Sequel」の学習準備を済ませましょう。



上記の手順は、別の「Starting Point」マシン攻略でも流れは共通です。

今回初めて「HTBのマシン攻略」に触れるという方は、以下の記事で学習準備について詳しく解説しているので、参考にしてください。


サイバーセキュリティ入門‐実践編1|実際にHTBのマシン「Meow」を攻略してみよう


1-1.取得したIPアドレスを変数に入れておこう

上記の「Start Machine」からマシンを起動したあと、画面にIPアドレスが表示されます。

マシンの攻略では、このIPアドレスを度々使うのですが、毎回入力するのは手間です。

そこで、IPアドレスに名前をつけて保存し、簡単に使えるようにしましょう。


ターミナルを開き、以下のコマンドを実行します。


$ exportIP={IPアドレス}


これで、IPアドレスを以下のように、「$IP」で使えるようになりました。


変数の使用例

$ echo $IP
$ ftp $IP
$ nmap $IP


1-2.回答時の注意点

HTBのVPNに接続する際、フルトンネル(全ての通信が強制的にHTBにルーティングされる)になることがあります。

そうした場合、Webブラウザで開いている学習ページへのアクセスも「HTB内部ネットワーク経由」になり、接続が不安定になる場合があります。

その結果、「Task」や「Submit Flag」の送信時、通信エラーが発生する場合があります。


「Task」や「Submit Flag」の送信に失敗する場合は、以下の方法を試してみてください。



2.Task1「During our scan, which port do we find serving MySQL?」

設問の意味は、「MySQLが動いているポートはどれですか?」です。


では、ターミナルを開いて、以下のコマンドでポートスキャンを実行しましょう。


$ nmap -T4-sV $IP

※-T4:高速スキャン用のオプション。

※-sV:動いているサービスのバージョンを検出するスキャンオプション。


すると、以下のようなスキャン結果が返ってきます。

https://i.gyazo.com/e51e451fea9dd89df0f4fcba489dd404.png

スキャン結果より、Task1の正解は「3306」と分かります。


3.Task2「What community-developed MySQL version is the target running?」

設問の意味は、「マシン上では、どのようなバージョンのMySQLが稼働していますか?」です。


Task1のポートスキャンで、サービスが動いているポートが判明したので、次は動いているサービスの詳細を調べます。


動いているサービスについて詳細を調べるために、今回はNSE(Nmap Scripting Engine Script)を使ってみましょう。

NSEは、Luaという言語で書かれた「サービス調査や脆弱性のチェックを自動化するスクリプト」です。


では、以下のコマンドでポートスキャンを実行しましょう。


$ nmap -p3306 -sV -sC $IP

※-p:ポートを指定するためのスキャンオプション。

※-sV:バージョンを特定するオプション。

※-sC:デフォルトのNSEスクリプトを実行するオプション。


すると、以下のようなスキャン結果が返ってきます。

https://i.gyazo.com/2694f67a4c91274b8c617eef1e604d7a.png

よって、Task2の正解は「MariaDB」です。


スキャン結果から読み取れる内容

  • 「Protocol: 10」: MySQLプロトコルのバージョンは10
  • 「 Version: 5.5.5-10.3.27-MariaDB-0+deb10u1」:
    • MariaDBのバージョンは10.3.27
    • Debian 10(Linuxディストリビューション)向けのパッケージ
  • 「Some Capabilities:」:MySQの機能一覧
  • 「Salt: ?rA,YZ9LS;m5`aH#tA)E」:認証時に使用するソルト値
  • 「Auth Plugin Name: mysql_native_password」:MySQLの古い認証方式


4.Task3「When using the MySQL command line client, what switch do we need to use in order to specify a login username?」

設問の意味は、「MySQLのコマンドラインを使用する際、ログインユーザー名を指定するには、どのようなオプションを使えばいいですか?」です。


では、 MySQLのヘルプコマンドを使って、ログインユーザー名を指定するを探してみましょう。

$ mysql -?


すると、以下のような記述が見つかりました。

https://i.gyazo.com/a08cc59ae780571589fd877385b4ad41.png

上記から、Task3の正解は「-u」だと分かります。


5.Task4「Which username allows us to log into this MariaDB instance without providing a password?」

設問の意味は、「どのようなユーザー名を使えば、パスワードなしでログインできますか?」です。


Task4の正解は「root」です。


rootユーザー

MySQLをインストールすると、あらゆる操作が可能な「root」というアカウントが作られます。

rootユーザーはデフォルトでパスワードが設定されません。

そのため、初期設定でMySQLを運用すると、パスワードなしでログインできてしまうため非常に危険です。


参考:MySQL 8.0 リファレンスマニュアル :: 2.10.4 初期 MySQL アカウントの保護


6.Task5「In SQL, what symbol can we use to specify within the query that we want to display everything inside a table?」

設問の意味は、「SQLにおいて、テーブルの全ての内容を表示するように指定するクエリの記号は、どのようなものですか?」です。


Task5の正解は「*」です。


7.Task6「In SQL, what symbol do we need to end each query with?」

設問の意味は、「SQLでは、各クエリの最後にどのような記号を付ける必要がありますか?」です。


実際にMySQLにログインすると以下のような内容が表示されます。

https://i.gyazo.com/385ffc51342cf7512fd37c52faf3c9ed.png

ログイン画面に、「Commands end with ; or \g.(コマンドは「;」または「\g」で終了します。)」という表示があります。

よって、Task6の正解は「;」です。


8.Task7「There are three databases in this MySQL instance that are common across all MySQL instances. What is the name of the fourth that's unique to this host?」

設問の意味は、「このMySQLインスタンスには、すべてのMySQLインスタンスに共通するデータベースが3つあります。このホスト固有の4つ目のデータベースの名前は何ですか?」です。


まずは、実際にMySQLにログインする必要があります。

Task3とTask4の知識を使って、ログインしてみましょう。

MySQLにログインするコマンドは、以下の通りです。


$ mysql -u root -h $IP


なお、上記のコマンドを実行した際に、


ERROR2026(HY000):TLS/SSLerror:SSL is required, but the server does not support it


というエラーが表示される場合があります。

これは、クライアント側がSSL接続を要求しているのに対し、サーバー側がSSLをサポートしていない場合に発生します。

そうした場合は、以下のコマンドでログインを試してみてください。


$ mysql -u root -h $IP--skip-ssl


ログインに成功すると、以下のような文言が表示されます。

https://i.gyazo.com/385ffc51342cf7512fd37c52faf3c9ed.png

では、以下のコマンドでこのMySQLインスタンスに存在するデータベースの一覧を調べてみましょう。


MariaDB [(none)]> show databases;


すると、以下のような結果が返ってきます。

https://i.gyazo.com/21443a1a647752fc5819c7a1019afc1b.png

上記から、このMySQLインスタンスには、「htb」「information_schema」「mysql」「performance_schema」という4つのデータベースが存在することが分かります。


この内、以下の3つは、デフォルトで存在するデータベースです。



よって、Task7の正解は「htb」です。


9.Task8「What is the command in MySQL to select a database to interact with?」

設問の意味は、「MySQLで操作するデータベースを選ぶコマンドは何ですか?」です。


Task8の正解は「use」です。


10.Task9「What is the command in MySQL to show the different columns for a given table?」

設問の意味は、「MySQLで、特定のテーブルのカラム情報を表示するコマンドは何ですか?」です。


Task9の正解は「describe」です。

※なお、「desc」でも同様に動作します。


11.Task10「Which table has a column named "flag"?」

設問の意味は、「flagという名前のカラムを持つテーブルはどれですか?」です。


まず、useコマンドで「htb」データベースを選択しましょう。


MariaDB [(none)]> use htb;


すると、以下のように「Database changed」と表示され、プロンプトが「MariaDB [htb]>」という表示に切り替わります。

https://i.gyazo.com/c72ba480f3ed340b862c2e4897596f4b.png

では、「htb」データベースに、どのようなテーブルがあるか「show tables;」コマンドで調べてみましょう。

https://i.gyazo.com/ce83e6a1c7d3f856b9ca99d66c6a2c72.png

上記から、「htb」データベースには「config」「users」という2つのテーブルがあることが分かります。


それでは、「select * from {テーブル名};」というクエリで、「config」「users」の中身を、それぞれ見てみましょう。


すると、以下のように、「config」テーブルに、flagという名前のカラムが含まれていることが分かりました。

https://i.gyazo.com/e3ccf812a86a21e80238d87b187e725e.png

よって、Task10の正解は「config」です。


12.Submit Flag

Task10で調べた「config」テーブルの中身にあるflagに対応するランダムな文字列(今回であれば「7b4bec00d1a39e3dd4e021ec3d915da8」)を提出すれば、「Sequel」のマシン攻略完了です。

お疲れ様でした。


13.あとがき

今回は「Sequel」というマシンの攻略を通して、MySQLの基本的な操作とその脆弱性について学習しました。

今後も引き続き、「Starting Point」のマシンを攻略していくので、ぜひご覧ください。