From b1ce750ac4e41523e347d1145cd3441dc3af227d Mon Sep 17 00:00:00 2001 From: Jean-Pierre LESUEUR Date: Thu, 13 Jan 2022 15:28:08 +0100 Subject: [PATCH 01/10] Feat: SecureString supported for passwords --- .../PowerRemoteDesktop_Viewer.psm1 | 71 +++++++++++++------ TestViewer.ps1 | 2 +- 2 files changed, 51 insertions(+), 22 deletions(-) diff --git a/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psm1 b/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psm1 index 612a7d5..2f150f8 100644 --- a/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psm1 +++ b/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psm1 @@ -109,7 +109,7 @@ function Resolve-AuthenticationChallenge .SYNOPSIS Algorithm to solve the server challenge during password authentication. - .PARAMETER Password + .PARAMETER SecurePassword Registered password string for server authentication. .PARAMETER Candidate @@ -117,24 +117,32 @@ function Resolve-AuthenticationChallenge Each time a new connection is requested to server, a new candidate is generated. .EXAMPLE - Resolve-AuthenticationChallenge -Password "s3cr3t!" -Candidate "rKcjdh154@]=Ldc" + Resolve-AuthenticationChallenge -SecurePassword "s3cr3t!" -Candidate "rKcjdh154@]=Ldc" #> param ( [Parameter(Mandatory=$True)] - [string] $Password, + [SecureString] $SecurePassword, [Parameter(Mandatory=$True)] [string] $Candidate ) - $solution = -join($Candidate, ":", $Password) + $BSTR = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecurePassword) + try + { + $solution = -join($Candidate, ":", [Runtime.InteropServices.Marshal]::PtrToStringBSTR($BSTR)) + + for ([int] $i = 0; $i -le 1000; $i++) + { + $solution = Get-SHA512FromString -String $solution + } - for ([int] $i = 0; $i -le 1000; $i++) + return $solution + } + finally { - $solution = Get-SHA512FromString -String $solution + [Runtime.InteropServices.Marshal]::FreeBSTR($BSTR) } - - return $solution } $global:VirtualDesktopUpdaterScriptBlock = { @@ -414,7 +422,7 @@ class ClientIO { Write-Verbose "Encrypted tunnel opened and ready for use." } - [void]Authentify([string] $Password) { + [void]Authentify([SecureString] $SecurePassword) { <# .SYNOPSIS Handle authentication process with remote server. @@ -430,7 +438,7 @@ class ClientIO { $candidate = $this.Reader.ReadLine() - $challengeSolution = Resolve-AuthenticationChallenge -Candidate $candidate -Password $Password + $challengeSolution = Resolve-AuthenticationChallenge -Candidate $candidate -SecurePassword $SecurePassword Write-Verbose "@Challenge:" Write-Verbose "Candidate: ""${candidate}""" @@ -637,7 +645,7 @@ class ViewerSession [PSCustomObject] $SessionInformation = $null [string] $ServerAddress = "127.0.0.1" [string] $ServerPort = 2801 - [string] $Password = "" + [SecureString] $SecurePassword = $null [bool] $TLSv1_3 = $false [ClientIO] $ClientDesktop = $null @@ -646,7 +654,7 @@ class ViewerSession ViewerSession( [string] $ServerAddress, [int] $ServerPort, - [string] $Password, + [SecureString] $SecurePassword, [bool] $TLSv1_3 ) { @@ -664,7 +672,7 @@ class ViewerSession .PARAMETER ServerPort Remote Server Port. - .PARAMETER Password + .PARAMETER SecureString Password used during server authentication. .PARAMETER TLSv1_3 @@ -682,7 +690,7 @@ class ViewerSession $this.ServerAddress = $ServerAddress $this.ServerPort = $ServerPort - $this.Password = $Password + $this.SecurePassword = $SecurePassword $this.TLSv1_3 = $TLSv1_3 } @@ -708,7 +716,7 @@ class ViewerSession { $this.ClientDesktop.Connect() - $this.ClientDesktop.Authentify($this.Password) + $this.ClientDesktop.Authentify($this.SecurePassword) $this.SessionInformation = $this.ClientDesktop.Hello() @@ -722,7 +730,7 @@ class ViewerSession $this.ClientControl = [ClientIO]::new($this.ServerAddress, $this.ServerPort, $this.TLSv1_3) $this.ClientControl.Connect() - $this.ClientControl.Authentify($this.Password) + $this.ClientControl.Authentify($this.SecurePassword) $this.ClientControl.Hello($this.SessionInformation.SessionId) @@ -896,8 +904,16 @@ function Invoke-RemoteDesktopViewer This option is generally set to true during development when connecting to local machine to avoid funny things. + .PARAMETER SecurePassword + SecureString Password object used to authenticate with remote server (Recommended) + + Call "ConvertTo-SecureString –String "YouPasswordHere" -AsPlainText -Force" on this parameter to convert + a plain-text String to SecureString. + + See example section. + .PARAMETER Password - Password used during server authentication. + Plain-Text Password used to authenticate with remote server (Not recommended, use SecurePassword instead) .PARAMETER TLSv1_3 Define whether or not client must use SSL/TLS v1.3 to communicate with remote server. @@ -907,6 +923,7 @@ function Invoke-RemoteDesktopViewer Disable verbosity (not recommended) .EXAMPLE + Invoke-RemoteDesktopViewer -ServerAddress "192.168.0.10" -ServerPort "2801" -SecurePassword (ConvertTo-SecureString -String "s3cr3t!" -AsPlainText -Force) Invoke-RemoteDesktopViewer -ServerAddress "192.168.0.10" -ServerPort "2801" -Password "s3cr3t!" Invoke-RemoteDesktopViewer -ServerAddress "127.0.0.1" -ServerPort "2801" -Password "Just4TestingLocally!" @@ -916,9 +933,9 @@ function Invoke-RemoteDesktopViewer [int] $ServerPort = 2801, [switch] $DisableInputControl, [switch] $TLSv1_3, - - [Parameter(Mandatory=$true)] - [string] $Password, + + [SecureString] $SecurePassword, + [String] $Password, [switch] $DisableVerbosity ) @@ -945,8 +962,20 @@ function Invoke-RemoteDesktopViewer [W.User32]::SetProcessDPIAware() | Out-Null Write-Verbose "Server address: ""${ServerAddress}:${ServerPort}""" + + if (-not $SecurePassword -and -not $Password) + { + throw "You must specify either a SecurePassword or Password parameter used during server authentication." + } + + if ($Password -and -not $SecurePassword) + { + $SecurePassword = (ConvertTo-SecureString -String $Password -AsPlainText -Force) + + Remove-Variable -Name "Password" -ErrorAction SilentlyContinue + } - $session = [ViewerSession]::New($ServerAddress, $ServerPort, $Password, $TLSv1_3) + $session = [ViewerSession]::New($ServerAddress, $ServerPort, $SecurePassword, $TLSv1_3) try { $session.OpenSession() diff --git a/TestViewer.ps1 b/TestViewer.ps1 index a6f18cf..89fc039 100644 --- a/TestViewer.ps1 +++ b/TestViewer.ps1 @@ -2,4 +2,4 @@ Write-Output "This script is used during development phase. Never run this scrip Invoke-Expression -Command (Get-Content "PowerRemoteDesktop_Viewer\PowerRemoteDesktop_Viewer.psm1" -Raw) -Invoke-RemoteDesktopViewer -Password "Jade@123@Pwd" -ServerAddress "127.0.0.1" \ No newline at end of file +Invoke-RemoteDesktopViewer -SecurePassword (ConvertTo-SecureString -String "Jade@123@Pwd" -AsPlainText -Force) -ServerAddress "127.0.0.1" \ No newline at end of file From dc4f9099e62bf3032a924933c53b1d32c54823d4 Mon Sep 17 00:00:00 2001 From: Jean-Pierre LESUEUR Date: Thu, 13 Jan 2022 15:31:29 +0100 Subject: [PATCH 02/10] Readme updated --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5ec1f20..0c1d52d 100644 --- a/README.md +++ b/README.md @@ -240,11 +240,14 @@ Then pass the encoded string to parameter `EncodedCertificate`. * Possibility to change desktop image quality. * Possibility to choose which screen to capture if multiple screens (Monitors) are present on remote machine. +### XX XX 2022 (1.0.4 Beta 5) + +* Password is stored as SecureString on Viewer. I don't see the point of implementing SecureString sever-side, if you do see the point, please change my mind. + ![Multi Screen Example](Assets/multi-screen.png) ### List of ideas and TODO -* 🟒 Do a deep investigation about SecureString and if it applies to current project (to protect password) * 🟒 Support Password Protected external Certificates. * 🟒 Server Fingerprint Authentication. * 🟒 Mutual Authentication for SSL/TLS (Client Certificate). From f690cfe8999bfaeadd559a91df6a74c1d36f9cf2 Mon Sep 17 00:00:00 2001 From: Jean-Pierre LESUEUR Date: Thu, 13 Jan 2022 18:42:03 +0100 Subject: [PATCH 03/10] Feat: server fingerprint validation added. --- .../PowerRemoteDesktop_Viewer.psm1 | 51 ++++++++++++++++--- 1 file changed, 43 insertions(+), 8 deletions(-) diff --git a/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psm1 b/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psm1 index 2f150f8..30c351c 100644 --- a/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psm1 +++ b/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psm1 @@ -54,6 +54,8 @@ Add-Type -MemberDefinition '[DllImport("User32.dll")] public static extern bool $global:PowerRemoteDesktopVersion = "1.0.3.beta.4" +$global:CachedCertificatesFingerprints = @() + function Write-Banner { <# @@ -390,15 +392,48 @@ class ClientIO { $this.Client.GetStream(), $false, { - param( - $Sendr, - $Certificate, - $Chain, - $Policy + param( + $Sendr, + $Certificate, + $Chain, + $Policy ) - # TODO: Certificate Validation - return $true + if ($global:CachedCertificatesFingerprints -contains $Certificate.Thumbprint) + { + Write-Verbose "Fingerprint already known and trusted: ""$($Certificate.Thumbprint)""" + + return $true + } + else + { + Write-Verbose "@Remote Server Certificate:" + Write-Verbose $Certificate + Write-Verbose "---" + + Write-Host "Server Certificate Fingerprint: """ -NoNewLine + Write-Host $Certificate.Thumbprint -NoNewline -ForegroundColor Green + Write-Host """" + + while ($true) + { + $choice = Read-Host "`r`nDo you confirm the fingerprint is correct ? (Default: N)" + + if ($choice -eq "Y" -or $choice -eq "Yes") + { + $global:CachedCertificatesFingerprints += $Certificate.Thumbprint + + return $true + } + elseif ($choice -eq "N" -or $choice -eq "No" -or -not $choice) + { + return $false + } + else { + Write-Host "Invalid answer, please enter ""Y"" / ""Yes"" or ""N"" / ""No""" -ForegroundColor Red + } + } + } } ) @@ -920,7 +955,7 @@ function Invoke-RemoteDesktopViewer Recommended if possible. .PARAMETER DisableVerbosity - Disable verbosity (not recommended) + Disable verbosity (not recommended) .EXAMPLE Invoke-RemoteDesktopViewer -ServerAddress "192.168.0.10" -ServerPort "2801" -SecurePassword (ConvertTo-SecureString -String "s3cr3t!" -AsPlainText -Force) From 75465f3322b03e28e348214bdc990d3453cd1eb2 Mon Sep 17 00:00:00 2001 From: Jean-Pierre LESUEUR Date: Thu, 13 Jan 2022 19:27:22 +0100 Subject: [PATCH 04/10] Feat: Local storage added, storing trusted server fingerprints on local storage. --- .../PowerRemoteDesktop_Viewer.psm1 | 79 ++++++++++++++++++- 1 file changed, 75 insertions(+), 4 deletions(-) diff --git a/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psm1 b/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psm1 index 30c351c..a38167c 100644 --- a/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psm1 +++ b/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psm1 @@ -54,7 +54,9 @@ Add-Type -MemberDefinition '[DllImport("User32.dll")] public static extern bool $global:PowerRemoteDesktopVersion = "1.0.3.beta.4" -$global:CachedCertificatesFingerprints = @() +# Local storage definitions +$global:LocalStoragePath = "HKCU:\SOFTWARE\PowerRemoteDesktop_Viewer" +$global:LocalStoragePath_TrustedServers = -join($global:LocalStoragePath, "\TrustedServers") function Write-Banner { @@ -83,6 +85,75 @@ function Write-Banner Write-Host "" } +function New-RegistryStorage +{ + <# + .SYNOPSIS + Create required registry keys for storing persistent data between viewer + sessions. + + .DESCRIPTION + Users doesn't share this storage. If you really wish to, replace HKCU by HKLM (Requires Admin Privilege) + #> + + try + { + if (-not (Test-Path -Path $global:LocalStoragePath)) + { + Write-Verbose "Create local storage root at ""${global:LocalStoragePath}""..." + + New-Item -Path $global:LocalStoragePath + } + + if (-not (Test-Path -Path $global:LocalStoragePath_TrustedServers)) + { + Write-Verbose "Create local storage child: ""${global:LocalStoragePath}""..." + + New-Item -Path $global:LocalStoragePath_TrustedServers + } + } + catch + { + Write-Verbose "Could not write server fingerprint to local storage with error: ""$($_)""" + } +} + +function Write-ServerFingerprintToLocalStorage +{ + <# + .SYNOPSIS + Write a trusted server certificate fingerprint to our local storage. + + .PARAMETER Fingerprint + The server certificate fingerprint to store. + #> + param ( + [Parameter(Mandatory=$True)] + [string] $Fingerprint + ) + + New-RegistryStorage + + New-ItemProperty -Path $global:LocalStoragePath_TrustedServers -Name $Fingerprint -PropertyType "String" -ErrorAction Ignore +} + +function Test-ServerFingerprintFromLocalStorage +{ + <# + .SYNOPSIS + Check if a server certificate fingerprint was saved to local storage. + + .PARAMETER Fingerprint + The server certificate fingerprint to check. + #> + param ( + [Parameter(Mandatory=$True)] + [string] $Fingerprint + ) + + return (Get-ItemProperty -Path $global:LocalStoragePath_TrustedServers -Name $Fingerprint -ErrorAction Ignore) +} + function Get-SHA512FromString { <# @@ -399,7 +470,7 @@ class ClientIO { $Policy ) - if ($global:CachedCertificatesFingerprints -contains $Certificate.Thumbprint) + if (Test-ServerFingerprintFromLocalStorage -Fingerprint $Certificate.Thumbprint) { Write-Verbose "Fingerprint already known and trusted: ""$($Certificate.Thumbprint)""" @@ -420,8 +491,8 @@ class ClientIO { $choice = Read-Host "`r`nDo you confirm the fingerprint is correct ? (Default: N)" if ($choice -eq "Y" -or $choice -eq "Yes") - { - $global:CachedCertificatesFingerprints += $Certificate.Thumbprint + { + Write-ServerFingerprintToLocalStorage -Fingerprint $Certificate.Thumbprint return $true } From 9cee1acc19c191b272a96fc57c60c7ee7a93535a Mon Sep 17 00:00:00 2001 From: Jean-Pierre LESUEUR Date: Fri, 14 Jan 2022 11:13:26 +0100 Subject: [PATCH 05/10] Feat: ability to get, remove, clear trusted servers. --- .../PowerRemoteDesktop_Viewer.psm1 | 200 ++++++++++++++++-- 1 file changed, 185 insertions(+), 15 deletions(-) diff --git a/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psm1 b/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psm1 index a38167c..c19d445 100644 --- a/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psm1 +++ b/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psm1 @@ -54,6 +54,9 @@ Add-Type -MemberDefinition '[DllImport("User32.dll")] public static extern bool $global:PowerRemoteDesktopVersion = "1.0.3.beta.4" +# Last until PowerShell session is closed +$global:EphemeralTrustedServers = @() + # Local storage definitions $global:LocalStoragePath = "HKCU:\SOFTWARE\PowerRemoteDesktop_Viewer" $global:LocalStoragePath_TrustedServers = -join($global:LocalStoragePath, "\TrustedServers") @@ -85,6 +88,40 @@ function Write-Banner Write-Host "" } +function Get-BooleanAnswer +{ + <# + .SYNOPSIS + As user to make a boolean choice. Return True if Y and False if N. + #> + while ($true) + { + $choice = Read-Host "[Y] Yes [N] No (Default is ""N"")" + if (-not $choice) + { + $choice = "N" + } + + switch ($choice) + { + "Y" + { + return $true + } + + "N" + { + return $false + } + + default + { + Write-Host "Invalid Answer, available options are ""Y , N""" -ForegroundColor Red + } + } + } +} + function New-RegistryStorage { <# @@ -134,7 +171,93 @@ function Write-ServerFingerprintToLocalStorage New-RegistryStorage - New-ItemProperty -Path $global:LocalStoragePath_TrustedServers -Name $Fingerprint -PropertyType "String" -ErrorAction Ignore + # Value is stored as a JSON Object to be easily upgraded and extended in future. + $value = New-Object -TypeName PSCustomObject -Property @{ + FirstSeen = (Get-Date).ToString() + } + + New-ItemProperty -Path $global:LocalStoragePath_TrustedServers -Name $Fingerprint -PropertyType "String" -Value ($value | ConvertTo-Json -Compress) -ErrorAction Ignore +} + +function Remove-TrustedServer +{ + <# + .SYNOPSIS + Remove trusted server from local storage. + + .PARAMETER Fingerprint + Server certificate to remove from trusted server list. + #> + param ( + [Parameter(Mandatory=$True)] + [string] $Fingerprint + ) + + if (-not (Test-ServerFingerprintFromLocalStorage -Fingerprint $Fingerprint)) + { + throw "Could not find fingerprint on trusted server list." + } + + Write-Host "You are about to permanently delete trusted server -> """ -NoNewline + Write-Host $Fingerprint -NoNewLine -ForegroundColor Green + Write-Host """" + + Write-Host "Are you sure ?" + + if (Get-BooleanAnswer) + { + Remove-ItemProperty -Path $global:LocalStoragePath_TrustedServers -Name $Fingerprint + + Write-Host "Server successfully untrusted." + } +} + +function Get-TrustedServers +{ + <# + .SYNOPSIS + Return a list of trusted servers fingerprints from local storage. + #> + + $list = @() + + Get-Item -Path $global:LocalStoragePath_TrustedServers -ErrorAction Ignore | Select-Object -ExpandProperty Property | ForEach-Object { + try + { + $list += New-Object -TypeName PSCustomObject -Property @{ + Fingerprint = $_ + Detail = (Get-ItemPropertyValue -Path $global:LocalStoragePath_TrustedServers -Name $_) | ConvertFrom-Json + } + } + catch + { } + } + + return $list +} + +function Clear-TrustedServers +{ + <# + .SYNOPSIS + Remove all trusted servers from local storage. + #> + + $trustedServers = Get-TrustedServers + if (@($trustedServers).Length -eq 0) + { + throw "No trusted servers so far." + } + + Write-Host "You are about to permanently delete $(@(trustedServers).Length) trusted servers." + Write-Host "Are you sure ?" + + if (Get-BooleanAnswer) + { + Remove-Item -Path $global:LocalStoragePath_TrustedServers -Force -Verbose + + Write-Host "Servers successfully untrusted." + } } function Test-ServerFingerprintFromLocalStorage @@ -470,7 +593,10 @@ class ClientIO { $Policy ) - if (Test-ServerFingerprintFromLocalStorage -Fingerprint $Certificate.Thumbprint) + if ( + (Test-ServerFingerprintFromLocalStorage -Fingerprint $Certificate.Thumbprint) -or + $global:EphemeralTrustedServers -contains $Certificate.Thumbprint + ) { Write-Verbose "Fingerprint already known and trusted: ""$($Certificate.Thumbprint)""" @@ -482,26 +608,67 @@ class ClientIO { Write-Verbose $Certificate Write-Verbose "---" - Write-Host "Server Certificate Fingerprint: """ -NoNewLine + Write-Host "Untrusted Server Certificate Fingerprint: """ -NoNewLine Write-Host $Certificate.Thumbprint -NoNewline -ForegroundColor Green Write-Host """" while ($true) { - $choice = Read-Host "`r`nDo you confirm the fingerprint is correct ? (Default: N)" - - if ($choice -eq "Y" -or $choice -eq "Yes") - { - Write-ServerFingerprintToLocalStorage -Fingerprint $Certificate.Thumbprint - - return $true - } - elseif ($choice -eq "N" -or $choice -eq "No" -or -not $choice) + Write-Host "`r`nDo you want to trust current server ?" + $choice = Read-Host "[A] Always [Y] Yes [N] No [?] Help (Default is ""N"")" + if (-not $choice) { - return $false + $choice = "N" } - else { - Write-Host "Invalid answer, please enter ""Y"" / ""Yes"" or ""N"" / ""No""" -ForegroundColor Red + + switch ($choice) + { + "?" + { + Write-Host "" + + Write-Host "[" -NoNewLine + Write-Host "A" -NoNewLine -ForegroundColor Cyan + Write-Host "] Always trust current server (Persistent between PowerShell Instances)" + + Write-Host "[" -NoNewLine + Write-Host "Y" -NoNewLine -ForegroundColor Cyan + Write-Host "] Trust current server during current PowerShell Instance lifetime (Temporary)." + + Write-Host "[" -NoNewLine + Write-Host "N" -NoNewLine -ForegroundColor Cyan + Write-Host "] Don't trust current server. Connection is aborted (Recommeneded if you don't recognize server fingerprint)." + + Write-Host "[" -NoNewLine + Write-Host "?" -NoNewLine -ForegroundColor Cyan + Write-Host "] Current help output." + + Write-Host "" + } + + "A" + { + Write-ServerFingerprintToLocalStorage -Fingerprint $Certificate.Thumbprint + + return $true + } + + "Y" + { + $global:EphemeralTrustedServers += $Certificate.Thumbprint + + return $true + } + + "N" + { + return $false + } + + default + { + Write-Host "Invalid Answer, available options are ""A , Y , N , H""" -ForegroundColor Red + } } } } @@ -1462,5 +1629,8 @@ function Invoke-RemoteDesktopViewer } try { + Export-ModuleMember -Function Remove-TrustedServer + Export-ModuleMember -Function Clear-TrustedServers + Export-ModuleMember -Function Get-TrustedServers Export-ModuleMember -Function Invoke-RemoteDesktopViewer } catch {} \ No newline at end of file From 70bad59d024977e819b162266e2c33b639bf891a Mon Sep 17 00:00:00 2001 From: Jean-Pierre LESUEUR Date: Fri, 14 Jan 2022 11:15:49 +0100 Subject: [PATCH 06/10] Viewer module manifest updated to define new exported functions --- .../PowerRemoteDesktop_Viewer.psd1 | Bin 8318 -> 8458 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psd1 b/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psd1 index b644c7f1da454b9e300213b4140243fe4bc86918..b036a6f021cc2749eaf73148dd2108d253a1ceae 100644 GIT binary patch delta 151 zcmez8(B-sYig3LSg93vRLl8qMLoP!;Lm80PWe8y?Vkl)OW+(yjQW%1PWD!`V2&fXG i-kBi>D4GZq$EUg&uHGG}x&)hAF1XRfn Date: Fri, 14 Jan 2022 11:16:57 +0100 Subject: [PATCH 07/10] Version updated --- .../PowerRemoteDesktop_Server.psd1 | Bin 8388 -> 8388 bytes .../PowerRemoteDesktop_Server.psm1 | 2 +- .../PowerRemoteDesktop_Viewer.psd1 | Bin 8458 -> 8458 bytes .../PowerRemoteDesktop_Viewer.psm1 | 2 +- 4 files changed, 2 insertions(+), 2 deletions(-) diff --git a/PowerRemoteDesktop_Server/PowerRemoteDesktop_Server.psd1 b/PowerRemoteDesktop_Server/PowerRemoteDesktop_Server.psd1 index 0f6b9fa8cf1232c21fe7bd59ba5abf7109962f67..95aa3c2d9707f56c08153a4291ba23e7d9a9391e 100644 GIT binary patch delta 25 hcmX@&c*Jo-5fh`y=3*v!8Aj8|hBCsNm&wU70RV9<2ZsOv delta 25 hcmX@&c*Jo-5fh{F=3*v!8Ag-IhBCsNm&wU70RV9k2ZaCt diff --git a/PowerRemoteDesktop_Server/PowerRemoteDesktop_Server.psm1 b/PowerRemoteDesktop_Server/PowerRemoteDesktop_Server.psm1 index be19dde..7b8fa5b 100644 --- a/PowerRemoteDesktop_Server/PowerRemoteDesktop_Server.psm1 +++ b/PowerRemoteDesktop_Server/PowerRemoteDesktop_Server.psm1 @@ -53,7 +53,7 @@ Add-Type -Assembly System.Windows.Forms Add-Type -Assembly System.Drawing Add-Type -MemberDefinition '[DllImport("User32.dll")] public static extern bool SetProcessDPIAware();' -Name User32 -Namespace W; -$global:PowerRemoteDesktopVersion = "1.0.3.beta.4" +$global:PowerRemoteDesktopVersion = "1.0.4.beta.5" enum TransportMode { Raw = 1 diff --git a/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psd1 b/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psd1 index b036a6f021cc2749eaf73148dd2108d253a1ceae..03f6f4d19f86ddb8559259b4910b96a64585d48e 100644 GIT binary patch delta 21 ccmeBj>T=pp#KdT_xtJ+chS7BMO*um*08h;Zt^fc4 delta 21 ccmeBj>T=pp#KdU4xtJ+chS6m6O*um*08hFGtN;K2 diff --git a/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psm1 b/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psm1 index c19d445..ca9a60b 100644 --- a/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psm1 +++ b/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psm1 @@ -52,7 +52,7 @@ Add-Type -Assembly System.Windows.Forms Add-Type -MemberDefinition '[DllImport("User32.dll")] public static extern bool SetProcessDPIAware();' -Name User32 -Namespace W; -$global:PowerRemoteDesktopVersion = "1.0.3.beta.4" +$global:PowerRemoteDesktopVersion = "1.0.4.beta.5" # Last until PowerShell session is closed $global:EphemeralTrustedServers = @() From 1e47b3f281b4e420e1adc0b456e8afd6a6d56a52 Mon Sep 17 00:00:00 2001 From: Jean-Pierre LESUEUR Date: Fri, 14 Jan 2022 11:24:38 +0100 Subject: [PATCH 08/10] Readme updated --- Assets/server-fingerprint-validation.png | Bin 0 -> 74976 bytes README.md | 38 ++++++++++++++++++++--- 2 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 Assets/server-fingerprint-validation.png diff --git a/Assets/server-fingerprint-validation.png b/Assets/server-fingerprint-validation.png new file mode 100644 index 0000000000000000000000000000000000000000..e95051ee51b7a4712a06dedeab1fa4ce8ce7da79 GIT binary patch literal 74976 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 0c1d52d..b860388 100644 --- a/README.md +++ b/README.md @@ -219,6 +219,30 @@ First encode your certificate file as base64 string. Then pass the encoded string to parameter `EncodedCertificate`. +### List trusted servers + +It is now possible to persistantly trust server using a local storage (Windows User Registry Hive) + +`Get-TrustedServers` + +Example output: + +```` +PS C:\Users\Phrozen\Desktop\Projects\PowerRemoteDesktop> Get-TrustedServers + +Detail Fingerprint +------ ----------- +@{FirstSeen=14/01/2022 11:06:16} EA88AADA402864D1864542F7F2A3C49E56F473B0 +```` + +### Delete trusted server (Permanently) + +`Remove-TrustedServer` + +### Delete all trusted servers (Permanently) + +`Clear-TrustedServers` + ## Changelog ### 11 January 2022 (1.0.1 Beta 2) @@ -240,22 +264,28 @@ Then pass the encoded string to parameter `EncodedCertificate`. * Possibility to change desktop image quality. * Possibility to choose which screen to capture if multiple screens (Monitors) are present on remote machine. +#### Multi Screen Selection + +![Multi Screen Example](Assets/multi-screen.png) + ### XX XX 2022 (1.0.4 Beta 5) * Password is stored as SecureString on Viewer. I don't see the point of implementing SecureString sever-side, if you do see the point, please change my mind. +* Server Fingerprint Validation. +* Possibility to trust a server for current PowerShell Instance or persistantly using a local storage. +* Possibility to manage trusted servers (List, Remove, Remove All) -![Multi Screen Example](Assets/multi-screen.png) +#### Fingerprint Validation + +![Server Fingerprint Validation](Assets/server-fingerprint-validation.png) ### List of ideas and TODO * 🟒 Support Password Protected external Certificates. -* 🟒 Server Fingerprint Authentication. * 🟒 Mutual Authentication for SSL/TLS (Client Certificate). * 🟒 Synchronize Cursor State. * 🟒 Synchronize Clipboard. * 🟠 Keep-Alive system to implement Read / Write Timeout. -* 🟠 Improve Virtual Keyboard. -* 🟠 Server Concurrency. * 🟠 Listen for local/remote screen resolution update event. * πŸ”΄ Motion Update for Desktop Streaming (Only send and update changing parts of desktop). From c73ace409d003dd4fa709a5b4e0eb0485a3dfdf2 Mon Sep 17 00:00:00 2001 From: Jean-Pierre LESUEUR Date: Fri, 14 Jan 2022 13:01:39 +0100 Subject: [PATCH 09/10] Disclaimer fix --- .../PowerRemoteDesktop_Server.psm1 | 15 ++++++++------- .../PowerRemoteDesktop_Viewer.psm1 | 15 ++++++++------- README.md | 16 ++++++++-------- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/PowerRemoteDesktop_Server/PowerRemoteDesktop_Server.psm1 b/PowerRemoteDesktop_Server/PowerRemoteDesktop_Server.psm1 index 7b8fa5b..97fff7d 100644 --- a/PowerRemoteDesktop_Server/PowerRemoteDesktop_Server.psm1 +++ b/PowerRemoteDesktop_Server/PowerRemoteDesktop_Server.psm1 @@ -32,18 +32,19 @@ Wait for final 1.0 version. .Disclaimer - We are doing our best to prepare the content of this app. However, PHROZEN SASU cannot - warranty the expressions and suggestions of the contents, as well as its accuracy. - In addition, to the extent permitted by the law, PHROZEN SASU shall not be responsible - for any losses and/or damages due to the usage of the information on our app. + We are doing our best to prepare the content of this app. However, PHROZEN SASU and / or + Jean-Pierre LESUEUR cannot warranty the expressions and suggestions of the contents, + as well as its accuracy. In addition, to the extent permitted by the law, + PHROZEN SASU and / or Jean-Pierre LESUEUR shall not be responsible for any losses + and/or damages due to the usage of the information on our app. By using our app, you hereby consent to our disclaimer and agree to its terms. Any links contained in our app may lead to external sites are provided for convenience only. Any information or statements that appeared in these sites - or app are not sponsored, endorsed, or otherwise approved by PHROZEN SASU. - For these external sites, SubSeven Legacy cannot be held liable for the - availability of, or the content located on or through it. + or app are not sponsored, endorsed, or otherwise approved by PHROZEN SASU and / or + Jean-Pierre LESUEUR. For these external sites, PHROZEN SASU and / or Jean-Pierre LESUEUR + cannot be held liable for the availability of, or the content located on or through it. Plus, any losses or damages occurred from using these contents or the internet generally. diff --git a/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psm1 b/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psm1 index ca9a60b..486ebe8 100644 --- a/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psm1 +++ b/PowerRemoteDesktop_Viewer/PowerRemoteDesktop_Viewer.psm1 @@ -32,18 +32,19 @@ Wait for final 1.0 version. .Disclaimer - We are doing our best to prepare the content of this app. However, PHROZEN SASU cannot - warranty the expressions and suggestions of the contents, as well as its accuracy. - In addition, to the extent permitted by the law, PHROZEN SASU shall not be responsible - for any losses and/or damages due to the usage of the information on our app. + We are doing our best to prepare the content of this app. However, PHROZEN SASU and / or + Jean-Pierre LESUEUR cannot warranty the expressions and suggestions of the contents, + as well as its accuracy. In addition, to the extent permitted by the law, + PHROZEN SASU and / or Jean-Pierre LESUEUR shall not be responsible for any losses + and/or damages due to the usage of the information on our app. By using our app, you hereby consent to our disclaimer and agree to its terms. Any links contained in our app may lead to external sites are provided for convenience only. Any information or statements that appeared in these sites - or app are not sponsored, endorsed, or otherwise approved by PHROZEN SASU. - For these external sites, SubSeven Legacy cannot be held liable for the - availability of, or the content located on or through it. + or app are not sponsored, endorsed, or otherwise approved by PHROZEN SASU and / or + Jean-Pierre LESUEUR. For these external sites, PHROZEN SASU and / or Jean-Pierre LESUEUR + cannot be held liable for the availability of, or the content located on or through it. Plus, any losses or damages occurred from using these contents or the internet generally. diff --git a/README.md b/README.md index b860388..0dad091 100644 --- a/README.md +++ b/README.md @@ -295,18 +295,18 @@ Detail Fingerprint # Disclaimer -We are doing our best to prepare the content of this app. However, PHROZEN SASU cannot -warranty the expressions and suggestions of the contents, as well as its accuracy. -In addition, to the extent permitted by the law, PHROZEN SASU shall not be responsible -for any losses and/or damages due to the usage of the information on our app. +We are doing our best to prepare the content of this app. However, PHROZEN SASU and / or +Jean-Pierre LESUEUR cannot warranty the expressions and suggestions of the contents, +as well as its accuracy. In addition, to the extent permitted by the law, +PHROZEN SASU and / or Jean-Pierre LESUEUR shall not be responsible for any losses +and/or damages due to the usage of the information on our app. By using our app, you hereby consent to our disclaimer and agree to its terms. Any links contained in our app may lead to external sites are provided for convenience only. Any information or statements that appeared in these sites -or app are not sponsored, endorsed, or otherwise approved by PHROZEN SASU. -For these external sites, SubSeven Legacy cannot be held liable for the -availability of, or the content located on or through it. +or app are not sponsored, endorsed, or otherwise approved by PHROZEN SASU and / or +Jean-Pierre LESUEUR. For these external sites, PHROZEN SASU and / or Jean-Pierre LESUEUR +cannot be held liable for the availability of, or the content located on or through it. Plus, any losses or damages occurred from using these contents or the internet generally. - From c12056bb8460eb7db44a09aafb3b4d96f7df0612 Mon Sep 17 00:00:00 2001 From: Jean-Pierre LESUEUR Date: Fri, 14 Jan 2022 13:03:26 +0100 Subject: [PATCH 10/10] Readme updated --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0dad091..29978f5 100644 --- a/README.md +++ b/README.md @@ -268,7 +268,7 @@ Detail Fingerprint ![Multi Screen Example](Assets/multi-screen.png) -### XX XX 2022 (1.0.4 Beta 5) +### 14 January 2022 (1.0.4 Beta 5) * Password is stored as SecureString on Viewer. I don't see the point of implementing SecureString sever-side, if you do see the point, please change my mind. * Server Fingerprint Validation.