Après avoir analysé les rapport de Kaspersky sur Duqu 2.0, il y a un passage qui fait office de chiffrement pour ex-filtration des données. Cet algorithme simple à mettre en place et est terriblement efficace. Seul défaut: plus le fichier est chiffré plus il est gros.





0x01. CONCEPT


L'idée est relativement simple, il s'agit de chiffrer plusieurs fois le même fichier avec le même algorithme, avec une clé itérative - c'est à dire avec un algorithme de génération des clés qui permet de les calculer dans un sens comme dans l'autre. Le dernier fichier chiffré aura donc une clé de déchiffrement différent du premiers.
Pour assurer ce chiffrement, une rotation avec un fichier temporaire est indispensable.


Mon_Fichier_Sensible.txt    ->   Mon_Fichier_Chiffré.part_1
Mon_Fichier_Sensible.part_1 ->   Mon_Fichier_Chiffré.tmp
Mon_Fichier_Sensible.tmp    ->   Mon_Fichier_Chiffré.txt



0x02. ENCRYPTION


#!/bin/sh
 
 
 
###################################################################################################
#
# Chemin vers openssl, libressl ou autre (wolfssl, ...)
#
##
 
libressl=/usr/local/bin/libressl
 
 
 
###################################################################################################
#
# Traitement des arguments
#
##
 
if [ $# -eq 0 ]; then
  echo "
Usage:
bash $(basename "$0") <file-in> <out-file> <index-start> <index-end>
 
Exemple:
bash multiple-encryption-v3.sh CRYPTED CLEAR 100 120
"
  exit 0
fi
 
src="$1"
dst="$2"
S=100
N=130
K="pass_1.key"
 
# Algorithme par défaut: AES256 (avec l'implémentation CBC par défaut)
encalgo="aes256" ; [ $# -eq 5 ] && encalgo="$5"
 
tmp="._.enc.$src.tmp"
 
 
 
###################################################################################################
#
# Initialisation des variables
#
##
 
# Variables de progression de l'opération
i="0"
P="["
j=0
 
# Calcul du pourcentage par rapport au nombre de passe
p=$(echo "100*$i/$N"|bc -l|head -c 5)
 
 
 
###################################################################################################
#
# Traitement des arguments
#
##
 
# Copie pour rotation
cp -f "$src" "$tmp.$S"
printf "
[i] Processing..."
 
# Indicateur de progression
sp="/-|"
 
 
 
###################################################################################################
#
# Chiffrement en N passes
#
##
 
for i in $(seq $S $N) ; do 
 
  # Fichier suivant
  n=$((i+1))
 
  # Le mot de passe est simple: le SHA512 1 à 40
  pass="$(echo "$i"|$libressl dgst -sha512)"
 
  # Rotation avec un fichier intermédiaire (.2)
  $libressl enc -$encalgo -k "$pass" -in $tmp.$i -out $tmp.$n
 
  # Calcul du hash en cours - pour informationsrmation et... décoration ;-)
  h=$($libressl dgst -md5 "$tmp.$n"|awk '{ print $2 }')
 
  # Pourcentage de progression
  p=$(echo "100*$i/$N"|bc -l|head -c 5)
 
  # [/], [-], [], [|]
  str_sp="${sp:j++%${#sp}:1}"
  printf "[%-1s] %-5s%%: %4s/%-4s:%s" "$str_sp" "$p" "$i" "$N" "$h"
 
  # Supprime le fichier précédent (rotation)
  rm -f $tmp.$i
 
done
 
# Sauvegarde dans le fichier de sortie
mv -f "$tmp.$n" "$dst"
 
# Affichage final
printf "
[-] %-5s%%: %4s/%-4s:%s" "$p" "$i" "$N" "$h"
 
 
 
###################################################################################################
#
# Affichage d'informations de déchiffrement et validation de bon déchiffrement
#
##
 
echo
printf "[i] Source MD5 .... : $($libressl dgst -md5 "$src"|awk '{ print $2 }')"
echo
echo
 
#rm -f ._.enc*
 




0x03. DECRYPTION


#!/bin/sh
 
 
 
###################################################################################################
#
# Chemin vers openssl, libressl ou autre (ex. wolfssl, ...)
#
##
 
libressl=/usr/local/bin/libressl
 
 
 
###################################################################################################
#
# Traitement des arguments
#
##
 
if [ $# -eq 0 ]; then
  echo "
Usage:
bash $(basename "$0") <file-in> <out-file> <index-start> <index-end>
 
Exemple:
bash multiple-decryption-v3.sh CRYPTED CLEAR 100 120
"
  exit 0
fi
 
src="$1"
dst="$2"
S=100
N=130
 
# Algorithme par défaut: AES256 (avec l'implémentation CBC par défaut)
encalgo="aes256" ; [ $# -eq 5 ] && encalgo="$5"
 
tmp="._.enc.$src.tmp"
 
 
 
###################################################################################################
#
# Initialisation des variables
#
##
 
# Variables de progression de l'opération
i="0"
P="["
j=0
 
# Calcul du pourcentage par rapport au nombre de passe
p=$(echo "100*$i/$N"|bc -l|head -c 5)
 
 
 
###################################################################################################
#
# Traitement des arguments
#
##
 
# Copie pour rotation
cp -f "$src" "$tmp.$N"
 
# Indicateur de progression
sp="/-|"
echo
printf "[i] MD5 (encrypted) : $($libressl dgst -md5 "$dst"|awk '{ print $2 }')"
echo
 
 
 
###################################################################################################
#
# Chiffrement en N passes
#
##
 
for i in $(seq $N -1 $S) ; do 
 
  # Fichier suivant
  n=$((i-1))
 
  # Le mot de passe est simple: le SHA512 de 40 à 1
  pass="$(echo "$i"|$libressl dgst -sha512)"
 
  # Rotation avec un fichier intermédiaire (.2)
  $libressl enc -$encalgo -d -k "$pass" -in $tmp.$i -out $tmp.$n
 
  # Calcul du hash en cours - pour information et... décoration ;-)
  h=$($libressl dgst -md5 "$tmp.$n"|awk '{ print $2 }')
 
  # Pourcentage de progression
  p=$(echo "100-(100*$i/$N)"|bc -l|head -c 5)
 
  # [/], [-], [], [|]
  str_sp="${sp:j++%${#sp}:1}"
  printf "[%-1s] %-5s%%:%4s/%-4s:%s" "$str_sp" "$p" "$((N-i+S))" "$N" "$h"
 
  # Supprime le fichier précedent (rotation)
  rm -f $tmp.$i
 
done
 
# Sauvegarde dans le fichier de sortie
mv -f "$tmp.$n" "$dst"
 
# Affichage final
printf "
[%-1s] %-5s%%:%4s/%-4s: %s" "-" "100.0" "$N" "$N" "$h"
 
 
 
###################################################################################################
#
# Affichage d'informations de déchiffrement et validation de bon déchiffrement
#
##
 
echo
printf "[i] Destination MD5 : $($libressl dgst -md5 "$dst"|awk '{ print $2 }')"
echo
echo
 
#rm -f ._.enc*
 




0x04. CONCLUSION



Ici, l'algorithme d'itération est simple et facilement prédictif, il conviendra au lecteur d'adapter le script pour le complexifier.




   =>   Écrit par : Nicolas, le 05 juillet 2017


 
Mots clés :  
  crypto 
  
  linux 
  
  bash 
    >   Articles connexes :

Comment gagner du temps sur Internet



Cheat SHeet OpenSSL



HTTP Download



2010026