Gegenmaßnahme zum Angriff „DNS-Wildcard“

In meinem letzten Video habe ich gezeigt, wie ich als Angreifer eine Session im Kontext eines Standardbenutzers nutzen kann, um im internen Active Directory DNS eine DNS-Wildcard zu erstellen. Wer das Video noch nicht gesehen hat, das gibt es hier.

Im nächsten Video zeige ich, wie eine Gegenmaßnahme für diesen Angriff aussehen könnte:

Das ist nicht kompliziert, oder? 🙂

Für wenige DNS-Zonen ist der Aufwand für die Korrektur der Berechtigungen recht gering. Wenn ihr aber viele DNS-Zonen verwendet, dann könnte euch mein PowerShell-Script helfen:

##### Scriptinfo ##################################################################################
# Scriptreihe:      ADDNS-ACLKorrektur
# Datum:            2020-08-03
# Version:          V1.00
# Programmierer:    Stephan Walther
###################################################################################################

#region Verbindung zum AD herstellen
    Import-Module -Name ActiveDirectory
#endregion

#region Ermittung der Gruppe "Domain Computer"
    $Partition = "LDAP://" +([adsi] "LDAP://RootDSE").Get("defaultNamingContext")
    $Searcher = New-Object DirectoryServices.DirectorySearcher
    $Searcher.SearchRoot = $Partition
    $Searcher.Filter = "(objectClass=user)"
    $AnyUser = $Searcher.FindOne()
    $DomainSID = (New-Object System.Security.Principal.SecurityIdentifier($AnyUser.Properties.objectsid.Item(0),0)).Value
    $DomainSID = ($DomainSID -split '-' | Select-Object -SkipLast 1) -join '-'
    $Searcher.Filter = "(objectSID=$DomainSID-515)"
    $DomainComputer = $Searcher.FindAll().properties.samaccountname
#endregion

#region Ermittung der Domain
    $DomainDN = ($Partition -split '//')[-1]
#endregion

#region Umstellund der DNS-Zonen-ACLs:
    Get-ChildItem -Path "AD:\CN=MicrosoftDNS,DC=DomainDnsZones,$DomainDN","AD:\CN=MicrosoftDNS,DC=ForestDnsZones,$DomainDN" | 
        ForEach-Object {
            # Variablen und ACL der Zone ermitteln
                $ZoneName = $_.name 
                $ZoneDN   = $_.DistinguishedName
        
                $ACL = (Get-Acl -Path $_.PSPath)            
                $ACLChangeNeeded = $false
            
            # für jeden Eintrag in der ACL werden ACE der 'Authenticated Users' gesucht
                $ACL.access | 
                    Where-Object {$_.isinherited -eq $false `
                                -and 'NT AUTHORITY\Authenticated Users','NT-AUTHORITÄT\Authentifizierte Benutzer' -contains $_.IdentityReference.value} |
                        ForEach-Object {
                            # der ACE mit den 'Authenticated Users' wird aus der ACL entfernt
                                $ACL.RemoveAccessRuleSpecific( $_ )

                            # der ACE mit dem 'Domain Computers' wird erstellt und an die ACL angehängt
                                $Action     = [System.Security.AccessControl.AccessControlType]::Allow
                                $Permission = [System.DirectoryServices.ActiveDirectoryRights]::CreateChild  
                                $Identity   = New-Object -TypeName System.Security.Principal.NTAccount -ArgumentList "", "$DomainComputer"  

                                $ACE = New-Object -TypeName System.DirectoryServices.ActiveDirectoryAccessRule -ArgumentList $Identity, $Permission, $Action
                                $ACL.AddAccessRule($ACE)
                        
                            # Marker für eine ACL-Veränderung
                                $ACLChangeNeeded = $true
                        }

            # muss die ACL verändert werden?
                if ($ACLChangeNeeded) {
                    Write-Host "Zone '$ZoneName' muss angepasst werden ..." -ForegroundColor Yellow
                    try {
                        # versuche, die ACL zurückzuschreiben (mit Bestätigung!):
                            Set-Acl -Path $_.PSPath -AclObject $ACL -Confirm                    
                    } catch {
                        Write-Host "Zone '$ZoneName' konnte nicht angepasst werden: $( $error[0].Exception.Message )" -ForegroundColor Magenta
                    }
                } else {
                    Write-Host "Zone '$ZoneName' ist OK." -ForegroundColor Green
                }
             
        }
#endregion

Der Code muss als AD-Administrator ausgeführt werden. Er sucht nach AD-integrierten Zonen und für jede Zone wird der ACL-Eintrag für die „Authenticated Users“ entfernt und durch einen Eintrag für die „Domain Computers“ ersetzt. So einfach kann es sein:

Gegenmaßnahme zum Angriff „DNS-Wildcard“

Das Script könnt ihr auch hier als ZIP-Archiv herunterladen. Falls ihr die Zonen nicht im AD integriert habt, dann wird das Script nicht helfen!

Weitere Videos aus meiner Serie „Anatomie eines Hacks“ findet ihr in der Übersicht.

Stay tuned!

Kommentar hinterlassen