DDC Regionale 2023 - Writeup

DDC Regionale 2023 - Writeup
Photo by Arget / Unsplash

De danske cybermesterskaber, også kendt som DDC, er hvor unge i 15 til 25 år kæmper om at blive den bedste danske cybermester!

Konkurrencen foregår som en CTF, hvor der er opgaver i eksempelvis web, crypto, boot2root og forensics.

2023 markeret det tredje år, som jeg deltager i DDC. De sidste to år, har jeg været så heldig at kunne kæmpe min vej til nationals, hvor det kun er de 100 bedste i landet som går videre til. I år nåede jeg dog kun til de regionale, hvor der i hver region kæmpes, og hvor de bedste går videre til det nationale mesterskab.

Jeg rangeret på en 58. plads i Danmark og 11. plads i region Syddanmark. Desværre ikke nok til at få mig til nationals.

Til det regionale mesterskab, fokuseret jeg primære på web opgaver, og jeg vil her prøve at gennemgå de opgaver jeg fik løst, som rangeret i det nemmere til mellem opgave sværhedsgrad.
Jeg vil prøve at forklare min vej igennem opgaverne, så løsningerne er ikke skrevet som punktopstillet steps, men indeholder min tankegang og hvilke veje jeg har været nede af, for at komme frem til løsningen på opgaven.

Følgende writeups indeholder flags.


Opgaver

Beginner

Web

Forensics


Beginner

Til DDC 2023 regionale, var der et beginner track, som kun gav et mindre antal points, og var målrettet, at alle kunne idemindste få et par opgaver løst, selvom man er helt grøn.

Not Another Audio Challenge

Kategori: Misc

Beskrivelse

Et nyt år, en ny ekstremt udfordrende, knapt cyberrelateret audio challenge. Flaget er IKKE i selve lyden eller spektrogrammet, det er bare for sjov :) Men der kan jo være andre sjove egenskaber ved filen

Løsning

I opgaven, er der udlevet en fil ved navn PleaseStopMakingThese.flac

Opgavebeskrivelsen, giver os et hint om, at det hverken er krypteret i selve lyden eller ved spektrogrammet (hvilket har været med i forrige CTF'er). Vi bliver derved hintet i retning af selve egenskaberne for filen.

Første step, kan derved blot være at højreklikke på filen, og se om der kommer noget. Jeg sidder med Kali, og desværre er der intet at hente her, udover normale metadata.

Imens jeg laver opgaverne, har jeg VSCode åbent, og gemmer alle challengene i en stor mappe. VSCode kan åbne den encoded fil, og vise de rå bits, i hvad det ville være i normal UTF-8 format. Hvis vi derved åbner filen, og for sjov søger efter DDC (Flag format for DDC er DDC{<flag text>}). Her ser vi så at flaget faktisk kan findes.

Dette er lidt af en cheesy måde at finde selve flaget. Hvis vi søger lidt på google, for at få metadata omkring filen. kan vi finde frem til at der findes et specifikt værktøj til at læse metadata fra .flac filer, kaldet metaflac. Dette værktøj er "program to list, add, remove, or edit metadata in one or more FLAC files", ifølge manuallen (man metaflac).
I manualen for værktøjet, finder vi også --list som udskriver alle metadata detaljer.

Når vi gør det med metaflac PleaseStopMakingThese.flac --list, så får vi printet alle metadata om filen!
Herunder også comment[0]: COMMENT=DDC{Alw4ys-th3-l4st-pl4c3-yoU-l00k} i METADATA block #1

TheLostKey

Kategori: Forensics

Beskrivelse

Du er en detektiv, der forsøger at løse en sag om en manglende nøgle. Nøglen blev sidst set i et rum fyldt med spredte papirer, noter og dokumenter. Rygtet var, at nøglen var skjult i et af dokumenterne. Den fundne nøgle skal konverteres til tekst og placeres i DDC{}

Held og lykke, detektiv!

Løsning

Opgaven udlevere en zip mappe. Denne zip mappe ser ganske normal ud.
Fordi den ser så normal ud, vil en god start være at unzip den.
I Kali Linux er det så nemt, som bare at åbne den i normale filsystem, og klikke "Udpak her".

Når vi udpakker zip'en, finder vi en mappe, med endnu en zip i. Vi fortsætter unzip arbejdet!

Heri ser vi nu to filer. Doc1.txt og Doc2.txt.
Når vi åbner filen, i eksempelvis VSCode, ser vi, at der et en masse bogstaver. Umiddelbart noget encoded tekst. Dette kan antages ud fra, at der ikke umiddelbart er noget læsbart og hvad der ligner kun ASCII lignende tegn. Ud fra dette, kan det måske være Base64 encoded. Som er en standard encoding. Hvis vi smider dette ind i en online decoder, såsom base64decode.org, eller hvis vi er virkelig advanced via cat Doc1.txt | base64 --decode.
Det ses at det er noget JFIF format, som er et JPEG encoding måde.

Denne stig er dog lidt en blindgyde, for hvis vi ser i dokumentet Doc1.txt fanger noget vores interresse. En række tal, hver stykke 3 decimaler lang med mellemrum onkring. Dette er helt anderledes fra hvordan resten af teksten er.
Det har en sjov encoding, fordi det er ikke hex og ikke binært, med dens 3 decimaler af rene tal. Dette kunne derfor ligne decimal encoding.
Den tricky del herfra, er så at finde en hjemmeside til at decode decimal encoding til ASCII, hvor det ikke blot er et tal af gangen. En side som jeg fandt efter at søge rundt på google er onlinestringtools.com, som giver at 089 111 117 032 100 105 100 032 105 116 044 032 100 101 116 101 099 116 105 118 101 033 decodes til You did it, detective!.

Vi kan nu prøve at sætte flag formattet rundt om, og indsende flaget: DDC{You did it, detective!}. Og her har vi så fundet flaget!


Web

Web er en simpel og meget udbredt gruppe af opgaver, fordi at så meget af vores hverdag berører internettet.

Bit Lords

Anslået sværhedsgrad: Very easy

Beskrivelse

Dit yndlingsmusikband, Bit Lords, udlodder en kode til gratis billetter til deres kommende koncert i din hjemby. De 50 hurtigste fans kan få koden ved at gå ind på hjemmesiden bitlords-tickets.hkn. Desværre ser det ud til, at 50 fans allerede var hurtigere end dig. Lad os alligevel prøve at finde ud af en måde at hente koden til gratis billetter på. Hver af de første 50 fans fik fat i koden ved at klikke på knappen på siden. Hvad er koden til gratis billetter? (Kodelængde: 10 tegn)

Brug venligst følgende format til flaget: DDC{xxxxxxxxxx}

Løsning

På denne opgaves website, ser vi en simpel side, hvor der er en knap, som er den omtalte knap som ville give en kode, hvis vi kunne trygge på den.
Knappen er på nuværende tidspunkt helt deaktiveret. Dette kan dog nemt fjernes ved at åbne developer vinduet, via F12, og finde fremme til knappen.
Herefter, kan vi fjerne disabled attributen, og trykke på knappen. Selvom der står, at knappen har et event i developer vinduet, sker der ikke noget. I developer vinduet, er der et smart "debugging" fane. Denne kan vi trykke på, og gennemgå alt kode som siden har.

En interessant fil ved navn button.js. I denne fil, er der en meget interessant metode, ved navn ticketCode(). Denne vil være super at køre, fordi ved nærmere inspektion, ligner det at den generere en eller anden form for kode.

I developer vinduet, er det muligt at køre den givet funktion direkte via konsollen. Men når vi køre ticketCode() sker der ikke noget. Dette skyldes, at der kræver et .input felt, hvis tal er over 0.
Denne .input svare til et <b> element på siden, med klassen ìnput. Tallet heri er 0, og kan sættes op til 1, hvorefter ticketCode() kan gøres. Her vil siden så give en alert, med koden.
En anden måde, er at tage mix_it("B7ZHmAAS2h") fra ticketCode() og køre direkte. Men uanset hvad, får vi AA2m7HZSBh som svar.

Dette kan formateres som flaget, som i alt ville være DDC{AA2m7HZSBh}

Ninja SSTImulation

Anslået sværhedsgrad: Easy

Beskrivelse

Ninjas have started to adopt modern recruitment techniques. Perhaps you can uncover their secrets at ninjalair.hkn

Løsning

Når vi navigerer til den angivet webadresse, er vi mødt med en simpel hjemmeise.
Noget af det først vi kan gøre, er at finde ud af, hvilken type webserver vi har med at gøre. Dette kan gøres ved at eksempelvis bringe developer menuen frem, via F12. Her kan vi gå under netværk, og se headersne for HTTP requesten. I response headeren ser vi Gunicorn, hvilket en google søgning viser er en python web server.
En klassisk Python vaulnerability er SSTI (Server Side Template Injection). Ud fra navnet på opgaven, så kunne dette være måden hvorpå vi får fat i flaget.

På siden er vi også mødt af en input boks, som redirecter tilbage til den samme hjemmeside vi er på, men med et GET parameter http://ninjalair.hkn/?name=<input+data>. Denne tekst vises også på siden. Et meget klart tegn på noget Server Side Template usage.
Hvis denne Server Side Template ikke er korrekt escaped, er det muligt at få den til at køre python kode. Dette vil vi nu udnytte.

Der findes mange online lister af SSTI payloads. En kort google søgning viser eksempelvis GitHub repositoriet payloadbox/ssti-payloads. En af payloadsne, dumper hele environmentet for python serveren. Dette ville være et godt sted at starte.
Payloaded som vi bruger er {{config.items()}}.

Med dette payload, ser vi nu at serveren dumper alle config elementer. Herunder flaget: DDC{N1NJ45_4r3_C001}.

Hvis det at læse environment dataene ikke er nok, kan opgaven også løses med en mere avanceret injection, som giver RCE (Remote Code Execution):
{{request.application.__globals__.__builtins__.__import__('os').popen('cat flag.txt').read()}}". Her læser vi blot filen flag.txt, men hvilken som helst command kan køres, inklusiv at få direkte shell adgang udenom python.

Premium Cookies

Anslået sværhedsgrad: Easy

Beskrivelse

Du vil gerne imponere landsbyens ældste i den årlige bake-off. Heldigvis fortalte din ven dig om denne hemmelige opskrift på småkager. Kan du finde den på best-recipes.hkn?

Løsning

I denne opgave, møder vi en opskrifts hjemmeside. Denne side er speciel, fordi når man klikker ind på en artikel, ser URL'et mystisk ud: http://best-recipes.hkn/article_id=1. De andre synlige opskriver har et af følgende "id" (det der kommer efter article_id): 1, 2, 3, 4, 5. Dog kan vi se, at 2 og 4 kræver en "premium" bruger.
Artikle 2, passer også til en opskrift, med stjerne på. Vi vil nok gerne have adgang til disse sidder.

Ud fra beskrivelsen på opgaven, så får vi et hint, at måske cookiesne vil hjælpe os. Og rigtigt nok, der er en cookie ved navn user_type med værdien 85a27b4940445bdce6cc15b7d0dc6873. Ved dens navn user_type og dens 32 tegn lange værdi, er den lidt mystisk. Det kunne tænkes at det er en base64 encded tekst, men den har ikke = til slut, som ofte angiver det er base64. Fordi det er 32 tegn, kunne det måske være md5. En klassisk hashing algoritme.

For at se om det er dette, kunne en online rainbowtable bruges, såsom md5decrypt.net. I sådan et online værktøj, får vi den hurtigt omsat til non-premium. Spænende!

Fordi cookies, er noget som sendes med frem og tilbage, så har vi som bruger, mulighed for at rette cookies. Fordi vi kræver en premium bruger, men lige nu har en non-premium bruger, kunne vi prøve at indsætte md5 hashet premium som user_type. Den hashed version, bliver til a288195832f8717bca4671416014a464

Nu når vi har indsat det ind i cookien, og genindlæst siden, ser vi at får adgang til artiklen, men på artikel 2, er der ingen spændende ting. Dog var det ikke den eneste premium side vi fandt via at gå igennem id'erne. Der er også id 4, som heller ikke er på forsiden. Og for denne side har vi bingo!

Vi får her på artikel 4 udleveret flaget: DDC{2_cups_of_sugar}

Sneaky Reviews

Anslået sværhedsgrad: Medium

Beskrivelse

Jeg er ved at oprette en webapp til at administrere todos, du kan tjekke den på sneeky-reviews.hkn Lad mig vide hvad du tænker.

Løsning

I sneaky reviews, er vi mødt med en Todo app, som virker forholdsvis simpel. Der er login, en masse reviews på forsiden, samt at bag login, har man adgang til at oprette, se og slette sine egne todos punkter.

Når vi prøver at oprette nogle todos, ses det at id'et allerede er oppe på 83. Men en anden detalje, som fanger opmærksomheden, er søgefeltet i toppen.

En klassisk exploit på web, som har med en database at gøre, er SQL injection. Hvor man injector mere SQL end hvad var tiltænkt, og derved kan gøre at fra at se flere rækker i tabellen til RCE, hvis der findes exploit via SQL for det database system. Ret kraftige sager. SQL injection er ofte nemt at komme overkomme og samtidig nemt at glemme at forebygge.

En god måde at tjekke for SQL injection, er enten via et payload fra en af de mange lister på nettet, eller via eksempelvis ' som ofte er det som bruges til at omkredse elementer i SQL statements.

Når vi prøver SQL injectionen her, ser vi at hjemmesiden er vulnerable fordi den smider en 500 fejl. En anden klassisk SQL injection er ' or true --, som vil afslutte tekst input, sætte til "eller hvis sandt er sandt", samt sætter resten af SQL statementen som en kommentar via --.
Her ser vi nu, at vi får adgang til alle Todos.

Desværre giver denne SQL injection ikke noget flag. Og som beskrivelsen hinter til, så ligger flaget nok i reviewsne på forsiden.
SQL injection er kompliceret og tungt, så derfor findes der masser af tools til det. Et af disse er sqlmap, som automatisk kan exploite SQL injection vaulnerabilitien.

Første trin for at få sqlmap til at køre, er at få ens session med over til terminalen, hvor sqlmap køre. For at køre sqlmap med en cookie, kan der køres med --cookie='session=<JWT token>'. For denne applikation, er det dog ikke nok, og agent type kan inkluderes via --headers="User-Agent: <agent>". For at gøre det nemmere at læse, vil disse ikke blive inkluderet i de næste kode stykker.
Med dette i rygsækken, kan vi nu prøve at få sqlmap til at gøre sin magi.

En af de første ting man kan gøre, er at få sqlmap til at automatisk enumerere og finde hvilken database det er, via: sqlmap --url http://sneeky-reviews.hkn/search?s=1 --level 5 --dbms
Dog fejler den, og programmet siger at vi evt. skal prøve at fastlåse en dbms. Vi laver et vildt gæt med mysql (meget populær database), men dette er ikke rigtigt. Et andet gæt ville så være sqlite. Dette er en vinder: sqlmap --url http://sneeky-reviews.hkn/search?s=1 --level 3 --dbms=SQLite.

Nu har sqlmap adgang, og vi kan derved be den om at få alle tabeller: sqlmap --url http://sneeky-reviews.hkn/search?s=1 --level 5 --tables. Her finder vi tre tabeller; todos, users og reviews. Vi vil have adgang til reviews. Vi ber den derved om at dumpe alle tabeller: sqlmap --url http://sneeky-reviews.hkn/search?s=1 --level 5 --tables --dump.

Total succes via sqlmap, og vi får flaget i reviews tabellen!

Find me

Anslået sværhedsgrad: Medium

Beskrivelse

It's me, Max... Because of the economic crisis, my boss told everyone at work that he will be firing some people. I'm scared man, can you find out if I'm one of the people getting fired? I know he keeps the list of names on his server somewhere. Head over to http://bosspage.hkn and see what you can find! I better not be on that list...

Løsning

I denne opgave, bliver vi ledt hen på en veldesignet side, for bossen. Siden er meget simpel, med en kontakt formular og en portfolio side.
Ved at kigge i developer vinduet igen, kan vi nu se, at vi har med en apache server at gøre. Muligvis kan PHP være brugt.
Den ene anden side, som er tilgængelig, er portfolio siden hvor der er en liste af projekter. På denne side, kan man klikke ind på de forskellige projekter. På denne side, får vi også bekræftet at vi arbejder med PHP. Dette kan ses med .php i adresse baren.

Når vi kligger ind på de enkelte projekter i portfolioen, vi er mødt med et lidt specielt url: http://bosspage.hkn/portfolio.php?file=item2.html. Der er dukket et GET parameter frem, ved navn file, som pege på en html side. Når vi går ind på de andre projekter, ser vi samme behavior, bare med et andet file name som parameter.

En klassisk exploit i PHP er LFI (Local File Inclusion), hvor at systemet er vaulnerabel via enten en requires $_GET['file'] eller lignende. Hvis dette er tilfældet her, har vi lige pludselig mulighed for at inkludere hvilken som helst fil vi vil.
Vi kan derved eksempelvis prøve en klassisk sti, som viser alle brugere i systemet /etc/passwd. Vi ser at dette printer hele filen. Det er perfekt og betyder, at vi kan læse hvilken som helst fil, eller måske endda få RCE.
Hvis vi prøver at læse andre elementer, såsom apache loggen, ender vi bare på en 500 side. Dette indikerer, at det ikke er alt vi kan læse. Specifikt kan vi se, at filer som web useren på serveren vi er i gang med attacke, ikke kan tilgåes, fordi det returnere en 500 fejl, og ikke en fejlside, som er specielt lavet.
Denne fejlside er dog speciel, fordi normalt i LFI, som eksemplet tidligere, bruges requires men det ligner det så ikke her. I et requires, ville det nemlig ikke være muligt at detektere hvis filen ikke findes, og så vise fejlsiden, især når vi også kan få den til at give en 500 fejl.

En ting vi kan prøve, er at inkludere den nuværende side. Her ser vi så noget sjovt. En blank side kommer frem, men faktisk indeholder den selve PHP koden for siden!

<?php
	require (__DIR__ . '/scripts/functions.php');
		
	$file = $_GET["file"];

	if(empty($file)) {
		serveFile("portfolio.html");
	} else {
		serveFile($file);
	}
?>

Okay, vi kan se, at den tager get parameteren ind, lidt som vi regner med, men bruger en serveFile metode i stedet for. Dette er en ikke en standard PHP metode. Vi kan derfor identificere at den metode måske kommer fra den required /scripts/functions.php fil. Vi kan derved prøve at åbne den fil, nu når vi ved vi kan åbne og læse PHP filer.

I denne fil finder vi vores serveFile() metode:

function serveFile(string $filename) {
    $header = fopen($filename, 'r') or serveFile("error.html");
    $content = fread($header, filesize($filename));
    fclose($header);
    echo $content;
}

Fra dette, ser vi at det ikke er normal LFI, men at vi i stedet for har adgang til at læse hvilken som helst fil.

Der findes en masse forskellige LFI payloads, herunder RCE og reverseshells. En af disse lister som er fundet via google er Hacktricks.xyz. Men alt dette kræver primært at koden indsættes som faktisk php kode i siden, og ikke blot bliver echo'et ud, som det gør her.
Der er et par enkelte metoder, såsom expect://. Men dette skal være aktiveret. Hvis expect:// eller php://filter bruges, returnere siden en 500. Derved ligner der, at den måde fopen og fread bruges, at vi primært kun kan læse filer, og få dem udskrevet i ren tekst.

Hvis vi kigger videre i /scripts/functions.php, finder vi en anden interessant metode, som ikke bruges, men indeholder en spøjs kommentar.

# Used for appending names/misc to textfiles/lists in the safe. Used in the Blueneek admin panel
# Only works for files inside safe!
function append(string $listName, string $nameToWrite) {
    # Condition: $listName must be a .txt file!
    $fileToWrite = fopen("/usr/blueneekdb/secretsafe/".$listName.".txt", "a");
    $addLine = $nameToWrite."\n";
    fwrite($fileToWrite, $addLine);
    fclose($fileToWrite);
}

Denne metode virker til at være til at tilføje noget i en fil, i et secretsafe og der referereces til et admin panel. Dette admin panel kunne være hvor boss holder styr på forskellige data, såsom hvem der skal fyres.
Vi ved fra tidligere, at vi kan tilgå en stor del af filerne på serveren. Vi kan derved prøve at tilgå /usr/blueneekdb/secretsafe/text.txt for at se om der er noget. Men som vi nok forventer, får vi bare en fejl side, som siger at det ikke kunne findes. Som et sjovt eksperiment mellem alt der her, prøvede jeg at gå til /usr/blueneekdb/secretsafe/., som returnere en tom side. Men hvis jeg eksempelvis går til /usr/blueneekdb/secretsafe2/, så får jeg en fejlside. Hvilket indikerer at mappen findes og at den kan tilgåes!

Herfra har vi to muligheder. Vi kan enten prøve med random ord at gætte os frem til det $listName der var brugt til en evt. fyringsliste som er her, eller vi kan bruteforce navnet!
På dette tidspunkt ved vi faktisk ikke, om der ligger noget i denne mappe, men det kunne tyde på det.

Denne opgave endte jeg ikke med at løse til regionals, fordi jeg var i tvivl om fyringslisten lå i den fundne mappe, eller om jeg var løbet ned af en forkert sti og måske overset andre ting.
Som regionals blev afsluttet, fik jeg at vide, at man blot skulle bruge dirbuster eller lignende med en større wordliste, for at bruteforce navnet på listen. Jeg havde prøvet med en mindre wordliste, faktisk en passowordlist, samt med ord jeg kunne forestille mig brugt.

For at gøre det nemmere at køre test, og ikke hele tiden at komme frem til fejl siden, endte jeg med at producere følgende bash script, til at tage imod enkelte ord:

#!/bin/bash
data=$1
site="http://bosspage.hkn/portfolio.php?file=${data}"
string='<title>Error!</title>' ka
if curl -s "$site" | grep -q "$string"; then
    echo "error page"
else
    echo "interresting!"
    wget "$site"
fi

Som kun downloadet siden, hvis den ikke var en fejlside.

For at prøve at bruteforce listen, prøvede jeg i første omgang /usr/share/john/password.lst som er en simpel password liste, men endte ikke med at give nogle resultater.
Dette var desværre den eneste wordliste som jeg kunne huske til regionals, fordi jeg havde glemt alt om dirbuster.
Men hvis man eksempelvis bruger locate wordlist, kommer der en lang liste af wordlists, som er i systemet. Med en forholdsvis standard Kali Linux, findes eksempelvis /usr/share/dirb/wordlists/small.txt. Efter at havde lavet et script, som kunne køre den liste, gav det ingen resultater. Men der findes en stor wordliste: /usr/share/dirb/wordlists/big.txt
Følgende script, er derfra lavet til at køre wordlisten:

#!/bin/bash

echo "Starting brute forcing"

function curl_site () {
    checked='<title>Error!</title>'
    if curl -s "$1" | grep -q "$checked"; then
        sleep 0;
    else
        echo "interresting!"
        echo "$1"
        echo "$1" >> interestingfiles.txt
        echo "------------"
        wget "$1"
    fi
}

i=0
list=/usr/share/dirb/wordlists/big.txt
echo "List being used for brute forcing: $list"

while read word; do
    [[ $word =~ ^#.* ]] && continue # Comments are skipped

    # Clean up word due to stupid wordlist formatting
    CLEAN=${word//_/}
    CLEAN=${CLEAN// /_}
    CLEAN=${CLEAN//[^a-zA-Z0-9_]/}
    CLEAN=$(echo -n "$CLEAN" | tr A-Z a-z)

    word="$CLEAN.txt"
    echo "$word"
    curl_site "http://bosspage.hkn/portfolio.php?file=/usr/blueneekdb/secretsafe/$word" &
    
    i=$(((i + 1) % 1000));
    [[ $i == 0 ]] && echo "----------------- 1000 looped through -----------------";
done <$list

echo "Done!"

Dette håndtere automatisk indhentning af den pågældende liste, at cleane ordet op til normale a-z, A-Z og 0-9 tegn.
Nu kan vi bare sætte os tilbage, og vente på at der bliver downloadet nogle interessante filer!
Og det gyldne filnavn er: goodbye.

Da jeg fandt ud af, at ordet goodbye var navnet på filen, blev jeg pænt trist, da det var en af de få ord som giver mening i fyrings relateret kontekst og som jeg ikke prøvet manuelt.

Indholdet af filen var således:

FIRING LIST:

Samantha Thomson,
Grace Leeroy,
Ben Dover,
Max Miller,
Daniel Lacroix,
Franzeska Lamon,
George Pill,
Jens Myrup.

DDC{y0u_4r3_d3fin3t3ly_g3tting_fir3d}

Med flaget: DDC{y0u_4r3_d3fin3t3ly_g3tting_fir3d}

Hvis jeg havde nået denne opgave, under regionals, havde jeg placeret mig i top 40, og derved kvalificeret mig til nationals.

Forensics

#CaffeineSpeakeasy

Anslået sværhedsgrad: Very Easy

Beskrivelse

"Efter at en stor kaffekæde har monopoliseret markedet, oprettede en gruppe kaffeentusiaster et hemmeligt netværk for at dele information om uafhængige kaffebarer. De kaldte sig #CaffeineSpeakeasy. Men en dag infiltrerede en spion fra den store kaffekæde netværket og stjal al information. Din opgave er at finde ud af, hvordan spionen kom ind, og hvilke oplysninger der blev stjålet."

Løsning

I denne opgave, har vi fået udleveret en pcap fil, som er en wireshark fil der indeholder data om netværks trafik.
Wireshark er et værktøj til at indsamle og analysere netværkstrafik.

En klassisk wireshark opgave, er at få fat i filer, som der har været sendt over nettet. Og denne opgave ligner detop dette.

Når filen åbnes i wireshark, kan der ses at der både har været FTP, HTTP og TCP trafik. Ud fra at der er FTP, hvilket er en File Transfer Protocol, tyder det på, vi skal have fat i filer.

For at få fat i alle filer for det nuværende trafik, kan man via wireshark gøre:
File > Export Objects > HTTP
I det nye vindue kan vi nu Save All

Herfra, får vi en hel del forskellige filer, som er nogle logins og reviews json fil.
Når vi går igennem disse filer, finder vi en helt del base64 enoced strings. Så mange, at man ikke helt kan gennemskue hvad det er. Men når vi decoder dem, får vi eksempelvis: DDC{HerErEtFlagMenHvorFinderDuDet}. De resterende base64 encoded strings, er lignende og er ikke det korrekte flag.

På dette tidspunkt ligner det, at opgaven måske er lidt mere kompleks eller simpel.
Hvis vi sorterer i protokollen af pakkerne i Wireshark. Står en speciel protokol ud: FTP-DATA.
Der er en pakke med denne protokol. Vi kan højreklikke på den og Follow > TCP Stream.
Med dette, kan vi se det data som har været sendt. Dette data er:

Godt udvalg. Dyr kaffe. Pæne medarbejdere. Grimme priser.
Ingen letmælk hele weekenden og heller ikke mandag morgen selvom der ligger en 7-11 på den anden side af foyeren, der sælger letmælk. Lamper over disk er tilstøvede med guirlander - og så endda på et hospital.Til den pris må man forvente en højere standard. Også selvom man ikke har konkurrenter på stedet.

Vi bestilte en kaffe med et skud vanilje i og en the, samlet pris var 85 kr. og det lignede noget man selv havde taget med i en termokande. Min the bestod i et the-brev og en kop varmt vand, som jeg betalte 36 kr. for. Det er helt ublu, når det bare er et the-brev, der har kostet maksimalt 1,5 kr. i indkøb. Det lille skud vanilje til kaffen kostede 8 kr., der var ikke engang servietter eller lille småkage med, som man ellers får andre (også billigere) steder.

Da vi satte os ned i cafeen trak det ind fra to døre. Endte med at lukke den ene dør, men personalet havde åbnet døren til hovedindgangen (ved rulletrapper). Folk sad i store vinterjakker, men det lod personalet åbenbart ikke mærke til.
Absolut ikke pengene værd!

Stakkels medarbejder. 1 til at betjene Christianshavn. Vi ventede i alt 30 min på en islatte. Hun undskyldte allerede for ventetiden da vi havde stået i kø til at bestille, men hun tog så lige fem gæster efter, før hun gik igang med vores bestilling. Hun havde intet flow. Der var nogle kunder bag os, der var kloge og spurgte om hun var alene, for derefter at finde et andet sted.

Selv om medarbejderen var en idiot fik jeg lokket et Haaukins flag ud af ham: ==QfzYXaz52Mwh3MtAzctMzMmZGMj1ycx0Seod1eDRER ellers må jeg nøjesfuldstændig uspiselige sandwitch. Fyldet virkede som om det lige var kommet ud af fryseren, og bollerne var våde. Jeg måtte simpelthen spytte det ud igen. Men de får 2 stjerner for hyggelig indretning og god stemning

Caramel Cheese caken er formidabel. Jeg er stor fan(!) Ligeledes af jeres chai latte.
Men hooold nu op: At sætte én enkelt medarbejder til at passe en central café på et hovedstrøg: Christianhavns Torv en helligdag som Langfredag midt på dagen,
hvor det vælter ind med massee af turister og lokale. Det kan I ikke være bekendt over for hverken medarbejderen eller kunderne

Interessant, vi kan læse os frem til et flag. En note omkring dette flag, så ligner det base64 encoding, men der startes med == og vi kan genkende RERD som der stod på alle de andre DDC flag vi fandt tidligere som var base64 encoded. Det ligner derfor at ==QfzYXaz52Mwh3MtAzctMzMmZGMj1ycx0Seod1eDRER er blevet reversed efter base64 decoding. Vi kan finde en online reverser, og vi får: RERDe1doeS0xcy1jMGZmMzMtczAtM3hwM25zaXYzfQ==.
Når vi decoder dette får vi flaget: DDC{Why-1s-c0ff33-s0-3xp3nsiv3}