Esecuzione del codice controllando il testo del commento in uno script Python.

Uno dei partecipanti alla competizione UIUCTF 2025 ha spiegato in dettaglio come è riuscito a completare il compito che richiedeva di eseguire il proprio codice sul server, avendo solo la possibilità di modificare il contenuto del testo del commento nel codice.

I partecipanti potevano inviare una richiesta di rete a uno script Python, che creava un nuovo script Python con un nome casuale, aggiungeva i dati forniti dall'utente al testo del commento, rimuovendo i caratteri «\n» e «\r», e eseguiva questo script con il comando «python3 nome.py». Controllando solo il contenuto del commento, il partecipante doveva estrarre una stringa dal file «/home/ctfuser/flag». Lo script veniva creato con il seguente codice: comment = input(«> «).replace(«\n», «»).replace(«\r», «») code = f»»»print(«hello world!») # Questo è un commento. Ecco un altro: # {comment} print(«Thanks for playing!»)»»»

Al posto di «{comment}» venivano inseriti i dati forniti dal partecipante, e alla fine veniva eseguito il seguente codice: print(«hello world!») # Questo è un commento. Ecco un altro: # Dati forniti dal partecipante della competizione print(«Thanks for playing!»)

L'incarico è stato formulato sulla base di una vulnerabilità nel parser CPython, che trattava il carattere con codice zero come fine della stringa (questa vulnerabilità, ad esempio, poteva essere sfruttata per nascondere azioni dannose nel testo dei commenti). Il problema è stato risolto nei rilasci di CPython 3.12.0 e 3.11.4. Nel gestore utilizzato nella competizione venivano rimossi solo i caratteri «\n» e «\r», ma utilizzando la versione vulnerabile di CPython, il partecipante poteva usare il carattere «\0» come delimitatore. Tuttavia, questo trucco non ha funzionato poiché nel concorso veniva già utilizzata una versione corretta di CPython, con la consapevolezza che nel parser potessero rimanere altri errori simili e i partecipanti potessero identificarli.

Il partecipante che ha completato con successo il compito non ha cercato nuove vulnerabilità nel parser che potessero suddividere la stringa in parti, ma ha sfruttato la peculiarità dell'esecuzione dei file in Python in base al loro contenuto. Ad esempio, invece del codice sorgente, in un file con estensione «.py» si può inserire un bytecode memorizzato, che viene salvato in file con estensione «.pyc», e quel file verrà eseguito. Nel concorso in questione, il partecipante poteva controllare solo il contenuto in mezzo al file, quindi non poteva aggiungere il proprio header per alterare il tipo MIME.

Il problema è stato risolto sfruttando il fatto che Python, a partire dalla versione 2.6, può eseguire contenuti di archivi ZIP per fornire pacchetti Python in formato compresso. Come nel caso della cache del bytecode, la presenza di un archivio ZIP è determinata dal contenuto e non dall'estensione del file, ovvero in 'file.py' è possibile inserire un archivio ZIP e, al momento dell'esecuzione con il comando 'python file.py', verrà trattato come un pacchetto Python compresso. Gli archivi ZIP in Python, inoltre, non vengono indicizzati in base all'intestazione all'inizio del file, ma dalla sezione EOCD (End of Central Directory Record) alla fine del file. Se nell'archivio è presente il file '__main__.py', questo verrà eseguito automaticamente al momento dell'esecuzione diretta dell'archivio tramite il comando 'python archivio'.

Il compito del concorso è stato risolto generando un simile archivio ZIP e inserendolo nel testo del commento. Per mantenere la correttezza della struttura del file, date le chiamate 'print("Thanks for playing!")' alla fine del file sorgente, è stata utilizzata la presenza di un'area di commento nella sezione EOCD, posizionata proprio alla fine.

Esecuzione del codice controllando il testo del commento in uno script Python.
Esecuzione del codice controllando il testo del commento in uno script Python.


Fonte: opennet.ru
Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster