SSH с использованием Paramiko на Python

python icon

Замена Netcat, которую мы создали в предыдущей статье, довольно полезная, но иногда, чтобы вас не обнаружили, лучше шифровать трафик. Часто для этого создают туннель с помощью протокола SSH. Но что если на атакуемом вами компьютере нет SSH-клиента, как у 99,81943 % систем Windows? В этой статье я покажу, как использовать библиотеку Paramiko на Python, для создания зашифрованного соединения SSH.

Еще по теме: Как написать сканер портов на Python

Библиотека Paramiko Python

Конечно, для Windows есть отличные SSH-клиенты, такие как PuTTY, но мы говорим о Python. В Python для создания SSH-клиента или сервера можно использовать сырые сокеты и чуть-чуть криптографической магии, но зачем писать самим, если можно взять готовое? Пакет Paramiko, основанный на PyCrypto, предоставляет простой доступ к протоколу SSH2.

Чтобы показать, как работает эта библиотека, сделаем с ее помощью несколько упражнений: установим соединение и выполним по SSH команду в удаленной системе, подготовим SSH-клиент и SSH-сервер для реализации удаленных команд на компьютере с Windows и, наконец, проанализируем файл с демонстрацией обратного туннеля, входящий в состав Paramiko.

SSH с использованием Paramiko на Python

Для начала установите пакет Paramiko с помощью pip (или скачайте его на сайте http://www.paramiko.org/):

Позже мы будем использовать несколько демонстрационных файлов, поэтому не забудьте скачать их из репозитория Paramiko на GitHub (https://github.com/paramiko/paramiko/).

Создайте файл с именем ssh_cmd.py и наберите следующее:

Мы создаем функцию ssh_command (строка 1), которая подключается к SSH-серверу и выполняет отдельную команду. Следует отметить, что вместо пароля (или в дополнение к нему) Paramiko позволяет использовать для аутентификации ключи. SSH-ключ лучше подходит для реальной работы, но, чтобы упростить этот пример, будем входить в систему с помощью имени пользователя и пароля.

Поскольку мы контролируем оба конца этого соединения, то устанавливаем политику, согласно которой SSH-сервер, к которому подключаемся, должен принять SSH-ключ и установить соединение (строка 3). Если соединение установлено успешно, выполняем команду (строка 5), которую мы передали функции ssh_command.

Затем, если команда сгенерировала вывод, отображаем в консоли каждую его строчку.

В главном блоке задействуется новый модуль getpass (строка 14). С его помощью можно получить имя пользователя в текущей среде, но поскольку в двух наших системах используются разные имена, мы просим пользователя ввести свое имя в командной строке. Затем вызываем функцию getpass, чтобы запросить пароль (к разочарованию тех, кто любит подглядывать, введенный текст не будет отображаться в консоли). Затем мы получаем IP-адрес, порт и команду, которую нужно выполнить и передаем все это функции ssh_command (строка 22).

Проведем небольшую проверку и подключимся к нашему серверу Linux:

Как видите, мы подключились и затем выполнили команду. Вы можете легко адаптировать этот скрипт для выполнения сразу нескольких команд на одном или разных SSH-серверах.

Разобравшись с основами, модифицируем этот скрипт, чтобы он мог выполнять команды по SSH на Windows-клиенте. Конечно, обычно для подключения к SSH-серверу используют SSH-клиент, но поскольку в стандартной поставке большинства версий Windows нет SSH-сервера, нам нужно поменять сервер и клиент местами, чтобы первый мог слать команды второму.

Создайте файл с именем ssh_rcmd.py и вставьте следующий код:

Верхняя часть у этой программы такая же, как и у предыдущей. Различия начинаются в цикле while True:. Вместо выполнения одной команды, как делали ранее, мы последовательно берем команды из соединения (строка 15), выполняем их (строка 21) и затем возвращаем весь вывод вызывающей стороне (строка 22).

Также заметьте, что в качестве первой команды мы шлем ClientConnected (строка 25). Причину этого вы поймете, когда будет создана обратная сторона SSH-соединения.

Теперь напишем программу, которая создаст SSH-сервер, чтобы к нему мог подключиться наш SSH-клиент, на стороне которого будут выполняться команды. Он может работать в системе под управлением Linux, Windows или даже macOS — главное, чтобы там были установлены Python и Paramiko.

Создайте файл с именем ssh_server.py и наберите следующее:

В этом примере мы используем SSH-ключ, входящий в состав демонстрационных файлов Paramiko (строка 8).

Мы начинаем прослушивать сокет (строка 28), как вы уже видели ранее в этой главе, но затем добавляем поддержку SSH (строка 10) и настраиваем методы аутентификации (строка 38).

Когда клиент аутентифицируется (строка 48) и пошлет нам сообщение ClientConnected (строка 49), любая команда, введенная в SSH-сервер (на компьютере, где запущен скрипт ssh_server.py), будет передаваться на выполнение SSH-клиенту (на компьютер, где запущен скрипт ssh_rcmd.py), а тот в свою очередь станет возвращать вывод SSH-серверу.

Попробуем реализовать это на практике.

Проверка написанного

В демонстрационных целях клиент будет запущен на нашем (принадлежащем авторам) компьютере под управлением Windows, а сервер — на Mac. Вот как запускается сервер:

Теперь запустим клиент на компьютере с Windows:

Если вернуться к серверу, можно наблюдать процесс соединения:

Как видите, клиент успешно подключился, после чего мы выполнили несколько команд. SSH-клиент ничего не выводит, но выполняет те команды, которые мы ему отправляем, а вывод передается обратно нашему SSH-серверу.

РЕКОМЕНДУЕМ:

ВКонтакте
OK
Telegram
WhatsApp
Viber

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *