Setup-Leitfaden: Automatisieren der Erkennung von bösartigen DHCP-Servern mit PowerShell

Die wichtigsten Erkenntnisse

  • Automatisierte Erkennung von Rogue-DHCP (Dynamic Host Configuration Protocol): Das Skript automatisiert den Prozess der Erkennung von nicht autorisierten DHCP-Servern und verbessert die Netzwerksicherheit.
  • Nmap-Integration: Verwendet nmap für ein umfassendes Netzwerk-Scanning und erfordert dessen vorherige Installation.
  • Anpassbare Parameter: Ermöglicht die individuelle Anpassung durch Parameter wie erlaubte DHCP-Server und Ausgabefelder.
  • Subnetorientiertes Scannen: Extrahiert und scannt Subnetze und gewährleistet so eine gezielte und effiziente Netzwerkanalyse.
  • Sicherheitswartung in Echtzeit: Ideal für regelmäßige Netzüberprüfungen, die zur Aufrechterhaltung der Sicherheit und betrieblichen Integrität in Echtzeit beitragen.
  • Einfacher Vergleich mit der zulässigen Liste: Vergleicht erkannte Server automatisch mit einer vordefinierten Liste von autorisierten DHCP-Servern.
  • Automatisierte Ausgabe und Berichterstattung: Die Ergebnisse werden in einem benutzerfreundlichen Format ausgegeben und können in Netzwerkmanagement-Tools wie NinjaOne integriert werden.
  • Verbessertes Netzwerkmanagement: Optimiert die Netzwerkverwaltung, insbesondere für IT-Experten und MSPs, die große Netzwerke verwalten.
  • Risikominimierung: Verringert das Risiko von Netzwerkproblemen und Sicherheitsverstößen, die durch unseriöse DHCP-Server verursacht werden, beträchtlich.
  • Administrative Rechte erforderlich: Für eine effektive Ausführung sind Administratorrechte erforderlich.

Das Verständnis und die Verwaltung der Netzwerksicherheit ist ein Eckpfeiler eines effizienten IT-Betriebs, insbesondere in der heutigen vernetzten Umgebung. Die Identifizierung von fehlerhaften DHCP-Servern, die schwerwiegende Netzwerkprobleme und Sicherheitsschwachstellen verursachen können, ist eine wichtige Aufgabe für IT-Experten und Managed Service Provider (MSPs). Dieser Blog-Beitrag befasst sich mit einem PowerShell-Skript, das für diesen Zweck entwickelt wurde, und beschreibt dessen Funktionalität und Bedeutung für die Aufrechterhaltung der Netzwerkintegrität.

Hintergrund

Abtrünnige DHCP-Server sind nicht autorisierte DHCP-Server in einem Netzwerk. Sie können zu einer Reihe von Problemen führen, von IP-Adresskonflikten bis hin zu schweren Sicherheitsrisiken wie Man-in-the-Middle-Angriffen. Dieses PowerShell-Skript automatisiert die Suche nach solchen Servern mithilfe von nmap, einem bekannten Netzwerk-Scanning-Tool, und verbessert so die Netzwerksicherheit und die betriebliche Effizienz. Es ist besonders nützlich für IT-Experten und MSPs, die große, dynamische Netzwerke verwalten, in denen eine manuelle Überwachung unpraktisch ist.

Das Skript:

#Requires -Version 4.0

<#
.SYNOPSIS
    Runs an nmap scan to find rogue dhcp servers on a network. This script will not install nmap and nmap is required for this script to work.
.DESCRIPTION
    Runs an nmap scan to find rogue dhcp servers on a network. This script will not install nmap and nmap is required for this script to work.
.EXAMPLE
    (No Parameters)
    
    DHCP Servers found.

    Mac Address       IP Address    
    -----------       ----------    
    00:15:5D:FF:93:C3 172.17.240.1  
                      172.17.242.16 
    00:15:5D:45:D5:07 172.17.251.231



    Checking allowed servers list...
    C:\ProgramData\NinjaRMMAgent\scripting\customscript_gen_14.ps1 : Rogue DHCP Server Found! 172.17.240.1 is not on the 
    list of allowed DHCP Servers.
        + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
        + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,customscript_gen_14.ps1

PARAMETER: -AllowedServers "172.17.240.1"
    Lists 172.17.240.1 as an allowed dhcp server.

PARAMETER: -CustomField "ReplaceMeWithAnyMultilineCustomField"
    Output results to a custom field of your choice.

PARAMETER: -AllowedServersField "ReplaceMeWithAnyTextCustomField"
    Will retrieve a list of allowed servers from a custom field.
    
.OUTPUTS
    None
.NOTES
    Minimum Supported OS: Windows 8, Server 2012
    Release Notes: Initial Release
By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/terms-of-use.
    Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. 
    Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. 
    Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. 
    Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. 
    Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. 
    Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. 
    EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).
#>

[CmdletBinding()]
param (
    [Parameter()]
    [String[]]$AllowedServers,
    [Parameter()]
    [String]$CustomField = "rogueDHCPServers",
    [Parameter()]
    [String]$AllowedServersField = "allowedDHCPServers"
)

begin {

    # If script variables are used set them here
    if($env:allowedServersCustomField -and $env:allowedServersCustomField -notlike "null"){
        $AllowedServersField = $env:allowedServersCustomField
    }

    if($AllowedServersField -and -not ($AllowedServers)){
        $AllowedServers = (Ninja-Property-Get $AllowedServersField) -split ',' | ForEach-Object { ($_).trim() }
    }

    if($env:allowedServers -and $env:allowedServers -notlike "null"){
        $AllowedServers = $env:AllowedServers -split ',' | ForEach-Object { ($_).trim() }
    }

    if($env:customFieldName -and $env:customFieldName -notlike "null"){
        $CustomField = $env:customFieldName 
    }

    # Parses out the subnet info into cidr format
    function Get-Subnet {
        $DefaultGateways = (Get-NetIPConfiguration).IPv4DefaultGateway

        $Subnets = $DefaultGateways | ForEach-Object {
            $Index = $_.ifIndex
            $PrefixLength = (Get-NetIPAddress | Where-Object { $_.AddressFamily -eq 'IPv4' -and $_.PrefixOrigin -ne 'WellKnown' -and $Index -eq $_.InterfaceIndex } | Select-Object -ExpandProperty PrefixLength)
            if ($_.NextHop -and $PrefixLength) {
                "$($_.NextHop)/$PrefixLength"
            }
        }

        if ($Subnets) {
            $Subnets | Select-Object -Unique
        }
    }

    # Handy uninstall string finder
    function Find-UninstallKey {
        [CmdletBinding()]
        param (
            [Parameter(ValueFromPipeline = $True)]
            [String]$DisplayName,
            [Parameter()]
            [Switch]$UninstallString
        )
        process {
            $UninstallList = New-Object System.Collections.Generic.List[Object]

            $Result = Get-ChildItem HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Get-ItemProperty | Where-Object { $_.DisplayName -like "*$DisplayName*" }
            if ($Result) { $UninstallList.Add($Result) }

            $Result = Get-ChildItem HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Get-ItemProperty | Where-Object { $_.DisplayName -like "*$DisplayName*" }
            if ($Result) { $UninstallList.Add($Result) }

            # Programs don't always have an uninstall string listed here so to account for that I made this optional.
            if ($UninstallString) {
                $UninstallList | Select-Object -ExpandProperty UninstallString -ErrorAction SilentlyContinue
            }
            else {
                $UninstallList
            }
        }
    }

    $Nmap = (Find-UninstallKey -DisplayName "Nmap" -UninstallString) -replace '"' -replace 'uninstall.exe', 'nmap.exe'
    if (-not $Nmap) {
        Write-Error "Nmap is not installed! Please install nmap prior to running this script. https://nmap.org/download.html"
        exit 1
    }
}
process {

    # Get's a list of subnets
    $Subnets = Get-Subnet
    if (-not $Subnets) {
        Write-Error "Unable to get list of subnets?"
        exit 1
    }

    # nmap arguments
    $Arguments = @(
        "-sU"
        "-p"
        "67"
        "-d"
        $Subnets
        "--open"
        "-oX"
        "$env:TEMP\nmap-results.xml"
    )
    try {
        Start-Process -FilePath $Nmap -ArgumentList $Arguments -WindowStyle Hidden -Wait
        [xml]$result = Get-Content -Path "$env:Temp\nmap-results.xml"
    }
    catch {
        Write-Error "Nmap scan failed to run! Ensure nmap is installed prior to running this script."
        exit 1
    }

    # Parse the xml results
    if ($result) {
        $resultObject = $result.DocumentElement.host | ForEach-Object {
            New-Object psobject -Property @{
                "IP Address"  = ($_.address | Where-Object { $_.addrtype -match "ip" } | Select-Object -ExpandProperty "addr")
                "Mac Address" = ($_.address | Where-Object { $_.addrtype -match "mac" } | Select-Object -ExpandProperty "addr")
            }
        }
    }
    else {
        Write-Error "Nmap results are empty?"
        exit 1
    }

    # Check if the dhcp servers found are on the list. If so simply report back what were found otherwise indicate that they're Rogue DHCP Servers.
    if ($resultObject) {
        Write-Host "DHCP Servers found."
        $resultObject | Sort-Object -Property "IP Address" -Unique | Format-Table | Out-String | Write-Host
        Remove-Item -Path "$env:Temp\nmap-results.xml" -Force

        Write-Host "Checking allowed servers list..."
        $ErrorOut = $False
        $resultObject | ForEach-Object {
            if ($AllowedServers -notcontains $_."IP Address") {
                Write-Error "Rogue DHCP Server Found! $($_.'IP Address') is not on the list of allowed DHCP Servers."
                $ErrorOut = $True
            }
        }

        Ninja-Property-Set -Name $CustomField -Value ($resultObject | Where-Object { $AllowedServers -notcontains $_."IP Address" } | Format-List | Out-String)

        if($ErrorOut -eq $True){
            exit 1
        }

        Write-Host "No rogue dhcp servers found."
    }
}
end {
    
    
    
}

 

Zugriff auf über 300 Skripte im NinjaOne Dojo

Zugang erhalten

Detaillierte Aufschlüsselung

Das Skript funktioniert in mehreren Stufen:

  • Initialisierung: Sie beginnt mit der Einstellung von Parametern wie erlaubten DHCP-Servern und benutzerdefinierten Feldern für die Ausgabe, was eine Anpassung an spezifische Netzwerkumgebungen ermöglicht.
  • Subnetz-Identifikation: Es verfügt über eine Funktion zum Extrahieren von Subnetz-Informationen aus dem Netzwerk, die für eine gezielte Suche wichtig sind.
  • Nmap-Integration: Das Skript prüft, ob nmap installiert ist, was für das Scannen unerlässlich ist. Anschließend führt er einen nmap-Scan in den identifizierten Subnetzen durch und sucht nach aktiven DHCP-Servern.
  • Ergebnis-Parsing: Nach dem Scannen analysiert das Skript die XML-Ausgabe von nmap und extrahiert die IP- und MAC-Adressen der gefundenen DHCP-Server.
  • Validierung gegen die zulässige Liste: Es vergleicht die gefundenen DHCP-Server mit einer Liste autorisierter Server und markiert alle nicht autorisierten (Rogue) Server.
  • Ausgabe und Bereinigung: Die Ergebnisse werden dann ausgegeben, und alle vom Skript erstellten temporären Dateien werden bereinigt.

Ein visuelles Diagramm, das diese Erklärung begleitet, könnte den Fluss von der Initialisierung bis zur Ergebnisausgabe veranschaulichen und das Verständnis verbessern.

Mögliche Anwendungsfälle

Stellen Sie sich ein großes Unternehmen mit mehreren Subnetzen vor, die von einer IT-Abteilung verwaltet werden. Dieses Skript könnte in regelmäßigen Abständen ausgeführt werden, um sicherzustellen, dass keine unautorisierten DHCP-Server im Netzwerk auftauchen, wodurch die Netzwerkintegrität aufrechterhalten und potenzielle Sicherheitsverletzungen verhindert werden.

Vergleiche

Manuelle Überprüfungen oder einfache Netzwerküberwachungsprogramme können abtrünnige DHCP-Server übersehen oder erfordern einen hohen Personalaufwand. Im Gegensatz dazu automatisiert dieses Skript den Prozess, ist gründlicher und lässt sich in bestehende Tools wie NinjaOne integrieren, um die Verwaltungsfunktionen zu verbessern.

FAQs

  • Wie oft sollte ich dieses Skript ausführen?
    • Es empfiehlt sich eine regelmäßige Durchführung, z. B. wöchentlich oder nach größeren Netzwerkänderungen.
  • Benötige ich besondere Berechtigungen, um dieses Skript auszuführen?
    • Ja, für Netzwerk-Scans sind in der Regel Administratorrechte erforderlich.

Auswirkungen

Nicht identifizierte abtrünnige DHCP-Server können zu erheblichen Sicherheitsrisiken führen. Die Automatisierung ihrer Erkennung minimiert diese Risiken und trägt zur allgemeinen Netzwerksicherheit und betrieblichen Effizienz bei.

Empfehlungen

  • Aktualisieren Sie regelmäßig die Liste der zugelassenen DHCP-Server.
  • Integrieren Sie dieses Skript in umfassendere Tools zur Netzwerküberwachung und -verwaltung.
  • Stellen Sie sicher, dass nmap ordnungsgemäß installiert und aktualisiert ist.

Abschließende Überlegungen

Im Bereich der Netzwerksicherheit und -verwaltung bieten Tools wie NinjaOne, ergänzt durch Skripte wie dieses, robuste Lösungen zur Aufrechterhaltung der Netzwerkintegrität. Durch die Automatisierung kritischer Aufgaben, wie z.B. das Auffinden von fehlerhaften DHCP-Servern, hilft NinjaOne IT-Experten, sich auf strategische Initiativen zu konzentrieren und gleichzeitig die Sicherheit und Zuverlässigkeit ihrer Netzwerke zu gewährleisten.

Nächste Schritte

Der Aufbau eines effizienten und effektiven IT-Teams erfordert eine zentralisierte Lösung, die als einheitliches Tool für die Bereitstellung von IT-Dienstleistungen fungiert. NinjaOne ermöglicht es IT-Teams, all ihre Geräte zu überwachen, verwalten, sichern und zu unterstützen, unabhängig von ihrem Ort und komplexer Infrastruktur vor Ort.

Erfahren Sie mehr über NinjaOne Endpoint Management schauen Sie sich eine Live-Tour an oder starten Sie Ihre kostenlose Testversion der NinjaOne Plattform.

Kategorien:

Das könnte Sie auch interessieren

×

Sehen Sie NinjaOne in Aktion!

Mit dem Absenden dieses Formulars akzeptiere ich die Datenschutzerklärung von NinjaOne.

NinjaOne Allgemeine Geschäftsbedingungen für Skripte

Indem Sie unten auf die Schaltfläche „Ich akzeptiere“ klicken, erklären Sie Ihr Einverständnis mit den folgenden rechtlichen Bedingungen sowie mit unseren Nutzungsbedingungen:

  • Eigentumsrechte: NinjaOne besitzt und wird weiterhin alle Rechte, Titel und Interessen an dem Skript (einschließlich des Urheberrechts) behalten. NinjaOne gewährt Ihnen eine eingeschränkte Lizenz zur Nutzung des Skripts in Übereinstimmung mit diesen rechtlichen Bedingungen.
  • Einschränkung der Nutzung: Sie dürfen das Skript nur für Ihre legitimen persönlichen oder internen Geschäftszwecke verwenden und es nicht an Dritte weitergeben.
  • Verbot der Wiederveröffentlichung: Sie sind unter keinen Umständen berechtigt, das Skript in einer Skriptbibliothek, die einem anderen Softwareanbieter gehört oder von diesem kontrolliert wird, erneut zu veröffentlichen.
  • Gewährleistungsausschluss: Das Skript wird „wie gesehen“ und „wie verfügbar“ bereitgestellt, ohne jegliche Garantie. NinjaOne gibt keine Versprechen oder Garantien, dass das Skript frei von Fehlern ist oder dass es Ihre speziellen Bedürfnisse oder Erwartungen erfüllt.
  • Risikoübernahme: Die Verwendung des Skripts erfolgt auf eigene Gefahr. Sie erkennen an, dass die Nutzung des Skripts mit bestimmten Risiken verbunden ist, und Sie verstehen und übernehmen jedes dieser Risiken.
  • Verzicht und Freigabe: Sie machen NinjaOne nicht für nachteilige oder unbeabsichtigte Folgen verantwortlich, die sich aus Ihrer Nutzung des Skripts ergeben, und Sie verzichten auf alle gesetzlichen oder billigkeitsrechtlichen Rechte oder Rechtsmittel, die Sie gegen NinjaOne im Zusammenhang mit Ihrer Nutzung des Skripts haben könnten.
  • EULA: Wenn Sie ein NinjaOne-Kunde sind, unterliegt Ihre Nutzung des Skripts dem für Sie geltenden Endbenutzer-Lizenzvertrag (EULA).