diff --git a/opsec/steghide/apollo11.jpg b/opsec/steghide/apollo11.jpg new file mode 100644 index 0000000..8354c02 Binary files /dev/null and b/opsec/steghide/apollo11.jpg differ diff --git a/opsec/steghide/index.html b/opsec/steghide/index.html index edd5a21..08fbbce 100644 --- a/opsec/steghide/index.html +++ b/opsec/steghide/index.html @@ -60,21 +60,20 @@
-

Basic Use

+

Hiding files in images with steghide

Previous Page

Zesc - 2024-08-30

-

Hiding files in images with steghide

+

Basic Use

steghide is a mature GPL-licensed CLI tool for hiding arbitrary data inside of of image files (and some archaic audio formats). Its official web presence is located at https://steghide.sourceforge.net/, but it is ubiquitously mirrored in various repositories and package managers (. If you use APT, simply install it with

-
# apt install steghide
-
+
# apt install steghide
-

steghide uses subcommands, and the three most important ones are info, embed and extract which will be explained in sequence. For this tutorial, we are going to use the Astronomy Picture of the Day of 2024-09-08, a beautiful image of the Andromeda galaxy:

- +

steghide uses subcommands, and the three most important ones are info, embed and extract which will be explained in sequence. For this tutorial, we are going to use the Astronomy Picture of the Day of 2024-09-08, a beautiful image of the Andromeda galaxy:

+

Our example file to hide is going to be Bitcoin: A Peer-to-Peer Electronic Cash System, the original paper by Satoshi Nakamoto.

-

As mentioned above, the cover image must be larger than the file you wish to embed, as a rule of thumb your coverfile should be 20 times larger. We can check how many bytes steghide can embed by using steghide info file. In our case, it tells us that it can embed 232 KB and asks whether an attempt should be made at reading embed data without extracting. As there is nothing embedded yet, we decline with n.

+

As mentioned above, the cover image must be larger than the file you wish to embed, as a rule of thumb your coverfile should be 20 times larger. We can check how many bytes steghide can embed by using steghide info file. In our case, it tells us that it can embed 232 KB and asks whether an attempt should be made at reading embed data without extracting. As there is nothing embedded yet, we decline with n.

"apod20240824.jpg":
   format: jpeg
@@ -82,16 +81,16 @@
 Try to get information about embedded data ? (y/n) 
 
-

The PDF is only 180 KB, so it fits. Next, we use steghide embed -cf coverfile -ef embedfile -sf destination and get asked for a passphrase (make sure to remember it or safe it in a password manager). After re-entering the passphrase (you can set it beforehand with the -p option) it will write the processed file to the specified destination. You can also leave out the -sf option, in which case it defaults to overwriting the coverfile. Look at it and try to find a visual difference to the original:

- +

The PDF is only 180 KB, so it fits. Next, we use steghide embed -cf coverfile -ef embedfile -sf destination and get asked for a passphrase (make sure to remember it or safe it in a password manager). After re-entering the passphrase (you can set it beforehand with the -p option) it will write the processed file to the specified destination. You can also leave out the -sf option, in which case it defaults to overwriting the coverfile. Look at it and try to find a visual difference to the original:

+

It's completely lost in the visual noise. As an experiment, let's try taking the difference of both images with a program like GIMP. This is what it looks like:

- +
-

A difference of zero means a fully black pixel. Try zooming in and you'll see that only a few pixels are slightly lighter than black. These are the pixels that contain parts of your embedded file.

+

A difference of zero means a fully black pixel. Try zooming in and you'll see that only a few pixels are slightly lighter than black. These are the pixels that contain parts of your embedded file in their least significant bits..

WARNING: changing the output file in anyway will make the embedded file irretrievable. This is especially important for every form of lossy compression!
-

Now let's try to extract the file we've just hid. For this, use steghide embed -sf input

. This will prompt you for the passphrase. Enter it, and the contents will be extracted into the working directory. In our case we will be asked whether we want to overwrite the file with the same name that already exists. (You can suppress this warning with -f or by specifying an alternative output destination with -xf. Here, I used the later so we can confirm the files to be identical with md5sum: +

Now let's try to extract the file we've just hid. For this, use steghide embed -sf input

. This will prompt you for the passphrase. Enter it, and the contents will be extracted into the working directory. In our case we will be asked whether we want to overwrite the file with the same name that already exists. (You can suppress this warning with -f or by specifying an alternative output destination with -xf. Here, I used the later so we can confirm the files to be identical with md5sum:
d56d71ecadf2137be09d8b1d35c6c042  bitcoin.pdf
 d56d71ecadf2137be09d8b1d35c6c042  output.pdf
@@ -109,51 +108,17 @@ d56d71ecadf2137be09d8b1d35c6c042 output.pdf

Advanced Use

-

- -

-	
-
+

Changing the encryption

+

As you've seen, steghide needs a passphrase to embed and extract data. (Note: using an empty passphrase can lead to issues extracting.) This passphrase is used to both encrypt your file before embedding and to seed the PRNG by which it selects pixel positions for embedding data. By default, it uses AES-128. You should not rely on steghide for securing your data cryptographically (see the introduction to steganography), and when in doubt you can separately encrypt the file before embedding, but you may still want to change the used algorithm. For this, simply use -e algorithm mode

. You can list all available modes with steghide encinfo. So as example, to embed our previous picture using AES-256 in cipher feedback mode, you would use this: -

- -

-	
-
+
$ steghide embed -cf apod20240824.jpg -ef bitcoin.pdf -e rijandael-256 cfb 
+

Use steghide recursively

+

Since steghide works on arbitrary binary data, you can embed steghide's output into another picture, provided the size is sufficient. The 4.8 MB picture below contains a 260 KB waveform audio file which in turns contains 2.7 KB UTF-8 encoded text file. (The passphrase is moon for both.)

+

- -

-	
-
-
-
-
-
- -
-
-
-
-

Setup



- -

-	
-
-

- -

-	
-
- -

- -

-	
-
-