From 8cc1b4b3d2717ccd4f581c48e65a1e647c8b2a10 Mon Sep 17 00:00:00 2001 From: Ivan Mironov Date: Sat, 11 Apr 2020 22:35:16 +0500 Subject: [PATCH 1/3] Add option to enable debug logging --- CTFDump.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CTFDump.py b/CTFDump.py index 3105aad..8d9f122 100644 --- a/CTFDump.py +++ b/CTFDump.py @@ -131,11 +131,18 @@ def main(args=None): parser.add_argument("-p", "--password", help="CTF password.", required=True) + parser.add_argument("-D", "--debug", + help="Print debug messages", + action="store_true") sys_args = vars(parser.parse_args(args=args)) # Configure Logger - logging.basicConfig(level=logging.INFO, + if sys_args.pop("debug"): + log_level = logging.DEBUG + else: + log_level = logging.INFO + logging.basicConfig(level=log_level, format='%(asctime)s %(levelname)s %(message)s', datefmt='%d-%m-%y %H:%M:%S') From 3a61a27053b6c87e772b1d1f8b0b36e4d4e7af8d Mon Sep 17 00:00:00 2001 From: Ivan Mironov Date: Sat, 11 Apr 2020 22:42:06 +0500 Subject: [PATCH 2/3] Log more messages --- CTFDump.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CTFDump.py b/CTFDump.py index 8d9f122..2ab644f 100644 --- a/CTFDump.py +++ b/CTFDump.py @@ -15,6 +15,7 @@ def download_file(url, file_path): + logger.info("Downloading file \"%s\" -> \"%s\"", url, file_path) try: res = session.get(url, stream=True) with open(file_path, 'wb') as f: @@ -28,6 +29,7 @@ def download_file(url, file_path): def get_nonce(url): + logger.debug("Getting nonce") res = session.get( urljoin(url, "/login"), params={'next': 'challenges'} @@ -36,6 +38,7 @@ def get_nonce(url): def login(url, nonce, username, password): + logger.info("Logging in as \"%s\"", username) session.post( urljoin(url, "/login"), params={'next': 'challenges'}, @@ -48,12 +51,13 @@ def login(url, nonce, username, password): def logout(url): - # Get Challenges + logger.info("Logging out",) session.get(urljoin(url, "/logout")) def iter_challenges(url): # CTFD 2.0 + logger.info("Getting challenges") res = session.get(urljoin(url, "/api/v1/challenges")) if res.ok: res_json = res.json() From 19dad5c8874ea4dbf2d88506ad415fc305e6ff4e Mon Sep 17 00:00:00 2001 From: Ivan Mironov Date: Sat, 11 Apr 2020 22:55:43 +0500 Subject: [PATCH 3/3] Option to add custom cookies May be used to copy Cloudflare's `__cfduid` from browser. --- CTFDump.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/CTFDump.py b/CTFDump.py index 2ab644f..cca7111 100644 --- a/CTFDump.py +++ b/CTFDump.py @@ -77,9 +77,18 @@ def iter_challenges(url): yield session.get(urljoin(url, "/chals/%d" % challenge['id'])).json() -def run(url, username, password): +def run(url, username, password, cookie): hostname = urlparse(url).hostname + if cookie is not None: + for one_cookie in cookie: + split_cookie = one_cookie.split("=", 1) + if len(split_cookie) != 2: + logger.error("Invalid cookie: %r", one_cookie) + continue + name, value = split_cookie + session.cookies.set(name, value) + # Login login(url, get_nonce(url), username, password) @@ -135,6 +144,9 @@ def main(args=None): parser.add_argument("-p", "--password", help="CTF password.", required=True) + parser.add_argument("-C", "--cookie", + help="Add cookie before trying to access CTFd", + action='append') parser.add_argument("-D", "--debug", help="Print debug messages", action="store_true")