Hoppa yfir í efnið

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:

  • file til að greina algeng skráarsnið,
  • xxd til að skoða hrá bæti,
  • strings til 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,
  • file greinir 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?

  1. ZIP-safninu var breytt í JPEG-mynd.
  2. Heiti skrárinnar breyttist.
  3. Innihald skrárinnar er óbreytt ef mv tókst venjulega innan sama skráakerfis.
  4. 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
PDF 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?

  1. 50 4b 03 04 14 00 00 00
  2. 25 50 44 46 2d 31 2e 37
  3. 7f 45 4c 46 02 01 01 00
  4. ff d8 ff e0 00 10 4a 46
Lausn við æfingu 2
  1. 50 4b 03 04 er algengt upphaf ZIP-færslu.
  2. 25 50 44 46 2d lesst sem %PDF-, svo þetta er líklega PDF.
  3. 7f 45 4c 46 er ELF, algengt keyranlegt snið á Linux.
  4. ff d8 ff er 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.%...
  1. Við hvaða tugakerfisstöðu byrjar línan?
  2. Hvaða snið byrjar líklega þar?
  3. Hvað gæti þetta þýtt ef skráin byrjar sjálf á PNG-auðkenni?
Lausn við æfingu 3
  1. 0x100 er 256 í tugakerfi.
  2. %PDF-1.7 bendir á PDF-skjal.
  3. 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:

  1. file greinir skrána sem PNG þótt heitið endi á .jpg.
  2. Fyrstu átta bætin passa við PNG-skráarauðkennið.
  3. strings fann textann leidbeining.txt og stutta PK-runu.
  4. Python-leit fann ZIP-hausmerki við bætarstöðu 24576.

Áætlun:

  1. Halda óbreyttu afriti og skrá SHA-256-gildi verkefnisskrárinnar.
  2. Skera gögn frá stöðu 24576 í nýja skrá undir nidurstodur/.
  3. Keyra file og unzip -l á útdregnu skrána.
  4. Skrá skipanir, tætigildi og úttak.
  5. Afþjappa aðeins ef ZIP-uppbyggingin stenst staðfestingu.

Það sem við megum ekki fullyrða enn:

  • að ZIP-safnið sé heilt,
  • leidbeining.txt innihaldi 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, xxd og strings svara ó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.