Hoppa yfir í efnið

Dulritun í gagnaglímum

Við höfum nú farið yfir helstu byggingareiningar grunnnámskeiðs í dulritun: klassískar aðferðir, leifareikning, XOR, samhverfa dulritun, tætiföll, HMAC, RSA, Diffie–Hellman og HTTPS.

Núna ætlum við að setja þetta í verklegt samhengi. Í þessum kafla lærum við ekki nýtt stórt dulritunarkerfi. Við lærum vinnulag: hvernig við skoðum þraut, setjum fram tilgátu, prófum hana og vitum hvenær við eigum að leita lengra.

Í gagnaglímum (e. CTF) eru dulritunarþrautir oft viljandi veikar eða einfaldaðar. Markmiðið er að finna fána, til dæmis á forminu gg{...}, með því að greina gögnin og finna veikleikann.

Vinna aðeins í leyfilegu umhverfi

Prófaðu þessar aðferðir á eigin gögnum, í Hakkaraskólanum eða á vettvangi sem heimilar verkefnin. Ekki reyna að lesa eða breyta leyndum gögnum annarra.

Fyrsta spurningin: hvað er þetta?

Þegar við sjáum runu eins og:

U2VjcmV0

er auðvelt að hugsa strax: „Þetta er dulkóðað!“ Betra er að spyrja nokkurra einfaldra spurninga:

  1. Lítur þetta út eins og textakóðun, til dæmis Base64 eða hex?
  2. Eru gögnin í raun bæti sem við ættum að skoða í sextándakerfi?
  3. Sjást vísbendingar um Caesar, XOR eða Vigenère?
  4. Er þetta tætigildi með fastri lengd?
  5. Eru upplýsingar um lykil, algrím, nonce eða RSA-númer gefnar?
  6. Er upphaf eða snið gagnanna þekkt?

Við byrjum á einföldustu mögulegu skýringunni. Það sparar okkur að eyða hálfum degi í RSA þegar svarið var Base64 alla tíð.

Kerfisbundið vinnuferli

1. Lesum lýsinguna vandlega

Í þrautalýsingunni gætu verið vísbendingar um:

  • hvaða algrím var notað,
  • hvort lykillinn sé gefinn eða endurtekinn,
  • hvort gögnin séu kóðuð mörgum sinnum,
  • hvaða skrá eða forrit gaf úttakið,
  • hvort upphafsgildi eða fánasnið sé þekkt.

Stundum er mikilvægasta vísbendingin lítið orð eins og „twice“, „repeated“, „nonce“ eða „small primes“.

2. Skoðum gögnin áður en við breytum þeim

Skrifum niður:

  • lengdina,
  • stafasettið,
  • bil og línuskipti,
  • endurtekningar,
  • hvort lengdin sé deilanleg með 2, 4, 8 eða 16,
  • hvort gögnin séu innan gæsalappa eða með forskeyti eins og 0x.

Ekki eyða upprunalegu gögnunum. Vistaðu afrit svo þú getir farið aftur ef þú framkvæmir aðgerð í rangri röð.

3. Prófum einfaldar umbreytingar

Gagnleg fyrstu próf eru:

  • Base64-afkóðun,
  • hex-umbreyting,
  • URL-afkóðun,
  • ROT13,
  • Caesar með öllum litlum lyklum,
  • leit að læsilegum ASCII-bætum.

Ef útkoman verður ný runa sem lítur enn ólæsilega út skulum við ekki gefast upp. Kannski voru tvö eða fleiri lög notuð.

4. Skrifum lítið hjálparforrit

Við þurfum ekki að smíða heilt kerfi. Lítið Python-forrit sem prófar eina hugmynd er oft nóg:

import base64

texti = "U2VjcmV0"
niðurstaða = base64.b64decode(texti)
print(niðurstaða)
# b'Secret'

Markmiðið er ekki að skrifa flottasta forritið. Markmiðið er að geta prófað tilgátur hratt og endurtekið þær.

5. Staðfestum niðurstöðuna

Ekki treysta einni setningu sem lítur næstum rétt út. Spyrjum:

  • passar allt úttakið?
  • passar þekkt fánasnið?
  • virkar afkóðunin aftur á bak?
  • eru öll bæti meðhöndluð?
  • er útkoman skynsamleg í samhengi þrautarinnar?

Sýnidæmi 1: kóðun, ekki dulritun

Við fáum:

U2VjcmV0

Athugun

Strengurinn notar stafi sem eru algengir í Base64 og er með lengd sem passar við Base64. Við prófum því Base64 áður en við reynum að giska á leynilegan lykil.

Lausn í Python

import base64

gogn = base64.b64decode("U2VjcmV0")
print(gogn.decode())

Útkoman er:

Secret

Þetta var ekki dulkóðað. Enginn lykill kom við sögu.

Æfing 1

Finndu lögin

Afkóða skal:

VTJWemNtVjA=

Prófaðu Base64 oftar en einu sinni.

Lausn við æfingu 1

Fyrsta Base64-afkóðunin gefur:

U2VjcmV0

Það lítur enn út eins og Base64. Við afkóðum aftur:

U2VjcmV0 → Secret

Lykillinn að þrautinni var ekki að finna dulritunarlykil heldur að taka eftir því að gögnin voru kóðuð í tveimur lögum.

Sýnidæmi 2: Caesar með þrautleit

Við fáum:

FDHVDU LV HDVB

Við vitum ekki lykilinn, en Caesar-dulritun hefur mjög fáa möguleika. Við getum prófað þá alla:

def caesar_afkoda(texti: str, lykill: int) -> str:
    svar = []
    for stafur in texti:
        if "A" <= stafur <= "Z":
            grunnur = ord("A")
            stafur = chr((ord(stafur) - grunnur - lykill) % 26 + grunnur)
        svar.append(stafur)
    return "".join(svar)

dultexti = "FDHVDU LV HDVB"
for lykill in range(26):
    print(lykill, caesar_afkoda(dultexti, lykill))

Þegar lykillinn er 3 sjáum við:

CAESAR IS EASY

Æfing 2

Prófaðu alla Caesar-lyklana

Afkóða skal:

LIPPS ASVPH

Prófaðu alla 26 lyklana eða skoðaðu fyrst hvort ákveðin tilfærsla gefi læsilega ensku.

Lausn við æfingu 2

Með lykli 4 færum við hvern staf fjögur sæti til baka:

L → H
I → E
P → L
P → L
S → O

A → W
S → O
V → R
P → L
H → D

Útkoman er:

LIPPS ASVPH → HELLO WORLD

Ef við skrifum forritið okkar út fyrir alla 26 lyklana myndi það einnig finna þetta svar. Við veljum samt ekki lausn bara vegna þess að hún lítur næstum rétt út; hún þarf að mynda skiljanleg skilaboð í öllu úttakinu.

Sýnidæmi 3: XOR og þekkt fánasnið

Í mörgum gagnaglímum byrjar fáni á þekktu sniði, til dæmis gg{. Þetta getur hjálpað okkur að finna XOR-lykil fyrir upphafið.

Við fáum dultexta í hex:

252539362731363f

Við giskum á að frumtextinn sé:

gg{test}

Við berum saman bæti:

Frumtexti: 67 67 7b 74 65 73 74 7d
Dultexti:  25 25 39 36 27 31 36 3f

XOR gefur lykilinn:

67 ⊕ 25 = 42
67 ⊕ 25 = 42
7b ⊕ 39 = 42

Fyrstu lyklabætin eru öll 0x42, sem bendir til þess að einn-bæta lykillinn 0x42 hafi verið endurtekinn.

cipher = bytes.fromhex("252539362731363f")
key = 0x42
plain = bytes(b ^ key for b in cipher)
print(plain)
# b'gg{test}'

Hér er auðvitað veikur og einfaldur lykill. Þetta er nákvæmlega sú tegund galla sem birtist í kennsluþrautum.

Æfing 3

Finndu XOR-lykilinn

Eftirfarandi XOR-dultexti byrjar á þekktu fánasniði:

2424383b2c313e

Frumtextinn byrjar á gg{. Finndu lyklabætið og afkóða síðan strenginn.

Lausn við æfingu 3

ASCII-bæti fánasniðsins eru:

g = 0x67
g = 0x67
{ = 0x7b

Við XOR-um við fyrstu þrjú dultextabætin:

0x67 ⊕ 0x24 = 0x43
0x67 ⊕ 0x24 = 0x43
0x7b ⊕ 0x38 = 0x43

Lykillinn er því 0x43. Við beitum honum á alla bætarununa:

cipher = bytes.fromhex("2424383b2c313e")
plain = bytes(b ^ 0x43 for b in cipher)
print(plain)
# b'gg{xor}'

Fáninn er gg{xor}. Þekkt fánasnið gaf okkur þrjár lykilvísbendingar sem allar pössuðu saman.

Sýnidæmi 4: RSA-lyklar eru ekki texti

Við fáum:

n = 33
e = 3
c = 31

Þetta lítur ekki út eins og Base64 eða venjulegur texti. Lýsingin segir að þetta sé RSA með litlum tölum. Við þurfum að finna frumþættingu n:

33 = 3 · 11

Þá getum við reiknað:

φ(33) = (3 - 1)(11 - 1) = 20

Margföldunarandhverfa e = 3 modulo 20 er d = 7, svo:

pow(31, 7, 33)
# 4

Fáninn eða skilaboðið er þá táknað með tölunni 4 í þessu leikfangsdæmi.

Æfing 4

Greindu veik RSA-gögn

Þú færð:

n = 35
e = 5
c = 8

Út frá fyrri kafla skaltu:

  1. frumþátta n,
  2. finna φ(n),
  3. finna d,
  4. reikna frumtextann.
Lausn við æfingu 4
  1. 35 = 5 · 7, svo p = 5 og q = 7.
  2. φ(35) = (5 - 1)(7 - 1) = 24.
  3. Þar sem e = 5 er margföldunarandhverfan modulo 24 einnig d = 5, því 5 · 5 = 25 ≡ 1 (mod 24).
  4. Dulráðning:
pow(8, 5, 35)
# 8

Frumtextinn er 8.

Í alvöru RSA ættu n og frumþættirnir að vera svo stórir að frumþáttun sé ekki svona auðveld. Þetta er CTF-kennsludæmi, ekki öruggt kerfi.

Verkfærakistan

Python

Python hentar þegar við þurfum að:

  • vinna með bæti,
  • prófa marga lykla,
  • breyta hex í bæti,
  • telja stafi,
  • reikna modulo og stór veldi,
  • skrifa endurtekna aðgerð niður á fáar línur.

Gagnleg föll og söfn:

bytes.fromhex("4142")
bytes.hex()
int("ff", 16)
pow(3, 13, 17)
import hashlib
import hmac
import base64

CyberChef

CyberChef er gagnlegt fyrir fyrstu tilraunir:

  • From Base64
  • From Hex
  • ROT13
  • XOR
  • Frequency analysis
  • Hash

CyberChef er hins vegar ekki hugsað sem staðgengill skilnings. Skráðu alltaf hvaða aðgerðir þú notaðir og í hvaða röð. Annars getur verið erfitt að útskýra lausnina eða endurtaka hana síðar.

openssl

openssl getur reiknað tætigildi og skoðað ýmis snið:

printf 'hello' | openssl dgst -sha256

Það er líka gott að kunna að nota xxd eða hexdump til að sjá hrá bæti:

printf 'hello' | xxd

Ekki nota handahófskenndar openssl enc-skipanir til að hanna nýtt öryggiskerfi. Notaðu þær aðeins þegar þú veist hvaða gagnasnið og stillingar verkefnið gerir ráð fyrir.

Að skrifa góða lausn

Þegar þú hefur leyst þraut skaltu skrifa stutta lausn. Hún ætti að sýna:

  1. Hvað þú tókst eftir.
  2. Hvaða tilgátu þú prófaðir.
  3. Hvaða aðgerð eða forrit þú notaðir.
  4. Hvernig þú vissir að niðurstaðan væri rétt.
  5. Fánann.

Dæmi:

Strengurinn samanstóð eingöngu af Base64-stöfum. Ég afkóðaði hann tvisvar
með base64.b64decode og fékk textann gg{...}. Fyrri afkóðunin gaf aftur
Base64-streng, svo ég vissi að tvö lög voru notuð.

Góð lausn er ekki bara sönnun þess að þú hafir fengið rétt svar. Hún er uppskrift sem annar nemandi getur fylgt og lært af.

Næstu skref

Við höfum nú grunn til að byrja á sérhæfðari verkefnum. Í Næstu skref finnum við valin kennsluefni, ókeypis vettvanga, verkefnaröð og ráð um hvað við getum lært næst.

Þú þarft ekki að kunna allt

Þegar þú lendir á hugtaki sem þú þekkir ekki er það ekki merki um að þú eigir ekki heima í netöryggi. Finndu út hvaða forkunnáttu verkefnið gerir ráð fyrir, lærðu einn nýjan hlut og komdu svo aftur að þrautinni.

Lokaverkefni: vinnuferlið allt saman

Æfing 5

Þú færð þessa lýsingu:

Forritið skilar U2VjcmV0, en eftir Base64-afkóðun fæst KHOOR. Lykillinn er sagður vera „þrír“. Hvað myndir þú gera næst?

Lausn við æfingu 5
  1. Fyrst afkóðum við Base64:
U2VjcmV0 → Secret

Í þessari tilteknu setningu er KHOOR ekki niðurstaðan af Base64-afkóðun U2VjcmV0; það þýðir að lýsingin inniheldur annað hvort tvö ólík gögn eða innsláttarvillu.

  1. Við eigum ekki að halda áfram og láta gögnin passa með valdi. Við myndum athuga upprunalega inntakið og lýsinguna.
  2. Ef raunverulegt inntak væri KHOOR og lykillinn „þrír“ væri vísbending um Caesar-lykil 3, fengjum við HELLO.
  3. Rétt vinnulag er því að greina ósamræmið, prófa hverja tilgátu á réttu gögnunum og skrá hvað gekk ekki upp.

Í kennslubókum er freistandi að gera ráð fyrir að öll dæmi séu fullkomin. Í raunverulegum verkefnum skiptir gagnrýnin athugun á inntakinu miklu máli.

Samantekt

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

  • byrja á að greina gögnin áður en við giskum á flókið algrím,
  • aðgreina kóðun, dulritun og tætigildi,
  • prófa einfaldar aðferðir eins og Base64, hex, ROT13 og Caesar fyrst,
  • nota Python, CyberChef og openssl sem hjálpartól,
  • nýta þekkt fánasnið við XOR-greiningu en ekki neyða gögn til að passa,
  • þekkja veikleika í litlu RSA-verkefni,
  • staðfesta niðurstöður og skrifa endurtakanlega lausn,
  • halda áfram á CryptoHack, Cryptopals og gagnaglímum þegar grunnurinn er kominn.

Þetta lýkur grunnkaflanum okkar um dulritun. Héðan getur þú flogið áfram í sérhæfðari námsefni, með orðaforða, innsæi og verkfæri til að læra nýju hugmyndirnar á eigin spýtur.