Untitled

 avatar
unknown
plain_text
5 months ago
4.3 kB
22
Indexable
# Log file
$LogFile = "DynamicPortAssignmentCheck.log"

function Write-Log {
    param ([string]$Message)
    try {
        $stream = [System.IO.StreamWriter]::new($LogFile, $true)
        $stream.WriteLine($Message)
        $stream.Close()
    } catch {
        Write-Host "Failed to write to log: $Message"
    }
}


Write-Host "`n========================================================`n"
Write-Host "Fetching Windows ephemeral port configuration..."
Write-Log "$(Get-Date) - Fetching Windows ephemeral port configuration"

# Get ephemeral port range
$ephemeralRange = netsh int ipv4 show dynamicport tcp
Write-Host "`nEphemeral Port Range (TCP):"
$ephemeralRange
Write-Log "$(Get-Date) - Ephemeral Port Range:`n$ephemeralRange"

# Get excluded port ranges
$excludedRanges = netsh int ipv4 show excludedportrange tcp
Write-Host "`nExcluded Port Ranges (TCP):"
$excludedRanges
Write-Log "$(Get-Date) - Excluded Port Ranges:`n$excludedRanges"

Write-Host "`n========================================================`n"


# --- Existing logic starts here ---
$listeners = @()
$openedPorts = @()

Write-Host "Starting port allocation test...`n"
Write-Log "$(Get-Date) - Starting port allocation test"

### STEP 1: Request one dynamic port
$listener1 = New-Object System.Net.Sockets.TcpListener([System.Net.IPAddress]::Any, 0)
$listener1.Start()
$firstDynamicPort = ($listener1.LocalEndpoint).Port
$listeners += $listener1
$openedPorts += $firstDynamicPort
Write-Host "First dynamic port (assigned by OS): $firstDynamicPort"
Write-Log "$(Get-Date) - First dynamic port: $firstDynamicPort"

Write-Host "`n========================================================`n"

### STEP 2: Open 10 consecutive ports starting from firstDynamicPort + 1
Write-Host "Opening 10 consecutive ports (assigning by this script) starting from $($firstDynamicPort + 1)...`n"
Write-Host "Note: We do not check if any other application has opened them. In that case, an error will occur stating that the port can only be opened once. If so, you can ignore these errors.`n"
for ($p = $firstDynamicPort + 1; $p -le $firstDynamicPort + 10; $p++) {
    try {
        $listener = New-Object System.Net.Sockets.TcpListener([System.Net.IPAddress]::Any, $p)
        $listener.Start()
        $listeners += $listener
        $openedPorts += $p
        Write-Host "Port $p opened successfully."
        Write-Log "$(Get-Date) - SUCCESS: Port $p opened."
    } catch {
        $errorMsg = $_.Exception.Message
        Write-Host "Failed to open port $p. Error: $errorMsg"
        Write-Log "$(Get-Date) - ERROR: Port $p failed. Message: $errorMsg"
    }
}

Write-Host "`n========================================================`n"

### STEP 3: Request 10 more dynamic ports
Write-Host "Requesting 10 more dynamic ports from the OS...`n"
Write-Host "Note: We do not expect any already open ports here as the OS is expected to skip them. So, if we get an error stating that the port is already open, this poses a problem.`n"
for ($i = 1; $i -le 10; $i++) {
    try {
        $listener = New-Object System.Net.Sockets.TcpListener([System.Net.IPAddress]::Any, 0)
        $listener.Start()
        $assignedPort = ($listener.LocalEndpoint).Port
        $listeners += $listener
        $openedPorts += $assignedPort
        Write-Host "Dynamic port $assignedPort opened successfully."
        Write-Log "$(Get-Date) - SUCCESS: Dynamic port $assignedPort opened."
    } catch {
        $errorMsg = $_.Exception.Message
        Write-Host "Failed to open dynamic port. Error: $errorMsg"
        Write-Log "$(Get-Date) - ERROR: Dynamic port failed. Message: $errorMsg"
    }
}

Write-Host "`n========================================================`n"

### Summary
Write-Host "All opened ports:`n"
$openedPorts | Sort-Object | ForEach-Object { Write-Host $_ }
Write-Log "$(Get-Date) - Summary of opened ports: $($openedPorts -join ', ')"

# Write-Host "`nPorts are open. Press any key to close them..."
# [void][System.Console]::ReadKey($true)

Write-Host "`n========================================================`n"

foreach ($listener in $listeners) {
    $listener.Stop()
}
Write-Host "All ports closed."
Write-Log "$(Get-Date) - Closed all ports."
Editor is loading...
Leave a Comment