Challenge 2 - Investigate Hidden Image
steganography-ctf steganography

Challenge 2 - Investigate Hidden Image

November 03, 2026 • 25 min read • 18 views • 0 discussions
Table of Contents

    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.

    Enter passphrase:

    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:

    Flag {....}

    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.

    Community Q&A