Идём по киберследу: Анализ защищенности Active Directory c помощью утилиты BloodHound — страница 37 из 46

$RequiresKeyArchival = "False"

}

# Конвертируем период действия сертификата в читаемый вид

$ValidityPeriod = Convert-pKIPeriod $template. properties.pKIExpirationPeriod.value

# Конвертируем период обновления сертификата в читаемый вид

$RenewalPeriod = Convert-pKIPeriod $template. properties.pKIOverlapPeriod.value

# Проверяем, содержит ли EKU значение Authenticate Client

if($template.properties.pKIExtendedKeyUsage -contains "1.3.6.1.5.5.7.3.2")

{

$AuthClient = "True"

}

Else

{

$AuthClient = "False"

}

# Проверяем наличие флага Enrollee Supplies Subject (ESC1)

if($Template.properties.'msPKI–Certificate-Name-Flag'. value -band "0x00000001")

{

$EnrolleeSuppliesSubject = "True"

}

else

{

$EnrolleeSuppliesSubject = "False"

}

# Проверяем наличие флага Any Purpose или пустое значение в EKU (ESC2)

if(($template.properties.pKIExtendedKeyUsage -contains "2.5.29.37.0") -or ($template.properties. pKIExtendedKeyUsage.Count -eq 0))

{

$AnyPurpose = "True"

}

Else

{

$AnyPurpose = "False"

}

# Проверяем наличие Request Agent в EKU (ESC3)

if($template.properties.pKIExtendedKeyUsage -contains "1.3.6.1.4.1.311.20.2.1")

{

$RequestAgent = "True"

}

Else

{

$RequestAgent = "False"

}

# Проверяем наличие флага msPKI-RA-Signature (ESC3)

if($template.properties.'msPKI-RA-Signature'.value -band "0x00000001")

{

$APSignature = "True"

}

else

{

$APSignature = "False"

}

# Проверяем наличие EnrollmentAgent в атрибутах Application Policies (ESC3)

if($template.properties.'msPKI-RA-Application-Policies' -contains "1.3.6.1.4.1.311.20.2.1")

{

$EnrollmentAgent = "True"

}

Else

{

$EnrollmentAgent = "False"

}

# Проверяем наличие флага NoSecurityExtension в атрибуте Enrollment Flag (ESC9 ESC10)

if($template.properties.'msPKI-Enrollment-Flag'.value -band "0x00080000")

{

$NoSecurityExtension = "True"

}

else

{

$NoSecurityExtension = "False"

}

# Проверяем наличие подтверждения на выпуск сертификата

if($template.properties.'msPKI-Enrollment-Flag'.value -band "0x00000002")

{

$PendAllRequests = "True"

}

else

{

$PendAllRequests = "False"

}

# Получаем время создания шаблона сертификата в формате epoch

$WhenCreated = (Get-Date $template.Properties. WhenCreated.DateTime -UFormat%s). split(',')[0]

# Получаем время изменения шаблона сертификата в формате epoch

$WhenChanged = (Get-Date $template.Properties. WhenChanged.DateTime -UFormat%s). split(',')[0]

# Создаем Cypher-запрос на создание узла шаблона сертификата

Add-Content $OutFile "MERGE (t: Template {name:'$Name', displayname:'$DisplayName', objectid:'$ObjectGUID', distinguishedname:'$DN', domain:'$DomainName', keysize:'$KeySize', exportablekey:$ExportableKey, requireskeyarchival:$RequiresKeyArchival, validityperiod:'$ValidityPeriod', renewalperiod:'$RenewalPeriod', authclient:$AuthClient, enrolleesuppliessubject:$EnrolleeSuppliesSubject, anypurpose:$AnyPurpose, requestagent:$RequestAgent, enrollmentagent:$EnrollmentAgent, apsignature:$APSignature, nosecurityextension:$NoSecurityExtension, pendallrequests:$PendAllRequests, whencreated:$WhenCreated, whenchanged:$WhenChanged});"

# Получаем SID владельца шаблона сертификата

$ID = new-object System.Security.Principal. NTAccount($template.ObjectSecurity.Owner)

$ownersid = $ID.Translate([System.Security.Principal. SecurityIdentifier]). toString()

if($ownersid.Length -le 12)

{

$ownersid = $DomainName +"-" + $ownersid

}

# Создаем Cypher-запрос на создание связи между шаблоном и владельцем

Add-Content $OutFile "MATCH (m {objectid:'$ownersid'}) MATCH (n: Template {objectid:'$ObjectGUID'}) MERGE (m)-[r: Owns]->(n) SET r.isacl=TRUE;"

# Получаем ACL для шаблона сертификата

$acls = $template.ObjectSecurity.Access

foreach($acl in $acls)

{

# Получаем SID объекта, который имеет права

$ID = new-object System.Security.Principal.NTAccount($acl.IdentityReference)

$ObjectSID = $ID.Translate([System.Security.Principal.SecurityIdentifier]). toString()

if($ObjectSID.Length -le 12)

{

$ObjectSID = $DomainName +"-" + $ObjectSID

}

# Проверяем права Enroll

if(($acl.ActiveDirectoryRights -match "ExtendedRight") -and ($acl.ObjectType -eq "0e10c968–78fb-11d2–90d4–00c04f79dc55"))

{

# Создаем Cypher-запрос на создание связи между шаблоном и объектами с правами Enroll

Add-Content $OutFile "MATCH (m {objectid:'$ObjectSID'}) MATCH (n {objectid:'$ObjectGUID'}) MERGE (m)-[r: CanEnroll]-(n) SET r.isacl=TRUE;"

}

# Проверяем права AutoEnroll

if(($acl.ActiveDirectoryRights -match "ExtendedRight") -and ($acl.ObjectType -eq "a05b8cc2–17bc-4802-a710-e7c15ab866a2"))

{

# Создаем Cypher-запрос на создание связи между шаблоном и объектами с правами Enroll

Add-Content $OutFile "MATCH (m {objectid:'$ObjectSID'}) MATCH (n {objectid:'$ObjectGUID'}) MERGE (m)-[r: CanAutoEnroll]-(n) SET r.isacl=TRUE;"

}

# Проверяем права WriteProperty

if(($acl.ActiveDirectoryRights -match "WriteProperty") -and ($acl.ActiveDirectoryRights -notmatch "ExtendedRight"))

{

if($acl.ObjectType -eq "00000000–0000–0000–0000–000000000000")

{

# Создаем Cypher-запрос на создание связи между шаблоном и объектами с правами GenericWrite

Add-Content $OutFile "MATCH (m {objectid:'$ObjectSID'}) MATCH (n {objectid:'$ObjectGUID'}) MERGE (m)-[r: GenericWrite]-(n) SET r.isacl=TRUE;"

}

else

{

# Создаем Cypher-запрос на создание связи между шаблоном и объектами с правами WriteProperty

Add-Content $OutFile "MATCH (m {objectid:'$ObjectSID'}) MATCH (n {objectid: