MAIN MENU
Blog di Devolutions

Annunci, aggiornamenti e approfondimenti di Devolutions.

Using RDP without leaving traces rdm remote desktop manager adventures cto

Utilizzare RDP senza lasciare traccia: la modalità pubblica di MSTSC

L'opzione da riga di comando `/public` in MSTSC attiva la "modalità pubblica", impedendo a RDP di memorizzare credenziali, dettagli di sessione e immagini nella cache. Questo articolo esplora il suo impatto sulla sicurezza e sull'analisi forense.

Si è mai chiesto cosa faccia realmente l’opzione da riga di comando “/public” in MSTSC? Attiva la “modalità pubblica” nel client RDP, una funzionalità per certi versi simile alla “modalità in incognito” dei browser web. È pensata per essere utilizzata su un computer “pubblico” o “condiviso”, dove gli utenti potrebbero voler evitare che credenziali, dettagli di sessione e immagini nella cache vengano memorizzati localmente.

Per gli analisti forensi, le tracce lasciate da un aggressore malintenzionato che utilizza MSTSC su un sistema compromesso possono essere una miniera d’oro di informazioni. Ecco un elenco di tutte le funzionalità interessate dalla modalità pubblica di RDP.

Impostazioni di connessione

Sapeva che mstsc salva le impostazioni di connessione nel file nascosto Default.rdp? Con la modalità pubblica attivata, mstsc non consentirà di salvare le modifiche alle impostazioni di connessione in quel file:

!!Mstsc public mode rdm devolutions blog remote desktop manager

Il modo più semplice per modificarlo manualmente è avviare Notepad dalla riga di comando: notepad "~\Documents\Default.rdp".

Memorizzazione nella cache delle credenziali

Il gestore delle credenziali di Windows viene utilizzato da mstsc per salvare le credenziali localmente e riutilizzarle per le nuove connessioni allo stesso server. La modalità pubblica disabilita l’uso delle credenziali memorizzate nella cache, in modo che le credenziali vengano richieste anche se disponibili localmente:

!!Mstsc public mode rdm devolutions blog remote desktop manager

Le credenziali salvate utilizzano il prefisso “TERMSRV/” e possono essere elencate con questo comando:

cmdkey /list | ? { $_ -Match "TERMSRV/" } | % { $_ -Replace ".*: " }

La modalità pubblica impedisce inoltre all’utente di salvare le credenziali nella finestra di accesso:

!!Mstsc public mode rdm devolutions blog remote desktop manager enter credentials

Memorizzazione nella cache bitmap persistente

L’artefatto più significativo lasciato da mstsc è la cache bitmap persistente. In RDP, il server suddivide l’immagine del desktop in frammenti bitmap, memorizzandoli nella cache sul client. Quando un frammento si ripete, il server indica al client di riutilizzare la versione memorizzata nella cache invece di rinviarla. Tuttavia, la memorizzazione nella cache migliora le prestazioni solo dopo che il client ha memorizzato un numero sufficiente di frammenti. Per accelerare le nuove connessioni, la cache bitmap persistente consente di conservare le bitmap tra una sessione e l’altra.

Sebbene la modalità pubblica disabiliti questa funzionalità, è anche possibile disabilitarla separatamente utilizzando BitmapCachePersistEnable:i:0 nel file .RDP. La cache bitmap persistente memorizza i file (bcache24.bmc, Cache0000.bin, Cache0001.bin, ecc.) in %LOCALAPPDATA%\Microsoft\Terminal Server Client\Cache. Sebbene il formato della cache non sia documentato, è possibile utilizzare BMC-Tools per estrarre i contenuti bitmap:

git clone <https://github.com/ANSSI-FR/bmc-tools> && cd bmc-tools
python .\bmc-tools.py -s "$Env:LocalAppData\Microsoft\Terminal Server Client\Cache" -d .

È quindi possibile esplorare migliaia di frammenti bitmap provenienti da sessioni desktop remoto precedenti:

!!Mstsc public mode rdm devolutions blog remote desktop manager

Va tenuto presente che la cache bitmap non è un metodo di registrazione attendibile: è come cercare di ricostruire documenti distrutti scavando nel cestino della carta riciclata. Detto ciò, può comunque rappresentare una miniera di informazioni.

Server utilizzati più di recente

Il client RDP di Microsoft memorizza fino a 10 server utilizzati più di recente (MRU), facilitando la selezione di un server dal menu a discesa senza doverlo digitare nuovamente:

!!Mstsc public mode rdm devolutions blog remote desktop manager

La modalità pubblica disabilita l’aggiornamento di questo elenco di server, memorizzato nel registro:

[HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default]
"MRU0"="10.10.0.25"
"MRU1"="IT-HELP-TEST.ad.it-help.ninja"
"MRU2"="IT-HELP-DVLS.ad.it-help.ninja"
"MRU3"="IT-HELP-WAC.ad.it-help.ninja"
"MRU4"="IT-HELP-GW.ad.it-help.ninja"

In altre parole, l’elenco a discesa continuerà a essere visibile con la modalità pubblica attiva, ma mstsc non lo aggiornerà con i nuovi server ai quali ci si connette.

Suggerimenti sul nome utente del server

Per velocizzare la procedura nella finestra di accesso, mstsc ricorda l’ultimo nome utente utilizzato per connettersi a un determinato server e lo preseleziona automaticamente:

!!Mstsc public mode rdm devolutions blog remote desktop manager

Questa informazione viene memorizzata nel registro in HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers\Server\UsernameHint, come segue:

[HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers\10.10.0.25]
"UsernameHint"="Administrator@ad.it-help.ninja"

Oltre a rivelare il nome utente, questa chiave di registro rivela anche i server ai quali ci si è connessi. Anche in questo caso, la modalità pubblica impedisce che queste informazioni vengano utilizzate e memorizzate.

Eccezioni per i certificati del server

Non esiste un amministratore IT al mondo che non conosca la finestra di avviso gialla relativa ai certificati mostrata da MSTSC. Sì, è possibile distribuire certificati adeguati per RDP, ma siamo onesti: tutti abbiamo utilizzato almeno una volta la casella di controllo “Non chiedermelo più per le connessioni a questo computer”:

!!Mstsc public mode rdm devolutions blog remote desktop manager

Come si può intuire, la modalità pubblica di RDP disabilita le eccezioni per i certificati del server, poiché queste vengono salvate nel registro in HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers\Server\CertHash, come segue:

[HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers\10.10.0.25]
"CertHash"=hex:13,fe,21,42,92,fc,6a,9d,ac,ea,a0,3d,b5,9b,59,c8,90,6f,37,b9,cc,\
  31,08,9d,63,f7,4b,e7,c4,3b,77,f2

L’hash del certificato in sé non è molto utile, ma poiché viene memorizzato per nome del server, lascia una traccia dei server ai quali ci si è connessi.

Eccezioni per l’autenticazione del server

Il livello di autenticazione del server in RDP è un po’ più difficile da comprendere: il server può essere autenticato tramite il proprio certificato, Kerberos, o entrambi. Per vedere come la modalità pubblica influisce sull’autenticazione del server, assicurarsi che l’autenticazione del server sia impostata per avvisare in caso di esito negativo dell’autenticazione stessa. In alternativa, modificare il file .RDP con authentication level:i:2:

!!Mstsc public mode rdm devolutions blog remote desktop manager

Quando ci si connette a un server non attendibile (quando né la validazione del certificato né quella Kerberos possono essere utilizzate per autenticare il server), dovrebbe apparire questa finestra di avviso di sicurezza:

!!Mstsc public mode rdm devolutions blog remote desktop manager

Si noti come la modalità pubblica disabiliti la casella di controllo “Non chiedermelo più per le connessioni a questo computer”, ma disabiliti anche l’utilizzo delle credenziali salvate. Se si aggiunge un’eccezione di sicurezza per un server, questa verrà memorizzata in HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\LocalDevices, come segue:

[HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\LocalDevices]
"10.10.0.25"=dword:0000004d

Il nome del server di destinazione viene memorizzato, quindi, anche in questo caso, può essere utilizzato per individuare i server ai quali ci si è connessi. Per quanto riguarda il valore DWORD associato, esso varia in base alle risorse o ai dispositivi locali autorizzati per la connessione (unità, appunti, stampante, ecc.).

Pulizia

La modalità pubblica di RDP è ottima, ma cosa fare se non è stata utilizzata in precedenza e si desidera ripristinare mstsc a uno stato pulito? Ecco un frammento di codice PowerShell per eliminare tutti gli artefatti locali lasciati (credenziali salvate, cache bitmap persistente e chiavi di registro):

cmdkey /list | ? { $_ -Match "TERMSRV/" } | % { $_ -Replace ".*: " } | % { cmdkey /delete:$_ }
Remove-Item -Path "$Env:LocalAppData\Microsoft\Terminal Server Client\Cache" -Recurse -ErrorAction SilentlyContinue
Remove-Item -Path "$Env:LocalAppData\Microsoft\Terminal Server Client\Cache" -Recurse -ErrorAction SilentlyContinue
Remove-Item -Path "HKCU:\Software\Microsoft\Terminal Server Client\Default" -Force -ErrorAction SilentlyContinue
Remove-Item -Path "HKCU:\Software\Microsoft\Terminal Server Client\Servers" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item -Path "HKCU:\Software\Microsoft\Terminal Server Client\LocalDevices" -Recurse -Force -ErrorAction SilentlyContinue

Utilizzare la modalità pubblica di RDP può essere utile per risolvere problemi anomali, spesso causati da credenziali salvate residue e suggerimenti sul nome utente. Sebbene raro, un cache bitmap persistente danneggiato può causare anomalie visive in RDP. Consiglio di provare la modalità pubblica quando non si ha idea di quale possa essere il problema, ma potrebbe essere collegato a una delle funzionalità elencate sopra.