C# Per Hachers
C# Per Hachers
Brandon Perry
Prefazione di Matt Graeber
C#
per hacker
Creare e automatizzare
strumenti di sicurezza
per Windows, Linux e macOS
Brandon Perry
Titolo originale: Gray Hat C# | A Hacker’s Guide to Creating and Automating Security Tools
ISBN: 978-1-59327-759-8
Published by No Starch Press, Inc.
245 8th Street, San Francisco, CA 94103
www.nostarch.com
Copyright © 2017 by Brandon Perry. All rights reserved.
Edizione italiana:
C# per hacker | Creare e automatizzare strumenti di sicurezza per Windows, Linux e macOS
Traduzione di: Antonio Pelleriti
Publisher: Marco Aleotti
Immagine di copertina: © Sanja Kaz e © Kobsoft |Shutterstock
Collana:
I diritti di traduzione, di memorizzazione elettronica, di riproduzione e adattamento totale o parziale con qualsiasi mezzo (compresi
i microfilm e le copie fotostatiche), sono riservati per tutti i Paesi. Le fotocopie per uso personale del lettore possono essere effettuate
nei limiti del 15% di ciascun volume dietro pagamento alla SIAE del compenso previsto dall’art. 68, commi 4 e 5, della legge 22
aprile 1941 n. 633.
Le fotocopie effettuate per finalità di carattere professionale, economico o commerciale o comunque per uso diverso da quello per-
sonale possono essere effettuate a seguito di specifica autorizzazione rilasciata da CLEARedi, Centro Licenze e Autorizzazioni per le
Riproduzioni Editoriali, Corso di Porta Romana 108, 20122 Milano, e-mail [email protected] e sito web www.clearedi.org.
La presente pubblicazione contiene le opinioni dell’autore e ha lo scopo di fornire informazioni precise e accurate. L’elaborazione dei
testi, anche se curata con scrupolosa attenzione, non può comportare specifiche responsabilità in capo all’autore e/o all’editore per
eventuali errori o inesattezze.
L’Editore ha compiuto ogni sforzo per ottenere e citare le fonti esatte delle illustrazioni. Qualora in qualche caso non fosse riuscito a
reperire gli aventi diritto è a disposizione per rimediare a eventuali involontarie omissioni o errori nei riferimenti citati.
Tutti i marchi registrati citati appartengono ai legittimi proprietari.
Via G. Spadolini, 7
20141 Milano (MI)
Tel. 02 881841
www.edizionilswr.it
Printed in Italy
Finito di stampare nel mese di novembre 2017 presso “Rotolito Lombarda” S.p.A., Seggiano di Pioltello (MI) Italy
PREFAZIONE............................................................................................................... 9
INTRODUZIONE.......................................................................................................13
Perché mi devo fidare di Mono?............................................................................................. 14
A chi si rivolge questo libro?................................................................................................... 14
Organizzazione del libro........................................................................................................... 14
Ringraziamenti............................................................................................................................ 16
Una nota finale.............................................................................................................................17
5
C# per hacker
6. AUTOMAZIONE DI NEXPOSE...................................................................141
Installazione di Nexpose........................................................................................................142
La classe NexposeSession.....................................................................................................145
La classe NexposeManager.................................................................................................... 151
Automazione di una scansione di vulnerabilità................................................................ 152
Creazione di report PDF ed eliminazione del sito............................................................154
Mettere tutto insieme............................................................................................................. 155
6
Sommario
7
Prefazione
Nel ruolo di “attaccante“ o “difensore“ che sviluppa software, bisogna ovviamente de-
cidere che linguaggio ha più senso utilizzare. Idealmente, la scelta non ricadrà su un
linguaggio semplicemente perché è quello su cui lo sviluppatore si trova più a suo agio.
Piuttosto, tale scelta sarà dettata dalle risposte a una serie di domande come le seguenti.
• Quali sono i principali ambienti bersaglio di esecuzione?
• Qual è lo stato delle librerie di rilevazione e logging per i payload scritte in tale
linguaggio?
• A che livello il mio software deve rimanere invisibile (per esempio residente in
memoria)?
• Quanto è ben supportato il linguaggio sia lato client che lato server?
• C’è una grande comunità di sviluppatori in questo linguaggio?
• Qual è la curva di apprendimento e quanto è mantenibile il linguaggio?
C# è sempre stato la lingua franca dei linguaggi .NET. Come vedrete in questo libro, sare-
te attivi con C# in men che non si dica, grazie alla sua bassa soglia di ingresso e alla mas-
siccia comunità di sviluppatori. In più, essendo quelli .NET dei linguaggi gestiti e ricchi di
tipi, gli assembly compilati si prestano a essere facilmente decompilati in C#. Pertanto,
chi scrive programmi offensivi in C#, non dovrà necessariamente sviluppare le proprie
capacità dal nulla. Anzi, potrà attingere da un ricco insieme di esempi di malware .NET,
decompilarli, leggere il loro codice sorgente, e “prendere in prestito” le loro capacità.
9
C# per hacker
Si potrebbe addirittura spingersi oltre e utilizzare le .NET Reflection API per caricare ed
eseguire dinamicamente questi esempi esistenti di malware .NET, assumendo, natural-
mente, di averli modificati abbastanza da non fargli fare nulla di sovversivo.
Nel ruolo di chi ha passato anni a rendere popolare PowerShell come strumento offen-
sivo, i miei sforzi hanno portato a un massiccio miglioramento della sicurezza e degli
strumenti di logging, in seguito all’aumento di malware PowerShell.
L’ultima versione di PowerShell (v5 nel momento in cui scrivo) implementa più funzio-
ni di logging di qualsiasi altro linguaggio esistente. Dalla prospettiva di un difensore,
tutto ciò è fantastico. Da quella di un pentester, di nemico, o avversario, ciò aumenta
notevolmente il rumore di un attacco.
Ma per un libro su C#, perché menzionarlo? Anche se ci ho messo anni a riconoscerlo,
più PowerShell scrivo, più mi rendo conto che gli aggressori stanno guadagnando molta
più agilità sviluppando i loro strumenti in C# piuttosto che facendolo esclusivamente
in PowerShell. Lasciatemi spiegare.
• .NET offre ricche API di reflection che consentono con facilità di caricare e in-
teragire dinamicamente con un assembly C# compilato in memoria. Con tutti
i controlli eseguiti ora sui payload PowerShell, l’API di reflection consente a un
utente malintenzionato di nascondersi meglio ai radar, sviluppando un payload
in PowerShell che funge solo da caricatore ed esecutore di un assembly .NET.
• Come ha dimostrato Casey Smith (@subTee), ci sono molti file binari legittimi
firmati da Microsoft presenti in un’installazione predefinita di Windows, che
fungono da fantastici processi host per dei payload C#: msbuild.exe è fra i più
invisibili. Usare MSBuild come processo host per un malware C# incarna perfet-
tamente la metodologia “vivere di ciò che offre la terra”: l’idea che gli attaccanti
possano fondersi in un ambiente bersaglio e lasciare impronte minime prospe-
rerà per un lungo periodo di tempo.
• I produttori di antimalware, a oggi, sono per la maggior parte ancora ignari del-
le funzionalità degli assembly .NET a runtime. C’è ancora abbastanza codice
malware non gestito là fuori, e l’attenzione non si è ancora spostata sul rilevare
in modo efficace il .NET Runtime che sta eseguendo un’introspezione dinamica
a runtime.
• Con l’accesso alla massiccia libreria di classi .NET, chi si trova a suo agio con
PowerShell troverà il passaggio a C# relativamente semplice. Viceversa, chi co-
nosce C# incontrerà una barriera d’ingresso più bassa nel trasferire le proprie
competenze ad altri linguaggi .NET come PowerShell e F#.
• Come PowerShell, C# è un linguaggio di alto livello, il che significa che gli svi-
luppatori non devono preoccuparsi di codifica a basso livello e di gestione della
memoria. A volte, tuttavia, si ha la necessità di andare a “basso livello” (per
10
Prefazione
Ognuno ha motivazioni differenti per imparare C#. La mia motivazione era il bisogno
di trasferire le mie conoscenze di PowerShell in maniera da riuscire a scrivere codice
.NET su piattaforme differenti.
Tu, lettore, potresti essere stato attratto da questo libro per acquisire la mentalità da
attaccante, e completare le tue conoscenze di C#. Al contrario, potresti applicare la
tua mentalità da aggressore a un linguaggio supportato da tante piattaforme differenti.
Qualunque sia la tua motivazione, tieniti pronto a un giro selvaggio attraverso la mente
di Brandon, mentre impartisce la sua esperienza unica e la sua conoscenza nello svi-
luppo di C# offensivo e difensivo.
Matt Graeber
Microsoft MVP
11
Introduzione
Tante volte mi viene chiesto perché mi piace così tanto C#. Essendo io un sostenitore
del software open source, un utente Linux e un contributore di Metasploit (scritto
prevalentemente in Ruby), C# sembra una scelta strana come linguaggio preferito.
Quando tanti anni fa iniziai a scrivere in C#, Miguel de Icaza (noto per GNOME) aveva
recentemente avviato un piccolo progetto denominato Mono. Mono è essenzialmente
un’implementazione open source del Microsoft .NET Framework. C# come linguaggio
è stato sottoposto all’ECMA come standard, e il .NET Framework è stato pubblicizza-
to da Microsoft come sostituto di Java dato che il codice può essere compilato su un
sistema o piattaforma ed eseguito su un altro. L’unico problema è che Microsoft ha
rilasciato il .NET Framework solo per il sistema operativo Windows. Miguel e un pic-
colo gruppo di collaboratori si sono impegnati a rendere il progetto Mono il ponte fra
.NET e la comunità Linux. Fortunatamente un mio amico, che mi aveva raccomandato
di imparare C# ma che sapeva anche del mio interesse per Linux, mi ha raccontato
di questo progetto nascente per vedere se fosse possibile utilizzare sia C# che Linux.
A quel punto ero incastrato.
C# è un linguaggio bellissimo. Il creatore e architetto principale del linguaggio, Anders
Hejlsberg, ha iniziato a lavorare sui compilatori per Pascal prima e Delphi in seguito.
Questa esperienza gli ha fornito una conoscenza profonda di caratteristiche veramente
potenti in diversi linguaggi di programmazione. Hejlsberg è quindi entrato in Microsoft
e C# è nato intorno all’anno 2000. Nei suoi primi anni, C# ha condiviso un sacco di
caratteristiche con il linguaggio Java, come la sintassi, ma con il passare del tempo è
cresciuto per conto proprio e ha introdotto tutta una serie di caratteristiche preceden-
temente appartenenti a Java, come LINQ, i delegati e i metodi anonimi.
Con C#, si dispone di molte delle potenti funzionalità di C e C++ e si possono scrivere
applicazioni web complete utilizzando lo stack ASP.NET o ricche applicazioni desktop.
Su Windows, la libreria utilizzata per la UI è WinForms, ma su Linux sono facili da usa-
re le librerie GTK e QT. Più recentemente, Mono ha introdotto il supporto per Cocoa
Toolkit su piattaforma macOS. Anche iPhone e Android sono supportati.
13
C# per hacker
14
Introduzione
complesso, una volta finito di leggere questo libro, avrai un eccellente repertorio di
piccole librerie per automatizzare molti dei lavoretti eseguiti spesso dai professionisti.
Capitolo 1: Corso Intensivo di C#: in questo capitolo impareremo le basi della program-
mazione orientata agli oggetti in C# con piccoli esempi, ma affronteremo un’ampia
varietà delle funzionalità del linguaggio. Cominceremo con un programma Hello World
costruendo poi piccole classi per comprendere meglio cosa sia la programmazione
orientata agli oggetti. A questo punto ci sposteremo verso le caratteristiche più avan-
zate di C#, come i metodi anonimi e P/Invoke.
Capitolo 2: Fuzzing ed exploiting con XSS e SQL Injection: in questo capitolo scrivere-
mo dei fuzzer costituiti da piccole richieste HTTP nel tentare XSS e SQL injection con
diversi tipi di dati e utilizzando librerie HTTP per comunicare con i server web.
Capitolo 3: Fuzzing di endpoint SOAP: in questo capitolo si porteranno i concetti del
precedente capitolo a un livello superiore, scrivendo un piccolo fuzzer che ricava e
analizza un SOAP WSDL per trovare potenziali SQL injection, generando automatica-
mente richieste HTTP. Tutto ciò mentre esamineremo anche le eccellenti classi XML
disponibili nella libreria di base.
Capitolo 4: Scrivere payload di Connect-Back, Binding e Metasploit: in questo capi-
tolo si passa da HTTP alla creazione di payload. In primo luogo creeremo un paio di
semplici payload, uno su TCP e uno su UDP. Quindi si vedrà come generare shellcode
X86/x86_64 in Metasploit per creare payload multipiattaforma e multiarchitettura.
Capitolo 5: Automazione di Nessus: in questo capitolo si torna ad HTTP per auto-
matizzare il primo di diversi scanner di vulnerabilità, Nessus. Vedremo come creare,
osservare e ottenere report dalla scansione di range CIDR in maniera programmatica.
Capitolo 6: Automazione di Nexpose: in questo capitolo si mantiene il focus sull’auto-
mazione di tool, spostandosi allo scanner di vulnerabilità Nexpose. Nexpose, le cui API
sono anch’esse basate su HTTP, può essere automatizzato per eseguire la scansione
di vulnerabilità e creare report. Rapid7, creatore di Nexpose, offre una licenza annuale
gratuita per la versione community, molto utile per gli appassionati non aziendali.
Capitolo 7: Automazione di OpenVAS: in questo capitolo concludiamo l’analisi sull’au-
tomazione degli scanner di vulnerabilità con OpenVAS, che è open source. Le API di
OpenVAS sono fondamentalmente differenti da quelle di Nexus e di Nexpose, in quanto
utilizzano solo socket TCP e XML per il protocollo di comunicazione. Essendo gratuito,
inoltre, è utile per hobbisti con poche disponibilità economiche che cercano di acquisire
maggiore esperienza nella scansione di vulnerabilità.
Capitolo 8: Automazione di Cucko Sandbox: in questo capitolo si passerà all’informati-
ca forense con Cucko Sandbox. Lavorando con delle semplici API REST JSON, automa-
tizzeremo l’analisi di potenziali esempi di Malware e creeremo dei report sui risultati.
15
C# per hacker
Ringraziamenti
La scrittura di questo libro ha richiesto un decennio, anche se è stato digitato in un ela-
boratore testi solo per tre anni. La mia famiglia e i miei amici hanno sicuramente notato
che ho parlato continuamente di C#, ma sono stati ascoltatori più che comprensivi.
Grazie ai fratelli e alle sorelle AHA che hanno ispirato molti dei progetti del libro. Tanti
ringraziamenti a John Eldridge, un amico di famiglia che mi ha fatto conoscere C# e mi
ha letteralmente iniziato alla programmazione. Brian Rogers è stato una delle migliori
risorse tecniche con cui confrontare le idee durante lo sviluppo del libro, così come un
eccellente editore tecnico con il suo attento occhio e le sue intuizioni. I miei dirigenti
16
Introduzione
di produzione Serena Yang e Alison Law hanno fatto avanti e indietro nel processo di
editing in maniera più indolore possibile. E, naturalmente, Bill Pollock e Jan Cash sono
stati in grado di scolpire le mie oscure parole in frasi chiare che chiunque potrebbe
leggere. Un grazie enorme a tutto lo staff No Starch!
17
1
Corso intensivo di C#
A differenza di altri linguaggi, come Ruby, Python e Perl, i programmi C# possono essere
eseguiti direttamente su tutti i moderni sistemi Windows. Inoltre, eseguire applicazioni
C# su un sistema Linux come Ubuntu, Fedora o altro non potrebbe essere più semplice,
specialmente da quando Mono può essere rapidamente installato dalla maggior parte
dei gestori di pacchetti Linux, come apt o yum. Tutto ciò pone C# in una miglior posizio-
ne per venire incontro alle necessità multi-piattaforma rispetto alla maggior parte dei
linguaggi, con il beneficio di una libreria di base semplice e potente a portata di mano.
Nel complesso, C# e le librerie Mono/.NET costituiscono un framework interessante
per chiunque voglia scrivere strumenti cross-platform in modo semplice e rapido.
Scegliere un IDE
La maggior parte di coloro che vogliono imparare C# utilizzeranno un ambiente di svilup-
po integrato (IDE) come Visual Studio per scrivere e compilare il proprio codice. Visual
Studio di Microsoft è lo standard de facto per lo sviluppo C# in tutto il mondo. La versio-
ne gratuita Visual Studio Community Edition è disponibile per utilizzo personale e può
essere scaricata dal sito Microsoft all’url https://www.visualstudio.com/downloads/.
19
C# per hacker
Un semplice esempio
A chiunque abbia utilizzato C o Java, la sintassi C# apparirà molto familiare. C# è un
linguaggio fortemente tipizzato, come C e Java; ciò significa che una variabile dichiarata
nel codice può essere di un solo tipo (un intero, una stringa), o di una classe (Dog, per
esempio) e sarà sempre di questo tipo, in ogni caso. Iniziamo dando una rapida occhiata
all’esempio Hello World nel Listato 1.1, che mostra un po’ di tipi e sintassi C#.
using q System;
namespace w ch1_hello_world
{
class e MainClass
{
public static void r Main(string[] t args)
{
y string hello = "Hello World!";
u DateTime now = DateTime.Now;
i Console.Write(hello);
o Console.WriteLine(" The date is " + now.ToLongDateString());
}
}
}
Per prima cosa, è necessario importare i namespace da utilizzare, e ciò avviene con
l’istruzione using che importa il namespace System q. In tal modo viene abilitato l’ac-
20
Corso intensivo di C# Capitolo 1
cesso alle librerie nel programma, come avviene con #include in C, import in Java e
Python, e require in Ruby e Perl. Dopo aver dichiarato la libreria che si vuol utilizzare,
viene dichiarato il namespace w di cui faranno parte le classi.
A differenza di C (e delle versioni più vecchie di Perl), C# è un linguaggio orientato
agli oggetti, simile a Ruby, Python e Java. Ciò significa che possiamo costruire classi
complesse per rappresentare strutture dati, assieme ai metodi per tali strutture dati,
mentre scriviamo codice. I namespace permettono di organizzare le nostre classi e il
nostro codice e di evitare potenziali conflitti di nomi, per esempio come avverrebbe
se due programmatori creassero due classi con lo stesso nome. Se due classi con lo
stesso nome sono in namespace differenti, non ci sarà nessun problema. Ogni classe
deve necessariamente avere un namespace.
Ora che c’è un namespace possiamo dichiarare una classe e che conterrà il metodo
Main() r. Come detto in precedenza, le classi consentono di creare tipi di dati complessi
e strutture dati che rappresentino meglio oggetti reali. In questo esempio, il nome della
classe non ha importanza; serve solo da contenitore del metodo Main(), che è quello che
realmente serve, perché è il metodo Main() che sarà eseguito all’avvio dell’applicazione.
Ogni applicazione C# necessita di un metodo Main(), come in C e Java. Se l’applicazione
accetta argomenti da linea di comando, si può utilizzare la variabile args t per accedere
agli argomenti passati.
In C# esistono strutture dati semplici, come le stringhe y, così come possono essere
creati oggetti più complessi, per esempio una classe che rappresenta data e orario u.
La classe DateTime è una delle classi base di C# e serve a lavorare con le date. Nell’e-
sempio viene utilizzata per memorizzare la data e l’orario attuale (DateTime.Now) nella
variabile now. Infine, dichiarate le variabili, è possibile stampare un messaggio utiliz-
zando i metodi Write() i e WriteLine() o della classe Console (il secondo include un
carattere per andare a capo alla fine del testo).
Se si utilizza un IDE, è possibile compilare ed eseguire il codice facendo clic sul pulsante
Esegui, che si trova in genere in alto a sinistra e assomiglia a un pulsante Play, oppure
premendo il tasto F5. In ogni caso, se si vuole è possibile anche compilare il sorgente
da linea di comando con il compilatore Mono. Nella directory con il file contenente la
classe C#, basta utilizzare il comando mcs rilasciato con Mono per compilare un ese-
guibile come segue:
$ mcs Main.cs -out:ch1_hello_world.exe
Eseguendo il codice del Listato 1.1, dovrebbe essere stampata la stringa “Hello World!”
e la data attuale sulla stessa riga, come mostrato nel Listato 1.2.
21
C# per hacker
$ ./ch1_hello_world.exe
Hello World! The date is Wednesday, June 28, 2017
22
Corso intensivo di C# Capitolo 1
no subito in mente. Avrebbe quindi senso avere una classe base da cui questi due tipi
possano ereditare. In questo caso, se queste due classi fossero sottoclassi di PublicSer-
vant, erediterebbero la proprietà w PensionAmount e un metodo e DriveToPlaceOfInterest
che dovrà essere implementato dalle sottoclassi di PublicServant. Non esiste un lavoro
da “impiegato pubblico” generico, quindi non c’è un motivo per creare direttamente
un’istanza della classe PublicServant.
Creazione di un’interfaccia
Le interfacce sono un complemento per le classi di C#. Le interfacce consentono a un
programmatore di forzare una classe a implementare certi metodi o proprietà non ere-
ditati. Vediamo come creare una semplice interfaccia, come mostrato nel Listato 1.4.
Questa interfaccia è chiamata IPerson e dichiarerà un paio di proprietà che la gente
generalmente possiede.
public interface q IPerson
{
string w Name { get; set; }
int e Age { get; set; }
}
Se una classe volesse implementare l’interfaccia IPerson q, tale classe dovrebbe im-
plementare entrambe le proprietà Name w e Age e. In caso contrario non compilerebbe.
Mostreremo esattamente cosa significa scrivendo nel prossimo paragrafo la classe
Firefighter, che implementa l’interfaccia IPerson. Per ora, tenete a mente che le inter-
facce sono una funzionalità importante e utile di C#. Programmatori familiari con le
interfacce in Java si sentiranno certamente a loro agio. I programmatori C possono
pensare a esse come a dei file di intestazione contenenti le dichiarazioni delle funzioni
che si aspettano un file .c con la loro implementazione. Chi sviluppa in Perl, Ruby o
Python potrebbe trovare strane le interfacce a un primo impatto, perché non esiste una
funzionalità simile in questi linguaggi.
23