somestufflsimportant

תיאור

somestufflsimportant

פתרון

נבקר באתר:

root@kali:/media/sf_CTFs/bsidestlv/somestufflsimportant# curl https://somestufflsimportant.challenges.bsidestlv.com/
The Flag is: BSidesTLV{<strong>1 c</strong><br>

זהו האתגר היחיד שנגיש באמצעות HTTPS, ולכן ההנחה הייתה שהאתגר סובב סביב כך. לאחר ניסוי וטעייה התברר לנו שאפשר לקבל פלט אחר מהשרת על ידי התחברות עם TLS1.1:

# curl https://somestufflsimportant.challenges.bsidestlv.com/ --tlsv1.1
The Flag is: BSidesTLV{<strong>3 p</strong><br>

עוד קצת ניסוי וטעייה הביאו אותנו למסקנה שעל כל cipher suite שנשתמש בו, נקבל פלט אחר מהשרת.

השתמשנו בסקריפט הבא על מנת לעבור על כל ה-Ciphers ש-OpenSSL תומך בהם:

import socket, ssl
import http.client
import subprocess
import re

FLAG_RE = re.compile("The Flag is: BSidesTLV{<strong>(\d+) (.+)</strong><br>")

def send_request(cipher):
    res = None
    c   = None
    try:
        context = ssl.create_default_context()
        context.set_ciphers(cipher)
        c = http.client.HTTPSConnection("somestufflsimportant.challenges.bsidestlv.com", context = context)
        c.request("GET", "/")
        response = c.getresponse()
        data = str(response.read())
        match = FLAG_RE.search(data)
        if match:
            res = (match.group(1), match.group(2))
        else:
            print ("\tWarning: The following response did not match the regex: {}".format(data))       
    except:
        pass
    if c is not None:
        c.close()
    print ("[{}] {}".format("V" if res is not None else "X", cipher))
    return res
flag_map = {}
cipher_list = subprocess.check_output(['openssl', 'ciphers']).decode("ascii").strip()
for cipher in cipher_list.split(":"):
    res = send_request(cipher)
    if res is None:
        continue
    index, char = res
    flag_map[int(index) - 1] = char
max_index = max(flag_map)
flag = ["?"] * (max_index + 1)
for k, v in flag_map.items():
    flag[k] = v
print ("BSidesTLV{" + "".join(flag))

נדרשו 30 כאלה, והדגל היה: BSidesTLV{cypheR54r31mp0rtanN7!@$%)*+[}