KrEncyclopedia

Kategori

Kryptografi

Beskrivning

Jag och min kompis har knäckt det! Vi krypterar våra meddelanden med ett randomiserat substitutionschiffer. De kommer aldrig knäcka det…

OBS! Flagga lämnas in som cratectf{FLAG}.

Lösning

Till utmaningen bifogas källkoden till krypteringsprogrammet.

I filen __init__.py hittar vi följande kod:

from flask import Flask
import random
import string 
import requests

def getKey():

    alph = [c for c in string.ascii_lowercase]
    unordedered = alph.copy() 

    random.shuffle(unordedered)

    return dict(zip(alph, unordedered))

def getFlag():
    flag = ''
    with open('flag.txt', 'r') as f:
        flag = f.readlines()[0][0:-1]
    return flag

def getArticles():
    def fetch_random_wikipedia_article():
        url = "https://en.wikipedia.org/w/api.php"

        params = {
            "format": "json",
            "action": "query",
            "generator": "random",
            "grnnamespace": 0,
            "prop": "extracts",
            "exchars": 4000,
            "explaintext": True
        }

        try:
            response = requests.get(url, params=params)
            response.raise_for_status()

            data = response.json()
            pages = data["query"]["pages"]

            for _, page_data in pages.items():
                return page_data["extract"]
                

        except requests.exceptions.RequestException as e:
            print(f"Error fetching data from Wikipedia: {e}")

    art = [fetch_random_wikipedia_article() for _ in range(0,10)]
    return art

def create_app():
    app = Flask(__name__)
    app.config['CIPHER_KEY'] = getKey()
    app.config['FLAG'] = getFlag()
    app.config['ARTICLES'] = getArticles()

    with app.app_context():
        from . import routes

    return app

Här kan vi se att substitutionsnyckeln randomiseras och sparas i app.config['CIPHER_KEY']. Vi kan även se att Wikipedia-artiklar hämtas och sparas i app.config['ARTICLES'].

Kollar vi i filen routes.py så hittar vi koden för att kryptera Wikipedia-artiklar och flaggan.

from flask import current_app as app, render_template
import random

@app.route('/wiki', methods=['GET'])
def wiki():
    r = random.randint(0, 9) 
    randomArticle = app.config['ARTICLES'][r].lower()
    sanitized = list(filter(lambda ch: ch in app.config['CIPHER_KEY'], randomArticle))
    res = ''.join(list(map(lambda ch: app.config['CIPHER_KEY'][ch], sanitized)))

    return render_template('index.html', header="Free Wikipedia article of the Request!", content=res)

@app.route('/flag', methods=['GET'])
def flag():
    res = ''.join(list(map(lambda ch: app.config['CIPHER_KEY'][ch], app.config['FLAG'])))
    return render_template('index.html', header="Here is your free flag!", content=res)

@app.route('/', methods=['GET'])
def index():
    return render_template('index.html', header="KrEncyclopedia", content="Detta är tjänsten för att sprida mitt ocknäckbara chiffer!\n Jag har till och med inkluderat en tjänst som krypterar wikipedia artiklar för att bevisa hur oläsliga dem blir.")

Här ser vi att Wikipedia-artiklarna ändras till små bokstäver och sedan filtreras så att endast bokstäverna i substitutionsnyckeln används. Därefter krypteras artiklarna och skickas till användaren.

Flaggan krypteras på samma sätt och skickas till användaren.

För att lösa utmaningen kan vi hämta en Wikipedia-artikel och försöka lista ut substitutionsnyckeln.

Vi kan ta följande artikel.

ehcghcvutghcuhlgtszckehcghcvudtvfhkpifnrvbvesvcdhxhklclxttlxuzclhkhkrhiutzcvhcfnflovtghcuhlgtdhxszckehcghcvudtvfhkzkpifnlkjlffhfzvbzikunbfhcvuzphevxhkrvlfvvkdtvfhkxtvhuuvkrvrxuhkkvxxvbzkrhcnxbtzzflkjlffhfzvhkrdvkuzkuzxuirntlxuzcnhkrvkgflxthukilghfdhndtvcvxtvdhxhfxzhdhcrvrholcxubfhxxtzkzicxehlkozctvccvxvhcbtzkutvtlxuzclhkvrdhcrthnxtvdvkuzkuzbzewfvuvtvcrzbuzchfutvxlxlkiklyvcxlunbzffvgvrisflklkvkulufvrohcoczeovdwczovxxlzkhfdzevklklcvfhkrbhcvvchxhtlxuzclhktvcdzcjozbixvrwclehclfnzkutvbzkuclsiulzkzodzevkuzlclxtxzblvunhkrutvlcdzcjlkehknwczovxxlzkxlkbfirlkghbbzikuhkbnevrlblkvkicxlkgxwzcuhkrvribhulzkhxdvfffzzjlkghuutvlcbzkuclsiulzklkcvflglzkxtvuhigtulklcvfhkrhuutviklyvcxlunzoflevclbjxuwhuclbjxbzffvgvrciebzkrchhffthffzdxbzffvgvhkrkilehnkzzutlkuvckhulzkhffnxtvdhxhdhcrvrhoifsclgtuxbtzfhcxtlwlkhkrdzcjvrhuszxuzkbzffvgvxtvdhxdzifrocvaivkufncvuickuzuvhbthuszxuzkbzffvgvhkrthcyhcrhkroczeuzxtvfvbuicvrzkutvtlxuzcnzoevrlblkv

Vi kan använda oss av Boxentriqs Substitution Cipher Solver för att lösa substitutionsnyckeln.

Solved

Vi kan nu använda substitutionsnyckeln för att dekryptera flaggan.

Flag

cratectf{frequencycalibrated}

n00bz

Home of the n00bz CTF team.


By n00bz, 2024-11-17