Skrár ljóstra upp um fleira en skráarendingin ein og sér
Í 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. Sjálft innihald skrárinnar, og þá einkum upphafsbætin og innri gerð hennar, varpar hins vegar skýrara ljósi á eðli hennar.
Í þessum kafla munum við nýta okkur:
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 þeirra verkfæra sem hér verða kynnt hlutast til um ritun nýrra skráa, auk þess sem við munum freista þess að lagfæra gallaða skráarhausa. Varðveitið ávallt óhreyft afrit af sjálfri verkefnisskránni og hlutist til um að rita niðurstöður í sérstaka möppu.
Skráarending er ekki skráarsnið
Stýrikerfi og notendur styðjast iðulega við skráarendingu (e. file extension) sem mikilvæga vísbendingu:
mynd.jpg
skjal.pdf
kippuskra.zip
Hins vegar er okkur í lófa lagið að endurnefna skrár án þess að svo mikið sem einu bæti sé hnikað til í innihaldinu:
mv mynd.png leyndarmal.txt
Skráin telst því enn vera PNG-mynd. Sú staðreynd að heitinu hafi verið breytt hróflar síst af öllu við sjálfu innihaldinu.
Sýnidæmi: endingin lýgur
file leyndarmal.txt
Frálag:
leyndarmal.txt: PNG image data, 640 x 480, 8-bit/color RGB
Nú liggja fyrir tvær veigamiklar athuganir:
- heiti skrárinnar endar á
.txt, filegreinir innihaldið sem PNG.
Af þessu má draga þá varfærnislegu ályktun að skráarendingin fellur engan veginn saman við sjálft skráarsniðið. Okkur er enn hulið hver það var sem hlutast til um endurnefninguna, eða í hvaða tilgangi slíkt var gert.
Vissir þú?
Ákveðin myndræn stýrikerfi eiga það til að hylja algengar skráarendingar sjálfkrafa. Við þær kringumstæður gæti skrá, sem í fljótu bragði virðist bera heitið mynd.jpg, í raun heitið hinu ískyggilega nafni mynd.jpg.exe. Af þessu leiðir að okkur er síst af öllu fært að leggja traust á táknmyndir eða hið sýnilega heiti sem óyggjandi sönnur á eðli skrár.
Æfing: hvað gerði endurnefningin?
Æfing 1
Nemandi keyrir:
mv verkefni.zip verkefni.jpg
Hverjar af eftirfarandi staðhæfingum teljast réttar?
- ZIP-kippuskráin hefur tekið breytingum og telst nú vera JPEG-mynd.
- Heiti skrárinnar breyttist.
- Innihald skrárinnar stendur óhreyft, svo fremi sem
mv-skipunin hafi verið framkvæmd með eðlilegum hætti innan sama skráakerfis. - Myndaforrit verður örugglega að geta opnað skrána.
Lausn við æfingu 1
Staðhæfingar 2 og 3 teljast réttar.
mv breytir heitinu eða staðsetningunni en framkvæmir enga ZIP-í-JPEG-umbreytingu. Myndvinnsluforrit gæti því hæglega hafnað því að opna skrána á þeim forsendum að innihaldið sé í raun enn ZIP-kippuskrá.
Við getum staðfest með:
file verkefni.jpg
Skráarauðkenni og töfrabæti
Fjölmörg skráarsnið eiga það sammerkt að hefjast á tiltekinni bætarunu sem nefnist 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 |
að jafnaði ólæsilegt |
25 50 44 46 2d |
%PDF- |
|
| ZIP | 50 4b 03 04 |
PK.. |
| ELF | 7f 45 4c 46 |
.ELF |
| gzip | 1f 8b |
ólæsilegt með öllu |
Verkfærið file styðst við viðamikinn gagnagrunn slíkra merkja, auk annarra ítarlegra reglna. Okkur er sömuleiðis fært að rýna í bætin sjálf:
xxd -l 16 leyndarmal.txt
Dæmi um frálag:
00000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR
Upphafsbætin átta falla alfarið saman við PNG-skráarauðkennið.
Haus og endamerki
Haus (e. header) nefnist sá upphafshluti skrár sem iðulega geymir skráarauðkenni og fyrirmæli um úrvinnslu gagnanna.
Til eru skráarsnið sem skarta sömuleiðis auðþekkjanlegu 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.
Þessi merki teljast mikilvægar vísbendingar, þótt endur og eins ríði á að færa sönnur á sjálfa innri gerð skrárinnar sömuleiðis. Hversdagsleg textaskrá gæti hæglega hafist á rununni %PDF-, án þess þó að hún teljist á nokkurn hátt gilt PDF-skjal.
Æfing: þekktu sniðið
Æfing 2
Hvert af eftirfarandi sniðum telst líklegast, sé tekið mið af upphafsbætunum?
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 dæmigert upphaf á ZIP-færslu.25 50 44 46 2dmá ráða sem textann%PDF-, sem gefur til kynna að þarna sé PDF-skjal á ferð.7f 45 4c 46vísar til ELF-sniðsins, sem er algengt snið keyranlegra skráa í Linux-umhverfinu.ff d8 ffer einkennandi upphaf á JPEG-mynd.
Við skulum engu að síður gæta þess að keyra file-skipunina og, ef rík ástæða þykir til, nýta sérhæfð verkfæri til þess að ganga úr skugga um að innri gerðin sé sannanlega gild.
file og MIME-gerðir
Hin hversdagslega skipun hljóðar svo:
file skra
Með því að beita MIME-stillingunni hljótum við staðlaðari lýsingu, af því tagi sem tölvuforrit nýta iðulega:
file --mime-type skra
Dæmi:
skra: image/png
Slík vinnubrögð geta reynst okkur giftudrjúgt þegar glímt er við netþjóna eða fjölda skráa sem skipta hundruðum.
Eigi að rýna í heila möppu, er þessi leið fær:
file vinnuafrit/*
Leitaðu að frávikum
Reynist svo vera að 99 skrár teljast JPEG-myndir, en ein stök .jpg-skrá greinist hins vegar sem ZIP-kippuskrá, er hún sannanlega verðugur upphafspunktur rannsóknar. Sú staðreynd að um frávik sé að ræða jafngildir síst af öllu fána, en hún færir okkur hins vegar skýra og prófanlega tilgátu.
Hrá bæti með xxd
Verkfærið xxd varpar ljósi á bætin í sextándakerfi, auk þess sem það leitast við að sýna okkur læsilega ASCII-stafi til hliðsjónar:
xxd -l 64 skra.bin
00000000: 504b 0304 1400 0000 0800 2a71 5a5b ... PK........*qZ[..
Fyrsta dálkinn skipar sjálf bætarstaðan (e. offset). Gildið 00000000 gefur til kynna að línan hefjist við nákvæmlega fyrsta bæti viðkomandi skrár. Hefjist lína hins vegar á gildinu 00000010, liggur fyrir að hún á upptök sín 16 bætum frá upphafi, enda er staðan rituð í hinu hefðbundna sextándakerfi.
Hér má nefna nokkrar nytsamlegar stillingar:
xxd -l 32 skra.bin # upphafsbætin 32
xxd -s 128 -l 32 skra.bin # 32 bæti sem hefjast við stöðu 128
xxd -g 1 skra.bin # sýna sérhvert bæti út af fyrir sig
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} hefst því við eða í nánu framhaldi af bætarstöðu 32, allt eftir því hvar nákvæmlega fyrsti stafurinn skipar sér á línunni.
Æfing: hex-staða
Æfing 3
xxd sýnir:
00000100: 2550 4446 2d31 2e37 0a25 ... %PDF-1.7.%...
- Við hvaða bætarstöðu í tugakerfi hefst línan?
- Hvaða skráarsnið má telja líklegt að eigi upptök sín þar?
- Hvaða merkingu skyldi slíkt hafa, ef skráin í heild sinni hefst á PNG-skráarauðkenni?
Lausn við æfingu 3
- Gildið
0x100jafngildir tölunni256í hinu hversdagslega tugakerfi. - Runan
%PDF-1.7er vísbending um að þarna leynist 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 hreinlega hvílt þar sem tilviljunarkennd bæti. Okkur ber því að rýna í skráarsniðin og freista þess með varkárni að draga gögnin út úr vinnuafritinu.
Læsilegur texti með strings
Tvíundaskrár geta hæglega geymt textaupplýsingar, enda þótt okkur reynist um megn að opna þær sem hversdagsleg textaskjöl. Verkfærið strings leitar skipulega að runum prentanlegra stafa:
strings skra.bin
Okkur er fært að gera kröfu um lágmarkslengd runu til þess að draga úr óþarfa suði:
strings -n 8 skra.bin
Dæmi:
IHDR
Created with ExampleTool 2.1
password_hint=eldfjall
IEND
Þetta færir okkur dýrmætar vísbendingar um myndsniðið sjálft, þau verkfæri sem nýtt voru og mögulega hnitmiðaða vísbendingu um lykilorð.
Texti er ekki alltaf sönnun
Hafa ber í huga að strings-verkfærið hefur enga vitneskju um raunverulega merkingu textans. Orðið password gæti hæglega reynst vera hluti af frumkóða forrits, villumelding eða hrein og klár tilviljun. Færið staðsetninguna til bókar og rýnið í samhengið löngu áður en nokkur endanleg ályktun er dregin.
Textakóðun skiptir máli
Í sinni sjálfgefnu mynd leitar strings-verkfærið einkum að hversdagslegum ASCII-líkum runum. Texti sem ritaður er í UTF-16 eða öðrum gerðum kóðunar getur hæglega farið fram hjá leitinni, eða birst okkur sem einstakir stafir með núllbætum á milli.
Í GNU-útgáfunni af strings é okkur til að mynda fært að láta reyna á 16 bita texta með lágenda-sniði (e. little-endian):
strings -e l skra.bin
Við skulum því minnast þess dýrmæta lærdóms úr kaflanum um gögn, að sú staðreynd að engin læsileg runa finnist felur engan veginn í sér að ekkert textaefni sé að finna í skránni.
Gögn aftan við skrá
Til eru þau skráarsnið sem heimila tölvuforritum að láta staðar numið við lesturinn undireins og endamerki verður á vegi þeirra. Þá geta aukabæti verið aftan við gilt skjal án þess að venjulegur myndskoðari kvarti.
[PNG-haus ... PNG-gögn ... IEND][ZIP-gögn]
Myndvinnsluforritið birtir okkur PNG-myndina eina og sér. Rannsakandi gæti hins vegar hæglega haft uppi á rununni PK\x03\x04 í kjölfar sjálfs PNG-lokanna.
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 frálagið er:
4096
þá kom fyrsta ZIP-skráarauðkennið í ljós við bætarstöðu 4096.
Okkur er þá fært að skera gögnin út úr sjálfu 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:])
Í kjölfarið rýnum við í skrána, án þess þó að flýta okkur um of við að afþjappa innihaldið:
file nidurstodur/falid.zip
unzip -l nidurstodur/falid.zip
Fyrsta merkið er ekki alltaf rétta byrjunin
Bætarunan PK\x03\x04 kann hæglega að skjóta upp kollinum innan um önnur gögn, auk þess sem ZIP-kippuskrár geta búið yfir mun flóknari innri gerð. Við skulum því ávallt færa sönnur á niðurstöðuna með viðeigandi ZIP-verkfærum og með hliðsjón af samhengi rannsóknarinnar.
Æ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. Með hvaða hætti myndir þú freista þess að færa sönnur á 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:])
Í kjölfarið gefst okkur kostur á að kanna eftirfarandi:
file nidurstodur/falid.pdf
pdfinfo nidurstodur/falid.pdf
sha256sum nidurstodur/falid.pdf
Skipunin file sker úr um gerðina, á meðan pdfinfo leitast við að rýna í sjálfa innri PDF-gerðina, og SHA-256-tætigildið auðkennir svo niðurstöðuna með óyggjandi hætti. Geri pdfinfo-verkfærið athugasemdir, gæti það bent til þess að PDF-skráin sé skemmd, að hún nái skemur en ytri skráin gefur til kynna, eða hreinlega að merkið hafi reynst vera blekking.
Gallaður haus
Innan ramma gagnaglímuverkefna getur svo farið að stakt bæti í skráarhaus reynist vera rangt. Við þær aðstæður brestur hversdagsleg forrit alla vitneskju um eðli skrárinnar.
Leikum okkur með þá tilhugsun að vinnuafritið hefjist með þessum hætti:
00 50 4e 47 0d 0a 1a 0a
Hinu réttmæta PNG-skráarauðkenni ætti hins vegar að vera þannig háttað:
89 50 4e 47 0d 0a 1a 0a
Svo virðist því vera sem fyrsta bætinu hafi verið hnikað til úr gildinu 0x89 yfir í 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ð gætum þess að rita hina nýju skrá í möppuna nidurstodur/; við skulum fyrir alla muni forðast að rita yfir sjálfa verkefnisskrána sem stendur óhreyfð.
Við svo búið færum við sönnur á verkið:
file nidurstodur/lagad.png
sha256sum nidurstodur/lagad.png
Ekki gera við eftir ágiskun einni
Við hlutumst til um breytingu á bætinu á þeim forsendum að sjö af átta upphafsbætum féllu saman við PNG-sniðið, auk þess sem samhengi verkefnisins rann stoðum undir þá tilgátu að um mynd væri að ræða. Varist að grípa til handahófskenndra breytinga í þeirri von einni að forrit nái loks að opna skrána; slíkt vinnulag getur hæglega þurrkað út önnur dýrmæt ummerki.
Skráarendurheimt eftir auðkennum
Það vinnulag, að leita skipulega að skráarhausum og endamerkjum innan viðamikilla gagnasafna og draga skrár þaðan út, nefnist skráarendurheimt eftir auðkennum (e. file carving).
Sú aðferð reynist einkar giftudrjúg þegar svo ber undir að:
- sjálft skráakerfið sé annaðhvort fjarverandi eða skemmt,
- skrá hefur verið eytt en bætin eru enn til,
- fjölmargar skrár leynist innan einnar og sömu hráu verkefnisskrárinnar,
- gögnum hafi verið skeytt saman í eina heild.
Hafa ber þó hugfast að þessi aðferð á sínar takmarkanir:
- skráin getur hvílt sundurslitin á miðlinum (e. fragmented),
- endamerkið sjálft kann að vera fjarverandi,
- nákvæmlega sama bætaruna gæti hafa orðið til fyrir eina tómasta tilviljun,
- skráarheiti og önnur lýsigögn eiga það gjarnan til að glatast með öllu,
- þjöppuð eða dulrituð gögn skarta síst af öllu ávallt auðþekkjanlegum merkjum.
Verkfæri á borð við binwalk, foremost og scalpel geta vissulega komið okkur að góðum notum, en hafa ber í huga að þau færa okkur einvörðungu mögulega frambjóðendur, en síst af öllu óskeikular lokaniðurstöður.
Vissir þú?
Heitið carving vísar til þess vinnulags að „skera“ tiltekna skrá út úr hráum gagnabunka í samræmi við mynstur 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
Endur og eins reynist unnt að smíða skrá sem fleiri en einu forriti auðnast að túlka með gildum hætti. Slíkar skrár nefnast fjölsniðsskrár (e. polyglot files).
Svo gæti farið að eitt forrit greini skrána sem mynd, á meðan annað lítur á hana sem skráasafn. Þetta helgast af því að ólík skráarsnið styðjast við mismunandi reglur er varða:
- staðsetningu skráarhausa,
- meðferð aukagagna sem heimilt er að láta sem vind um eyru þjóta,
- hvar skrá endar,
- hvernig tekið er á athugasemdum og óþekktum gagnabálkum.
Varist að draga þá ályktun að fjölsniðsskrá sé sjálfkrafa skaðleg í eðli sínu. Hún þjónar okkur hins vegar sem mikilvæg áminning um að ein og sama skráin getur búið yfir fleiri en einni merkingu, allt eftir því hvaða verkfæri fær hana til úrvinnslu.
Samsett CTF-greining
Æfing 5: sumar.jpg
Þú færð eftirfarandi frálag ú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
Ritið niður rökstudda greiningaráætlun og færið til bókar að minnsta kosti þrjár athuganir sem renna stoðum undir hana. Hvað af eftirfarandi telst okkur enn með öllu óheimilt að fullyrða?
Möguleg lausn við æfingu 5
Helstu athuganir:
- Skipunin
filegreinir skrána sem PNG-mynd, þrátt fyrir að skráarheitið endi á hinu blekkjandi.jpg. - Upphafsbætin átta falla alfarið saman við hið réttmæta PNG-skráarauðkenni.
- Verkfærið
stringshafði uppi á textanumleidbeining.txtauk hnitmiðaðrarPK-runu. - Python-rannsókn leiðir í ljós ZIP-skráarauðkenni við bætarstöðu 24576.
Fyrirhuguð áætlun:
- Varðveita ávallt óhreyft afrit og færa SHA-256-tætigildi verkefnisskrárinnar til bókar.
- Skera gögnin út, frá og með bætarstöðu 24576, og vista þau í nýja skrá innan möppunnar
nidurstodur/. - Beita skipununum
fileogunzip -lá hina útdregnu skrá. - Færa til bókar allar skipanir, tætigildi og sjálft frálagið.
- Gæta þess að afþjappa innihaldið einvörðungu ef innri gerð ZIP-safnsins stenst stranga staðfestingu.
Atriði sem enn telst óheimilt að fullyrða um:
- að ZIP-kippuskráin sé sannanlega óskemmt í heild sinni,
- að skráin
leidbeining.txtgeymi í raun sjálfan fánann, - hver það var sem hlutast til um að koma ZIP-gögnunum þarna fyrir,
- að skráin hafi í upphafi borið heitið
sumar.jpg.
Samantekt
Í þessum kafla lærðum við að:
- skráarending og skráarsnið telst síst vera eitt og hið sama,
- skráarauðkenni og skráarhausar reynast okkur mikilvægir við greiningu algengra sniða,
- skipanirnar
file,xxdogstringsveita svör við gerólíkum rannsóknarspurningum, - bætarstaða gefur til kynna hvar gögn skipa sér innan sjálfrar skrárinnar,
- gögn geta verið viðbætt eða innfelld í annarri skrá,
- gallaða skráarhausa má endur og eins lagfæra í nýju vinnuafriti, sé stuðst við rökstudda tilgátu,
- skráarendurheimt eftir auðkennum hlutast til um að finna mögulega frambjóðendur, þótt hafa beri í huga takmarkanir hennar,
- sama skrá getur stundum verið túlkuð sem fleiri en eitt snið,
- sérhvert skref í ferlinu útheimtir rækilega staðfestingu og vandaða skráningu.
Í næsta kafla færum við okkur frá einni skrá yfir í heilar skráakerfismyndir. Við lærum að greina beina skráakerfismynd frá heilum diski, finna diskdeildir og skoða tilbúin CTF-gögn í lesham.