Hoppa yfir í efnið

Falin gögn í myndum

Venjuleg dulritun reynir að fela merkingu skilaboða. Launritun (e. steganography) reynir að fela að skilaboðin séu yfirleitt til.

Myndin getur litið út eins og venjuleg landslagsmynd en samt innihaldið:

  • texta í lýsigögnum,
  • ZIP-safn aftan við myndgögnin,
  • skilaboð í einni litrás,
  • liti í fullkomlega gegnsæjum dílum,
  • bita sem hefur verið breytt örlítið í hverjum díl,
  • viðhengi sem sérstakt launritunartól getur dregið út.

Í þessum kafla einbeitum við okkur að CTF-verkefnum og tilbúnum myndum. Við byrjum alltaf á einföldu prófunum áður en við keyrum tuttugu launritunartól í einu.

Launritun og dulritun geta unnið saman

Falin gögn geta líka verið dulkóðuð. Þá þurfum við fyrst að finna gögnin og síðan að dulráða þau. Að finna tilviljunarkennda bætarunu er því ekki endilega lok lausnarinnar.

Hvar gætu gögnin verið?

Góð fyrsta yfirferð er:

file mynd.png
exiftool mynd.png
xxd -l 32 mynd.png
strings -n 8 mynd.png

Við spyrjum:

  1. Passar skráarendingin við sniðið?
  2. Eru athugasemdir eða undarleg lýsigögn til staðar?
  3. Eru viðbætt gögn eða annað skráarauðkenni inni í skránni?
  4. Er myndin óvenjulega stór miðað við upplausn?
  5. Er alfa-rás eða sérstök litrás til staðar?
  6. Gefur lýsing verkefnisins vísbendingu um bita, liti, gagnsæi eða lög?

Launritun er aðeins ein tilgáta. Í mörgum byrjendaverkefnum er „falin mynd“ bara ZIP-safn aftan við PNG eða texti í Comment-reit.

Æfing: hvaða feluaðferð?

Æfing 1

Tengdu athugun við líklegasta næsta skref:

  1. exiftool sýnir Comment: Z2d7....
  2. strings sýnir PK og flag.txt undir lok PNG-skrár.
  3. Verkefnalýsingin segir „blár er uppáhaldsliturinn minn“.
  4. Myndin er með alfa-rás og stór hluti hennar er ósýnilegur.

Næstu skref eru: skoða Base64, leita að ZIP-gögnum, einangra bláu litrásina og skoða RGB-gildi gegnsærra díla.

Lausn við æfingu 1
  1. Comment: Z2d7...prófa Base64, því stafasettið og reiturinn styðja þá tilgátu.
  2. PK og flag.txtleita að ZIP-gögnum og staðfesta þau með ZIP-tóli.
  3. Vísbending um bláan lit → einangra bláu litrásina.
  4. Gegnsæ myndsvæði → skoða RGB-gildi gegnsærra díla eða alfa-rásina sjálfa.

Litrásir

Litrásir (e. colour channels) aðgreina tölugildi sem mynda lit eða aðra eiginleika myndar. Í RGB-mynd hefur hver díll yfirleitt þrjú litgildi:

R = rautt
G = grænt
B = blátt

RGBA bætir við alfa-rás sem stjórnar gagnsæi.

Díll = (R, G, B, A)

Skilaboð geta verið greinileg í einni rás en falist þegar allar rásir blandast saman.

Einangrum rásir með ImageMagick

magick mynd.png -channel R -separate nidurstodur/raud.png
magick mynd.png -channel G -separate nidurstodur/graen.png
magick mynd.png -channel B -separate nidurstodur/bla.png

Alfa-rás:

magick mynd.png -alpha extract nidurstodur/alfa.png

Við getum aukið birtuskil á nýrri niðurstöðumynd:

magick nidurstodur/bla.png -auto-level nidurstodur/bla-skyr.png

Myndbreyting býr til ný gögn

-auto-level, litaviðsnúningur og önnur vinnsla breyta myndinni. Þau geta gert mynstur sýnilegt en eru ekki frumgögn. Skráðu skipunina og varðveittu óbreytta verkefnisskrá.

Vissir þú?

Litmynd á skjá er sambland af rauðu, grænu og bláu ljósi. Þegar við einangrum rás erum við ekki að „finna leynilegt lag“ í öllum myndum; við sýnum eitt talnagildi úr hverjum díl sem grámynd.

Æfing: hvaða rás?

Æfing 2

Mynd virðist næstum grá, en Comment-reiturinn segir:

G er ekki bara fyrir grænt — það geymir svarið.

Hvaða skipun er skynsamlegt að prófa fyrst?

Lausn við æfingu 2

Einangrum grænu rásina:

magick mynd.png -channel G -separate nidurstodur/graen.png

Ef skilaboðin eru mjög dauf getum við búið til annað afleitt afrit:

magick nidurstodur/graen.png -auto-level nidurstodur/graen-skyr.png

Við prófum ekki allar mögulegar umbreytingar fyrst; bókstafurinn G og litavísbendingin styðja þessa leið.

Gagnsæir dílar geta enn haft lit

Alfa-gildið 0 þýðir yfirleitt að díll sé alveg gegnsær. RGB-gildin geta samt verið til:

(255, 0, 0, 0)

Myndskoðari sýnir engan rauðan díl vegna alfa-gildisins, en hráu litgildin eru enn rauð. CTF-höfundur getur teiknað skilaboð í RGB-gildum og gert þau ósýnileg með alfa-rásinni.

Ein leið til að hunsa alfa-rásina er að setja myndina á þekktan bakgrunn eða skoða rásirnar sérstaklega. Með ImageMagick getum við til dæmis fjarlægt alfa með hvítum bakgrunni:

magick mynd.png -background white -alpha remove -alpha off nidurstodur/an-alfa.png

Það sýnir þó ekki alltaf RGB-gildi sem voru undir fullkomnu gagnsæi á þann hátt sem við viljum. Rásaaðskilnaður eða lítið Python-forrit gefur okkur nákvæmari stjórn.

Sýnidæmi með Pillow

Eftirfarandi dæmi þarf Python-safnið Pillow:

from PIL import Image

mynd = Image.open("mynd.png").convert("RGBA")

for i, (r, g, b, a) in enumerate(mynd.getdata()):
    if a == 0 and (r, g, b) != (0, 0, 0):
        print(i, r, g, b)

Forritið finnur fullkomlega gegnsæja díla sem hafa samt litagildi. Það sannar ekki að þau myndi skilaboð, en gefur okkur mælanlega vísbendingu.

Gildislægsti bitinn

Hvert litgildi er oft tala frá 0 til 255, það er átta bitar. Gildislægsti bitinn (e. least significant bit, LSB) er bitinn lengst til hægri og hefur minnst áhrif á töluna.

200 = 11001000
201 = 11001001
               ↑ aðeins síðasti bitinn breyttist

Að breyta rauðu gildi úr 200 í 201 er yfirleitt mjög erfitt að sjá. En síðasti bitinn getur geymt 0 eða 1. Ef við söfnum einum bita úr mörgum dílum getum við myndað bæti og síðan texta.

Sýnidæmi: eitt bæti í átta gildum

Rauðu gildin eru:

100, 101, 102, 104, 106, 108, 110, 111

Við tökum aðeins síðasta bitann, eða jafngilt, athugum hvort talan sé slétt eða oddatala:

100 → 0
101 → 1
102 → 0
104 → 0
106 → 0
108 → 0
110 → 0
111 → 1

Bitarnir verða:

01000001

Það er 0x41, ASCII-stafurinn A.

Æfing: lestu LSB

Æfing 3

Taktu gildislægsta bita talnanna:

120, 121, 122, 125, 126, 128, 131, 133

Settu bitana saman frá vinstri til hægri og túlkaðu sem ASCII.

Lausn við æfingu 3

Oddatala gefur 1 og slétt tala 0:

120 → 0
121 → 1
122 → 0
125 → 1
126 → 0
128 → 0
131 → 1
133 → 1

Bitarnir eru:

01010011

01010011 er 0x53, ASCII-stafurinn S.

Ekki öll bitamynstur eru texti

Faldu gögnin gætu verið mynd, ZIP-safn, þjöppuð runa eða dulkóðuð bæti. Leitaðu að skráarauðkennum eins og PK, %PDF eða PNG áður en þú gerir ráð fyrir UTF-8 texta.

Lesum LSB með Python

Pillow gerir okkur kleift að fara yfir díla. Þetta dæmi les gildislægsta bita rauðu rásarinnar og reynir að mynda bæti:

from PIL import Image

mynd = Image.open("mynd.png").convert("RGB")
bitar = "".join(str(r & 1) for r, g, b in mynd.getdata())

baeti = bytes(
    int(bitar[i : i + 8], 2)
    for i in range(0, len(bitar) - 7, 8)
)

# Í kennsludæminu lýkur skilaboðunum á núllbæti.
skilabod = baeti.split(b"\x00", 1)[0]
print(skilabod)

Þetta gerir margar forsendur:

  • rauða rásin er notuð,
  • byrjað er á fyrsta díl,
  • bitar eru lesnir í þessari röð,
  • átta bitar mynda bæti frá vinstri,
  • núllbæti merkir lok skilaboða.

CTF-vísbendingin þarf að styðja forsendurnar, eða við prófum fáar kerfisbundnar útgáfur og skráum þær.

Bitaplön

Í stað þess að skoða bara síðasta bitann getum við sýnt hvert bitasæti sem svarthvíta mynd. Slík mynd er oft kölluð bitaplan (e. bit plane).

Fyrir átta bita litgildi höfum við plan 0 til 7:

plan 7: gildishæsti bitinn — hefur mest áhrif á myndina
...
plan 0: gildislægsti bitinn — hefur minnst áhrif

Falin teikning eða texti getur orðið greinilegur í plani 0 eða 1 þótt venjulega myndin líti eðlilega út.

Veftól eins og StegOnline geta sýnt litrásir og bitaplön. Ekki hlaða persónulegum eða viðkvæmum myndum í þriðja aðila; notaðu aðeins CTF-gögn sem má senda þangað.

Sérhæfð verkfæri

zsteg

zsteg leitar að algengum bitamynstrum í PNG- og BMP-myndum:

zsteg mynd.png

Víð leit:

zsteg -a mynd.png

-a getur skilað miklum hávaða og tilviljunarkenndum textabrotum. Leitum að niðurstöðu sem:

  • passar við verkefnisvísbendingu,
  • hefur skynsamlegt skráarauðkenni,
  • myndar heilan texta eða gilt skráarsnið,
  • má endurtaka með nákvæmri zsteg-stillingu.

steghide

steghide getur falið gögn í tilteknum JPEG-, BMP-, WAV- og AU-skrám.

Upplýsingar:

steghide info mynd.jpg

Útdráttur með lykilorði sem verkefnið gefur:

steghide extract -sf mynd.jpg -p eldfjall

Við skrifum útdregin gögn í verkefnismöppu og skoðum þau með file áður en þau eru opnuð.

Aperi’Solve og StegOnline

  • Aperi’Solve keyrir mörg greiningartól og sýnir rásir.
  • StegOnline hjálpar við litrásir, bitaplön og einfaldan útdrátt.

Þessi tól eru gagnleg til að finna leið, en lausnin okkar ætti að segja hvaða niðurstaða skipti máli og hvers vegna.

Upphleðsla er gagnasending

Þegar við hleðum mynd í veftól sendum við hana til annars aðila. Gerðu það aðeins með tilbúin verkefnisgögn sem mega fara úr tölvunni.

Verkfæraúttak er ekki sjálfkrafa fáni

Víð leit getur fundið orð eins og:

pass
key
PNG
admin

í tilviljunarkenndum bætum. Við staðfestum frambjóðanda með því að:

  1. endurtaka nákvæma útdráttinn,
  2. skoða bætaröð eða skráarauðkenni,
  3. opna með sniðsértæku tóli,
  4. bera saman við lýsingu og fánasnið,
  5. athuga hvort niðurstaðan leiði eðlilega í næsta lag.

Æfing: hvaða niðurstöðu treystum við?

Æfing 4

zsteg -a mynd.png sýnir 200 línur. Þrjár þeirra eru:

b1,r,lsb,xy  .. text: "key"
b1,b,lsb,xy  .. file: Zip archive data
b3,g,msb,yx  .. text: "Aq!9"

Verkefnalýsingin segir „blátt lag geymir pakka“. Hvaða niðurstöðu skoðum við fyrst?

Lausn við æfingu 4

Við skoðum:

b1,b,lsb,xy .. file: Zip archive data

Ástæðurnar eru:

  • b bendir á bláu rásina,
  • lýsingin nefnir blátt lag,
  • „pakki“ getur vísað á safnskrá,
  • ZIP hefur auðþekkjanlega innri uppbyggingu sem við getum staðfest.

Við drögum frambjóðandann út með nákvæmri stillingu, keyrum file og unzip -t eða unzip -l. Stutta orðið key eitt og sér gæti verið tilviljun.

Myndstærð og gallaðir hausar

Myndhaus geymir oft breidd, hæð og aðrar upplýsingar. Í CTF getur höfundur:

  • sett ranga hæð svo neðri hluti myndar sjáist ekki,
  • skemmt eitt bæti í skráarauðkenni,
  • bætt gögnum eftir endamerki,
  • notað óvænta litatagund eða rás.

Við byrjum á:

file mynd.png
magick identify mynd.png
pngcheck -v mynd.png

Ef haus er gallaður gerum við aðeins breytingu á nýju afriti og skráum nákvæmlega hvaða bæti breyttist. Við prófum ekki handahófskenndar stærðir þar til fáni birtist nema verkefnið gefi skýra vísbendingu.

Lokaverkefni: mynd sem hvíslar

Æfing 5

Verkefnið segir:

Augað sér ekki allt. Blátt, gegnsætt og síðast en ekki síst.

file staðfestir RGBA PNG-mynd. exiftool sýnir engin áhugaverð athugasemd og engin viðbætt ZIP-gögn finnast.

Skrifaðu skipulega greiningaráætlun.

Möguleg lausn við æfingu 5
  1. Halda óbreyttu afriti og vinna í niðurstöðumöppu.
  2. Einangra bláu rásina, því lýsingin segir „Blátt“:
magick mynd.png -channel B -separate nidurstodur/bla.png
  1. Skoða alfa-rásina, því „gegnsætt“ er bein vísbending:
magick mynd.png -alpha extract nidurstodur/alfa.png
  1. Skoða RGB-gildi fullkomlega gegnsærra díla með Pillow ef venjulegar rásir sýna ekkert.
  2. Skoða gildislægsta bita bláu rásarinnar, því „síðast en ekki síst“ gæti vísað á least significant bit.
  3. Keyra markvissa zsteg-leit á bláu rásinni og LSB-röð, frekar en að velja tilviljunarkenndan texta úr allri leitinni.
  4. Staðfesta útdregin gögn með file, skráarauðkenni eða fánasniði.

Áætlunin breytir orðunum í lýsingunni í þrjár prófanlegar tilgátur: blá rás, alfa/gagnsæi og gildislægsti biti.

Samantekt

Í þessum kafla lærðum við að:

  • launritun felur tilvist upplýsinga en dulritun felur merkingu þeirra,
  • einföld lýsigögn og viðbætt gögn eiga að koma á undan flókinni bitaleit,
  • RGB- og alfa-rásir geta sýnt ólík mynstur,
  • gegnsær díll getur enn geymt RGB-gildi,
  • gildislægsti biti breytir lit lítið en getur geymt einn gagnabita,
  • bitaplön gera einstök bitasæti sýnileg,
  • zsteg, steghide, StegOnline og Aperi’Solve eru hjálpartól, ekki staðgengill staðfestingar,
  • myndhaus og stærðir geta verið viljandi gölluð,
  • við notum verkefnisvísbendingar til að velja rás, bitaröð og verkfæri,
  • við hlöðum ekki viðkvæmum myndum í utanaðkomandi veftól.

Í næsta kafla færum við okkur úr myndum yfir í hljóð: bylgjuform, tíðnir, litrófsmyndir, DTMF-tóna og Morse-kóða.