Защита от хакеров корпоративных сетей. Коллектив авторов
Чтение книги онлайн.

Читать онлайн книгу Защита от хакеров корпоративных сетей - Коллектив авторов страница 55

СКАЧАТЬ strace cat test

      execve(“/bin/cat”, [“cat”, “test”], [/* 21 vars */]) = 0

      Утилита strace не начинает вывод до тех пор, пока не будет вызвана команда cat. Поэтому нельзя отследить процесс ее поиска командным процессором shell. К моменту начала работы утилиты strace команда cat находилась в директории /bin. Из примера трассировки видно, что входными параметрами программы execve являются местонахождение cat, ее имя, аргумент (test) и список из 21 переменной окружения.

      brk(0) = 0x804b160

      old_mmap(NULL, 4096, PROT_READ|PROT_WRITE,

      MAP_PRIVATE|MAP_ANONYMOUS, – 1, 0) = 0x40014000

      open(“/etc/ld.so.preload”, O_RDONLY) = -1 ENOENT (No

      such file or directory)

      После вызова execve начинается обычный процесс загрузки: распределение памяти и т. д. Отметим свидетельствующий об ошибке код возврата, равный —1, при попытке открыть /etc/ld.so.preload. Ошибка поясняется диагностическим сообщением об отсутствии файла или директории. Действительно, такого файла нет. Из примера ясно, что если вместо файла указать параметры так, как это указано в примере open, execve самостоятельно найдет файл. Это было бы полезно для последующих действий привилегированного пользователя. Но для этого нужно поместить новый файл в директорию /etc, в которой запрещено что-либо делать до тех пор, пока кто-нибудь не откорректирует файл системных разрешений. В большинстве Unix-систем право записи в директорию /etc имеет только пользователь, получивший привилегированные права «root» тем или иным способом. Это еще одна причина, по которой обычные пользователи не могут писать в /etc. Если задаться целью спрятать Троянского коня, то лучшего места не найти (после того как будут получены права привилегированного пользователя root).

      open(“/etc/ld.so.cache”, O_RDONLY) = 4

      fstat(4, {st_mode=S_IFREG|0644, st_size=12431, ...}) = 0

      old_mmap(NULL, 12431, PROT_READ, MAP_PRIVATE, 4, 0) =

      0x40015000

      close(4) = 0

      open(“/lib/libc.so.6”, O_RDONLY) = 4

      fstat(4, {st_mode=S_IFREG|0755, st_size=4101324, ...}) = 0

      read(4,

      “\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\210\212”...,

      4096) = 4096

      Прочитаны первые 4 Кб библиотеки libc. Libc – это стандартная библиотека коллективного доступа, в которой расположены функции, вызываемые из программ на языке C (такие как printf, scanf и т. д.).

      old_mmap(NULL, 1001564, PROT_READ|PROT_EXEC, MAP_PRIVATE, 4,

      0) = 0x40019000

      mprotect(0x40106000, 30812, PROT_NONE) = 0

      old_mmap(0x40106000, 16384, PROT_READ|PROT_WRITE,

      MAP_PRIVATE|MAP_FIXED, 4, 0xec000) = 0x40106000

      old_mmap(0x4010a000, 14428, PROT_READ|PROT_WRITE,

      MAP_PRIVATE|MAP_FIXED| MAP_ANONYMOUS, -1, 0)

      = 0x4010a000

      close(4) = 0

      mprotect(0x40019000, 970752, PROT_READ|PROT_WRITE) = 0

      mprotect(0x40019000, 970752, PROT_READ|PROT_EXEC) = 0

      munmap(0x40015000, 12431) = 0

      personality(PER_LINUX) = 0

      getpid() = 9271

      brk(0) = 0x804b160

      brk(0x804b198) = 0x804b198

      brk(0x804c000) = 0x804c000

      open(“/usr/share/locale/locale.alias”, O_RDONLY) = 4

      fstat64(0x4, 0xbfffb79c) = -1 ENOSYS (Function not

      implemented)

      fstat(4, {st_mode=S_IFREG|0644, st_size=2265, ...}) = 0

      old_mmap(NULL, 4096, PROT_READ|PROT_WRITE,

      MAP_PRIVATE|MAP_ANONYMOUS, – СКАЧАТЬ