diff --git a/scripts/win_connection_share.ps1 b/scripts/win_connection_share.ps1 new file mode 100644 index 0000000..ee89911 --- /dev/null +++ b/scripts/win_connection_share.ps1 @@ -0,0 +1,265 @@ +<# + .SYNOPSIS + A script that setups Internet Connection Sharing for Pwnagotchi. + + .DESCRIPTION + A script that setups Internet Connection Sharing for Pwnagotchi. + + Note: Internet Connection Sharing on Windows can be a bit unstable on windows between reboots. + You might need to run this script occasionally to disable and re-enable Internet Connection Sharing. + + .PARAMETER EnableInternetConnectionSharing + Enable Internet Connection Sharing + + .PARAMETER DisableInternetConnectionSharing + Disable Internet Connection Sharing + + .PARAMETER SetPwnagotchiSubnet + Change the Internet Connection Sharing subnet to the Pwnagotchi. Defaults to 10.0.0.1. + + .PARAMETER ScopeAddress + Custom ScopeAddress (The IP Address of the USB Gadget Interface.) + + .EXAMPLE + # Enable Internet Connection Sharing + PS C:\> .\win_connection_share -EnableInternetConnectionSharing + + .EXAMPLE + # Disable Internet Connection Sharing + PS C:\> .\win_connection_share -DisableInternetConnectionSharing + + .EXAMPLE + # Change the regkeys of Internet Connection Sharing to the Pwnagotchi Subnet + PS C:\> .\win_connection_share -SetPwnagotchiSubnet + + .EXAMPLE + # Change the regkeys of Internet Connection Sharing to the Pwnagotchi Subnet with a custom ScopeAddress (The IP Address of the USB Gadget Interface.) + PS C:\> .\win_connection_share -SetPwnagotchiSubnet -ScopeAddress 10.0.0.10 +#> + +#Requires -Version 5 +#Requires -RunAsAdministrator +[Cmdletbinding()] +Param ( + [switch]$EnableInternetConnectionSharing, + [switch]$DisableInternetConnectionSharing, + [switch]$SetPwnagotchiSubnet, + [ipaddress]$ScopeAddress = '10.0.0.1' +) + +# Load helper functions +Function Create-HNetObjects { + <# + .SYNOPSIS + A helper function that does the heavy lifiting with NetCfg.HNetShare + + .DESCRIPTION + A helper function that does the heavy lifiting with NetCfg.HNetShare. This returns a PSObject containing the `INetSharingConfigurationForINetConnection` info of 2 Adapters. + By default it tries to get the correct interfaces. This method might not be foolproof for every setup, but should work in most default senarios, if this causes issues these + can be passed as a param. + + .PARAMETER InternetAdaptor + The output of Get-NetAdaptor filtered down to the 'main' uplink interface. Should default to the correct value. + + .PARAMETER RNDISGadget + The output of Get-NetAdaptor filtered down to the 'USB Ethernet/RNDIS Gadget' interface. Should default to the correct value. + + .EXAMPLE + PS> $HNetObject = Create-HNetObjects + PS> $HNetObject + RNDISIntConfig InternetIntConfig + -------------- ----------------- + System.__ComObject System.__ComObject + #> + [Cmdletbinding()] + Param ( + $InternetAdaptor = $(Get-NetAdapter | Where-Object {$_.MediaConnectionState -eq 'Connected' -and $_.PhysicalMediaType -ne 'Unspecified'} | Sort-Object LinkSpeed -Descending), + $RNDISGadget = $(Get-NetAdapter | Where-Object {$_.MediaConnectionState -eq 'Connected' -and $_.InterfaceDescription -eq "USB Ethernet/RNDIS Gadget"}) + ) + Begin { + regsvr32.exe /s hnetcfg.dll + $HNetShare = New-Object -ComObject HNetCfg.HNetShare + } + Process { + if ($HNetShare.EnumEveryConnection -ne $null) { + $InternetInt = $HNetShare.EnumEveryConnection | Where-Object { $HNetShare.NetConnectionProps.Invoke($_).Name -eq ($InternetAdaptor).Name } + $InternetIntConfig = $HNetShare.INetSharingConfigurationForINetConnection.Invoke($InternetInt) + $RNDISInt = $HNetShare.EnumEveryConnection | Where-Object { $HNetShare.NetConnectionProps.Invoke($_).Name -eq ($RNDISGadget).Name } + $RNDISIntConfig = $HNetShare.INetSharingConfigurationForINetConnection.Invoke($RNDISInt) + } + } + End { + Return $(New-Object -TypeName PSObject -Property @{InternetIntConfig=$InternetIntConfig;RNDISIntConfig=$RNDISIntConfig;}) + } +} +Function Enable-InternetConnectionSharing { + <# + .SYNOPSIS + Enables internet connection sharing between the 'main' uplink interface and the 'USB Ethernet/RNDIS Gadget' interface. + + .DESCRIPTION + Enables internet connection sharing between the 'main' uplink interface and the 'USB Ethernet/RNDIS Gadget' interface. + + .EXAMPLE + PS> Enable-InternetConnectionSharing + + #> + [Cmdletbinding()] + $HNetObject = Create-HNetObjects + $HNetObject.InternetIntConfig.EnableSharing(0) + $HNetObject.RNDISIntConfig.EnableSharing(1) + Write-Output "[x] Enabled Internet Connection Sharing." +} +Function Disable-InternetConnectionSharing { + <# + .SYNOPSIS + Disables internet connection sharing between the 'main' uplink interface and the 'USB Ethernet/RNDIS Gadget' interface. + + .DESCRIPTION + Disables internet connection sharing between the 'main' uplink interface and the 'USB Ethernet/RNDIS Gadget' interface. + + .EXAMPLE + PS> Disable-InternetConnectionSharing + + #> + [Cmdletbinding()] + $HNetObject = $(Create-HNetObjects) + $HNetObject.InternetIntConfig.DisableSharing() + $HNetObject.RNDISIntConfig.DisableSharing() + Write-Output "[x] Disabled Internet Connection Sharing." +} +Function Test-PwnagotchiSubnet { + <# + .SYNOPSIS + Tests the registry for the correct ScopeAddress. + + .DESCRIPTION + Tests the registry for the correct ScopeAddress. By default windows uses a 192.168.137.x subnet for Internet Connection Sharing. This value can be changed + in the registry. + + .EXAMPLE + PS> Test-PwnagotchiSubnet + [!] By default Internet Connection Sharing uses a 192.168.137.x subnet. Run Set-PwnagotchiSubnet to ensure you and your little friend are on the same subnet. + #> + [Cmdletbinding()] + $RegKeys = Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters -ErrorAction Stop + If ($RegKeys.ScopeAddress -notmatch '10.0.0.') { + Write-Error "By default Internet Connection Sharing uses a 192.168.137.x subnet. Run Set-PwnagotchiSubnet to ensure you and your little friend are on the same subnet." -ErrorAction Stop + } + If ($RegKeys.ScopeAddressBackup -notmatch '10.0.0.') { + Write-Error "By default Internet Connection Sharing uses a 192.168.137.x subnet. Run Set-PwnagotchiSubnet to ensure you and your little friend are on the same subnet." -ErrorAction Stop + } +} +Function Set-PwnagotchiSubnet { + <# + .SYNOPSIS + Set the registry for the correct ScopeAddress. + + .DESCRIPTION + Set the registry for the correct ScopeAddress. By default windows uses a 192.168.137.x subnet for Internet Connection Sharing. This value can be changed + in the registry. By default it will be changed to 10.0.0.1 + + .PARAMETER ScopeAddress + The IP address the USB Gadget interface should use. + + .EXAMPLE + Set-PwnagotchiSubnet + + #> + [Cmdletbinding()] + Param ( + $ScopeAddress = '10.0.0.1' + ) + Try { + [void]([ipaddress]$ScopeAddress) + [void]([byte[]] $ScopeAddress.split('.')) + } Catch { + Write-Error "$ScopeAddress is not a valid IP." + } + Try { + Set-ItemProperty -Name ScopeAddress -Path "HKLM:\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\" -Value $ScopeAddress -ErrorAction Stop + Set-ItemProperty -Name ScopeAddressBackup -Path "HKLM:\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\" -Value $ScopeAddress -ErrorAction Stop + Write-Warning "The Internet Connection Sharing subnet has been updated. A reboot of windows is required !" + } Catch { + $PSCmdlet.ThrowTerminatingError($PSItem) + } + +} + +# Main Function +Function Setup-PwnagotchiNetwork { + <# + .SYNOPSIS + Function to setup networking. + + .DESCRIPTION + Function to setup networking. Main function calls helpers functions. + + .PARAMETER EnableInternetConnectionSharing + Enable Internet Connection Sharing + + .PARAMETER DisableInternetConnectionSharing + Disable Internet Connection Sharing + + .PARAMETER SetPwnagotchiSubnet + Change the Internet Connection Sharing subnet to the Pwnagotchi. Defaults to 10.0.0.1. + + .PARAMETER ScopeAddress + Custom ScopeAddress (the ICS ip address) + + .EXAMPLE + PS> Setup-PwnagotchiNetwork -EnableInternetConnectionSharing + + #> + + Param ( + [switch]$EnableInternetConnectionSharing, + [switch]$DisableInternetConnectionSharing, + [switch]$SetPwnagotchiSubnet, + $ScopeAddress = '10.0.0.1' + ) + Begin { + Try { + Write-Debug "Begin" + $ErrorSplat=@{ErrorAction="stop"} + Write-Debug "Testing subnet" + Try { + Test-PwnagotchiSubnet @ErrorSplat + } Catch { + If ($SetPwnagotchiSubnet) { + Write-Debug "Setting subnet" + Set-PwnagotchiSubnet -ScopeAddress $ScopeAddress @ErrorSplat + } Else { + Write-Error "By default Internet Connection Sharing uses a 192.168.137.x subnet. Run this script with the -SetPwnagotchiSubnet to setup the network." -ErrorAction Stop + } + } + } Catch { + $PSCmdlet.ThrowTerminatingError($PSItem) + } + } + Process { + Write-Debug "Process" + Try { + If ($EnableInternetConnectionSharing) { + Write-Debug "Enable network Sharing" + Enable-InternetConnectionSharing @ErrorSplat + } ElseIf ($DisableInternetConnectionSharing) { + Write-Debug "Disable network Sharing" + Disable-InternetConnectionSharing @ErrorSplat + } + } Catch { + $PSCmdlet.ThrowTerminatingError($PSItem) + } + } + End { + Write-Debug "End" + Try { + # Nothing to return. + } Catch { + $PSCmdlet.ThrowTerminatingError($PSItem) + } + } +} + +# Dynamically create params for Setup-PwnagotchiNetwork function based of param input of script. +Setup-PwnagotchiNetwork @psBoundParameters \ No newline at end of file