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

'*.

inf')| Select-String -Pattern "EnableSecuritySignature"

foreach($GPO in $GPOs)

{

# Получить значение свойства

$RegistryValues = (Get-IniContent -filePath $GPO.Path).

RegistryValues.PSObject.Properties| select name, value

# Получить guid групповой политики

$guid = $GPO.Path.Split('\')[6].ToUpper()

foreach ($RegistryValue in $RegistryValues)

{

# Проверка установки флага подписи

if ($RegistryValue.name -match "EnableSecuritySignature")

{

if($RegistryValue.value[1] -eq 1)

{

$signing = "TRUE"

}

else

{

$signing = "FALSE"

}

Add-Content $OutFile "MATCH(g: GPO)-

[: GPLink|Contains*1..]->(c: Computer) WHERE g.gpcpath

CONTAINS '$guid' SET c.smbsigning = $signing;"

}

}

}

}

# Get-IniContent из PowerView

function Get-IniContent ($filePath)

{

$IniObject = New-Object PSObject

switch -regex -file $FilePath

{

"^\[(.+)\]" # Section

{

$Section = $matches[1].Trim()

$Section = $Section.Replace('', '')

$SectionObject = New-Object PSObject

$IniObject | Add-Member Noteproperty $Section

$SectionObject

;$CommentCount = 0

}

"^(;.*)$" # Comment

{

$value = $matches[1].Trim()

$CommentCount = $CommentCount + 1

$name = "Comment" + $CommentCount

$Name = $Name.Replace('', '')

$IniObject.$Section | Add-Member Noteproperty

$Name $Value

}

"(.+?)\s*=(.*)" # Key

{

$Name,$Value = $matches[1..2]

$Name = $Name.Trim()

$Values = $Value.split(',') | ForEach-Object

{$_.Trim()}

$Name = $Name.Replace('', '')

$IniObject.$Section | Add-Member Noteproperty

$Name $Values

}

}

return $IniObject

}

Запустим скрипт и загрузим полученные данные в базу с помощью браузера neo4j.

Теперь можно получить машины, которые не имеют свойства

smbsigning
или его значение равно FALSE. Запрос Cypher будет выглядеть следующим образом:

MATCH (c: Computer) WHERE c.smbsigning IS NULL OR c.smbsigning = FALSE RETURN c.name

Конечно, подпись SMB может настраиваться в «золотом образе» или с помощью SCCM. Поэтому в дополнение можно провести проверку непосредственно на хостах.

В сканере nmap есть скрипт

smb-security-mode,
проверяющий настройки безопасности SMB.

nmap -p137,139,445 -script smb-security-mode comp1

Можно использовать powershell-скрипт

Invoke-SMBNegotiate.ps1
[16].

Invoke-SMBNegotiate -ComputerName dc

Invoke-SMBNegotiate -ComputerName comp


Рис. 4.43. Результат проверки подписи


Таким образом, если необходимо проверить все машины, нужно получить список всех активных машин с помощью PowerView или ADSI и в цикле проверить наличие подписи:

function CheckSMBSigning {

# Загружаем скрипт

..\Invoke-SMBNegotiate.ps1

# С помощью ADSI запрашиваем все незаблокированные

# компьютеры в Active Directory

$searcher = [adsisearcher]' (&(objectCategory=computer)

(!(userAccountControl:1.2.840.113556.1.4.803:=2)))'

$searcher.PageSize = 1000

$computers=$searcher.FindAll()

foreach($computer in $computers)

{

# Получаем имя компьютера

$ComputerName = $computer.properties.name

Invoke-SMBNegotiate -ComputerName $ComputerName

-ErrorAction SilentlyContinue

}

}

Запустим получившийся скрипт и посмотрим на результаты:


Рис. 4.44. Результат проверки подписи SMB


Если использовать скрипт

Invoke-SMBNegotiate.ps1
и данные загружать в BloodHound, то можно немного изменить скрипт:

function CheckSMBSigning

{

# Загружаем скрипт

..\Invoke-SMBNegotiate.ps1

# Создаем файл отчета

[string]$OutFile = "CheckSMBSigning_" + $(Get-Date

-f ddMMyyyyhhmmss) +".log"

# С помощью ADSI запрашиваем все незаблокированные

# компьютеры в Active Directory

$searcher = [adsisearcher]' (&(objectCategory=computer)

(!(userAccountControl:1.2.840.113556.1.4.803:=2)))'

$searcher.PageSize = 1000

$computers=$searcher.FindAll()

foreach($computer in $computers)

{

# Получаем SID объекта

$SID = (New-Object System.Security.Principal.

SecurityIdentifier($computer.Properties.objectsid.

Item(0),0)).Value

# Получаем имя компьютера

$ComputerName = $computer.properties.name

# Выполняем проверку

$Result = Invoke-SMBNegotiate -ComputerName

$ComputerName -ErrorAction SilentlyContinue

# Обрабатываем результаты

$smbsigning = $Result.smbsigning

if($smbsigning -ne $null)

{

# Добавляем строку запроса

Add-Content $OutFile "MATCH (c: Computer) WHERE

c.objectid='$SID' SET c.smbsigning = $smbsigning;"

}

}

}

Запустим обновленный скрипт, загрузим данные в BloodHound с помощью браузера neo4 и проверим результат (рис. 4.45).

MATCH (c: Computer) WHERE c.smbsigning = FALSE RETURN c.name


Рис. 4.45. Результат выполнения запроса


Добавление атрибутов с правами WriteProperty

Тот, кто давно работает с BloodHound, знает, что собираются только самые интересные ACL, такие как

GenericAll
или
GenricWrite
. Тем не менее Active Directory позволяет настраивать права на изменение каждого атрибута отдельно, и в этом случае у BloodHound гораздо меньше возможностей, например есть