# Практическая работа №6 (“Fail2Ban-SSH и Brute-force attack”.)
## Цель работы:
Научиться настраивать Fail2Ban для SSH
## Задача:
1) Настроить SSH-сервер и SSH-клиент
2) Запретить доступ от root
3) Вывести журнал подключений пользователей SSH
4) Установить и настроить Fail2Ban для SSH
5) Провести несколько разных атак
## Основные понятия
1) SSH — сетевой протокол прикладного уровня, позволяющий производить удалённое управление операционной системой и туннелирование TCP-соединений. Схож по функциональности с протоколами Telnet и rlogin, но, в отличие от них, шифрует весь трафик, включая и передаваемые пароли.
2) Fail2Ban - это бесплатная популярная программная платформа с открытым исходным кодом, разработанная для предотвращения вторжений, которую можно использовать для защиты вашего сервера от атак методом перебора паролей. Одной из главных задач Fail2ban является блокировка IP-адреса, активность которого имеет явный вредоносный признак.
3) Hydra - это программное обеспечение с открытым исходным кодом для перебора паролей в реальном времени от различных онлайн сервисов, веб-приложений, FTP, SSH и других протоколов. Это распараллеленный взломщик для входа в систему, он поддерживает множество протоколов для осуществления атак.
## Подготовка к работе
1) Первым делом нужно обновиться:
>sudo apt-get update
2) Затем установим сам Fail2Ban:
>sudo apt-get install fail2ban
После установки мы должны прописать команду для активации:
>service fail2ban start
3) После этого установим Hydra:
>sudo apt-get install hydra
4) Установим SSH на сервер:
>sudo apt-get install ssh
Начнется процесс установки:

## Приступим
# Настроим SSH-сервера
1) Проверим работает ли у нас SSH:
> systemctl status sshd
Отлично у нас запущен SSH в режиме демона.

2) Теперь перейдем к настройке SSH:
Настройки демона находятся в файле /etc/ssh/sshd_config, посмотреть его можно командой:
> sudo cat /etc/ssh/sshd_config
Нам важны такие параметры как Port,AddressFamily,ListenAddress, их можно вывести отдельно командами:
> sudo cat /etc/ssh/sshd_config | grep Port
> sudo cat /etc/ssh/sshd_config | grep Address
Первый глобально задаёт номер порта, через который будет работать соединение и если оставить его стандартным, т. е. 22, то велика вероятность, что он будет слишком часто сканироваться роботами.
**Примечание**: для задания активации параметра необходимо раскомментировать соответствующую строку — убрать символ «#» в её начале.

Второй параметр отвечает у нас за ip, либо ipv4 либо ipv6:
* AddressFamily inet - ipv4
* AddressFamily inet6 - ipv6
Параметр ListenAddress позволяет задавать порты для отдельных сетевых интерфейсов:
* ListenAddress 10.24.205.75:2123
* ListenAddress 10.24.205.76:2124
PubkeyAuthentication - позволяет проводить аутентификацию с помощью SSH-ключей, если будет no, соотвественно не позволит.
Cерверу необходимо явно указывать, где хранятся открытые ключи пользователей. Это может быть как один общий файл для хранения ключей всех пользователей (обычно это файл etc/.ssh/authorized_keys), так и отдельные для каждого пользователя ключи. Второй вариант удобнее, и безопаснее.
> AuthorizedKeysFile etc/ssh/authorized_keys # Для общего файла
> AuthorizedKeysFile %h/.ssh/authorized_keys # Файл -> пользователь

3) Важно отключать парольный доступ:
>PasswordAuthentication no
Или же, в случае, если всё-таки необходимо использовать доступ по паролю, то обязательно нужно отключать авторизацию по пустому паролю:
>PermitEmptyPasswords no

4) Для указания разрешённых или запрещённых пользователей и групп служат директивы DenyUsers, AllowUsers, DenyGroups, и AllowGroups. Значениями для них являются списки имён, разделяемых пробелами, например:
> DenyUsers fred john
AllowGroups root clients administrators
5) Следует также отключать root-доступ:
>PermitRootLogin no

6) Иногда, когда следует задавать мультисерверную конфигурацию, очень удобно использовать алиасы (Aliases), что позволяет настроить сразу несколько режимов доступа (с разными хостами, портами и т. д.) и использовать их, указывая при этом конкретный алиас:
> ssh alias_name
7) Настройки для алиасов хранятся либо глобально в /etc/ssh/ssh_config, либо раздельно для пользователей в ~/.ssh/config. Здесь нужно не спутать с ssh_config!
*Пример:*
>Host your_alias
Port your_ssh_port
HostName 0.0.0.0 # IP или имя хоста
User your_user_name
8) Следует заметить, что в таком случае серверу необходимо явно указывать, где хранятся открытые ключи пользователей. Это может быть как один общий файл для хранения ключей всех пользователей (обычно это файл etc/.ssh/authorized_keys), так и отдельные для каждого пользователя ключи. Второй вариант предпочтительнее в силу удобства администрирования и повышения безопасности:
>AuthorizedKeysFile etc/ssh/authorized_keys # Для общего файла
>AuthorizedKeysFile %h/.ssh/authorized_keys # Файл -> пользователь
Во втором варианте благодаря шаблону автоподстановки с маской «%h» будет использоваться домашний каталог пользователя.

9) Чтобы измененные настройки вступили в силу нам нужно перезапустить SSH-сервер:
>systemctl restart sshd
# Настройка и использование клиента SSH:
1) Для подключения по к серверу используется команда:
>ssh user_name@host_name
где user_name – имя пользователя в системе, host_name – имя узла, к которому производится подключение, например:
>ssh nikola@nikolawebserver
При этом утилита ssh запросит (в зависимости от настроек сервера) логин, пароль или парольную фразу для разблокировки приватного ключа пользователя.
В случае авторизации по ключу, должна быть предварительно сгенерирована пара SSH-ключей — открытый, который хранится на стороне сервера, обычно в файле .ssh/authorized_keys в домашнем каталоге пользователя, и закрытый — используется для авторизации клиента и хранится, как правило, в каталоге .ssh/ домашней директории пользователя. Открытый ключ представляет собой «цифровой слепок» закрытого ключа благодаря которому сервер «знает», кто «свой», а кто «чужой».
# Для генерации ключей используется утилита ssh-keygen:
> ssh-keygen
Утилита предложит выбрать расположение ключей (лучше всё оставить по-умолчанию), обычно это каталог ~/.ssh/, ввести парольную фразу для закрытого ключа. После чего будут сгенерированы открытый ключ id_rsa.pub и закрытый — id_rsa. Теперь нужно скопировать открытый ключ, т. е. «слепок» закрытого на сервер. Проще всего этого можно добиться командой:
> ssh-copy-id -i ~/.ssh/id_rsa.pub user_name@host_name
*Теперь можно выполнить подключение командой ssh и запустить защищённый сеанс удалённого управления.*
Важно заметить, что использование сгенерированных openSSH-ключей несовместимо с PPK-форматом, используемым по-умолчанию в таких комплексах как PuTTY. Поэтому необходимо конвертировать имеющиеся openSSH-ключи в формат PPK. Удобнее всего это делать с помощью утилиты PuTTY – puttygen.exe.
# Разберемся с Fail2Ban
1) Ознакомиться с файлами Fail2Ban можно в следующей директории:
>ls -al /etc/Fail2Ban
Самый важный файл - это jail.conf (данный файл содержит фильтры по умолчанию для определенных служб)
На скриншоте можно заметить, что я создал файл jail.local

Создал я его собсвтенно для того, чтобы при перезапуске Fail2Ban у меня не слетел фильтр.
Чтобы создать данный файл, нужно прописать команду
> nano jail.conf - в директории /etc/fail2ban
2) Далее в этом файле мы прописываем следующие данные:

После сохраняем и выходим.
3) Вводим команду, чтобы у нас сохранился новый конфигурационный файл:
> service fail2ban restart
4) Проверим работоспособность нашего Fail2Ban:
>service fail2ban status
5) После пробуем подключиться по ssh 3 раза, вводя неверный пароль.
6) Чтобы посмотреть список банов, нам нужно ввести команду:
>fail2ban-client status

Для более подробной статистики нужна команда:
> fail2ban-client status sshd

И мы видим, сколько было попыток входа и какие ip у нас забанены.
7) Для разблокировки ip нужно ввести следующую команду:
>fail2ban-client unban [ip-адресс]

# Если в конфигурационном файле поменять на false, то ssh начнёт работать корректно и будет давать возможность подключаться.
8) Давайте теперь введем команду Hydra:
> sudo hydra -l root -P /usr/share/hydra/dpl4hydra_local.csv ssh://ip-адресс -I -v
Где:
l – использовать логин;
P – использовать пароль из файла со списком;
v – подробный вывод;
I - игнорировать существующий файл восстановления (не ждать 10 секунд)

После ввода у нас начинается подбор паролей.
Далее давайте посмотрим, заблокирован ли какой-нибудь ip после запуска Hydra.

Как мы видим Fail2Ban успешно отправил в бан ip.
9) Чтобы вывести журнал подключений пользователей SSH, нужно ввести команду:
> cat /var/log/auth.log

# Проведем несколько атак без Fail2ban
### Patator
1) Запустим сервис ssh:

2) Пробуем подключиться:

Получилось, а теперь попробуемсбрутить наш пароль.
3) Мы создадим свои файлы, чтобы посмотреть на практике (включая верный пароль для аутентификации)
Чтобы создать файл вводим:
> sudo touch имя_файла.txt
> sudo nano имя_файла.txt - для редактирования файла


4) Воспользуемся командой:patator ssh_login host=192.168.108.16 user=FILE0 password=FILE1 0=user_name.txt 1=passwords.txt -x ignore:mesg='Authentication failed'
И видим, что пароль был подобран!

### Hydra
Для подбора пароля с помощью Hydra используется команда:
> hydra -V -f -t 4 -1 test -Р /root/wordlist ssh://111.11.11.11
Параметр Значение
* -V показывать пару логин + пароль во время перебора
* -f остановка, как только будет найден пароль для указаного логина
* -Р путь до словаря с паролями
* ssh://111.11.11.11 IР-адрес жертвы

В отличии от Potator в Hydra мы указываем имя пользователя, в то время, как в Potator нам этого делать не нужно, он берет имя пользователя из файла.
### Medusa
Для подбора пароля с помощью Medusa используется команда:
>medusa -h 192.168.60.50 -u test -Р /root/wordlist -М ssh -f -v 6
Параметр Значение
* -h IР-адрес жертвы
* -u Логин
* -Р Путь к словарю
* -М Выбор модуля
* -f Остановка после нахождения валидной пары логин/пароль
* -v Настройка отображения сообщений на экране во время процесса подбора

А теперь без Fail2Ban:
### Medusa

### Hydra

### Patator

# Спасибо за внимание!