Registrare un custom browser protocols in windows
In windows è possibile registrare un protocollo custom per il browser in modo da associare ad esso l'esecuzione di uno specifico eseguibile o script.
Il modo più veloce per creare delle chiavi di registro è creare un file di testo con estensione .reg, ed eseguirlo con doppio click. Ecco un esempio:
In questo caso registro un protocollo sgart-file: che prende il parametro passato e lo passa al comando Invoke-Item di PowerShell.
Per provarlo si può creare una pagina html con un tag anchor, ad esempio, con il path di una cartella locale o di rete
cliccando su uno di questi link verrà chiesta una conferma prima di eseguire l'azioneconfermando con Apri Windows PowerShell, si vedrà per un momento partire la finestra di PowerShell, che subito dopo si chiuderà e si aprirà il percorso indicato con explorer.exe.
Così com'è il custom protocol è molto pericoloso, infatti è possibile avere coma parametro anche dei file eseguibili (exe, com, bat, ecc...).
Ad esempio, è possibile avviare notepad.exe
Per prevenire questo comportamento è possibile modificare lo script precedente per permettere solo percorsi locali o di rete
a questo punto il file .reg deve essere modificato in questo modo
Ovviamente è possibile utilizzare anche un eseguibile.
Ad esempio con .NET Core 5 è possibile creare una console application
e inserire questo codice C#
da compilare ed eseguire per test con il comando
Con protocollo si intende, ad esempio, https:, file:, mailto, tel:, zoommtg:, ecc...
Ad ogni protocollo, nel registry, è associata una specifica azione, ad esempio il protocollo file: provoca l'esecuzione di explorer.exe che apre la cartella corrispondente oppure zoommtg: che provoca l'apertura del client Zoom per fare video conferenze.
La registrazione di un protocollo custom prevede la creazione di specifiche chiavi di registro.Ad ogni protocollo, nel registry, è associata una specifica azione, ad esempio il protocollo file: provoca l'esecuzione di explorer.exe che apre la cartella corrispondente oppure zoommtg: che provoca l'apertura del client Zoom per fare video conferenze.
Il modo più veloce per creare delle chiavi di registro è creare un file di testo con estensione .reg, ed eseguirlo con doppio click. Ecco un esempio:
Text: sgart-file-1.reg
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\sgart-file]
@="URL:Sgart File Protocol"
"URL Protocol"=""
[HKEY_CLASSES_ROOT\sgart-file\shell]
[HKEY_CLASSES_ROOT\sgart-file\shell\open]
[HKEY_CLASSES_ROOT\sgart-file\shell\open\command]
@="C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -Command \"& {Invoke-Item ('%1' -replace 'penny-file:','' -replace '%%5C', '\\') }\""
PowerShell deve essere scritto con il full path C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe
Per provarlo si può creare una pagina html con un tag anchor, ad esempio, con il path di una cartella locale o di rete
HTML
<a href="sgart-file:c:/temp/p1">apri cartella locale</a>
<a href="sgart-file://server/temp/p1">apri cartella locale</a>
Questo trucco potrebbe essere usato in Chrome per aggirare l'attuale limitazione di sicurezza che non permette più l'esecuzione dei link di tipo file: per accedere a cartelle locali o di rete.
Così com'è il custom protocol è molto pericoloso, infatti è possibile avere coma parametro anche dei file eseguibili (exe, com, bat, ecc...).
Ad esempio, è possibile avviare notepad.exe
HTML
<a href="sgart-file:notepad.exe">esegue un comando</a>
Questo comportamento deve essere assolutamente evitato, in quanto potrebbero esserci dei malintenzionati che costruiscono pagine internet pubbliche, al fine di sfruttare questo comportamento libertino per compromettere il computer inducendo l'utente a cliccare su questi link malevoli.
Per prevenire questo comportamento è possibile modificare lo script precedente per permettere solo percorsi locali o di rete
PowerShell
# rimuovo il protocollo sgart-file:
$p = '%1' -replace 'sgart-file:','';
# recupero l'estensione
$ext = [system.IO.Path]::GetExtension($p);
# per debug resitro su un file di log le esecuzioni
(Get-Date -Format 'yyy-MM-dd HH:mm:ss') + ' ' + $p + ', ext=' + $ext >> c:\temp\sgart-protocol.log;
if($ext -eq '') {
# solo se non ho delle estensioni eseguo il comando
Invoke-Item $p;
}
Text: sgart-file-1.reg
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\sgart-file]
@="URL:Sgart File Protocol"
"URL Protocol"=""
[HKEY_CLASSES_ROOT\sgart-file\shell]
[HKEY_CLASSES_ROOT\sgart-file\shell\open]
[HKEY_CLASSES_ROOT\sgart-file\shell\open\command]
@="C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -NoLogo -NoProfile -NonInteractive -Command \"& {$p = '%1' -replace 'sgart-file:','' -replace '%%5C', '\\'; $ext = [system.IO.Path]::GetExtension($p); (Get-Date -Format 'yyy-MM-dd HH:mm:ss') + ' ' + $p + ', ext=' + $ext >> c:\\temp\\sgart-protocol.log; if($ext -eq '') { Invoke-Item $p; }}\""
Nella stringa deve essere fatto l'escape di alcuni caratteri. Ad esempio la back-slash si raddoppia \\, mentre le virgolette doppie vanno inserite così \".
Attenzione, non è detto che lo script impedisca in tutti i modi di lanciare degli eseguibili, non ho fatto test approfonditi. Questo esempio è solo dimostrativo.
Molto meglio rafforzare i controlli, ad esempio, inserendo una lista di percorsi permessi.
Molto meglio rafforzare i controlli, ad esempio, inserendo una lista di percorsi permessi.
Ovviamente è possibile utilizzare anche un eseguibile.
Ad esempio con .NET Core 5 è possibile creare una console application
DOS / Batch file
dotnet new console
C#: Program.cs
using System;
namespace SgartProtocol
{
class Program
{
static void Main(string[] args)
{
var p = args[0].Replace("sgart-file:", "");
// TODO: rafforzare la sicurezza controllando i percorsi permessi
Console.WriteLine($"Parametro: {args[0]} => {p}");
System.Diagnostics.Process.Start(@"C:\Windows\explorer.exe", p);
}
}
}
DOS / Batch file
dotnet run c:\temp
In questo viene mandato in esecuzione (Process.Start) explorer.exe con il parametro passato. Questo evita che possa essere lanciato un qualsiasi eseguibile.
A questo punto il nostro file .reg diventaText: sgart-file-1.reg
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\sgart-file]
@="URL:Sgart File Protocol"
"URL Protocol"=""
[HKEY_CLASSES_ROOT\sgart-file\shell]
[HKEY_CLASSES_ROOT\sgart-file\shell\open]
[HKEY_CLASSES_ROOT\sgart-file\shell\open\command]
@="C:\\temp\\sgart-protocol\\bin\\Debug\\net5.0\\sgart-protocol.exe \"%1\""
Se non funziona verificare con regedit.exe se la chiave HKEY_CLASSES_ROOT\sgart-file\shell\open\command contiene il comando corretto.
Se sono presenti degli errori nella stringa di comando, questa non viene scritta nel registry.
Il popup di comferma del browser a questo punto è parlante in quanto riporta il nome dell'eseguibile e non la generica scritta PowerShellSe sono presenti degli errori nella stringa di comando, questa non viene scritta nel registry.