Hoppa yfir í efnið

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 Nei, ekki eitt og sér .tar
gzip Nei, einn straumur .gz
tar + gzip .tar.gz eða .tgz
ZIP .zip
7z .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?

  1. verkefni.tar getur innihaldið margar skrár án þjöppunar.
  2. gogn.gz er venjulega gzip-þjappaður gagnastraumur.
  3. Að endurnefna safn.zip sem safn.tar.gz umbreytir sniðinu.
  4. ZIP getur bæði pakkað og þjappað.
Lausn við æfingu 1
  1. Rétt. tar safnar skrám í eina runu og þarf ekki að þjappa.
  2. Rétt. gzip vinnur venjulega með einn straum eða eina skrá.
  3. Rangt. Endurnefning breytir aðeins heitinu.
  4. 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ð:

  1. unzip -l
  2. tar -tf
  3. tar -tzf
  4. 7z l

Sniðin eru .tar, .zip, .tar.gz og .7z.

Lausn við æfingu 2
  • .zipunzip -l safn.zip
  • .tartar -tf safn.tar
  • .tar.gztar -tzf safn.tar.gz
  • .7z7z 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_keys vegna ..,
  • /etc/cron.d/verkefni vegna algildrar slóðar,
  • gogn/../flag.txt vegna .., 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
  1. Halda óbreyttu afriti af gjof.dat og vinna í nýrri möppu.
  2. Staðfesta ZIP með file og skoða listann með unzip -l.
  3. Draga lag1.tar.gz út í lag-01/.
  4. Skoða tar-listann með tar -tzf áður en hann er dreginn út.
  5. Draga leidbeining.txt og mynd.png út í lag-02/.
  6. Lesa leiðbeininguna og staðfesta Comment: norðurljós með exiftool.
  7. Nota binwalk eða bætarstaðsetningu til að skera lok.7z úr afriti myndarinnar í lag-03/.
  8. Skoða lok.7z með 7z l og athuga stærðir og slóðir.
  9. Prófa lykilorðið án útdráttar:
7z t -pnorðurljós lok.7z
  1. 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,
  • file hjá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.