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.

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

cratectf{frequencycalibrated}