'*.
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 гораздо меньше возможностей, например есть