In this challenge, an image file is provided to recover a hidden flag. The specific steganography technique, encryption parameters, and underlying hiding mechanisms are initially unknown. Rather than guessing, we conduct a structured, step-by-step investigation of the image—from file format verification and metadata analysis to structural inspection and specialized steganographic extraction.
Initial Directory Reconnaissance
First, list the contents of the challenge directory to identify available files and documentation to understand what to
investigate further.
┌──(kali㉿kali)-[~]
└─$ cd steganography/steganography-ctf/participant/challenges/02-steganography-lvl-2
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$ ls -al
total 144
drwxrwxr-x 3 kali kali 4096 Oct 28 12:47 .
drwxrwxr-x 6 kali kali 4096 Oct 28 12:47 ..
-rw-rw-r-- 1 kali kali 223 Oct 28 12:47 BRIEF.md
drwxrwxr-x 2 kali kali 4096 Oct 28 12:47 hints
-rw-rw-r-- 1 kali kali 130623 Oct 28 12:47 stego_badger.jpeg
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$
The directory contains three key entries:
BRIEF.md: The challenge description and objective.
hints/: A directory containing contextual clues if required.
stego_badger.jpeg: The target image file.
Reading the brief using cat confirms the primary objective:
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$ cat BRIFF.md
You've recovered an image. The flag is hidden inside it — recover it.
File: stego_badger.jpeg
Flag format: Flag{...}
Stuck? Optional hints are in hints/.
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$
So, our objective is clear. We need to investigate this JPEG image and find out how the
information has been hidden.
But before searching for hidden data, let's first confirm
whether this file is actually a JPEG image.
File Type Verification
Why do we need to do this? Because a file extension is only part of its name. Someone
can rename a text document with a .jpg extension, but that doesn't turn it
into an actual image.
To identify the real file format, we'll use the file
command to examine the file's contents and identifying
signatures to determine its actual format, rather than simply trusting its
extension.
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$ file stego_badger.jpeg
stego_badger.jpeg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 1024x1024, components 3
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$
As you can see, the output identifies it as JPEG image data
using the JFIF standard, version 1.01. It also reports that the image dimensions are 1024x1024 pixels.
So, we've confirmed that we're dealing with a genuine JPEG
image.
Inspecting Image Metadata with ExifTool
Before trying to extract anything, let's examine the
metadata associated with this image.
For this, we'll use ExifTool.
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$ exiftool stego_badger.jpeg
ExifTool Version Number : 13.55
File Name : stego_badger.jpeg
Directory : .
File Size : 131 kB
File Modification Date/Time : 2026:10:28 12:47:16-04:00
File Access Date/Time : 2026:10:28 22:03:45-04:00
File Inode Change Date/Time : 2026:10:28 12:47:16-04:00
File Permissions : -rw-rw-r--
File Type : JPEG
File Type Extension : jpg
MIME Type : image/jpeg
JFIF Version : 1.01
Resolution Unit : None
X Resolution : 1
Y Resolution : 1
Image Width : 1024
Image Height : 1024
Encoding Process : Baseline DCT, Huffman coding
Bits Per Sample : 8
Color Components : 3
Y Cb Cr Sub Sampling : YCbCr4:2:0 (2 2)
Image Size : 1024x1024
Megapixels : 1.0
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$
As you can see, ExifTool displays several technical details
about the image. Here are some of the important fields.
- The file type is JPEG.
- The image dimensions are 1024x1024 pixels.
- The colour components are 3.
- The JPEG encoding process is listed as Baseline DCT (Baseline Discrete Cosine Transform).
- We can also see the JFIF information and other technical
properties of the image.
These details help us understand the file we're
investigating. But so far, we haven't found the flag. So, let's continue examining the image and see whether it
contains anything beyond the visible picture.
We don't see any suspicious comments or obvious clues in the metadata.
Does that mean there's nothing hidden inside the image?
Not necessarily. Remember, steganography doesn't always rely on metadata. Information can also be hidden within the image data itself, which means a normal metadata inspection might not reveal anything unusual.
So, we need to try another approach. Sometimes, a file may contain another file or a recognisable data structure within it. For example, an image might contain an embedded ZIP archive, a PDF document, or other types of data.
To investigate this possibility, we're going to use a tool called Binwalk.
Embedded File Signature Scanning with Binwalk
Binwalk is a tool that examines binary files and searches
for known file signatures. It helps us identify embedded files, archives, and
other recognisable data structures.
Let's scan our image.
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$ binwalk stego_badger.jpeg
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 JPEG image data, JFIF standard 1.01
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$
As you can see, Binwalk finds only one entry. At offset 0, it identifies the JPEG image data. We don't see any other recognisable file signatures, such as
a ZIP archive or a PDF document.
Analysis with Stego tools
However, this doesn't prove that the image contains no hidden information. Some steganography techniques don't create additional file signatures that Binwalk can recognise.
So, let's move on to a tool specifically designed for steganography. The next tool we're going to use is called Steghide.
Steghide Analysis
Steghide is a steganography tool that allows us to hide
information inside supported file formats, including JPEG images.
First, let's check whether Steghide is running; if it's not installed, it prompts us to install it.
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$ steghide
Command 'steghide' not found, but can be installed with:
sudo apt install steghide
Do you want to install it? (N/y)
As you can see, the tool isn't available. The terminal
also suggests the package we need to install. Type Y and press Enter to download Steghide along with any required dependencies and install them.
Do you want to install it? (N/y)y
sudo apt install steghide
[sudo] password for kali:
Installing:
steghide
Installing dependencies:
libmcrypt4 libmhash2
Suggested packages:
libmcrypt-dev mcrypt
Summary:
Upgrading: 0, Installing: 3, Removing: 0, Not Upgrading: 585
Download size: 319 kB
Space needed: 966 kB / 58.2 GB available
Continue? [Y/n] y
Get:1 http://http.kali.org/kali kali-rolling/main amd64 libmcrypt4 amd64 2.5.8-8+b2 [71.8 kB]
Get:2 http://http.kali.org/kali kali-rolling/main amd64 libmhash2 amd64 0.9.9.9-11+b1 [93.3 kB]
Get:3 http://http.kali.org/kali kali-rolling/main amd64 steghide amd64 0.5.1+git20240220-2 [154 kB]
Fetched 319 kB in 2s (145 kB/s)
Selecting previously unselected package libmcrypt4:amd64.
(Reading database… 461818 files and directories currently installed.)
Preparing to unpack …/libmcrypt4_2.5.8-8+b2_amd64.deb…
Unpacking libmcrypt4:amd64 (2.5.8-8+b2)…
Selecting previously unselected package libmhash2:amd64.
Preparing to unpack …/libmhash2_0.9.9.9-11+b1_amd64.deb…
Unpacking libmhash2:amd64 (0.9.9.9-11+b1)…
Selecting previously unselected package steghide.
Preparing to unpack …/steghide_0.5.1+git20240220-2_amd64.deb…
Unpacking steghide (0.5.1+git20240220-2)…
Setting up libmhash2:amd64 (0.9.9.9-11+b1)…
Setting up libmcrypt4:amd64 (2.5.8-8+b2)…
Setting up steghide (0.5.1+git20240220-2)…
Processing triggers for libc-bin (2.43-4)…
Processing triggers for man-db (2.13.1-1)…
Processing triggers for kali-menu (2026.3.4)…
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$
Once the installation is complete, let's see how the tool
works. Run Steghide without providing any options.
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$ steghide
steghide version 0.6.0
the first argument must be one of the following:
embed, --embed embed data
extract, --extract extract data
info, --info display information about a cover- or stego-file
info <filename> display information about <filename>
encinfo, --encinfo display a list of supported encryption algorithms
version, --version display version information
license, --license display steghide's license
help, --help display this usage information
embedding options:
-ef, --embedfile select file to be embedded
-ef <filename> embed the file <filename>
-cf, --coverfile select cover-file
-cf <filename> embed into the file <filename>
-p, --passphrase specify passphrase
-p <passphrase> use <passphrase> to embed data
-sf, --stegofile select stego file
-sf <filename> write result to <filename> instead of cover-file
-e, --encryption select encryption parameters
-e <a>[<m>]|<m>[<a>] specify an encryption algorithm and/or mode
-e none do not encrypt data before embedding
-z, --compress compress data before embedding (default)
-z <l> using level <l> (1 best speed...9 best compression)
-Z, --dontcompress do not compress data before embedding
-K, --nochecksum do not embed crc32 checksum of embedded data
-N, --dontembedname do not embed the name of the original file
-f, --force overwrite existing files
-q, --quiet suppress information messages
-v, --verbose display detailed information
extracting options:
-sf, --stegofile select stego file
-sf <filename> extract data from <filename>
-p, --passphrase specify passphrase
-p <passphrase> use <passphrase> to extract data
-xf, --extractfile select file name for extracted data
-xf <filename> write the extracted data to <filename>
-f, --force overwrite existing files
-q, --quiet suppress information messages
-v, --verbose display detailed information
options for the info command:
-p, --passphrase specify passphrase
-p <passphrase> use <passphrase> to get info about embedded data
To embed emb.txt in cvr.jpg: steghide embed -cf cvr.jpg -ef emb.txt
To extract embedded data from stg.jpg: steghide extract -sf stg.jpg
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$
As you can see, it displays the available commands and usage
information. For our investigation, we're interested in the info command to examine a file and check whether it
contains embedded data. Let's run:
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$ steghide info stego_badger.jpeg
Here,
- info tells Steghide that we want to inspect the image,
and the filename specifies which image we want to examine.
Now, Steghide identifies the file as a JPEG image and asks
whether we want to check for embedded information.
"stego_badger.jpeg":
format: jpeg
capacity: 7.7 KB
Try to get information about embedded data ? (y/n)
Let's type Y and press Enter.
Now, it asks us to enter a passphrase. Here's the problem.
We don't know the passphrase yet, so we cannot retrieve the
embedded information through this step.
What should we do now? Well, we have a few options.
We can examine the challenge hints, look for possible
password clues, or try a password wordlist to identify the correct passphrase.
For this challenge, we're going to try another tool called Stegseek,
which can help us test passwords against Steghide-protected files using a
wordlist.
Automated Passphrase Cracking with StegSeek
StegSeek is designed to test password candidates against
files created using Steghide.
Instead of trying passwords manually, we can provide a
wordlist containing thousands or even millions of possible passwords. StegSeek will test these passwords against the hidden data.
And when it finds a matching passphrase, it can also extract the embedded file.
For this challenge, we're going to use a popular password
list called RockYou.
First, let's check whether StegSeek is executable on our Kali
Linux system. If it's not installed, then type y to install it.
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$ stegseek
Command 'stegseek' not found, but can be installed with:
sudo apt install stegseek
Do you want to install it? (N/y)y
sudo apt install stegseek
Installing:
stegseek
Summary:
Upgrading: 0, Installing: 1, Removing: 0, Not Upgrading: 585
Download size: 130 kB
Space needed: 375 kB / 58.2 GB available
Get:1 http://http.kali.org/kali kali-rolling/main amd64 stegseek amd64 0.6+git20210910.ff677b9-2 [130 kB]
Fetched 130 kB in 1s (101 kB/s)
Selecting previously unselected package stegseek.
(Reading database… 461851 files and directories currently installed.)
Preparing to unpack …/stegseek_0.6+git20210910.ff677b9-2_amd64.deb…
Unpacking stegseek (0.6+git20210910.ff677b9-2)…
Setting up stegseek (0.6+git20210910.ff677b9-2)…
Processing triggers for kali-menu (2026.3.4)…
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$
APT will download StegSeek along with any required
dependencies and install it. Once the installation is complete, let's see how the tool
works.
For this, we can display its available options using:
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$ stegseek
StegSeek 0.6 - https://github.com/RickdeJager/StegSeek
=== StegSeek Help ===
To crack a stegofile:
stegseek [stegofile.jpg] [wordlist.txt]
Commands:
--crack Crack a stego file using a wordlist. This is the default mode.
--seed Crack a stego file by attempting all embedding patterns.
This mode can be used to detect a file encoded by steghide.
In case the file was encoded without encryption, this mode will
even recover the embedded file.
Positional arguments:
--crack [stegofile.jpg] [wordlist.txt] [output.txt]
--seed [stegofile.jpg] [output.txt]
Keyword arguments:
-sf, --stegofile select stego file
-wl, --wordlist select the wordlist file
-xf, --extractfile select file name for extracted data
-t, --threads set the number of threads. Defaults to the number of cores.
-f, --force overwrite existing files
-v, --verbose display detailed information
-q, --quiet hide performance metrics (can improve performance)
-s, --skipdefault don't add guesses to the wordlist (empty password, filename, ...)
-n, --nocolor disable colors in output
-c, --continue continue cracking after a result has been found.
(A stego file might contain multiple embedded files)
-a, --accessible simplify the output to be more screen reader friendly
Use "stegseek --help -v" to include steghide's help.
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$
As you can see, StegSeek provides several options. For our investigation, we're interested in its
password-cracking feature.
Now, we need to provide two things:
- Our JPEG image
- The
RockYou wordlist.
The basic command looks like this:
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$ stegseek --crack stego_badger.jpeg /usr/share/wordlists/rockyou.txt
Here, we're providing the image that contains the hidden
data, followed by the wordlist containing possible passwords. StegSeek will now test the passwords one by one against the
protected data.
StegSeek 0.6 - https://github.com/RickdeJager/StegSeek
[i] Found passphrase: "password123"
[i] Original filename: "Flag.txt".
[i] Extracting to "stego_badger.jpeg.out".
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$
And look at the result! StegSeek has successfully recovered the passphrase. The password is: password123
Great! We've found the password. StegSeek can also save an extracted copy of the hidden data.
The default output filename is usually based on the original image filename,
with .out added at the end.
But let's verify our findings using Steghide itself. Remember the command we used earlier?
At that time, Steghide asked us for a passphrase, but we didn't know it.
Verifying Embedded Contents via Steghide
Now, we do. So, let's run the same command again, and when Steghide asks for the passphrase, enter: password123
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$ steghide info stego_badger.jpeg
"stego_badger.jpeg":
format: jpeg
capacity: 7.7 KB
Try to get information about embedded data ? (y/n) y
Enter passphrase:
embedded file "Flag.txt":
size: 4.9 KB
encrypted: rijndael-128, cbc
compressed: yes
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$
And there we go! This time, we can see additional information about the
image. The tool reports that an embedded file named Flag.txt was
found.
This confirms that the image contains a hidden document.
Payload Extraction
Now that we know its original filename and have recovered
the passphrase, let's extract the hidden document using Steghide. Run the following command:
steghide extract -sf <Specify File Name> -p <Specify the Password>
Let's understand what each part does.
- The extract command tells Steghide that we want to recover
the hidden data.
- The -sf option stands for stego file. It specifies the
image containing the embedded information.
- And finally, the -p option supplies the passphrase
required for extraction. Here, we're using the password we recovered with StegSeek.
And press Enter.
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$ steghide extract -sf stego_badger.jpeg -p 'password123'
wrote extracted data to "Flag.txt".
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$
And there it is! Steghide has successfully extracted the hidden document.
Notice: We haven't specified a separate output filename
using the -xf option.
So, Steghide uses the original filename stored in the
embedded data, which is Flag.txt.
Inspect the Flag
Before opening the recovered document, let's first verify
its actual file format.
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$ ls -al
total 160
drwxrwxr-x 3 kali kali 4096 Oct 28 22:37 .
drwxrwxr-x 6 kali kali 4096 Oct 28 12:47 ..
-rw-rw-r-- 1 kali kali 223 Oct 28 12:47 BRIEF.md
-rw-rw-r-- 1 kali kali 5063 Oct 28 22:37 Flag.txt
drwxrwxr-x 2 kali kali 4096 Oct 28 12:47 hints
-rw-rw-r-- 1 kali kali 130623 Oct 28 12:47 stego_badger.jpeg
-rw-rw-r-- 1 kali kali 5063 Oct 28 22:32 stego_badger.jpeg.out
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$
Remember our earlier lesson? A filename and its extension don't always tell us what a
file actually contains. So, let's use the file command again:
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$ file Flag.txt
Flag.txt: ASCII text
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$
The file command identifies the recovered document as ASCII
text. This means it contains ordinary text represented using the ASCII
character set.
Now, let's inspect its contents. For this, we'll use the cat command:
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$ cat Flag.txt
Flag{DanG 7hat'S @ cUTe HOnEY b@D9eR}
RUYAWEYASEYEVUZUJUHUMEXU
FEDERUNABACEHUCETIHUROFU
QZFCUPBAFMCKZSHSKOSQURRJ
QAKUSUSOZIPECIZACELAQIQO
POLAZARUBUHAKAPEYUWETOQE
PAXUFABOGAZEJEQANIZEYABO
INXIIUTWJAYAPSJPZEALOKLV
UPNAHLNSIBESOLTUEBUPDNEY
TFOOXPJVDVYRLBYNHUPUGBQG
ZBBIQCDDJXIDRWEIQZUPBDGY
BWQYSYFJJOWHTWTSJJHTEGUZ
PUQIJUTITOTAZUCAWUNEMUQI
YPQRMRANBXCFJKULNFUOZEZE
MSHRIXYELIUIRYTPYXONAWTI
CQXCJRYRYEBPFVWYHEJWGDEH
LUFIMIPEJUQOLUVEFILIWIZU
WEBAGUBINOXOZOCODAYEDUSI
XAQOMIQUBIJOSAWOMUDORUVI
JJIQOROHXQBBOZWFWGEBGMAI
MINEGIKASONOCOJEYUMOHAZI
TQYYZWMCWQXZVEEHCXBXLPYS
IFAPESHCPLTKFRFMPURMCEAK
TQEFCGKKXQVSYRPKNQQMWBRU
MAQOCOCEROPOYEHAHIGOWOJO
PFWGTNOTSFCIQAHZVGMJTVPY
TATIHUXIKEBIPEKIXOXUZERU
GAVARONIBODACIBOLOFEBUXO
HUFOWIRUMEDOXEBIFALOGOBE
QQOXINNOOKECJDSSDTIYZQDU
CDGTJTXSZJTURUPFDKDPKCBP
GADEZUZUKUVEHABOBUMEZAHU
ZAFUDAHAYIMURAMIWEHIMOCA
TOKUHOXAFUJAJOYINAXUSUMA
VUSIFIWICENEHILEYUXAKIZI
MOXUROSOYUZIFANESAFUZIRU
FAPEPATIRUYENOKUSEFOJIHA
LYKNEWEBKXVPUXUOKOUVILPD
RAGONUZUXOBUSUZUNOPAJOFE
BIFULOYIHARAVIFEKABIKOWO
NOODMGEWBGALLJINDWOSOHTT
CERIJUGOHEPEBEZOXUGUHAWI
ZIPLREVGNRBDBYLKJWDHHFRW
PISOKADEWIQUHUYEVUBEQEJI
SOKOREZENIHEFUDIGALAMEJE
THHCRULHAXMZEPUMKZWENRTO
XDIYMAIGJCBQDLDZAKINSCJU
XOWUKAKAVEVORIXEPABAHUXO
ABBYWBPBEKMEGQETVLKHDXAK
JQXZMJRPUUNRDSOJSCNJTLHN
ADRWFAPUMXFQQIFAZOVQORJR
RMNPAWPENZVOJNPGRNNXHKEG
WAGUFEWISIQUQANEJACOSAHE
ADAFMGXDLVEUKHQMQEIVUIPH
WJAFMWEXPQEAKIGTUBQCLZNU
MALEBAHEFAWIRUNEJARISUNU
CNJWSAWAUFIGGWMPRQVIMHDZ
VICEFOWOXUXIZAVECOTOMAGA
HMZLUYIMMUZVHOGEZFXMDJKU
VIFESEMOJEWITINUJARARUNE
XCRVWPHNSSJSQMSBHHDRSOIB
EOQGCYQPPCDKJQUORQYUKLSQ
KVYOBLXNSVWIRNZJCAZNSJZQ
FBVRXGCSEIFWJCBLMXRZADSU
BOJUSEHEBUFUNURUXEFUTEHE
VRGYPUZEHQUKSZYTIYDJBZCZ
ZMBXMPPENIJTSSMBRKNXIJTM
FUJIDECUWURIGABOSOBALODO
TMZFUQFOCHQCHCHYBSBHDRYP
EJOXOTVTLKSNMMPLLKLPIAXJ
LIVETUFEBUPERITEBABATALA
WYTBCQBWZYLKUSVZGYWRAWLY
WUFIQUJIFEVUQAZOKOFUFIJA
FUCIBUCEPOBUBENETEPEXEYE
HEKOJEXEHIJOROLOJUJUJAYU
CRPUZYNPSEVYVFBEVQBEQZOV
TAJEYIRALUQAFEPIVOZOWANE
ZZJWLJJTQUMDOCRSFBQARLFT
LFRFMNRYGBDPSBNZOFVPALHH
OJYBRMNUOLKSXADWYLITHIRN
LNQVNJQTYHBYEXVATDGVYJGX
QZLLQTBWWSBPJMVSYTOQELLU
ZAPKIDXQKHSYOIPLPIQLKRCX
KUGOBOVAXIBOLISAQIDUNEXU
QICONIWIPEYUZOYEDAWUYACU
LXAMZANQUWCJTASKFIHIFTPV
TAWIVAHETETIPAQIRINAHAVI
DUPWGETBPCNDOUCYJWHRPZIY
QANETJFUEZTVQPQKJOBPUXPL
BIVOCIBOYUHECOPEHIGETEVU
PXIUYWXOQDTWFFISXOOWHVLF
CNMASXMARPXGJOIVYTFTIBNL
KONXIYTDWUFPTYSZEJKVBVGZ
FOVCWEEKDXSQOKIINTAFVDOP
IEJFADVXVYGVPWYLMKVQEJBG
ZEVRGREZACSSOAMFFAEFHQXP
TNCYDAUXQCKAXZBMSKNSFQIR
PUMCUQKXVZXGSUNETPYYKIDE
LGCLDRODWTYOZGKBBNVSOCGP
SAJCQGTKQTLUMPOASFVUFOGA
SBVUUJHPCITNDWIDARJJNATF
RYEMLDQXTEZHDSYRRYCSRTTB
ITPIVEDPKNSSFEASDBJTNBUL
MITIUXLSJWSHWHPZFNACEGZY
SOWOGODEPIDUCOJIWIGAZAVI
WKGOEFYYHDDWJFSNZUXKVJLT
BOYOVATABETOJUHOBIYOLUJU
TPZFFDYKSKDLBWXTVNPUPWQY
BAJEYADERELERAFAHATEZEYA
JZNHHWYMLTDBIVXSWFKTDXDD
ZEMUJOQILAMAMOWUVUQIBOHO
XAGETIVOFUDEYOLOZIGEXAPA
OKRBBUHKFJJQJHCODIGKLZXK
JEGOGUBAGEQUMUPUQAVIWUFI
DBUETQLJLQRNFAHEXXIZRBVI
AKCISZBMWPXLCUAGXCJBQTDV
PIXIBIYOPUYACASETEXEFAJE
BOTURAZAMALAROLUPOJERADA
TNUNDFQWPBCCXHOJASEAUSSI
HEREPAMESOYACUDAVOQETIFI
NOWOKIWAYUDEQOYEROFUVAFU
EWWSCCZHZQRIOYEJCJHBIGLF
RXYBMGBKPJZDTXVFVFPHPGTC
RUSESENEJIVUHELOJELABUMO
LMUHOKAIRHWFFVZMVQKEWCEY
RQSJAPOQQMXOUWVKKKWSUXBS
PBYOJTOVUOWMULEIDWRRBSZH
PUPATAGAYOWAGAQEXOFOJEGU
WEUZXCEJHWDEQZWRJKZVGLBW
SUANTTRIHABKTCTPIEUXENUQ
JCQDIWETUXACFCLGJABGXCFW
WPLJCHAIQLPYGULJLREUHYKJ
MIZEJAVOGAVUHIBIZAKIFASI
WCSJOVVBXLXRXKRROJLNXGCF
IRLEEFSISSVKQYEPUPXYUTRJ
ZOSAYUCALOMOMACIJUFUVULO
WLMMPKSAOMFELVVJRMHBPUOC
EKGAKLJQODLDEKJIFQQVDRBV
SOSOMUGUNOYEQEWUXOCOVEVA
FEHOBAJITIVADUNOHIWUKOXU
KZPPMBFZNQRIAHFSQVUTCMNU
OYORUNBZHATFTDXGKVAWQNAY
QTOVPCENXXCOTJAHJTBNUZZA
YLWHNKLKYKDBMKAEQBYDHCCN
LEDEDUQAPUTUYOLOROPEXAFU
IXTAWYELRFCQDESNXHKAENAC
RALOXIPUHESUROQAFOVAXEKO
EPACVWNUZDNGMEQAQRZFANKQ
WUXOTEZAQAFADOXAYINIDIJA
NNPDYMBVQEZMPJQWOAXAVBCK
PAZJALFQMVLKUYKVYQOZFJFB
SUQUZAGICEDAGEHAPOLUHANA
GXHVBWBTLXQVMETJCYOKHYWN
NVNIGIOLNDJIVTZWZOJRFCTN
QAFAKAHUVACIVAVAQAJELUSI
VMLUDVYOIKZNRWNNGFYYXRGV
TUHITUJODARAXESEROZOVISA
CIKEQUFEMAJOCIJOCOSIREBU
HECIDUBUTUFUKEKIRIVUGIME
VODMNYEXVSRZEUEBZMAFBYNB
RSOKJIUJRSWEWEDKVKBFSJRL
VNMXMVKKRFWGVWZQJGQUUACE
XKBMZJJTHFQDYMONYUAZHBGT
ECUABCAIYSANUSIUGFDWDYTX
SEHAHIXISINOMORICUFETIKE
ORXFKNQTRXUVWHLOSDWXEAZV
WVHUYILWTUNQPZDABWYBMRWE
RAFUKIZAPOGIJIKURIWUTIFE
ARLHGXOLVISYCRPVYMOVOBRK
AOOHQGCBNIWMIXKTVTCTUYRY
PPZHVLQWBXIQKIJQVWSWGYCH
POQAVIVISICURAFUBACEPIQA
MALOCOFOLITUFUFAHIRELUTO
CRHWRPVLZOMWJPWGMTKAHSXN
GGRIEKMWEVGZMXQTYQJFZCRY
XTIACRDUHNTQEIDOKDQSPAOO
HMSLNZYWKRGTIBJMWYDTHUCA
TEXOYOSAHOZAYOCOVEGOWACI
XVIGUMPTAICPNJHQHLJKIVRI
LMPSTEPUKGEVMMUZUXSEXNJK
KDWCAYLFBQMRDSEQDDXTQJHU
IXBRRPRCFZYYVRUSROPDHYCC
XNMJDAAGSRFBBEKGABDWEURT
HUHEPIXUVIKEFOQOJIZEVAQE
XOCEYUGUHEXITEDESIROCOFI
TQREHJKSIMXLPWWNYBYMXJXF
ROVIZAKAYIGABIBEHIFOMUQE
BCOKCPRJFKPBUHVBYXWDSGKD
YBWRCMXMKCWSITOFMILANIIT
NGCDFPMFUIQKHZFSUCBDTGCH
BUNICIMEVAVONOGEMEKUFIYE
XLGXCSUJRRRKIIWDIXWTISWW
CMJJMXDMFZUNMTDSMUJTLNRV
TUNEJATUDEMIQAKUTILIRIWO
WUYUBOFIJISOTACUPAQUGIQO
WOCFPWFHLNAKZHRDRTOGHMPB
WDBQBENHRCYDXBETGPNFSAJM
FPPDTPJTUWTHUHLANNEJTQJJ
DUCOBITENAVINUXOQETALIWA
LJYTKHHDFBBIEFGRILLMNVNA
BEOSIDEGBQFCOKNHTFLNRDXJ
COFAXUPASIJAXOSIYENIXEJE
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$
Look at the output. The very first line immediately catches our attention. It
starts with the word:
Followed by a value inside curly brackets. But there's something else. Below the flag, we can see a large collection of unusual
character sequences.
Most of these lines contain 24 characters, and they
don't look like ordinary text. Our document contains a total of 202 lines. But we don't need to display all of them just to recover the
flag. Instead, we can use another command called head.
The head command displays the beginning of a file.
- We'll use the -n option with the value one.
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$ head -n 1 Flag.txt
Flag{DanG 7hat'S @ cUTe HOnEY b@D9eR}
┌──(kali㉿kali)-[~/…/steganography-ctf/participant/challenges/02-steganography-lvl-2]
└─$
This tells the command to display only the first line of the
document. And there it is! We've successfully completed Challenge 2! But the next challenge is going to be more interesting.
We'll investigate an image containing multiple hidden data
structures and work through several layers of file extraction and analysis. We'll also explore techniques that require us to look beyond
ordinary metadata inspection and basic steganography tools.
So, keep your recovered files safe, and I'll see you in the
next challenge.