В этом лабораторном занятии вы будете выполнять роль исследователя по безопасности, которому поручено проверить безопасность паролей веб-приложения. Вы исследуете уязвимости, связанные с использованием слабых паролей, и научитесь методам их взлома. Этот практический опыт даст вам представление о наступательных методах и важности надежных защитных мер в области кибербезопасности.
Исследование целевого веб-сайта
На этом этапе мы соберем информацию о целевом веб-сайте, что является важной первой фазой любого оценки безопасности.
Откройте веб-браузер и перейдите по адресу http://localhost:8080/. Вы можете сделать это, кликнув на вкладку Web 8080 в среде LabEx.
Примечание: В виртуальной машине LabEx веб-сервер работает в временной публичной сети. Это означает, что доменное имя, которое вы видите, может не быть "localhost", а быть реально доступным доменом. Это нормально и не влияет на выполнение лабораторного задания.
Тщательно изучите форму входа. Обратите внимание на следующее:
Для входа на сайт требуются как имя пользователя, так и пароль.
Нет видимых подсказок о допустимых именах пользователей или требованиях к паролю.
Попробуйте войти, используя несколько случайных комбинаций имен пользователей и паролей. Например:
Имя пользователя: test, Пароль: password123
Имя пользователя: admin, Пароль: admin
Имя пользователя: user, Пароль: 12345
При каждой попытке вы должны получить сообщение "Неверное имя пользователя или пароль".
На основе своих наблюдений мы можем сделать некоторые обоснованные предположения о системе входа:
Система не показывает, существует ли имя пользователя или нет. Это хорошая практика безопасности, так как она не раскрывает информацию о действительных учетных записях.
По-видимому, нет ограничения на количество попыток входа. В реальной жизни это может быть уязвимостью, позволяющей делать неограниченное количество попыток угадать пароль.
Это первоначальное разведывание помогает нам понять систему, с которой мы имеем дело, и определить следующие шаги в попытке взломать пароли.
Создание словаря паролей
Теперь, когда мы собрали информацию о системе входа, мы создадим словарь потенциальных паролей. Это распространенная техника, используемая при попытках взлома паролей.
Откройте терминал на рабочем столе.
В терминале введите следующую команду для создания и заполнения файла passwords.txt:
Эта команда использует технику, называемую "здесь-документом" (here document) в bash. Она позволяет создать файл с несколькими строками текста за одну команду. Вот как это работает:
cat << EOF > filename: Эта команда сообщает системе взять весь текст до тех пор, пока не встретит "EOF" (End Of File - конец файла), и записать его в указанный файл.
Текст между первым EOF и вторым EOF - это содержимое, которое будет записано в файл.
Последнее EOF отмечает конец текста, который нужно записать.
После выполнения этой команды вы создадите файл с именем passwords.txt в директории ~/project/password_lab/, содержащий список часто используемых (и, следовательно, слабых) паролей.
В реальной жизни атакующие могут использовать гораздо более крупные словари, часто содержащие миллионы паролей. Они могут включать:
Часто используемые пароли
Слова на разных языках
Вариации слов (например, "password1", "p@ssword", "password123")
Утеченные пароли из предыдущих утечек данных
Создание и использование таких словарей для несанкционированного доступа является незаконным и неэтичным. Мы используем этот небольшой словарь только в образовательных целях, чтобы понять, как работают такие атаки и как противостоять им.
Написание скрипта для взлома паролей
Теперь, когда у нас есть словарь паролей, мы создадим Python-скрипт для автоматизации процесса проверки этих паролей на целевом веб-сайте.
Откройте терминал на рабочем столе, если он еще не открыт.
Введите следующую команду, чтобы открыть новый файл с именем password_cracker.py в текстовом редакторе nano:
nano ~/project/password_lab/password_cracker.py
Скопируйте и вставьте следующий Python-код в редактор nano:
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()
Сохраните файл и выйдите из nano, нажав Ctrl+X, затем Y, а затем Enter.
Разберем, что делает этот скрипт:
Функция crack_password:
Принимает имя пользователя и список паролей в качестве входных данных.
Для каждого пароля отправляет POST-запрос на страницу входа с именем пользователя и паролем.
Если в ответе содержится "Login successful!", выводит сообщение об успехе.
В противном случае выводит сообщение о неудаче.
Включает небольшую задержку (0,1 секунды) между попытками, чтобы не перегружать сервер.
Функция 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
Проанализируйте вывод:
Какие пароли были успешно взломаны?
Для каких имен пользователей?
Сколько попыток потребовалось, чтобы найти правильный пароль?
Почему, на ваш взгляд, некоторые пароли были взломаны, а другие - нет?
Это упражнение показывает, как легко можно угадать слабые пароли, используя распространенные слова или шаблоны. В данном случае учетная запись "admin" с паролем "supersecret123" оказалась уязвимой для нашей словарной атаки.
Важно понимать, что хотя этот скрипт успешно работал в этом контролируемом окружении, попытка использовать такие методы на реальных системах без явного разрешения является незаконной и неэтичной. Эти знания должны использоваться для понимания уязвимостей и улучшения безопасности, а не для эксплойтации систем.
Улучшение безопасности паролей
Теперь, когда мы успешно взломали некоторые пароли, давайте реализуем более строгие политики паролей, чтобы предотвратить такие атаки.
Откройте вкладку WebIDE в виртуальной машине LabEx. WebIDE - это веб-интегрированная среда разработки, которая позволяет писать, запускать и отлаживать код прямо в браузере. Она похожа на редактор VS Code, но работает в браузере. WebIDE подходит для редактирования более длинных файлов кода.
В проводнике файлов слева на экране кликните по файлу 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
Эта функция проверяет, что пароль:
Состоит как минимум из 12 символов
Содержит как минимум одну заглавную букву
Содержит как минимум одну строчную букву
Содержит как минимум одну цифру
Содержит как минимум один специальный символ
Теперь добавьте новый маршрут для регистрации пользователя, который реализует эту политику паролей. Добавьте этот блок кода перед строкой if __name__ == '__main__':
Этот код создает новый маршрут для регистрации пользователя. Он проверяет, соответствует ли введенный пароль нашим критериям надежного пароля, прежде чем создать нового пользователя.
Сохраните изменения в WebIDE.
Теперь перезапустим приложение Flask, чтобы применить эти изменения. Откройте терминал и запустите:
Перейдите на вкладку Web 8080 и добавьте /register к URL, чтобы получить доступ к новой форме регистрации:
Попробуйте зарегистрировать новую учетную запись с слабым паролем (например, "password123"). Посмотрите, как приложение применяет новую политику паролей.
Теперь зарегистрируйте новую учетную запись с надежным паролем, который соответствует всем критериям. Например:
Имя пользователя: labex
Пароль: S3cureP@ssw0rd-2024
Этот пароль соответствует всем нашим требованиям: он содержит более 12 символов, заглавные и строчные буквы, цифры и специальные символы.
После успешной регистрации давайте протестируем наш скрипт для взлома паролей на этом новом надежном пароле. Измените скрипт password_cracker.py:
Обратите внимание, что скрипт не может взломать новый надежный пароль. Это демонстрирует эффективность реализации строгих политик паролей.
Резюме
В этом лабораторном занятии вы познакомились с процессом этического взлома и тестирования безопасности паролей. Вот краткий обзор того, что вы достигли:
Реконнаissances (сбор информации): Вы исследовали страницу входа, собирая информацию о ее поведении и возможных уязвимостях. Этот этап имитирует то, как исследователь безопасности или атакующий может начать свою работу по изучению целевой системы.
Создание словаря паролей: Вы создали список распространенных паролей, имитируя словари, используемые в реальных попытках взлома паролей. Это показало уязвимость использования распространенных или слабых паролей.
Автоматизированный взлом паролей: Вы написали и запустили Python-скрипт для автоматизации процесса проверки множества комбинаций имен пользователей и паролей. Это продемонстрировало, как атакующие могут пытаться проникнуть в систему и как быстро могут быть взломаны слабые пароли.
Анализ результатов: Вы запустили скрипт для взлома паролей и проанализировали результаты, поняв, какие пароли были уязвимы и почему. Этот этап подчеркнул важность использования надежных и уникальных паролей.
Реализация мер безопасности: Наконец, вы повысили безопасность веб-приложения, реализовав строгие политики паролей и безопасную систему регистрации. Это показало, как правильные меры безопасности могут эффективно предотвратить распространенные атаки.