Kryptokaffe-2024
Utmaningar
Nedan hittas lösningar/write-ups till 17 utav 21 av de utmaningar som ingick i tävlningen. De lösningar som saknas är Sockerkakan, Motangreppet (del 3), Kärleksbrevet och Gordon.
1. Målarboken
I utmaningen får vi en png fil, malarboken.png.
Vi öppnar bilden i programmet stegsolve och bläddrar igenom de olika planen i bilden. I Alpha plane 0 hittar vi flaggan!
Flagga: Fika[flaggad_webbkaka]
2. Receptsystemet
Vi får en .dll fil. Denna öppnar vi i decompilern ILSpy och hittar två strängar som ser ut att vara base64 kodade.
T3J0alt2bm1qYWtuY2phcGHDpG1tbl0=
RGVuIGV4a2x1c2l2YSBjaGVmc2dyw6RkZGVu
Vi avkodar dessa strängar och får följande resultat.
echo "T3J0alt2bm1qYWtuY2phcGHDpG1tbl0=" | base64 -d
Ortj[vnmjakncjapaämmn]
echo "RGVuIGV4a2x1c2l2YSBjaGVmc2dyw6RkZGVu" | base64 -d
Den exklusiva chefsgrädden
Strängen Ortj[vnmjakncjapaämmn] ser ut som caesar cipher. Vi slänger in strängen i cyberchef.io och kollar.
Vi hittade flaggan!
Flagga: Fika[medarbetargrädde]
3. Sommargåvan
Vi får en OpenDocument-fil som innehåller talen c, n och e. Detta är vanliga benämningar inom RSA-kryptering. Problemet är att vi saknar p och q som är primtalsfaktorer av n. Vi behöver på något sätt faktorisera n så att n = p * q. Efter många försök att hitta kända primtalsfaktorer till n, hittar vi tillslut ett långt tal genom att köra kommandot strings på filen vi fått.
strings -n 10 tack-for-ditt-bidrag.trash ...130958128470176100902720469380446369109326974758924912532214019651956038963911 6838960301206207293930404942737550560546329091624178228168502563099352013759535333 1762765238773531966843780040740991042564035202910432218905055509473995187345325227 9431745963764163773149308333026431316853706209684022163410911535707....
Detta kan vara talet p vi söker. Vi testar om talet är jämnt delbart med n.
n % p = 0
Mycket riktigt. Då behöver vi bara p också för att kunna avkoda c. Vi delar n på p för att få q.
q = n // p 167489004754113381575646573385775423908762434825121835425295084286942872299379597 0576511509176449986045593902930206838098284478849502180287792684284407900113758532 7503588904767204621342155313407927205915609444363719120082142917481657351458536430 9272949198358328162584475701977560746775204303956007366908892313
Nu har vi allt vi behöver för att avkoda c. Nedan är pythonkoden vi använder för att avkoda ciphern och få flaggan.
from Crypto.Util.number import inverse
n = 21934046601931115950262607334962177415966529285655394986998697521115725837524 1865663506733237667796861222678945403251356872902927638823761990530911264054621059 6387040246342891361899688626194789593419089571337765959721084417511079023438757657 3202363791433960415429285583890508209515125022308897872289452348734447613129809600 1427357283933705932860154979585257137143259226193036001034808967840742577013625672 6352024930193428163545953758464805684851975902726770680112585425713165643191137879 6241070143227182598117602703775449844464865306381705180708921329170826204009041913 764504722984914977324665563377071372889117320291
p = 13095812847017610090272046938044636910932697475892491253221401965195603896391 1683896030120620729393040494273755056054632909162417822816850256309935201375953533 3176276523877353196684378004074099104256403520291043221890505550947399518734532522 79431745963764163773149308333026431316853706209684022163410911535707
q = 16748900475411338157564657338577542390876243482512183542529508428694287229937 9597057651150917644998604559390293020683809828447884950218028779268428440790011375 8532750358890476720462134215531340792720591560944436371912008214291748165735145853 64309272949198358328162584475701977560746775204303956007366908892313
c = 69478709562161278314442592119155491581461203999205207515899429741045255651620 4577603813950944686720777966965584885324987747961935183741991082029089596058556789 6784211882794450626052110879163757040154102958066538959700957945718578590478429742 7936563501756307601825207517920946305162034481541954098676206979634069291978839381 5211008886061200441499819736863677066524145110416103103721212084652220195998376085 9671910278800904287246258965661063217873238090319841723560480977441539536958293600 2543864113197990844080240084954913004829084447881888830629359030912871544399706554 26659085455798938026289704501553765958431909383
e = 65537
phi = (p-1) * (q-1)
d = inverse(e,phi)
m = pow(c,d,n)
m_hex = hex(m)[2:] # gör om till hex och ta bort 0x
m_bytes = bytes.fromhex(m_hex) # Convertera till bytes
m_ascii = m_bytes.decode('ascii') # gör om till ascii
print(f'Flagga: {m_ascii}')
Flagga: Fika[cipher_cake]
4. 418
När vi kollar igenom källkoden på sidan hittar vi en funktion som heter getSecretKey() och ser att den hämtar en hemlig nyckel “kosmiskstrålning”. Samt en gömd text, “Use the header “Secret-Key”.
Vi tolkar detta som att vi ska inkludera en header i vår request som heter “Secret-Key” som har värdet “kosmiskstrålning”. Vi finner även 2 intressanta CSS-element i sidans källkod.
.endpoint::before { content: 'fi'; color: transparent; }
.endpoint::after { content: 'x-coffee'; color: transparent; }
Varför är dessa transparenta? Vi testar att sätta färg på elementen och får då fram en text mitt på sidan.
“fix-coffee”
Detta verkar vara en URL-endelse. Vi testar att skicka en HTTP GET-request till sidan http://70.34.215.217:5000/fix-coffee och inkluderar vår hemliga header.
'Secret-Key': 'kosmiskstrålning'.
Med denna request lyckas vi få tekannan att fixa kaffe åt oss och får flaggan!
Flagga: Fika[kaffe_med_kosmisk_strålning]
5. Familjearvet
Vi får en PDF-fil med en historia om en familj och choklad. Och en krypterad sträng: usKOcvisr8dZkoIXanrLpQ0aWPbCWwQXWODohLVf67v2nzLE6yI7W/JCU+CjdGoJL1UzhpqDok5Qkx6he mAFhWWcxRAaP/G3Z8SZ6zmJsRR3blIOhskG8ON1XkPZcFQeeNTgXfXaKgBs932/bzoANiXevPq1nYgoMey y4+HYmsv3xVRcvu3/1hevq6GCP8f9Ep0bv+D1u0I7dDlyykL4iMv7x/NqSxD1qAQiS26rO8UwlDoUxe2pk G6la2PfiveEVCB+fVB92BTtd3AS+PlZQ5oeMTP5A8OrnxfLaCVPuMrhNGJrgIyIC1vx48jtxHCwMA/GpQ9 XNsCqcDrlFNgP+A==
Namnet på bakmaskinen “Electronic Cook Book, v128” ger ledtrådar till AES 128 bitars kryptering, specifikt Electronic Code Book (ECB).
Första bokstaven i varje paragraf i PDFen stavar ordet: FAMILJENSCHOKLAD. Vi använder detta ord som nyckel för att avkryptera strängen med hjälp av openssl.
Först sparar vi ciphern till en fil.
echo "usKOcvisr8dZkoIXanrLpQ0aWPbCWwQXWODohLVf67v2nzLE6yI7W/JCU+CjdGoJL1UzhpqDok5 Qkx6hemAFhWWcxRAaP/G3Z8SZ6zmJsRR3blIOhskG8ON1XkPZcFQeeNTgXfXaKgBs932/bzoANiXevPq1n YgoMeyy4+HYmsv3xVRcvu3/1hevq6GCP8f9Ep0bv+D1u0I7dDlyykL4iMv7x/NqSxD1qAQiS26rO8UwlDo Uxe2pkG6la2PfiveEVCB+fVB92BTtd3AS+PlZQ5oeMTP5A8OrnxfLaCVPuMrhNGJrgIyIC1vx48jtxHCwM A/GpQ9XNsCqcDrlFNgP+A==" > ciphertext.b64
Sedan avkodar vi denna fil med base64.
base64 -d ciphertext.b64 > ciphertext.bin
Nu kan vi använda openssl för att avkryptera AES (ECB mode). Observera att nyckeln “FAMILJENSCHOKLAD” (hex: 46414d494c4a454e5343484f4b4c4144) måste vara i hex när den passas till openssl. Vi gör om nyckeln till hex och skriver till en fil.
echo -n "FAMILJENSCHOKLAD" | xxd -p | tr -d '\n' > key.hex
Nu kan vi avkoda ciphern och få flaggan.
openssl enc -aes-128-ecb -d -in ciphertext.bin -out plaintext.txt -K $(cat key.hex)
Flagga: Fika[statlig_chokladkaka]
6. Låtbidraget
I utmaningen får vi en .mp3-fil. Vi öppnar denna mp3-fil i Sonic Visualiser och leker med olika vågformer och spektrum. I spektrogrammet för låten hittar vi ett mönster som ser ut som text.
Kollar man noga kan man utläsa flaggan.
Flagga: Fika[melodisk_mazarin]
7. Reklamfilmen
I början av filmen (ca 6 sekunder in) ser vi en tavla med binära tal uppe till höger i bild.
Vi noterar ner dessa och översätter binärt till text och får flaggan.
Flagga: Fika[konst_kaka]
8. Geniet
Vi öppnar pcap-filen i Wireshark och gör en intressant observation bland nätverkstrafiken i filen. Var tredje sekund görs en request till /api/status. Vid första anblick verkar dessa vara automatiserade, eftersom de sker med 3 sekunders intervaller. Vi tittar närmare på dessa request och ser att de verkar komma från en browser. Detta indikerar att de kanske inte är automatiserade ändå. Vi hittar misstänksamma karaktärer/siffror i början av “User-Agent”.
Vi listar alla liknande request genom att köra strings på filen och filtrera efter “User-Agent”.
strings geniets-trafik.pcapng | grep "User-Agent"
Vi lägger ihop alla karaktärer och siffror framför “/Mozilla/5.0 (Windows NT 10.0…” och översätter dessa från hexadecimal till text och vi får flaggan.
Flagga: Fika[exponerad_längd]
9. Motangreppet Del 1
Vi testar att köra aircrack-ng på .pcap-filen vi fick för att försöka få fram WIFI-lösenordet.
aircrack-ng -w /usr/share/wordlists/wifite.txt -b 82:de:4b:f0:21:40 IKKE_Bageribanditterne_24GHz.cap
Där 82:de:4b:f0:21:40 är BSSID för routern som vi hittar när vi öppnar filen i Wireshark. Detta gav oss lösenordet “1234567812345678”. Lösenordet är 16 tecken vilket för tankarna till att de krypterade strängarna vi fått är krypterade med AES (som i utmaningen Familjearvet). Vi använder detta lösenord som nyckel för att avkryptera strängarna.
0YmbZNZmY+tpHou4id0zs4V8ARz4sa2WYS0lp7GelKM= ← Kaffe&Kage4Hygge!
6YeQb9IyGro8T5/Q0Jp09g== ← sommar2024
SXQncyBteSBsaWZlIDEyMyEgSXQncyBteSBsaWZlIDEyMyEgSXQncyBteSBsaWZlIDEyMyEgSXQncyBte SBsaWZlIDEyMyEgSXQncyBteSBsaWZlIDEyMyEgSXQncyBteSBsaWZlIDEyMyEgSXQncyBteSBsaWZlIDE yMyEg <-it's my life 123! It's my life 123! It's my life 123! It's my life 123! It's my life 123! It's my life 123! It's my life 123!
3IGWY+g0WkmrH9MzSMkgidM1RFK94+/EgrVh2rGelKMNoIs= ← Fika[trådløst_wienerbrød]
Varav den ena ger oss flaggan.
Flagga: Fika[trådløst_wienerbrød]
10. Motangreppet Del 2
Vi börjar med att extrahera data från .pcap-filen vi har fått med programmet tcpflow.
tcpflow -r obi-wlan-sniff.pcapng
Detta ger oss en del intressanta filer, bl.a. ett par bilder och en lösenordskyddad PDF. Vi testar de olika strängarna vi avkrypterade i Motangreppet Del 1 som lösenord till PDFen. Med lösenordet Kaffe&Kage4Hygge! får vi tillgång till filen och flaggan.
Flagga: Fika[skyddad_semla]
11. Utrustningen
Vi använder programmet Ghidra för att decompliera filen vi fått i utmaningen. Efter en del letande hittade vi en intressant base64-sträng.
RmlrYVtlbl9oZW1saWdfa2FmZmVzb3J0XQ==
Noterar ner denna och avkodar base64 och vi har flaggan.
echo "RmlrYVtlbl9oZW1saWdfa2FmZmVzb3J0XQ==" | base64 -d
Flagga: Fika[en_hemlig_kaffesort]
12. Rymdresan
Vi undersöker källkoden på sidan och hittar en intressant text i game.js. “Bra jobbat, “ följt av vad som ser ut som hexadecimal.
Vi avkodar hex och får flaggan.
Flagga: Fika[obfuskerad_men_enkel_bulle]
13. Bakmaskinen
Vi börjar med att köra .exe-filen. Eftersom vi använder linux så öppnar vi den med wine.
wine fikamaskinen.exe
“Vi möts av texten: Välkommen till bakmaskinen! Ange lösenord.” Det verkar som att vi letar efter ett lösenord.
Vi testar att köra strings på .exe-filen.
string -n 10 fikamaskin.exe
Vi bläddrar igenom strängarna i filen och hittar en sektion som verkar väldigt intressant.
Man kan inte riktigt utläsa flaggan men det ser ut som att om man anger lösenordet “bitterbullen” får man flaggan. Vi testar bitterbullen i programmet.
Mycket riktigt. Vi får flaggan.
Flagga: Fika[butterkaka]
14. Logotypen
När vi kör kommandot strings på bilden vi får i utmaningen hittar vi en base64-sträng.
BT0tKgkyIi0/Py4tJyNUVUZp
I beskrivningen till utmaningen står det “.. fullkomligt logisk.” Detta tolkar vi som en ledtråd till den logiska operationen XOR (exclusive OR). Vi testar avkoda strängen från base64 sen använder vi XOR där nyckeln är texten på bilden, CTFKRYPTOKAFFE2024.
Flagga: Fika[kryptokaffet]
15. Poeten
Vi får flera .swm-filer innehållandes fullt av binära tal. Vi börjar med sammanslå alla binära tal från filerna till en stor fil och försöker översätta dessa till text. Det mesta av texten är läsbar direkt men vissa ord går inte att utläsa. Vissa av de oläsliga orden saknar en eller flera bokstäver, som t.ex. “Iߜ��sidered” borde vara “I considered”, ett “c” saknas. Vi letar upp den binära delen som representerar den oläsliga karaktären i denna sträng och byter ut de mot den binära motsvarigheten till “c”. Vi hittar då ett mönster, det verkar som att bitarna är s.k. flippade. Alltså 0 -> 1 och 1 -> 0. Vi flippar bitarna i filen som innehåller alla binära tal med kommandot nedan.
cat binary.txt | tr '01' '10'
Vi översätter sedan resutlatet från binärt to text och finner flaggan.
Flagga: Fika[tre_morotskakor]
16. Romansen
Bland trafiken i filen susp_c2.pcapng finner vi ett intressant mönster i Destination IP. Sista siffran i IP-adressen på varje rad formar ett binärt mönster.
Vi noterar alla sista siffrorna och får de binära talen
01000110 01101001 01101011 01100001 01011011 01110110 01100001 01101110 01101001 01101100 01101010 01011111 01100100 01110010 01101111 01101101 01101101 01100001 01110010 01011101
Vi översätter detta till text och får flaggan.
Flagga: Fika[vanilj_drommar]
17. Quizmästaren
Genom att kolla igenom videorna länkade i beskrivningen får vi följande svar
Svar på frågorna:
- X=IDOR, Y=A01:2021
- vid överföring och vid lagring
- ’ OR 1=1; –
- A04:2021-Insecure Design
- Webbapplikationen var byggd med ett ramverk där standardlösenordet för administratörskontot inte hade bytts (A05:2021)
- X=SAST, Y=SCA, Z=SBOM
- Hon kunde testa hur många inloggningsuppgifter som helst (A07:2021)
- Det är en checksum vilken kan användas som referens för att kontrollera att filen inte har manipulerats.
- Fikamyndighetens forensiska operationer
- Kryptering av känsliga data i överföring
Flagga: Fika[blåbärspaj_med_owaspgrädde]



















