ctf

MetaCTF ACE-T: Five Beginner Challenges Solved

Five MetaCTF ACE-T challenges solved: MD5 cracking, memory forensics, S3 enumeration, image OSINT, and zip password recovery.

MetaCTF is a platform-based CTF that runs ongoing challenge sets aimed at learners. The ACE-T set is a good entry point — the challenges are short and self-contained, each one drilling a single tool or technique. Here are solutions for the five I worked through.

A Naive Hash

Challenge prompt:

Hashing is a method of reducing some input to a fixed-length signature. There is no way to decrypt the original messages without guessing some possibilities. Can you crack this MD5 hash?

5c2981b42e5bc96ad70cf064290b70b4

MD5 with rockyou is the standard starting point. Install hashcat, grab the wordlist, and run:

brew install hashcat

curl -OL https://github.com/brannondorsey/naive-hashcat/releases/download/data/rockyou.txt

# mode 0 = raw MD5, attack mode 0 = dictionary
hashcat -m 0 -a 0 hash.txt rockyou.txt

# once done, show the cracked result
hashcat -m 0 -a 0 hash.txt rockyou.txt --show

Put the hash alone in hash.txt (echo '5c2981b42e5bc96ad70cf064290b70b4' > hash.txt). Hashcat will find it in rockyou almost instantly — MD5 is fast to compute and the wordlist covers most common passwords.

The challenge title hints at why: MD5 without a per-user salt is “naive.” Once a hash appears in any public dump, it’s effectively cracked forever.

All Strung Out

Challenge prompt:

Find the first flag in evidence.zip.

The flag hidden in this challenge is in the format: flag{value}

Unzip the archive, then grep directly inside the .mem file. Memory dumps are binary, but grep handles that fine — the flag is stored as a plaintext string somewhere in the dump:

unzip evidence.zip
grep -E "flag\{.*\}" evidence.mem

-E enables extended regex so the {.*} wildcard works. The flag will print with its surrounding memory context. If there’s noise, pipe through strings first to reduce it:

strings evidence.mem | grep -E "flag\{.*\}"

strings extracts all runs of printable ASCII characters from the binary, which makes the flag pop out cleanly.

Breaching Buckets

Challenge prompt:

Take a look at where this image is hosted. See if you can find the flag! Does anything stand out?

The image URL reveals it’s hosted on an S3 bucket — prod-cdn-user-imgs. Public S3 buckets with misconfigured ACLs will let anyone list and download their contents:

aws s3 ls prod-cdn-user-imgs --recursive
aws s3 cp --recursive s3://prod-cdn-user-imgs .

This pulls down every object in the bucket. Browse through the downloaded images — the flag is embedded in one of them, either in the image itself or in the filename/metadata.

The misconfiguration here is the bucket being set to public-read on all objects without restricting s3:ListBucket. List access lets an attacker enumerate every key in the bucket, not just access known URLs. Many teams enable object-level public access for their CDN but forget to restrict listing.

OSINT Time

Challenge prompt:

Your co-worker Leo refused to tell anyone where he was going on vacation. You saw him post an Instagram of a super cute sloth and you REALLY want to know where it was taken. See if you can figure it out.

Camera apps and some social platforms embed GPS coordinates or other metadata in JPEG EXIF data. Download the image and check:

exiftool $DOWNLOADS/sloth.jpg | grep -i comment

exiftool parses all EXIF, IPTC, and XMP metadata. The -i comment grep targets the comment field, which is where the location hint is stored for this challenge. Check all fields if the first grep is empty:

exiftool $DOWNLOADS/sloth.jpg

GPS coordinates appear as GPS Latitude / GPS Longitude fields if the camera wrote them — plug those into Google Maps to get the location. A Comment field may contain a text description directly.

The Last Great Zip File

Challenge prompt:

Help! I’ve created a zip archive that contains my favorite flag, but I forgot the password to it. Can you help me recover my flag back?

Standard zip password recovery: extract the hash from the zip and crack it with John the Ripper.

wget https://metaproblems.com/4c8353df44a1dc0c5535ec84fa8da70e/flag.zip

Build John from source (the distro packages are often outdated and missing the zip module):

git clone https://github.com/openwall/john
cd john/src
./configure && make

Extract the password hash from the zip, then crack it:

./john/run/zip2john flag.zip > zip.hashes
./john/run/john --wordlist=/usr/share/wordlists/rockyou.txt zip.hashes
./john/run/john zip.hashes --show

zip2john extracts the PKZIP encryption header into a format John can attack. With rockyou the password will crack in seconds if it’s a common word. Once cracked, --show prints filename:password, and you can unzip with that password to get the flag.