Pökkun, þjöppun og rýni í margslungin gagnslög
CTF-verkefni gefur okkur present.zip. Innan þess hvílir pakki.tar.gz, sem aftur hýsir leyndarmal.7z. Þar innst inni leynist svo textaskrá, sem hefur að geyma enn eina Base64-kóðaða textarunu.
Hér má líkja viðfangsefninu við lauk; við ætlum okkur nefnilega að fletta ofan af hverju laginu á fætur öðru.
Í þessum kafla munum við kynnast því hvernig á að:
- greina á milli pökkunar og þjöppunar,
- bera kennsl á algeng skráarsnið með hliðsjón af innihaldi þeirra,
- rýna í kippuskrár löngu áður en þær eru afþjappaðar,
- sýsla með ZIP-, tar-, gzip- og 7z-skrár,
- meðhöndla lykilorðsvarin og skemmd söfn,
- varast varasamar slóðir og svokallaðar þjöppunarsprengjur,
- beita sjálfvirkni við úrvinnslu einfaldra og endurtekinna gagnslaga innan skýrra marka.
Dragðu ekki óþekkta kippuskrá beint yfir heimamöppuna
Kippuskrá getur innihaldið mörg þúsund skráa, undarlegar slóðir eða skrár sem skrifa yfir önnur gögn. Kynnið ykkur því skráalistann af kostgæfni í upphafi og gætið þess að afþjappa innihaldinu í nýja og tóma verkefnismöppu.
Pökkun og þjöppun telst síst vera eitt og hið sama
Pökkun (e. archiving) felst í því að safna fjölmörgum skrám og möppum saman í eina kippuskrá (e. archive file).
mynd.jpg + texti.txt + mappa/ ──► safn.tar
Þjöppun (e. compression) miðar hins vegar að því að lágmarka sjálft gagnamagnið:
safn.tar ──► gzip ──► safn.tar.gz
Verkfærið tar annast að jafnaði pökkun fjölmargra skráa en hróflar síst af öllu við stærð þeirra, nema því aðeins að þess sé sérstaklega óskað. Aftur á móti hlutast gzip til um þjöppun einstakra gagnastrauma, en er síst af öllu ætlað að halda utan um flókna möppuskipan eða mörg skráarheiti.
Hafa ber í huga að ZIP og 7z búa yfir þeim mætti að annast hvort tveggja; pökkun og þjöppun innan sama skráarsniðsins.
| 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 þú?
Heitið tar æi rætur sínar að rekja til ensku orðanna tape archive. Því verkfæri var upphaflega ætlað það hlutverk að rita margvíslegar skrár á segulbönd, en það þjónar okkur þó enn af trúmennsku þrátt fyrir að flestir hafi nú lagt segulböndin á hilluna.
Æfing: pökkun eða þjöppun?
Æfing 1
Hverjar af eftirfarandi staðhæfingum teljast réttar?
- Skráin
verkefni.targetur hæglega hýst fjölda skráa án þess að þær sæti nokkurri þjöppun. gogn.gzer venjulega gzip-þjappaður gagnastraumur.- Sú athöfn að endurnefna
safn.zipyfir ísafn.tar.gzhlutast til um umbreytingu á sjálfu skráarsniðinu. - ZIP-sniðið er þess umkomið að annast hvort tveggja; pökkun og þjöppun gagna.
Lausn við æfingu 1
- Rétt. Rétt. tar hlutast til um að safna skrám í eina samfellda runu, án þess að þjöppun komi þar endilega við sögu.
- Rétt. gzip vinnur venjulega með einn straum eða eina skrá.
- Rangt. Rangt. Endurnefning ein og sér hróflar einvörðungu við heiti skrárinnar, en síst af öllu við innri gerð hennar.
- Rétt. Rétt. ZIP-skrár varðveita fjölmargar færslur og búa yfir þeim eiginleika að geta þjappað innihaldi þeirra hverrar um sig.
Berum kennsl á skráarsnið með hliðsjón af innihaldi
Líkt og vikið var að í fyrri kafla, skulum við síst af öllu leggja traust okkar á skráarendinguna eina saman:
file gjof.dat
Mögulegt frálag:
gjof.dat: gzip compressed data, was "pakki.tar"
Þótt endingin .dat hafi lítið sem ekkert gefið til kynna, þá auðnaðist file-skipuninni að finna þar gzip-skráarhaus, auk þess sem hún ljóstraði upp hinu upprunalega heiti sem hvíldi í lýsigögnunum.
Hér má sjá algeng dæmi um 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!...) |
Hvað tar-sniðið varðar gegnir öðru máli; þar er síst af öllu tryggt að einfalt auðkenni sé að finna í upphafsbætinu. Textarunan ustar skýtur þó iðulega upp kollinum á tilteknum stað í skráarhausnum, og því reynist file-skipunin og tar-verkfærið sjálft okkur giftudrjúgj til staðfestingar.
Sýnidæmi: tvö lög
file lag1.bin
lag1.bin: gzip compressed data
Við skulum nú afþjappa afriti yfir í nýja skrá, án þess að láta skráarendinguna villa um fyrir okkur:
gzip -dc lag1.bin > lag2.bin
file lag2.bin
lag2.bin: POSIX tar archive
-d afþjappar og -c skrifar á staðalfrálag. Með endurvísun (e. redirection) smíðum við nýja skrá og gætum þess að varðveita lag1.bin óhreyfða.
Rýnum í innihaldið áður en afþjöppun hefst
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
Sjálfur skráalistinn getur fært okkur mikilvægar vísbendingar um fánann:
Length Name
------ ----
128 leidbeining.txt
20480 mynd.png
0 ekki_opna/../../grunsamlegt
Viðvörunarbjöllur ættu að hringja þegar síðasta slóðin er virt fyrir sér. Þar er nefnilega gerð tilraun til þess að sleppa út fyrir útdráttarmöppuna með tilstyrk táknanna ...
Gætið að heitum, gildleika og fjölda skráa
Skráarheiti á borð við password.txt, textaskrá af stærðargráðunni 4 GB innan 20 KB ZIP-kippuskrár, eða jafnvel þúsundir endurtekinna gagnslaga, telst allt til skýrra vísbendingar um það sem í vændum er.
Æfing: veldu rétta listarann
Æfing 2
Leiddu í ljós hvaða skipun fellur að hverju skráarsniði:
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
Þótt skipunin 7z l sé þess umkomin að lesa fjölmörg önnur snið en 7z, þá er réttara að hefja leikinn á skipunum sem sniðnar eru að hverju sniði fyrir sig, svo engan vafa léki á því við hvað sé átt hverju sinni.
Afþjöppun í tóma möppu
Hér má sjá dæmi um einfalt verklag:
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ð skulum síst af öllu endurtaka leikinn í blindni. Látum okkur rýna í það sem fram kom og veljum í kjölfarið viðeigandi verkfæri með hliðsjón af hinu raunverulegu skráarsniði.
Hættulegar slóðir
Kippuskrárfærsla getur heitið:
../../.bashrc
eða:
/home/nemandi/mikilvaegt.txt
Varasamt útdráttarverkfæri gæti hæglega tekið upp á því að rita gögn utan sjálfrar verkefnismöppunnar. Þessi veikleiki nefnist iðulega slóðaflakk við útdrátt (e. path traversal eða Zip Slip).
Við skulum standa vörð um öryggi okkar með því að:
- kynna okkur skráalistann í upphafi,
- einskorða afþjöppun við nýjar æfingamöppur,
- styðjast við nýjustu útgáfur verkfæra,
- forðast að beita
sudo-heimildum við útdrátt gagna, - einangra gögn sem teljast sérlega ótraust,
- láta staðar numið komi í ljós að skráarheiti hýsi algildar slóðir eða táknin
...
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")
Hafa ber í huga að hér er einungis um forathugun að ræða, en engan veginn tæmandi öryggisgreiningu. Verkfæri og stýrikerfi kunna að túlka slóðir með margvíslegum hætti, þar á meðal með tilstyrk tákntengla (e. symbolic links) eða Windows-slóða.
Æfing: hvaða nöfn eru varasöm?
Æfing 3
Hvaða færslur skyldu verða til þess að við frestuðum afþjöppun?
myndir/ferd.jpg
leidbeining.txt
../../.ssh/authorized_keys
/etc/cron.d/verkefni
gogn/../flag.txt
Lausn við æfingu 3
Hér blasa við nokkur augljós hættumerki:
../../.ssh/authorized_keysvegna..,/etc/cron.d/verkefnisökum þess að þar er um algilda slóð að ræða,gogn/../flag.txtvegna.., jafnvel þótt ætla megi að lokaslóðin gæti hafnað innan útdráttarmöppunnar að lokinni 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
Umfangslítil kippuskrá getur búið yfir þeim mætti að þenjast út í gríðarlegt gagnamagn. Skrá af því tagi nefnist þjöppunarsprengja (e. decompression bomb eða zip bomb).
Hún færir sér í nyt gögn sem lúta afar vel að þjöppun, svo som langar talnarunur skipaðar núllum, og getur hæglega:
- fyllt geymslumiðla okkar með öllu,
- notað allt minni,
- valdið því að keyrslutími fari úr böndunum,
- hýst fjölmörg gagnslög sem margfalda heildarstærðina jafnt og þétt.
Áður en lagt er í afþjöppun, skulum við huga að eftirfarandi:
- samanlagðri stærð allra óþjappaðra skráa,
- fjölda þeirra færslna sem í kippuskránni leynast,
- hvort þjöppunarhlutfallið telst með einhverjum hætti óeðlilegt,
- hve miklu geymslurými við höfum í raun úr að spila.
unzip -l safn.zip
7z l -slt safn.7z
Vissir þú?
Hinn kunni kennsluskrá 42.zip telst einvörðungu vera nokkrir tugir kílóbæta í þjöppuðu formi, en innri lög hennar eru þó þannig úr garði gerð að þau gætu fræðilega þanist út í heilt petabæti. Engin þörf er á að nálgast þessa skrá er opna hana til þess að meðtaka lærdóminn: Við skulum ætíð rýna í stærðir og setja okkur skýr mörk áður en afþjöppun hefst.
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ðsvarðar kippuskrár
Kippuskrár búa iðulega yfir þeim eiginleika að leyfa okkur að glöggva okkur á skráarheitunum, þrátt fyrir að krafist sé lykilorðs eigi að komast í sjálft innihaldið:
7z l leyndarmal.7z
Við skulum því láta reyna á þær vísbendingar sem verkefnið færir okkur, án þess þó að flýta okkur við útdráttinn:
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ðið kann að leynast í:
- lýsigögnum skrárinnar,
- sjálfu skráarheitinu,
- texta sem birtist á mynd,
- sjálfri verkefnalýsingunni,
- niðurstöðu úr vinnslu fyrri gagnasviða.
Okkur ber síst af öllu að leggja út í viðamikla þrautleit að lykilorði, hafi verkefnið þegar fært okkur skýrar vísbendingar þar um.
Æ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ð skulum láta reyna á það lykilorð sem vænlegast telst til árangurs, ýmist með upprunalegri stafsetningu eða hreinlega með lágstöfum:
7z t -pKATLA safn.7z
Ef það mistekst prófum við katla. 7z t sannreynir kippuskrána án þess að dreifa skrám um diskinn.
Látum okkur færa til bókar hvaða afbrigði það var sem bar árangur. Engin þörf er á að láta reyna á viðamiklar orðabækur með milljónum orða, þegar verkefnið hefur þegar fært okkur bæði fyrirmæli og sjálft heitið upp í hendurnar.
Skemmdar kippuskrár
Fyrsta verk okkar er að láta reyna á sjálfa innri gerðina:
unzip -t safn.zip
gzip -t gogn.gz
7z t safn.7z
Villur kunna að eiga rætur sínar að rekja til:
- hnökra við niðurhal gagna,
- rangra eða hreinlega skemmdra skráarhausa,
- þess að lokahluta skrárinnar vanti með öllu,
- viðbótargagna sem rituð hafa verið framan eða aftan við sjálfa kippuskrána,
- þess að skráin reynist síst af öllu vera á því sniði sem við ætluðum í öndverðu.
Við skulum því ganga úr skugga um þetta að nýju:
file safn.zip
xxd -l 32 safn.zip
sha256sum safn.zip
Ákveðin ZIP-verkfæri bjóða vissulega upp á möguleika til viðgerðar, á borð við skipunina zip -FF; við skulum því gæta þess að beita slíku einvörðungu á afrit og vista ávallt niðurstöðuna í nýja skrá. Hafa ber í huga að viðgerðartól geta hæglega dregið rangar ályktanir eða einvörðungu megnað að endurheimta hluta þeirra færslna sem í hlut eiga.
Samsettar og raðaðar þjöppur
Gzip-skráarsniðið býður upp á þann möguleika að hýsa fleiri en einn þjappaðan gagnastraum í samfelldri röð. Ákveðin verkfæri hlutast til um að afþjappa þeim öllum í einu lagi.
Sömuleiðis getur svo farið að höfundur gagnaglímuverkefnis hafi hreinlega skeytt ZIP-kippuskrá aftan við myndskrá, líkt og vikið var að í kaflanum um skrár:
[PNG-gögn][ZIP-gögn]
Við þær kringumstæður ríður á að leiða í ljós bætarstöðu (e. offset) ZIP-skráarhaussins og skera síðari hlutann út, löngu áður en freistað er notkunar á unzip-skipuninni.
Af þessu má ráða að skráarendingar færa okkur síst af öllu fulla vissu fyrir því hve mörg gagnslög eða snið leynast innan einnar og sömu skrárinnar.
Beiting sjálfvirkni við úrvinnslu ZIP-laga
Sýni það sig að sérhvert gagnslag hýsi ZIP-kippuskrá með einni stakri skrá, getur handavinna við útdrátt þeirra orðið þreytandi til lengdar. Við þær aðstæður er giftudrjúgt að rita hnitmiðað Python-forrit til hjálpar.
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-kippuskrá")
break
else:
raise RuntimeError("Hámarksfjölda laga náð")
Við skulum láta tiltekin öryggismörk skipa veigamikinn sess í lausninni:
- að hámarki 20 gagnslög,
- einvörðungu ein skrá í hverju og einasta lagi,
- stærð óþjappaðra gagna fari síst yfir 10 MiB,
- niðurstöður skuli ætíð vistaðar í okkar eigin vinnumöppu,
- heiti skráa skuli hreinsuð af öllum möpputilvísunum.
Hafa ber í huga að hér er ekki um neitt almennt forritasafn til útdráttar að ræða. Hér er fremur á ferðinni hnitmiðað hjálparforrit, sniðið að nákvæmlega skilgreindu mynstri í gagnaglímu.
Beitið sjálfvirkni á mynstur en forðist óvissuna
Gætið þess að afþjappa fyrstu tveimur eða þremur gagnslögunum handvirkt. Verði rannsakandi var við endurtekið mynstur, er í lófa lagið að rita forrit sem annast verkið og gætir þess jafnframt að láta staðar numið verði fráviks vart.
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.
Ritið niður rökstutta og skipulega leið að lausn viðfangsefnisins.
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ð.
Lögð er áhersla á að lausnin fylgi vísbendingunum samkvæmt hverju gagnasviði fyrir sig, án þess að gripið sé til blindrar þrautleitar eða glannalegrar afþjöppunar yfir óskyldar skrár.
Samantekt
Í þessum kafla lærðum við að:
- pökkun hlutast til um söfnun skráa á meðan þjöppun miðar að því að lágmarka gagnamagnið,
- tar, gzip, ZIP og 7z hafa ólík hlutverk,
filehjálpar þegar endingin er villandi,- ríkt er lagt upp úr því að rýna í skráalista og leggja mat á stærð óþjappaðra gagna löngu fyrir útdrátt,
- skrár innan kippuskrárinnar sem hýsa táknin
..eða algildar slóðir teljast til augljósra hættumerkja, - svokallaðar þjöppunarsprengjur búa yfir þeim hættulega eiginleika að geta þanið umfangslitlar kippuskrár út í stjarnfræðilegar gagnastærðir,
- lykilorð í gagnaglímum leynist iðulega í verkefnalýsingum eða innan fyrri gagnasviða,
- gæta verður þess að láta reyna á gerð skemmdra kippuskráa og grípa einvörðungu til viðgerða á afritum þeirra,
- samsett gagnasöfn kunna að útheimta vandaðan útskurð með hliðsjón af bætarstöðu þeirra,
- öll sjálfvirkni verður að lúta ströngum takmörkunum er varða fjölda gagnasviða, stærð og hve margar skrár á í hlut.
Í eftirfarandi kafla munum við beina sjónum okkar að launritun (e. steganography) og leyndum gögnum innan myndskráa: þar munum við fjalla um litrásir, alfa-rásir, meðferð lægstu bita (e. least significant bits) og kynna verkfæri sem gera okkur kleift að gæst ofan í það sem hversdagslegum myndvinnsluforritum er hulið.