somestufflsimportant
- קטגוריה: Web Application
- 500 נקודות
- נפתר על ידי קבוצת JCTF
תיאור
פתרון
נבקר באתר:
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!@$%)*+[}