В этой лабораторной работе вы узнаете, как проводить атаки методом перебора (brute-force attacks) на HTTP-сервисы с использованием Hydra, универсального инструмента для взлома паролей. Вы изучите настройку HTTP-сервера на Python с базовой аутентификацией и проверите его безопасность посредством систематических атак на учетные данные (credential attacks).
Упражнение охватывает создание списков слов (wordlists), настройку параметров Hydra и анализ результатов атаки для выявления слабых мест аутентификации. Эта практическая сессия демонстрирует основные методы оценки безопасности веб-сервисов от попыток перебора.
Установка локального HTTP-сервера
На этом шаге вы установите локальный HTTP-сервер, используя встроенный модуль Python. Этот сервер будет имитировать реальный веб-сервер с базовой аутентификацией (basic authentication), который мы будем использовать в качестве цели для нашей brute-force атаки Hydra позже. Понимание того, как работают веб-серверы, является основополагающим перед попыткой проверить их безопасность.
Модуль http.server в Python предоставляет быстрый способ создания базового веб-сервера для целей тестирования. Хотя он и не подходит для production, он идеально подходит для нашей лабораторной работы, поскольку демонстрирует основы протокола HTTP без сложной настройки. Сервер будет работать на порту 8000 по умолчанию.
Сначала перейдите в каталог вашего проекта. Это гарантирует, что все файлы организованы в одном месте:
cd ~/project
Создайте отдельный каталог для файлов вашего веб-сервера. Разделение веб-контента помогает поддерживать порядок:
mkdir http_server
cd http_server
Создайте простую домашнюю страницу. Этот HTML-файл будет отображаться, когда кто-то обращается к вашему веб-серверу:
echo "<h1>Welcome to LabEx HTTP Server</h1>" > index.html
Запустите HTTP-сервер Python. Символ & запускает его в фоновом режиме, чтобы вы могли продолжать использовать терминал:
python3 -m http.server 8000 &
Нажмите Enter, если вы хотите продолжить использовать терминал.
Убедитесь, что сервер работает. Команда netstat показывает активные сетевые соединения и прослушиваемые порты:
netstat -tulnp | grep 8000
Вы должны увидеть вывод, подтверждающий, что Python прослушивает порт 8000:
Проверьте функциональность сервера. Команда curl получает веб-страницу, чтобы убедиться, что все работает:
curl http://localhost:8000
Вы должны получить созданный вами HTML-контент, доказывающий, что сервер работает:
<h1>Welcome to LabEx HTTP Server</h1>
После запуска базового веб-сервера мы готовы реализовать аутентификацию на следующем шаге. Этот фундамент имеет решающее значение, поскольку Hydra будет взаимодействовать с этим сервером точно так же, как и с любым реальным веб-сервером, использующим basic authentication.
Настройка HTTP-сервера с базовой аутентификацией (Basic Auth)
На этом шаге вы настроите базовую аутентификацию для HTTP-сервера, который вы установили ранее. Базовая аутентификация - это простой метод, при котором клиент отправляет имя пользователя и пароль с каждым запросом. Это создает уровень безопасности, который мы позже проверим, попытавшись взломать его методом перебора с помощью Hydra - что демонстрирует, почему слабые пароли опасны.
Сначала убедитесь, что вы находитесь в правильном каталоге, где мы настроим наш защищенный веб-сервер:
cd ~/project/http_server
Создайте файл паролей с помощью утилиты htpasswd. Этот инструмент поставляется с пакетом apache2-utils (уже установленным в LabEx VM) и помогает управлять файлами паролей для базовой аутентификации:
htpasswd -c .htpasswd admin
Когда будет предложено, введите password123 в качестве пароля. Мы намеренно используем здесь слабый пароль, чтобы продемонстрировать, как легко можно взломать простые пароли.
Теперь мы создадим скрипт Python для обслуживания HTTP-контента с базовой аутентификацией. Этот скрипт будет проверять учетные данные (credentials) перед предоставлением доступа:
nano auth_server.py
Вставьте следующий код Python. Это создает пользовательский HTTP-сервер, который:
Требует базовую аутентификацию (Basic Authentication)
Проверяет учетные данные по нашему файлу .htpasswd
Обслуживает контент только после успешной аутентификации
from http.server import HTTPServer, BaseHTTPRequestHandler
import base64
class AuthHandler(BaseHTTPRequestHandler):
def do_GET(self):
auth_header = self.headers.get('Authorization')
if not auth_header or not auth_header.startswith('Basic '):
self.send_response(401)
self.send_header('WWW-Authenticate', 'Basic realm="LabEx"')
self.send_header('Content-type', 'text/html')
self.end_headers()
self.wfile.write(b'Authentication required')
return
auth_decoded = base64.b64decode(auth_header[6:]).decode('utf-8')
username, password = auth_decoded.split(':', 1)
if username == 'admin' and password == 'password123':
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
with open('index.html', 'rb') as f:
self.wfile.write(f.read())
else:
self.send_response(401)
self.send_header('WWW-Authenticate', 'Basic realm="LabEx"')
self.end_headers()
self.wfile.write(b'Authentication failed')
if __name__ == '__main__':
server_address = ('', 8000)
httpd = HTTPServer(server_address, AuthHandler)
print("Server running on port 8000...")
httpd.serve_forever()
Сохраните файл (Ctrl+O, Enter, Ctrl+X в nano) и остановите предыдущий HTTP-сервер, у которого не было аутентификации:
pkill -f "python3 -m http.server"
Запустите наш новый HTTP-сервер с аутентификацией в фоновом режиме:
python3 auth_server.py &
Давайте проверим аутентификацию, попытавшись получить доступ к серверу без учетных данных:
curl -v http://localhost:8000
Вы должны получить ответ 401 Unauthorized, что означает, что наша аутентификация работает.
Теперь попробуйте получить доступ с правильными учетными данными, которые мы настроили ранее:
Теперь вы должны увидеть HTML-контент из вашего файла index.html, доказывающий, что аутентификация работает правильно.
Сервер теперь должным образом защищен базовой аутентификацией и готов к нашей демонстрации brute-force атаки на следующих шагах. Эта настройка имитирует реальные сценарии, когда веб-серверы используют basic auth, показывая как то, как это работает, так и ее потенциальные уязвимости.
Подготовка списков имен пользователей и паролей
На этом шаге вы создадите списки слов (wordlists), которые Hydra будет использовать для проверки возможных комбинаций имени пользователя и пароля для базовой аутентификации HTTP (HTTP basic authentication). Эти списки составляют основу словарной атаки (dictionary attack), где мы систематически пробуем общие учетные данные (credentials), а не угадываем случайным образом.
Сначала перейдите в каталог вашего проекта. Это гарантирует, что все ваши файлы останутся организованными в одном месте:
cd ~/project
Создайте отдельный каталог для ваших списков слов. Разделение упрощает управление ими:
mkdir wordlists
cd wordlists
Создайте файл списка имен пользователей с помощью nano, простого текстового редактора. Мы заполним его общими административными именами пользователей, которые часто используются по умолчанию:
nano usernames.txt
Добавьте эти общие имена пользователей (по одному в строке):
admin
root
user
test
guest
administrator
Аналогично, создайте файл списка паролей. Это пароли, которые обычно используются или легко угадать:
nano passwords.txt
Добавьте эти общие пароли (по одному в строке):
password123
password
123456
admin
letmein
qwerty
Проверьте содержимое ваших файлов, чтобы убедиться, что они были созданы правильно. Команда cat отображает содержимое файла в терминале:
cat usernames.txt
cat passwords.txt
(Необязательно) Сгенерируйте дополнительные пароли с помощью crunch, генератора списков слов. Эта команда создает до 100 4-значных числовых комбинаций, что полезно для тестирования простых числовых паролей:
crunch 4 4 0123456789 | head -n 100 > numbers.txt
Объедините ваши списки паролей в один файл. Это дает Hydra больше вариантов для тестирования во время атаки:
Эти списки слов содержат как правильные учетные данные (admin/password123), которые мы настроили ранее, так и множество неправильных комбинаций. Эта настройка реалистично имитирует то, как злоумышленник попытается взломать логин методом перебора, пробуя многочисленные возможные учетные данные. На следующем шаге мы будем использовать Hydra для автоматизации тестирования этих комбинаций на нашем HTTP-сервере.
Запуск атаки Hydra на HTTP-сервис
На этом шаге вы будете использовать Hydra для выполнения brute-force атаки (атаки методом перебора) на службу базовой аутентификации HTTP (HTTP basic authentication), которую вы настроили ранее. Hydra - это мощный инструмент для взлома паролей, который систематически пробует все комбинации имени пользователя и пароля из списков слов (wordlists), чтобы найти действительные учетные данные (credentials). Это демонстрирует, почему слабые пароли уязвимы для автоматизированных атак.
Сначала убедитесь, что ваш HTTP-сервер все еще работает. Эта команда проверяет, существует ли процесс сервера, и перезапускает его, если необходимо:
Перейдите в каталог ваших списков слов, где вы хранили файлы имен пользователей и паролей. Эти файлы содержат комбинации, которые Hydra будет тестировать:
cd ~/project/wordlists
Запустите Hydra с этой командой для атаки HTTP-сервиса. Флаг -L указывает список имен пользователей, -P - список паролей, а http-get / указывает, что мы атакуем базовый HTTP GET запрос:
Проверьте сохраненный файл результатов, чтобы увидеть успешные учетные данные:
cat hydra_results.txt
Атака должна успешно найти учетные данные (admin/password123), которые мы настроили ранее. Это показывает, как быстро слабые учетные данные могут быть обнаружены с помощью автоматизированных brute-force атак, подчеркивая важность надежных паролей.
Итог
В этой лабораторной работе вы узнали, как настроить локальный HTTP-сервер с помощью Python и реализовать базовую аутентификацию (basic authentication) для целей тестирования безопасности. Процесс включал создание веб-каталогов, настройку аутентификации с помощью htpasswd и проверку функциональности сервера с использованием общих инструментов, таких как curl.
Кроме того, вы получили практический опыт в подготовке списков учетных данных (credential lists) и выполнении brute-force атак (атак методом перебора) на HTTP-сервисы с использованием Hydra. Это упражнение продемонстрировало важность надежных паролей и уязвимости механизмов базовой аутентификации при использовании слабых учетных данных.