30. 10. 2023

CTF - The Catch 2023 - Keyword of the day

 Jeden z kadetov dostal jednoduchú úlohu pripraviť jednoduchú webovú aplikáciu pre oznámenie kľúčového slova dňa. Tvrdí, že sa mu to podarilo, ale zabudol číslo portu na ktorom beží. Pre potreby bezpečnosti vytvoril aj veľa fake aplikácií. Nájdime teda kľúčové slovo, aby mohla posádka vykonávať ďalej svoje práce. Úloha je za 4 body.

Ahoy, officer,

one of deck cadets (remember your early days onboard) had a simple task to prepare simple web application to announce keyword of the day. He claimed that the task is completed, but he forgot on which port the application is running. Unfortunately, he also prepared a lot of fake applications, he claims it was necessary for security reasons. Find the keyword of the day, so daily routines on ship can continue.


Hľadanie portov


Vieme, źe weby bežia niekde na vpn adrese keyword-of-the-day.cns-jv.tcc.

Najskôr som do mobaxterm nainštaloval netcat (nmap nešiel), spustil som scan príkazom:

nc -zv keyword-of-the-day.cns-jv.tcc 1-65535

nc: connect to keyword-of-the-day.cns-jv.tcc port 656 (tcp) failed: Connection refused
nc: connect to keyword-of-the-day.cns-jv.tcc port 657 (tcp) failed: Connection refused
nc: connect to keyword-of-the-day.cns-jv.tcc port 658 (tcp) failed: Connection refused
nc: connect to keyword-of-the-day.cns-jv.tcc port 659 (tcp) failed: Connection refused
nc: connect to keyword-of-the-day.cns-jv.tcc port 660 (tcp) failed: Connection refused
nc: connect to keyword-of-the-day.cns-jv.tcc port 661 (tcp) failed: Connection refused
nc: connect to keyword-of-the-day.cns-jv.tcc port 662 (tcp) failed: Connection refused

Šlo to ale veľmi dlho, následne som objavil "port scanner" aplikáciu v mobe priamo v nástrojoch. Scan už prebehol rýchlo, porty aplikácií začínali od 60000. Výstup zo scanu som umiestnil do port60k.txt súboru.

- Port #60000:  listening
- Port #60009:  listening
- Port #60004:  listening
- Port #60010:  listening
- Port #60011:  listening
...
- Port #60488:  listening
- Port #60489:  listening
- Port #60494:  listening
- Port #60495:  listening

Ide o 234 portov s webovými stránkami.


Analýza kódu stránok


Stránky po otvorení vrátili veľký smajl cez celú obrazovku. Vyzerá, že v závislosti na portoch sa vybral rôzny. V html kóde stránky je pevná štruktúra a dlhý javascript kód, ktorý do nej smajl vygeneruje.

 <img id="myImage" />

vyzerá po zbehnutí kódu takto:

<img id="myImage" src="img/2.png">

Porovnal som viaceré stránky a vyzerali okrem výsledného čísla smajlu rovnako. Skúsil som teda pre javascript určený deobfuskator, ale nepomohol. Videl som len kód pre náhodné obrázky, nie logiku kedy zobraziť flag.

Diffom (zabudovaný MobaDiff) som objavil, že kód stránky sa mení len v jedinej hodnote v poli, 4té číslo od konca.


Hľadanie toho správneho


Posťahoval som cez wget zo všetkých 234 otvorených portov ich html kód.

for port in `cat ports60k.txt | cut -c9-13`; do
 wget http://keyword-of-the-day.cns-jv.tcc:$port -O web_$port.htm 2>/dev/null
done
Keďže použitých obrázkov so smajlami je menej ako použitých portov, predpokladám že jedna z možností bude nájsť jedinečné kódy a budem dúfať že ich bude len pár, aby som ich prešiel ručne.
grep function web_*.htm | cut -c 1888-1897 | sort | uniq -c | grep 1\ 

      1 0504ee2bdf
      1 948cd06ca7
      1 96dcf23753

Keď máme jedinečné čísla, môžeme k nim vyhľadať porty, pripojím teda ďalšie prikazy za ten predchádzajúci:

grep function web_*.htm | cut -c 1888-1897 | sort | uniq -c | grep 1\  | awk '{ print "grep "$2" web_*.htm | cut -d\":\" -f1" }'

grep 0504ee2bdf web_*.htm | cut -d":" -f1
grep 948cd06ca7 web_*.htm | cut -d":" -f1
grep 96dcf23753 web_*.htm | cut -d":" -f1

Po spustení vygenerovaných grep príkazov mi vyšli porty: 60495, 60257, 60000.

Ako som porty otváral, port 60257 bol iný, miesto smajlíka vrátil obrázok 948cd06ca7.png.


Iná možnosť hľadania


Ako som neskôr zistil, aj jednotlivé weby boli každým načítaním náhodné okrem portu 60257. Teda šlo by stiahnuť 2-3x rovnaký web a zistiť, či sa zmenil a ak áno, pokračovať.

Skúsil som si to, nakoniec som musel každý web ťahať 5x, lebo 3x mohol vrátiť náhodne rovnaký kód:

for port in `cat ports60k.txt | cut -c9-13`; do
 echo "skumam port $port"
 wget http://keyword-of-the-day.cns-jv.tcc:$port -O web_p1.htm 2>/dev/null
 wget http://keyword-of-the-day.cns-jv.tcc:$port -O web_p2.htm 2>/dev/null
 if [ "`cmp web_p1.htm web_p2.htm`" == "" ]; then
  wget http://keyword-of-the-day.cns-jv.tcc:$port -O web_p3.htm 2>/dev/null
  if [ "`cmp web_p1.htm web_p3.htm`" == "" ]; then
   wget http://keyword-of-the-day.cns-jv.tcc:$port -O web_p4.htm 2>/dev/null
   if [ "`cmp web_p1.htm web_p4.htm`" == "" ]; then
    wget http://keyword-of-the-day.cns-jv.tcc:$port -O web_p5.htm 2>/dev/null
    if [ "`cmp web_p1.htm web_p5.htm`" == "" ]; then
     echo $port
    fi
   fi
  fi
 fi
done
Beh skriptu chvíľu trval, no máme jednoznačný výsledok bez ručného dopátravania:

skumam port 60255
skumam port 60256
skumam port 60257
60257
skumam port 60258
skumam port 60259
skumam port 60260



Aplikácia nájdená



obrázok načítaný na správnom porte miesto smajla

Otvoril som teda v prehliadači adresu: http://keyword-of-the-day.cns-jv.tcc:60257/948cd06ca7
Tu je naša vlajka:

Your flag is FLAG{DEIE-fiOr-pGV5-8MPc}

Táto úloha mi prišla ako skúška, či viem hromadne spracúvať náhodne dodávané dáta. Najskôr hormadný scan portov, potom hromadné hľadanie jedinečných reťazcov. Napriek tomu, že som bežal pod windowsom, celú úlohu som riešil v shelli, prípadne pomocou utilít v mobaXterm.

Žiadne komentáre:

Zverejnenie komentára