Windows 2000 вкрутую
введение
Все нижеследующее – это статья, которую я написал некоторое время назад после тестирования и исследований с помощью VMware. Это позволило получить ответы на некоторые имевшиеся у меня вопросы и стало полезным, по крайней мере, в одном случае: Я разместил статью на своем сайте и получил определенное количество хитов от Google по вариациям «hack administrator XP».
Перед тем, как начать, я обязан отметить, что редактирование реестра Windows в подавляющем большинстве случаев вещь небезопасная и шаги, описанные в статье – откровенный риск. Microsoft точно не поможет вам, если вы полезете в реестр, даже если вы будете руководствоваться одной из статей их базы знаний. Если вы его (реестр) испоганите, то у вас есть все шансы привести систему в полностью неработоспособное состояние (мне ли этого не знать – добрая часть моих попыток закончилась именно так). Даже если вы воспроизведете все шаги абсолютно точно, все равно остается риск получить испорченную систему после удаления всех администраторских аккаунтов. Вначале прочитайте всю статью целиком, а затем, если вы все еще в этом заинтересованы, попробуйте поработать с тестовой машиной до тех пор, пока не убедитесь, что точно поняли, что и зачем вы делаете. Дальше решайте сами. Поймите, пожалуйста, что это не эксплойт для получения больших привилегий или что-то в этом роде. За исключением одного варианта, о котором я расскажу в конце статьи, для проведения необходимых действий вы уже должны иметь права администратора.
Но перед тем, как перейти к делу - еще одно длинное вступление :)
Несколько лет назад я оказался в ситуации, когда возникла проблема с действительно хорошо защищенной машиной – где требования безопасности стоят выше других возможностей (как, например, возможность постоянного доступа к машине и тому подобное). Заключалась она в том, что было необходимо удалить или отключить встроенный в NT аккаунт Администратора. Это проблема, поскольку NT не предоставляет какого-либо штатного способа сотворить такую вещь.
Я провел довольно много времени, работая с SAM (Security Accounts Manager – кусок базы данных реестра Windows, содержащий информацию, касающуюся безопасности пользователей) и в результате понял, как он контролирует доступ к своим группам. Я использовал этот подход, так как NT назначает привилегии не индивидуально, а основываясь на членстве в группе (именно так: если вы создадите новый пользовательский аккаунт и поместите его в локальную группу Администраторов, он будет так же эффективен, как и встроенный администраторский аккаунт).
Исходя из этих соображений, я решил, что простейший способ достичь своей цели – это не пытаться удалить аккаунт Администратора, а просто убрать его из локальной группы Администраторов, тем самым, лишив его привилегий. Вооруженный пониманием того, как NT управляет группами в SAM, я удалил встроенный администраторский аккаунт из группы Администраторов.
Вуаля! Я получил встроенный аккаунт Администратора, который теперь даже не мог залогиниться на сервер/рабочую станцию/куда либо еще. По сути, он не входил ни в одну группу и таким образом не имел совершенно никаких прав, что даже меньше, чем возможности Guest.
пояснение проблем и технических деталей
Убедитесь, что сервис планирования задач (Task Scheduler) запущен под LocalSystem-аккаунтом и что он может взаимодействовать с Рабочим столом. Затем откройте консоль (cmd) и дайте команду:
at <некоторая_точка_в_ближайшем_будущем> /interactive cmd
Это запустит cmd.exe в контексте безопасности аккаунта LocalSystem. Это очень привлекательно, так как процессы LocalSystem в Windows работают в ring0, или пространстве ядра. Используйте это для запуска regedit.exe (так проще отслеживать происходящее, чем при использовании regedt32.exe). Найдите ключ HKLMSAMSAMDomainsBuiltinAliases00000220.
Там содержится единственное значение типа REG_BINARY, помеченное как C. Войдите в режим редактирования (кстати говоря, каждый номер в ссылках Aliases относится к одной из локальных групп системы, 00000220 – это локальная группа Администраторов). В строке 0028 пятый байт данных (каждая строка должна содержать восемь байт данных в hex) представляет собой простую контрольную сумму, в которой записано (в hex) сколько байт данных в конце записи содержат SID’ы пользователей (скоро я объясню подробнее).
Когда вы добавляете и удаляете пользователей обычным способом, система добавляет или убирает 28-байтовый блок данных в конце бинарной записи в этом ключе. Таким образом, содержащиеся в этих байтах данные всегда будут произведением 28, что в hex будет выглядеть как 1C, 38, 54 и так далее (или 00, если в группе Администраторов никого нет ;-).
В строке 0030 первый байт данных содержит количество находящихся в данный момент в группе пользователей. Или, говоря другими словами, если вы разделите число, представленное в пятом байте строки 0028 на 28 (десятичное), вы получите число пользователей в группе и это число должно быть в первом байте строки 0030. Я уверен, что вы уловили суть, но для закрепления дам несколько примеров:
Если в локальной группе Администраторов один пользователь, тогда пятый байт строки 0028 должен содержать 1C, а первый байт строки 0030 должен быть 01.
Если в локальной группе Администраторов пять человек, тогда пятый байт строки 0028 должен быть 8C, и первый байт строки 0030 должен содержать 05.
В итоге, в конце бинарных данных (возможно от пятого байта строки 0168) находится начало записи SID’ов (Security Identifiers) всех членов группы (там находятся 28-байтные блоки данных, которые добавляются и удаляются, когда добавляются и удаляются пользователи – и это два первых элемента, на которые я ссылался). Они все начинаются с 12-байтного блока данных, который выглядит как:
01 05 00 00 00 00 00 05 15 00 00 00
за которым следует 16 байт данных, в которых записан актуальный уникальный SID. Получение SID тривиально, есть куча разных способов. Я буду иметь дело только с аккаунтами локальной машины (поскольку они-то мне и интересны). Для того чтобы найти SID аккаунта на локальной машине, прокрутите до HKLMSAMSAMDomainsAccountUsers. Там находятся нумерованные ключи, содержащие данные о каждом локальном пользователе. Ключ встроенного администраторского аккаунта – 000001F4. Вы можете получить перекрестную ссылку на то, какие номера к которым аккаунтам относятся, обратившись к HKLMSAMSAMDomainsAccountUsersNames<вставьте_здесь_имя_пользователя >. Значение по умолчанию в этом ключе будет 0x<что-нибудь>. И это есть номер ключа в HKLMSAMSAMDomainsAccountUsers, который содержит сведения о них и SID.
Другими словами, чтобы найти SID локального Администратора, идите к HKLMSAMSAMDomainsAccountUsersNamesAdministrator, значение по умолчанию в этом ключе – 0x1f4, следовательно, ключ, содержащий данные о встроенном Администраторе находятся в HKLMSAMSAMDomainsAccountUsers000001F4.
Как только вы нашли правильный ключ для пользователя, которого вы хотите добавить/удалить, сделайте двойной щелчок на значении REG_BINARY, обозначенном как V и прокрутите данные примерно до середины. После небольшой тренировки вы сможете отловить последовательность:
01 05 00 00 00 00 00 05 15 00 00 00
После нее следуют 16 байт данных, содержащих уникальный SID.
Наконец, используем всю эту информацию для осуществления «хака».
Для добавления пользователя:вы можете просто скопировать и вставить все 28 байт данных SID’а пользователя в конец значения C в HKLMSAMSAMDomainsBuiltinAliases00000220. Затем поправьте контрольную сумму и значение счетчика (в строках 0028 и 0030) с 28 (+1C в hex) и 1 соответственно, и вы добавили пользователя в группу Администраторов.
Для удаления пользователя(даже встроенного Администратора): просто вырежьте 28 байт данных, которые относятся к пользователю в конце значения C в HKLMSAMSAMDomainsBuiltinAliases00000220. Затем поправьте контрольную сумму и значение счетчика (в строках 0028 и 0030) с 28 (+1C в hex) и 1 соответственно, и вы удалили пользователя из группы Администраторов.
некоторые примечания
На деле все довольно просто, хотя могут быть и несколько более сложные варианты. Надеюсь, что довольно долгое обсуждение, с которым вы только что ознакомились, поможет вам отыскать собственные пути решения требуемых задач.
Если вы вручную избавитесь от внешних средств безопасности (имеются в виду Domain Accounts) в группе Администраторов, вам также потребуется удалить соответствующий ключ в HKLMSAMSAMDomainsBuiltinAliasesMembers<SID модифицированной группы>.
Я действительно не могу это доступно объяснить – просто добавьте и удалите доменный аккаунт с помощью GUI, одновременно наблюдая за происходящем в этом ключе, и вы поймете, что я имею в виду. Не беспокойтесь об этом, если вы добавляли аккаунт или работали только с локальными аккаунтами. Наконец, будьте внимательны, так как любое действие, предпринимаемое с помощью GUI, увеличивает значение счетчика в одном из значений в HKLMSAMSAMDomains...
Прошло довольно многого времени с той поры, когда я сам это делал и сейчас я точно не помню, где конкретно оно находится, но вам не следует переживать по этому поводу, если вы сделаете все вручную. Я предполагаю, что это используется при контроле версий SAM для PDC, которое реплицируется с BDC и тому подобное – но я этого не проверял. Приз любому, кто займется этим и расскажет почтенной публике ;-)
В заключение – исключение с увеличением уровня привилегий, которое я упоминал в начале статьи. Microsoft включает в установку Windows Server несколько групп по умолчанию. Одна из них – группа Server Operators – располагает сравнительно неплохим уровнем доверия и физическим доступом к серверу. Эта группа имеет полномочия на добавление принтеров, осуществление обслуживания и так далее, но они не Администраторы и не могут создавать аккаунты и наделять их своими полномочиями.
Как бы то ни было, Microsoft включила специальную привилегию, которая может быть активирована для этой группы (хвала богам, она по умолчанию отключена), которая позволяет им планировать задания. В свете только что прочитанного вами, я уверен, вы понимаете, что это предоставляет практически неограниченные возможности для предприимчивого Server Operator’а.
Если они обладают правами планирования задач и сервис Task Scheduler оставлен работать как LocalSystem (практически повсеместный случай), то Server Operator может предпринять описанные в этой статье шаги и добавить себя в группу Администраторов, тем самым, подняв уровень своих привилегий выше положенного. Дополнительно, само собой, они могут удалить встроенный Администраторский аккаунт. Пища для размышлений…
Вот так. Это все.
Мне потребовалось две недели на то, чтобы убедиться, что я понял все, что подверглось изменениям, и воспроизвести это самостоятельно. Наслаждайтесь «хакингом» :)
esrever_otua, перевод Алексея Кутовенко.
обсуждение статьи
Сетевые решения. Статья была опубликована в номере 08 за 2004 год в рубрике save ass…