Attack and Defense
Le gare Capture the Flag (CTF) sono divise principalmente in due tipi:
- Jeopardy
- Attack and defence
Introduzione
Le CTF attack and defence (da ora in poi A/D) sono una tipologia di competizione che mette a confronto squadre di giocatori che devono difendere i propri servizi da attacchi e attaccare i servizi delle altre squadre.
Questo tipo di competizione è molto simile a quella che si svolge durante DEFCON.
Alcune volte le challenge A/D sono simili a quelle Jeopardy, in quanto i servizi sono vulnerabili e i giocatori devono trovare le vulnerabilità e sfruttarle per rubare le flag. Altre volte però i servizi sono più particolari (o più complessi e formati da tante parti), le cui vulnerabilità sono:
- note a tutti, quindi il gioco si basa sulla capacità di difendere il servizio e sulla capacità di attaccare gli altri servizi
- in un contesto di “glue code” (ad es. un servizio che si connette ad un altro servizio) e quindi la vulnerabilità è data dalla configurazione del servizio
Esempio
Un servizio che si connette a un database con password predefinita è a rischio se il database è accessibile dall’esterno. Le password predefinite sono uguali per tutti, rendendo il sistema vulnerabile.
Inoltre, ogni tanto gli organizzatori si divertono a creare tecnologie nuove e mai viste prima, come ad esempio l’architettura cLEMENCy.
In 2017, the Legitimate Business Syndicate came up with their very own CPU architecture called cLEMENCy: a middle-endian with 9 bits bytes CPU. With its specifications released only 24h before the beginning of the CTF, it was designed with the explicit goals of both surprising the teams, and leveling the playing field by breaking all their tools.
Ruoli
L’arbitro
Il compito dell’arbitro è quello di controllare che i servizi vulnerabili siano online e funzionino.
Lo fa attraverso richieste ai servizi (HTTP, TCP, UDP, …) che hanno un esito positivo e depositano una flag nel servizio (in un DB, in un file di testo, …).
Ogni round viene fatto il controllo sulla funzionalità del servizio (SLA: Service Level Agreement).
Nei round successivi al primo l’arbitro può anche controllare (= controlla) che la flag del round precedente sia ancora disponibile.
Attenzione
La SLA è un termine MOLTIPLICATIVO nel calcolo del punteggio. Se un servizio non è funzionante per il 50% del tempo, il punteggio sarà dimezzato.
L’attaccante
Ha il compito di attaccare i servizi vulnerabili dei team avversari e recuperare le flag.
Le flag trovate devono essere inviate al gameserver, che le valida e restituisce una risposta (OK, DUP, INV, ERR, …).
Flag scadute
Le flag scadono dopo un certo numero di round. Se non vengono inviate al gameserver entro il tempo limite, non verranno più accettate.
Il difensore
Ha il compito di impedire agli attaccanti di rubare le flag.
Deve però garantire la funzionalità del servizio, altrimenti l’arbitro toglie punti SLA!
Può farlo per mezzo di patch, WAF, firewall, …
Regole di gioco
Il gioco si svolge in round di N secondi (di solito 60 o 120), durante i quali un l’arbitro
- aggiunge nuove flag alla macchina vulnerabile
- controlla l’integrità (SLA) dei servizi interagendo con essi e recuperando le flag attraverso accessi legittimi.
e durante i quali gli attaccanti
- cercano di rubare le flag degli avversari
- inviano le flag rubate al gameserver
Traffico
Il traffico di rete di solito passa attraverso un router centrale, il cosiddetto router di gioco.
Le macchine vulnerabili sono connesse al network di gioco.
Attenzione
Tutto il traffico che passa per il router di gioco è analizzato dagli organizzatori della gara per rilevare attacchi e violazioni del regolamento.
Non è consentito fare attacchi di tipo DoS, DDoS, scansione di rete che saturino la rete o attacchi che possano compromettere la sicurezza del router di gioco o di qualsiasi infrastruttura e servizio non facente parte del gioco.
IP masquerading
Per evitare che i team possano riconoscere gli IP degli avversari, il router di gioco fa masquerading degli IP.
Il grado di mascheramento può variare da gara a gara, ma di solito è molto alto. In alcuni casi il router di gioco fa IP masquerading per:
- VM -> VM
- Player -> VM
- CheckSystem -> VM
SSH tunneling
Spesso è desiderabile esporre dei servizi che non siano direttamente accessibili dall’esterno. Per fare ciò è possibile utilizzare il tunneling SSH.
Il tunneling SSH permette di creare un tunnel sicuro tra due porte di due macchine in rete, in modo che il traffico tra le due macchine sia crittografato e autenticato.
Per maggiori informazioni, consulta la pagina dedicata al tunneling SSH.
I tool utilizzati dal nostro team sono quelli disponibili su GitHub.
Link utili
SSH
Il protocollo SSH (Secure Shell) è un protocollo di rete che permette di stabilire una connessione sicura tra due macchine.
L’utilizzo più comune di SSH è quello di accedere in remoto alla shell di un’altra macchina, ma viene utilizzato senza che l’utente se ne accorga in molti altri contesti (rsync, git, …).
L’implementazione più comune di SSH è OpenSSH, che è disponibile di default su quasi tutte le distribuzioni Linux.
Connessione
Per connettersi ad una macchina remota via SSH è sufficiente utilizzare il comando ssh
seguito dall’indirizzo IP o dal nome della macchina remota.
Dove:
user
è l’utente con cui si vuole effettuare il loginremote
è l’indirizzo IP o il nome della macchina remota
Se l’utente è lo stesso sia sulla macchina locale che sulla macchina remota, è possibile omettere l’utente.
Configurazione
E’ possibile configurare il comportamento di SSH tramite il file ~/.ssh/config
. Normalmente questo file è utilizzato per definire opzioni e nomi di host.
Per esempio, al posto di eseguire
ssh -p 2222 -J user@jump -i ~/.ssh/id_rsa user@186.x.x.x
è possibile definire un host nel file ~/.ssh/config
:
Host remote
HostName 186.x.x.x
User user
Port 2222
IdentityFile ~/.ssh/id_rsa
ProxyJump user@jump
e poi connettersi con
SSH tunneling
Spesso è desiderabile esporre dei servizi che non siano direttamente accessibili dall’esterno.
Per fare ciò è possibile utilizzare il tunneling SSH.
Il tunneling SSH permette di creare un tunnel sicuro tra due porte di due macchine in rete, in modo che il traffico tra le due macchine sia crittografato e autenticato.
Local forwarding
ssh -L 8080:localhost:80 user@remote
Dove:
8080
è la porta localelocalhost:80
è l’enpoint su cui è in ascolto il servizio remotouser@remote
è l’utente e l’indirizzo IP della macchina remota
Questo comando crea un tunnel SSH tra la porta 8080
della macchina locale e la porta 80
della macchina remota. Tutti i pacchetti che arrivano sulla porta 8080
della macchina locale vengono inoltrati sulla porta 80
della macchina remota.
Quando usarlo?
Per utilizzare in locale un servizio remoto che non è direttamente accessibile dall’esterno.
Esempio: un database che binda su localhost:3306
Remote forwarding
Attenzione
In questo modo si espone un servizio locale sulla macchina remota.
Assicurarsi che il servizio sia sicuro e che non possa essere sfruttato da terzi!
ssh -R 8080:localhost:80 user@remote
Dove:
8080
è la porta remotalocalhost:80
è l’enpoint su cui è in ascolto il servizio localeuser@remote
è l’utente e l’indirizzo IP della macchina remota
Questo comando crea un tunnel SSH tra la porta 8080
della macchina remota e la porta 80
della macchina locale. Tutti i pacchetti che arrivano sulla porta 8080
della macchina remota vengono inoltrati sulla porta 80
della macchina locale.
Quando usarlo?
Per far si che dalla macchina remota si possa accedere ad un servizio avviato sulla macchina locale.
Per maggiori informazioni, la fonte più affidabile è come sempre la pagina di manuale di ssh
:
Virtual Machine Setup
To participate in the labs, you will need a functioning virtualization environment. As the majority of people use Windows, we will use VirtualBox as our virtualization software (if you are using Linux, you should already know how to create a virtual machine).
VirtualBox is a free and open-source hosted hypervisor, developed by Oracle Corporation. VirtualBox allows you to run multiple operating systems on a single machine.
1. VirtualBox Installation
- Download the latest version of VirtualBox from the official website.
- Run the installer and follow the instructions.
You should then be able to open VirtualBox and get a screen similar to the one below:
2. Kali Linux Installation
We will use Kali Linux as our main operating system for the labs. You can download the latest version of Kali Linux from the official website.
- Go to the official website and click on the “Virtual Machines” button.
- Click on the “VirtualBox” button. The download should start automatically.
- Once the download is complete, extract the files to a folder of your choice.
- Double click on the
.vbox
file to open it in VirtualBox.
You should now have a Kali Linux virtual machine running in VirtualBox.
Troubleshooting
If you encounter any issues during the installation process, please refer to the official VirtualBox documentation.
If you are still having trouble, feel free to ask for help in the Telegram chat or directly during the meetings.