Pökkun, þjöppun og mörg lög
CTF-verkefni gefur okkur present.zip. Inni í því er pakki.tar.gz. Inni í honum er leyndarmal.7z. Þar inni er textaskrá sem inniheldur enn eina Base64-kóðaða runu.
Velkomin í laukinn. Við ætlum að flysja eitt lag í einu.
Í þessum kafla lærum við að:
- greina pökkun frá þjöppun,
- þekkja algeng snið eftir innihaldi,
- skoða safnskrár áður en við drögum þær út,
- vinna með ZIP, tar, gzip og 7z,
- meðhöndla lykilorðsvarin og skemmd söfn,
- forðast hættulegar slóðir og þjöppunarsprengjur,
- sjálfvirknivæða einföld, endurtekin lög með skýrum mörkum.
Dragðu ekki óþekkt safn beint yfir heimamöppuna
Safnskrá getur innihaldið mörg þúsund skráa, undarlegar slóðir eða skrár sem skrifa yfir önnur gögn. Skoðaðu skráalistann fyrst og dragðu út í nýja, tóma verkefnismöppu.
Pökkun og þjöppun eru ekki alveg það sama
Pökkun (e. archiving) safnar mörgum skrám og möppum í eina safnskrá (e. archive file).
mynd.jpg + texti.txt + mappa/ ──► safn.tar
Þjöppun (e. compression) reynir að minnka gagnamagnið:
safn.tar ──► gzip ──► safn.tar.gz
tar pakkar venjulega mörgum skrám saman en þjappar ekki sjálft nema við biðjum það um að nota þjöppunaraðferð. gzip þjappar einum gagnastraumi en býr ekki sjálft til möppuskrá með mörgum heitum.
ZIP og 7z geta bæði pakkað og þjappað í sama sniðinu.
| Snið | Pökkun | Þjöppun | Algeng ending |
|---|---|---|---|
| tar | Já | Nei, ekki eitt og sér | .tar |
| gzip | Nei, einn straumur | Já | .gz |
| tar + gzip | Já | Já | .tar.gz eða .tgz |
| ZIP | Já | Já | .zip |
| 7z | Já | Já | .7z |
Vissir þú?
Nafnið tar stendur fyrir tape archive. Tólið var upphaflega hannað til að skrifa margar skrár í röð á segulband, en lifir góðu lífi löngu eftir að flest okkar hættu að nota segulbönd daglega.
Æfing: pökkun eða þjöppun?
Æfing 1
Hvaða fullyrðingar eru réttar?
verkefni.targetur innihaldið margar skrár án þjöppunar.gogn.gzer venjulega gzip-þjappaður gagnastraumur.- Að endurnefna
safn.zipsemsafn.tar.gzumbreytir sniðinu. - ZIP getur bæði pakkað og þjappað.
Lausn við æfingu 1
- Rétt. tar safnar skrám í eina runu og þarf ekki að þjappa.
- Rétt. gzip vinnur venjulega með einn straum eða eina skrá.
- Rangt. Endurnefning breytir aðeins heitinu.
- Rétt. ZIP geymir margar færslur og getur þjappað innihald þeirra.
Þekkjum sniðið eftir innihaldi
Eins og í síðasta kafla treystum við ekki endingunni einni:
file gjof.dat
Mögulegt úttak:
gjof.dat: gzip compressed data, was "pakki.tar"
Nafnið .dat sagði lítið, en file fann gzip-haus og jafnvel upprunalegt heiti sem gzip-lýsigögn geymdu.
Algeng skráarauðkenni:
| Snið | Fyrstu bæti |
|---|---|
| ZIP | 50 4b 03 04 (PK) |
| gzip | 1f 8b |
| 7z | 37 7a bc af 27 1c |
| xz | fd 37 7a 58 5a 00 |
| RAR | 52 61 72 21 1a 07 (Rar!...) |
Tar er ólíkt: hefðbundin tar-skrá hefur ekki alltaf einfalt auðkenni í fyrsta bæti. Textinn ustar birtist oft við ákveðna stöðu í hausnum, svo file og tar sjálft eru gagnleg til staðfestingar.
Sýnidæmi: tvö lög
file lag1.bin
lag1.bin: gzip compressed data
Við afþjöppum afrit í nýja skrá án þess að treysta endingunni:
gzip -dc lag1.bin > lag2.bin
file lag2.bin
lag2.bin: POSIX tar archive
-d afþjappar og -c skrifar á staðalúttak. Endurvísunin býr til nýja skrá og varðveitir lag1.bin.
Skoðum áður en við drögum út
ZIP
unzip -l safn.zip
Eða:
zipinfo safn.zip
tar
tar -tf safn.tar
Fyrir gzip-þjappað tar:
tar -tzf safn.tar.gz
7z
7z l safn.7z
Skráalistinn getur þegar gefið fánavísbendingu:
Length Name
------ ----
128 leidbeining.txt
20480 mynd.png
0 ekki_opna/../../grunsamlegt
Síðasta slóðin er viðvörunarmerki. Hún reynir að fara út úr útdráttarmöppunni með ...
Leitaðu að nöfnum, stærðum og fjölda
Skrá sem heitir password.txt, 4 GB textaskrá í 20 KB ZIP-safni eða þúsundir endurtekinna laga eru allt vísbendingar um hvað bíður okkar.
Æfing: veldu rétta listarann
Æfing 2
Tengdu skipun við snið:
unzip -ltar -tftar -tzf7z l
Sniðin eru .tar, .zip, .tar.gz og .7z.
Lausn við æfingu 2
.zip→unzip -l safn.zip.tar→tar -tf safn.tar.tar.gz→tar -tzf safn.tar.gz.7z→7z l safn.7z
7z l getur reyndar lesið fleiri snið en 7z, en við byrjum á sniðsértækum skipunum svo skýrt sé hvað við teljum okkur vera með.
Drögum út í tóma möppu
Einfalt vinnulag:
mkdir -p vinnuafrit/lag-01
unzip safn.zip -d vinnuafrit/lag-01
Fyrir tar:
mkdir -p vinnuafrit/lag-02
tar -xf safn.tar -C vinnuafrit/lag-02
Fyrir 7z:
mkdir -p vinnuafrit/lag-03
7z x safn.7z -ovinnuafrit/lag-03
Eftir hvert lag:
find vinnuafrit/lag-03 -maxdepth 2 -type f -printf '%p\n'
file vinnuafrit/lag-03/*
Við endurtökum ekki blint. Við skoðum hvað kom út og veljum næsta tól eftir raunverulegu sniði.
Hættulegar slóðir
Safnfærsla getur heitið:
../../.bashrc
eða:
/home/nemandi/mikilvaegt.txt
Óöruggt útdráttartól gæti skrifað út fyrir verkefnismöppuna. Veikleikinn er oft kallaður slóðaflakk við útdrátt (e. path traversal eða Zip Slip).
Við verjum okkur með því að:
- skoða skráalistann fyrst,
- draga aðeins út í nýja æfingamöppu,
- nota uppfærð verkfæri,
- keyra ekki útdrátt með
sudo, - einangra sérlega ótraust gögn,
- stöðva ef nöfn innihalda algildar slóðir eða
...
Sýnidæmi: einföld slóðaskoðun í Python
from pathlib import PurePosixPath
from zipfile import ZipFile
with ZipFile("safn.zip") as z:
for info in z.infolist():
slod = PurePosixPath(info.filename)
haettuleg = slod.is_absolute() or ".." in slod.parts
print(info.filename, "HÆTTA" if haettuleg else "allt í lagi")
Þetta er forathugun, ekki fullkomið öryggissafn. Tól og stýrikerfi geta túlkað slóðir á fleiri vegu, meðal annars með tákntenglum og Windows-slóðum.
Æfing: hvaða nöfn eru varasöm?
Æfing 3
Hvaða færslur ættu að stöðva okkur áður en við drögum út?
myndir/ferd.jpg
leidbeining.txt
../../.ssh/authorized_keys
/etc/cron.d/verkefni
gogn/../flag.txt
Lausn við æfingu 3
Augljós hættumerki eru:
../../.ssh/authorized_keysvegna..,/etc/cron.d/verkefnivegna algildrar slóðar,gogn/../flag.txtvegna.., jafnvel þótt lokaslóðin gæti lent inni í útdráttarmöppunni eftir einföldun.
Fyrstu tvær færslurnar eru venjulegar afstæðar slóðir. Við notum samt tóma æfingamöppu og uppfært tól.
Þjöppunarsprengjur
Lítil safnskrá getur þanist út í gríðarlegt gagnamagn. Slík skrá er kölluð þjöppunarsprengja (e. decompression bomb eða zip bomb).
Hún nýtir gögn sem þjappast mjög vel, til dæmis langar runur af núllum, og getur:
- fyllt disk,
- notað allt minni,
- valdið löngum keyrslutíma,
- innihaldið mörg lög sem margfalda stærðina.
Áður en við drögum út skoðum við:
- heildarstærð óþjappaðra skráa,
- fjölda færslna,
- óvenjulegt þjöppunarhlutfall,
- hversu mikið laust diskpláss við höfum.
unzip -l safn.zip
7z l -slt safn.7z
Vissir þú?
Fræg kennsluskrá sem nefnist 42.zip er aðeins tugir kílóbæta í þjöppuðu formi en lögin eru hönnuð til að þenjast fræðilega út í petabæti. Ekki þarf að sækja eða opna hana til að skilja lærdóminn: skoðum stærðir og setjum mörk áður en við afþjöppum.
Ekki prófa sprengju af forvitni
Þjöppunarsprengja getur stöðvað tölvuna eða fyllt diskinn. Notaðu tilbúin, skaðlaus sýnidæmi þar sem óþjappaða stærðin er lítil.
Lykilorðsvarin söfn
Safnskrá getur leyft okkur að sjá skráarheiti en krafist lykilorðs fyrir innihaldið:
7z l leyndarmal.7z
Við prófum vísbendingu úr verkefninu án þess að draga út:
7z t -peldfjall leyndarmal.7z
Ef prófið tekst getum við dregið út í nýja möppu:
7z x -peldfjall leyndarmal.7z -ovinnuafrit/lag-04
Lykilorð gæti komið úr:
- lýsigögnum,
- skráarheiti,
- texta á mynd,
- lýsingu verkefnisins,
- niðurstöðu fyrra lags.
Við byrjum ekki á stórri lykilorðaþrautleit ef verkefnið hefur gefið skýrar vísbendingar.
Æfing: hvaðan kemur lykilorðið?
Æfing 4
Verkefnið inniheldur:
safn.7z
mynd.jpg
EXIF-athugasemd myndarinnar segir:
password = nafnið á eldfjallinu
Myndin sýnir textaskiltið KATLA.
Hvað prófar þú fyrst og hvernig?
Lausn við æfingu 4
Við prófum líklegasta lykilorðið með sömu stafsetningu eða eðlilegum lágstöfum:
7z t -pKATLA safn.7z
Ef það mistekst prófum við katla. 7z t sannreynir safnið án þess að dreifa skrám um diskinn.
Við skráum hvaða útgáfa virkaði. Við þurfum ekki að prófa orðabók með milljónum orða þegar verkefnið gaf bæði fyrirmæli og nafnið.
Skemmdar safnskrár
Fyrsta skref er að prófa uppbygginguna:
unzip -t safn.zip
gzip -t gogn.gz
7z t safn.7z
Villur geta stafað af:
- ónákvæmu niðurhali,
- röngum eða skemmdum haus,
- vöntun á síðasta hluta,
- því að fleiri gögn séu framan eða aftan við safnið,
- því að skráin sé ekki það snið sem við héldum.
Við athugum aftur:
file safn.zip
xxd -l 32 safn.zip
sha256sum safn.zip
ZIP-tól bjóða stundum viðgerð, til dæmis zip -FF, en við notum hana aðeins á afriti og vistum niðurstöðuna sem nýja skrá. Viðgerð getur giskað rangt eða aðeins endurheimt hluta færslna.
Samsettar og raðaðar þjöppur
Gzip-snið getur innihaldið fleiri en einn þjappaðan straum í röð. Sum tól afþjappa þá alla í samfellu.
Einnig getur CTF-höfundur einfaldlega límt ZIP-safn aftan við mynd, eins og við sáum í skráarkaflanum:
[PNG-gögn][ZIP-gögn]
Þá þurfum við að finna bætarstöðu ZIP-haussins og skera seinni hlutann út áður en við notum unzip.
Endingarnar segja því ekki alltaf hversu mörg lög eða snið eru í sömu skrá.
Sjálfvirknivæðum einföld ZIP-lög
Ef hvert lag er ZIP-safn með nákvæmlega einni skrá verður handavinnan fljótt leiðinleg. Við getum skrifað afmarkað Python-forrit.
from pathlib import Path
from zipfile import BadZipFile, ZipFile
MAX_LOG = 20
MAX_STAERD = 10 * 1024 * 1024 # 10 MiB á skrá
vinnumappa = Path("vinnuafrit/log")
vinnumappa.mkdir(parents=True, exist_ok=True)
nuverandi = Path("lag0.zip")
for numer in range(1, MAX_LOG + 1):
try:
with ZipFile(nuverandi) as z:
faerslur = [i for i in z.infolist() if not i.is_dir()]
if len(faerslur) != 1:
raise ValueError(f"Vænti einnar skrár, fann {len(faerslur)}")
faersla = faerslur[0]
if faersla.file_size > MAX_STAERD:
raise ValueError("Óþjöppuð skrá er yfir stærðarmörkum")
# Path(...).name fjarlægir möppuhluta úr nafni.
nafn = Path(faersla.filename).name
if not nafn:
raise ValueError("Ógilt skráarheiti")
ut = vinnumappa / f"{numer:02d}-{nafn}"
ut.write_bytes(z.read(faersla))
print(f"Lag {numer}: {ut}")
nuverandi = ut
except BadZipFile:
print(f"Stöðva: {nuverandi} er ekki ZIP-safn")
break
else:
raise RuntimeError("Hámarksfjölda laga náð")
Öryggismörkin eru hluti af lausninni:
- mest 20 lög,
- nákvæmlega ein skrá í hverju lagi,
- mest 10 MiB óþjöppuð stærð,
- úttak alltaf í okkar eigin vinnumöppu,
- möppuhluti úr skráarheitum er fjarlægður.
Þetta er ekki almennt útdráttarsafn. Það er lítið hjálparforrit fyrir nákvæmlega skilgreint CTF-mynstur.
Sjálfvirknivæddu mynstrið, ekki óvissuna
Dragðu fyrstu tvö eða þrjú lög út handvirkt. Þegar þú sérð endurtekið mynstur geturðu skrifað forrit sem gerir einmitt það og stöðvar við frávik.
Lokaverkefni: laukurinn
Æfing 5
Þú færð:
gjof.dat
Athuganir:
$ file gjof.dat
gjof.dat: Zip archive data
$ unzip -l gjof.dat
Archive: gjof.dat
Length Name
------ ----
1024 lag1.tar.gz
$ tar -tzf lag1.tar.gz
leidbeining.txt
mynd.png
leidbeining.txt segir:
lykilorðið er í Comment-reit myndarinnar
exiftool mynd.png sýnir:
Comment : norðurljós
Einnig fylgir lok.7z inni í PNG-skránni samkvæmt binwalk.
Skrifaðu örugga og skipulega lausnaleið.
Möguleg lausn við æfingu 5
- Halda óbreyttu afriti af
gjof.datog vinna í nýrri möppu. - Staðfesta ZIP með
fileog skoða listann meðunzip -l. - Draga
lag1.tar.gzút ílag-01/. - Skoða tar-listann með
tar -tzfáður en hann er dreginn út. - Draga
leidbeining.txtogmynd.pngút ílag-02/. - Lesa leiðbeininguna og staðfesta
Comment: norðurljósmeðexiftool. - Nota
binwalkeða bætarstaðsetningu til að skeralok.7zúr afriti myndarinnar ílag-03/. - Skoða
lok.7zmeð7z log athuga stærðir og slóðir. - Prófa lykilorðið án útdráttar:
7z t -pnorðurljós lok.7z
- Ef prófið tekst, draga út í nýja möppu og skoða lokaskrána með
fileáður en hún er opnuð.
Lausnin fylgir vísbendingunum lag fyrir lag og keyrir ekki blinda þrautleit eða útdrátt yfir aðrar skrár.
Samantekt
Í þessum kafla lærðum við að:
- pökkun safnar skrám en þjöppun minnkar gagnamagn,
- tar, gzip, ZIP og 7z hafa ólík hlutverk,
filehjálpar þegar endingin er villandi,- við skoðum skráalista og óþjappaðar stærðir fyrir útdrátt,
- safnfærslur með
..eða algildum slóðum eru hættumerki, - þjöppunarsprengjur geta þanið lítið safn upp í gríðarleg gögn,
- lykilorð í CTF koma oft úr lýsingu eða fyrra lagi,
- skemmd söfn eru prófuð og aðeins gerð við á afriti,
- samsett gögn geta krafist útskurðar eftir bætarstöðu,
- sjálfvirkni þarf mörk á lögum, stærð og fjölda skráa.
Í næsta kafla skoðum við launritun og falin gögn í myndum: litrásir, alfa-rás, lægstu bita og verkfæri sem geta hjálpað okkur að sjá það sem venjulegur myndskoðari sýnir ekki.