MAIN MENU
Blog di Devolutions

Annunci, aggiornamenti e approfondimenti di Devolutions.

Finding secret rdp registry key using ida key devolutions blog

Trovare chiavi di registro RDP segrete con IDA Free

Scopra le chiavi di registro RDP segrete con IDA Free. Segua la nostra guida per migliorare le configurazioni RDP sicure e la sicurezza degli accessi remoti.

IDA è uno strumento di reverse engineering all’avanguardia, comunemente usato nell’industria del software per analizzare binari closed-source. Sebbene alternative gratuite o più economiche come Ghidra stiano guadagnando popolarità, non reggono il confronto con il decompilatore di IDA in termini di precisione e maturità. Per fortuna, IDA Free ora include un decompilatore x64, che rende possibile il reversing senza competenze di linguaggio assembly.

L’obiettivo di questo articolo è mostrare come chiunque possa eseguire semplici attività di reverse engineering utilizzando nient’altro che deduzione logica e gli strumenti giusti. Invece di concentrarsi sul risultato finale, i passaggi includono screenshot dettagliati e commenti per mostrare il processo di pensiero completo.

Prerequisiti

Scarichi e installi IDA Free. Si noti che questa specifica edizione di IDA non è adatta all’uso commerciale, ma poiché questa guida è pensata come introduzione, non dovrebbe essere un problema. Sebbene io abbia accesso a IDA Pro al lavoro, tutti gli screenshot sono stati realizzati con IDA Free per evitare confusione.

Si consiglia una macchina Windows con RDP abilitato per seguire tutti i passaggi, ma è possibile eseguire alcune attività da un’altra piattaforma se necessario. Per questo progetto ho utilizzato una macchina virtuale Windows Server 2019 pulita.

Trovare un obiettivo

Può sembrare ovvio, ma piuttosto che frugare a caso tra i binari, è una buona idea partire con un obiettivo in mente. In questo articolo, il nostro obiettivo sarà identificare le chiavi di registro segrete che influenzano il codificatore video H.264 di RDP.

Come sceglie l’obiettivo non ha importanza, ma io ho scelto questo perché conosco bene H.264 in RDP grazie al mio lavoro nel progetto FreeRDP.

Il server RDP di Microsoft è gestito dal servizio di sistema Remote Desktop Services, chiamato TermService, che utilizza termsrv.dll come punto di ingresso:

!!rdp_system_service.png

Per iniziare

Crei una nuova directory chiamata “Reversing” in “Documenti” e copi “termsrv.dll” da “C:\Windows\System32” al suo interno. Avvii IDA e faccia clic su New nella finestra di dialogo Quick Start:

!!ida_quick_start.png

Vada alla directory “Reversing”, selezioni “termsrv.dll” e poi faccia clic su Open:

!!ida_select_file.png

Nella finestra di dialogo Load a new file, selezioni “Load resources” e poi faccia clic su OK. Questa opzione non è obbligatoria, ma i segmenti di risorse possono talvolta contenere informazioni preziose.

!!ida_load_resources.png

Confermi di voler caricare i simboli di debug corrispondenti facendo clic su Yes quando richiesto:

!!ida_load_symbols.png

Una volta visualizzata l’interfaccia principale di IDA, attenda che la finestra Output in basso indichi “the initial autoanalysis has been finished”. Questo può richiedere alcuni minuti e varia molto a seconda delle dimensioni dei binari.

!!ida_load_complete.png

Ecco fatto! Ora è pronto per iniziare a esaminare il contenuto di “termsrv.dll”. Faccia riferimento a questa procedura per creare progetti IDA per nuovi binari in futuro.

Nessun filo da tirare

Strings è la vista più utile in IDA, ma purtroppo non è presente nella configurazione predefinita. Nel menu View, vada su Open subviews e poi selezioni Strings:

!!ida_strings_window.png

Verrà aggiunta la nuova vista Strings, che mostra le stringhe testuali trovate ovunque all’interno del binario. Faccia clic con il pulsante destro del mouse in un punto qualsiasi della vista per aprire il menu contestuale, quindi selezioni Setup…:

!!ida_strings_setup.png

Selezioni Unicode C-style (16 bits) per abilitare i letterali Unicode UTF-16 frequentemente usati su Windows. La lunghezza minima delle stringhe può essere modificata se lo si desidera (5 è il valore predefinito). Faccia clic su OK per applicare le modifiche:

!!ida_strings_unicode.png

La vista Strings ora mostra molte più stringhe di prima. Mi ci sono voluti anni prima di rendermi conto che IDA non cercava le stringhe UTF-16 per impostazione predefinita, e mi avrebbe fatto risparmiare molto tempo!

!!ida_strings_complete.png

Prema Alt+T, poi digiti “H264” e prema Invio per cercare quella specifica sottostringa in tutte le stringhe di termsrv.dll. La finestra Output in basso dovrebbe indicare “String H264 not found”.

Come ti chiami?

Quindi “H264” come stringa non è presente in termsrv.dll, ma forse può essere trovata nei nomi delle funzioni o nei simboli? Nel menu View, vada su Open subviews e poi selezioni Names:

!!ida_names_window.png

La vista Names funziona allo stesso modo della vista Strings. Prema Alt+T, poi digiti “H264” e prema Invio per cercare la parola chiave in tutti i nomi dei simboli. Purtroppo non abbiamo ancora risultati per “H264”, il che indica che termsrv.dll potrebbe non essere il posto giusto in cui cercare.

È questa la fine del percorso? Assolutamente no! Il reverse engineering è un po’ come la pesca, dove può volerci del tempo per catturare un pesce, ma è emozionante quando finalmente accade. Proviamo un’esca diversa: Process Explorer dalla Sysinternals Suite. Scarichi e avvii lo strumento sul server RDP, quindi cerchi un processo chiamato “svchost.exe” con i sottoprocessi “rdpclip.exe” e “rdpinput.exe”:

!!rdp_procexp_dlls.png

I servizi di sistema Windows vengono tutti eseguiti all’interno di processi “service host” (svchost), il che rende più difficile distinguerli. La colonna Command Line di Process Explorer è piuttosto utile, altrimenti è possibile usare il cmdlet PowerShell Get-CimInstance per trovare l’ID di processo di un determinato servizio:

Get-CimInstance -Class Win32_Service -Filter "Name LIKE 'TermService'"

ProcessId Name        StartMode State   Status ExitCode
--------- ----        --------- -----   ------ --------
1072      TermService Manual    Running OK     0

Ciò che conta è che possiamo vedere un elenco di DLL caricate nel server RDP insieme a termsrv.dll. Espandiamo la nostra area di ricerca includendo alcune DLL che iniziano con “rdp” e copiamole nella nostra directory di progetto “Reversing”:

!!ida_add_more_files.png

Sebbene sia possibile avere più istanze di IDA aperte contemporaneamente, non lo consiglierei, poiché è facile perdersi. Nel menu File, selezioni Close. Nella finestra di dialogo Save database, selezioni Pack database (Store) e poi faccia clic su OK:

!!ida_save_database.png

Ora abbiamo nuovi file da esaminare, che ho deciso di analizzare nel seguente ordine:

  • rdpserverbase.dll
  • rdpbase.dll
  • rdpcorets.dll
  • rdpcore.dll
  • rdpnano.dll

Per ciascuno di questi file, ripeto l’intero processo:

  • Creo un nuovo progetto IDA
  • Cerco la stringa “H264”

La stringa “H264” viene trovata alcune volte in rdpserverbase.dll e rdpbase.dll, ma non è nulla di significativo. Finalmente facciamo centro cercando “H264” in rdpcorets.dll:

!!ida_strings_jackpot.png

Non solo vediamo molti riferimenti a “H264”, ma alcune stringhe suggeriscono chiaramente chiavi di registro. Decidiamo quindi di concentrarci su rdpcorets.dll e chiudiamo tutti gli altri progetti IDA.

Alla ricerca di funzioni

Ora che abbiamo trovato le stringhe, possiamo iniziare a cercare le funzioni che le utilizzano. Faccia doppio clic sulla stringa che sembra essere un percorso di chiave di registro chiamato “H264Encoding”:

Software\Policies\Microsoft\Windows NT\Terminal Services\H264Encoding

Il simbolo corrispondente viene automaticamente selezionato e mostrato nella scheda IDA View-A. Molte volte, le stringhe non hanno un nome appropriato nel binario, quindi IDA genera un nome per loro. In questo caso, la nostra stringa si chiama “aSoftwarePolici_0”. Faccia clic con il pulsante destro del mouse sul nome del simbolo, quindi selezioni Jump to xref to operand…:

!!ida_xref_to_operand.png

Appare un elenco di funzioni che utilizzano questo specifico simbolo stringa. “SetH264EncodingParametersFromRegistry” sembra una buona scelta, quindi vi faccia doppio clic sopra:

!!ida_xref_operand_list.png

La vista IDA mostra ora la funzione disassemblata “SetH264EncodingParametersFromRegistry”, con istruzioni assembly commentate:

!!ida_function_disassembled.png

Sebbene alcuni esperti di reverse engineering avanzato apprezzino questo tipo di vista, è piuttosto difficile da leggere, specialmente senza conoscenze di linguaggio assembly. Prema F5 per decompilare la funzione in pseudocodice leggibile. Quando IDA chiede conferma, faccia clic su Yes per procedere:

!!ida_decompiler_confirmation.png

La funzione decompilata viene ora mostrata in tutto il suo splendore. Tenga presente che, poiché molte informazioni vengono perse al momento della compilazione, IDA può ricostruire automaticamente solo alcune cose e fare una supposizione ragionata per il resto. Questo esempio in particolare è stato decompilato sorprendentemente bene, ma la maggior parte delle funzioni presenterà molte imprecisioni.

!!ida_decompiled_function.png

Decompilare una funzione è emozionante, ma abbiamo trovato quella giusta? “EnableQPSingleStep” e “VideoDetectorRectDisplayMode” sono chiaramente chiavi di registro, ma hanno nomi che non significano molto se non per chi conosce bene gli aspetti interni del codec H.264. Può fare clic con il pulsante destro del mouse su un nome di funzione o una costante stringa nello pseudocodice per trovare altri riferimenti incrociati a essi. Proviamo con la funzione “RegOpenKeyExW” e vediamo dove ci porta:

!!ida_function_jump_to_xref.png

Come previsto, “RegOpenKeyExW” viene utilizzata in molti altri punti che trattano chiavi di registro, la maggior parte dei quali non ha nulla a che fare con H.264. Tuttavia, possiamo individuare alcune delle funzioni del precedente elenco di riferimenti incrociati sulla stringa “H264Encoding”, quindi passiamo alla funzione “CreateOutputAvc”:

!!ida_function_xref_list.png

Ecco di cosa stavo parlando! Possiamo vedere i seguenti nomi di chiavi di registro che suggeriscono capacità di registrazione H.264 nel server RDP:

  • RecordPath
  • EnableRecord264
  • EnableRecordYUV

!!rdp_registry_keys_h264_yuv.png

Proviamo la funzione “CreateCompressorOutputAvc” per vedere se riusciamo a trovarne altre. Sembra simile alla funzione precedente, ma con alcune chiavi di registro diverse:

  • RecordPath
  • EnableRecordRGB
  • EnableRecordRdp264

!!rdp_registry_keys_h264_rgb.png

Siamo sicuramente sulla strada giusta, ma non abbiamo ancora visto una funzione che utilizzi i valori delle chiavi di registro. Le costruzioni di classe o le funzioni di inizializzazione sono di solito ottimi punti da esaminare, quindi proviamo con “OutputAvc::OutputAvc”:

!!rdp_registry_keys_h264_usage.png

L’output decompilato di questo costruttore OutputAvc è più complesso e contiene più imprecisioni, ma possiamo comunque vedere che crea file con una formattazione dei nomi specifica. Potremmo continuare per ore, quindi fermiamoci e vediamo se possiamo agire sulle informazioni che già abbiamo.

Raccogliere informazioni

Una volta iniziato a usare IDA, uno dei problemi che la maggior parte delle persone deve affrontare è trovare molte più informazioni di quante ne possano elaborare. Dovrebbe considerare il suo obiettivo principale come la “missione principale” del gioco, e tutto il resto come “missioni secondarie”. Se inizia a prendere troppe tangenti, perderà di vista l’obiettivo iniziale.

Il modo migliore per raccogliere informazioni è usare il proprio editor di testo preferito per incollare ogni tipo di indizio man mano che li trova. Non cerchi di organizzarli troppo, non ne vale la pena. Spesso si scopre il vero valore di singole informazioni solo dopo averle collegate a qualcos’altro.

Torniamo alle nostre funzioni di interesse per le chiavi di registro RDP H.264, e facciamo un elenco appropriato. Abbiamo i nomi, ma non i tipi, quindi consultiamo la documentazione API per RegQueryValueExW.

Il parametro di output lpType contiene il tipo come definito in Registry Value Types, ma purtroppo non abbiamo i valori numerici per ciascuno. Questo è un problema frequente che può essere risolto usando una copia degli header del Windows SDK. In questo caso, vengono utilizzati solo due tipi: REG_SZ (1) e REG_DWORD (4).

L’unico tipo stringa (REG_SZ) è “RecordPath”; tutte le altre chiavi di registro sono numeri (REG_DWORD) con un valore di 1 o 0. Si noti che, poiché “RecordPath” è di tipo “REG_SZ” e non “REG_EXPAND_SZ”, non può contenere variabili d’ambiente come “%SystemRoot%”. Otteniamo quindi il seguente elenco di chiavi di registro con commenti:

HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows NT\Terminal Services\H264Encoding

  • RecordPath: percorso completo di una directory di output per la registrazione
  • Enable264Log: abilita il logging H.264, deve essere impostato su 1
  • EnableRecordYUV: abilita il dump raw della cattura YUV (molto grande!)
  • EnableRecordRGB: abilita il dump raw della cattura RGB (molto grande!)
  • EnableRecord264: abilita il dump raw del bitstream H.264
  • EnableRecordRdp264: abilita il dump raw dello stream H.264 RDP

Metterlo alla prova

Ora che abbiamo raccolto informazioni preziose, proviamo a usare le chiavi di registro per confermare che funzionino davvero. Apra l’editor del registro di sistema (regedit.exe), quindi crei la chiave di registro “H264Encoding”. Crei la directory “C:\Windows\Temp\RdpRecording”, quindi imposti di conseguenza il valore della chiave “RecordPath”. Crei e imposti su 1 tutti gli altri valori delle chiavi di registro per abilitare tutti i tipi di registrazione.

!!rdp_registry_keys_h264_new.png

Le chiavi di registro RDP H.264 verranno utilizzate solo se H.264 viene usato per la connessione RDP, quindi modifichiamo la configurazione del server RDP. Apra l’editor dei criteri di gruppo (gpedit.msc), quindi vada alla seguente sezione sotto Computer Configuration:

Computer Configuration > Administrative Templates > Windows Components > Remote Desktop Services > Remote Desktop Session Host > Remote Session Environment

Abiliti i seguenti criteri:

  • Prioritize H.264/AVC 444 graphics mode for remote desktop connections
  • Configure H.264/AVC hardware encoding for remote desktop connections

Abiliti e imposti il criterio Limit maximum color depth su 32 bit, poiché può influenzare anche la negoziazione del codec.

!!rdp_enable_h264_gpedit.png

Riavvii il server RDP per applicare le modifiche, quindi si connetta con RDP, esegua alcune azioni per creare aggiornamenti dell’immagine, poi si disconnetta. Si riconnetta con RDP e apra la directory “C:\Windows\Temp\RdpRecording” per verificare se ha funzionato:

!!rdp_recording_files.png

I file vuoti sono solitamente quelli attualmente utilizzati dal server RDP; vengono scritti su disco solo quando la sessione viene terminata, motivo per cui è necessaria una disconnessione completa. Poiché si tratta di dump di dati grezzi usati per il debug interno, richiedono una piccola trasformazione.

I pixel YUV non compressi possono essere riprodotti direttamente usando VLC e le opzioni della riga di comando appropriate:

choco install vlc
cd "C:\Windows\Temp\RdpRecording"
$Env:Path += ";$Env:ProgramFiles\VideoLAN\VLC"
vlc --rawvid-fps 24 --rawvid-width 1920 --rawvid-height 1088 --rawvid-chroma I420 rdp_record_0_1920x1088_24p.yuv

In alternativa, il bitstream H.264 grezzo può essere incorporato in un file video .mp4 usando ffmpeg:

choco install ffmpeg
cd "C:\Windows\Temp\RdpRecording"
ffmpeg -i rdp_record_0_1920x1088_24p.264 -codec copy rdp_record_0_1920x1088_24p.mp4

I nomi dei file e i parametri effettivi variano, quindi li adatti di conseguenza. Ecco come dovrebbe apparire quando funziona:

!!rdp_recording_sample.gif

Proprio come la maggior parte delle chiavi di registro “segrete”, non erano nascoste, ma non erano destinate a essere usate o su cui fare affidamento. Non c’è inoltre alcuna garanzia che continueranno a essere supportate in futuro.

Considerazioni finali

Anche senza accesso al codice sorgente, è comunque possibile ottenere informazioni su binari closed-source utilizzati su milioni di dispositivi. C’è una certa scarica di adrenalina associata alla scoperta di modi per ottenere risultati utili che normalmente non sono supportati. Sebbene il reverse engineering avanzato richieda molto più lavoro, bisogna pur iniziare da qualche parte. Se è alle prime armi con il reverse engineering, ha trovato utile questo articolo? Se sì, cosa le piacerebbe imparare in seguito?