Një nga participantët e garës UIUCTF 2025 shpjegoi në detaje si arriti të përmbushë një detyrë që kërkonte ekzekutimin e kodit të tij në server, duke pasur vetëm mundësinë e ndryshimit të përmbajtjes së tekstit të komentit në kod.
ParticipantĂ«t mund tĂ« dĂ«rgonin njĂ« kĂ«rkesĂ« rrjeti nĂ« njĂ« skript Python, i cili krijonte njĂ« skript tĂ« ri Python me emra tĂ« rastĂ«sishĂ«m, shtonte tĂ« dhĂ«nat e marra nga pĂ«rdoruesi nĂ« tekstin e komentit, duke prerĂ« karakteret â\nâ dhe â\râ, dhe ekzekutonte kĂ«tĂ« skript me komandĂ«n âpython3 emri.pyâ. Duke kontrolluar vetĂ«m pĂ«rmbajtjen e komentit, participantĂ«t duhej tĂ« nxirrnin njĂ« varg nga skedari â/home/ctfuser/flagâ. Skripti krijohej me kĂ«tĂ« kod: comment = input(â> â).replace(â\nâ, ââ).replace(â\râ, ââ) code = fâââprint(âhello world!â) # Ky Ă«shtĂ« njĂ« koment. Ja njĂ« tjetĂ«r: # {comment} print(âThanks for playing!â)âââ
NĂ« vend tĂ« â{comment}â pasoheshin tĂ« dhĂ«nat e marra nga participantĂ«t, dhe pĂ«rfundimisht ekzekutohej kodi i mĂ«poshtĂ«m: print(âhello world!â) # Ky Ă«shtĂ« njĂ« koment. Ja njĂ« tjetĂ«r: # TĂ« dhĂ«nat e marra nga participantĂ«t e garĂ«s print(âThanks for playing!â)
Detyra ishte formuluar mbi bazĂ«n e njĂ« vulnerabiliteti nĂ« parserin CPython, i cili trajtonte karakterin me kod zero si pĂ«rfundim tĂ« rreshtit (kjo vulnerabilitet mund tĂ« pĂ«rdorej pĂ«r tĂ« fshehur veprime tĂ« dĂ«mshme nĂ« tekstin e komentit). Problemi u zgjidh nĂ« versionet CPython 3.12.0 dhe 3.11.4. NĂ« parserin e pĂ«rdorur nĂ« konkurs, vetĂ«m karakteret â\nâ dhe â\râ u prerĂ«n, por duke pĂ«rdorur versionin e brishtĂ« tĂ« CPython, participantĂ«t mund tĂ« pĂ«rdornin karakterin â\0â si ndarĂ«s. MegjithatĂ«, ky truk nuk funksionoi pasi nĂ« konkurs u pĂ«rdor njĂ« version i korrigjuar i CPython me pĂ«rshtypjen se nĂ« parser mund tĂ« kishte ende ndonjĂ« gabim tĂ« ngjashĂ«m dhe participantĂ«t do tĂ« ishin nĂ« gjendje ta identifikonin.
ParticipantĂ«t qĂ« e zgjodhĂ«n me sukses detyrĂ«n nuk kĂ«rkuan vulnerabilitete tĂ« reja nĂ« parser pĂ«r tĂ« ndarĂ« vargjet nĂ« pjesĂ«, por shfrytĂ«zuan veçorinĂ« e ekzekutimit tĂ« skedave nĂ« Python sipas llojit tĂ« pĂ«rmbajtjes sĂ« tyre. PĂ«r shembull, nĂ« vend tĂ« kodit burimor, nĂ« njĂ« skedar me zgjerimin â.pyâ mund tĂ« vendoset njĂ« kod byte i cache-it, i mbajtur nĂ« skedarĂ« me zgjerimin â.pycâ, dhe ky skedar do tĂ« ekzekutohej. NĂ« konkursin e shqyrtuar, participantĂ«t mund tĂ« kontrollonin vetĂ«m pĂ«rmbajtjen nĂ« mes tĂ« skedarit, kĂ«shtu qĂ« nuk mund tĂ« shtonin titullin e tyre pĂ«r ta deformuar tipin MIME.
DetyrĂ«n e arritĂ«n duke pĂ«rdorur faktin se Python qĂ« nga dega 2.6 mund tĂ« ekzekutojĂ« pĂ«rmbajtjen e arkivave ZIP pĂ«r shpĂ«rndarjen e paketave Python nĂ« formĂ« tĂ« kompresuar. Si nĂ« rastin e cache-it tĂ« kodit byte, prania e njĂ« arkivi zip pĂ«rcaktohet nga pĂ«rmbajtja dhe jo nga zgjerimi i skedarit, dmth. nĂ« âskedari.pyâ mund tĂ« vendoset njĂ« arkiv zip dhe kur ekzekutohet me komandĂ«n âpython skedari.pyâ, ai do tĂ« pĂ«rpunoj si njĂ« paketĂ« Python tĂ« kompresuar. NĂ« tĂ« njĂ«jtĂ«n kohĂ«, arkivat ZIP nĂ« Python indeksohen jo sipas titullit nĂ« fillim tĂ« skedarit, por sipas seksionit EOCD (End of Central Directory Record) nĂ« fund tĂ« skedarit. NĂ«se nĂ« arkiv ka skedarin â__main__.pyâ, ky skedar ekzekutohet automatikisht kur arkivi ekzekutohet me komandĂ«n âpython arkiviâ.
Detyra e konkursit u zgjidh duke gjeneruar njĂ« arkiv tĂ« tillĂ« ZIP dhe duke e futur atĂ« nĂ« tekstin e komentit. PĂ«r tĂ« ruajtur correctĂ«sinĂ« e strukturĂ«s sĂ« skedarit nĂ« kushte tĂ« pranisĂ« sĂ« thirrjes âprint(âThanks for playing!â)â nĂ« fund tĂ« skedarit burimor, u shfrytĂ«zua prania nĂ« seksionin EOCD tĂ« njĂ« zone komenti, e vendosur nĂ« fund.

Burimi: opennet.ru
