Ăks UIUCTF 2025 vĂ”istluse osalejatest selgitas pĂ”hjalikult, kuidas tal Ă”nnestus tĂ€ita ĂŒlesanne, milleks oli koodi kĂ€ivitamine serveris, muutes vaid koodikommentaari teksti sisu.
Osalejad said saata vĂ”rgu pĂ€ringu Python skriptile, mis lĂ”i uue Python skripti juhusliku nimega, lisas kasutaja sisendandmed kommentaariteksti, lĂ”igates vĂ€lja sĂŒmbolid "\n" ja "\r", ning kĂ€ivitas selle skripti kĂ€suga "python3 nimi.py". Kontrollides ainult kommentaaride sisu, pidi osaleja tĂ”mbama stringi failist "/home/ctfuser/flag". Skript loodi jĂ€rgmise koodiga: comment = input("> ").replace("\n", "").replace("\r", "") code = f"""print("hello world!") # See on kommentaar. Siin on veel ĂŒks: # {comment} print("Thanks for playing!")"""
Kohale asetati osalejast saadud andmed "{comment}", mille tulemusena kĂ€ivitati jĂ€rgmine kood: print("hello world!") # See on kommentaar. Siin on veel ĂŒks: # Osalejast saadud andmed print("Thanks for playing!")
Ălesanne oli kujundatud CPython parseris esineva haavatavuse pĂ”hjal, mille tĂ”ttu tĂ”lgendati nullkoodi sĂŒmbolit kui rea lĂ”ppu (haavatavust sai nĂ€iteks kasutada pahatahtlike toimingute varjamiseks kommentaaritekstis). Probleem lahendati CPython versioonides 3.12.0 ja 3.11.4. VĂ”istlusel kasutatavas töötlejas lĂ”igati vĂ€lja vaid sĂŒmbolid "\n" ja "\r", kuid haavatava versiooni CPython kasutamisel sai osaleja kasutada sĂŒmbolit "\0" eraldajana. Siiski see trikk ei Ă”nnestunud, kuna vĂ”istlusel kasutati juba parandatud versiooni CPython, arvestades, et parseris vĂ”ivad veel olla sarnased vead, ja osalejad saavad need tuvastada.
Edukalt ĂŒlesandega hakkama saanud osaleja ei hakanud otsima uusi haavatavusi parseris, mis vĂ”imaldaksid stringi osadeks lĂ”hestada, vaid kasutas Pythonis failide tĂ€itmise eripĂ€ra sĂ”ltuvalt nende sisust. NĂ€iteks vĂ”is failiga, millel on laiend '.py', asendada salvestatud baitkood, mis on salvestatud failides laiendiga '.pyc', ja sarnane fail tĂ€idetakse. Antud konkursil suutis osaleja kontrollida ainult faili sisu keskel, seega ei saanud ta lisada oma pealkirja MIME-tĂŒĂŒbi moonutamiseks.
Probleemi Ônnestus lahendada, kasutades Àra seda, et Python alates versioonist 2.6 suudab tÀita ZIP-arkhivide sisu Python-pakettide edastamiseks kokku pakitud kujul. Nagu baitkoodi vahemÀlu puhul mÀÀratakse zip-arkhivi olemasolu sisu, mitte faili laiendi jÀrgi, st 'fail.py' saab sisaldada zip-arkhivi ja kui seda kÀivitada kÀsuga 'python fail.py', töödeldakse seda kokku pakitud Python-paketina. Samal ajal ei indekseerita Pythonis ZIP-arkhiveid faili alguses oleva pealkirja jÀrgi, vaid faili lÔpus oleva EOCD-sektsiooni (End of Central Directory Record) jÀrgi. Kui arkhiv sisaldab faili '__main__.py', kÀivitatakse see automaatselt, kui arkhivi kÀivitada kÀsuga 'python arkhiv'.
KonkursiĂŒlesanne lahendati sarnase ZIP-arkhivi generaatoriga, mille sisestamine toimus kommentaariteksti. Faili struktuuri korrektse sĂ€ilitamise nimel, arvestades lĂ€htefaili lĂ”pus olevat kĂ€sku 'print("Thanks for playing!")', kasutati EOCD-sektsiooni kommentaarivĂ€lja olemasolu, mis asub faili lĂ”pus.

Allikas: opennet.ru
