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 .... : [1;33m$($libressl dgst -md5 "$src"|awk '{ print $2 }')[0m" 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) : [1;33m$($libressl dgst -md5 "$dst"|awk '{ print $2 }')[0m" 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 : [1;33m$($libressl dgst -md5 "$dst"|awk '{ print $2 }')[0m" 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
crypto