はじめに
この実験では、Hydraの試行回数を制限するオプションを活用し、攻撃を早期に停止する方法を学びます。まず、vsftpdを使ってFTPサーバーを構築し、それぞれ異なるパスワードを持つtestuser1とtestuser2という複数のユーザーアカウントを設定します。これにより、Hydraが複数のアカウントを同時に解析しようとする状況を再現できます。
続いて、-fオプションを使って最初のログイン成功時にHydraを停止する方法と、複数ホストのリストに対して-Fオプションを使う方法を確認します。最後に、-fと-Fの動作を比較し、Hydraによる攻撃を抑制するための使い分けを理解します。
複数の認証情報を使ったFTPの構築
このステップでは、FTPサーバーを構築し、複数のユーザー認証情報を設定します。これにより、Hydraが複数のアカウントを同時に解析できるかをテストできます。FTPサーバーにはvsftpd(Very Secure FTP Daemon)を使用します。
まず、vsftpdをインストールします。ターミナルを開き、次のコマンドを実行してください。
sudo apt update
sudo apt install vsftpd -y
次に、vsftpdを設定します。まず、元の設定ファイルをバックアップします。システム設定ファイルを変更する前にバックアップを作成するのは、よい習慣です。
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
続いて、nanoを使って設定ファイル/etc/vsftpd.confを編集します。このファイルでFTPサーバーの動作を制御します。
sudo nano /etc/vsftpd.conf
nanoエディター内で、次の行を追加または変更してください。これらの設定により、匿名アクセスを無効化し、ローカルユーザーのログインと書き込みを許可します。また、セキュリティ対策として、ローカルユーザーを各自のホームディレクトリ内にchrootします。
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
listen=YES
listen_ipv6=NO
nanoでファイルを保存するには、Ctrl + Xを押し、保存確認でYを押してから、ファイル名をEnterで確定します。
保存後、次のコマンドを使って設定ファイルを確認し、変更が正しく反映されていることを確認します。
sudo cat /etc/vsftpd.conf | grep -E "^(anonymous_enable|local_enable|write_enable|chroot_local_user|listen)"
出力内容が、追加した設定と一致していることを確認してください。
次に、複数のユーザーアカウントを作成します。testuser1とtestuser2という2人のユーザーを作成し、それぞれにパスワードを設定します。Hydraはこれらのユーザーを使ってログインを試行します。
ホームディレクトリ付きでtestuser1を作成します。
sudo useradd -m testuser1
非対話形式のコマンドでtestuser1のパスワードを設定します。
echo 'testuser1:password123' | sudo chpasswd
ホームディレクトリ付きでtestuser2を作成します。
sudo useradd -m testuser2
非対話形式のコマンドでtestuser2のパスワードを設定します。
echo 'testuser2:password456' | sudo chpasswd
これらのコマンドは対話操作を必要とせず、入力を求められることなくユーザーを直接作成できます。そのため、自動化された環境でも安定して実行できます。
次に、chroot設定に対応するため、ホームディレクトリの権限を修正します。chroot_local_user=YESを有効にした場合、セキュリティ上の理由から、ユーザーのホームディレクトリ自体をそのユーザーが書き込み可能な状態にしてはいけません。
sudo chmod 755 /home/testuser1
sudo chmod 755 /home/testuser2
各ユーザーがファイルをアップロードできる書き込み可能なサブディレクトリを作成します。
sudo mkdir /home/testuser1/files
sudo mkdir /home/testuser2/files
sudo chown testuser1:testuser1 /home/testuser1/files
sudo chown testuser2:testuser2 /home/testuser2/files
次に、設定ファイルの変更を適用し、新しいユーザーを認識させるため、vsftpdサービスを再起動します。
sudo service vsftpd restart
続いて、FTPサーバーが正しく動作し、新しく作成したユーザーがログインできることを確認します。サーバーへの接続には、コマンドラインFTPクライアントのftpを使用できます。サーバーはローカルで実行しているため、localhostに接続します。
ftp localhost
ユーザー名の入力を求められたら、testuser1と入力し、パスワードとしてpassword123を入力します。設定が正しければ、ログイン成功を示すメッセージが表示されます。
Connected to localhost.
220 (vsFTPd 3.0.3)
Name (localhost:labex): testuser1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
FTPクライアントを終了するには、byeと入力します。
ftp> bye
221 Goodbye.
次に、Hydraが攻撃で使用するファイルを準備します。デフォルトの作業ディレクトリである~/projectに移動します。
cd ~/project
~/projectディレクトリにusers.txtというファイルを作成します。このファイルには、Hydraが試行するユーザー名を記述します。
nano users.txt
users.txtに次のユーザー名を追加します。
testuser1
testuser2
ファイルを保存してnanoを終了します。
次に、~/projectディレクトリにpasswords.txtというファイルを作成します。このファイルには、テストユーザーの正しいパスワードと、よく使われる誤ったパスワードを含むパスワード一覧を記述します。
nano passwords.txt
passwords.txtに次のパスワードを追加します。
password123
password456
password
123456
qwerty
ファイルを保存してnanoを終了します。
これで、複数のユーザーアカウントを備えたFTPサーバーと、Hydraがアカウント解析に使用するユーザー名・パスワードの一覧が準備できました。
-fを使って最初の認証情報発見後に停止する
このステップでは、Hydraの-fオプションを使用します。-fを指定すると、単一の対象に対して有効なユーザー名とパスワードの組み合わせが最初に見つかった時点でHydraが停止します。特定のサービスで有効なアカウントを1つだけ確認したい場合に便利で、ログイン成功後もHydraが別の組み合わせを試し続けるのを防げます。
~/projectディレクトリにいることを確認してください。
cd ~/project
前のステップで作成したユーザー名とパスワードの一覧を使って、FTPサーバーに対してHydraを実行します。今回は-fオプションを付けます。
hydra -L users.txt -P passwords.txt localhost ftp -f
このコマンドを分解すると、次のようになります。
hydra: ブルートフォース攻撃を行うコマンドラインツール。-L users.txt: ユーザー名一覧を含むファイルを指定します(現在のディレクトリにあるusers.txt)。-P passwords.txt: パスワード一覧を含むファイルを指定します(現在のディレクトリにあるpasswords.txt)。localhost: 対象FTPサーバーのアドレス。ftp: 攻撃対象のサービスプロトコル(ここではFTP)。-f: Hydraに最初の有効なユーザー名とパスワードの組み合わせが見つかった時点で停止するよう指示する重要なオプション。
ターミナルに表示される出力を確認してください。Hydraは一覧にあるユーザー名とパスワードを使ってログインを試行します。有効な組み合わせ(例:testuser1:password123)を見つけると、成功したログイン情報を表示して処理を停止します。
出力は次のようになります。
Hydra v9.6 (c) 2024 by van Hauser/THC & David Maciejak - Please use caution!
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2025-05-29 14:41:46
[DATA] max 10 tasks per 1 server, overall 10 tasks, 10 login tries (l:2/p:5), ~1 try per task
[DATA] attacking ftp://localhost:21/
[21][ftp] host: localhost login: testuser1 password: password123
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2025-05-29 14:41:47
Hydraが最初の有効な組み合わせ(testuser1:password123)を見つけた直後に停止したことに注目してください。-fを指定しなければ、Hydraはtestuser1に対してpasswords.txtにある残りの組み合わせをすべて試し、その後testuser2についてもすべてのパスワードを試し続けます。
このオプションは、特定のサービスをテストし、少なくとも1つのアカウントに脆弱性があることだけを確認したい場合に特に便利です。時間とリソースを大幅に節約できます。
複数ホストのリストで-Fをテストする
このステップでは、Hydraの-Fオプションを確認します。単一ホストで最初の有効な認証情報が見つかった時点で停止する-fとは異なり、-Fはリスト内のすべてのホストを対象に、最初の有効な認証情報が見つかった時点で停止します。複数のシステムを対象とし、その中から脆弱な対象を1つ見つければよい場合に特に役立ちます。
これを実演するため、複数ホストの状況を再現します。仮想マシンは1台しかないため、ホストリスト内でlocalhostを複数回指定し、異なる対象をシミュレートします。
まず、~/projectディレクトリにいることを確認してください。
cd ~/project
次に、~/projectディレクトリにhosts.txtというファイルを作成します。このファイルには、対象ホストの一覧を記述します。
nano hosts.txt
hosts.txtに次の行を追加します。
localhost
localhost
ファイルを保存してnanoを終了します。localhostを2回記述することで、同じマシンを指していても、Hydraには2つの別々の対象として扱わせます。
次に、hosts.txtで指定したホスト一覧を対象に、-Fオプション付きでHydraを実行します。
hydra -L users.txt -P passwords.txt -M hosts.txt ftp -F
このコマンドを分解すると、次のようになります。
-L users.txt: ユーザー名一覧を含むファイルを指定します。-P passwords.txt: パスワード一覧を含むファイルを指定します。-M hosts.txt: 新しく使用するオプションです。対象ホスト一覧を含むファイルを指定します(現在のディレクトリにあるhosts.txt)。ftp: 攻撃対象のサービスプロトコル。-F: リスト内のすべてのホストを対象に、最初のログイン成功が見つかった時点で停止するようHydraに指示する重要なオプション。
ターミナルの出力を確認してください。Hydraは、一覧にあるユーザー名とパスワードを使って、hosts.txt内の各ホストへのログインを試行します。いずれかのホストで有効な組み合わせが見つかると、成功したログイン情報を表示し、hosts.txtに記載されたすべてのホストへの攻撃を停止します。
出力は次のようになります。
Hydra v9.6 (c) 2024 by van Hauser/THC & David Maciejak - Please use caution!
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2025-05-29 14:42:10
[DATA] max 10 tasks per 2 servers, overall 20 tasks, 10 login tries (l:2/p:5), ~1 try per task
[DATA] attacking ftp://(2 targets):21/
[21][ftp] host: localhost login: testuser1 password: password123
[STATUS] attack finished for localhost (valid pair found)
2 of 2 targets successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2025-05-29 14:42:11
hosts.txtにはlocalhostが2件ありますが、Hydraは最初のlocalhostでログイン成功を見つけると停止します。2件目のlocalhostについて認証情報の発見を続けることはありません。これにより、-Fオプションの効果が確認できます。
-Fオプションは、複数のシステムを対象とし、そのうち1つの脆弱なシステムを見つければ目的を達成できる場合に非常に便利です。対象のいずれかで脆弱性が見つかった時点で攻撃を停止するため、時間と計算資源を大幅に節約できます。
-fと-Fの動作を比較する
このステップでは、-fと-Fの動作を直接比較し、両者の違いを明確に理解します。前のステップと同じ環境、つまりlocalhost上で動作するFTPサーバー、users.txt、passwords.txt、そしてlocalhostを2件含むhosts.txtを使用します。
まず、-fオプションを使ったコマンドをもう一度実行します。このコマンドは単一のホスト(localhost)を対象とし、そのホストで最初に有効な認証情報が見つかった時点で停止します。
hydra -L users.txt -P passwords.txt localhost ftp -f
ステップ2で確認したように、Hydraはtestuser1:password123を見つけると停止します。localhostに対してtestuser2:password456を探すことはありません。
次に、-Fオプションを使ったコマンドをもう一度実行します。このコマンドはホストのリスト(hosts.txt)を対象とし、そのリスト内のいずれかのホストで最初に有効な認証情報が見つかった時点で停止します。
hydra -L users.txt -P passwords.txt -M hosts.txt ftp -F
ステップ3で確認したように、Hydraはhosts.txtの最初のlocalhostでtestuser1:password123を見つけると停止します。hosts.txtにある2件目のlocalhostの確認には進みません。
重要な違いは、Hydraが対象をどのように解釈し、どの時点で停止するかにあります。
-f(単一対象): 単一の対象(例:localhost)を指定すると、-fはその特定の対象で有効なユーザー名とパスワードの組み合わせが1つでも見つかった時点でHydraを停止します。同じ対象に対して、別の有効な認証情報を探し続けることはありません。-F(複数ホストのリスト):-Mで対象のリストを指定すると、-Fはリスト内のいずれかのホストで有効なユーザー名とパスワードの組み合わせが1つでも見つかった時点でHydraを停止します。同じホストで別の有効な認証情報を探し続けることも、リスト内の後続ホストを確認することもありません。
違いをさらに具体的に見てみましょう。複数のFTPサーバー、ftp1.example.com、ftp2.example.com、ftp3.example.comがあるネットワークをスキャンする状況を想定します。
-fを使ってftp1.example.comを対象にした場合、Hydraはftp1.example.comで最初の有効な認証情報を見つけると停止します。その後ftp2.example.comを確認したい場合は、別途Hydraコマンドを実行する必要があります。3台すべてのサーバーを
hosts.txtに記述し、-Fを使った場合、Hydraはftp1.example.comから確認を開始します。そこで有効な認証情報を見つけると、ftp2.example.comやftp3.example.comへの接続を試みることなく、処理全体を直ちに停止します。
まとめると、次のように使い分けます。
- 単一の対象に集中し、その対象で少なくとも1つの有効な認証情報を見つけたい場合は、
-fを使用します。 - 複数の対象をスキャンし、いずれかの対象で有効な認証情報が見つかった時点で処理全体を停止したい場合は、
-Fを使用します。
これで実験は終了です。FTPサーバーの構築、複数ユーザーアカウントの設定、Hydraを使ったアカウント解析を完了し、Hydraの攻撃動作を制御する-fと-Fオプションについて学びました。
まとめ
この実験では、-fと-Fオプションを使ってHydraの攻撃動作を制御する方法を学びました。まず、vsftpdを使ってローカルFTPサーバーを構築し、実際の環境を想定して複数のユーザーアカウント(testuser1とtestuser2)を設定しました。また、Hydraが使用するusers.txtとpasswords.txtも準備しました。
次に、-fオプションを使い、単一の対象で最初に有効なユーザー名とパスワードの組み合わせが見つかった時点でHydraを停止させました。これにより、脆弱なアカウントを1つだけ効率的に発見する方法を確認しました。その後、複数ホストのリスト(hosts.txt)に対して-Fオプションを使い、一覧内のいずれかのホストで有効な認証情報が1つ見つかると、複数対象への攻撃全体を停止できることを学びました。
最後に、-fと-Fの動作の違いを比較しました。-fは単一対象で最初に成功した時点で停止するために使用し、-Fは複数対象のいずれかで最初に成功した時点で停止するために使用します。この知識は、ブルートフォース攻撃を効率化し、リソースを適切に管理するうえで重要です。


