Varje år under cybersäkerhetsmånaden anordnar CERT-SE en öppen CTF och i år var inget undantag. Utmaningen bestod av en nätverksdump som gick att hämta från deras webbplats och målet var att hitta totalt tio flaggor som de gömt i filen.
Nu har sista datum för att skicka in svar passerat och jag har fått tillåtelse från CERT-SE att publicera hur jag tog mig an utmaningen och lyckades hitta alla flaggor.
Stort tack till mina kollegor Anton, Magnus, Martin och Mattias. I år fick vi möjlighet att sätta av en förmiddag för att börja med CTF:en tillsammans, och det var både lärorikt och riktigt roligt.
En CTF är en perfekt teamaktivitet – man lär sig nytt och får träna problemlösning samtidigt som man vässar sina kunskaper inom IT-säkerhet. Win-win!
🏁 Flagga 1 – strings
Jag började med det enklaste: att köra kommandot strings på PCAP-filen. Då dök första flaggan upp direkt: ctf[strings_or_cat?].

🏁 Flagga 2 – FTP lösenord
Jag öppnade PCAP-filen i Wireshark. Direkt visas ett felmeddelande: ”The capture file appears to be damaged or corrupt”. Redan här får vi en hint om att filen förmodligen är manipulerad.
Jag började med att klicka på menyn Statistics > Protocol Hierarchy för att få en överblick över trafiken. Därefter högerklickade jag på ett TCP-paket, valde menyn Follow > TCP Streams och stegade igenom de olika sessionerna för att titta närmare på innehållet.
PCAP-filen består av både HTTP-, SMTP- och FTP-sessioner, och flera filer som skickats via dessa protokoll.
- index.html
- sessionstore.jsonlz4
- CERT-SE.jpg
- PHOTOS.img
- monstrum_piscis_tres
- ctf.txt
- passwd_policy.txt
Jag sparade alla filer och kommer att återkomma till dem i tur och ordning, men noterade direkt en FTP-inloggning med användarnamn flag och lösenord 983e3a1fbb4232fff96282ab9a37f89a.

Lösenordet ser ut att kunna vara en MD5-hash. Enligt passwd_policy.txt ska alla lösenord komma från ordlistan rockyou.txt men vara formaterade som ctf[lösenord]. Så jag skapade en modifierad version av rockyou.txt enligt det angivna formatet och använde John the Ripper för att knäcka lösenordet.
sed 's/^/ctf[/' /usr/share/wordlists/rockyou.txt | sed 's/$/]/' > ctf_rockyou.txt
john --format=raw-md5 --wordlist=ctf_rockyou.txt hash.txt
John knäckte snabbt lösenordet: ctf[cutenessie4eva].

🏁 Flagga 3 – index.html
Index.html visar ett mönster med gröna rutor. Till en början trodde jag det skulle representera binärdata, men när jag ändrade webbläsarens bredd började ett mönster formas och efter lite labbande framträdde texten CTF[MAtrix].

🏁 Flagga 4 – sessionstore.jsonlz4
Sessionstore.jsonlz4 är en fil som används av Firefox för att spara information om sessioner, inklusive öppna flikar och fönster.
Eftersom filen var bifogad i ett mejl behövde jag först Base64-dekoda den. Därefter använde jag verktyget lz4jsoncat för att skriva ut innehållet. Då hittade jag flikar med följande adresser:
- https://cert.se/#16n4[2t
- https://cert.se/#13t1c3f
- https://cert.se/#17]12c5r
- https://cert.se/#6e8u11e
- https://cert.se/#15o7s9r
- https://cert.se/#10r14i
Detta visade sig vara ett enkelt chiffer där siffrorna anger på vilken plats efterföljande tecken ska skrivas ut:
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| c | t | f | [ | r | e | s | u | r | r | e | c | t | i | o | n | ] |
På så vis bildas flaggan ctf[resurrection].
🏁 Flagga 5 – CERT-SE.jpg
CERT-SE.jpg innehåller ett mystiskt rutmönster i övre högra hörnet. Jag klippte ut detta mönster, gjorde en bildsökning med Google och identifierade chiffret som Hexahue.
Med hjälp av dCode’s Hexahue-verktyg kunde jag hitta flaggan ctf[COULEURSHEXADECIMALES].

🏁 Flagga 6 – PHOTOS.img
PHOTOS.img visade sig vara en avbildning av ett filsystem. När jag monterade avbildningen fanns fem filer:
- beach.png
- best_friends.png
- biking.png
- ice_cream.png
- sherLOCH.png
Eftersom det var en avbildning började jag misstänka att det kunde finnas mer data. Jag läste in avbildningen i Autopsy och hittade en borttagen fil mystery.jpg.

Den saknade fyra bytes i början av headern, men efter att jag lade till dem manuellt gick det att öppna bilden.
printf '\xFF\xD8\xFF\xE0' > mystery.jpg
cat export.jpg >> mystery.jpg
På bilden visas flaggan ctf[im_really_alive].
🏁 Flagga 7 – monstrum_piscis_tres
Även denna fil var bifogad i ett mejl, så jag började med att Base64-dekoda den. Därefter körde jag kommandot file för att identifiera filens innehåll:
file rapporterade att innehållet är MP3-audio. När jag spelade upp ljudet hördes en svag, förvrängd röst som lät baklänges eller robotliknande, och ett konstant pip som gjorde rösten svår att höra.
Eftersom jag inte är van vid att analysera ljudfiler tog jag hjälp av ChatGPT för att reversera ljudet och filtrera bort piptonen så gott det gick.
Rösten läste upp bokstäver, och vid första försöket tolkade jag sekvensen som IMKDMW2GJFJUQXJA. En Base32-dekodning av den strängen gav resultatet C\x146[FISH], vilket tydde på att jag var på rätt spår.
💡 Tips: Jag visste inte från början att strängen var Base32-kodad, men när jag testade den i CyberChef föreslog verktyget att jag skulle testa just det formatet.
Efter att ha lyssnat igen kom jag fram till strängen INKEMW2GJFJUQXJA, och då blev resultatet CTF[FISH].

🏁 Flagga 8 – ctf.txt
Texten i ctf.txt visade sig vara ett påskägg. Det står ”you will not find a complete flag in this text”, men texten innehåller istället instruktioner för hur man bygger en flagga.

Om man följer denna instruktion blir flaggan ctf[a guess].
🏁 Flagga 9 – cert-se_ctf2025.pcap
Jag bestämde mig för att titta närmare på PCAP-filen. Wireshark varnade för att filen kunde vara skadad eller korrupt, därför misstänkte jag att den var manipulerad.
Jag körde verktyget binwalk och noterade en JPEG-bild i slutet av PCAP-filen. Jag använde verktyget ’dd’ för att exportera ut detta segment av filen:
dd if=cert-se_ctf2025.pcap of=output.jpg bs=1 skip=29102359 status=progress
På bilden fanns flaggan ctf[carve_carve].
🏁 Flagga 10 – UDP-ström
Den sista flaggan höll sig gömd ett bra tag, men jag hade en känsla av att den borde finnas någonstans i nätverkstrafiken.
Efter lite letande upptäckte jag flera små UDP-paket med väldigt lite data i. När jag började titta närmare såg jag att innehållet var Base64-kodad text. Det visade sig vara data från en keylogger.

💡 Tips: När jag hittade det här spåret blev jag så glad att jag gick igenom alla paket, ett efter ett, i Wireshark 😅 Ett betydligt smidigare sätt hade varit att använda verktyget tshark.

I mitten av UDP-strömmen dök flaggan upp: ctf[keylog_over_udp].
Extramaterial
Filen beach.png gäckade mig länge. När jag undersökte rådata hittade jag sekvensen ctf[ följt av 18 byte och sedan ett ]-tecken. I hex ser det ut så här:
ctf[ E4 CA 01 03 17 03 51 8C 91 0E 04 33 7A 94 52 78 F7 E2 ]
Jag försökte länge lista ut om det här var en dold flagga. Jag provade flera olika sätt att dekoda sekvensen, men inget gav något läsbart resultat.
Till slut hittade jag den sista flaggan på en helt annan plats (UDP-strömmen). När jag skickade in mina resultat passade jag på att fråga CERT-SE, som bekräftade att den här strängen bara var en ren slump 😅
Stort tack till CERT-SE för en riktigt rolig och välgjord utmaning. Som vanligt höll den hög kvalite, med lagom mycket variation mellan uppgifterna. Jag ser redan fram emot nästa år!

