Penetration Test di Thick Client Parte 5 - Hooking con Frida

Tempo di lettura: 7 minuti
Data pubblicazione: March 21, 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.

Frida

Frida è un tool che permette di fare hooking e instrumentation su qualsiasi funzione utilizzata da un programma. Sebbene sia conosciuto principalmente nel mondo mobile, è possibile utilizzarlo anche su Windows e sfruttarlo per analizzare il comportamento di una determinata funzione senza dover fare Reverse Engineering a basso livello. Essenzialmente, ci permette di “agganciarci” ad un processo in esecuzione e poi interagire con quel processo tramite JavaScript.

Notepad

Come primo esempio, proviamo ad intercettare tutto ciò che viene scritto su Notepad tramite l’hooking dell’API Windows WriteFile. Per prima cosa salviamo lo script write-file.js con al suo interno l’API da intercettare (WriteFile) e gli argomenti da stampare

var writeFile = Module.getExportByName(null, "WriteFile");

Interceptor.attach(writeFile, {
    onEnter: function(args)
    {
        console.log("Buffer dump:\n" + hexdump(args[1]));
        console.log("\nBuffer via Cstring:\n" + Memory.readCString(args[1]));
    }
});

Successivamente, lo salviamo ed eseguiamo il seguente comando

frida C:\Windows\System32\notepad.exe -l write-file.js

Dopo aver fatto %resume (per continuare l’esecuzione dell’applicazione), scriviamo e salviamo il file. Una volta salvato, si potrà vedere l’output di Frida in azione

Un altro comando molto simile è frida-trace. Invece che scrivere manualmente il JavaScript, basterà digitare il comando

frida-trace -i "WriteFile" -p 14324

dove:

  • -i è l’API che vogliamo intercettare
  • -p è il PID del processo

e Frida andrà ad intercettare quell’API.

Come si può vedere, Frida ha creato automaticamente dei file contenenti il codice JS atto ad intercettare quella specifica API. La comodità sta nel fatto che se volessimo aggiungere dettagli, come lo stampare anche gli argomenti passati alla funzione, basterà aggiungere il codice e automaticamente verrà aggiornato durante l’esecuzione del processo

Modifica del valore di ritorno delle funzioni

Potrebbe anche succedere che l’applicazione in esame abbia dei controlli e non permetta di essere eseguita (per esempio) contemporaneamente ad un debugger. Prendiamo come esempio una delle sfide della certificazione eCre, che controlla se c’è un debugger e nel caso positivo non si avvia. Provo quindi ad avviare OllyDBG e poi l’eseguibile

La prima cosa da fare è vedere se l’API IsDebuggerPresent viene chiamata

frida-trace -i IsDebuggerPresent -f re6.exe

Modifichiamo lo script creato da Frida per vedere il valore di ritorno dell’API (dopo aver studiato come funziona dalla documentazione)

Però ci accorgiamo che ritorna 0 (quindi false), di conseguenza non è l’API che fa chiudere l’applicativo.

Proseguiamo l’analisi con le funzioni più comuni di Anti-Debugging, come CheckRemoteDebuggerPresent, Process32NextW e FindWindowA (altre si possono trovare qui e qui).

Finalmente, ecco che la funzione FindWindowA attira l’attenzione.

Ciò significa che l’eseguibile controlla quali finestre sono attive e nel caso incontri ollydbg da errore e si chiude. Per bypassarla basterà fare un hooking sul valore di ritorno. In questo caso basterà sovrascriverlo con 0, in modo che sembri che la funzione sia andata in errore bypassando il controllo.

var FindWindowA = Module.findExportByName(null, "FindWindowA");

Interceptor.attach(FindWindowA, {
        onEnter: function (args) {
            console.log("FindWindowA() get called ...");
            console.log(Memory.readCString(args[0]));
            
        },
        onLeave: function (retval) {
            console.log("	Il retval prima valeva: " + retval)
            retval.replace(0);
            console.log("	Il retval ora vale: " + retval)
        },
});

Conclusioni

Frida è un ottimo strumento che ci può supportare durante l’analisi di un Thick Client, specialmente durante operazioni di cifratura o scrittura di file che non riusciamo a identificare con i classici tool. Nel caso lo si volesso utilizzare tramite GUI è disponibile Fermion.

Alcune risorse utili che ho utilizzato per questa serie di articoli sono: