Kollisionskurs

Kategori

Krypto, Misc, Webb

Beskrivning

Kenneth verkar stressad av att Harriet är honom i hasorna och har känt sig tvungen att skynda på sina planer. Brådstörtat har han därför skickat iväg sin sond OPS (Oplanerat Påskyndad Solsond) mot solen för att börja undersöka förutsättningarna för en Dyson-sfär (eller Dyson-bälte, för Kenneth vill fortfarande kunna framstå som ödmjuk). Sonden var egentligen inte alls färdig än och interfacet för kommunikation slängdes ihop av en underbetald IT-konsult i sista stund innan sonden sköts iväg.

Hastverk är sällan en bra förutsättning för kvalité och stabilitet.

Harriet lyckas lokalisera systemet precis efter uppskjutningen, men hittar åtminstone lite kvarglömd data; två små shell-skript och en URL (https://undutmaning-kollisionskurs.chals.io). Hjälp Harriet att komma åt systemet!

Lösning

Besöker vi utmaningssidan så får vi en enkel webbsida med en textarea där vi kan skicka in ett bash-script.

Webbsida

Försöker vi skicka in ett script som listar filer, t.ex. ls, så får vi tillbaka en felmeddelande som säger att det är ett ogiltigt script som inte matchar de godkända checksummorna.

Felmeddelande

Testar vi istället de två bifogade scripten, full_status.sh och kort_status.sh, så får vi tillbaka korrekt output.

Full status Kort status

Vi kan anta att vi behöver skicka in ett script som matchar checksumman för antingen full_status.sh eller kort_status.sh. Innan vi kan göra det behöver vi dock veta vad det är för checksumma som används.

Om vi tittar på förstasidan så ser vi texten “Säkrad av Ward Christensen och John Byrns, © 1981”. Från detta kan vi få fram att Ward Christensen skapade XModem och John Byrns skapade XModem-CRC. Vi kan anta att checksumman som används är XModem-CRC.

XModem Protocol with CRC hittar vi exempelkod för att beräkna checksumman. Vi kan använda detta för att skriva ett script som paddar ett kommando för att generera korrekt CRC för vårt script.

import sys


def calculate_xmodem_crc(file_data):
    file_data = bytearray(file_data, 'utf-8')
    crc = 0

    def update_crc(crc, byte):
        crc ^= byte << 8
        for _ in range(8):
            if crc & 0x8000:
                crc = (crc << 1) ^ 0x1021
            else:
                crc <<= 1
        return crc & 0xFFFF

    for byte in file_data:
        crc = update_crc(crc, byte)

    return crc


if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Usage: python script.py <command>")
        sys.exit(1)

    file_data = '#!/bin/bash\n'
    file_data += sys.argv[1]
    file_data += ' #'
    val = 0
    while True:
        crc = 0
        test_data = file_data + str(val)
        crc = calculate_xmodem_crc(test_data)
        if crc == 0xBBBB or crc == 0x3B75:
            print(f'Found CRC: {crc:04X}')
            print(f'file_data:\n{test_data}')
            sys.exit(0)

        val += 1

Vi kan nu använda detta script för att generera script med godtyckligt innehåll som matchar checksumman för full_status.sh eller kort_status.sh.

Skapar vi ett script som listar filer, t.ex. ls, och kör det genom vårt script så får vi tillbaka output från servern.

bin
dev
home
lib
lib64
libexec
proc
usr

Kollar vi runt i filstrukturen så hittar vi flaggan i /home/ops/uppdragsparametrar.json.

{
    "sond": {
      "namn": "O.P.S.",
      "version": "1.0.0 BETA",
      "tillverkare": "Kenneth Inc Ltd.",
      "status": "aktiv",
      "uppdrag": {
        "typ": "solsystemsforskning",
        "mål": "Utred förutsättningarna för etablerande av Dyson Sfär (eller Bälte)"
      },
      "specifikationer": {
        "hastighet_km_s": 215625,
        "max_avstånd_km": 150000000,
        "startdatum": "2025-03-29",
        "kraftkälla": "fusion",
        "kommunikation": {
          "typ": "radiovåg",
          "frekvens_mhz": 500
        }
      },
      "system": {
        "sensorer": [
          "solsensor",
          "avståndsmätare",
          "strålningdetektor",
          "temperaturmätare"
        ],
        "lagring_gb": 512,
        "processor": "quad-core 2.5 GHz",
        "flagga": "undut{Ett steg i taget tar dig till målet, oavsett avstånd. Förutsatt att du inte går åt fel håll.}"
      },
      "säkerhet": {
        "brandvägg": "aktiverad",
        "fjärrstyrning": "avstängd",
        "låsskåp": true
      },
      "data": {
        "rapporter": [
            {
                "datum": "2025-03-29 12:01:10",
                "status": "ok",
                "information": "Max hastighet uppnådd."
            },
            {
                "datum": "2025-03-29 12:00:00",
                "status": "ok",
                "information": "Acceleration inledd. Uppdrag påbörjat."
            },
            {
                "datum": "2025-03-28 23:42:56",
                "status": "fel",
                "information": "Strömavbrott i radiovågskommunikationen"
            }
        ],
        "analyser": [
          {
            "datum": "2025-03-29 11:59:59",
            "resultat": "Strålningsnivåer normala."
          },
          {
            "datum": "2025-03-29 11:53:21",
            "resultat": "Alla system fungerar korrekt. Redo för avfärd."
          }
        ]
      }
    }
  }

Flagga: undut{Ett steg i taget tar dig till målet, oavsett avstånd. Förutsatt att du inte går åt fel håll.}

n00bz

Home of the n00bz CTF team.


By n00bz, 2025-03-29