Как автоматизировать SSH управление компьютерами с помощью Expect

Как автоматизировать SSH управление компьютерами с помощью Expect

Этичный Хакер

Если вы занимаетесь автоматизацией, то Bash scripting-это обычно правильный путь. Однако есть несколько ограничений, и одно из них-вход в другое устройство, например Raspberry Pi и запуск сценария автоматически. Чтобы помочь в таких ситуациях, мы собираемся автоматизировать доставку полезной нагрузки SSH с помощью сценария "expect".

Bash scripting больше похож на склеивание вещей вместе, поэтому он не способен делать все, включая предсказание, а затем реагировать на определенные переменные. Поэтому мы собираемся использовать сценарий "expect", чтобы войти в наш Raspberry Pi и автоматически выключить его. Мы также могли бы адаптировать сценарий для передачи практически любой полезной нагрузки, которую мы хотим передать Пи.

Это довольно удивительное использование сценария expect, и есть много разных вещей, которые вы можете сделать с ним, так что знайте, что наше руководство просто царапает поверхность того, как вы можете взять сценарий expect и использовать его на самом деле для выполнения вещей, которые в противном случае потребовали бы гораздо большего взаимодействия с пользователем.

Чтобы следовать этому, Вам понадобится компьютер Linux, работающий под управлением чего — то вроде Kali или Ubuntu- даже Mac будет работать. Кроме того, вам нужно будет установить arp-scan и expect tools. На Kali вы можете сделать это с помощью apt install arp-scan expect, и вы будете настроены.

Cоздайте сценарий Expect

Сценарии Expect обычно используются в сочетании со сценариями Bash для автоматизации определенных вещей, таких как сканирование сети или доставка полезной нагрузки. Поскольку они так хорошо работают вместе, можно автоматизировать все виды интересных вещей. Здесь мы собираемся выбить любой Raspberry Pis в сети, используя учетные данные по умолчанию, из сети.

Expect-это уникальный язык сценариев, который эмулирует нажатия клавиш, отвечая на ожидаемые ответы от локальной или удаленной системы. Думайте о себе как об автоматизированном, виртуальном вы.

Сценарий expect.exp, который мы демонстрируем, включен в наш trigger.sh сценарий, поэтому нам нужно сначала его создать. Если вы хотите, запустите новый каталог (mkdir) и войдите в expect.exp, чтобы запустить черновик скрипта. Затем скопируйте и вставьте в него скрипт, представленный ниже, нажмите Control-X, чтобы выйти, Y, чтобы добавить его в буфер, и Enter, чтобы сохранить файл.

#!/usr/bin/expect -f

set timeout 20
set ip [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]
spawn ssh "$user\@ip" "reboot"
expect "assword:"
send "$password\r";
interact

Создайте сценарий Trigger Bash

Прежде чем мы погрузимся в то, что все это делает, давайте создадим trigger.sh, наш сценарий Bash. Итак, в том же каталоге используйте nano для создания нового trigger.sh файл. В него скопируйте и вставьте следующий код. Нажмите Control-X, чтобы выйти, Y, чтобы добавить его в буфер, и Enter, чтобы сохранить файл.

#! bin/bash
echo What is the passcode?
read loginpass
expect expect.exp $(arp-scan -l | grep Raspberry | awk '{print $1}') root $loginpass

Вы можете видеть, что он начинается со стандартного shebang (#!) и bin/bash; это просто заставляет язык Bash использоваться для остальной части скрипта.

Во второй строке мы используем echo, чтобы показать пользователю запрос, который говорит: "что такое пароль?" Затем мы считываем все входные данные и сохраняем их как переменную loginpass.

Наконец, trigger.sh Открывает наш сценарий expect, где мы, по сути, передаем ему три переменные. Как обсуждалось в предыдущем уроке Bash, круглые скобки () означают, что все внутри него произойдет до того, как продолжить работу с остальными командами в однострочной строке, а знак доллара ($) указывает на переменную. Таким образом, какой бы ни был ответ на содержание внутри скобок, он будет переменной.

Итак, первая часть уравнения заключается в том, что выполняется arp-сканирование. Это отправляет пакеты ARP хостам в локальной сети, а затем отображает свои ответы. Затем grep, утилита командной строки для поиска по тексту , смотрит на результаты сканирования слова Raspberry для поиска Raspberry Pis. Затем awk, еще один инструмент для поиска по тексту, ищет IP-адрес микроконтроллера, найденный из arp-scan и grep, и печатает окончательные результаты.

После того как все это будет сделано, он передает имя пользователя root Pi, которое используется по умолчанию в Pis. Это немного навеяно Raspberry Hunter, или rpi-hunter, который охотится за Pis, используя учетные данные по умолчанию в сети, пытается войти в них, а затем отправлять полезные нагрузки.

Наконец, он передает пароль Пи через пароль, введенный пользователем и сохраненный в виде переменной loginpass.

Шаг 3запустите триггерный скрипт Bash

А теперь давайте запустим сценарий. После того, как он начнется, вас попросят ввести пароль врага. Давайте сначала посмотрим, что происходит, когда мы вводим неправильный пароль.

~$ bash trigger.sh

What is the enemy passcode?
kdsjsdgliyea

spawn ssh root@192.168.1.183 reboot
The authenticity of host '192.168.1.183 (192.168.1.183)' can't be established.
ECDSA key fingerprint is SHA256:wG9YqeFrX90eEjV9+APhnxVkA3DduuZ+d9RbypwKFp4E.
Are you sure you want to continue connecting (yes/no)? yes

kdsjsdgliyea
yes
Please type 'yes' or 'no': yes

Warning: Permanently added '192.168.1.183' (ECDSA) to the list of known hosts.
Welcome to meye-16b312e&!
root@192.168.1.183's password:

Как вы можете видеть, он попытался создать SSH-скрипт, чтобы передать команду перезагрузки Raspberry Pi. Поскольку мы ввели неверный пароль, он не сработал, и тогда он спросил нас, не хотим ли мы продолжить, что означало "да"." Затем он спрашивает нас, хотим ли мы войти в систему. Мы сказали "да", и он попытался войти в Raspberry Pi, но не смог, потому что у него был неправильный пароль.

Хотя это и не удалось, он все же смог найти Raspberry Pi в сети и попытался подключиться к нему по SSH. А теперь давайте посмотрим, что произойдет, когда у нас будет настоящий пароль. Следует отметить одну вещь: если вы впервые входите во что-то через SSH, оно сначала попросит вас подтвердить, и это, вероятно, нарушит работу сценария Bash. Чтобы убедиться, что он работает, сначала войдите в систему.

~$ bash trigger.sh

What is the enemy passcode?
starstar

spawn ssh root@192.168.1.234 reboot
root@192.168.1.234's password:
Connection to 192.168.1.234 closed by remote host.

Как вы можете видеть, он успешно обнаружил Raspberry Pi в сети, породил SSH-сеанс и дал ему команду перезагрузки. Затем он ввел пароль, который был введен Пользователем в качестве переменной. После входа в систему он закрыл хост, заставив Raspberry Pi перезагрузиться и выгнать нас.

Как работает сценарий Expect

Мы подробно описали trigger.sh файл и что он делает, но теперь давайте посмотрим на expect.sh код, чтобы увидеть, что он делает со всей информацией, передаваемой сценарием Bash.

Во-первых, он начинается со стандартного шебанга (#!), usr/bin/expectи tack f (-f); это просто заставляет интерпретатор Expect использоваться для остальной части скрипта.

Затем мы устанавливаем тайм-аут в 20 секунд, так что сценарий истекает через это время. Затем у нас есть строка set ip, которая принимает первый аргумент, переданный expect.sh, и это будут результаты arp-сканирования в trigger.sh — IP-адрес Raspberry Pi. Lindex $argv 0 просто говорит ему искать первый переданный аргумент, и он начинается с нуля, что важно помнить.

Затем мы имеем заданную пользовательскую строку, которая ищет второй переданный аргумент, в данном случае root. После этого строка set password ищет третий переданный аргумент, в данном случае пароль пользователя, который был предоставлен trigger.sh.

Теперь все становится интересным. Ожидайте, что скрипты могут порождать процессы, и здесь мы порождаем процесс SSH (spawn ssh) и используем переменные так же, как и в Bash. Он берет переменную $user, root, а затем добавляет @ с переменной $ip, IP-адресом Pi. Вот как он соединяется с Пи. Затем, как только он входит в систему, он выдает команду перезагрузки.

Однако прежде чем все это произойдет, нам нужно использовать ожидаемую часть скрипта, где мы ищем что-то, что в основном приходит к нам, и набираем строку assword. Забавно, но есть причина, по которой мы это делаем. Если это заглавная "Р" или строчная "р", это действительно не имеет значения в зависимости от того, какой это сервер. Он всегда будет спрашивать у нас пароль. Так что, если это не все заглавные буквы, что немного менее вероятно, то мы, скорее всего, получим большинство различных способов запроса пароля.

Таким образом, сценарий ожидает, что запрос или текстовая строка скажут "пароль" или "пароль"." Если он получает это, то он идет вперед и отправляет результат, который в нашем случае является паролем, введенным пользователем еще в нашем сценарии Bash. То взаимодействовать линия вводит в действие весь сценарий.

Вы можете многое сделать с помощью сценариев Expect

Сценарии Expect не являются интерактивными, поэтому мы должны использовать сценарии Bash для передачи информации. Например, мы не можем иметь пользовательский ввод непосредственно в этом сценарии expect. Это очень раздражает, что мы не можем, поэтому в результате очень хорошо работает сценарий Bash, который собирает всю необходимую информацию, передает ее в сценарий expect, а затем этот сценарий expect автоматизирует что-то.

В целом сценарии expect удобны для создания чат-ботов или работы с чем-либо, где у вас есть ожидаемый ввод и ответ, который вы хотите автоматизировать. Теперь, в сочетании со сценариями Bash, вы можете автоматизировать все виды мощных инструментов, так что это только начало, и я надеюсь, что вы сможете использовать его для создания действительно интересных автоматизаций.






Report Page