adding validated services? patching forcad_local.py
This commit is contained in:
77
ctfcup24-school-ad/checkers/filtranator/checker.py
Executable file
77
ctfcup24-school-ad/checkers/filtranator/checker.py
Executable file
@@ -0,0 +1,77 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import requests
|
||||
import json
|
||||
from checklib import *
|
||||
from filtranator import *
|
||||
|
||||
|
||||
def strcmp(str1,str2):
|
||||
if (len(str1) != len(str2)):
|
||||
return False
|
||||
for i in range(len(str1)):
|
||||
if(str1[i] != str2[i]):
|
||||
if((str1[i] in os and str2[i] in os) or (str1[i] in ixs and str2[i] in ixs) or (str1[i] in qs and str2[i] in qs)):
|
||||
continue
|
||||
else:
|
||||
return False
|
||||
return True
|
||||
|
||||
class Checker(BaseChecker):
|
||||
vulns: int = 1
|
||||
timeout: int = 10
|
||||
uses_attack_data: bool = True
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(Checker, self).__init__(*args, **kwargs)
|
||||
self.mch = CheckMachine(self)
|
||||
|
||||
def action(self, action, *args, **kwargs):
|
||||
try:
|
||||
super(Checker, self).action(action, *args, **kwargs)
|
||||
except requests.exceptions.ConnectionError:
|
||||
self.cquit(Status.DOWN, "Connection error", "Got requests connection error")
|
||||
|
||||
def check(self):
|
||||
session = get_initialized_session()
|
||||
username, password = rnd_username(), rnd_password()
|
||||
|
||||
self.mch.register(session, username, password, Status.MUMBLE)
|
||||
self.mch.login(session, username, password, Status.MUMBLE)
|
||||
img_value = rnd_string(20).upper()
|
||||
self.mch.put_image(session,img_value,Status.MUMBLE)
|
||||
value = self.mch.get_image(session)
|
||||
self.assert_(img_value.replace('0','O').replace('1','I').replace('l','I'), value.replace('0','O').replace('1','I').replace('l','I'), Status.MUMBLE)
|
||||
self.mch.logout(session,Status.MUMBLE)
|
||||
self.cquit(Status.OK)
|
||||
|
||||
def put(self, flag_id: str, flag: str, vuln: str):
|
||||
session = get_initialized_session()
|
||||
username, password = rnd_username(), rnd_password()
|
||||
|
||||
self.mch.register(session, username, password, Status.MUMBLE)
|
||||
self.mch.login(session, username, password, Status.MUMBLE)
|
||||
self.mch.put_image(session, flag, Status.MUMBLE)
|
||||
self.mch.logout(session, Status.MUMBLE)
|
||||
self.cquit( Status.OK,public=json.dumps({"username":username}),
|
||||
private=f"{username}:{password}",
|
||||
)
|
||||
|
||||
def get(self, flag_id: str, flag: str, vuln: str):
|
||||
s = get_initialized_session()
|
||||
username, password = flag_id.split(":")
|
||||
self.mch.login(s, username, password, Status.CORRUPT)
|
||||
value = self.mch.get_image(s)
|
||||
self.mch.logout(s, Status.CORRUPT)
|
||||
self.assert_(value.upper().replace('0','O').replace('1','I').replace('l','I'), flag.upper().replace('0','O').replace('1','I').replace('l','I'), Status.CORRUPT)
|
||||
self.cquit(Status.OK)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
c = Checker(sys.argv[2])
|
||||
|
||||
try:
|
||||
c.action(sys.argv[1], *sys.argv[3:])
|
||||
except c.get_check_finished_exception():
|
||||
cquit(Status(c.status), c.public, c.private)
|
||||
91
ctfcup24-school-ad/checkers/filtranator/filtranator.py
Normal file
91
ctfcup24-school-ad/checkers/filtranator/filtranator.py
Normal file
@@ -0,0 +1,91 @@
|
||||
import requests
|
||||
import pytesseract
|
||||
import io
|
||||
import sys
|
||||
from PIL import Image, ImageFont, ImageDraw, ImageColor
|
||||
from checklib import *
|
||||
from PIL.PngImagePlugin import PngInfo
|
||||
|
||||
PORT = 6969
|
||||
|
||||
|
||||
def text_to_image(
|
||||
text: str,
|
||||
font_filepath: str,
|
||||
font_size: int,
|
||||
color: (int, int, int), # color is in RGB
|
||||
font_align="center",
|
||||
):
|
||||
#font = ImageFont.load_default(18)
|
||||
font = ImageFont.load_default(18)
|
||||
#box = font.getsize_multiline(text)
|
||||
img = Image.new("RGBA", (400,400),color='black')
|
||||
draw = ImageDraw.Draw(img)
|
||||
draw_point = (0, 0)
|
||||
draw.multiline_text(draw_point, text, font=font, fill=color, align=font_align)
|
||||
return img
|
||||
|
||||
|
||||
class CheckMachine:
|
||||
@property
|
||||
def url(self):
|
||||
return f"http://{self.c.host}:{self.port}"
|
||||
|
||||
def __init__(self, checker: BaseChecker):
|
||||
self.c = checker
|
||||
self.port = PORT
|
||||
|
||||
def register(self, session: requests.Session, username: str, password: str,status: Status.MUMBLE):
|
||||
url = f"{self.url}/register"
|
||||
resp = session.post(url, data={"username": username, "password": password})
|
||||
self.c.assert_(resp.text, "<p1>Sucessfully registered</p1>")
|
||||
resp = session.post(
|
||||
url, data={"username": username, "password": password}
|
||||
)
|
||||
self.c.assert_(resp.text, "<p1>User alredy exist</p1>",status)
|
||||
|
||||
def logout(self, session: requests.Session,status: Status.MUMBLE):
|
||||
url = f"{self.url}/logout"
|
||||
resp = session.get(url)
|
||||
self.c.assert_(resp.text,'<p1>Sucessfully logout</p1>',status)
|
||||
|
||||
def login(
|
||||
self, session: requests.Session, username: str, password: str, status: Status
|
||||
):
|
||||
url = f"{self.url}/login"
|
||||
resp = session.post(url, data={"username": username, "password": password})
|
||||
self.c.assert_(resp.text, "<p1>Sucessfully logged in</p1>",status)
|
||||
resp = session.post(url, data={"username": username, "password": password})
|
||||
self.c.assert_(resp.text, "<p1>Already logged in</p1>",status)
|
||||
|
||||
def put_image(self, session: requests.Session, text: str,status: Status.MUMBLE):
|
||||
url = f"{self.url}/apply_filter"
|
||||
kek = text_to_image(
|
||||
text,
|
||||
"./MonaSansCondensed-Black.otf",
|
||||
40,
|
||||
(120, 120, 120),
|
||||
)
|
||||
metadata = PngInfo()
|
||||
metadata.add_text("flag", text)
|
||||
bytex = io.BytesIO()
|
||||
kek.save(bytex,format='PNG',pnginfo = metadata)
|
||||
imgkek = bytex.getvalue()
|
||||
files = {"image": ("img", imgkek, "multipart/form-data", {"Expires": "0"})}
|
||||
resp = session.post(
|
||||
url,
|
||||
data={"filter": "none", "filename": "flag"},
|
||||
files=files,
|
||||
)
|
||||
self.c.assert_(resp.text, "<p1>Image saved</p1>",status)
|
||||
|
||||
def get_image(self, session: requests.Session) -> str:
|
||||
url = f"{self.url}/images"
|
||||
resp = session.get(url)
|
||||
img_bytes = io.BytesIO(resp.content)
|
||||
if img_bytes.getbuffer().nbytes == 0:
|
||||
return ''
|
||||
img = Image.open(img_bytes)
|
||||
print(img.text.keys(),file=sys.stderr)
|
||||
text = img.text['flag']#pytesseract.image_to_string(img)
|
||||
return text
|
||||
Reference in New Issue
Block a user