Penetration Test di Thick Client Parte 3 - Decompiler

Tempo di lettura: 7 minuti
Data pubblicazione: February 7, 2022

Introduzione

I Thick Clients sono software che forniscono funzionalità sia locali sia remote, in quanto vengono installati localmente ma effettuano anche richieste di rete. Essi possono essere per esempio client di messaggistica, client di posta elettronica, software di antivirus, e via discorrendo.

Il Penetration Test di un Thick Client è particolarmente interessante dal punto di vista di un attaccante, in quanto essi hanno una superficie di attacco notevolmente maggiore rispetto alle classiche applicazioni web o mobile.

In questa serie di articoli andremo ad approfondire la maggior parte dei test di sicurezza da effettuare e utilizzeremo come esempio l’applicativo DVTA. Per le istruzioni di installazione consiglio di seguire questo e quest’altro link.

Decompiler

Per comprendere un software installato sul proprio computer la cosa migliore è leggere e capire il codice sorgente, in modo da averne una visione completa, trovare eventuali credenziali hardcodate o altre informazioni che potrebbero servire per successivi attacchi. Per fare ciò ci vengono in aiuto i decompiler, che convertono il codice del programma eseguibile nel codice (quasi) originale. La decompilazione è un tipo di reverse-engineering che esegue le operazioni opposte di un compilatore. Un esempio di linguaggio di programmazione che solitamente può essere decompilato partendo da un eseguibile è il .NET (ma anche Java, python, etc.).

Questo perchè il .NET è codice managed. Quando un’applicazione .NET viene compilata, viene compilata in codice di linguaggio intermedio. Solo in fase di esecuzione il codice in linguaggio intermedio viene finalmente compilato in codice macchina da un ambiente runtime. Gli assembly .NET sono così facili da “invertire” nel codice sorgente perché il linguaggio intermedio contiene tante informazioni come tipi e nomi.

.NET

Uno dei programmi migliori per decompilare un eseguibile .NET (.exe o .dll) scritto in C# è dotPeek. Questo ci permette di decompilare un .exe o una .dll ed ottenere il codice sorgente C#.

Una funzione che trovo molto utile nel caso il codice sia obfuscato è Go to Declaration, la quale permette di trovare la dichiarazione di una funzione e con Find Usage è possibile trovarne l’utilizzo in varie parti del codice. Altrimenti è disponibile de4dot che potrebbe aiutare nel deobfuscare.

Un’altro software simile è dnSpy. Una delle funzioni più utili è quella, in qualche caso, di poter decompilare e ricompilare un eseguibile, in modo da modificarlo e avere accesso magari a funzioni nascoste.

Per esempio, DVTA quando viene eseguita per la prima volta ha la funzione Configure Server disattivata

Se lo apriamo con dnSpy e cerchiamo la funzione, possiamo vederla e modificarla in modo da renderlo visibile e poter configurare il Server direttamente dalla GUI

Clicco poi su File -> Save Module e salvo il nuovo eseguibile

Ed ecco che abbiamo il nuovo eseguibile con la funzione aggiornata.

Java

Sebbene sia conosciuto principalmente per il reversing di .apk, ossia le applicazioni per Android, Jadx è molto utile anche nel caso in cui il Thick Client sia scritto in Java.

Questo solitamente lo si può vedere o perchè all’interno della cartella di installazione ci sono file .jar oppure perchè durante le prime richieste di rete che effettua scarica n file jar, usati per le librerie esterne.

Disassembler

Nel caso in cui non sia possibile decompilare l’applicativo, ciò che rimane per analizzare il binario è passare a un disassembler o un debugger. Alcuni tra i più conosciuti:

Conclusioni

Credo che leggere e capire il codice sorgente (se possibile ovviamente) sia una fase fondamentale durante un test su un Thick Client. Per esempio mi è capitato di ricreare funzioni in C# per decifrare il traffico di un Thick Client e se non avessi avuto il codice dell’applicazione sottomano (anche se obfuscato) probabilmente non sarei riuscito. Alcune risorse utili che ho utilizzato per questa serie di articoli sono: