Skrár segja meira en skráarendingin
Í innganginum tókum við birgðatalningu og notuðum file til að finna skrár sem skáru sig úr. Nú skoðum við nánar hvað skrárnar eru í raun og hvernig þær geta falið fleiri gögn en eitt forrit sýnir.
Skrá sem heitir mynd.jpg er ekki endilega JPEG-mynd. Skráarendingin er aðeins hluti af heitinu. Innihald skrárinnar, einkum fyrstu bætin og innri uppbygging hennar, segir okkur meira.
Í þessum kafla ætlum við að nota:
filetil að greina algeng skráarsnið,xxdtil að skoða hrá bæti,stringstil að finna læsilegan texta,- Python til að finna merki og skera út gögn,
- skráarauðkenni, hausa og endamerki til að rökstyðja niðurstöður.
Haltu óbreyttu afriti
Sum verkfæri í þessum kafla skrifa nýjar skrár og við munum jafnvel gera við gallaðan haus. Haltu einu óbreyttu afriti af verkefnisskránni og skrifaðu niðurstöður í sérstaka möppu.
Skráarending er ekki skráarsnið
Stýrikerfi og notendur nota oft skráarendingu (e. file extension) sem vísbendingu:
mynd.jpg
skjal.pdf
safn.zip
En við getum endurnefnt skrá án þess að breyta einu bæti í henni:
mv mynd.png leyndarmal.txt
Skráin er enn PNG-mynd. Að breyta heitinu umbreytir ekki innihaldinu.
Sýnidæmi: endingin lýgur
file leyndarmal.txt
Úttak:
leyndarmal.txt: PNG image data, 640 x 480, 8-bit/color RGB
Við höfum nú tvær athuganir:
- heitið endar á
.txt, filegreinir innihaldið sem PNG.
Varfærin túlkun er að endingin passi ekki við skráarsniðið. Við vitum ekki enn hver endurnefndi skrána eða hvers vegna.
Vissir þú?
Sum myndræn stýrikerfi fela algengar skráarendingar sjálfgefið. Þá getur skrá sem virðist heita mynd.jpg í raun heitið mynd.jpg.exe. Þess vegna ættum við ekki að nota táknmynd eða sýnilegt heiti sem öryggissönnun.
Æfing: hvað gerði endurnefningin?
Æfing 1
Nemandi keyrir:
mv verkefni.zip verkefni.jpg
Hvaða fullyrðingar eru réttar?
- ZIP-safninu var breytt í JPEG-mynd.
- Heiti skrárinnar breyttist.
- Innihald skrárinnar er óbreytt ef
mvtókst venjulega innan sama skráakerfis. - Myndaforrit verður örugglega að geta opnað skrána.
Lausn við æfingu 1
Svar 2 og 3 eru rétt.
mv breytir heitinu eða staðsetningunni en framkvæmir enga ZIP-í-JPEG-umbreytingu. Myndaforrit getur hafnað skránni vegna þess að innihaldið er enn ZIP-safn.
Við getum staðfest með:
file verkefni.jpg
Skráarauðkenni og töfrabæti
Mörg skráarsnið byrja á ákveðinni bætarunu sem kallast skráarauðkenni (e. file signature eða magic bytes).
Algeng dæmi:
| Snið | Fyrstu bæti í hex | Læsileg framsetning |
|---|---|---|
| PNG | 89 50 4e 47 0d 0a 1a 0a |
.PNG.... að hluta |
| JPEG | ff d8 ff |
yfirleitt ekki læsilegt |
25 50 44 46 2d |
%PDF- |
|
| ZIP | 50 4b 03 04 |
PK.. |
| ELF | 7f 45 4c 46 |
.ELF |
| gzip | 1f 8b |
ekki læsilegt |
file notar gagnagrunn af slíkum merkjum og fleiri reglum. Við getum líka skoðað bætin sjálf:
xxd -l 16 leyndarmal.txt
Dæmi um úttak:
00000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR
Fyrstu átta bætin passa við PNG-auðkennið.
Haus og endamerki
Haus (e. header) er upphafshluti sem inniheldur oft auðkenni og upplýsingar um hvernig lesa eigi gögnin.
Sum snið hafa líka auðþekkjanlegt endamerki (e. trailer eða end marker):
- JPEG endar venjulega á
ff d9, - PDF endar oft nálægt
%%EOF, - PNG hefur
IEND-bálk undir lokin.
Merkin eru vísbendingar, en við þurfum stundum að staðfesta innri uppbygginguna líka. Handahófskennd textaskrá gæti byrjað á %PDF- án þess að vera gilt PDF-skjal.
Æfing: þekktu sniðið
Æfing 2
Hvaða snið er líklegast miðað við fyrstu bætin?
50 4b 03 04 14 00 00 0025 50 44 46 2d 31 2e 377f 45 4c 46 02 01 01 00ff d8 ff e0 00 10 4a 46
Lausn við æfingu 2
50 4b 03 04er algengt upphaf ZIP-færslu.25 50 44 46 2dlesst sem%PDF-, svo þetta er líklega PDF.7f 45 4c 46er ELF, algengt keyranlegt snið á Linux.ff d8 ffer upphaf JPEG-myndar.
Við myndum samt keyra file og, ef málið skiptir máli, nota sniðsértækt tól til að staðfesta að öll uppbyggingin sé gild.
file og MIME-gerðir
Einfalda skipunin er:
file skra
Með MIME-stillingu fáum við staðlaðri lýsingu sem forrit nota oft:
file --mime-type skra
Dæmi:
skra: image/png
Þetta getur hjálpað þegar við vinnum með vefþjón eða mörg hundruð skrár.
Til að skoða heila möppu:
file vinnuafrit/*
Leitaðu að frávikum
Ef 99 skrár eru JPEG-myndir en ein .jpg-skrá greinist sem ZIP-safn er hún góður staður til að byrja. Frávik er ekki sjálfkrafa fáni, en það gefur prófanlega tilgátu.
Hrá bæti með xxd
xxd sýnir bæti í sextándakerfi og reynir jafnframt að sýna læsilega ASCII-stafi:
xxd -l 64 skra.bin
00000000: 504b 0304 1400 0000 0800 2a71 5a5b ... PK........*qZ[..
Fyrsti dálkurinn er bætarstaða (e. offset). 00000000 merkir að línan byrji við fyrsta bæti skrárinnar. Ef lína byrjar á 00000010 er hún komin 16 bæti frá byrjun, því staðan er skrifuð í sextándakerfi.
Gagnlegar stillingar:
xxd -l 32 skra.bin # fyrstu 32 bætin
xxd -s 128 -l 32 skra.bin # 32 bæti frá stöðu 128
xxd -g 1 skra.bin # sýna hvert bæti sér
Sýnidæmi: túlka bætarstöðu
00000020: 6767 7b66 756e 6469 647d 0000 0000 0000 gg{fundid}......
00000020 er hex fyrir 32. Textinn gg{fundid} byrjar því við eða rétt eftir bætarstöðu 32, eftir því hvar á línunni fyrsti stafurinn liggur.
Æfing: hex-staða
Æfing 3
xxd sýnir:
00000100: 2550 4446 2d31 2e37 0a25 ... %PDF-1.7.%...
- Við hvaða tugakerfisstöðu byrjar línan?
- Hvaða snið byrjar líklega þar?
- Hvað gæti þetta þýtt ef skráin byrjar sjálf á PNG-auðkenni?
Lausn við æfingu 3
0x100er256í tugakerfi.%PDF-1.7bendir á PDF-skjal.- PNG-skráin gæti innihaldið PDF-gögn frá stöðu 256. Þau gætu verið viðbætt, innfelld eða einfaldlega tilviljunarkennd bæti. Við þurfum að skoða sniðin og reyna varlega að draga út gögnin úr vinnuafriti.
Læsilegur texti með strings
Tvíundaskrá getur innihaldið texta þótt við getum ekki opnað hana sem textaskjal. strings leitar að runum af prentanlegum stöfum:
strings skra.bin
Við getum krafist lengri runa til að minnka hávaða:
strings -n 8 skra.bin
Dæmi:
IHDR
Created with ExampleTool 2.1
password_hint=eldfjall
IEND
Þetta gefur okkur vísbendingar um myndsnið, verkfæri og mögulega lykilorðsvísbendingu.
Texti er ekki alltaf sönnun
strings veit ekki hvað textinn merkir. Orðið password gæti verið hluti af forritakóða, villuskilaboðum eða tilviljun. Skráðu staðsetningu og skoðaðu samhengi áður en þú dregur ályktun.
Textakóðun skiptir máli
Sjálfgefið strings finnur fyrst og fremst einfaldar ASCII-líkar runur. Texti í UTF-16 eða öðrum kóðunum getur farið fram hjá leitinni eða litið út eins og stafur með núllbæti á milli.
Á GNU strings má til dæmis prófa lágenda 16 bita texta:
strings -e l skra.bin
Við þurfum því að muna úr gagnakaflanum að „engin læsileg runa fannst“ þýðir ekki „enginn texti er í skránni“.
Gögn aftan við skrá
Sum skráarsnið leyfa að forrit hætti að lesa þegar það finnur endamerki. Þá geta aukabæti verið aftan við gilt skjal án þess að venjulegur myndskoðari kvarti.
[PNG-haus ... PNG-gögn ... IEND][ZIP-gögn]
Myndaskoðari sýnir PNG-myndina. Rannsakandi gæti líka fundið PK\x03\x04 á eftir PNG-endanum.
Sýnidæmi: finnum ZIP-merki með Python
from pathlib import Path
gogn = Path("mynd.png").read_bytes()
merki = b"PK\x03\x04"
stada = gogn.find(merki)
print(stada)
Ef úttakið er:
4096
fannst fyrsta ZIP-merkið við bætarstöðu 4096.
Við getum skorið gögnin út úr vinnuafritinu:
from pathlib import Path
gogn = Path("mynd.png").read_bytes()
stada = gogn.find(b"PK\x03\x04")
if stada == -1:
raise ValueError("ZIP-merki fannst ekki")
Path("nidurstodur/falid.zip").write_bytes(gogn[stada:])
Síðan skoðum við skrána án þess að draga hana strax út:
file nidurstodur/falid.zip
unzip -l nidurstodur/falid.zip
Fyrsta merkið er ekki alltaf rétta byrjunin
Bætarunan PK\x03\x04 getur komið fyrir inni í öðrum gögnum eða ZIP-safn getur haft flóknari uppbyggingu. Við staðfestum niðurstöðuna með ZIP-tóli og rannsóknarsamhenginu.
Æfing: skerðu út gögn
Æfing 4
Python finnur PDF-merkið %PDF- við bætarstöðu 1024 í vinnuafritinu mynd.bin.
Skrifaðu stutt Python-dæmi sem vistar gögn frá þeirri stöðu í nidurstodur/falid.pdf. Hvernig myndir þú staðfesta niðurstöðuna?
Lausn við æfingu 4
from pathlib import Path
gogn = Path("mynd.bin").read_bytes()
stada = gogn.find(b"%PDF-")
if stada == -1:
raise ValueError("PDF-merki fannst ekki")
Path("nidurstodur/falid.pdf").write_bytes(gogn[stada:])
Síðan getum við athugað:
file nidurstodur/falid.pdf
pdfinfo nidurstodur/falid.pdf
sha256sum nidurstodur/falid.pdf
file athugar gerðina, pdfinfo reynir að lesa innri PDF-uppbyggingu og SHA-256 auðkennir útdregnu niðurstöðuna. Ef pdfinfo kvartar gæti PDF-skráin verið skemmd, endað fyrr en ytri skráin eða merkið verið falskt jákvætt.
Gallaður haus
Í CTF-verkefni getur eitt bæti í haus verið rangt. Venjuleg forrit þekkja þá ekki skrána.
Segjum að vinnuafrit byrji svona:
00 50 4e 47 0d 0a 1a 0a
Rétt PNG-auðkenni ætti að vera:
89 50 4e 47 0d 0a 1a 0a
Fyrsta bætið virðist því hafa breyst úr 0x89 í 0x00.
Sýnidæmi: gerum við vinnuafritið
from pathlib import Path
slod = Path("vinnuafrit/brotin.png")
gogn = bytearray(slod.read_bytes())
if gogn[:8] != bytes.fromhex("00504e470d0a1a0a"):
raise ValueError("Skráin passar ekki við vænta gallaða hausinn")
gogn[0] = 0x89
Path("nidurstodur/lagad.png").write_bytes(gogn)
Við skrifum nýja skrá í nidurstodur/; við skrifum ekki yfir óbreytta verkefnisskrána.
Síðan staðfestum við:
file nidurstodur/lagad.png
sha256sum nidurstodur/lagad.png
Ekki gera við eftir ágiskun einni
Við breyttum bætinu vegna þess að sjö af átta bætum pössuðu við PNG og verkefnissamhengið studdi myndsnið. Handahófskennd breyting þar til forrit opnar skrá getur eyðilagt önnur ummerki.
Skráarendurheimt eftir auðkennum
Að leita að skráarhausum og endamerkjum í stærri gagnasafni og draga skrár út kallast skráarendurheimt eftir auðkennum (e. file carving).
Hún er gagnleg þegar:
- skráakerfið vantar eða er skemmt,
- skrá hefur verið eytt en bætin eru enn til,
- margar skrár eru inni í einni hrárri verkefnisskrá,
- gögn hafa verið sett saman í eina skrá.
Hún hefur takmarkanir:
- skrá getur verið sundurslitin á miðlinum,
- endamerki getur vantað,
- sama bætaruna getur komið fyrir af tilviljun,
- skráarheiti og önnur lýsigögn glatast oft,
- þjöppuð eða dulkóðuð gögn hafa ekki alltaf auðþekkjanleg merki.
Verkfæri eins og binwalk, foremost og scalpel geta hjálpað, en þau gefa okkur frambjóðendur, ekki óskeikular niðurstöður.
Vissir þú?
Orðið carving vísar til þess að „skera“ skrá út úr hráum gögnum eftir mynstri hennar. Aðferðin getur fundið mynd án þess að vita upprunalegt heiti hennar eða möppu — líkt og að finna eina blaðsíðu úr bók án bókarkápunnar.
Fjölsniðsskrár
Stundum er hægt að smíða skrá sem fleiri en eitt forrit túlka á gildan hátt. Slík skrá er kölluð fjölsniðsskrá (e. polyglot file).
Eitt forrit gæti séð mynd en annað skráasafn. Þetta er mögulegt vegna þess að skráarsnið hafa ólíkar reglur um:
- hvar haus má vera,
- hvaða aukagögn má hunsa,
- hvar skrá endar,
- hvernig athugasemdir og óþekktir bálkar eru meðhöndlaðir.
Fjölsniðsskrá er ekki sjálfkrafa skaðleg. Hún er þó áminning um að ein skrá getur haft fleiri en eina merkingu eftir því hvaða forrit les hana.
Samsett CTF-greining
Æfing 5: sumar.jpg
Þú færð eftirfarandi úttak úr vinnuafriti:
$ file sumar.jpg
sumar.jpg: PNG image data, 800 x 600, 8-bit/color RGB
$ xxd -l 8 sumar.jpg
00000000: 8950 4e47 0d0a 1a0a .PNG....
$ strings -n 8 sumar.jpg | tail
Comment: ekkert er eins og það synist
leidbeining.txt
$ python3 finna.py
ZIP-merki fannst við stöðu 24576
Skrifaðu greiningaráætlun og að minnsta kosti þrjár studdar athuganir. Hvað má ekki fullyrða enn?
Möguleg lausn við æfingu 5
Athuganir:
filegreinir skrána sem PNG þótt heitið endi á.jpg.- Fyrstu átta bætin passa við PNG-skráarauðkennið.
stringsfann textannleidbeining.txtog stuttaPK-runu.- Python-leit fann ZIP-hausmerki við bætarstöðu 24576.
Áætlun:
- Halda óbreyttu afriti og skrá SHA-256-gildi verkefnisskrárinnar.
- Skera gögn frá stöðu 24576 í nýja skrá undir
nidurstodur/. - Keyra
fileogunzip -lá útdregnu skrána. - Skrá skipanir, tætigildi og úttak.
- Afþjappa aðeins ef ZIP-uppbyggingin stenst staðfestingu.
Það sem við megum ekki fullyrða enn:
- að ZIP-safnið sé heilt,
- að
leidbeining.txtinnihaldi fána, - hver setti ZIP-gögnin inn,
- að skráin hafi upphaflega heitið
sumar.jpg.
Samantekt
Í þessum kafla lærðum við að:
- skráarending er ekki það sama og skráarsnið,
- skráarauðkenni og hausar hjálpa okkur að þekkja algeng snið,
file,xxdogstringssvara ólíkum rannsóknarspurningum,- bætarstaða segir hvar gögn liggja innan skrár,
- gögn geta verið viðbætt eða innfelld í annarri skrá,
- gallaðan haus má stundum laga í nýju vinnuafriti með studdri tilgátu,
- skráarendurheimt eftir auðkennum finnur frambjóðendur en hefur takmarkanir,
- sama skrá getur stundum verið túlkuð sem fleiri en eitt snið,
- hvert skref þarf staðfestingu og skráningu.
Í næsta kafla skoðum við lýsigögn og tíma: hverju þau geta svarað, hvernig við byggjum einfalda tímalínu og hvers vegna klukkur geta villt um fyrir okkur.