Как стать автором
Обновить

Зеркало сервера обновлений ESET на Linux

Время на прочтение6 мин
Количество просмотров25K
Каждый из вас, кому приходится держать корпоративный linux-сервер может сталкивается с тем, что у замечального антивируса ESET нет сервера обновлений под linux, виртуалку windows с ESET Remote Administrator Server под такое поднимать, конечно, нет желания, а это значит настала пора его написать самим. Тема не претендует на новшество, этот вопрос достаточно рассмотрен в интернете, однако, мне не попадалось хороших решений, давайте же доведем скрипт до ума. Наш скрипт должен уметь находить новые пароли к официальным серверам на просторах интернетов и поддерживать базы для всей линейки продуктов, таких как Smart Security, Business Edition, Home Edition, Exchange Server.
Оставим легитимность данных действий на вашей совести, статья дается для ознакомления с особенностями обновления баз антивируса, и не является руководством к нарушению законности. Во избежание нарушений вы должны пользоваться только Evaluation License от ESET.
Итак, неонка внутре:

0. Место действия

Представим, что у нас есть домашний каталог /var/www/site.ru/web, который является DocumentRoot для вашего виртуалхоста. Подразумеваем, что мы все файлы кладем туда, если не сказано иного. Поэтому, если мы хотим запускать скрипт через cron, в начале нашего основного скрипта мы должны поставить следующие действия.
CURDIR=/var/www/site.ru/web
cd $CURDIR


1. Где брать аккаунты лицензий?

На глаза попалось мне несколькомегабайтное творение под примерным названием «Eset Password Finder», не помню точно. Трудно встретить куда более эффективный способ распространить malware безантивирусным юзерам. Бегло просмотрев exe-шник hex-вьюером, в символах была обнаружена ссылка на китайский сайт http://www.nnvv.org, где ежедневно, выкладываются свежие пароли. Напишем простой парсер, который на выходе выдает пару переменных в формате bash:
USERNAME=EAV-xxx
PASSWORD=xxx

Не будем придумывать велосипед и плодить сущности, возьмем готовый фреймворк PHP simplehtmldom для обхода дерева DOM. Благодаря ему у нас скрипт примет следующий вид:
./getpass.php:
#!/usr/bin/php
<?php
require('simple_html_dom.php'); // положите файл фреймворка в наш каталог
$html = file_get_html('http://www.nnvv.org/');
$a=$html->getElementById("#nod32ids")->children(0)->children(0)->plaintext;
$a = str_replace("Username:", 'USERNAME=', $a);
$a = str_replace("Password:", 'PASSWORD=', $a);
echo $a."\n";
?>
сделаем его исполняемым chmod 755 ./getpass.php и на этом его так и оставим.

2. Создание необходимых директорий

mkdir -p ./download/engine3
mkdir -p ./download/engine3ess
mkdir -p ./eset_upd
mkdir -p ./download/win/emsx
mkdir -p ./download/win/v3eav
mkdir -p ./download/win/v3ess
mkdir -p ./download/win/v3eav/pre
mkdir -p ./download/win/v3ess/pre

Структура полностью повторяет иерархию каталогов на официальных серверах.

3. Получение информации об обновлениях

Данные о текущих базах хранится в файле http://update.eset.com/eset_upd/update.ver и запакован он старым бесплатным архиватором unrar-0.0.1, который, впрочем, несовместим с Рошалевским. Скачайте unrar-0.0.1, скомпилируйте, после компиляции положите бинарник unrar к нам в каталог нашего места действия. После распаковки update.ver можно распарсить, сгенерировав списки URL файлов обновлений.
wget -q --timestamping http://update.eset.com/eset_upd/update.ver
mv -f update.ver update.rar
cd eset_upd
../unrar e -f -y -c- ../update.rar 2>&1 >/dev/null
cd ..
mv -f update.rar update.ver
grep file= $CURDIR/eset_upd/update.ver |grep "engine3/"| sed -e 's/file\=/http\:\/\/um10.eset.com/' |grep -v data > downlist1.txt
grep file= $CURDIR/eset_upd/update.ver |grep engine3ess| sed -e 's/file\=/http\:\/\/um10.eset.com/' |grep -v data > downlist2.txt
grep file= $CURDIR/eset_upd/update.ver |grep emsx| sed -e 's/file\=/http\:\/\/um10.eset.com/' |grep -v data > downlist5.txt
grep file= $CURDIR/eset_upd/update.ver |grep v3eav|grep -v pre| sed -e 's/file\=/http\:\/\/um10.eset.com/' |grep -v data > downlist3.txt
grep file= $CURDIR/eset_upd/update.ver |grep v3ess|grep -v pre| sed -e 's/file\=/http\:\/\/um10.eset.com/' |grep -v data > downlist4.txt
grep file= $CURDIR/eset_upd/update.ver |grep v3eav|grep pre| sed -e 's/file\=/http\:\/\/um10.eset.com/' |grep -v data > downlist6.txt
grep file= $CURDIR/eset_upd/update.ver |grep v3ess|grep pre| sed -e 's/file\=/http\:\/\/um10.eset.com/' |grep -v data > downlist7.txt


4. Получаем обновления

Грабим свежие пароли с помощью PHP скрипта, который мы сделали ранее.
./getpass.php > ./pass.sh
sed -i 's/\r//' pass.sh # убираем виндовый перенос строки после первой строчки, иначе wget с параметром --http-user=$USERNAME не может подключиться к серверу.
source ./pass.sh

Для получения баз используем wget с параметром --timestamping, что позволит нам не скачивать повторно уже ранее загруженные файлы. Для осторожности используем официальный --user-agent, для авторизации используется обычная пара --http-user/--http-password. Список файлов для wget можно передать параметром --input-file=.
wget --timestamping --http-user=$USERNAME --http-password=$PASSWORD --input-file=../../downlist1.txt --user-agent="ESS Update (Windows; U; 32bit; VDB 7001; BPC 4.0.474.0; OS: 5.1.2600 SP 3.0 NT; CH 0.0; LNG 1049; x32c; UPD http://um10.eset.com; APP ess; BEO 1; CPU 5964; ASP 0.0)"
cd ../engine3ess/
wget --timestamping --http-user=$USERNAME --http-password=$PASSWORD --input-file=../../downlist2.txt --user-agent="ESS Update (Windows; U; 32bit; VDB 7001; BPC 4.0.474.0; OS: 5.1.2600 SP 3.0 NT; CH 0.0; LNG 1049; x32c; UPD http://um10.eset.com; APP ess; BEO 1; CPU 5964; ASP 0.0)"
cd ../win/v3eav/
wget --timestamping --http-user=$USERNAME --http-password=$PASSWORD --input-file=../../../downlist3.txt --user-agent="ESS Update (Windows; U; 32bit; VDB 7001; BPC 4.0.474.0; OS: 5.1.2600 SP 3.0 NT; CH 0.0; LNG 1049; x32c; UPD http://um10.eset.com; APP ess; BEO 1; CPU 5964; ASP 0.0)"
cd ../v3ess/
wget --timestamping --http-user=$USERNAME --http-password=$PASSWORD --input-file=../../../downlist4.txt --user-agent="ESS Update (Windows; U; 32bit; VDB 7001; BPC 4.0.474.0; OS: 5.1.2600 SP 3.0 NT; CH 0.0; LNG 1049; x32c; UPD http://um10.eset.com; APP ess; BEO 1; CPU 5964; ASP 0.0)"
cd ../emsx/
wget --timestamping --http-user=$USERNAME --http-password=$PASSWORD --input-file=../../../downlist5.txt --user-agent="ESS Update (Windows; U; 32bit; VDB 7001; BPC 4.0.474.0; OS: 5.1.2600 SP 3.0 NT; CH 0.0; LNG 1049; x32c; UPD http://um10.eset.com; APP ess; BEO 1; CPU 5964; ASP 0.0)"
cd ../v3eav/pre/
wget --timestamping --http-user=$USERNAME --http-password=$PASSWORD --input-file=../../../../downlist6.txt --user-agent="ESS Update (Windows; U; 32bit; VDB 7001; BPC 4.0.474.0; OS: 5.1.2600 SP 3.0 NT; CH 0.0; LNG 1049; x32c; UPD http://um10.eset.com; APP ess; BEO 1; CPU 5964; ASP 0.0)"
cd ../../v3ess/pre/
wget --timestamping --http-user=$USERNAME --http-password=$PASSWORD --input-file=../../../../downlist7.txt --user-agent="ESS Update (Windows; U; 32bit; VDB 7001; BPC 4.0.474.0; OS: 5.1.2600 SP 3.0 NT; CH 0.0; LNG 1049; x32c; UPD http://um10.eset.com; APP ess; BEO 1; CPU 5964; ASP 0.0)"


Это все. Не забываем полученный скрипт(назовем его nodupdate.sh, например) прописать в cron
# sudo crontab -e
50 * * * * /var/www/site.ru/web/nodupdate.sh 2> /dev/null


5. Настройка клиента

  • Вызываем окно антивируса
  • Нажимаем F5, появится окно настроек Advanced setup
  • Update — Update server — Edit — Add
  • Добавляем строчку http://site.ru если мы работали в DocumentRoot, то место обновления у нас как бы корень, то есть / а не /mirror/ или /update/, как встречается кое-где.
  • жмем ОК.
  • Для пущей важности очистить кеш обновлений — Clear update cache. Дело в том, что неочищенный кеш обновлений может стать причиной, по которой антивирус, порой, перестает обновляться.


6. Резюме

Полный текст скрипта вы можете найти на Pastebin.

Как оказалось, не требуется специальных утилит или особых знаний, чтобы сделать свое зеркало обновлений. Надо понимать, что цель данного поста — только ознакомление с особенностями работы системы обновлений продуктов ESET, а цель решения — только экономия корпоративного трафика, и ни в коем случае не способ нарушить закон. По идее, чтобы воспользоваться данным скриптом, у вас должны быть легально приобретенные лицензии на все обновляемые с зеркала экземпляры антивируса, это остается на вашей совести. Можно переписать код так, чтобы он искал только Evaluation License, пользоваться которыми, вроде, достаточно законно. Данным решением один знакомый пользуется уже три года, практически без изменений. Вес всех обновлений будет где-то 300 мегабайт, с учетом последующих докачек может вырасти до 700-900 метров. Раз в полгода можно удалять файлы баз, чтобы избавиться от устаревших файлов. Сам формат файла update.ver очень прост, разбит по секциям, оттуда можно узнать всю структуру каталогов на сервере, и после выхода новых продуктов ESET просто дописывать в скрипт эти пути.

UPD 2012.04.24: Небольшие изменения (спасибо zombicy).
Вместо getpass.php используем getpass.sh:
$ cat getpass.sh

#!/bin/sh

curl www.nnvv.org | \
grep -A1 `date +%Y-%m-%d` | \
awk '$9 ~ /Password/ \
{if(sub(/Username:/,"+USERNAME=")) \
{if(sub(/<br\/>Password:/,"+PASSWORD=")) \
{if(sub(/<\/p>/,"\n")) { print $8"\n"$9 }}}}' | \
awk -F"+" '{ print $2 }' > pass.sh

Скрипт забирает username/password за сегодняшнее число.

В скрипте nodupdate.sh соответственно заменяем getpass.php на getpass.sh и комментируем строку
sed -i 's/\r//' pass.sh,
в ней нет необходимости.
Теги:
Хабы:
+26
Комментарии27

Публикации