Visualizzazione post con etichetta VBS. Mostra tutti i post
Visualizzazione post con etichetta VBS. Mostra tutti i post

lunedì 3 novembre 2014

VBS: Recuperare il product key di Windows tramite VBS


Esistono diversi tool di terze parti che permettono il recupero del product key del sistema operativo e di altre applicazioni, tra questi segnalo l'ottimo ProduKey della NirSoft (www.nirsoft.net) scaricabile gratuitamente ed eseguibile senza alcuna installazione.
In questo articolo verrà mostrato come recuperare il product key di Windows tramite uno script VBS.
Il Product Key di Windows è una sequenza di 25 caratteri (lettere e numeri) divisi in 5 gruppi da 5 caratteri ognuno. I caratteri utilizzati all'interno di un product key sono BCDFGHJKMPQRTVWXY2346789 mentre non vengono utilizzati i caratteri AEILNOSUZ015. Il product key è memorizzato all'interno del registro di sistema e codificato in un valore DWORD all'interno della chiave HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DigitalProductId.
Nella decodifica del valore DWORD DigitalProductId bisogna fare attenzione alla versione di Windows infatti, a partire da Windows 8, il metodo di codifica del product key è cambiato.

Lo script che ho creato visualizza le informazioni relative al nome del prodotto, il Product ID e il Product Key permettendo, inoltre, di salvare le informazioni trovate all'interno di un file di testo (.txt).
Di seguito il sorgente dello script VBS


Option Explicit 

Dim strComputer, objWMIService, objItem, Caption, colItems
Dim ProductName,ProductID,ProductKey,ProductInfo, Version, Win8Version, WinOlderVersion
Win8Version = "6.2 6.3"
WinOlderVersion ="6.1 6.0 5.2 5.1 5.0"

'Di seguito i valori della stringa CurrentVersion presente all'interno della chiave HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion che indica la versione di Windows
'Windows 8.1                 6.3
'Windows Server 2012 R2      6.3
'Windows 8                   6.2
'Windows Server 2012         6.2
'Windows 7                   6.1
'Windows Server 2008 R2      6.1
'Windows Server 2008         6.0
'Windows Vista               6.0
'Windows Server 2003 R2      5.2
'Windows Server 2003         5.2
'Windows XP 64-Bit Edition   5.2
'Windows XP                  5.1
'Windows 2000                5.0
'Crea oggetto wscript.shell
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem",,48)
' in Caption memorizzo la Versione di Windows
For Each objItem in colItems
    Caption = objItem.Caption  
Next
 Dim objshell,path,DigitalID, Result 
 Set objshell = CreateObject("WScript.Shell")
 'Recupero le informazioni dalle chiavi di registro"
 DigitalID = objshell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DigitalProductId")
 ProductName = "Product Name: " & objshell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName")
 ProductID = "Product ID: " & objshell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductID")
 Version= objshell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentVersion")
 
 If InStr(Win8Version,Version) Then
  'Windows 8 o Windows 8.1
  ProductKey = "Product Key: " & GetKeyWindows8(DigitalID) 
 Else
  If InStr(WinOlderVersion,Version) Then
     ' Windows 7 o antecedente
  ProductKey = "Product Key: " & GetKeyWindows7(DigitalID) 
  Else
     msgBox "Versione di Windows non supportata." & vblf &"Il presente Script è stato testato per versioni di Windows comprese tra Windows 2000 e Windows 8.1" , vbOKOnly+vbCritical, "Versione Windows non supportata"
  ProductKey ="Product Key: Non Rilevato"
     End If   
  
 End If
 
 ProductInfo = ProductName  & vbNewLine & ProductID  & vbNewLine & ProductKey
 'Mostra i dati e chiedi se si intende salvare in un file
 If vbYes = MsgBox(ProductInfo  & vblf & vblf & "Vuoi salvare le informazioni in un file?", vbYesNo + vbQuestion, "Windows Product Key") then
    Save ProductInfo
 End If


'Convert i valori binari della chiave "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DigitalProductId" in caratteri per Windows 8
Function GetKeyWindows8(Key)
    Const KeyOffset = 52
    Dim isWin8, Maps, i, j, Current, KeyOutput, Last, keypart1, insert
    'Check if OS is Windows 8
    isWin8 = (Key(66) \ 6) And 1
    Key(66) = (Key(66) And &HF7) Or ((isWin8 And 2) * 4)
    i = 24
    Maps = "BCDFGHJKMPQRTVWXY2346789"
    Do
        Current= 0
        j = 14
        Do
           Current = Current* 256
           Current = Key(j + KeyOffset) + Current
           Key(j + KeyOffset) = (Current \ 24)
           Current=Current Mod 24
            j = j -1
        Loop While j >= 0
        i = i -1
        KeyOutput = Mid(Maps,Current+ 1, 1) & KeyOutput
        Last = Current
    Loop While i >= 0 
    keypart1 = Mid(KeyOutput, 2, Last)
    insert = "N"
    KeyOutput = Replace(KeyOutput, keypart1, keypart1 & insert, 2, 1, 0)
    If Last = 0 Then KeyOutput = insert & KeyOutput
    GetKeyWindows8 = Mid(KeyOutput, 1, 5) & "-" & Mid(KeyOutput, 6, 5) & "-" & Mid(KeyOutput, 11, 5) & "-" & Mid(KeyOutput, 16, 5) & "-" & Mid(KeyOutput, 21, 5)
 
End Function
'Converte i valori binari della chiave "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DigitalProductId" in caratteri per Windows 7
Function GetKeyWindows7(ProductID)
    Const KeyOffset = 52
 Dim i, Cur, x, Maps
    i = 0
    Maps = "BCDFGHJKMPQRTVWXY2346789"
    Do
        Cur = 0
        x = 14
  i=i+1
        Do
            Cur = Cur * 256
            Cur = ProductID(x + KeyOffset) + Cur
            ProductID(x + KeyOffset) = (Cur \ 24) And 255
            Cur = Cur Mod 24
            x = x -1
        Loop While x >= 0
  if (i Mod 6) = 0 Then
   ProductKey = "-" & ProductKey
   i = i + 1
  End If  
  ProductKey = Mid(Maps, Cur + 1, 1) & ProductKey   
    Loop While i < 29
    GetKeyWindows7 = ProductKey
End Function

'Salva i dati in un file
Function Save(Data)
    Dim fso, fName, txt,objshell,UserName
    Set objshell = CreateObject("wscript.shell")
    'Crea un file di testo con nome WindowsKeyInfo.txt, nello stesso percorso del vbs, contenente le informazioni
    fName = "WindowsKeyInfo.txt"
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set txt = fso.CreateTextFile(fName)
    txt.Writeline Data
    txt.Close
End Function

Per chi volesse scaricare il file VBS può utilizzare il link di seguito
DOWNLOAD

sabato 4 ottobre 2014

VBS: Sintesi vocale con SAPI.SpVoice

Se vogliamo far parlare il nostro PC tramite Visual Basic Script (VBS) e utilizzando la sintesi vocale inclusa in Windows possiamo utilizzare il seguente codice:


StrText=("Please allow me to introduce myself") 
StrText2=("I'm a man, of wealth, and taste") 
set ObjVoice = CreateObject("SAPI.SpVoice") 
ObjVoice.Volume = 100
ObjVoice.Speak StrText 
ObjVoice.Speak StrText2 

Lo script utilizza il metodo SAPI.SpVoice per la sintesi vocale delle stringhe di testo passate. Di seguito è possibile scaricare il file VBS:
DOWNLOAD


Sintesi Vocale
FIG 1 - Sintesi Vocale
Di default la voce della sintesi vocale fornita in Windows è in inglese ma è possibile scaricare, anche gratuitamente, diverse voci e lingue. Lo script utilizza la voce selezionata all'interno del Sistema Operativo.

martedì 9 settembre 2014

BPMTK: Basic Process Manipulation Tool Kit


BPMTK è un utility open source creata da Didier Stevens (http://blog.didierstevens.com/) e appositamente pensata per la manipolazione dei processi in esecuzione in ambiente Windows.

BPMTK rappresenta un valido sostituto di gpdisable ormai non più supportato e , anzi, ne migliora diverse caratteristiche. L’utility permette di effettuare il dump della memoria, ricerche e sostituzioni all’interno della memoria utilizzata dai processi, DLL injection e molto altro.
A partire da Windows Vista, Microsoft ha cercato di rimediare e proteggere i suoi sistemi operativi da questo tipo di vulnerabilità introducendo il concetto di processo protetto: un tipo di processo che viene eseguito in uno spazio di memoria protetto dagli altri processi. Un processo protetto per essere considerato tale deve essere firmato da Microsoft.

Di seguito mostrerò alcuni esempi su come bypassare diverse protezioni utilizzando BPMTK.

Bypassare le Software Restriction Policies

Le Group Policy (in italiano conosciute come Criteri di Gruppo) vengono utilizzare per la configurazione e la gestione di un sistema Microsoft e in particolare vengono utilizzate in Active Directory. Le Group Policy permettono la configurazione di ogni aspetto del funzionamento delle workstation collegate alla rete aziendale, ad es. possiamo impedire all’utente di effettuare alcune operazioni o utilizzare alcuni programmi. 

Le Software Restriction Policies (SRP) sono una funzionalità delle Group Policy (GPO) che permettono all’amministratore di imporre restrizioni sul software che l’utente può eseguire. Le GPO vengono applicate attraverso le funzioni contenute in advapi32.dll. Diversi programmi, tra cui explorer.exe, richiamano tale DLL. Quando un utente tenta di eseguire un programma, explorer.exe, tramite le funzioni messe a disposizione da advapi32.dll, verifica se è autorizzato dalle GPO. Un ruolo importante in questa verifica è svolto dalla chiave TransparentEnabled. La presenza di tale chiave indica che le SRP sono attive e vanno verificate.  Un’utenza limitata non ha i permessi per andare a modificare le SRP pertanto sembrerebbe che il sistema non possa essere bypassato ma c’è un particolare. L’utente può modificare il codice contenuto all’interno del processi su cui ha i permessi come ad es.  explorer.exe. Cosa possiamo fare affinchè explorer.exe non vada ad interrogare la chiave TransparentEnabled? Dobbiamo fare in modo che la chiave TransparentEnabled non venga trovata dalle funzioni di advapi32.dll e quindi facendo credere al sistema di verifica che non è impostata alcuna SRP.

A questo punto interviene la nostra utility:
  • Scarichiamo l’utility da http://www.didierstevens.com/files/software/bpmtk_V0_1_6_0.zip
  • Scompattiamo il file in una cartella
  • Creiamo un file di testo e nominiamolo bypass-SRP.txt
  • All’interno del file copiamo il seguente codice:
    dll-name advapi32.dll
    search-and-write module:. unicode:TransparentEnabled ascii:X
  • Salviamo il file nella cartella contenente BPMTK;
  • Dal prompt dei comandi spostiamoci nella cartella dove abbiamo salvato il file .txt.
  • Eseguiamo il seguente comando:
    bpmtk bypass-SRP.txt


Con i comandi indicati all’interno del file .txt non facciamo altro che dire a BPMTK di cercare, in tutti i processi che caricano advapi32.dll, la stringa TransparentEnabled e sostituire la T con la X. Così facendo il nome della chiave diventerà XransparentEnabled.

Tuttavia questo procedimento non disabilita le SRP per i processi già in esecuzione. Le SRP, infatti, una volta caricate dal registro vengono memorizzate nella cache in modo da evitare continui accessi al registro che rallenterebbe l’esecuzione. Per rendere non valida la cache e quindi forzare la lettura dal registro bisogna aspettare un update delle GPO oppure forzarle con il comando gpupdate /force (se si tratta di utente limitato probabilmente non potrà forzare l’update delle GPO).
Anche in questo caso l’utility BPMTK ci viene incontro. La memorizzazione nella cache delle SRP viene controllata dalla variabile _g_ bInitializedFirstTime presente in advapi32.dll. Nella versione 5.1.2600.2180 di advapi32.api.dll la variabile è memorizzata all’indirizzo 77E463C8. Assegnando a tale variabile il valore 0 si rende non valida la cache. Modifichiamo il nostro file bypass-SRP.txt in modo tale che contenga le seguenti istruzioni:


dll-name advapi32.dll
search-and-write module:. unicode:TransparentEnabled ascii:X
write version:5.1.2600.2180 hex:77E463C8 hex:00

E se l’utente limitato non dispone di permessi per eseguire BPMTK?

Bypassare le Software Restriction Policies tramite BPMTK e le macro di Excel

Nel caso in cui l’utente non disponga i necessari permessi per eseguire BPMTK ma gli è permesso di eseguire macro in Excel allora possiamo sfruttare il VBScript.

In questo caso lo stesso autore di BPMTK ci mette a disposizione sul proprio sito una sua utility creata in python che permette di includere un file .exe o .dll in un file .vbs. È possible scaricare il programma al seguente link: www.didierstevens.com/files/software/file2vbscript_v0_3.zip

Per poter eseguire il programma è necessario aver installato un interprete python. Possiamo scaricare Python da www.python.it/download/

Una volta scompattato il file file2vbscript_v0_3.zip  e installato python copiamo il file file2vbscript.py nella stessa cartella del file bpmtk.exe.
Dal prompt dei comandi spostiamoci nella cartella che contiene i 2 file e digitiamo il seguente comando

file2vbscript.py -o BPMTK.exe nostroScript.vbs

Il programma non fa altro che eseguire il dump del file .exe e memorizzarlo all’interno del file .vbs.
Nel caso in cui volessimo eseguire il dump di una dll allora l’opzione da utilizzare è –l come mostrato di seguito:

file2vbscript -l bpmtk.dll bpmtk.vbs

Ora che abbiamo visto come includere una dll o un file eseguibile all’interno di un VBS abbiamo un altro problema: come facciamo ad includere il file bypass-SRP.txt visto precedentemente all’interno del nostro file VBS?

Basta eseguire il comando

bpmtk bypass-SRP.txt bpmtk-cmd.exe


Con questo comando non facciamo altro che eseguire una copia del file bpmtk.exe con incluso il file di testo. Il file risultante, come indicato nel comando, è bpmtk-cmd.exe.

Per quanti non dispongono di Python e non vogliono installarlo, ho realizzato un semplice programmino in C# (senza troppe pretese) per raggiungere lo stesso scopo. Nella realizzazione non mi sono discostato molto dal programma di Didier Stevens. Il codice C# è molto semplice e presenta diversi aspetti che possono essere migliorati ma per il nostro scopo va più che bene.

Da QUI potete scaricare il sorgente e il programma compilato.

Il programma, essendo già compilato, non necessita dell’installazione di Python inoltre presenta un’interfaccia grafica che ne facilita l’utilizzo e consente di integrare, insieme ad un file .exe, anche un file txt all’interno del vbs. Lo svantaggio sta nel fatto che è più lento nell’eseguire l’operazione di Dump.
File2VBS in C#
FIG 1 - File2VBS in C#

Eseguendo il mio programma appare un’interfaccia grafica dove andremo a selezionare l’output che ci interessa:
  • Office: se ci interessa un output da poter utilizzare come macro all'interno di un'applicazione Office (più avanti vedremo come utilizzarlo in Excel);
  • Library: se stiamo eseguendo il dump di una DLL;
  • Stand Alone: se ci interessa un VBS da eseguire autonomamente attraverso WSH;
  • Don’t execute: non esegue il file di dump generato.
Dopodiché specifichiamo il file che intendiamo utilizzare (exe o dll), un eventuale file di testo da integrare nel VBS e il nome del file di output. 

Clicchiamo su Proceed e attendiamo che la progress bar scompaia. A questo punto, una volta creato il nostro file VBS, non ci resta che inserirlo all’interno di Excel e farlo eseguire come Macro.

Creare una macro Excel 2013 con il file VBS

Il nostro file VBS può essere utilizzato all’interno di Excel come macro. Possiamo fare in modo che quando il file Excel venga aperto la macro venga eseguita automaticamente. Di seguito mostro i passaggi da eseguire per Excel 2013:


  • Avviare Excel 2013 e creare un nuovo foglio di lavoro vuoto;
  • Dal menu File selezionare Opzioni quindi cliccare su Personalizza barra multifunzione;
  • Nel riquadro Schede principali selezionare la casella relativa alla scheda Sviluppo

Schede principali - Sviluppo
FIG 2 - Schede principali - Sviluppo

  • A questo punto tra i ribbon di Excel troviamo anche la voce Sviluppo. Aprire il ribbon Sviluppo e cliccare sull’icona Sicurezza Macro.

FIG 3 - Sicurezza Macro

  • Selezionare Attiva tutte le macro (scelta non consigliata; potrebbe venire eseguito codice pericoloso) e confermiamo su OK
  • Cliccare sull’icona Visual Basic (oppure utilizziamo la combinazione ALT+F11)
  • Nella riquadro Progetto - VBAProject fare clic con il pulsante destro del mouse sull'oggetto Questa_cartella_di_lavoro (ThisWorkbook in inglese) e quindi selezionare Visualizza codice
  • Nel riquadro a destra, incollare il codice presente all’interno del file VBS prodotto da File2VBS
  • Se vogliamo che il codice venga eseguito all'apertura del file allora nell'elenco Oggetto, sopra alla finestra Codice, selezionare Workbook. Per l'evento Open verrà creata automaticamente una routine vuota nominata Workbook_Open(). Aggiungere alla procedura la chiamata a DoIt in modo che appaia come la seguente:
 
Private Sub Workbook_Open()
 DoIt
End Sub

Excel 2013 VBA
FIG 4 - Excel 2013 VBA



Bypassare le retrizioni relative all’esecuzione del prompt dei comandi

Solitamente gli amministratori di sistema disabilitano l’accesso al prompt dei comandi (CMD.EXE) da parte degli utenti. Tale restrizione non viene applicata con una Software Restriction Policy (SRP) bensì con una GPO dedicata. 

Quando viene eseguito cmd.exe va a verificare la presenza della chiave di registro DisableCMD. Se tale chiave è presente allora cmd.exe non verrà eseguito e, al suo posto, apparirà un messaggio che avverte l’utente della restrizione.

Con BPMTK è possibile bypassare anche questo tipo di restrizione:
  • Creiamo un file di testo e nominiamolo bypass-CMD.txt
  • All’interno del file copiamo il seguente codice:
    start cmd.exe 
    search-and-write module:.  unicode:DisableCMD hex:41
  • Salviamo il file nella cartella contenente BPMTK;
  • Dal prompt dei comandi spostiamoci nella cartella dove abbiamo salvato il file .txt.
  • Eseguiamo il seguente comando:
    bpmtk bypass-CMD.txt

Praticamente andiamo ad eseguire il prompt dei comandi (CMD.EXE) e andiamo ad intercettare la chiave DisableCMD che andremo a rinominare in AisableCMD in modo da non farla trovare a CMD.EXE.






Con questo termino il presente articolo. BPMTK offre numerose possibilità che non è possibile trattare in un singolo articolo pertanto è probabile che in futuro ritornerò sull'argomento.